diff --git a/contracts/contracts/interfaces/IEERC20.sol b/contracts/contracts/interfaces/IEERC20.sol new file mode 100644 index 000000000..e0499bb6a --- /dev/null +++ b/contracts/contracts/interfaces/IEERC20.sol @@ -0,0 +1,49 @@ +// SPDX-License-Identifier: UNLICENSED + +pragma solidity ^0.8.24; + +import "fhevm/lib/TFHE.sol"; + +interface IeERC20 { + event Transfer(address indexed from, address indexed to); + event Approval(address indexed owner, address indexed spender); + event Mint(address indexed to, uint64 amount); + + // Returns the name of the token. + function name() external view returns (string memory); + + // Returns the symbol of the token, usually a shorter version of the name. + function symbol() external view returns (string memory); + + // Returns the total supply of the token. + function totalSupply() external view returns (uint64); + + // Transfers an encrypted amount from the message sender address to the `to` address. + function transfer(address to, einput encryptedAmount, bytes calldata inputProof) external returns (bool); + + // Transfers an amount from the message sender address to the `to` address. + function transfer(address to, euint64 amount) external returns (bool); + + // Returns the balance handle of the specified wallet. + function balanceOf(address wallet) external view returns (euint64); + + // Sets the `encryptedAmount` as the allowance of `spender` over the caller's tokens. + function approve(address spender, einput encryptedAmount, bytes calldata inputProof) external returns (bool); + + // Sets the `amount` as the allowance of `spender` over the caller's tokens. + function approve(address spender, euint64 amount) external returns (bool); + + // Returns the remaining number of tokens that `spender` is allowed to spend on behalf of the owner. + function allowance(address owner, address spender) external view returns (euint64); + + // Transfers `encryptedAmount` tokens using the caller's allowance. + function transferFrom( + address from, + address to, + einput encryptedAmount, + bytes calldata inputProof + ) external returns (bool); + + // Transfers `amount` tokens using the caller's allowance. + function transferFrom(address from, address to, euint64 amount) external returns (bool); +} diff --git a/contracts/contracts/mocks/EncryptedERC20.sol b/contracts/contracts/mocks/EncryptedERC20.sol new file mode 100644 index 000000000..7ae20c4d3 --- /dev/null +++ b/contracts/contracts/mocks/EncryptedERC20.sol @@ -0,0 +1,150 @@ +// SPDX-License-Identifier: BSD-3-Clause-Clear + +pragma solidity ^0.8.24; + +import "fhevm/lib/TFHE.sol"; +import "@openzeppelin/contracts/access/Ownable2Step.sol"; + +contract EncryptedERC20 is Ownable2Step { + event Transfer(address indexed from, address indexed to); + event Approval(address indexed owner, address indexed spender); + event Mint(address indexed to, uint64 amount); + + uint64 private _totalSupply; + string private _name; + string private _symbol; + uint8 public constant decimals = 6; + + // A mapping from address to an encrypted balance. + mapping(address => euint64) internal balances; + + // A mapping of the form mapping(owner => mapping(spender => allowance)). + mapping(address => mapping(address => euint64)) internal allowances; + + constructor(string memory name_, string memory symbol_) Ownable() { + _name = name_; + _symbol = symbol_; + } + + // Returns the name of the token. + function name() public view virtual returns (string memory) { + return _name; + } + + // Returns the symbol of the token, usually a shorter version of the name. + function symbol() public view virtual returns (string memory) { + return _symbol; + } + + // Returns the total supply of the token + function totalSupply() public view virtual returns (uint64) { + return _totalSupply; + } + + // Sets the balance of the owner to the given encrypted balance. + function mint(uint64 mintedAmount) public virtual onlyOwner { + balances[owner()] = TFHE.add(balances[owner()], mintedAmount); // overflow impossible because of next line + TFHE.allow(balances[owner()], address(this)); + TFHE.allow(balances[owner()], owner()); + _totalSupply = _totalSupply + mintedAmount; + emit Mint(owner(), mintedAmount); + } + + // Transfers an encrypted amount from the message sender address to the `to` address. + function transfer(address to, einput encryptedAmount, bytes calldata inputProof) public virtual returns (bool) { + transfer(to, TFHE.asEuint64(encryptedAmount, inputProof)); + return true; + } + + // Transfers an amount from the message sender address to the `to` address. + function transfer(address to, euint64 amount) public virtual returns (bool) { + require(TFHE.isSenderAllowed(amount)); + // makes sure the owner has enough tokens + ebool canTransfer = TFHE.le(amount, balances[msg.sender]); + _transfer(msg.sender, to, amount, canTransfer); + return true; + } + + // Returns the balance handle of the caller. + function balanceOf(address wallet) public view virtual returns (euint64) { + return balances[wallet]; + } + + // Sets the `encryptedAmount` as the allowance of `spender` over the caller's tokens. + function approve(address spender, einput encryptedAmount, bytes calldata inputProof) public virtual returns (bool) { + approve(spender, TFHE.asEuint64(encryptedAmount, inputProof)); + return true; + } + + // Sets the `amount` as the allowance of `spender` over the caller's tokens. + function approve(address spender, euint64 amount) public virtual returns (bool) { + require(TFHE.isSenderAllowed(amount)); + address owner = msg.sender; + _approve(owner, spender, amount); + emit Approval(owner, spender); + return true; + } + + // Returns the remaining number of tokens that `spender` is allowed to spend + // on behalf of the caller. + function allowance(address owner, address spender) public view virtual returns (euint64) { + return _allowance(owner, spender); + } + + // Transfers `encryptedAmount` tokens using the caller's allowance. + function transferFrom( + address from, + address to, + einput encryptedAmount, + bytes calldata inputProof + ) public virtual returns (bool) { + transferFrom(from, to, TFHE.asEuint64(encryptedAmount, inputProof)); + return true; + } + + // Transfers `amount` tokens using the caller's allowance. + function transferFrom(address from, address to, euint64 amount) public virtual returns (bool) { + require(TFHE.isSenderAllowed(amount)); + address spender = msg.sender; + ebool isTransferable = _updateAllowance(from, spender, amount); + _transfer(from, to, amount, isTransferable); + return true; + } + + function _approve(address owner, address spender, euint64 amount) internal virtual { + allowances[owner][spender] = amount; + TFHE.allow(amount, address(this)); + TFHE.allow(amount, owner); + TFHE.allow(amount, spender); + } + + function _allowance(address owner, address spender) internal view virtual returns (euint64) { + return allowances[owner][spender]; + } + + function _updateAllowance(address owner, address spender, euint64 amount) internal virtual returns (ebool) { + euint64 currentAllowance = _allowance(owner, spender); + // makes sure the allowance suffices + ebool allowedTransfer = TFHE.le(amount, currentAllowance); + // makes sure the owner has enough tokens + ebool canTransfer = TFHE.le(amount, balances[owner]); + ebool isTransferable = TFHE.and(canTransfer, allowedTransfer); + _approve(owner, spender, TFHE.select(isTransferable, TFHE.sub(currentAllowance, amount), currentAllowance)); + return isTransferable; + } + + // Transfers an encrypted amount. + function _transfer(address from, address to, euint64 amount, ebool isTransferable) internal virtual { + // Add to the balance of `to` and subract from the balance of `from`. + euint64 transferValue = TFHE.select(isTransferable, amount, TFHE.asEuint64(0)); + euint64 newBalanceTo = TFHE.add(balances[to], transferValue); + balances[to] = newBalanceTo; + TFHE.allow(newBalanceTo, address(this)); + TFHE.allow(newBalanceTo, to); + euint64 newBalanceFrom = TFHE.sub(balances[from], transferValue); + balances[from] = newBalanceFrom; + TFHE.allow(newBalanceFrom, address(this)); + TFHE.allow(newBalanceFrom, from); + emit Transfer(from, to); + } +} \ No newline at end of file diff --git a/contracts/contracts/ramps/hdfc/HDFCRamp.sol b/contracts/contracts/ramps/hdfc/HDFCRamp.sol index cf39c3664..9e012f175 100644 --- a/contracts/contracts/ramps/hdfc/HDFCRamp.sol +++ b/contracts/contracts/ramps/hdfc/HDFCRamp.sol @@ -11,8 +11,10 @@ import { IPoseidon6 } from "../../interfaces/IPoseidon6.sol"; import { IRegistrationProcessor } from "./interfaces/IRegistrationProcessor.sol"; import { IHDFCSendProcessor } from "./interfaces/IHDFCSendProcessor.sol"; -pragma solidity ^0.8.18; +import { IeERC20 } from "../../interfaces/IEERC20.sol"; +import "fhevm/lib/TFHE.sol"; +pragma solidity ^0.8.18; contract HDFCRamp is Ownable { using Bytes32ArrayUtils for bytes32[]; @@ -26,6 +28,14 @@ contract HDFCRamp is Ownable { uint256 amount, uint256 conversionRate ); + + event EncryptedDepositReceived( + uint256 indexed depositId, + bytes32 indexed idHash, + euint32 amount, + euint32 conversionRate + ); + event IntentSignaled( bytes32 indexed intentHash, uint256 indexed depositId, @@ -35,6 +45,15 @@ contract HDFCRamp is Ownable { uint256 timestamp ); + event EncIntentSignaled( + bytes32 indexed intentHash, + uint256 indexed depositId, + bytes32 indexed idHash, + address to, + euint32 amount, + uint256 timestamp + ); + event IntentPruned( bytes32 indexed intentHash, uint256 indexed depositId @@ -48,6 +67,15 @@ contract HDFCRamp is Ownable { uint256 amount, uint256 feeAmount ); + + event EncIntentFulfilled( + bytes32 indexed intentHash, + uint256 indexed depositId, + address indexed onRamper, + address to, + euint32 amount + ); + event DepositWithdrawn( uint256 indexed depositId, address indexed depositor, @@ -86,6 +114,16 @@ contract HDFCRamp is Ownable { bytes32[] intentHashes; // Array of hashes of all open intents (may include some expired if not pruned) } + struct EncryptedDeposit { + address depositor; + uint256[8] upiId; + euint32 depositAmount; + euint32 remainingDeposits; + euint32 outstandingIntentAmount; + euint32 conversionRate; + bytes32[] intentHashes; + } + struct DepositWithAvailableLiquidity { uint256 depositId; // ID of the deposit bytes32 depositorIdHash; // Depositor's idHash @@ -101,12 +139,26 @@ contract HDFCRamp is Ownable { uint256 intentTimestamp; // Timestamp of when the intent was signaled } + struct EncryptedIntent { + address onRamper; // On-ramper's address + address to; // Address to forward funds to (can be same as onRamper) + uint256 deposit; // ID of the deposit the intent is signaling on + euint32 amount; // Amount of USDC the on-ramper signals intent for on-chain + uint256 intentTimestamp; // Timestamp of when the intent was signaled + } + struct IntentWithOnRamperId { bytes32 intentHash; // Intent hash Intent intent; // Intent struct bytes32 onRamperIdHash; // Poseidon hash of the on-ramper's idHash } + struct EncIntentWithOnRamperId { + bytes32 intentHash; // Intent hash + EncryptedIntent intent; // Intent struct + bytes32 onRamperIdHash; // Poseidon hash of the on-ramper's idHash + } + struct DenyList { bytes32[] deniedUsers; // Array of idHashes that are denied from taking depositors liquidity mapping(bytes32 => bool) isDenied; // Mapping of idHash to boolean indicating if the user is denied @@ -135,6 +187,7 @@ contract HDFCRamp is Ownable { /* ============ State Variables ============ */ IERC20 public immutable usdc; // USDC token contract + IeERC20 public immutable eusdc; // Encrypted USDC token contract (just named is encrypted usdc lol) IPoseidon3 public immutable poseidon3; // Poseidon hashing contract IPoseidon6 public immutable poseidon6; // Poseidon hashing contract IRegistrationProcessor public registrationProcessor; // Address of registration processor contract, verifies registration e-mails @@ -145,7 +198,9 @@ contract HDFCRamp is Ownable { mapping(bytes32 => GlobalAccountInfo) internal globalAccount; // Mapping of idHash to information used to enforce actions across Ethereum accounts mapping(address => AccountInfo) internal accounts; // Mapping of Ethereum accounts to their account information (idHash and deposits) mapping(uint256 => Deposit) public deposits; // Mapping of depositIds to deposit structs + mapping(uint256 => EncryptedDeposit) public encryptedDeposits; // Mapping of depositIds to deposit structs mapping(bytes32 => Intent) public intents; // Mapping of intentHashes to intent structs + mapping(bytes32 => EncryptedIntent) public encIntents; uint256 public minDepositAmount; // Minimum amount of USDC that can be deposited uint256 public maxOnRampAmount; // Maximum amount of USDC that can be on-ramped in a single transaction @@ -160,6 +215,7 @@ contract HDFCRamp is Ownable { constructor( address _owner, IERC20 _usdc, + IeERC20 _eusdc, IPoseidon3 _poseidon3, IPoseidon6 _poseidon6, uint256 _minDepositAmount, @@ -172,6 +228,7 @@ contract HDFCRamp is Ownable { Ownable() { usdc = _usdc; + eusdc = _eusdc; poseidon3 = _poseidon3; poseidon6 = _poseidon6; minDepositAmount = _minDepositAmount; @@ -274,6 +331,68 @@ contract HDFCRamp is Ownable { emit DepositReceived(depositId, account.idHash, _depositAmount, conversionRate); } + // for simplicity considering uint32 only + // this method doesn't implements requires and assumes parameters are valid for simplicity + function encOffRamp( + uint256[8] memory _upiId, + einput _encryptedDepositAmount, + einput _encryptedReceiveAmount, + bytes calldata _inputProof, + uint256 _depositAmount, + uint256 _receiveAmount + ) + external + onlyRegisteredUser + { + // require(accounts[msg.sender].deposits.length < MAX_DEPOSITS, "Maximum deposit amount reached"); + euint32 encryptedDepositAmount = TFHE.asEuint32(_encryptedDepositAmount, _inputProof); + euint32 encryptedReceiveAmount = TFHE.asEuint32(_encryptedReceiveAmount, _inputProof); + + // ebool depositAmountGreaterThanMinDeposit = TFHE.gt(encryptedDepositAmount, TFHE.asEuint32(minDepositAmount)); + // ebool receivedAmountGreaterThanZero = TFHE.gt(encryptedReceiveAmount, TFHE.asEuint32(0)); + + // require(_depositAmount >= minDepositAmount, "Deposit amount must be greater than min deposit amount"); + // require(_receiveAmount > 0, "Receive amount must be greater than 0"); + + // uint256 conversionRate = (_depositAmount * PRECISE_UNIT) / _receiveAmount; + + // since 1e18 can't fit into 2^64 + uint32 ENC_PRECISE_UINT = 1e9; + // for now let's keep the conversion uint as 1 since division between two encrypted values is not supported + euint32 encryptedConversionRate = TFHE.asEuint32(1); + // TFHE.div(TFHE.mul(encryptedDepositAmount, TFHE.asEuint32(ENC_PRECISE_UINT)), encryptedReceiveAmount); + uint256 depositId = depositCounter++; + + AccountInfo storage account = accounts[msg.sender]; + account.deposits.push(depositId); + + encryptedDeposits[depositId] = EncryptedDeposit({ + depositor: msg.sender, + upiId: _upiId, + depositAmount: encryptedDepositAmount, + remainingDeposits: encryptedDepositAmount, + outstandingIntentAmount: TFHE.asEuint32(0), + conversionRate: encryptedConversionRate, + intentHashes: new bytes32[](0) + }); + + // deposits[depositId] = Deposit({ + // depositor: msg.sender, + // upiId: _upiId, + // depositAmount: _depositAmount, + // remainingDeposits: _depositAmount, + // outstandingIntentAmount: 0, + // conversionRate: conversionRate, + // intentHashes: new bytes32[](0) + // }); + + // usdc.transferFrom(msg.sender, address(this), _depositAmount); + // transferFrom will implicitly convert euint32 to euint64 + eusdc.transferFrom(msg.sender, address(this), _encryptedDepositAmount, _inputProof); + emit EncryptedDepositReceived(depositId, account.idHash, encryptedDepositAmount, encryptedConversionRate); + // emit DepositReceived(depositId, account.idHash, _depositAmount, conversionRate); + } + /** * @notice Signals intent to pay the depositor defined in the _depositId the _amount * deposit conversionRate off-chain * in order to unlock _amount of funds on-chain. Each user can only have one outstanding intent at a time regardless of @@ -336,6 +455,71 @@ contract HDFCRamp is Ownable { emit IntentSignaled(intentHash, _depositId, idHash, _to, _amount, block.timestamp); } + + function encSignalIntent( + uint256 _depositId, + einput _amount, + bytes calldata _inputProof, + // uint256 _amount, + address _to + ) external onlyRegisteredUser { + bytes32 idHash = accounts[msg.sender].idHash; + // Deposit storage deposit = deposits[_depositId]; + EncryptedDeposit storage encDeposit = encryptedDeposits[_depositId]; + bytes32 depositorIdHash = accounts[encDeposit.depositor].idHash; + + // Caller validity checks + require(!globalAccount[depositorIdHash].denyList.isDenied[idHash], "Onramper on depositor's denylist"); + require( + globalAccount[idHash].lastOnrampTimestamp + onRampCooldownPeriod <= block.timestamp, + "On ramp cool down period not elapsed" + ); + require(globalAccount[idHash].currentIntentHash == bytes32(0), "Intent still outstanding"); + require(depositorIdHash != idHash, "Sender cannot be the depositor"); + + // Intent information checks + require(encDeposit.depositor != address(0), "Deposit does not exist"); + // require(_amount > 0, "Signaled amount must be greater than 0"); + // require(_amount <= maxOnRampAmount, "Signaled amount must be less than max on-ramp amount"); + require(_to != address(0), "Cannot send to zero address"); + + bytes32 intentHash = _calculateIntentHash(idHash, _depositId); + + // TODO: fix this condition + // if (encDeposit.remainingDeposits < _amount) { + // ( + // bytes32[] memory prunableIntents, + // uint256 reclaimableAmount + // ) = _getPrunableIntents(_depositId); + + // require(deposit.remainingDeposits + reclaimableAmount >= _amount, "Not enough liquidity"); + + // _pruneIntents(deposit, prunableIntents); + // deposit.remainingDeposits += reclaimableAmount; + // deposit.outstandingIntentAmount -= reclaimableAmount; + // } + + euint32 amount = TFHE.asEuint32(_amount, _inputProof); + + encIntents[intentHash] = EncryptedIntent({ + onRamper: msg.sender, + to: _to, + deposit: _depositId, + amount: amount, + intentTimestamp: block.timestamp + }); + + + globalAccount[idHash].currentIntentHash = intentHash; + + encDeposit.remainingDeposits = TFHE.sub(encDeposit.remainingDeposits, amount); + encDeposit.outstandingIntentAmount = TFHE.add(encDeposit.outstandingIntentAmount, amount); + encDeposit.intentHashes.push(intentHash); + + emit EncIntentSignaled(intentHash, _depositId, idHash, _to, amount, block.timestamp); + } + + // TODO: need to implement enc version of cancel intent /** * @notice Only callable by the originator of the intent. Cancels an outstanding intent thus allowing user to signal a new * intent. Deposit state is updated to reflect the cancelled intent. @@ -392,6 +576,31 @@ contract HDFCRamp is Ownable { _transferFunds(intentHash, intent); } + function encOnRamp( + uint256[2] memory _a, + uint256[2][2] memory _b, + uint256[2] memory _c, + uint256[15] memory _signals + ) + external + { + ( + EncryptedIntent memory intent, + EncryptedDeposit storage deposit, + bytes32 intentHash + ) = _encVerifyOnRampProof(_a, _b, _c, _signals); + + _encPruneIntent(deposit, intentHash); + + deposit.outstandingIntentAmount = TFHE.sub(deposit.outstandingIntentAmount, intent.amount); + globalAccount[accounts[intent.onRamper].idHash].lastOnrampTimestamp = block.timestamp; + // TODO: skipping this for now + // _closeDepositIfNecessary(intent.deposit, deposit); + + _encTransferFunds(intentHash, intent); + } + + // TODO: will make it enc later /** * @notice Allows off-ramper to release funds to the on-ramper in case of a failed on-ramp or because of some other arrangement * between the two parties. Upon submission we check to make sure the msg.sender is the depositor, the intent is removed, and @@ -415,6 +624,7 @@ contract HDFCRamp is Ownable { _transferFunds(_intentHash, intent); } + // TODO: will make it enc later /** * @notice Caller must be the depositor for each depositId in the array, if not whole function fails. Depositor is returned all * remaining deposits and any outstanding intents that are expired. If an intent is not expired then those funds will not be @@ -451,6 +661,7 @@ contract HDFCRamp is Ownable { usdc.transfer(msg.sender, returnAmount); } + // TODO: will make it enc later /** * @notice Adds an idHash to a depositor's deny list. If an address associated with the banned idHash attempts to * signal an intent on the user's deposit they will be denied. @@ -468,6 +679,7 @@ contract HDFCRamp is Ownable { emit UserAddedToDenylist(denyingUser, _deniedUser); } + // TODO: will make it enc later /** * @notice Removes a idHash from a depositor's deny list. * @@ -723,6 +935,16 @@ contract HDFCRamp is Ownable { emit IntentPruned(_intentHash, intent.deposit); } + function _encPruneIntent(EncryptedDeposit storage _deposit, bytes32 _intentHash) internal { + EncryptedIntent memory intent = encIntents[_intentHash]; + + delete globalAccount[accounts[intent.onRamper].idHash].currentIntentHash; + delete intents[_intentHash]; + _deposit.intentHashes.removeStorage(_intentHash); + + emit IntentPruned(_intentHash, intent.deposit); + } + /** * @notice Removes a deposit if no outstanding intents AND no remaining deposits. Deleting a deposit deletes it from the * deposits mapping and removes tracking it in the user's accounts mapping. @@ -753,6 +975,21 @@ contract HDFCRamp is Ownable { emit IntentFulfilled(_intentHash, _intent.deposit, _intent.onRamper, _intent.to, onRampAmount, fee); } + function _encTransferFunds(bytes32 _intentHash, EncryptedIntent memory _intent) internal { + uint256 fee; + // if (sustainabilityFee != 0) { + // fee = (_intent.amount * sustainabilityFee) / PRECISE_UNIT; + // usdc.transfer(sustainabilityFeeRecipient, fee); + // } + + // uint256 onRampAmount = _intent.amount - fee; // charging no fee to user :) + // usdc.transfer(_intent.to, onRampAmount); + eusdc.transfer(_intent.to, TFHE.asEuint64(_intent.amount)); + + // emit IntentFulfilled(_intentHash, _intent.deposit, _intent.onRamper, _intent.to, onRampAmount, fee); + emit EncIntentFulfilled(_intentHash, _intent.deposit, _intent.onRamper, _intent.to, _intent.amount); + } + /** * @notice Validate send payment email and check that it hasn't already been used (done on SendProcessor). * Additionally, we validate that the offRamperIdHash matches the one from the specified intent and that enough @@ -772,7 +1009,7 @@ contract HDFCRamp is Ownable { uint256 timestamp, bytes32 offRamperIdHash, bytes32 onRamperIdHash, - bytes32 intentHash + bytes32 intentHash // TODO: fix this since use won't be selecting the intent hash we would need a run a matching engine to select the intent hash ) = sendProcessor.processProof( IHDFCSendProcessor.SendProof({ a: _a, @@ -794,6 +1031,44 @@ contract HDFCRamp is Ownable { return (intent, deposit, intentHash); } + function _encVerifyOnRampProof( + uint256[2] memory _a, + uint256[2][2] memory _b, + uint256[2] memory _c, + uint256[15] memory _signals + ) + internal + returns(EncryptedIntent memory, EncryptedDeposit storage, bytes32) + { + + // TODO: for now this proof would be with plaintext amount itself + ( + uint256 amount, + uint256 timestamp, + bytes32 offRamperIdHash, + bytes32 onRamperIdHash, + bytes32 intentHash // TODO: fix this since use won't be selecting the intent hash we would need a run a matching engine to select the intent hash + ) = sendProcessor.processProof( + IHDFCSendProcessor.SendProof({ + a: _a, + b: _b, + c: _c, + signals: _signals + }) + ); + + EncryptedIntent memory intent = encIntents[intentHash]; + EncryptedDeposit storage deposit = encryptedDeposits[intent.deposit]; + + // require(intent.onRamper != address(0), "Intent does not exist"); + // require(intent.intentTimestamp <= timestamp, "Intent was not created before send"); + // require(bytes32(_getUpiIdHash(deposit.upiId)) == offRamperIdHash, "Offramper id does not match"); + // require(accounts[intent.onRamper].idHash == onRamperIdHash, "Onramper id does not match"); + // require(amount >= (intent.amount * PRECISE_UNIT) / deposit.conversionRate, "Payment was not enough"); + + return (intent, deposit, intentHash); + } + /** * @notice Validate the user has an HDFC account, we do not nullify this email since it can be reused to register under * different addresses. diff --git a/contracts/contracts/ramps/hdfc/HDFCSendProcessor.sol b/contracts/contracts/ramps/hdfc/HDFCSendProcessor.sol index b09c052fc..71e1c7bc4 100644 --- a/contracts/contracts/ramps/hdfc/HDFCSendProcessor.sol +++ b/contracts/contracts/ramps/hdfc/HDFCSendProcessor.sol @@ -63,6 +63,7 @@ contract HDFCSendProcessor is Groth16Verifier, IHDFCSendProcessor, BaseProcessor // Signals [4:6] is the packed amount, since this is a USDC amount we want to make sure the returned number is // properly padded to 6 decimals. If the parsed has more than 6 figures to the right of the decimal it will revert + // TODO: Need to change this parsing to parse a handle and call data instead of just an amount amount = _parseSignalArray(_proof.signals, 4, 6).stringToUint(6); // Signals [6:11] are the packed timestamp, the timestamp is returned as a string in the format, that we need to diff --git a/contracts/deploy/00_deploy_venmo_contracts.ts b/contracts/deploy/00_deploy_venmo_contracts.ts index aa267906d..b5490ad97 100644 --- a/contracts/deploy/00_deploy_venmo_contracts.ts +++ b/contracts/deploy/00_deploy_venmo_contracts.ts @@ -53,6 +53,7 @@ const func: DeployFunction = async function (hre: HardhatRuntimeEnvironment) { } }); console.log("Poseidon3 deployed at", poseidon.address); + console.log("network: ", network); const ramp = await deploy("Ramp", { from: deployer, diff --git a/contracts/deploy/01_deploy_hdfc_contracts.ts b/contracts/deploy/01_deploy_hdfc_contracts.ts index 42cc2afd9..4e5224543 100644 --- a/contracts/deploy/01_deploy_hdfc_contracts.ts +++ b/contracts/deploy/01_deploy_hdfc_contracts.ts @@ -47,6 +47,7 @@ const func: DeployFunction = async function (hre: HardhatRuntimeEnvironment) { args: [ deployer, usdcAddress, + usdcAddress, // assuming this is eusdc address getDeployedContractAddress(network, "Poseidon3"), poseidon6.address, MIN_DEPOSIT_AMOUNT[paymentProvider][network], @@ -142,4 +143,6 @@ func.skip = async (hre: HardhatRuntimeEnvironment): Promise => { return false; }; +func.tags = ["HDFCDeployment"]; + export default func; diff --git a/contracts/deploy/02_deploy_venmo_v2.ts b/contracts/deploy/02_deploy_venmo_v2.ts index 6a5705a9b..71546de06 100644 --- a/contracts/deploy/02_deploy_venmo_v2.ts +++ b/contracts/deploy/02_deploy_venmo_v2.ts @@ -98,8 +98,8 @@ const func: DeployFunction = async function (hre: HardhatRuntimeEnvironment) { console.log("VenmoRampV2 initialized..."); } - await addWritePermission(hre, nullifierRegistryContract, registrationProcessor.address); await addWritePermission(hre, nullifierRegistryContract, sendProcessor.address); + await addWritePermission(hre, nullifierRegistryContract, registrationProcessor.address); console.log("NullifierRegistry permissions added..."); diff --git a/contracts/deploy/05_deploy_revolut_contracts.ts b/contracts/deploy/05_deploy_revolut_contracts.ts index ebeee0061..bdbb3d645 100644 --- a/contracts/deploy/05_deploy_revolut_contracts.ts +++ b/contracts/deploy/05_deploy_revolut_contracts.ts @@ -118,15 +118,16 @@ const func: DeployFunction = async function (hre: HardhatRuntimeEnvironment) { await setNewOwner(hre, revolutAccountRegistryContract, multiSig); await setNewOwner( hre, - await ethers.getContractAt("RevolutAccountRegistrationProcessor", accountRegistrationProcessor.address), + await ethers.getContractAt("RevolutSendProcessor", sendProcessor.address), multiSig ); await setNewOwner( hre, - await ethers.getContractAt("RevolutSendProcessor", sendProcessor.address), + await ethers.getContractAt("RevolutAccountRegistrationProcessor", accountRegistrationProcessor.address), multiSig ); + console.log("Deploy finished..."); }; diff --git a/contracts/deployments/encifher/.chainId b/contracts/deployments/encifher/.chainId new file mode 100644 index 000000000..bc5d0b773 --- /dev/null +++ b/contracts/deployments/encifher/.chainId @@ -0,0 +1 @@ +9000 \ No newline at end of file diff --git a/contracts/deployments/encifher/GarantiBodyHashVerifier.json b/contracts/deployments/encifher/GarantiBodyHashVerifier.json new file mode 100644 index 000000000..115ce9c6f --- /dev/null +++ b/contracts/deployments/encifher/GarantiBodyHashVerifier.json @@ -0,0 +1,75 @@ +{ + "address": "0xE61a6e7442cE84072DB14423FfBBe2609908Ee38", + "abi": [ + { + "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[4]", + "name": "_pubSignals", + "type": "uint256[4]" + } + ], + "name": "verifyProof", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "transactionHash": "0x3c36c5d7ea5eb9d55f71998631ef67a6d667e506c8247da2bd6d0731b85ffbca", + "receipt": { + "to": null, + "from": "0xa0Ee7A142d267C1f36714E4a8F75612F20a79720", + "contractAddress": "0xE61a6e7442cE84072DB14423FfBBe2609908Ee38", + "transactionIndex": 0, + "gasUsed": "350055", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0x5f02be3c7dbe28a394bebcf4d05f0d078c2892b158eb2b2fee48aa8576954aeb", + "transactionHash": "0x3c36c5d7ea5eb9d55f71998631ef67a6d667e506c8247da2bd6d0731b85ffbca", + "logs": [], + "blockNumber": 61393, + "cumulativeGasUsed": "350055", + "status": 1, + "byzantium": true + }, + "args": [], + "numDeployments": 1, + "solcInputHash": "75b8f55da346d7ed99a350632554d2fb", + "metadata": "{\"compiler\":{\"version\":\"0.8.24+commit.e11b9ed9\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"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[4]\",\"name\":\"_pubSignals\",\"type\":\"uint256[4]\"}],\"name\":\"verifyProof\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/verifiers/garanti_body_suffix_hasher_verifier.sol\":\"Groth16Verifier\"},\"evmVersion\":\"shanghai\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/verifiers/garanti_body_suffix_hasher_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 = 11538879775846674526835491352245177428215656017176257554677806790730122530182;\\n uint256 constant deltax2 = 10342899044037521395319393040886647066391079897134856423910842052487918973972;\\n uint256 constant deltay1 = 7673810604697646469980418300855404491906175026657152448502078673835866310816;\\n uint256 constant deltay2 = 19203038665686855899042926072269909772185515054222824546695896577042064928540;\\n\\n \\n uint256 constant IC0x = 20587965622151968069995649582541315422977747903983693959922015701361725155516;\\n uint256 constant IC0y = 11982628613930328510673935238960631358206293440826148517770479845792210741285;\\n \\n uint256 constant IC1x = 5273354119219253101148387206199535064921520774240409596621174025648940059654;\\n uint256 constant IC1y = 21111800092158453137375162645358573333185713447967811304768419840931409544316;\\n \\n uint256 constant IC2x = 7179175801248398469937796235742931530426723599609730333951354848886540229587;\\n uint256 constant IC2y = 15726679295073391999231605242588933096637939096505469654743841929466661215600;\\n \\n uint256 constant IC3x = 2573745117148849325739153454910100127780727692332106642244822573322697768926;\\n uint256 constant IC3y = 17190036615770915642770313751070930945137672912553152769513644794677235106500;\\n \\n uint256 constant IC4x = 14116421034256566786657627477297711601610402849971726529887805013466353201397;\\n uint256 constant IC4y = 8485070584229074200559412926578438645883198277594792037977619628201373699513;\\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[4] calldata _pubSignals) public view returns (bool) {\\n assembly {\\n function checkField(v) {\\n if iszero(lt(v, q)) {\\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\\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\\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\":\"0x6203eac560e097469393cb611e298265692297a8e6bb05e81d642eb888fc9ee9\",\"license\":\"GPL-3.0\"}},\"version\":1}", + "bytecode": "0x608060405234801561000f575f80fd5b506106718061001d5f395ff3fe608060405234801561000f575f80fd5b5060043610610029575f3560e01c80635fe8c13b1461002d575b5f80fd5b61004061003b3660046105e4565b610054565b604051901515815260200160405180910390f35b5f61055c565b7f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd478110610089575f805260205ff35b50565b5f60405183815284602082015285604082015260408160608360076107d05a03fa9150816100bc575f805260205ff35b825160408201526020830151606082015260408360808360066107d05a03fa915050806100eb575f805260205ff35b5050505050565b7f2d84602728848e471bd1ba9e560f82ab8a7eec80bd3014f76ebd173d6ca628bc85527f1a7ded6d8fdaf30f436cf3f3bfa878a07585d245de1b30e632ec87025f97e82560208601525f608086018661018e87357f2eacdafb8a074f55c7eeaeaba8e637580efd6becf4cc32e3ffcb29d5f7d5c47c7f0ba89cd7566d8ba7283a2c695154fd3596a3fa79ceb3fff200e4a1bc6df50c068461008c565b6101de60208801357f22c4fc2bb63514decde9458ccb4bc65a47aa468ef49618e4eda09120cf429d707f0fdf44fe63793ab49f743161b2aecf184517b4bb0fae7702da1f596ed3c85bd38461008c565b61022e60408801357f260137477524ec7727275599f381fb4d4dcc29fed4c0333d45ca9638a7ad42c47f05b0b02830349454814f64e84c47e6efc8ab5b2eb0b771a4ba2079c48facffde8461008c565b61027e60608801357f12c261380019d137f4c8e7e13bbb8231d5f1e834377311c5dc5e0f2b9d758db97f1f359c754273ab6f981835d1bb37f8c007d8b75ac24d775ff24098f2577f70f58461008c565b50823581527f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4760208401357f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4703066020820152833560408201526020840135606082015260408401356080820152606084013560a08201527f2d4d9aa7e302d9df41749d5507949d05dbea33fbb16c643b22f599a2be6df2e260c08201527f14bedd503c37ceb061d8ec60209fe345ce89830a19230301f076caff004d192660e08201527f0967032fcbf776d1afc985f88877f182d38480a653f2decaa9794cbc3bf3060c6101008201527f0e187847ad4c798374d0d6732bf501847dd68bc0e071241e0213bc7fc13db7ab6101208201527f304cfbd1e08a704a99f5e847d93f8c3caafddec46b7a0d379da69a4d112346a76101408201527f1739c1b1a457a8c7313123d24d2f9192f896b7c63eea05a9d57f06547ad0cec86101608201525f87015161018082015260205f018701516101a08201527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c26101c08201527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed6101e08201527f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b6102008201527f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa610220820152843561024082015260208501356102608201527f1982c6465dbad02e8ffe7203ec829194caa6d8f0c00a28953fe9763ecfbc0d866102808201527f16dddf97803669507bc9011f92e4fff75ea52e1891dfc6655bed759aa87cf4146102a08201527f10f7390ef109560803b040cefb04b3a2400f425ccf60456c6f1815272e05c8a06102c08201527f2a7488e34e7971bee4a74881cf790f1da42411e95a261bb1a7049098f3c8ef1c6102e08201526020816103008360086107d05a03fa9051169695505050505050565b60405161038081016040526105735f84013561005a565b610580602084013561005a565b61058d604084013561005a565b61059a606084013561005a565b6105a7608084013561005a565b6105b4818486888a6100f2565b9050805f5260205ff35b80604081018310156105ce575f80fd5b92915050565b80608081018310156105ce575f80fd5b5f805f8061018085870312156105f8575f80fd5b61060286866105be565b935061061186604087016105d4565b92506106208660c087016105be565b91506106308661010087016105d4565b90509295919450925056fea2646970667358221220558cd1cb4d63da439b5f955bbdaace2ee62299803acf131da3d921ba333c100064736f6c63430008180033", + "deployedBytecode": "0x608060405234801561000f575f80fd5b5060043610610029575f3560e01c80635fe8c13b1461002d575b5f80fd5b61004061003b3660046105e4565b610054565b604051901515815260200160405180910390f35b5f61055c565b7f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd478110610089575f805260205ff35b50565b5f60405183815284602082015285604082015260408160608360076107d05a03fa9150816100bc575f805260205ff35b825160408201526020830151606082015260408360808360066107d05a03fa915050806100eb575f805260205ff35b5050505050565b7f2d84602728848e471bd1ba9e560f82ab8a7eec80bd3014f76ebd173d6ca628bc85527f1a7ded6d8fdaf30f436cf3f3bfa878a07585d245de1b30e632ec87025f97e82560208601525f608086018661018e87357f2eacdafb8a074f55c7eeaeaba8e637580efd6becf4cc32e3ffcb29d5f7d5c47c7f0ba89cd7566d8ba7283a2c695154fd3596a3fa79ceb3fff200e4a1bc6df50c068461008c565b6101de60208801357f22c4fc2bb63514decde9458ccb4bc65a47aa468ef49618e4eda09120cf429d707f0fdf44fe63793ab49f743161b2aecf184517b4bb0fae7702da1f596ed3c85bd38461008c565b61022e60408801357f260137477524ec7727275599f381fb4d4dcc29fed4c0333d45ca9638a7ad42c47f05b0b02830349454814f64e84c47e6efc8ab5b2eb0b771a4ba2079c48facffde8461008c565b61027e60608801357f12c261380019d137f4c8e7e13bbb8231d5f1e834377311c5dc5e0f2b9d758db97f1f359c754273ab6f981835d1bb37f8c007d8b75ac24d775ff24098f2577f70f58461008c565b50823581527f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4760208401357f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4703066020820152833560408201526020840135606082015260408401356080820152606084013560a08201527f2d4d9aa7e302d9df41749d5507949d05dbea33fbb16c643b22f599a2be6df2e260c08201527f14bedd503c37ceb061d8ec60209fe345ce89830a19230301f076caff004d192660e08201527f0967032fcbf776d1afc985f88877f182d38480a653f2decaa9794cbc3bf3060c6101008201527f0e187847ad4c798374d0d6732bf501847dd68bc0e071241e0213bc7fc13db7ab6101208201527f304cfbd1e08a704a99f5e847d93f8c3caafddec46b7a0d379da69a4d112346a76101408201527f1739c1b1a457a8c7313123d24d2f9192f896b7c63eea05a9d57f06547ad0cec86101608201525f87015161018082015260205f018701516101a08201527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c26101c08201527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed6101e08201527f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b6102008201527f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa610220820152843561024082015260208501356102608201527f1982c6465dbad02e8ffe7203ec829194caa6d8f0c00a28953fe9763ecfbc0d866102808201527f16dddf97803669507bc9011f92e4fff75ea52e1891dfc6655bed759aa87cf4146102a08201527f10f7390ef109560803b040cefb04b3a2400f425ccf60456c6f1815272e05c8a06102c08201527f2a7488e34e7971bee4a74881cf790f1da42411e95a261bb1a7049098f3c8ef1c6102e08201526020816103008360086107d05a03fa9051169695505050505050565b60405161038081016040526105735f84013561005a565b610580602084013561005a565b61058d604084013561005a565b61059a606084013561005a565b6105a7608084013561005a565b6105b4818486888a6100f2565b9050805f5260205ff35b80604081018310156105ce575f80fd5b92915050565b80608081018310156105ce575f80fd5b5f805f8061018085870312156105f8575f80fd5b61060286866105be565b935061061186604087016105d4565b92506106208660c087016105be565b91506106308661010087016105d4565b90509295919450925056fea2646970667358221220558cd1cb4d63da439b5f955bbdaace2ee62299803acf131da3d921ba333c100064736f6c63430008180033", + "devdoc": { + "kind": "dev", + "methods": {}, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": {}, + "version": 1 + }, + "storageLayout": { + "storage": [], + "types": null + } +} \ No newline at end of file diff --git a/contracts/deployments/encifher/GarantiManagedKeyHashAdapter.json b/contracts/deployments/encifher/GarantiManagedKeyHashAdapter.json new file mode 100644 index 000000000..839c6cb5c --- /dev/null +++ b/contracts/deployments/encifher/GarantiManagedKeyHashAdapter.json @@ -0,0 +1,290 @@ +{ + "address": "0xD18E3F31bD50B5c6e4cC740CB9Ca637F6eCC2944", + "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": "0x7180c7902f0d83191e3c746bb4878bc99cfcc8711294f235de5d3f19508c58fe", + "receipt": { + "to": null, + "from": "0xa0Ee7A142d267C1f36714E4a8F75612F20a79720", + "contractAddress": "0xD18E3F31bD50B5c6e4cC740CB9Ca637F6eCC2944", + "transactionIndex": 0, + "gasUsed": "475660", + "logsBloom": "0x00000000000000000000040000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000008000000000000000000020000000000000000000800000000000002000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000004000000020001000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0x18692bdcbc7e40f0f3790e57d2493a584ee7e6e70ce6524c1a33a64491347a50", + "transactionHash": "0x7180c7902f0d83191e3c746bb4878bc99cfcc8711294f235de5d3f19508c58fe", + "logs": [ + { + "transactionIndex": 0, + "blockNumber": 61391, + "transactionHash": "0x7180c7902f0d83191e3c746bb4878bc99cfcc8711294f235de5d3f19508c58fe", + "address": "0xD18E3F31bD50B5c6e4cC740CB9Ca637F6eCC2944", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x000000000000000000000000a0ee7a142d267c1f36714e4a8f75612f20a79720" + ], + "data": "0x", + "logIndex": 0, + "blockHash": "0x18692bdcbc7e40f0f3790e57d2493a584ee7e6e70ce6524c1a33a64491347a50" + } + ], + "blockNumber": 61391, + "cumulativeGasUsed": "475660", + "status": 1, + "byzantium": true + }, + "args": [ + [ + "0x03a9c8babd6b4ad94d711f3ffbee84b7aa69f4cb0dd08d491c5a5c32eca15f60" + ] + ], + "numDeployments": 1, + "solcInputHash": "75b8f55da346d7ed99a350632554d2fb", + "metadata": "{\"compiler\":{\"version\":\"0.8.24+commit.e11b9ed9\"},\"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/processors/keyHashAdapters/ManagedKeyHashAdapterV2.sol\":\"ManagedKeyHashAdapterV2\"},\"evmVersion\":\"shanghai\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"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 v4.4.1 (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\",\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"license\":\"MIT\"},\"contracts/external/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/processors/keyHashAdapters/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/processors/keyHashAdapters/ManagedKeyHashAdapterV2.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\n\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\nimport { IKeyHashAdapterV2 } from \\\"./IKeyHashAdapterV2.sol\\\";\\nimport { Bytes32ArrayUtils } from \\\"../../external/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\":\"0xb508d88dca3849e44c40adf29466772b5e6368e0b2eabad5652961344c72f58c\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x608060405234801561000f575f80fd5b5060405161096a38038061096a83398101604081905261002e91610183565b61003733610120565b5f5b8151811015610119575f8282815181106100555761005561023b565b6020908102919091018101515f818152600190925260409091205490915060ff16156100c75760405162461bcd60e51b815260206004820152601660248201527f4b6579206861736820616c726561647920616464656400000000000000000000604482015260640160405180910390fd5b5f8181526001602081905260408220805460ff19168217905560028054808301825592527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace9091019190915501610039565b505061024f565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b634e487b7160e01b5f52604160045260245ffd5b5f6020808385031215610194575f80fd5b82516001600160401b03808211156101aa575f80fd5b818501915085601f8301126101bd575f80fd5b8151818111156101cf576101cf61016f565b8060051b604051601f19603f830116810181811085821117156101f4576101f461016f565b604052918252848201925083810185019188831115610211575f80fd5b938501935b8285101561022f57845184529385019392850192610216565b98975050505050505050565b634e487b7160e01b5f52603260045260245ffd5b61070e8061025c5f395ff3fe608060405234801561000f575f80fd5b5060043610610085575f3560e01c80638da5cb5b116100585780638da5cb5b146100f2578063a26c04ee1461010c578063b86e2d721461011f578063f2fde38b14610140575f80fd5b806319d091521461008957806361ba662a146100c0578063687bc0ab146100d5578063715018a6146100ea575b5f80fd5b6100ab610097366004610604565b60016020525f908152604090205460ff1681565b60405190151581526020015b60405180910390f35b6100d36100ce366004610604565b610153565b005b6100dd61023d565b6040516100b7919061061b565b6100d3610293565b5f546040516001600160a01b0390911681526020016100b7565b6100d361011a366004610604565b6102a6565b61013261012d366004610604565b610350565b6040519081526020016100b7565b6100d361014e36600461065e565b61036f565b61015b6103e8565b5f8181526001602052604090205460ff16156101b75760405162461bcd60e51b815260206004820152601660248201527512d95e481a185cda08185b1c9958591e48185919195960521b60448201526064015b60405180910390fd5b5f818152600160208190526040808320805460ff1916831790556002805492830181559092527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace01829055517fc1674d5f4b3c1397f7aad948ab8fb7adfb24a8f170f8c07349d880c342da030b906102329083815260200190565b60405180910390a150565b6060600280548060200260200160405190810160405280929190818152602001828054801561028957602002820191905f5260205f20905b815481526020019060010190808311610275575b5050505050905090565b61029b6103e8565b6102a45f610441565b565b6102ae6103e8565b5f8181526001602052604090205460ff166103005760405162461bcd60e51b815260206004820152601260248201527112d95e481a185cda081b9bdd08185919195960721b60448201526064016101ae565b5f818152600160205260409020805460ff19169055610320600282610490565b6040518181527f57f03401c03965ea5770efca656f696bdaa598efbaa2c899de9c70749634fabd90602001610232565b6002818154811061035f575f80fd5b5f91825260209091200154905081565b6103776103e8565b6001600160a01b0381166103dc5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016101ae565b6103e581610441565b50565b5f546001600160a01b031633146102a45760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016101ae565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f806104e9848054806020026020016040519081016040528092919081815260200182805480156104de57602002820191905f5260205f20905b8154815260200190600101908083116104ca575b5050505050846105ae565b91509150806105325760405162461bcd60e51b8152602060048201526015602482015274313cba32b99999103737ba1034b71030b93930bc9760591b60448201526064016101ae565b83545f906105429060019061068b565b90508083146105845784818154811061055d5761055d6106b0565b905f5260205f200154858481548110610578576105786106b0565b5f918252602090912001555b84805480610594576105946106c4565b600190038181905f5260205f20015f905590555050505050565b81515f908190815b818110156105f357848682815181106105d1576105d16106b0565b6020026020010151036105eb579250600191506105fd9050565b6001016105b6565b505f195f92509250505b9250929050565b5f60208284031215610614575f80fd5b5035919050565b602080825282518282018190525f9190848201906040850190845b8181101561065257835183529284019291840191600101610636565b50909695505050505050565b5f6020828403121561066e575f80fd5b81356001600160a01b0381168114610684575f80fd5b9392505050565b818103818111156106aa57634e487b7160e01b5f52601160045260245ffd5b92915050565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52603160045260245ffdfea2646970667358221220ab41a7f4861f5df1c1f6a360281ac8bbfe83cb487622b9bc8e87526525d04f8764736f6c63430008180033", + "deployedBytecode": "0x608060405234801561000f575f80fd5b5060043610610085575f3560e01c80638da5cb5b116100585780638da5cb5b146100f2578063a26c04ee1461010c578063b86e2d721461011f578063f2fde38b14610140575f80fd5b806319d091521461008957806361ba662a146100c0578063687bc0ab146100d5578063715018a6146100ea575b5f80fd5b6100ab610097366004610604565b60016020525f908152604090205460ff1681565b60405190151581526020015b60405180910390f35b6100d36100ce366004610604565b610153565b005b6100dd61023d565b6040516100b7919061061b565b6100d3610293565b5f546040516001600160a01b0390911681526020016100b7565b6100d361011a366004610604565b6102a6565b61013261012d366004610604565b610350565b6040519081526020016100b7565b6100d361014e36600461065e565b61036f565b61015b6103e8565b5f8181526001602052604090205460ff16156101b75760405162461bcd60e51b815260206004820152601660248201527512d95e481a185cda08185b1c9958591e48185919195960521b60448201526064015b60405180910390fd5b5f818152600160208190526040808320805460ff1916831790556002805492830181559092527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace01829055517fc1674d5f4b3c1397f7aad948ab8fb7adfb24a8f170f8c07349d880c342da030b906102329083815260200190565b60405180910390a150565b6060600280548060200260200160405190810160405280929190818152602001828054801561028957602002820191905f5260205f20905b815481526020019060010190808311610275575b5050505050905090565b61029b6103e8565b6102a45f610441565b565b6102ae6103e8565b5f8181526001602052604090205460ff166103005760405162461bcd60e51b815260206004820152601260248201527112d95e481a185cda081b9bdd08185919195960721b60448201526064016101ae565b5f818152600160205260409020805460ff19169055610320600282610490565b6040518181527f57f03401c03965ea5770efca656f696bdaa598efbaa2c899de9c70749634fabd90602001610232565b6002818154811061035f575f80fd5b5f91825260209091200154905081565b6103776103e8565b6001600160a01b0381166103dc5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016101ae565b6103e581610441565b50565b5f546001600160a01b031633146102a45760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016101ae565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f806104e9848054806020026020016040519081016040528092919081815260200182805480156104de57602002820191905f5260205f20905b8154815260200190600101908083116104ca575b5050505050846105ae565b91509150806105325760405162461bcd60e51b8152602060048201526015602482015274313cba32b99999103737ba1034b71030b93930bc9760591b60448201526064016101ae565b83545f906105429060019061068b565b90508083146105845784818154811061055d5761055d6106b0565b905f5260205f200154858481548110610578576105786106b0565b5f918252602090912001555b84805480610594576105946106c4565b600190038181905f5260205f20015f905590555050505050565b81515f908190815b818110156105f357848682815181106105d1576105d16106b0565b6020026020010151036105eb579250600191506105fd9050565b6001016105b6565b505f195f92509250505b9250929050565b5f60208284031215610614575f80fd5b5035919050565b602080825282518282018190525f9190848201906040850190845b8181101561065257835183529284019291840191600101610636565b50909695505050505050565b5f6020828403121561066e575f80fd5b81356001600160a01b0381168114610684575f80fd5b9392505050565b818103818111156106aa57634e487b7160e01b5f52601160045260245ffd5b92915050565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52603160045260245ffdfea2646970667358221220ab41a7f4861f5df1c1f6a360281ac8bbfe83cb487622b9bc8e87526525d04f8764736f6c63430008180033", + "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/processors/keyHashAdapters/ManagedKeyHashAdapterV2.sol:ManagedKeyHashAdapterV2", + "label": "_owner", + "offset": 0, + "slot": "0", + "type": "t_address" + }, + { + "astId": 6496, + "contract": "contracts/processors/keyHashAdapters/ManagedKeyHashAdapterV2.sol:ManagedKeyHashAdapterV2", + "label": "isMailServerKeyHash", + "offset": 0, + "slot": "1", + "type": "t_mapping(t_bytes32,t_bool)" + }, + { + "astId": 6499, + "contract": "contracts/processors/keyHashAdapters/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/deployments/encifher/GarantiRamp.json b/contracts/deployments/encifher/GarantiRamp.json new file mode 100644 index 000000000..1c4cb71a7 --- /dev/null +++ b/contracts/deployments/encifher/GarantiRamp.json @@ -0,0 +1,2107 @@ +{ + "address": "0x25C74B7124baE93364213a6124a5e45bB0e98889", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "internalType": "contract IERC20", + "name": "_usdc", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_minDepositAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_maxOnRampAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_intentExpirationPeriod", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_onRampCooldownPeriod", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_sustainabilityFee", + "type": "uint256" + }, + { + "internalType": "address", + "name": "_sustainabilityFeeRecipient", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "accountOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "idHash", + "type": "bytes32" + } + ], + "name": "AccountRegistered", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "depositId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "address", + "name": "depositor", + "type": "address" + } + ], + "name": "DepositClosed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "depositId", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "idHash", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "conversionRate", + "type": "uint256" + } + ], + "name": "DepositReceived", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "depositId", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "address", + "name": "depositor", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "DepositWithdrawn", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "intentExpirationPeriod", + "type": "uint256" + } + ], + "name": "IntentExpirationPeriodSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "intentHash", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "depositId", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "address", + "name": "onRamper", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "feeAmount", + "type": "uint256" + } + ], + "name": "IntentFulfilled", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "intentHash", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "depositId", + "type": "uint256" + } + ], + "name": "IntentPruned", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "intentHash", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "depositId", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "idHash", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "timestamp", + "type": "uint256" + } + ], + "name": "IntentSignaled", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "maxOnRampAmount", + "type": "uint256" + } + ], + "name": "MaxOnRampAmountSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "minDepositAmount", + "type": "uint256" + } + ], + "name": "MinDepositAmountSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "receiveProcessor", + "type": "address" + } + ], + "name": "NewReceiveProcessorSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "registrationProcessor", + "type": "address" + } + ], + "name": "NewRegistrationProcessorSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "sendProcessor", + "type": "address" + } + ], + "name": "NewSendProcessorSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "onRampCooldownPeriod", + "type": "uint256" + } + ], + "name": "OnRampCooldownPeriodSet", + "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": "feeRecipient", + "type": "address" + } + ], + "name": "SustainabilityFeeRecipientUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "fee", + "type": "uint256" + } + ], + "name": "SustainabilityFeeUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bytes32", + "name": "listOwner", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "deniedUser", + "type": "bytes32" + } + ], + "name": "UserAddedToDenylist", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bytes32", + "name": "listOwner", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "approvedUser", + "type": "bytes32" + } + ], + "name": "UserRemovedFromDenylist", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_deniedUser", + "type": "bytes32" + } + ], + "name": "addAccountToDenylist", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_intentHash", + "type": "bytes32" + } + ], + "name": "cancelIntent", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "depositCounter", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "deposits", + "outputs": [ + { + "internalType": "address", + "name": "depositor", + "type": "address" + }, + { + "internalType": "string", + "name": "garantiIban", + "type": "string" + }, + { + "internalType": "string", + "name": "garantiName", + "type": "string" + }, + { + "internalType": "uint256", + "name": "depositAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "remainingDeposits", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "outstandingIntentAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "conversionRate", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_account", + "type": "address" + } + ], + "name": "getAccountDeposits", + "outputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "depositId", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "depositorIdHash", + "type": "bytes32" + }, + { + "components": [ + { + "internalType": "address", + "name": "depositor", + "type": "address" + }, + { + "internalType": "string", + "name": "garantiIban", + "type": "string" + }, + { + "internalType": "string", + "name": "garantiName", + "type": "string" + }, + { + "internalType": "uint256", + "name": "depositAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "remainingDeposits", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "outstandingIntentAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "conversionRate", + "type": "uint256" + }, + { + "internalType": "bytes32[]", + "name": "intentHashes", + "type": "bytes32[]" + } + ], + "internalType": "struct GarantiRamp.Deposit", + "name": "deposit", + "type": "tuple" + }, + { + "internalType": "uint256", + "name": "availableLiquidity", + "type": "uint256" + } + ], + "internalType": "struct GarantiRamp.DepositWithAvailableLiquidity[]", + "name": "accountDeposits", + "type": "tuple[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_account", + "type": "address" + } + ], + "name": "getAccountInfo", + "outputs": [ + { + "components": [ + { + "internalType": "bytes32", + "name": "idHash", + "type": "bytes32" + }, + { + "internalType": "uint256[]", + "name": "deposits", + "type": "uint256[]" + } + ], + "internalType": "struct GarantiRamp.AccountInfo", + "name": "", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_account", + "type": "address" + } + ], + "name": "getDeniedUsers", + "outputs": [ + { + "internalType": "bytes32[]", + "name": "", + "type": "bytes32[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_depositId", + "type": "uint256" + } + ], + "name": "getDeposit", + "outputs": [ + { + "components": [ + { + "internalType": "address", + "name": "depositor", + "type": "address" + }, + { + "internalType": "string", + "name": "garantiIban", + "type": "string" + }, + { + "internalType": "string", + "name": "garantiName", + "type": "string" + }, + { + "internalType": "uint256", + "name": "depositAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "remainingDeposits", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "outstandingIntentAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "conversionRate", + "type": "uint256" + }, + { + "internalType": "bytes32[]", + "name": "intentHashes", + "type": "bytes32[]" + } + ], + "internalType": "struct GarantiRamp.Deposit", + "name": "", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256[]", + "name": "_depositIds", + "type": "uint256[]" + } + ], + "name": "getDepositFromIds", + "outputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "depositId", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "depositorIdHash", + "type": "bytes32" + }, + { + "components": [ + { + "internalType": "address", + "name": "depositor", + "type": "address" + }, + { + "internalType": "string", + "name": "garantiIban", + "type": "string" + }, + { + "internalType": "string", + "name": "garantiName", + "type": "string" + }, + { + "internalType": "uint256", + "name": "depositAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "remainingDeposits", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "outstandingIntentAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "conversionRate", + "type": "uint256" + }, + { + "internalType": "bytes32[]", + "name": "intentHashes", + "type": "bytes32[]" + } + ], + "internalType": "struct GarantiRamp.Deposit", + "name": "deposit", + "type": "tuple" + }, + { + "internalType": "uint256", + "name": "availableLiquidity", + "type": "uint256" + } + ], + "internalType": "struct GarantiRamp.DepositWithAvailableLiquidity[]", + "name": "depositArray", + "type": "tuple[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_account", + "type": "address" + } + ], + "name": "getIdCurrentIntentHash", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32[]", + "name": "_intentHashes", + "type": "bytes32[]" + } + ], + "name": "getIntentsWithOnRamperId", + "outputs": [ + { + "components": [ + { + "internalType": "bytes32", + "name": "intentHash", + "type": "bytes32" + }, + { + "components": [ + { + "internalType": "address", + "name": "onRamper", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "deposit", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "intentTimestamp", + "type": "uint256" + } + ], + "internalType": "struct GarantiRamp.Intent", + "name": "intent", + "type": "tuple" + }, + { + "internalType": "bytes32", + "name": "onRamperIdHash", + "type": "bytes32" + } + ], + "internalType": "struct GarantiRamp.IntentWithOnRamperId[]", + "name": "", + "type": "tuple[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_account", + "type": "address" + } + ], + "name": "getLastOnRampTimestamp", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IGarantiRegistrationProcessor", + "name": "_registrationProcessor", + "type": "address" + }, + { + "internalType": "contract IGarantiSendProcessor", + "name": "_sendProcessor", + "type": "address" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "intentExpirationPeriod", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "name": "intents", + "outputs": [ + { + "internalType": "address", + "name": "onRamper", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "deposit", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "intentTimestamp", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_account", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "_deniedUser", + "type": "bytes32" + } + ], + "name": "isDeniedUser", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "isInitialized", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "_iban", + "type": "string" + } + ], + "name": "isValidIban", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [], + "name": "maxOnRampAmount", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "minDepositAmount", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "_garantiIban", + "type": "string" + }, + { + "internalType": "string", + "name": "_garantiName", + "type": "string" + }, + { + "internalType": "uint256", + "name": "_depositAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_receiveAmount", + "type": "uint256" + } + ], + "name": "offRamp", + "outputs": [], + "stateMutability": "nonpayable", + "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[28]", + "name": "signals", + "type": "uint256[28]" + } + ], + "internalType": "struct IGarantiSendProcessor.SendProof", + "name": "_proof", + "type": "tuple" + }, + { + "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[4]", + "name": "signals", + "type": "uint256[4]" + } + ], + "internalType": "struct IGarantiBodySuffixHashVerifier.BodySuffixHashProof", + "name": "_bodyHashProof", + "type": "tuple" + } + ], + "name": "onRamp", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "onRampCooldownPeriod", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "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[11]", + "name": "signals", + "type": "uint256[11]" + } + ], + "internalType": "struct IGarantiRegistrationProcessor.RegistrationProof", + "name": "_proof", + "type": "tuple" + }, + { + "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[4]", + "name": "signals", + "type": "uint256[4]" + } + ], + "internalType": "struct IGarantiBodySuffixHashVerifier.BodySuffixHashProof", + "name": "_bodyHashProof", + "type": "tuple" + } + ], + "name": "register", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "registrationProcessor", + "outputs": [ + { + "internalType": "contract IGarantiRegistrationProcessor", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_intentHash", + "type": "bytes32" + } + ], + "name": "releaseFundsToOnramper", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_approvedUser", + "type": "bytes32" + } + ], + "name": "removeAccountFromDenylist", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "sendProcessor", + "outputs": [ + { + "internalType": "contract IGarantiSendProcessor", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_intentExpirationPeriod", + "type": "uint256" + } + ], + "name": "setIntentExpirationPeriod", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_maxOnRampAmount", + "type": "uint256" + } + ], + "name": "setMaxOnRampAmount", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_minDepositAmount", + "type": "uint256" + } + ], + "name": "setMinDepositAmount", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_onRampCooldownPeriod", + "type": "uint256" + } + ], + "name": "setOnRampCooldownPeriod", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IGarantiRegistrationProcessor", + "name": "_registrationProcessor", + "type": "address" + } + ], + "name": "setRegistrationProcessor", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IGarantiSendProcessor", + "name": "_sendProcessor", + "type": "address" + } + ], + "name": "setSendProcessor", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_fee", + "type": "uint256" + } + ], + "name": "setSustainabilityFee", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_feeRecipient", + "type": "address" + } + ], + "name": "setSustainabilityFeeRecipient", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_depositId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + }, + { + "internalType": "address", + "name": "_to", + "type": "address" + } + ], + "name": "signalIntent", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "sustainabilityFee", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "sustainabilityFeeRecipient", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "usdc", + "outputs": [ + { + "internalType": "contract IERC20", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256[]", + "name": "_depositIds", + "type": "uint256[]" + } + ], + "name": "withdrawDeposit", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "transactionHash": "0x145a70dc247a97173246ca3fa22d7ea725fa7b7a5765ef7a152aa573d2da6426", + "receipt": { + "to": null, + "from": "0xa0Ee7A142d267C1f36714E4a8F75612F20a79720", + "contractAddress": "0x25C74B7124baE93364213a6124a5e45bB0e98889", + "transactionIndex": 0, + "gasUsed": "3700223", + "logsBloom": "0x00000000000000000000040000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000008000000000000000040020000000000000000000800000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000004000000020000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0x6a4d9bec81153e3ea5d1794d331d94d850b53d24844a24ab45863b1fde599f13", + "transactionHash": "0x145a70dc247a97173246ca3fa22d7ea725fa7b7a5765ef7a152aa573d2da6426", + "logs": [ + { + "transactionIndex": 0, + "blockNumber": 61389, + "transactionHash": "0x145a70dc247a97173246ca3fa22d7ea725fa7b7a5765ef7a152aa573d2da6426", + "address": "0x25C74B7124baE93364213a6124a5e45bB0e98889", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x000000000000000000000000a0ee7a142d267c1f36714e4a8f75612f20a79720" + ], + "data": "0x", + "logIndex": 0, + "blockHash": "0x6a4d9bec81153e3ea5d1794d331d94d850b53d24844a24ab45863b1fde599f13" + }, + { + "transactionIndex": 0, + "blockNumber": 61389, + "transactionHash": "0x145a70dc247a97173246ca3fa22d7ea725fa7b7a5765ef7a152aa573d2da6426", + "address": "0x25C74B7124baE93364213a6124a5e45bB0e98889", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x000000000000000000000000a0ee7a142d267c1f36714e4a8f75612f20a79720", + "0x000000000000000000000000a0ee7a142d267c1f36714e4a8f75612f20a79720" + ], + "data": "0x", + "logIndex": 1, + "blockHash": "0x6a4d9bec81153e3ea5d1794d331d94d850b53d24844a24ab45863b1fde599f13" + } + ], + "blockNumber": 61389, + "cumulativeGasUsed": "3700223", + "status": 1, + "byzantium": true + }, + "args": [ + "0xa0Ee7A142d267C1f36714E4a8F75612F20a79720", + "0x04fc820176617A99AE134904935Bc854b2e51628", + "10000000", + "999000000", + "180", + "180", + "1000000000000000", + "0xa0Ee7A142d267C1f36714E4a8F75612F20a79720" + ], + "numDeployments": 1, + "solcInputHash": "75b8f55da346d7ed99a350632554d2fb", + "metadata": "{\"compiler\":{\"version\":\"0.8.24+commit.e11b9ed9\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"},{\"internalType\":\"contract IERC20\",\"name\":\"_usdc\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_minDepositAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_maxOnRampAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_intentExpirationPeriod\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_onRampCooldownPeriod\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_sustainabilityFee\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_sustainabilityFeeRecipient\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"accountOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"idHash\",\"type\":\"bytes32\"}],\"name\":\"AccountRegistered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"depositId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"depositor\",\"type\":\"address\"}],\"name\":\"DepositClosed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"depositId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"idHash\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"conversionRate\",\"type\":\"uint256\"}],\"name\":\"DepositReceived\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"depositId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"depositor\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"DepositWithdrawn\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"intentExpirationPeriod\",\"type\":\"uint256\"}],\"name\":\"IntentExpirationPeriodSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"intentHash\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"depositId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"onRamper\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"feeAmount\",\"type\":\"uint256\"}],\"name\":\"IntentFulfilled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"intentHash\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"depositId\",\"type\":\"uint256\"}],\"name\":\"IntentPruned\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"intentHash\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"depositId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"idHash\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"}],\"name\":\"IntentSignaled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"maxOnRampAmount\",\"type\":\"uint256\"}],\"name\":\"MaxOnRampAmountSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"minDepositAmount\",\"type\":\"uint256\"}],\"name\":\"MinDepositAmountSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"receiveProcessor\",\"type\":\"address\"}],\"name\":\"NewReceiveProcessorSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"registrationProcessor\",\"type\":\"address\"}],\"name\":\"NewRegistrationProcessorSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"sendProcessor\",\"type\":\"address\"}],\"name\":\"NewSendProcessorSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"onRampCooldownPeriod\",\"type\":\"uint256\"}],\"name\":\"OnRampCooldownPeriodSet\",\"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\":\"feeRecipient\",\"type\":\"address\"}],\"name\":\"SustainabilityFeeRecipientUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"fee\",\"type\":\"uint256\"}],\"name\":\"SustainabilityFeeUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"listOwner\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"deniedUser\",\"type\":\"bytes32\"}],\"name\":\"UserAddedToDenylist\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"listOwner\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"approvedUser\",\"type\":\"bytes32\"}],\"name\":\"UserRemovedFromDenylist\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_deniedUser\",\"type\":\"bytes32\"}],\"name\":\"addAccountToDenylist\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_intentHash\",\"type\":\"bytes32\"}],\"name\":\"cancelIntent\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"depositCounter\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"deposits\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"depositor\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"garantiIban\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"garantiName\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"depositAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"remainingDeposits\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"outstandingIntentAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"conversionRate\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_account\",\"type\":\"address\"}],\"name\":\"getAccountDeposits\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"depositId\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"depositorIdHash\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"depositor\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"garantiIban\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"garantiName\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"depositAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"remainingDeposits\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"outstandingIntentAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"conversionRate\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[]\",\"name\":\"intentHashes\",\"type\":\"bytes32[]\"}],\"internalType\":\"struct GarantiRamp.Deposit\",\"name\":\"deposit\",\"type\":\"tuple\"},{\"internalType\":\"uint256\",\"name\":\"availableLiquidity\",\"type\":\"uint256\"}],\"internalType\":\"struct GarantiRamp.DepositWithAvailableLiquidity[]\",\"name\":\"accountDeposits\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_account\",\"type\":\"address\"}],\"name\":\"getAccountInfo\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"idHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint256[]\",\"name\":\"deposits\",\"type\":\"uint256[]\"}],\"internalType\":\"struct GarantiRamp.AccountInfo\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_account\",\"type\":\"address\"}],\"name\":\"getDeniedUsers\",\"outputs\":[{\"internalType\":\"bytes32[]\",\"name\":\"\",\"type\":\"bytes32[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_depositId\",\"type\":\"uint256\"}],\"name\":\"getDeposit\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"depositor\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"garantiIban\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"garantiName\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"depositAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"remainingDeposits\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"outstandingIntentAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"conversionRate\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[]\",\"name\":\"intentHashes\",\"type\":\"bytes32[]\"}],\"internalType\":\"struct GarantiRamp.Deposit\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256[]\",\"name\":\"_depositIds\",\"type\":\"uint256[]\"}],\"name\":\"getDepositFromIds\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"depositId\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"depositorIdHash\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"depositor\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"garantiIban\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"garantiName\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"depositAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"remainingDeposits\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"outstandingIntentAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"conversionRate\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[]\",\"name\":\"intentHashes\",\"type\":\"bytes32[]\"}],\"internalType\":\"struct GarantiRamp.Deposit\",\"name\":\"deposit\",\"type\":\"tuple\"},{\"internalType\":\"uint256\",\"name\":\"availableLiquidity\",\"type\":\"uint256\"}],\"internalType\":\"struct GarantiRamp.DepositWithAvailableLiquidity[]\",\"name\":\"depositArray\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_account\",\"type\":\"address\"}],\"name\":\"getIdCurrentIntentHash\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[]\",\"name\":\"_intentHashes\",\"type\":\"bytes32[]\"}],\"name\":\"getIntentsWithOnRamperId\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"intentHash\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"onRamper\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"deposit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"intentTimestamp\",\"type\":\"uint256\"}],\"internalType\":\"struct GarantiRamp.Intent\",\"name\":\"intent\",\"type\":\"tuple\"},{\"internalType\":\"bytes32\",\"name\":\"onRamperIdHash\",\"type\":\"bytes32\"}],\"internalType\":\"struct GarantiRamp.IntentWithOnRamperId[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_account\",\"type\":\"address\"}],\"name\":\"getLastOnRampTimestamp\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IGarantiRegistrationProcessor\",\"name\":\"_registrationProcessor\",\"type\":\"address\"},{\"internalType\":\"contract IGarantiSendProcessor\",\"name\":\"_sendProcessor\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"intentExpirationPeriod\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"intents\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"onRamper\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"deposit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"intentTimestamp\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_account\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"_deniedUser\",\"type\":\"bytes32\"}],\"name\":\"isDeniedUser\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isInitialized\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_iban\",\"type\":\"string\"}],\"name\":\"isValidIban\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"maxOnRampAmount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"minDepositAmount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_garantiIban\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_garantiName\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"_depositAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_receiveAmount\",\"type\":\"uint256\"}],\"name\":\"offRamp\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"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[28]\",\"name\":\"signals\",\"type\":\"uint256[28]\"}],\"internalType\":\"struct IGarantiSendProcessor.SendProof\",\"name\":\"_proof\",\"type\":\"tuple\"},{\"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[4]\",\"name\":\"signals\",\"type\":\"uint256[4]\"}],\"internalType\":\"struct IGarantiBodySuffixHashVerifier.BodySuffixHashProof\",\"name\":\"_bodyHashProof\",\"type\":\"tuple\"}],\"name\":\"onRamp\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"onRampCooldownPeriod\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"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[11]\",\"name\":\"signals\",\"type\":\"uint256[11]\"}],\"internalType\":\"struct IGarantiRegistrationProcessor.RegistrationProof\",\"name\":\"_proof\",\"type\":\"tuple\"},{\"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[4]\",\"name\":\"signals\",\"type\":\"uint256[4]\"}],\"internalType\":\"struct IGarantiBodySuffixHashVerifier.BodySuffixHashProof\",\"name\":\"_bodyHashProof\",\"type\":\"tuple\"}],\"name\":\"register\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"registrationProcessor\",\"outputs\":[{\"internalType\":\"contract IGarantiRegistrationProcessor\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_intentHash\",\"type\":\"bytes32\"}],\"name\":\"releaseFundsToOnramper\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_approvedUser\",\"type\":\"bytes32\"}],\"name\":\"removeAccountFromDenylist\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"sendProcessor\",\"outputs\":[{\"internalType\":\"contract IGarantiSendProcessor\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_intentExpirationPeriod\",\"type\":\"uint256\"}],\"name\":\"setIntentExpirationPeriod\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_maxOnRampAmount\",\"type\":\"uint256\"}],\"name\":\"setMaxOnRampAmount\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_minDepositAmount\",\"type\":\"uint256\"}],\"name\":\"setMinDepositAmount\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_onRampCooldownPeriod\",\"type\":\"uint256\"}],\"name\":\"setOnRampCooldownPeriod\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IGarantiRegistrationProcessor\",\"name\":\"_registrationProcessor\",\"type\":\"address\"}],\"name\":\"setRegistrationProcessor\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IGarantiSendProcessor\",\"name\":\"_sendProcessor\",\"type\":\"address\"}],\"name\":\"setSendProcessor\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_fee\",\"type\":\"uint256\"}],\"name\":\"setSustainabilityFee\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_feeRecipient\",\"type\":\"address\"}],\"name\":\"setSustainabilityFeeRecipient\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_depositId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"}],\"name\":\"signalIntent\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"sustainabilityFee\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"sustainabilityFeeRecipient\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"usdc\",\"outputs\":[{\"internalType\":\"contract IERC20\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256[]\",\"name\":\"_depositIds\",\"type\":\"uint256[]\"}],\"name\":\"withdrawDeposit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"addAccountToDenylist(bytes32)\":{\"params\":{\"_deniedUser\":\"Poseidon hash of the idHash being banned\"}},\"cancelIntent(bytes32)\":{\"params\":{\"_intentHash\":\"Hash of intent being cancelled\"}},\"initialize(address,address)\":{\"params\":{\"_registrationProcessor\":\"Registration processor address\",\"_sendProcessor\":\"Send processor address\"}},\"offRamp(string,string,uint256,uint256)\":{\"params\":{\"_depositAmount\":\"The amount of USDC to off-ramp\",\"_garantiIban\":\"IBAN number of the depositor with spacing as such: \\\"TR## #### #### #### #### #### ##\\\"\",\"_garantiName\":\"Name given for Garanti IBAN account, necessary for on-rampers to complete on-ramp\",\"_receiveAmount\":\"The amount of USD to receive\"}},\"onRamp((uint256[2],uint256[2][2],uint256[2],uint256[28]),(uint256[2],uint256[2][2],uint256[2],uint256[4]))\":{\"params\":{\"_bodyHashProof\":\"Parameters and signals for body hash proof\",\"_proof\":\"Parameters and signals for send email proof\"}},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"register((uint256[2],uint256[2][2],uint256[2],uint256[11]),(uint256[2],uint256[2][2],uint256[2],uint256[4]))\":{\"params\":{\"_bodyHashProof\":\"Parameters and signals for body hash proof\",\"_proof\":\"Parameters and signals for registration email proof\"}},\"releaseFundsToOnramper(bytes32)\":{\"params\":{\"_intentHash\":\"Hash of intent to resolve by releasing the funds\"}},\"removeAccountFromDenylist(bytes32)\":{\"params\":{\"_approvedUser\":\"Poseidon hash of the idHash being approved\"}},\"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.\"},\"setIntentExpirationPeriod(uint256)\":{\"params\":{\"_intentExpirationPeriod\":\"New intent expiration period\"}},\"setMaxOnRampAmount(uint256)\":{\"params\":{\"_maxOnRampAmount\":\"The new max on ramp amount\"}},\"setMinDepositAmount(uint256)\":{\"params\":{\"_minDepositAmount\":\"The new minimum deposit amount\"}},\"setOnRampCooldownPeriod(uint256)\":{\"params\":{\"_onRampCooldownPeriod\":\"New on-ramp cooldown period\"}},\"setRegistrationProcessor(address)\":{\"params\":{\"_registrationProcessor\":\"New registration proccesor address\"}},\"setSendProcessor(address)\":{\"params\":{\"_sendProcessor\":\"New send proccesor address\"}},\"setSustainabilityFee(uint256)\":{\"params\":{\"_fee\":\"The new sustainability fee in precise units (10**18, ie 10% = 1e17)\"}},\"setSustainabilityFeeRecipient(address)\":{\"params\":{\"_feeRecipient\":\"The new fee recipient address\"}},\"signalIntent(uint256,uint256,address)\":{\"params\":{\"_amount\":\"The amount of USDC the user wants to on-ramp\",\"_depositId\":\"The ID of the deposit the on-ramper intends to use for \",\"_to\":\"Address to forward funds to (can be same as onRamper)\"}},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"},\"withdrawDeposit(uint256[])\":{\"params\":{\"_depositIds\":\"Array of depositIds the depositor is attempting to withdraw\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"addAccountToDenylist(bytes32)\":{\"notice\":\"Adds an idHash to a depositor's deny list. If an address associated with the banned idHash attempts to signal an intent on the user's deposit they will be denied.\"},\"cancelIntent(bytes32)\":{\"notice\":\"Only callable by the originator of the intent. Cancels an outstanding intent thus allowing user to signal a new intent. Deposit state is updated to reflect the cancelled intent.\"},\"initialize(address,address)\":{\"notice\":\"Initialize Ramp with the addresses of the Processors\"},\"offRamp(string,string,uint256,uint256)\":{\"notice\":\"Generates a deposit entry for off-rampers that can then be fulfilled by an on-ramper. This function will not add to previous deposits. Every deposit has it's own unique identifier. User must approve the contract to transfer the deposit amount of USDC.\"},\"onRamp((uint256[2],uint256[2][2],uint256[2],uint256[28]),(uint256[2],uint256[2][2],uint256[2],uint256[4]))\":{\"notice\":\"Anyone can submit an on-ramp transaction, even if caller isn't on-ramper. Upon submission the proof is validated, intent is removed, and deposit state is updated. USDC is transferred to the on-ramper.\"},\"register((uint256[2],uint256[2][2],uint256[2],uint256[11]),(uint256[2],uint256[2][2],uint256[2],uint256[4]))\":{\"notice\":\"Registers a new account by pulling the hash of the account id from the proof and assigning the account owner to the sender of the transaction. One Garanti account can be registered to multiple Ethereum addresses.\"},\"releaseFundsToOnramper(bytes32)\":{\"notice\":\"Allows off-ramper to release funds to the on-ramper in case of a failed on-ramp or because of some other arrangement between the two parties. Upon submission we check to make sure the msg.sender is the depositor, the intent is removed, and deposit state is updated. USDC is transferred to the on-ramper.\"},\"removeAccountFromDenylist(bytes32)\":{\"notice\":\"Removes a idHash from a depositor's deny list.\"},\"setIntentExpirationPeriod(uint256)\":{\"notice\":\"GOVERNANCE ONLY: Updates the intent expiration period, after this period elapses an intent can be pruned to prevent locking up a depositor's funds.\"},\"setMaxOnRampAmount(uint256)\":{\"notice\":\"GOVERNANCE ONLY: Updates the max amount allowed to be on-ramped in each transaction. To on-ramp more than this amount a user must make multiple transactions.\"},\"setMinDepositAmount(uint256)\":{\"notice\":\"GOVERNANCE ONLY: Updates the minimum deposit amount a user can specify for off-ramping.\"},\"setOnRampCooldownPeriod(uint256)\":{\"notice\":\"GOVERNANCE ONLY: Updates the on-ramp cooldown period, once an on-ramp transaction is completed the user must wait this amount of time before they can signalIntent to on-ramp again.\"},\"setRegistrationProcessor(address)\":{\"notice\":\"GOVERNANCE ONLY: Updates the registration processor address used for validating and interpreting zk proofs.\"},\"setSendProcessor(address)\":{\"notice\":\"GOVERNANCE ONLY: Updates the send processor address used for validating and interpreting zk proofs.\"},\"setSustainabilityFee(uint256)\":{\"notice\":\"GOVERNANCE ONLY: Updates the sustainability fee. This fee is charged to on-rampers upon a successful on-ramp.\"},\"setSustainabilityFeeRecipient(address)\":{\"notice\":\"GOVERNANCE ONLY: Updates the recepient of sustainability fees.\"},\"signalIntent(uint256,uint256,address)\":{\"notice\":\"Signals intent to pay the depositor defined in the _depositId the _amount * deposit conversionRate off-chain in order to unlock _amount of funds on-chain. Each user can only have one outstanding intent at a time regardless of address (tracked using idHash). Caller must not be on the depositor's deny list. If there are prunable intents then they will be deleted from the deposit to be able to maintain state hygiene.\"},\"withdrawDeposit(uint256[])\":{\"notice\":\"Caller must be the depositor for each depositId in the array, if not whole function fails. Depositor is returned all remaining deposits and any outstanding intents that are expired. If an intent is not expired then those funds will not be returned. Deposit will be deleted as long as there are no more outstanding intents.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/ramps/garanti/GarantiRamp.sol\":\"GarantiRamp\"},\"evmVersion\":\"shanghai\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"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/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/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (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\",\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"license\":\"MIT\"},\"contracts/external/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/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 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\":\"0x102021415f8444ff563fc6d0082f39296f47c09ce73fb4cd642e700ac489eefe\",\"license\":\"Apache-2.0\"},\"contracts/interfaces/IPoseidon3.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.18;\\n\\ninterface IPoseidon3 {\\n function poseidon(uint256[3] memory _a) external pure returns(uint256);\\n}\\n\",\"keccak256\":\"0x39cd67d4a7ef93e243c77b7c8a40c3842c060a7f444b0b2c875bce7d8d0c24fa\",\"license\":\"MIT\"},\"contracts/interfaces/IPoseidon6.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.18;\\n\\ninterface IPoseidon6 {\\n function poseidon(uint256[6] memory _a) external pure returns(uint256);\\n}\\n\",\"keccak256\":\"0x9609bcff68e45a22b551bf5f42a5ea62ea0b33e433a89f7c89a6b0714df09229\",\"license\":\"MIT\"},\"contracts/ramps/garanti/GarantiRamp.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\n\\nimport { IERC20 } from \\\"@openzeppelin/contracts/token/ERC20/IERC20.sol\\\";\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\nimport { Bytes32ArrayUtils } from \\\"../../external/Bytes32ArrayUtils.sol\\\";\\nimport { Uint256ArrayUtils } from \\\"../../external/Uint256ArrayUtils.sol\\\";\\n\\nimport { IPoseidon3 } from \\\"../../interfaces/IPoseidon3.sol\\\";\\nimport { IPoseidon6 } from \\\"../../interfaces/IPoseidon6.sol\\\";\\nimport { IGarantiBodySuffixHashVerifier } from \\\"./interfaces/IGarantiBodySuffixHashVerifier.sol\\\";\\nimport { IGarantiRegistrationProcessor } from \\\"./interfaces/IGarantiRegistrationProcessor.sol\\\";\\nimport { IGarantiSendProcessor } from \\\"./interfaces/IGarantiSendProcessor.sol\\\";\\n\\npragma solidity ^0.8.18;\\n\\ncontract GarantiRamp is Ownable {\\n\\n using Bytes32ArrayUtils for bytes32[];\\n using Uint256ArrayUtils for uint256[];\\n\\n /* ============ Events ============ */\\n event AccountRegistered(address indexed accountOwner, bytes32 indexed idHash);\\n event DepositReceived(\\n uint256 indexed depositId,\\n bytes32 indexed idHash,\\n uint256 amount,\\n uint256 conversionRate\\n );\\n event IntentSignaled(\\n bytes32 indexed intentHash,\\n uint256 indexed depositId,\\n bytes32 indexed idHash,\\n address to,\\n uint256 amount,\\n uint256 timestamp\\n );\\n\\n event IntentPruned(\\n bytes32 indexed intentHash,\\n uint256 indexed depositId\\n );\\n // Do we want to emit the onRamper or the idHash\\n event IntentFulfilled(\\n bytes32 indexed intentHash,\\n uint256 indexed depositId,\\n address indexed onRamper,\\n address to,\\n uint256 amount,\\n uint256 feeAmount\\n );\\n event DepositWithdrawn(\\n uint256 indexed depositId,\\n address indexed depositor,\\n uint256 amount\\n );\\n\\n event DepositClosed(uint256 depositId, address depositor);\\n event UserAddedToDenylist(bytes32 listOwner, bytes32 deniedUser);\\n event UserRemovedFromDenylist(bytes32 listOwner, bytes32 approvedUser);\\n event MinDepositAmountSet(uint256 minDepositAmount);\\n event MaxOnRampAmountSet(uint256 maxOnRampAmount);\\n event IntentExpirationPeriodSet(uint256 intentExpirationPeriod);\\n event OnRampCooldownPeriodSet(uint256 onRampCooldownPeriod);\\n event SustainabilityFeeUpdated(uint256 fee);\\n event SustainabilityFeeRecipientUpdated(address feeRecipient);\\n event NewSendProcessorSet(address sendProcessor);\\n event NewRegistrationProcessorSet(address registrationProcessor);\\n event NewReceiveProcessorSet(address receiveProcessor);\\n\\n /* ============ Structs ============ */\\n\\n // Each Account is tied to a GlobalAccount via its associated idHash. Each account is represented by an Ethereum address\\n // and is allowed to have at most 5 deposits associated with it.\\n struct AccountInfo {\\n bytes32 idHash; // Hash of payment processor id\\n uint256[] deposits; // Array of open account deposits\\n }\\n\\n struct Deposit {\\n address depositor;\\n string garantiIban; // IBAN number of the depositor with spacing as such: \\\"TR## #### #### #### #### #### ##\\\"\\n string garantiName; // Name given for Garanti IBAN account, necessary for on-rampers to complete on-ramp\\n uint256 depositAmount; // Amount of USDC deposited\\n uint256 remainingDeposits; // Amount of remaining deposited liquidity\\n uint256 outstandingIntentAmount; // Amount of outstanding intents (may include expired intents)\\n uint256 conversionRate; // Conversion required by off-ramper between USDC/USD\\n bytes32[] intentHashes; // Array of hashes of all open intents (may include some expired if not pruned)\\n }\\n\\n struct DepositWithAvailableLiquidity {\\n uint256 depositId; // ID of the deposit\\n bytes32 depositorIdHash; // Depositor's idHash \\n Deposit deposit; // Deposit struct\\n uint256 availableLiquidity; // Amount of liquidity available to signal intents (net of expired intents)\\n }\\n\\n struct Intent {\\n address onRamper; // On-ramper's address\\n address to; // Address to forward funds to (can be same as onRamper)\\n uint256 deposit; // ID of the deposit the intent is signaling on\\n uint256 amount; // Amount of USDC the on-ramper signals intent for on-chain\\n uint256 intentTimestamp; // Timestamp of when the intent was signaled\\n }\\n\\n struct IntentWithOnRamperId {\\n bytes32 intentHash; // Intent hash\\n Intent intent; // Intent struct\\n bytes32 onRamperIdHash; // Poseidon hash of the on-ramper's idHash\\n }\\n\\n struct DenyList {\\n bytes32[] deniedUsers; // Array of idHashes that are denied from taking depositors liquidity\\n mapping(bytes32 => bool) isDenied; // Mapping of idHash to boolean indicating if the user is denied\\n }\\n\\n // A Global Account is defined as an account represented by one idHash. This is used to enforce limitations on actions across\\n // all Ethereum addresses that are associated with that idHash. In this case we use it to enforce a cooldown period between on ramps,\\n // restrict each Garanti account to one outstanding intent at a time, and to enforce deny lists.\\n struct GlobalAccountInfo {\\n bytes32 currentIntentHash; // Hash of the current open intent (if exists)\\n uint256 lastOnrampTimestamp; // Timestamp of the last on-ramp transaction used to check if cooldown period elapsed\\n DenyList denyList; // Deny list of the account\\n }\\n\\n /* ============ Modifiers ============ */\\n modifier onlyRegisteredUser() {\\n require(accounts[msg.sender].idHash != bytes32(0), \\\"Caller must be registered user\\\");\\n _;\\n }\\n\\n /* ============ Constants ============ */\\n uint256 internal constant PRECISE_UNIT = 1e18;\\n uint256 internal constant MAX_DEPOSITS = 5; // An account can only have max 5 different deposit parameterizations to prevent locking funds\\n uint256 constant CIRCOM_PRIME_FIELD = 21888242871839275222246405745257275088548364400416034343698204186575808495617;\\n uint256 constant MAX_SUSTAINABILITY_FEE = 5e16; // 5% max sustainability fee\\n \\n /* ============ State Variables ============ */\\n IERC20 public immutable usdc; // USDC token contract\\n IGarantiRegistrationProcessor public registrationProcessor; // Address of registration processor contract, verifies registration e-mails\\n IGarantiSendProcessor public sendProcessor; // Address of send processor contract, verifies onRamp emails\\n\\n bool public isInitialized; // Indicates if contract has been initialized\\n\\n mapping(bytes32 => GlobalAccountInfo) internal globalAccount; // Mapping of idHash to information used to enforce actions across Ethereum accounts\\n mapping(address => AccountInfo) internal accounts; // Mapping of Ethereum accounts to their account information (idHash and deposits)\\n mapping(uint256 => Deposit) public deposits; // Mapping of depositIds to deposit structs\\n mapping(bytes32 => Intent) public intents; // Mapping of intentHashes to intent structs\\n\\n uint256 public minDepositAmount; // Minimum amount of USDC that can be deposited\\n uint256 public maxOnRampAmount; // Maximum amount of USDC that can be on-ramped in a single transaction\\n uint256 public onRampCooldownPeriod; // Time period that must elapse between completing an on-ramp and signaling a new intent\\n uint256 public intentExpirationPeriod; // Time period after which an intent can be pruned from the system\\n uint256 public sustainabilityFee; // Fee charged to on-rampers in preciseUnits (1e16 = 1%)\\n address public sustainabilityFeeRecipient; // Address that receives the sustainability fee\\n\\n uint256 public depositCounter; // Counter for depositIds\\n\\n /* ============ Constructor ============ */\\n constructor(\\n address _owner,\\n IERC20 _usdc,\\n uint256 _minDepositAmount,\\n uint256 _maxOnRampAmount,\\n uint256 _intentExpirationPeriod,\\n uint256 _onRampCooldownPeriod,\\n uint256 _sustainabilityFee,\\n address _sustainabilityFeeRecipient\\n )\\n Ownable()\\n {\\n usdc = _usdc;\\n minDepositAmount = _minDepositAmount;\\n maxOnRampAmount = _maxOnRampAmount;\\n intentExpirationPeriod = _intentExpirationPeriod;\\n onRampCooldownPeriod = _onRampCooldownPeriod;\\n sustainabilityFee = _sustainabilityFee;\\n sustainabilityFeeRecipient = _sustainabilityFeeRecipient;\\n\\n transferOwnership(_owner);\\n }\\n\\n /* ============ External Functions ============ */\\n\\n /**\\n * @notice Initialize Ramp with the addresses of the Processors\\n *\\n * @param _registrationProcessor Registration processor address\\n * @param _sendProcessor Send processor address\\n */\\n function initialize(\\n IGarantiRegistrationProcessor _registrationProcessor,\\n IGarantiSendProcessor _sendProcessor\\n )\\n external\\n onlyOwner\\n {\\n require(!isInitialized, \\\"Already initialized\\\");\\n\\n registrationProcessor = _registrationProcessor;\\n sendProcessor = _sendProcessor;\\n\\n isInitialized = true;\\n }\\n\\n /**\\n * @notice Registers a new account by pulling the hash of the account id from the proof and assigning the account owner to the\\n * sender of the transaction. One Garanti account can be registered to multiple Ethereum addresses.\\n *\\n * @param _proof Parameters and signals for registration email proof\\n * @param _bodyHashProof Parameters and signals for body hash proof\\n */\\n function register(\\n IGarantiRegistrationProcessor.RegistrationProof calldata _proof,\\n IGarantiBodySuffixHashVerifier.BodySuffixHashProof calldata _bodyHashProof\\n )\\n external\\n {\\n require(accounts[msg.sender].idHash == bytes32(0), \\\"Account already associated with idHash\\\");\\n bytes32 idHash = _verifyRegistrationProof(_proof, _bodyHashProof);\\n\\n accounts[msg.sender].idHash = idHash;\\n\\n emit AccountRegistered(msg.sender, idHash);\\n }\\n\\n /**\\n * @notice Generates a deposit entry for off-rampers that can then be fulfilled by an on-ramper. This function will not add to\\n * previous deposits. Every deposit has it's own unique identifier. User must approve the contract to transfer the deposit amount\\n * of USDC.\\n *\\n * @param _garantiIban IBAN number of the depositor with spacing as such: \\\"TR## #### #### #### #### #### ##\\\"\\n * @param _garantiName Name given for Garanti IBAN account, necessary for on-rampers to complete on-ramp\\n * @param _depositAmount The amount of USDC to off-ramp\\n * @param _receiveAmount The amount of USD to receive\\n */\\n function offRamp(\\n string memory _garantiIban,\\n string memory _garantiName,\\n uint256 _depositAmount,\\n uint256 _receiveAmount\\n )\\n external\\n onlyRegisteredUser\\n {\\n require(isValidIban(_garantiIban), \\\"Invalid IBAN\\\");\\n require(accounts[msg.sender].deposits.length < MAX_DEPOSITS, \\\"Maximum deposit amount reached\\\");\\n require(_depositAmount >= minDepositAmount, \\\"Deposit amount must be greater than min deposit amount\\\");\\n require(_receiveAmount > 0, \\\"Receive amount must be greater than 0\\\");\\n\\n uint256 conversionRate = (_depositAmount * PRECISE_UNIT) / _receiveAmount;\\n uint256 depositId = depositCounter++;\\n\\n AccountInfo storage account = accounts[msg.sender];\\n account.deposits.push(depositId);\\n\\n deposits[depositId] = Deposit({\\n depositor: msg.sender,\\n garantiIban: _garantiIban,\\n garantiName: _garantiName,\\n depositAmount: _depositAmount,\\n remainingDeposits: _depositAmount,\\n outstandingIntentAmount: 0,\\n conversionRate: conversionRate,\\n intentHashes: new bytes32[](0)\\n });\\n\\n usdc.transferFrom(msg.sender, address(this), _depositAmount);\\n\\n emit DepositReceived(depositId, account.idHash, _depositAmount, conversionRate);\\n }\\n\\n /**\\n * @notice Signals intent to pay the depositor defined in the _depositId the _amount * deposit conversionRate off-chain\\n * in order to unlock _amount of funds on-chain. Each user can only have one outstanding intent at a time regardless of\\n * address (tracked using idHash). Caller must not be on the depositor's deny list. If there are prunable intents then\\n * they will be deleted from the deposit to be able to maintain state hygiene.\\n *\\n * @param _depositId The ID of the deposit the on-ramper intends to use for \\n * @param _amount The amount of USDC the user wants to on-ramp\\n * @param _to Address to forward funds to (can be same as onRamper)\\n */\\n function signalIntent(uint256 _depositId, uint256 _amount, address _to) external onlyRegisteredUser {\\n bytes32 idHash = accounts[msg.sender].idHash;\\n Deposit storage deposit = deposits[_depositId];\\n bytes32 depositorIdHash = accounts[deposit.depositor].idHash;\\n\\n // Caller validity checks\\n require(!globalAccount[depositorIdHash].denyList.isDenied[idHash], \\\"Onramper on depositor's denylist\\\");\\n require(\\n globalAccount[idHash].lastOnrampTimestamp + onRampCooldownPeriod <= block.timestamp,\\n \\\"On ramp cool down period not elapsed\\\"\\n );\\n require(globalAccount[idHash].currentIntentHash == bytes32(0), \\\"Intent still outstanding\\\");\\n require(depositorIdHash != idHash, \\\"Sender cannot be the depositor\\\");\\n\\n // Intent information checks\\n require(deposit.depositor != address(0), \\\"Deposit does not exist\\\");\\n require(_amount > 0, \\\"Signaled amount must be greater than 0\\\");\\n require(_amount <= maxOnRampAmount, \\\"Signaled amount must be less than max on-ramp amount\\\");\\n require(_to != address(0), \\\"Cannot send to zero address\\\");\\n\\n bytes32 intentHash = _calculateIntentHash(idHash, _depositId);\\n\\n if (deposit.remainingDeposits < _amount) {\\n (\\n bytes32[] memory prunableIntents,\\n uint256 reclaimableAmount\\n ) = _getPrunableIntents(_depositId);\\n\\n require(deposit.remainingDeposits + reclaimableAmount >= _amount, \\\"Not enough liquidity\\\");\\n\\n _pruneIntents(deposit, prunableIntents);\\n deposit.remainingDeposits += reclaimableAmount;\\n deposit.outstandingIntentAmount -= reclaimableAmount;\\n }\\n\\n intents[intentHash] = Intent({\\n onRamper: msg.sender,\\n to: _to,\\n deposit: _depositId,\\n amount: _amount,\\n intentTimestamp: block.timestamp\\n });\\n\\n globalAccount[idHash].currentIntentHash = intentHash;\\n\\n deposit.remainingDeposits -= _amount;\\n deposit.outstandingIntentAmount += _amount;\\n deposit.intentHashes.push(intentHash);\\n\\n emit IntentSignaled(intentHash, _depositId, idHash, _to, _amount, block.timestamp);\\n }\\n\\n /**\\n * @notice Only callable by the originator of the intent. Cancels an outstanding intent thus allowing user to signal a new\\n * intent. Deposit state is updated to reflect the cancelled intent.\\n *\\n * @param _intentHash Hash of intent being cancelled\\n */\\n function cancelIntent(bytes32 _intentHash) external {\\n Intent memory intent = intents[_intentHash];\\n \\n require(intent.intentTimestamp != 0, \\\"Intent does not exist\\\");\\n require(\\n accounts[intent.onRamper].idHash == accounts[msg.sender].idHash,\\n \\\"Sender must be the on-ramper\\\"\\n );\\n\\n Deposit storage deposit = deposits[intent.deposit];\\n\\n _pruneIntent(deposit, _intentHash);\\n\\n deposit.remainingDeposits += intent.amount;\\n deposit.outstandingIntentAmount -= intent.amount;\\n }\\n\\n /**\\n * @notice Anyone can submit an on-ramp transaction, even if caller isn't on-ramper. Upon submission the proof is validated,\\n * intent is removed, and deposit state is updated. USDC is transferred to the on-ramper.\\n *\\n * @param _proof Parameters and signals for send email proof\\n * @param _bodyHashProof Parameters and signals for body hash proof\\n */\\n function onRamp(\\n IGarantiSendProcessor.SendProof calldata _proof,\\n IGarantiBodySuffixHashVerifier.BodySuffixHashProof calldata _bodyHashProof\\n )\\n external\\n {\\n (\\n Intent memory intent,\\n Deposit storage deposit,\\n bytes32 intentHash\\n ) = _verifyOnRampProof(_proof, _bodyHashProof);\\n\\n _pruneIntent(deposit, intentHash);\\n\\n deposit.outstandingIntentAmount -= intent.amount;\\n globalAccount[accounts[intent.onRamper].idHash].lastOnrampTimestamp = block.timestamp;\\n _closeDepositIfNecessary(intent.deposit, deposit);\\n\\n _transferFunds(intentHash, intent);\\n }\\n\\n /**\\n * @notice Allows off-ramper to release funds to the on-ramper in case of a failed on-ramp or because of some other arrangement\\n * between the two parties. Upon submission we check to make sure the msg.sender is the depositor, the intent is removed, and \\n * deposit state is updated. USDC is transferred to the on-ramper.\\n *\\n * @param _intentHash Hash of intent to resolve by releasing the funds\\n */\\n function releaseFundsToOnramper(bytes32 _intentHash) external {\\n Intent memory intent = intents[_intentHash];\\n Deposit storage deposit = deposits[intent.deposit];\\n\\n require(intent.onRamper != address(0), \\\"Intent does not exist\\\");\\n require(deposit.depositor == msg.sender, \\\"Caller must be the depositor\\\");\\n\\n _pruneIntent(deposit, _intentHash);\\n\\n deposit.outstandingIntentAmount -= intent.amount;\\n globalAccount[accounts[intent.onRamper].idHash].lastOnrampTimestamp = block.timestamp;\\n _closeDepositIfNecessary(intent.deposit, deposit);\\n\\n _transferFunds(_intentHash, intent);\\n }\\n\\n /**\\n * @notice Caller must be the depositor for each depositId in the array, if not whole function fails. Depositor is returned all\\n * remaining deposits and any outstanding intents that are expired. If an intent is not expired then those funds will not be\\n * returned. Deposit will be deleted as long as there are no more outstanding intents.\\n *\\n * @param _depositIds Array of depositIds the depositor is attempting to withdraw\\n */\\n function withdrawDeposit(uint256[] memory _depositIds) external {\\n uint256 returnAmount;\\n\\n for (uint256 i = 0; i < _depositIds.length; ++i) {\\n uint256 depositId = _depositIds[i];\\n Deposit storage deposit = deposits[depositId];\\n\\n require(deposit.depositor == msg.sender, \\\"Sender must be the depositor\\\");\\n\\n (\\n bytes32[] memory prunableIntents,\\n uint256 reclaimableAmount\\n ) = _getPrunableIntents(depositId);\\n\\n _pruneIntents(deposit, prunableIntents);\\n\\n returnAmount += deposit.remainingDeposits + reclaimableAmount;\\n \\n deposit.outstandingIntentAmount -= reclaimableAmount;\\n\\n emit DepositWithdrawn(depositId, deposit.depositor, deposit.remainingDeposits + reclaimableAmount);\\n \\n delete deposit.remainingDeposits;\\n _closeDepositIfNecessary(depositId, deposit);\\n }\\n\\n usdc.transfer(msg.sender, returnAmount);\\n }\\n\\n /**\\n * @notice Adds an idHash to a depositor's deny list. If an address associated with the banned idHash attempts to\\n * signal an intent on the user's deposit they will be denied.\\n *\\n * @param _deniedUser Poseidon hash of the idHash being banned\\n */\\n function addAccountToDenylist(bytes32 _deniedUser) external onlyRegisteredUser {\\n bytes32 denyingUser = accounts[msg.sender].idHash;\\n\\n require(!globalAccount[denyingUser].denyList.isDenied[_deniedUser], \\\"User already on denylist\\\");\\n\\n globalAccount[denyingUser].denyList.isDenied[_deniedUser] = true;\\n globalAccount[denyingUser].denyList.deniedUsers.push(_deniedUser);\\n\\n emit UserAddedToDenylist(denyingUser, _deniedUser);\\n }\\n\\n /**\\n * @notice Removes a idHash from a depositor's deny list.\\n *\\n * @param _approvedUser Poseidon hash of the idHash being approved\\n */\\n function removeAccountFromDenylist(bytes32 _approvedUser) external onlyRegisteredUser {\\n bytes32 approvingUser = accounts[msg.sender].idHash;\\n\\n require(globalAccount[approvingUser].denyList.isDenied[_approvedUser], \\\"User not on denylist\\\");\\n\\n globalAccount[approvingUser].denyList.isDenied[_approvedUser] = false;\\n globalAccount[approvingUser].denyList.deniedUsers.removeStorage(_approvedUser);\\n\\n emit UserRemovedFromDenylist(approvingUser, _approvedUser);\\n }\\n\\n /* ============ Governance Functions ============ */\\n\\n /**\\n * @notice GOVERNANCE ONLY: Updates the send processor address used for validating and interpreting zk proofs.\\n *\\n * @param _sendProcessor New send proccesor address\\n */\\n function setSendProcessor(IGarantiSendProcessor _sendProcessor) external onlyOwner {\\n sendProcessor = _sendProcessor;\\n emit NewSendProcessorSet(address(_sendProcessor));\\n }\\n\\n /**\\n * @notice GOVERNANCE ONLY: Updates the registration processor address used for validating and interpreting zk proofs.\\n *\\n * @param _registrationProcessor New registration proccesor address\\n */\\n function setRegistrationProcessor(IGarantiRegistrationProcessor _registrationProcessor) external onlyOwner {\\n registrationProcessor = _registrationProcessor;\\n emit NewRegistrationProcessorSet(address(_registrationProcessor));\\n }\\n\\n /**\\n * @notice GOVERNANCE ONLY: Updates the minimum deposit amount a user can specify for off-ramping.\\n *\\n * @param _minDepositAmount The new minimum deposit amount\\n */\\n function setMinDepositAmount(uint256 _minDepositAmount) external onlyOwner {\\n require(_minDepositAmount != 0, \\\"Minimum deposit cannot be zero\\\");\\n\\n minDepositAmount = _minDepositAmount;\\n emit MinDepositAmountSet(_minDepositAmount);\\n }\\n\\n /**\\n * @notice GOVERNANCE ONLY: Updates the sustainability fee. This fee is charged to on-rampers upon a successful on-ramp.\\n *\\n * @param _fee The new sustainability fee in precise units (10**18, ie 10% = 1e17)\\n */\\n function setSustainabilityFee(uint256 _fee) external onlyOwner {\\n require(_fee <= MAX_SUSTAINABILITY_FEE, \\\"Fee cannot be greater than max fee\\\");\\n\\n sustainabilityFee = _fee;\\n emit SustainabilityFeeUpdated(_fee);\\n }\\n\\n /**\\n * @notice GOVERNANCE ONLY: Updates the recepient of sustainability fees.\\n *\\n * @param _feeRecipient The new fee recipient address\\n */\\n function setSustainabilityFeeRecipient(address _feeRecipient) external onlyOwner {\\n require(_feeRecipient != address(0), \\\"Fee recipient cannot be zero address\\\");\\n\\n sustainabilityFeeRecipient = _feeRecipient;\\n emit SustainabilityFeeRecipientUpdated(_feeRecipient);\\n }\\n\\n /**\\n * @notice GOVERNANCE ONLY: Updates the max amount allowed to be on-ramped in each transaction. To on-ramp more than\\n * this amount a user must make multiple transactions.\\n *\\n * @param _maxOnRampAmount The new max on ramp amount\\n */\\n function setMaxOnRampAmount(uint256 _maxOnRampAmount) external onlyOwner {\\n require(_maxOnRampAmount != 0, \\\"Max on ramp amount cannot be zero\\\");\\n\\n maxOnRampAmount = _maxOnRampAmount;\\n emit MaxOnRampAmountSet(_maxOnRampAmount);\\n }\\n\\n /**\\n * @notice GOVERNANCE ONLY: Updates the on-ramp cooldown period, once an on-ramp transaction is completed the user must wait this\\n * amount of time before they can signalIntent to on-ramp again.\\n *\\n * @param _onRampCooldownPeriod New on-ramp cooldown period\\n */\\n function setOnRampCooldownPeriod(uint256 _onRampCooldownPeriod) external onlyOwner {\\n onRampCooldownPeriod = _onRampCooldownPeriod;\\n emit OnRampCooldownPeriodSet(_onRampCooldownPeriod);\\n }\\n\\n /**\\n * @notice GOVERNANCE ONLY: Updates the intent expiration period, after this period elapses an intent can be pruned to prevent\\n * locking up a depositor's funds.\\n *\\n * @param _intentExpirationPeriod New intent expiration period\\n */\\n function setIntentExpirationPeriod(uint256 _intentExpirationPeriod) external onlyOwner {\\n require(_intentExpirationPeriod != 0, \\\"Max intent expiration period cannot be zero\\\");\\n\\n intentExpirationPeriod = _intentExpirationPeriod;\\n emit IntentExpirationPeriodSet(_intentExpirationPeriod);\\n }\\n\\n\\n /* ============ External View Functions ============ */\\n\\n function getDeposit(uint256 _depositId) external view returns (Deposit memory) {\\n return deposits[_depositId];\\n }\\n\\n function getAccountInfo(address _account) external view returns (AccountInfo memory) {\\n return accounts[_account];\\n }\\n\\n function getIdCurrentIntentHash(address _account) external view returns (bytes32) {\\n return globalAccount[accounts[_account].idHash].currentIntentHash;\\n }\\n\\n function getLastOnRampTimestamp(address _account) external view returns (uint256) {\\n return globalAccount[accounts[_account].idHash].lastOnrampTimestamp;\\n }\\n\\n function getDeniedUsers(address _account) external view returns (bytes32[] memory) {\\n return globalAccount[accounts[_account].idHash].denyList.deniedUsers;\\n }\\n\\n function isDeniedUser(address _account, bytes32 _deniedUser) external view returns (bool) {\\n return globalAccount[accounts[_account].idHash].denyList.isDenied[_deniedUser];\\n }\\n\\n function getIntentsWithOnRamperId(bytes32[] calldata _intentHashes) external view returns (IntentWithOnRamperId[] memory) {\\n IntentWithOnRamperId[] memory intentsWithOnRamperId = new IntentWithOnRamperId[](_intentHashes.length);\\n\\n for (uint256 i = 0; i < _intentHashes.length; ++i) {\\n bytes32 intentHash = _intentHashes[i];\\n Intent memory intent = intents[intentHash];\\n intentsWithOnRamperId[i] = IntentWithOnRamperId({\\n intentHash: _intentHashes[i],\\n intent: intent,\\n onRamperIdHash: accounts[intent.onRamper].idHash\\n });\\n }\\n\\n return intentsWithOnRamperId;\\n }\\n\\n function getAccountDeposits(address _account) external view returns (DepositWithAvailableLiquidity[] memory accountDeposits) {\\n uint256[] memory accountDepositIds = accounts[_account].deposits;\\n accountDeposits = new DepositWithAvailableLiquidity[](accountDepositIds.length);\\n \\n for (uint256 i = 0; i < accountDepositIds.length; ++i) {\\n uint256 depositId = accountDepositIds[i];\\n Deposit memory deposit = deposits[depositId];\\n ( , uint256 reclaimableAmount) = _getPrunableIntents(depositId);\\n\\n accountDeposits[i] = DepositWithAvailableLiquidity({\\n depositId: depositId,\\n depositorIdHash: accounts[deposit.depositor].idHash,\\n deposit: deposit,\\n availableLiquidity: deposit.remainingDeposits + reclaimableAmount\\n });\\n }\\n }\\n\\n function getDepositFromIds(uint256[] memory _depositIds) external view returns (DepositWithAvailableLiquidity[] memory depositArray) {\\n depositArray = new DepositWithAvailableLiquidity[](_depositIds.length);\\n\\n for (uint256 i = 0; i < _depositIds.length; ++i) {\\n uint256 depositId = _depositIds[i];\\n Deposit memory deposit = deposits[depositId];\\n ( , uint256 reclaimableAmount) = _getPrunableIntents(depositId);\\n\\n depositArray[i] = DepositWithAvailableLiquidity({\\n depositId: depositId,\\n depositorIdHash: accounts[deposit.depositor].idHash,\\n deposit: deposit,\\n availableLiquidity: deposit.remainingDeposits + reclaimableAmount\\n });\\n }\\n\\n return depositArray;\\n }\\n\\n function isValidIban(string memory _iban) public pure returns(bool) {\\n bytes memory ibanBytes = bytes(_iban);\\n if(ibanBytes.length != 32) { return false; }\\n\\n for (uint256 i = 0; i < ibanBytes.length; ++i) {\\n if (i < 2) {\\n if(ibanBytes[i] < 0x41 || ibanBytes[i] > 0x5a) { return false; }\\n } else if (i % 5 == 4) {\\n // i = 4, 9, 14, 19, 24, 29 should be spaces\\n if(ibanBytes[i] != 0x20) { return false; }\\n } else {\\n if(ibanBytes[i] < 0x30 || ibanBytes[i] > 0x39) { return false; }\\n }\\n }\\n\\n return true;\\n }\\n\\n /* ============ Internal Functions ============ */\\n\\n /**\\n * @notice Calculates the intentHash of new intent\\n */\\n function _calculateIntentHash(\\n bytes32 _idHash,\\n uint256 _depositId\\n )\\n internal\\n view\\n virtual\\n returns (bytes32 intentHash)\\n {\\n // Mod with circom prime field to make sure it fits in a 254-bit field\\n uint256 intermediateHash = uint256(keccak256(abi.encodePacked(_idHash, _depositId, block.timestamp)));\\n intentHash = bytes32(intermediateHash % CIRCOM_PRIME_FIELD);\\n }\\n\\n /**\\n * @notice Cycles through all intents currently open on a deposit and sees if any have expired. If they have expired\\n * the outstanding amounts are summed and returned alongside the intentHashes\\n */\\n function _getPrunableIntents(\\n uint256 _depositId\\n )\\n internal\\n view\\n returns(bytes32[] memory prunableIntents, uint256 reclaimedAmount)\\n {\\n bytes32[] memory intentHashes = deposits[_depositId].intentHashes;\\n prunableIntents = new bytes32[](intentHashes.length);\\n\\n for (uint256 i = 0; i < intentHashes.length; ++i) {\\n Intent memory intent = intents[intentHashes[i]];\\n if (intent.intentTimestamp + intentExpirationPeriod < block.timestamp) {\\n prunableIntents[i] = intentHashes[i];\\n reclaimedAmount += intent.amount;\\n }\\n }\\n }\\n\\n function _pruneIntents(Deposit storage _deposit, bytes32[] memory _intents) internal {\\n for (uint256 i = 0; i < _intents.length; ++i) {\\n if (_intents[i] != bytes32(0)) {\\n _pruneIntent(_deposit, _intents[i]);\\n }\\n }\\n }\\n\\n /**\\n * @notice Pruning an intent involves deleting its state from the intents mapping, zeroing out the intendee's currentIntentHash in\\n * their global account mapping, and deleting the intentHash from the deposit's intentHashes array.\\n */\\n function _pruneIntent(Deposit storage _deposit, bytes32 _intentHash) internal {\\n Intent memory intent = intents[_intentHash];\\n\\n delete globalAccount[accounts[intent.onRamper].idHash].currentIntentHash;\\n delete intents[_intentHash];\\n _deposit.intentHashes.removeStorage(_intentHash);\\n\\n emit IntentPruned(_intentHash, intent.deposit);\\n }\\n\\n /**\\n * @notice Removes a deposit if no outstanding intents AND no remaining deposits. Deleting a deposit deletes it from the\\n * deposits mapping and removes tracking it in the user's accounts mapping.\\n */\\n function _closeDepositIfNecessary(uint256 _depositId, Deposit storage _deposit) internal {\\n uint256 openDepositAmount = _deposit.outstandingIntentAmount + _deposit.remainingDeposits;\\n if (openDepositAmount == 0) {\\n accounts[_deposit.depositor].deposits.removeStorage(_depositId);\\n emit DepositClosed(_depositId, _deposit.depositor);\\n delete deposits[_depositId];\\n }\\n }\\n\\n /**\\n * @notice Checks if sustainability fee has been defined, if so sends fee to the fee recipient and intent amount minus fee\\n * to the on-ramper. If sustainability fee is undefined then full intent amount is transferred to on-ramper.\\n */\\n function _transferFunds(bytes32 _intentHash, Intent memory _intent) internal {\\n uint256 fee;\\n if (sustainabilityFee != 0) {\\n fee = (_intent.amount * sustainabilityFee) / PRECISE_UNIT;\\n usdc.transfer(sustainabilityFeeRecipient, fee);\\n }\\n\\n uint256 onRampAmount = _intent.amount - fee;\\n usdc.transfer(_intent.to, onRampAmount);\\n\\n emit IntentFulfilled(_intentHash, _intent.deposit, _intent.onRamper, _intent.to, onRampAmount, fee);\\n }\\n\\n /**\\n * @notice Validate send payment email and check that it hasn't already been used (done on SendProcessor).\\n * Additionally, we validate that the offRamperIdHash matches the one from the specified intent and that enough\\n * was paid off-chain inclusive of the conversionRate.\\n */\\n function _verifyOnRampProof(\\n IGarantiSendProcessor.SendProof calldata _proof,\\n IGarantiBodySuffixHashVerifier.BodySuffixHashProof calldata _bodyHashProof\\n )\\n internal\\n returns(Intent memory, Deposit storage, bytes32)\\n {\\n (\\n uint256 amount,\\n uint256 timestamp,\\n bytes32 offRamperNameHash,\\n bytes32 offRamperIdHash,\\n bytes32 onRamperIdHash,\\n bytes32 intentHash\\n ) = sendProcessor.processProof(_proof, _bodyHashProof);\\n\\n Intent memory intent = intents[intentHash];\\n Deposit storage deposit = deposits[intent.deposit];\\n\\n require(intent.onRamper != address(0), \\\"Intent does not exist\\\");\\n require(intent.intentTimestamp <= timestamp, \\\"Intent was not created before send\\\");\\n require(keccak256(abi.encodePacked(deposit.garantiName)) == offRamperNameHash, \\\"Offramper id does not match\\\");\\n require(keccak256(abi.encodePacked(deposit.garantiIban)) == offRamperIdHash, \\\"Offramper id does not match\\\");\\n require(accounts[intent.onRamper].idHash == onRamperIdHash, \\\"Onramper id does not match\\\");\\n require(amount >= (intent.amount * PRECISE_UNIT) / deposit.conversionRate, \\\"Payment was not enough\\\");\\n\\n return (intent, deposit, intentHash);\\n }\\n\\n /**\\n * @notice Validate the user has an Garanti account, we do not nullify this email since it can be reused to register under\\n * different addresses.\\n */\\n function _verifyRegistrationProof(\\n IGarantiRegistrationProcessor.RegistrationProof calldata _proof,\\n IGarantiBodySuffixHashVerifier.BodySuffixHashProof calldata _bodyHashProof\\n )\\n internal\\n returns(bytes32)\\n {\\n bytes32 idHash = registrationProcessor.processProof(_proof, _bodyHashProof);\\n\\n return idHash;\\n }\\n}\\n\",\"keccak256\":\"0x11095008d889ee4205c6e43f9628207ec364b25ad6e9082e5b4647094fb99b7a\",\"license\":\"MIT\"},\"contracts/ramps/garanti/interfaces/IGarantiBodySuffixHashVerifier.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.18;\\n\\ninterface IGarantiBodySuffixHashVerifier {\\n\\n struct BodySuffixHashProof {\\n uint256[2] a;\\n uint256[2][2] b;\\n uint256[2] c;\\n uint256[4] signals;\\n }\\n\\n function verifyProof(\\n uint[2] calldata _pA,\\n uint[2][2] calldata _pB,\\n uint[2] calldata _pC,\\n uint[4] calldata _pubSignals\\n )\\n external\\n view\\n returns (bool);\\n}\\n\",\"keccak256\":\"0x0905608291062ba9262aa3aac9434df6150243ad61d2dba863ac695c97db36d3\",\"license\":\"MIT\"},\"contracts/ramps/garanti/interfaces/IGarantiRegistrationProcessor.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.18;\\n\\nimport { IGarantiBodySuffixHashVerifier } from \\\"./IGarantiBodySuffixHashVerifier.sol\\\";\\n\\ninterface IGarantiRegistrationProcessor {\\n\\n struct RegistrationProof {\\n uint256[2] a;\\n uint256[2][2] b;\\n uint256[2] c;\\n uint256[11] signals;\\n }\\n\\n function processProof(\\n RegistrationProof calldata _proof,\\n IGarantiBodySuffixHashVerifier.BodySuffixHashProof calldata _bodyHashProof\\n )\\n external\\n returns (bytes32);\\n}\\n\",\"keccak256\":\"0xc0f70e4fda7e77a71110f14b943f0be18414d3fde1f89611659f3bfa61e7d220\",\"license\":\"MIT\"},\"contracts/ramps/garanti/interfaces/IGarantiSendProcessor.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.18;\\n\\nimport { IGarantiBodySuffixHashVerifier } from \\\"./IGarantiBodySuffixHashVerifier.sol\\\";\\n\\ninterface IGarantiSendProcessor {\\n\\n struct SendProof {\\n uint256[2] a;\\n uint256[2][2] b;\\n uint256[2] c;\\n uint256[28] signals;\\n }\\n\\n function processProof(\\n SendProof calldata _proof,\\n IGarantiBodySuffixHashVerifier.BodySuffixHashProof calldata _bodyHashProof\\n )\\n external\\n returns(uint256, uint256, bytes32, bytes32, bytes32, bytes32);\\n}\\n\",\"keccak256\":\"0x70a70e2bf4861b7095bff34a55b10da9bc705735e40bed6104e179c0ecc3da25\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x60a060405234801562000010575f80fd5b50604051620045fd380380620045fd8339810160408190526200003391620001d9565b6200003e3362000095565b6001600160a01b0387811660805260078790556008869055600a8590556009849055600b839055600c80546001600160a01b0319169183169190911790556200008788620000e4565b50505050505050506200025a565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b620000ee62000167565b6001600160a01b038116620001595760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b620001648162000095565b50565b5f546001600160a01b03163314620001c25760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640162000150565b565b6001600160a01b038116811462000164575f80fd5b5f805f805f805f80610100898b031215620001f2575f80fd5b8851620001ff81620001c4565b60208a01519098506200021281620001c4565b8097505060408901519550606089015194506080890151935060a0890151925060c0890151915060e08901516200024981620001c4565b809150509295985092959890939650565b60805161436e6200028f5f395f818161039501528181611964015281816123d2015281816132870152613332015261436e5ff3fe608060405234801561000f575f80fd5b506004361061026b575f3560e01c8063715018a61161014b578063b3fa4c01116100bf578063ecb3dc8811610084578063ecb3dc8814610649578063ecd618f014610652578063ed1692b814610672578063eea1d19714610685578063f2fde38b14610698578063fbf15b1f146106ab575f80fd5b8063b3fa4c01146105f4578063d55f960d14610607578063d9478d201461061a578063e215ad591461062d578063e279d96414610640575f80fd5b80639087beff116101105780639087beff1461056c5780639b357b5a1461057f5780639f9fb96814610592578063a00555b3146105b2578063a1a954b7146105c5578063b02c43d0146105ce575f80fd5b8063715018a6146104a657806371a28f69146104ae5780637b510fe8146104c15780638da5cb5b146104e15780639021578a146104f1575f80fd5b806342987349116101e25780635081d952116101a75780635081d952146104315780635dd765151461045157806360e0d21e14610464578063645006ca1461047757806366ec8419146104805780637113476214610493575f80fd5b806342987349146103cf57806343a170e6146103e25780634595bba0146103f5578063485cc95514610415578063495223e714610428575f80fd5b80632a80cda3116102335780632a80cda314610320578063317dcc96146103335780633389d5d514610346578063392e53cd146103695780633adba28a1461037d5780633e413bee14610390575f80fd5b80630f1ef98c1461026f578063133de6cb146102ba578063148172da146102cf57806314ec32fa146102e2578063238c849414610317575b5f80fd5b6102a761027d366004613840565b6001600160a01b03165f908152600460209081526040808320548352600390915290206001015490565b6040519081526020015b60405180910390f35b6102cd6102c8366004613840565b6106f1565b005b6102cd6102dd366004613862565b61074e565b6102a76102f0366004613840565b6001600160a01b03165f908152600460209081526040808320548352600390915290205490565b6102a7600b5481565b6102cd61032e366004613862565b61087d565b6102cd610341366004613862565b610909565b61035961035436600461392a565b610946565b60405190151581526020016102b1565b60025461035990600160a01b900460ff1681565b6102cd61038b36600461395c565b610a93565b6103b77f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016102b1565b6102cd6103dd366004613862565b610fd8565b6102cd6103f03660046139a3565b611078565b610408610403366004613840565b61112f565b6040516102b191906139df565b6102cd610423366004613a22565b6111a5565b6102a760095481565b61044461043f366004613840565b611238565b6040516102b19190613b62565b6102cd61045f366004613862565b611586565b6102cd610472366004613bee565b611625565b6102a760075481565b6102cd61048e366004613862565b6116aa565b6102cd6104a1366004613c10565b6117f2565b6102cd6119d6565b6104446104bc366004613c10565b6119e9565b6104d46104cf366004613840565b611cd2565b6040516102b19190613cb1565b5f546001600160a01b03166103b7565b6105396104ff366004613862565b60066020525f9081526040902080546001820154600283015460038401546004909401546001600160a01b03938416949390921692909185565b604080516001600160a01b039687168152959094166020860152928401919091526060830152608082015260a0016102b1565b6102cd61057a366004613862565b611d68565b6102cd61058d366004613862565b611dfe565b6105a56105a0366004613862565b611f02565b6040516102b19190613d08565b6102cd6105c0366004613d1a565b6120d9565b6102a7600a5481565b6105e16105dc366004613862565b61248c565b6040516102b19796959493929190613d89565b6102cd610602366004613840565b6125dc565b6102cd610615366004613862565b612694565b600c546103b7906001600160a01b031681565b6001546103b7906001600160a01b031681565b6102a760085481565b6102a7600d5481565b610665610660366004613de5565b6127cd565b6040516102b19190613e54565b6102cd610680366004613840565b612924565b6002546103b7906001600160a01b031681565b6102cd6106a6366004613840565b61297a565b6103596106b9366004613ee3565b6001600160a01b0382165f90815260046020908152604080832054835260038083528184208585520190915290205460ff1692915050565b6106f96129f3565b600280546001600160a01b0319166001600160a01b0383169081179091556040519081527f6e7665a41605edc0d70f4b991d652755f380754eb092d81ef9ab93664778d59e906020015b60405180910390a150565b335f908152600460205260409020546107825760405162461bcd60e51b815260040161077990613f0d565b60405180910390fd5b335f908152600460209081526040808320548084526003808452828520868652019092529091205460ff16156107fa5760405162461bcd60e51b815260206004820152601860248201527f5573657220616c7265616479206f6e2064656e796c69737400000000000000006044820152606401610779565b5f8181526003602081815260408084208685528084018352818520805460ff19166001908117909155938352600201805493840181558452922001839055517f976c693d56f27ba17d902bda80c4fa0416b773fbf268bcb0ee71689234d769ee906108719083908590918252602082015260400190565b60405180910390a15050565b6108856129f3565b805f036108d45760405162461bcd60e51b815260206004820152601e60248201527f4d696e696d756d206465706f7369742063616e6e6f74206265207a65726f00006044820152606401610779565b60078190556040518181527fbdde72a6d8d8b42770c9899945ccdce09d0c5c794d3326cdb2d2cca61b12a9fc90602001610743565b6109116129f3565b60098190556040518181527f88397975d177ce5e18abf3a5fdb8de773e80673d85eeb54f48cfaf688b3d2c3e90602001610743565b80515f90829060201461095b57505f92915050565b5f5b8151811015610a895760028110156109d757604160f81b82828151811061098657610986613f44565b01602001516001600160f81b03191610806109c45750605a60f81b8282815181106109b3576109b3613f44565b01602001516001600160f81b031916115b156109d257505f9392505050565b610a81565b6109e2600582613f6c565b600403610a1e578181815181106109fb576109fb613f44565b6020910101516001600160f81b031916600160fd1b146109d257505f9392505050565b603060f81b828281518110610a3557610a35613f44565b01602001516001600160f81b0319161080610a735750603960f81b828281518110610a6257610a62613f44565b01602001516001600160f81b031916115b15610a8157505f9392505050565b60010161095d565b5060019392505050565b335f90815260046020526040902054610abe5760405162461bcd60e51b815260040161077990613f0d565b335f908152600460208181526040808420548785526005835281852080546001600160a01b031686529383528185205480865260038085528387208388520190935293205460ff1615610b535760405162461bcd60e51b815260206004820181905260248201527f4f6e72616d706572206f6e206465706f7369746f7227732064656e796c6973746044820152606401610779565b6009545f848152600360205260409020600101544291610b7291613f93565b1115610bcc5760405162461bcd60e51b8152602060048201526024808201527f4f6e2072616d7020636f6f6c20646f776e20706572696f64206e6f7420656c616044820152631c1cd95960e21b6064820152608401610779565b5f8381526003602052604090205415610c275760405162461bcd60e51b815260206004820152601860248201527f496e74656e74207374696c6c206f75747374616e64696e6700000000000000006044820152606401610779565b828103610c765760405162461bcd60e51b815260206004820152601e60248201527f53656e6465722063616e6e6f7420626520746865206465706f7369746f7200006044820152606401610779565b81546001600160a01b0316610cc65760405162461bcd60e51b815260206004820152601660248201527511195c1bdcda5d08191bd95cc81b9bdd08195e1a5cdd60521b6044820152606401610779565b5f8511610d245760405162461bcd60e51b815260206004820152602660248201527f5369676e616c656420616d6f756e74206d75737420626520677265617465722060448201526507468616e20360d41b6064820152608401610779565b600854851115610d935760405162461bcd60e51b815260206004820152603460248201527f5369676e616c656420616d6f756e74206d757374206265206c657373207468616044820152731b881b585e081bdb8b5c985b5c08185b5bdd5b9d60621b6064820152608401610779565b6001600160a01b038416610de95760405162461bcd60e51b815260206004820152601b60248201527f43616e6e6f742073656e6420746f207a65726f206164647265737300000000006044820152606401610779565b5f610df48488612a4c565b90508583600401541015610ea6575f80610e0d89612ab6565b9150915087818660040154610e229190613f93565b1015610e675760405162461bcd60e51b81526020600482015260146024820152734e6f7420656e6f756768206c697175696469747960601b6044820152606401610779565b610e718583612c4f565b80856004015f828254610e849190613f93565b9250508190555080856005015f828254610e9e9190613fa6565b909155505050505b6040805160a0810182523381526001600160a01b0387811660208084019182528385018c8152606085018c815242608087019081525f89815260068552888120975188546001600160a01b03199081169189169190911789559551600189018054909716971696909617909455905160028601555160038086019190915591516004948501558883525291822083905584018054889290610f48908490613fa6565b9250508190555085836005015f828254610f629190613f93565b90915550506007830180546001810182555f91825260209182902001829055604080516001600160a01b038816815291820188905242908201528490889083907f1a1292e170a0f000ccf956afba79bee0f9ec1d81f3f901c1d4d11e1f336aae109060600160405180910390a450505050505050565b610fe06129f3565b805f036110435760405162461bcd60e51b815260206004820152602b60248201527f4d617820696e74656e742065787069726174696f6e20706572696f642063616e60448201526a6e6f74206265207a65726f60a81b6064820152608401610779565b600a8190556040518181527f55e3f6b95de9a0ec782f892e93fafe4e56be0696df204ddf8e0a40a9a713a80390602001610743565b335f90815260046020526040902054156110e35760405162461bcd60e51b815260206004820152602660248201527f4163636f756e7420616c7265616479206173736f6369617465642077697468206044820152650d2c890c2e6d60d31b6064820152608401610779565b5f6110ee8383612ca7565b335f818152600460205260408082208490555192935083927f672144042732f7b1cdbf0772464ae545aedd7f41d38b8487dafd9085496a5d519190a3505050565b6001600160a01b0381165f908152600460209081526040808320548352600382529182902060020180548351818402810184019094528084526060939283018282801561119957602002820191905f5260205f20905b815481526020019060010190808311611185575b50505050509050919050565b6111ad6129f3565b600254600160a01b900460ff16156111fd5760405162461bcd60e51b8152602060048201526013602482015272105b1c9958591e481a5b9a5d1a585b1a5e9959606a1b6044820152606401610779565b600180546001600160a01b039384166001600160a01b0319909116179055600280546001600160a81b0319169190921617600160a01b179055565b6001600160a01b0381165f90815260046020908152604080832060010180548251818502810185019093528083526060949383018282801561129757602002820191905f5260205f20905b815481526020019060010190808311611283575b50505050509050805167ffffffffffffffff8111156112b8576112b8613879565b6040519080825280602002602001820160405280156112f157816020015b6112de6136ac565b8152602001906001900390816112d65790505b5091505f5b815181101561157f575f82828151811061131257611312613f44565b6020908102919091018101515f8181526005835260408082208151610100810190925280546001600160a01b03168252600181018054949650929491939092918401919061135f90613fb9565b80601f016020809104026020016040519081016040528092919081815260200182805461138b90613fb9565b80156113d65780601f106113ad576101008083540402835291602001916113d6565b820191905f5260205f20905b8154815290600101906020018083116113b957829003601f168201915b505050505081526020016002820180546113ef90613fb9565b80601f016020809104026020016040519081016040528092919081815260200182805461141b90613fb9565b80156114665780601f1061143d57610100808354040283529160200191611466565b820191905f5260205f20905b81548152906001019060200180831161144957829003601f168201915b5050505050815260200160038201548152602001600482015481526020016005820154815260200160068201548152602001600782018054806020026020016040519081016040528092919081815260200182805480156114e457602002820191905f5260205f20905b8154815260200190600101908083116114d0575b50505050508152505090505f6114f983612ab6565b915050604051806080016040528084815260200160045f855f01516001600160a01b03166001600160a01b031681526020019081526020015f205f015481526020018381526020018284608001516115519190613f93565b81525086858151811061156657611566613f44565b60200260200101819052505050508060010190506112f6565b5050919050565b61158e6129f3565b66b1a2bc2ec500008111156115f05760405162461bcd60e51b815260206004820152602260248201527f4665652063616e6e6f742062652067726561746572207468616e206d61782066604482015261656560f01b6064820152608401610779565b600b8190556040518181527f44f48e1b871e6db1e909a7b253b054b7150a0b4ddf4d59b159c827d82e72567090602001610743565b5f805f6116328585612d1d565b925092509250611642828261306d565b8260600151826005015f8282546116599190613fa6565b909155505082516001600160a01b03165f908152600460209081526040808320548352600390915290819020426001909101558301516116999083613144565b6116a3818461322c565b5050505050565b5f818152600660209081526040808320815160a08101835281546001600160a01b0390811682526001830154811682860152600283015482850181905260038401546060840152600490930154608083015291855260059093529220815191929091166117295760405162461bcd60e51b815260040161077990613feb565b80546001600160a01b031633146117825760405162461bcd60e51b815260206004820152601c60248201527f43616c6c6572206d75737420626520746865206465706f7369746f72000000006044820152606401610779565b61178c818461306d565b8160600151816005015f8282546117a39190613fa6565b909155505081516001600160a01b03165f908152600460209081526040808320548352600390915290819020426001909101558201516117e39082613144565b6117ed838361322c565b505050565b5f805b8251811015611947575f83828151811061181157611811613f44565b6020908102919091018101515f818152600590925260409091208054919250906001600160a01b031633146118885760405162461bcd60e51b815260206004820152601c60248201527f53656e646572206d75737420626520746865206465706f7369746f72000000006044820152606401610779565b5f8061189384612ab6565b915091506118a18383612c4f565b8083600401546118b19190613f93565b6118bb9087613f93565b955080836005015f8282546118d09190613fa6565b9091555050825460048401546001600160a01b039091169085907fae1f357660ab777dcfd38c0ab6357834684ec26289ecfa07ec65dbf6c3c6431290611917908590613f93565b60405190815260200160405180910390a35f60048401556119388484613144565b505050508060010190506117f5565b5060405163a9059cbb60e01b8152336004820152602481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063a9059cbb906044016020604051808303815f875af11580156119b2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117ed919061401a565b6119de6129f3565b6119e75f613401565b565b6060815167ffffffffffffffff811115611a0557611a05613879565b604051908082528060200260200182016040528015611a3e57816020015b611a2b6136ac565b815260200190600190039081611a235790505b5090505f5b8251811015611ccc575f838281518110611a5f57611a5f613f44565b6020908102919091018101515f8181526005835260408082208151610100810190925280546001600160a01b031682526001810180549496509294919390929184019190611aac90613fb9565b80601f0160208091040260200160405190810160405280929190818152602001828054611ad890613fb9565b8015611b235780601f10611afa57610100808354040283529160200191611b23565b820191905f5260205f20905b815481529060010190602001808311611b0657829003601f168201915b50505050508152602001600282018054611b3c90613fb9565b80601f0160208091040260200160405190810160405280929190818152602001828054611b6890613fb9565b8015611bb35780601f10611b8a57610100808354040283529160200191611bb3565b820191905f5260205f20905b815481529060010190602001808311611b9657829003601f168201915b505050505081526020016003820154815260200160048201548152602001600582015481526020016006820154815260200160078201805480602002602001604051908101604052809291908181526020018280548015611c3157602002820191905f5260205f20905b815481526020019060010190808311611c1d575b50505050508152505090505f611c4683612ab6565b915050604051806080016040528084815260200160045f855f01516001600160a01b03166001600160a01b031681526020019081526020015f205f01548152602001838152602001828460800151611c9e9190613f93565b815250858581518110611cb357611cb3613f44565b6020026020010181905250505050806001019050611a43565b50919050565b604080518082019091525f8152606060208201526001600160a01b0382165f90815260046020908152604091829020825180840184528154815260018201805485518186028101860190965280865291949293858101939290830182828015611d5857602002820191905f5260205f20905b815481526020019060010190808311611d44575b5050505050815250509050919050565b611d706129f3565b805f03611dc95760405162461bcd60e51b815260206004820152602160248201527f4d6178206f6e2072616d7020616d6f756e742063616e6e6f74206265207a65726044820152606f60f81b6064820152608401610779565b60088190556040518181527fcab6b49ca21dd111cf4a55d507bbe89dd12d69216e28247060d4b2163ca41b3990602001610743565b335f90815260046020526040902054611e295760405162461bcd60e51b815260040161077990613f0d565b335f908152600460209081526040808320548084526003808452828520868652019092529091205460ff16611e975760405162461bcd60e51b8152602060048201526014602482015273155cd95c881b9bdd081bdb8819195b9e5b1a5cdd60621b6044820152606401610779565b5f8181526003602081815260408084208685528084018352908420805460ff191690559284905252611ecc9060020183613450565b60408051828152602081018490527f8935205b1b382095d2d95efbb36f81a11a34c548d45af26adc1a02d2f2bb546f9101610871565b611f0a6136d6565b5f828152600560209081526040918290208251610100810190935280546001600160a01b031683526001810180549192840191611f4690613fb9565b80601f0160208091040260200160405190810160405280929190818152602001828054611f7290613fb9565b8015611fbd5780601f10611f9457610100808354040283529160200191611fbd565b820191905f5260205f20905b815481529060010190602001808311611fa057829003601f168201915b50505050508152602001600282018054611fd690613fb9565b80601f016020809104026020016040519081016040528092919081815260200182805461200290613fb9565b801561204d5780601f106120245761010080835404028352916020019161204d565b820191905f5260205f20905b81548152906001019060200180831161203057829003601f168201915b505050505081526020016003820154815260200160048201548152602001600582015481526020016006820154815260200160078201805480602002602001604051908101604052809291908181526020018280548015611d5857602002820191905f5260205f2090815481526020019060010190808311611d44575050505050815250509050919050565b335f908152600460205260409020546121045760405162461bcd60e51b815260040161077990613f0d565b61210d84610946565b6121485760405162461bcd60e51b815260206004820152600c60248201526b24b73b30b634b21024a120a760a11b6044820152606401610779565b335f908152600460205260409020600101546005116121a95760405162461bcd60e51b815260206004820152601e60248201527f4d6178696d756d206465706f73697420616d6f756e74207265616368656400006044820152606401610779565b60075482101561221a5760405162461bcd60e51b815260206004820152603660248201527f4465706f73697420616d6f756e74206d757374206265206772656174657220746044820152751a185b881b5a5b8819195c1bdcda5d08185b5bdd5b9d60521b6064820152608401610779565b5f81116122775760405162461bcd60e51b815260206004820152602560248201527f5265636569766520616d6f756e74206d75737420626520677265617465722074604482015264068616e20360dc1b6064820152608401610779565b5f8161228b670de0b6b3a764000085614039565b6122959190614050565b600d80549192505f9190826122a983614063565b90915550335f818152600460209081526040808320600180820180548083018255908652848620018790558251610100810184529586528584018d81528684018d9052606087018c9052608087018c905260a0870186905260c087018a90528351868152808601855260e0880152878652600590945291909320845181546001600160a01b0319166001600160a01b0390911617815591519495509193909182019061235590826140bf565b506040820151600282019061236a90826140bf565b50606082015160038201556080820151600482015560a0820151600582015560c0820151600682015560e082015180516123ae91600784019160209091019061371f565b50506040516323b872dd60e01b8152336004820152306024820152604481018790527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031691506323b872dd906064016020604051808303815f875af1158015612421573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612445919061401a565b508054604080518781526020810186905284917f36b046df2c296f2a5a78570d5e52a92773cbb616825b1af59a49a4d02df2b109910160405180910390a350505050505050565b60056020525f9081526040902080546001820180546001600160a01b0390921692916124b790613fb9565b80601f01602080910402602001604051908101604052809291908181526020018280546124e390613fb9565b801561252e5780601f106125055761010080835404028352916020019161252e565b820191905f5260205f20905b81548152906001019060200180831161251157829003601f168201915b50505050509080600201805461254390613fb9565b80601f016020809104026020016040519081016040528092919081815260200182805461256f90613fb9565b80156125ba5780601f10612591576101008083540402835291602001916125ba565b820191905f5260205f20905b81548152906001019060200180831161259d57829003601f168201915b5050505050908060030154908060040154908060050154908060060154905087565b6125e46129f3565b6001600160a01b0381166126465760405162461bcd60e51b8152602060048201526024808201527f46656520726563697069656e742063616e6e6f74206265207a65726f206164646044820152637265737360e01b6064820152608401610779565b600c80546001600160a01b0319166001600160a01b0383169081179091556040519081527f594ad6ee98bfc0c73e6d15fd4e762502f359e05d26907b7fa1ff82eb5e99f6e490602001610743565b5f818152600660209081526040808320815160a08101835281546001600160a01b039081168252600183015416938101939093526002810154918301919091526003810154606083015260040154608082018190529091036127085760405162461bcd60e51b815260040161077990613feb565b335f908152600460205260408082205483516001600160a01b03168352912054146127755760405162461bcd60e51b815260206004820152601c60248201527f53656e646572206d75737420626520746865206f6e2d72616d706572000000006044820152606401610779565b6040808201515f90815260056020522061278f818461306d565b8160600151816004015f8282546127a69190613f93565b909155505060608201516005820180545f906127c3908490613fa6565b9091555050505050565b60605f8267ffffffffffffffff8111156127e9576127e9613879565b60405190808252806020026020018201604052801561282257816020015b61280f613768565b8152602001906001900390816128075790505b5090505f5b8381101561291a575f85858381811061284257612842613f44565b602090810292909201355f81815260068452604090819020815160a08101835281546001600160a01b039081168252600183015416958101959095526002810154858301526003810154606080870191909152600490910154608086015281519081019091529093509050808888868181106128c0576128c0613f44565b6020908102929092013583525081810184905283516001600160a01b03165f908152600490915260409081902054910152845185908590811061290557612905613f44565b60209081029190910101525050600101612827565b5090505b92915050565b61292c6129f3565b600180546001600160a01b0319166001600160a01b0383169081179091556040519081527f73d3ac111d5926fbfd68ade03832f0b1a4daef0cd0effc1fa0829264bcc57c4190602001610743565b6129826129f3565b6001600160a01b0381166129e75760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610779565b6129f081613401565b50565b5f546001600160a01b031633146119e75760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610779565b60408051602081018490529081018290524260608201525f90819060800160408051601f1981840301815291905280516020909101209050612aae7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000182613f6c565b949350505050565b5f8181526005602090815260408083206007018054825181850281018501909352808352606094938493929190830182828015612b1057602002820191905f5260205f20905b815481526020019060010190808311612afc575b50505050509050805167ffffffffffffffff811115612b3157612b31613879565b604051908082528060200260200182016040528015612b5a578160200160208202803683370190505b5092505f5b8151811015612c48575f60065f848481518110612b7e57612b7e613f44565b60209081029190910181015182528181019290925260409081015f20815160a08101835281546001600160a01b03908116825260018301541693810193909352600281015491830191909152600381015460608301526004015460808201819052600a549192504291612bf091613f93565b1015612c3f57828281518110612c0857612c08613f44565b6020026020010151858381518110612c2257612c22613f44565b60209081029190910101526060810151612c3c9085613f93565b93505b50600101612b5f565b5050915091565b5f5b81518110156117ed575f801b828281518110612c6f57612c6f613f44565b602002602001015114612c9f57612c9f83838381518110612c9257612c92613f44565b602002602001015161306d565b600101612c51565b60015460405163dc28b2bf60e01b81525f9182916001600160a01b039091169063dc28b2bf90612cdd90879087906004016141d3565b6020604051808303815f875af1158015612cf9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612aae9190614214565b612d2561378e565b600254604051630c44b27760e01b81525f9182918291829182918291829182916001600160a01b0390911690630c44b27790612d67908e908e9060040161422b565b60c0604051808303815f875af1158015612d83573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612da7919061426c565b5f818152600660209081526040808320815160a08101835281546001600160a01b03908116825260018301548116828601526002830154828501819052600384015460608401526004909301546080830152918552600590935292208151989e50969c50949a509298509096509450909216612e355760405162461bcd60e51b815260040161077990613feb565b8682608001511115612e945760405162461bcd60e51b815260206004820152602260248201527f496e74656e7420776173206e6f742063726561746564206265666f72652073656044820152611b9960f21b6064820152608401610779565b8581600201604051602001612ea991906142b2565b6040516020818303038152906040528051906020012014612f0c5760405162461bcd60e51b815260206004820152601b60248201527f4f666672616d70657220696420646f6573206e6f74206d6174636800000000006044820152606401610779565b8481600101604051602001612f2191906142b2565b6040516020818303038152906040528051906020012014612f845760405162461bcd60e51b815260206004820152601b60248201527f4f666672616d70657220696420646f6573206e6f74206d6174636800000000006044820152606401610779565b81516001600160a01b03165f908152600460205260409020548414612feb5760405162461bcd60e51b815260206004820152601a60248201527f4f6e72616d70657220696420646f6573206e6f74206d617463680000000000006044820152606401610779565b8060060154670de0b6b3a764000083606001516130089190614039565b6130129190614050565b88101561305a5760405162461bcd60e51b81526020600482015260166024820152750a0c2f2dacadce840eec2e640dcdee840cadcdeeaced60531b6044820152606401610779565b9099509750955050505050509250925092565b5f818152600660208181526040808420815160a08101835281546001600160a01b039081168083526001840180549092168387015260028401805484870152600380860180546060870152600480880180546080890152948c528952878b20548b529088529589208990558989529690955282546001600160a01b0319908116909355805490921690915592849055839055919091556131106007840183613450565b604080820151905183907fe8a865b4bab023c399cbd1f2cdd0df2199beb6e5012a4bd2d7691cf7e4199d5a905f90a3505050565b5f816004015482600501546131599190613f93565b9050805f036117ed5781546001600160a01b03165f908152600460205260409020613187906001018461356f565b8154604080518581526001600160a01b0390921660208301527f8ac07cc6e38c6222dd0309c80353c1962354bacf222b825d7401cc80e93ff3cc910160405180910390a15f83815260056020526040812080546001600160a01b0319168155906131f460018301826137ca565b613201600283015f6137ca565b600382015f9055600482015f9055600582015f9055600682015f9055600782015f6116a39190613801565b5f600b545f146132f357670de0b6b3a7640000600b5483606001516132519190614039565b61325b9190614050565b600c5460405163a9059cbb60e01b81526001600160a01b039182166004820152602481018390529192507f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906044016020604051808303815f875af11580156132cd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906132f1919061401a565b505b5f8183606001516133049190613fa6565b602084015160405163a9059cbb60e01b81526001600160a01b039182166004820152602481018390529192507f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906044016020604051808303815f875af1158015613378573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061339c919061401a565b50825160408085015160208087015183516001600160a01b03918216815291820186905292810186905291909216919086907ffa03438194e61c243c6bb5349f1e1dc674431b86f119b5e3b2b327bc43446bce9060600160405180910390a450505050565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f806134a98480548060200260200160405190810160405280929190818152602001828054801561349e57602002820191905f5260205f20905b81548152602001906001019080831161348a575b505050505084613611565b91509150806134f25760405162461bcd60e51b8152602060048201526015602482015274313cba32b99999103737ba1034b71030b93930bc9760591b6044820152606401610779565b83545f9061350290600190613fa6565b90508083146135445784818154811061351d5761351d613f44565b905f5260205f20015485848154811061353857613538613f44565b5f918252602090912001555b8480548061355457613554614324565b600190038181905f5260205f20015f90559055505b50505050565b5f806135c8848054806020026020016040519081016040528092919081815260200182805480156135bd57602002820191905f5260205f20905b8154815260200190600101908083116135a9575b505050505084613667565b91509150806134f25760405162461bcd60e51b81526020600482015260156024820152743ab4b73a191a9b103737ba1034b71030b93930bc9760591b6044820152606401610779565b81515f908190815b81811015613656578486828151811061363457613634613f44565b60200260200101510361364e579250600191506136609050565b600101613619565b505f195f92509250505b9250929050565b81515f908190815b81811015613656578486828151811061368a5761368a613f44565b6020026020010151036136a4579250600191506136609050565b60010161366f565b604080516080810182525f80825260208201529081016136ca6136d6565b81526020015f81525090565b6040518061010001604052805f6001600160a01b0316815260200160608152602001606081526020015f81526020015f81526020015f81526020015f8152602001606081525090565b828054828255905f5260205f20908101928215613758579160200282015b8281111561375857825182559160200191906001019061373d565b50613764929150613818565b5090565b60408051606081019091525f81526020810161378261378e565b81525f60209091015290565b6040518060a001604052805f6001600160a01b031681526020015f6001600160a01b031681526020015f81526020015f81526020015f81525090565b5080546137d690613fb9565b5f825580601f106137e5575050565b601f0160209004905f5260205f20908101906129f09190613818565b5080545f8255905f5260205f20908101906129f091905b5b80821115613764575f8155600101613819565b6001600160a01b03811681146129f0575f80fd5b5f60208284031215613850575f80fd5b813561385b8161382c565b9392505050565b5f60208284031215613872575f80fd5b5035919050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff811182821017156138b6576138b6613879565b604052919050565b5f82601f8301126138cd575f80fd5b813567ffffffffffffffff8111156138e7576138e7613879565b6138fa601f8201601f191660200161388d565b81815284602083860101111561390e575f80fd5b816020850160208301375f918101602001919091529392505050565b5f6020828403121561393a575f80fd5b813567ffffffffffffffff811115613950575f80fd5b612aae848285016138be565b5f805f6060848603121561396e575f80fd5b833592506020840135915060408401356139878161382c565b809150509250925092565b5f6101808284031215611ccc575f80fd5b5f808284036103e08112156139b6575f80fd5b610260808212156139c5575f80fd5b8493506139d486828701613992565b925050509250929050565b602080825282518282018190525f9190848201906040850190845b81811015613a16578351835292840192918401916001016139fa565b50909695505050505050565b5f8060408385031215613a33575f80fd5b8235613a3e8161382c565b91506020830135613a4e8161382c565b809150509250929050565b5f81518084525f5b81811015613a7d57602081850181015186830182015201613a61565b505f602082860101526020601f19601f83011685010191505092915050565b5f815180845260208085019450602084015f5b83811015613acb57815187529582019590820190600101613aaf565b509495945050505050565b5f61010060018060a01b0383511684526020830151816020860152613afd82860182613a59565b91505060408301518482036040860152613b178282613a59565b915050606083015160608501526080830151608085015260a083015160a085015260c083015160c085015260e083015184820360e0860152613b598282613a9c565b95945050505050565b5f60208083018184528085518083526040925060408601915060408160051b8701018488015f5b83811015613be057603f1989840301855281516080815185528882015189860152878201518189870152613bbf82870182613ad6565b60609384015196909301959095525094870194925090860190600101613b89565b509098975050505050505050565b5f80828403610600811215613c01575f80fd5b610480808212156139c5575f80fd5b5f6020808385031215613c21575f80fd5b823567ffffffffffffffff80821115613c38575f80fd5b818501915085601f830112613c4b575f80fd5b813581811115613c5d57613c5d613879565b8060051b9150613c6e84830161388d565b8181529183018401918481019088841115613c87575f80fd5b938501935b83851015613ca557843582529385019390850190613c8c565b98975050505050505050565b6020808252825182820152828101516040808401528051606084018190525f9291820190839060808601905b80831015613cfd5783518252928401926001929092019190840190613cdd565b509695505050505050565b602081525f61385b6020830184613ad6565b5f805f8060808587031215613d2d575f80fd5b843567ffffffffffffffff80821115613d44575f80fd5b613d50888389016138be565b95506020870135915080821115613d65575f80fd5b50613d72878288016138be565b949794965050505060408301359260600135919050565b6001600160a01b038816815260e0602082018190525f90613dac90830189613a59565b8281036040840152613dbe8189613a59565b9150508560608301528460808301528360a08301528260c083015298975050505050505050565b5f8060208385031215613df6575f80fd5b823567ffffffffffffffff80821115613e0d575f80fd5b818501915085601f830112613e20575f80fd5b813581811115613e2e575f80fd5b8660208260051b8501011115613e42575f80fd5b60209290920196919550909350505050565b602080825282518282018190525f919060409081850190868401855b82811015613ed6578151805185528681015180516001600160a01b039081168988015281890151168787015286810151606080880191909152810151608080880191909152015160a086015285015160c085015260e09093019290850190600101613e70565b5091979650505050505050565b5f8060408385031215613ef4575f80fd5b8235613eff8161382c565b946020939093013593505050565b6020808252601e908201527f43616c6c6572206d757374206265207265676973746572656420757365720000604082015260600190565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601260045260245ffd5b5f82613f7a57613f7a613f58565b500690565b634e487b7160e01b5f52601160045260245ffd5b8082018082111561291e5761291e613f7f565b8181038181111561291e5761291e613f7f565b600181811c90821680613fcd57607f821691505b602082108103611ccc57634e487b7160e01b5f52602260045260245ffd5b602080825260159082015274125b9d195b9d08191bd95cc81b9bdd08195e1a5cdd605a1b604082015260600190565b5f6020828403121561402a575f80fd5b8151801515811461385b575f80fd5b808202811582820484141761291e5761291e613f7f565b5f8261405e5761405e613f58565b500490565b5f6001820161407457614074613f7f565b5060010190565b601f8211156117ed57805f5260205f20601f840160051c810160208510156140a05750805b601f840160051c820191505b818110156116a3575f81556001016140ac565b815167ffffffffffffffff8111156140d9576140d9613879565b6140ed816140e78454613fb9565b8461407b565b602080601f831160018114614120575f84156141095750858301515b5f19600386901b1c1916600185901b178555614177565b5f85815260208120601f198616915b8281101561414e5788860151825594840194600190910190840161412f565b508582101561416b57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b805f5b600281101561356957604080838637938401939190910190600101614182565b60408183376141b7604083016040830161417f565b604060c0820160c0840137610100608081830182850137505050565b6103e0810160408483376141ed604083016040860161417f565b604060c0850160c0840137610100610160818601828501375061385b6102608301846141a2565b5f60208284031215614224575f80fd5b5051919050565b61060081016040848337614245604083016040860161417f565b604060c0850160c0840137610100610380818601828501375061385b6104808301846141a2565b5f805f805f8060c08789031215614281575f80fd5b865195506020870151945060408701519350606087015192506080870151915060a087015190509295509295509295565b5f8083546142bf81613fb9565b600182811680156142d757600181146142ec57614318565b60ff1984168752821515830287019450614318565b875f526020805f205f5b8581101561430f5781548a8201529084019082016142f6565b50505082870194505b50929695505050505050565b634e487b7160e01b5f52603160045260245ffdfea26469706673582212208fb4e210ebf703ecb4bcbe28e30d16afbe87747ef3a60413a39e088f937844b564736f6c63430008180033", + "deployedBytecode": "0x608060405234801561000f575f80fd5b506004361061026b575f3560e01c8063715018a61161014b578063b3fa4c01116100bf578063ecb3dc8811610084578063ecb3dc8814610649578063ecd618f014610652578063ed1692b814610672578063eea1d19714610685578063f2fde38b14610698578063fbf15b1f146106ab575f80fd5b8063b3fa4c01146105f4578063d55f960d14610607578063d9478d201461061a578063e215ad591461062d578063e279d96414610640575f80fd5b80639087beff116101105780639087beff1461056c5780639b357b5a1461057f5780639f9fb96814610592578063a00555b3146105b2578063a1a954b7146105c5578063b02c43d0146105ce575f80fd5b8063715018a6146104a657806371a28f69146104ae5780637b510fe8146104c15780638da5cb5b146104e15780639021578a146104f1575f80fd5b806342987349116101e25780635081d952116101a75780635081d952146104315780635dd765151461045157806360e0d21e14610464578063645006ca1461047757806366ec8419146104805780637113476214610493575f80fd5b806342987349146103cf57806343a170e6146103e25780634595bba0146103f5578063485cc95514610415578063495223e714610428575f80fd5b80632a80cda3116102335780632a80cda314610320578063317dcc96146103335780633389d5d514610346578063392e53cd146103695780633adba28a1461037d5780633e413bee14610390575f80fd5b80630f1ef98c1461026f578063133de6cb146102ba578063148172da146102cf57806314ec32fa146102e2578063238c849414610317575b5f80fd5b6102a761027d366004613840565b6001600160a01b03165f908152600460209081526040808320548352600390915290206001015490565b6040519081526020015b60405180910390f35b6102cd6102c8366004613840565b6106f1565b005b6102cd6102dd366004613862565b61074e565b6102a76102f0366004613840565b6001600160a01b03165f908152600460209081526040808320548352600390915290205490565b6102a7600b5481565b6102cd61032e366004613862565b61087d565b6102cd610341366004613862565b610909565b61035961035436600461392a565b610946565b60405190151581526020016102b1565b60025461035990600160a01b900460ff1681565b6102cd61038b36600461395c565b610a93565b6103b77f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016102b1565b6102cd6103dd366004613862565b610fd8565b6102cd6103f03660046139a3565b611078565b610408610403366004613840565b61112f565b6040516102b191906139df565b6102cd610423366004613a22565b6111a5565b6102a760095481565b61044461043f366004613840565b611238565b6040516102b19190613b62565b6102cd61045f366004613862565b611586565b6102cd610472366004613bee565b611625565b6102a760075481565b6102cd61048e366004613862565b6116aa565b6102cd6104a1366004613c10565b6117f2565b6102cd6119d6565b6104446104bc366004613c10565b6119e9565b6104d46104cf366004613840565b611cd2565b6040516102b19190613cb1565b5f546001600160a01b03166103b7565b6105396104ff366004613862565b60066020525f9081526040902080546001820154600283015460038401546004909401546001600160a01b03938416949390921692909185565b604080516001600160a01b039687168152959094166020860152928401919091526060830152608082015260a0016102b1565b6102cd61057a366004613862565b611d68565b6102cd61058d366004613862565b611dfe565b6105a56105a0366004613862565b611f02565b6040516102b19190613d08565b6102cd6105c0366004613d1a565b6120d9565b6102a7600a5481565b6105e16105dc366004613862565b61248c565b6040516102b19796959493929190613d89565b6102cd610602366004613840565b6125dc565b6102cd610615366004613862565b612694565b600c546103b7906001600160a01b031681565b6001546103b7906001600160a01b031681565b6102a760085481565b6102a7600d5481565b610665610660366004613de5565b6127cd565b6040516102b19190613e54565b6102cd610680366004613840565b612924565b6002546103b7906001600160a01b031681565b6102cd6106a6366004613840565b61297a565b6103596106b9366004613ee3565b6001600160a01b0382165f90815260046020908152604080832054835260038083528184208585520190915290205460ff1692915050565b6106f96129f3565b600280546001600160a01b0319166001600160a01b0383169081179091556040519081527f6e7665a41605edc0d70f4b991d652755f380754eb092d81ef9ab93664778d59e906020015b60405180910390a150565b335f908152600460205260409020546107825760405162461bcd60e51b815260040161077990613f0d565b60405180910390fd5b335f908152600460209081526040808320548084526003808452828520868652019092529091205460ff16156107fa5760405162461bcd60e51b815260206004820152601860248201527f5573657220616c7265616479206f6e2064656e796c69737400000000000000006044820152606401610779565b5f8181526003602081815260408084208685528084018352818520805460ff19166001908117909155938352600201805493840181558452922001839055517f976c693d56f27ba17d902bda80c4fa0416b773fbf268bcb0ee71689234d769ee906108719083908590918252602082015260400190565b60405180910390a15050565b6108856129f3565b805f036108d45760405162461bcd60e51b815260206004820152601e60248201527f4d696e696d756d206465706f7369742063616e6e6f74206265207a65726f00006044820152606401610779565b60078190556040518181527fbdde72a6d8d8b42770c9899945ccdce09d0c5c794d3326cdb2d2cca61b12a9fc90602001610743565b6109116129f3565b60098190556040518181527f88397975d177ce5e18abf3a5fdb8de773e80673d85eeb54f48cfaf688b3d2c3e90602001610743565b80515f90829060201461095b57505f92915050565b5f5b8151811015610a895760028110156109d757604160f81b82828151811061098657610986613f44565b01602001516001600160f81b03191610806109c45750605a60f81b8282815181106109b3576109b3613f44565b01602001516001600160f81b031916115b156109d257505f9392505050565b610a81565b6109e2600582613f6c565b600403610a1e578181815181106109fb576109fb613f44565b6020910101516001600160f81b031916600160fd1b146109d257505f9392505050565b603060f81b828281518110610a3557610a35613f44565b01602001516001600160f81b0319161080610a735750603960f81b828281518110610a6257610a62613f44565b01602001516001600160f81b031916115b15610a8157505f9392505050565b60010161095d565b5060019392505050565b335f90815260046020526040902054610abe5760405162461bcd60e51b815260040161077990613f0d565b335f908152600460208181526040808420548785526005835281852080546001600160a01b031686529383528185205480865260038085528387208388520190935293205460ff1615610b535760405162461bcd60e51b815260206004820181905260248201527f4f6e72616d706572206f6e206465706f7369746f7227732064656e796c6973746044820152606401610779565b6009545f848152600360205260409020600101544291610b7291613f93565b1115610bcc5760405162461bcd60e51b8152602060048201526024808201527f4f6e2072616d7020636f6f6c20646f776e20706572696f64206e6f7420656c616044820152631c1cd95960e21b6064820152608401610779565b5f8381526003602052604090205415610c275760405162461bcd60e51b815260206004820152601860248201527f496e74656e74207374696c6c206f75747374616e64696e6700000000000000006044820152606401610779565b828103610c765760405162461bcd60e51b815260206004820152601e60248201527f53656e6465722063616e6e6f7420626520746865206465706f7369746f7200006044820152606401610779565b81546001600160a01b0316610cc65760405162461bcd60e51b815260206004820152601660248201527511195c1bdcda5d08191bd95cc81b9bdd08195e1a5cdd60521b6044820152606401610779565b5f8511610d245760405162461bcd60e51b815260206004820152602660248201527f5369676e616c656420616d6f756e74206d75737420626520677265617465722060448201526507468616e20360d41b6064820152608401610779565b600854851115610d935760405162461bcd60e51b815260206004820152603460248201527f5369676e616c656420616d6f756e74206d757374206265206c657373207468616044820152731b881b585e081bdb8b5c985b5c08185b5bdd5b9d60621b6064820152608401610779565b6001600160a01b038416610de95760405162461bcd60e51b815260206004820152601b60248201527f43616e6e6f742073656e6420746f207a65726f206164647265737300000000006044820152606401610779565b5f610df48488612a4c565b90508583600401541015610ea6575f80610e0d89612ab6565b9150915087818660040154610e229190613f93565b1015610e675760405162461bcd60e51b81526020600482015260146024820152734e6f7420656e6f756768206c697175696469747960601b6044820152606401610779565b610e718583612c4f565b80856004015f828254610e849190613f93565b9250508190555080856005015f828254610e9e9190613fa6565b909155505050505b6040805160a0810182523381526001600160a01b0387811660208084019182528385018c8152606085018c815242608087019081525f89815260068552888120975188546001600160a01b03199081169189169190911789559551600189018054909716971696909617909455905160028601555160038086019190915591516004948501558883525291822083905584018054889290610f48908490613fa6565b9250508190555085836005015f828254610f629190613f93565b90915550506007830180546001810182555f91825260209182902001829055604080516001600160a01b038816815291820188905242908201528490889083907f1a1292e170a0f000ccf956afba79bee0f9ec1d81f3f901c1d4d11e1f336aae109060600160405180910390a450505050505050565b610fe06129f3565b805f036110435760405162461bcd60e51b815260206004820152602b60248201527f4d617820696e74656e742065787069726174696f6e20706572696f642063616e60448201526a6e6f74206265207a65726f60a81b6064820152608401610779565b600a8190556040518181527f55e3f6b95de9a0ec782f892e93fafe4e56be0696df204ddf8e0a40a9a713a80390602001610743565b335f90815260046020526040902054156110e35760405162461bcd60e51b815260206004820152602660248201527f4163636f756e7420616c7265616479206173736f6369617465642077697468206044820152650d2c890c2e6d60d31b6064820152608401610779565b5f6110ee8383612ca7565b335f818152600460205260408082208490555192935083927f672144042732f7b1cdbf0772464ae545aedd7f41d38b8487dafd9085496a5d519190a3505050565b6001600160a01b0381165f908152600460209081526040808320548352600382529182902060020180548351818402810184019094528084526060939283018282801561119957602002820191905f5260205f20905b815481526020019060010190808311611185575b50505050509050919050565b6111ad6129f3565b600254600160a01b900460ff16156111fd5760405162461bcd60e51b8152602060048201526013602482015272105b1c9958591e481a5b9a5d1a585b1a5e9959606a1b6044820152606401610779565b600180546001600160a01b039384166001600160a01b0319909116179055600280546001600160a81b0319169190921617600160a01b179055565b6001600160a01b0381165f90815260046020908152604080832060010180548251818502810185019093528083526060949383018282801561129757602002820191905f5260205f20905b815481526020019060010190808311611283575b50505050509050805167ffffffffffffffff8111156112b8576112b8613879565b6040519080825280602002602001820160405280156112f157816020015b6112de6136ac565b8152602001906001900390816112d65790505b5091505f5b815181101561157f575f82828151811061131257611312613f44565b6020908102919091018101515f8181526005835260408082208151610100810190925280546001600160a01b03168252600181018054949650929491939092918401919061135f90613fb9565b80601f016020809104026020016040519081016040528092919081815260200182805461138b90613fb9565b80156113d65780601f106113ad576101008083540402835291602001916113d6565b820191905f5260205f20905b8154815290600101906020018083116113b957829003601f168201915b505050505081526020016002820180546113ef90613fb9565b80601f016020809104026020016040519081016040528092919081815260200182805461141b90613fb9565b80156114665780601f1061143d57610100808354040283529160200191611466565b820191905f5260205f20905b81548152906001019060200180831161144957829003601f168201915b5050505050815260200160038201548152602001600482015481526020016005820154815260200160068201548152602001600782018054806020026020016040519081016040528092919081815260200182805480156114e457602002820191905f5260205f20905b8154815260200190600101908083116114d0575b50505050508152505090505f6114f983612ab6565b915050604051806080016040528084815260200160045f855f01516001600160a01b03166001600160a01b031681526020019081526020015f205f015481526020018381526020018284608001516115519190613f93565b81525086858151811061156657611566613f44565b60200260200101819052505050508060010190506112f6565b5050919050565b61158e6129f3565b66b1a2bc2ec500008111156115f05760405162461bcd60e51b815260206004820152602260248201527f4665652063616e6e6f742062652067726561746572207468616e206d61782066604482015261656560f01b6064820152608401610779565b600b8190556040518181527f44f48e1b871e6db1e909a7b253b054b7150a0b4ddf4d59b159c827d82e72567090602001610743565b5f805f6116328585612d1d565b925092509250611642828261306d565b8260600151826005015f8282546116599190613fa6565b909155505082516001600160a01b03165f908152600460209081526040808320548352600390915290819020426001909101558301516116999083613144565b6116a3818461322c565b5050505050565b5f818152600660209081526040808320815160a08101835281546001600160a01b0390811682526001830154811682860152600283015482850181905260038401546060840152600490930154608083015291855260059093529220815191929091166117295760405162461bcd60e51b815260040161077990613feb565b80546001600160a01b031633146117825760405162461bcd60e51b815260206004820152601c60248201527f43616c6c6572206d75737420626520746865206465706f7369746f72000000006044820152606401610779565b61178c818461306d565b8160600151816005015f8282546117a39190613fa6565b909155505081516001600160a01b03165f908152600460209081526040808320548352600390915290819020426001909101558201516117e39082613144565b6117ed838361322c565b505050565b5f805b8251811015611947575f83828151811061181157611811613f44565b6020908102919091018101515f818152600590925260409091208054919250906001600160a01b031633146118885760405162461bcd60e51b815260206004820152601c60248201527f53656e646572206d75737420626520746865206465706f7369746f72000000006044820152606401610779565b5f8061189384612ab6565b915091506118a18383612c4f565b8083600401546118b19190613f93565b6118bb9087613f93565b955080836005015f8282546118d09190613fa6565b9091555050825460048401546001600160a01b039091169085907fae1f357660ab777dcfd38c0ab6357834684ec26289ecfa07ec65dbf6c3c6431290611917908590613f93565b60405190815260200160405180910390a35f60048401556119388484613144565b505050508060010190506117f5565b5060405163a9059cbb60e01b8152336004820152602481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063a9059cbb906044016020604051808303815f875af11580156119b2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117ed919061401a565b6119de6129f3565b6119e75f613401565b565b6060815167ffffffffffffffff811115611a0557611a05613879565b604051908082528060200260200182016040528015611a3e57816020015b611a2b6136ac565b815260200190600190039081611a235790505b5090505f5b8251811015611ccc575f838281518110611a5f57611a5f613f44565b6020908102919091018101515f8181526005835260408082208151610100810190925280546001600160a01b031682526001810180549496509294919390929184019190611aac90613fb9565b80601f0160208091040260200160405190810160405280929190818152602001828054611ad890613fb9565b8015611b235780601f10611afa57610100808354040283529160200191611b23565b820191905f5260205f20905b815481529060010190602001808311611b0657829003601f168201915b50505050508152602001600282018054611b3c90613fb9565b80601f0160208091040260200160405190810160405280929190818152602001828054611b6890613fb9565b8015611bb35780601f10611b8a57610100808354040283529160200191611bb3565b820191905f5260205f20905b815481529060010190602001808311611b9657829003601f168201915b505050505081526020016003820154815260200160048201548152602001600582015481526020016006820154815260200160078201805480602002602001604051908101604052809291908181526020018280548015611c3157602002820191905f5260205f20905b815481526020019060010190808311611c1d575b50505050508152505090505f611c4683612ab6565b915050604051806080016040528084815260200160045f855f01516001600160a01b03166001600160a01b031681526020019081526020015f205f01548152602001838152602001828460800151611c9e9190613f93565b815250858581518110611cb357611cb3613f44565b6020026020010181905250505050806001019050611a43565b50919050565b604080518082019091525f8152606060208201526001600160a01b0382165f90815260046020908152604091829020825180840184528154815260018201805485518186028101860190965280865291949293858101939290830182828015611d5857602002820191905f5260205f20905b815481526020019060010190808311611d44575b5050505050815250509050919050565b611d706129f3565b805f03611dc95760405162461bcd60e51b815260206004820152602160248201527f4d6178206f6e2072616d7020616d6f756e742063616e6e6f74206265207a65726044820152606f60f81b6064820152608401610779565b60088190556040518181527fcab6b49ca21dd111cf4a55d507bbe89dd12d69216e28247060d4b2163ca41b3990602001610743565b335f90815260046020526040902054611e295760405162461bcd60e51b815260040161077990613f0d565b335f908152600460209081526040808320548084526003808452828520868652019092529091205460ff16611e975760405162461bcd60e51b8152602060048201526014602482015273155cd95c881b9bdd081bdb8819195b9e5b1a5cdd60621b6044820152606401610779565b5f8181526003602081815260408084208685528084018352908420805460ff191690559284905252611ecc9060020183613450565b60408051828152602081018490527f8935205b1b382095d2d95efbb36f81a11a34c548d45af26adc1a02d2f2bb546f9101610871565b611f0a6136d6565b5f828152600560209081526040918290208251610100810190935280546001600160a01b031683526001810180549192840191611f4690613fb9565b80601f0160208091040260200160405190810160405280929190818152602001828054611f7290613fb9565b8015611fbd5780601f10611f9457610100808354040283529160200191611fbd565b820191905f5260205f20905b815481529060010190602001808311611fa057829003601f168201915b50505050508152602001600282018054611fd690613fb9565b80601f016020809104026020016040519081016040528092919081815260200182805461200290613fb9565b801561204d5780601f106120245761010080835404028352916020019161204d565b820191905f5260205f20905b81548152906001019060200180831161203057829003601f168201915b505050505081526020016003820154815260200160048201548152602001600582015481526020016006820154815260200160078201805480602002602001604051908101604052809291908181526020018280548015611d5857602002820191905f5260205f2090815481526020019060010190808311611d44575050505050815250509050919050565b335f908152600460205260409020546121045760405162461bcd60e51b815260040161077990613f0d565b61210d84610946565b6121485760405162461bcd60e51b815260206004820152600c60248201526b24b73b30b634b21024a120a760a11b6044820152606401610779565b335f908152600460205260409020600101546005116121a95760405162461bcd60e51b815260206004820152601e60248201527f4d6178696d756d206465706f73697420616d6f756e74207265616368656400006044820152606401610779565b60075482101561221a5760405162461bcd60e51b815260206004820152603660248201527f4465706f73697420616d6f756e74206d757374206265206772656174657220746044820152751a185b881b5a5b8819195c1bdcda5d08185b5bdd5b9d60521b6064820152608401610779565b5f81116122775760405162461bcd60e51b815260206004820152602560248201527f5265636569766520616d6f756e74206d75737420626520677265617465722074604482015264068616e20360dc1b6064820152608401610779565b5f8161228b670de0b6b3a764000085614039565b6122959190614050565b600d80549192505f9190826122a983614063565b90915550335f818152600460209081526040808320600180820180548083018255908652848620018790558251610100810184529586528584018d81528684018d9052606087018c9052608087018c905260a0870186905260c087018a90528351868152808601855260e0880152878652600590945291909320845181546001600160a01b0319166001600160a01b0390911617815591519495509193909182019061235590826140bf565b506040820151600282019061236a90826140bf565b50606082015160038201556080820151600482015560a0820151600582015560c0820151600682015560e082015180516123ae91600784019160209091019061371f565b50506040516323b872dd60e01b8152336004820152306024820152604481018790527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031691506323b872dd906064016020604051808303815f875af1158015612421573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612445919061401a565b508054604080518781526020810186905284917f36b046df2c296f2a5a78570d5e52a92773cbb616825b1af59a49a4d02df2b109910160405180910390a350505050505050565b60056020525f9081526040902080546001820180546001600160a01b0390921692916124b790613fb9565b80601f01602080910402602001604051908101604052809291908181526020018280546124e390613fb9565b801561252e5780601f106125055761010080835404028352916020019161252e565b820191905f5260205f20905b81548152906001019060200180831161251157829003601f168201915b50505050509080600201805461254390613fb9565b80601f016020809104026020016040519081016040528092919081815260200182805461256f90613fb9565b80156125ba5780601f10612591576101008083540402835291602001916125ba565b820191905f5260205f20905b81548152906001019060200180831161259d57829003601f168201915b5050505050908060030154908060040154908060050154908060060154905087565b6125e46129f3565b6001600160a01b0381166126465760405162461bcd60e51b8152602060048201526024808201527f46656520726563697069656e742063616e6e6f74206265207a65726f206164646044820152637265737360e01b6064820152608401610779565b600c80546001600160a01b0319166001600160a01b0383169081179091556040519081527f594ad6ee98bfc0c73e6d15fd4e762502f359e05d26907b7fa1ff82eb5e99f6e490602001610743565b5f818152600660209081526040808320815160a08101835281546001600160a01b039081168252600183015416938101939093526002810154918301919091526003810154606083015260040154608082018190529091036127085760405162461bcd60e51b815260040161077990613feb565b335f908152600460205260408082205483516001600160a01b03168352912054146127755760405162461bcd60e51b815260206004820152601c60248201527f53656e646572206d75737420626520746865206f6e2d72616d706572000000006044820152606401610779565b6040808201515f90815260056020522061278f818461306d565b8160600151816004015f8282546127a69190613f93565b909155505060608201516005820180545f906127c3908490613fa6565b9091555050505050565b60605f8267ffffffffffffffff8111156127e9576127e9613879565b60405190808252806020026020018201604052801561282257816020015b61280f613768565b8152602001906001900390816128075790505b5090505f5b8381101561291a575f85858381811061284257612842613f44565b602090810292909201355f81815260068452604090819020815160a08101835281546001600160a01b039081168252600183015416958101959095526002810154858301526003810154606080870191909152600490910154608086015281519081019091529093509050808888868181106128c0576128c0613f44565b6020908102929092013583525081810184905283516001600160a01b03165f908152600490915260409081902054910152845185908590811061290557612905613f44565b60209081029190910101525050600101612827565b5090505b92915050565b61292c6129f3565b600180546001600160a01b0319166001600160a01b0383169081179091556040519081527f73d3ac111d5926fbfd68ade03832f0b1a4daef0cd0effc1fa0829264bcc57c4190602001610743565b6129826129f3565b6001600160a01b0381166129e75760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610779565b6129f081613401565b50565b5f546001600160a01b031633146119e75760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610779565b60408051602081018490529081018290524260608201525f90819060800160408051601f1981840301815291905280516020909101209050612aae7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000182613f6c565b949350505050565b5f8181526005602090815260408083206007018054825181850281018501909352808352606094938493929190830182828015612b1057602002820191905f5260205f20905b815481526020019060010190808311612afc575b50505050509050805167ffffffffffffffff811115612b3157612b31613879565b604051908082528060200260200182016040528015612b5a578160200160208202803683370190505b5092505f5b8151811015612c48575f60065f848481518110612b7e57612b7e613f44565b60209081029190910181015182528181019290925260409081015f20815160a08101835281546001600160a01b03908116825260018301541693810193909352600281015491830191909152600381015460608301526004015460808201819052600a549192504291612bf091613f93565b1015612c3f57828281518110612c0857612c08613f44565b6020026020010151858381518110612c2257612c22613f44565b60209081029190910101526060810151612c3c9085613f93565b93505b50600101612b5f565b5050915091565b5f5b81518110156117ed575f801b828281518110612c6f57612c6f613f44565b602002602001015114612c9f57612c9f83838381518110612c9257612c92613f44565b602002602001015161306d565b600101612c51565b60015460405163dc28b2bf60e01b81525f9182916001600160a01b039091169063dc28b2bf90612cdd90879087906004016141d3565b6020604051808303815f875af1158015612cf9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612aae9190614214565b612d2561378e565b600254604051630c44b27760e01b81525f9182918291829182918291829182916001600160a01b0390911690630c44b27790612d67908e908e9060040161422b565b60c0604051808303815f875af1158015612d83573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612da7919061426c565b5f818152600660209081526040808320815160a08101835281546001600160a01b03908116825260018301548116828601526002830154828501819052600384015460608401526004909301546080830152918552600590935292208151989e50969c50949a509298509096509450909216612e355760405162461bcd60e51b815260040161077990613feb565b8682608001511115612e945760405162461bcd60e51b815260206004820152602260248201527f496e74656e7420776173206e6f742063726561746564206265666f72652073656044820152611b9960f21b6064820152608401610779565b8581600201604051602001612ea991906142b2565b6040516020818303038152906040528051906020012014612f0c5760405162461bcd60e51b815260206004820152601b60248201527f4f666672616d70657220696420646f6573206e6f74206d6174636800000000006044820152606401610779565b8481600101604051602001612f2191906142b2565b6040516020818303038152906040528051906020012014612f845760405162461bcd60e51b815260206004820152601b60248201527f4f666672616d70657220696420646f6573206e6f74206d6174636800000000006044820152606401610779565b81516001600160a01b03165f908152600460205260409020548414612feb5760405162461bcd60e51b815260206004820152601a60248201527f4f6e72616d70657220696420646f6573206e6f74206d617463680000000000006044820152606401610779565b8060060154670de0b6b3a764000083606001516130089190614039565b6130129190614050565b88101561305a5760405162461bcd60e51b81526020600482015260166024820152750a0c2f2dacadce840eec2e640dcdee840cadcdeeaced60531b6044820152606401610779565b9099509750955050505050509250925092565b5f818152600660208181526040808420815160a08101835281546001600160a01b039081168083526001840180549092168387015260028401805484870152600380860180546060870152600480880180546080890152948c528952878b20548b529088529589208990558989529690955282546001600160a01b0319908116909355805490921690915592849055839055919091556131106007840183613450565b604080820151905183907fe8a865b4bab023c399cbd1f2cdd0df2199beb6e5012a4bd2d7691cf7e4199d5a905f90a3505050565b5f816004015482600501546131599190613f93565b9050805f036117ed5781546001600160a01b03165f908152600460205260409020613187906001018461356f565b8154604080518581526001600160a01b0390921660208301527f8ac07cc6e38c6222dd0309c80353c1962354bacf222b825d7401cc80e93ff3cc910160405180910390a15f83815260056020526040812080546001600160a01b0319168155906131f460018301826137ca565b613201600283015f6137ca565b600382015f9055600482015f9055600582015f9055600682015f9055600782015f6116a39190613801565b5f600b545f146132f357670de0b6b3a7640000600b5483606001516132519190614039565b61325b9190614050565b600c5460405163a9059cbb60e01b81526001600160a01b039182166004820152602481018390529192507f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906044016020604051808303815f875af11580156132cd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906132f1919061401a565b505b5f8183606001516133049190613fa6565b602084015160405163a9059cbb60e01b81526001600160a01b039182166004820152602481018390529192507f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906044016020604051808303815f875af1158015613378573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061339c919061401a565b50825160408085015160208087015183516001600160a01b03918216815291820186905292810186905291909216919086907ffa03438194e61c243c6bb5349f1e1dc674431b86f119b5e3b2b327bc43446bce9060600160405180910390a450505050565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f806134a98480548060200260200160405190810160405280929190818152602001828054801561349e57602002820191905f5260205f20905b81548152602001906001019080831161348a575b505050505084613611565b91509150806134f25760405162461bcd60e51b8152602060048201526015602482015274313cba32b99999103737ba1034b71030b93930bc9760591b6044820152606401610779565b83545f9061350290600190613fa6565b90508083146135445784818154811061351d5761351d613f44565b905f5260205f20015485848154811061353857613538613f44565b5f918252602090912001555b8480548061355457613554614324565b600190038181905f5260205f20015f90559055505b50505050565b5f806135c8848054806020026020016040519081016040528092919081815260200182805480156135bd57602002820191905f5260205f20905b8154815260200190600101908083116135a9575b505050505084613667565b91509150806134f25760405162461bcd60e51b81526020600482015260156024820152743ab4b73a191a9b103737ba1034b71030b93930bc9760591b6044820152606401610779565b81515f908190815b81811015613656578486828151811061363457613634613f44565b60200260200101510361364e579250600191506136609050565b600101613619565b505f195f92509250505b9250929050565b81515f908190815b81811015613656578486828151811061368a5761368a613f44565b6020026020010151036136a4579250600191506136609050565b60010161366f565b604080516080810182525f80825260208201529081016136ca6136d6565b81526020015f81525090565b6040518061010001604052805f6001600160a01b0316815260200160608152602001606081526020015f81526020015f81526020015f81526020015f8152602001606081525090565b828054828255905f5260205f20908101928215613758579160200282015b8281111561375857825182559160200191906001019061373d565b50613764929150613818565b5090565b60408051606081019091525f81526020810161378261378e565b81525f60209091015290565b6040518060a001604052805f6001600160a01b031681526020015f6001600160a01b031681526020015f81526020015f81526020015f81525090565b5080546137d690613fb9565b5f825580601f106137e5575050565b601f0160209004905f5260205f20908101906129f09190613818565b5080545f8255905f5260205f20908101906129f091905b5b80821115613764575f8155600101613819565b6001600160a01b03811681146129f0575f80fd5b5f60208284031215613850575f80fd5b813561385b8161382c565b9392505050565b5f60208284031215613872575f80fd5b5035919050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff811182821017156138b6576138b6613879565b604052919050565b5f82601f8301126138cd575f80fd5b813567ffffffffffffffff8111156138e7576138e7613879565b6138fa601f8201601f191660200161388d565b81815284602083860101111561390e575f80fd5b816020850160208301375f918101602001919091529392505050565b5f6020828403121561393a575f80fd5b813567ffffffffffffffff811115613950575f80fd5b612aae848285016138be565b5f805f6060848603121561396e575f80fd5b833592506020840135915060408401356139878161382c565b809150509250925092565b5f6101808284031215611ccc575f80fd5b5f808284036103e08112156139b6575f80fd5b610260808212156139c5575f80fd5b8493506139d486828701613992565b925050509250929050565b602080825282518282018190525f9190848201906040850190845b81811015613a16578351835292840192918401916001016139fa565b50909695505050505050565b5f8060408385031215613a33575f80fd5b8235613a3e8161382c565b91506020830135613a4e8161382c565b809150509250929050565b5f81518084525f5b81811015613a7d57602081850181015186830182015201613a61565b505f602082860101526020601f19601f83011685010191505092915050565b5f815180845260208085019450602084015f5b83811015613acb57815187529582019590820190600101613aaf565b509495945050505050565b5f61010060018060a01b0383511684526020830151816020860152613afd82860182613a59565b91505060408301518482036040860152613b178282613a59565b915050606083015160608501526080830151608085015260a083015160a085015260c083015160c085015260e083015184820360e0860152613b598282613a9c565b95945050505050565b5f60208083018184528085518083526040925060408601915060408160051b8701018488015f5b83811015613be057603f1989840301855281516080815185528882015189860152878201518189870152613bbf82870182613ad6565b60609384015196909301959095525094870194925090860190600101613b89565b509098975050505050505050565b5f80828403610600811215613c01575f80fd5b610480808212156139c5575f80fd5b5f6020808385031215613c21575f80fd5b823567ffffffffffffffff80821115613c38575f80fd5b818501915085601f830112613c4b575f80fd5b813581811115613c5d57613c5d613879565b8060051b9150613c6e84830161388d565b8181529183018401918481019088841115613c87575f80fd5b938501935b83851015613ca557843582529385019390850190613c8c565b98975050505050505050565b6020808252825182820152828101516040808401528051606084018190525f9291820190839060808601905b80831015613cfd5783518252928401926001929092019190840190613cdd565b509695505050505050565b602081525f61385b6020830184613ad6565b5f805f8060808587031215613d2d575f80fd5b843567ffffffffffffffff80821115613d44575f80fd5b613d50888389016138be565b95506020870135915080821115613d65575f80fd5b50613d72878288016138be565b949794965050505060408301359260600135919050565b6001600160a01b038816815260e0602082018190525f90613dac90830189613a59565b8281036040840152613dbe8189613a59565b9150508560608301528460808301528360a08301528260c083015298975050505050505050565b5f8060208385031215613df6575f80fd5b823567ffffffffffffffff80821115613e0d575f80fd5b818501915085601f830112613e20575f80fd5b813581811115613e2e575f80fd5b8660208260051b8501011115613e42575f80fd5b60209290920196919550909350505050565b602080825282518282018190525f919060409081850190868401855b82811015613ed6578151805185528681015180516001600160a01b039081168988015281890151168787015286810151606080880191909152810151608080880191909152015160a086015285015160c085015260e09093019290850190600101613e70565b5091979650505050505050565b5f8060408385031215613ef4575f80fd5b8235613eff8161382c565b946020939093013593505050565b6020808252601e908201527f43616c6c6572206d757374206265207265676973746572656420757365720000604082015260600190565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601260045260245ffd5b5f82613f7a57613f7a613f58565b500690565b634e487b7160e01b5f52601160045260245ffd5b8082018082111561291e5761291e613f7f565b8181038181111561291e5761291e613f7f565b600181811c90821680613fcd57607f821691505b602082108103611ccc57634e487b7160e01b5f52602260045260245ffd5b602080825260159082015274125b9d195b9d08191bd95cc81b9bdd08195e1a5cdd605a1b604082015260600190565b5f6020828403121561402a575f80fd5b8151801515811461385b575f80fd5b808202811582820484141761291e5761291e613f7f565b5f8261405e5761405e613f58565b500490565b5f6001820161407457614074613f7f565b5060010190565b601f8211156117ed57805f5260205f20601f840160051c810160208510156140a05750805b601f840160051c820191505b818110156116a3575f81556001016140ac565b815167ffffffffffffffff8111156140d9576140d9613879565b6140ed816140e78454613fb9565b8461407b565b602080601f831160018114614120575f84156141095750858301515b5f19600386901b1c1916600185901b178555614177565b5f85815260208120601f198616915b8281101561414e5788860151825594840194600190910190840161412f565b508582101561416b57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b805f5b600281101561356957604080838637938401939190910190600101614182565b60408183376141b7604083016040830161417f565b604060c0820160c0840137610100608081830182850137505050565b6103e0810160408483376141ed604083016040860161417f565b604060c0850160c0840137610100610160818601828501375061385b6102608301846141a2565b5f60208284031215614224575f80fd5b5051919050565b61060081016040848337614245604083016040860161417f565b604060c0850160c0840137610100610380818601828501375061385b6104808301846141a2565b5f805f805f8060c08789031215614281575f80fd5b865195506020870151945060408701519350606087015192506080870151915060a087015190509295509295509295565b5f8083546142bf81613fb9565b600182811680156142d757600181146142ec57614318565b60ff1984168752821515830287019450614318565b875f526020805f205f5b8581101561430f5781548a8201529084019082016142f6565b50505082870194505b50929695505050505050565b634e487b7160e01b5f52603160045260245ffdfea26469706673582212208fb4e210ebf703ecb4bcbe28e30d16afbe87747ef3a60413a39e088f937844b564736f6c63430008180033", + "devdoc": { + "kind": "dev", + "methods": { + "addAccountToDenylist(bytes32)": { + "params": { + "_deniedUser": "Poseidon hash of the idHash being banned" + } + }, + "cancelIntent(bytes32)": { + "params": { + "_intentHash": "Hash of intent being cancelled" + } + }, + "initialize(address,address)": { + "params": { + "_registrationProcessor": "Registration processor address", + "_sendProcessor": "Send processor address" + } + }, + "offRamp(string,string,uint256,uint256)": { + "params": { + "_depositAmount": "The amount of USDC to off-ramp", + "_garantiIban": "IBAN number of the depositor with spacing as such: \"TR## #### #### #### #### #### ##\"", + "_garantiName": "Name given for Garanti IBAN account, necessary for on-rampers to complete on-ramp", + "_receiveAmount": "The amount of USD to receive" + } + }, + "onRamp((uint256[2],uint256[2][2],uint256[2],uint256[28]),(uint256[2],uint256[2][2],uint256[2],uint256[4]))": { + "params": { + "_bodyHashProof": "Parameters and signals for body hash proof", + "_proof": "Parameters and signals for send email proof" + } + }, + "owner()": { + "details": "Returns the address of the current owner." + }, + "register((uint256[2],uint256[2][2],uint256[2],uint256[11]),(uint256[2],uint256[2][2],uint256[2],uint256[4]))": { + "params": { + "_bodyHashProof": "Parameters and signals for body hash proof", + "_proof": "Parameters and signals for registration email proof" + } + }, + "releaseFundsToOnramper(bytes32)": { + "params": { + "_intentHash": "Hash of intent to resolve by releasing the funds" + } + }, + "removeAccountFromDenylist(bytes32)": { + "params": { + "_approvedUser": "Poseidon hash of the idHash being approved" + } + }, + "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." + }, + "setIntentExpirationPeriod(uint256)": { + "params": { + "_intentExpirationPeriod": "New intent expiration period" + } + }, + "setMaxOnRampAmount(uint256)": { + "params": { + "_maxOnRampAmount": "The new max on ramp amount" + } + }, + "setMinDepositAmount(uint256)": { + "params": { + "_minDepositAmount": "The new minimum deposit amount" + } + }, + "setOnRampCooldownPeriod(uint256)": { + "params": { + "_onRampCooldownPeriod": "New on-ramp cooldown period" + } + }, + "setRegistrationProcessor(address)": { + "params": { + "_registrationProcessor": "New registration proccesor address" + } + }, + "setSendProcessor(address)": { + "params": { + "_sendProcessor": "New send proccesor address" + } + }, + "setSustainabilityFee(uint256)": { + "params": { + "_fee": "The new sustainability fee in precise units (10**18, ie 10% = 1e17)" + } + }, + "setSustainabilityFeeRecipient(address)": { + "params": { + "_feeRecipient": "The new fee recipient address" + } + }, + "signalIntent(uint256,uint256,address)": { + "params": { + "_amount": "The amount of USDC the user wants to on-ramp", + "_depositId": "The ID of the deposit the on-ramper intends to use for ", + "_to": "Address to forward funds to (can be same as onRamper)" + } + }, + "transferOwnership(address)": { + "details": "Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner." + }, + "withdrawDeposit(uint256[])": { + "params": { + "_depositIds": "Array of depositIds the depositor is attempting to withdraw" + } + } + }, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": { + "addAccountToDenylist(bytes32)": { + "notice": "Adds an idHash to a depositor's deny list. If an address associated with the banned idHash attempts to signal an intent on the user's deposit they will be denied." + }, + "cancelIntent(bytes32)": { + "notice": "Only callable by the originator of the intent. Cancels an outstanding intent thus allowing user to signal a new intent. Deposit state is updated to reflect the cancelled intent." + }, + "initialize(address,address)": { + "notice": "Initialize Ramp with the addresses of the Processors" + }, + "offRamp(string,string,uint256,uint256)": { + "notice": "Generates a deposit entry for off-rampers that can then be fulfilled by an on-ramper. This function will not add to previous deposits. Every deposit has it's own unique identifier. User must approve the contract to transfer the deposit amount of USDC." + }, + "onRamp((uint256[2],uint256[2][2],uint256[2],uint256[28]),(uint256[2],uint256[2][2],uint256[2],uint256[4]))": { + "notice": "Anyone can submit an on-ramp transaction, even if caller isn't on-ramper. Upon submission the proof is validated, intent is removed, and deposit state is updated. USDC is transferred to the on-ramper." + }, + "register((uint256[2],uint256[2][2],uint256[2],uint256[11]),(uint256[2],uint256[2][2],uint256[2],uint256[4]))": { + "notice": "Registers a new account by pulling the hash of the account id from the proof and assigning the account owner to the sender of the transaction. One Garanti account can be registered to multiple Ethereum addresses." + }, + "releaseFundsToOnramper(bytes32)": { + "notice": "Allows off-ramper to release funds to the on-ramper in case of a failed on-ramp or because of some other arrangement between the two parties. Upon submission we check to make sure the msg.sender is the depositor, the intent is removed, and deposit state is updated. USDC is transferred to the on-ramper." + }, + "removeAccountFromDenylist(bytes32)": { + "notice": "Removes a idHash from a depositor's deny list." + }, + "setIntentExpirationPeriod(uint256)": { + "notice": "GOVERNANCE ONLY: Updates the intent expiration period, after this period elapses an intent can be pruned to prevent locking up a depositor's funds." + }, + "setMaxOnRampAmount(uint256)": { + "notice": "GOVERNANCE ONLY: Updates the max amount allowed to be on-ramped in each transaction. To on-ramp more than this amount a user must make multiple transactions." + }, + "setMinDepositAmount(uint256)": { + "notice": "GOVERNANCE ONLY: Updates the minimum deposit amount a user can specify for off-ramping." + }, + "setOnRampCooldownPeriod(uint256)": { + "notice": "GOVERNANCE ONLY: Updates the on-ramp cooldown period, once an on-ramp transaction is completed the user must wait this amount of time before they can signalIntent to on-ramp again." + }, + "setRegistrationProcessor(address)": { + "notice": "GOVERNANCE ONLY: Updates the registration processor address used for validating and interpreting zk proofs." + }, + "setSendProcessor(address)": { + "notice": "GOVERNANCE ONLY: Updates the send processor address used for validating and interpreting zk proofs." + }, + "setSustainabilityFee(uint256)": { + "notice": "GOVERNANCE ONLY: Updates the sustainability fee. This fee is charged to on-rampers upon a successful on-ramp." + }, + "setSustainabilityFeeRecipient(address)": { + "notice": "GOVERNANCE ONLY: Updates the recepient of sustainability fees." + }, + "signalIntent(uint256,uint256,address)": { + "notice": "Signals intent to pay the depositor defined in the _depositId the _amount * deposit conversionRate off-chain in order to unlock _amount of funds on-chain. Each user can only have one outstanding intent at a time regardless of address (tracked using idHash). Caller must not be on the depositor's deny list. If there are prunable intents then they will be deleted from the deposit to be able to maintain state hygiene." + }, + "withdrawDeposit(uint256[])": { + "notice": "Caller must be the depositor for each depositId in the array, if not whole function fails. Depositor is returned all remaining deposits and any outstanding intents that are expired. If an intent is not expired then those funds will not be returned. Deposit will be deleted as long as there are no more outstanding intents." + } + }, + "version": 1 + }, + "storageLayout": { + "storage": [ + { + "astId": 7, + "contract": "contracts/ramps/garanti/GarantiRamp.sol:GarantiRamp", + "label": "_owner", + "offset": 0, + "slot": "0", + "type": "t_address" + }, + { + "astId": 7046, + "contract": "contracts/ramps/garanti/GarantiRamp.sol:GarantiRamp", + "label": "registrationProcessor", + "offset": 0, + "slot": "1", + "type": "t_contract(IGarantiRegistrationProcessor)9741" + }, + { + "astId": 7049, + "contract": "contracts/ramps/garanti/GarantiRamp.sol:GarantiRamp", + "label": "sendProcessor", + "offset": 0, + "slot": "2", + "type": "t_contract(IGarantiSendProcessor)9786" + }, + { + "astId": 7051, + "contract": "contracts/ramps/garanti/GarantiRamp.sol:GarantiRamp", + "label": "isInitialized", + "offset": 20, + "slot": "2", + "type": "t_bool" + }, + { + "astId": 7056, + "contract": "contracts/ramps/garanti/GarantiRamp.sol:GarantiRamp", + "label": "globalAccount", + "offset": 0, + "slot": "3", + "type": "t_mapping(t_bytes32,t_struct(GlobalAccountInfo)7010_storage)" + }, + { + "astId": 7061, + "contract": "contracts/ramps/garanti/GarantiRamp.sol:GarantiRamp", + "label": "accounts", + "offset": 0, + "slot": "4", + "type": "t_mapping(t_address,t_struct(AccountInfo)6947_storage)" + }, + { + "astId": 7066, + "contract": "contracts/ramps/garanti/GarantiRamp.sol:GarantiRamp", + "label": "deposits", + "offset": 0, + "slot": "5", + "type": "t_mapping(t_uint256,t_struct(Deposit)6965_storage)" + }, + { + "astId": 7071, + "contract": "contracts/ramps/garanti/GarantiRamp.sol:GarantiRamp", + "label": "intents", + "offset": 0, + "slot": "6", + "type": "t_mapping(t_bytes32,t_struct(Intent)6986_storage)" + }, + { + "astId": 7073, + "contract": "contracts/ramps/garanti/GarantiRamp.sol:GarantiRamp", + "label": "minDepositAmount", + "offset": 0, + "slot": "7", + "type": "t_uint256" + }, + { + "astId": 7075, + "contract": "contracts/ramps/garanti/GarantiRamp.sol:GarantiRamp", + "label": "maxOnRampAmount", + "offset": 0, + "slot": "8", + "type": "t_uint256" + }, + { + "astId": 7077, + "contract": "contracts/ramps/garanti/GarantiRamp.sol:GarantiRamp", + "label": "onRampCooldownPeriod", + "offset": 0, + "slot": "9", + "type": "t_uint256" + }, + { + "astId": 7079, + "contract": "contracts/ramps/garanti/GarantiRamp.sol:GarantiRamp", + "label": "intentExpirationPeriod", + "offset": 0, + "slot": "10", + "type": "t_uint256" + }, + { + "astId": 7081, + "contract": "contracts/ramps/garanti/GarantiRamp.sol:GarantiRamp", + "label": "sustainabilityFee", + "offset": 0, + "slot": "11", + "type": "t_uint256" + }, + { + "astId": 7083, + "contract": "contracts/ramps/garanti/GarantiRamp.sol:GarantiRamp", + "label": "sustainabilityFeeRecipient", + "offset": 0, + "slot": "12", + "type": "t_address" + }, + { + "astId": 7085, + "contract": "contracts/ramps/garanti/GarantiRamp.sol:GarantiRamp", + "label": "depositCounter", + "offset": 0, + "slot": "13", + "type": "t_uint256" + } + ], + "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_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_contract(IGarantiRegistrationProcessor)9741": { + "encoding": "inplace", + "label": "contract IGarantiRegistrationProcessor", + "numberOfBytes": "20" + }, + "t_contract(IGarantiSendProcessor)9786": { + "encoding": "inplace", + "label": "contract IGarantiSendProcessor", + "numberOfBytes": "20" + }, + "t_mapping(t_address,t_struct(AccountInfo)6947_storage)": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => struct GarantiRamp.AccountInfo)", + "numberOfBytes": "32", + "value": "t_struct(AccountInfo)6947_storage" + }, + "t_mapping(t_bytes32,t_bool)": { + "encoding": "mapping", + "key": "t_bytes32", + "label": "mapping(bytes32 => bool)", + "numberOfBytes": "32", + "value": "t_bool" + }, + "t_mapping(t_bytes32,t_struct(GlobalAccountInfo)7010_storage)": { + "encoding": "mapping", + "key": "t_bytes32", + "label": "mapping(bytes32 => struct GarantiRamp.GlobalAccountInfo)", + "numberOfBytes": "32", + "value": "t_struct(GlobalAccountInfo)7010_storage" + }, + "t_mapping(t_bytes32,t_struct(Intent)6986_storage)": { + "encoding": "mapping", + "key": "t_bytes32", + "label": "mapping(bytes32 => struct GarantiRamp.Intent)", + "numberOfBytes": "32", + "value": "t_struct(Intent)6986_storage" + }, + "t_mapping(t_uint256,t_struct(Deposit)6965_storage)": { + "encoding": "mapping", + "key": "t_uint256", + "label": "mapping(uint256 => struct GarantiRamp.Deposit)", + "numberOfBytes": "32", + "value": "t_struct(Deposit)6965_storage" + }, + "t_string_storage": { + "encoding": "bytes", + "label": "string", + "numberOfBytes": "32" + }, + "t_struct(AccountInfo)6947_storage": { + "encoding": "inplace", + "label": "struct GarantiRamp.AccountInfo", + "members": [ + { + "astId": 6943, + "contract": "contracts/ramps/garanti/GarantiRamp.sol:GarantiRamp", + "label": "idHash", + "offset": 0, + "slot": "0", + "type": "t_bytes32" + }, + { + "astId": 6946, + "contract": "contracts/ramps/garanti/GarantiRamp.sol:GarantiRamp", + "label": "deposits", + "offset": 0, + "slot": "1", + "type": "t_array(t_uint256)dyn_storage" + } + ], + "numberOfBytes": "64" + }, + "t_struct(DenyList)7002_storage": { + "encoding": "inplace", + "label": "struct GarantiRamp.DenyList", + "members": [ + { + "astId": 6997, + "contract": "contracts/ramps/garanti/GarantiRamp.sol:GarantiRamp", + "label": "deniedUsers", + "offset": 0, + "slot": "0", + "type": "t_array(t_bytes32)dyn_storage" + }, + { + "astId": 7001, + "contract": "contracts/ramps/garanti/GarantiRamp.sol:GarantiRamp", + "label": "isDenied", + "offset": 0, + "slot": "1", + "type": "t_mapping(t_bytes32,t_bool)" + } + ], + "numberOfBytes": "64" + }, + "t_struct(Deposit)6965_storage": { + "encoding": "inplace", + "label": "struct GarantiRamp.Deposit", + "members": [ + { + "astId": 6949, + "contract": "contracts/ramps/garanti/GarantiRamp.sol:GarantiRamp", + "label": "depositor", + "offset": 0, + "slot": "0", + "type": "t_address" + }, + { + "astId": 6951, + "contract": "contracts/ramps/garanti/GarantiRamp.sol:GarantiRamp", + "label": "garantiIban", + "offset": 0, + "slot": "1", + "type": "t_string_storage" + }, + { + "astId": 6953, + "contract": "contracts/ramps/garanti/GarantiRamp.sol:GarantiRamp", + "label": "garantiName", + "offset": 0, + "slot": "2", + "type": "t_string_storage" + }, + { + "astId": 6955, + "contract": "contracts/ramps/garanti/GarantiRamp.sol:GarantiRamp", + "label": "depositAmount", + "offset": 0, + "slot": "3", + "type": "t_uint256" + }, + { + "astId": 6957, + "contract": "contracts/ramps/garanti/GarantiRamp.sol:GarantiRamp", + "label": "remainingDeposits", + "offset": 0, + "slot": "4", + "type": "t_uint256" + }, + { + "astId": 6959, + "contract": "contracts/ramps/garanti/GarantiRamp.sol:GarantiRamp", + "label": "outstandingIntentAmount", + "offset": 0, + "slot": "5", + "type": "t_uint256" + }, + { + "astId": 6961, + "contract": "contracts/ramps/garanti/GarantiRamp.sol:GarantiRamp", + "label": "conversionRate", + "offset": 0, + "slot": "6", + "type": "t_uint256" + }, + { + "astId": 6964, + "contract": "contracts/ramps/garanti/GarantiRamp.sol:GarantiRamp", + "label": "intentHashes", + "offset": 0, + "slot": "7", + "type": "t_array(t_bytes32)dyn_storage" + } + ], + "numberOfBytes": "256" + }, + "t_struct(GlobalAccountInfo)7010_storage": { + "encoding": "inplace", + "label": "struct GarantiRamp.GlobalAccountInfo", + "members": [ + { + "astId": 7004, + "contract": "contracts/ramps/garanti/GarantiRamp.sol:GarantiRamp", + "label": "currentIntentHash", + "offset": 0, + "slot": "0", + "type": "t_bytes32" + }, + { + "astId": 7006, + "contract": "contracts/ramps/garanti/GarantiRamp.sol:GarantiRamp", + "label": "lastOnrampTimestamp", + "offset": 0, + "slot": "1", + "type": "t_uint256" + }, + { + "astId": 7009, + "contract": "contracts/ramps/garanti/GarantiRamp.sol:GarantiRamp", + "label": "denyList", + "offset": 0, + "slot": "2", + "type": "t_struct(DenyList)7002_storage" + } + ], + "numberOfBytes": "128" + }, + "t_struct(Intent)6986_storage": { + "encoding": "inplace", + "label": "struct GarantiRamp.Intent", + "members": [ + { + "astId": 6977, + "contract": "contracts/ramps/garanti/GarantiRamp.sol:GarantiRamp", + "label": "onRamper", + "offset": 0, + "slot": "0", + "type": "t_address" + }, + { + "astId": 6979, + "contract": "contracts/ramps/garanti/GarantiRamp.sol:GarantiRamp", + "label": "to", + "offset": 0, + "slot": "1", + "type": "t_address" + }, + { + "astId": 6981, + "contract": "contracts/ramps/garanti/GarantiRamp.sol:GarantiRamp", + "label": "deposit", + "offset": 0, + "slot": "2", + "type": "t_uint256" + }, + { + "astId": 6983, + "contract": "contracts/ramps/garanti/GarantiRamp.sol:GarantiRamp", + "label": "amount", + "offset": 0, + "slot": "3", + "type": "t_uint256" + }, + { + "astId": 6985, + "contract": "contracts/ramps/garanti/GarantiRamp.sol:GarantiRamp", + "label": "intentTimestamp", + "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/deployments/encifher/GarantiRegistrationProcessor.json b/contracts/deployments/encifher/GarantiRegistrationProcessor.json new file mode 100644 index 000000000..23a02ed0c --- /dev/null +++ b/contracts/deployments/encifher/GarantiRegistrationProcessor.json @@ -0,0 +1,522 @@ +{ + "address": "0xDcE79D5f359C7aB52e3d6B45be2D0D382696D323", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_ramp", + "type": "address" + }, + { + "internalType": "contract IKeyHashAdapterV2", + "name": "_garantiMailserverKeyHashAdapter", + "type": "address" + }, + { + "internalType": "contract INullifierRegistry", + "name": "_nullifierRegistry", + "type": "address" + }, + { + "internalType": "contract IGarantiBodySuffixHashVerifier", + "name": "_bodyHashVerifier", + "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": "PACK_SIZE", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "bodyHashVerifier", + "outputs": [ + { + "internalType": "contract IGarantiBodySuffixHashVerifier", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "emailFromAddress", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getEmailFromAddress", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_keyHash", + "type": "bytes32" + } + ], + "name": "isMailServerKeyHash", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "mailServerKeyHashAdapter", + "outputs": [ + { + "internalType": "contract IKeyHashAdapterV2", + "name": "", + "type": "address" + } + ], + "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[11]", + "name": "signals", + "type": "uint256[11]" + } + ], + "internalType": "struct IGarantiRegistrationProcessor.RegistrationProof", + "name": "_proof", + "type": "tuple" + }, + { + "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[4]", + "name": "signals", + "type": "uint256[4]" + } + ], + "internalType": "struct IGarantiBodySuffixHashVerifier.BodySuffixHashProof", + "name": "_bodyHashProof", + "type": "tuple" + } + ], + "name": "processProof", + "outputs": [ + { + "internalType": "bytes32", + "name": "userIdHash", + "type": "bytes32" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "ramp", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "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": "contract IKeyHashAdapterV2", + "name": "_mailServerKeyHashAdapter", + "type": "address" + } + ], + "name": "setMailserverKeyHashAdapter", + "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[11]", + "name": "_pubSignals", + "type": "uint256[11]" + } + ], + "name": "verifyProof", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "transactionHash": "0xbae7571836c17532585da373aa714e6d6405f9c92a75e7a9b3ea21e2cc3711e0", + "receipt": { + "to": null, + "from": "0xa0Ee7A142d267C1f36714E4a8F75612F20a79720", + "contractAddress": "0xDcE79D5f359C7aB52e3d6B45be2D0D382696D323", + "transactionIndex": 0, + "gasUsed": "1667141", + "logsBloom": "0x00000000000000000000040000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000008000000000000000000020000000000000000000800000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000004000000020000000000000000000000000000000000000000000000000000000088000000000", + "blockHash": "0x79cd1e8f6f5aff240438d8a17f6ce1b0bb5d550321f406b72ff63ef009e53d4e", + "transactionHash": "0xbae7571836c17532585da373aa714e6d6405f9c92a75e7a9b3ea21e2cc3711e0", + "logs": [ + { + "transactionIndex": 0, + "blockNumber": 61394, + "transactionHash": "0xbae7571836c17532585da373aa714e6d6405f9c92a75e7a9b3ea21e2cc3711e0", + "address": "0xDcE79D5f359C7aB52e3d6B45be2D0D382696D323", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x000000000000000000000000a0ee7a142d267c1f36714e4a8f75612f20a79720" + ], + "data": "0x", + "logIndex": 0, + "blockHash": "0x79cd1e8f6f5aff240438d8a17f6ce1b0bb5d550321f406b72ff63ef009e53d4e" + } + ], + "blockNumber": 61394, + "cumulativeGasUsed": "1667141", + "status": 1, + "byzantium": true + }, + "args": [ + "0x25C74B7124baE93364213a6124a5e45bB0e98889", + "0xD18E3F31bD50B5c6e4cC740CB9Ca637F6eCC2944", + "0x4d8E02BBfCf205828A8352Af4376b165E123D7b0", + "0xE61a6e7442cE84072DB14423FfBBe2609908Ee38", + "garanti@info.garantibbva.com.tr", + "0" + ], + "numDeployments": 1, + "solcInputHash": "75b8f55da346d7ed99a350632554d2fb", + "metadata": "{\"compiler\":{\"version\":\"0.8.24+commit.e11b9ed9\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_ramp\",\"type\":\"address\"},{\"internalType\":\"contract IKeyHashAdapterV2\",\"name\":\"_garantiMailserverKeyHashAdapter\",\"type\":\"address\"},{\"internalType\":\"contract INullifierRegistry\",\"name\":\"_nullifierRegistry\",\"type\":\"address\"},{\"internalType\":\"contract IGarantiBodySuffixHashVerifier\",\"name\":\"_bodyHashVerifier\",\"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\":\"PACK_SIZE\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"bodyHashVerifier\",\"outputs\":[{\"internalType\":\"contract IGarantiBodySuffixHashVerifier\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"emailFromAddress\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getEmailFromAddress\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_keyHash\",\"type\":\"bytes32\"}],\"name\":\"isMailServerKeyHash\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"mailServerKeyHashAdapter\",\"outputs\":[{\"internalType\":\"contract IKeyHashAdapterV2\",\"name\":\"\",\"type\":\"address\"}],\"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[11]\",\"name\":\"signals\",\"type\":\"uint256[11]\"}],\"internalType\":\"struct IGarantiRegistrationProcessor.RegistrationProof\",\"name\":\"_proof\",\"type\":\"tuple\"},{\"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[4]\",\"name\":\"signals\",\"type\":\"uint256[4]\"}],\"internalType\":\"struct IGarantiBodySuffixHashVerifier.BodySuffixHashProof\",\"name\":\"_bodyHashProof\",\"type\":\"tuple\"}],\"name\":\"processProof\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"userIdHash\",\"type\":\"bytes32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ramp\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"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\":\"contract IKeyHashAdapterV2\",\"name\":\"_mailServerKeyHashAdapter\",\"type\":\"address\"}],\"name\":\"setMailserverKeyHashAdapter\",\"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[11]\",\"name\":\"_pubSignals\",\"type\":\"uint256[11]\"}],\"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/ramps/garanti/GarantiRegistrationProcessor.sol\":\"GarantiRegistrationProcessor\"},\"evmVersion\":\"shanghai\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"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 v4.4.1 (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\",\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"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/processors/BaseProcessorV2.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\n\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\nimport { IKeyHashAdapterV2 } from \\\"./keyHashAdapters/IKeyHashAdapterV2.sol\\\";\\nimport { INullifierRegistry } from \\\"./nullifierRegistries/INullifierRegistry.sol\\\";\\n\\npragma solidity ^0.8.18;\\n\\ncontract BaseProcessorV2 is Ownable {\\n\\n /* ============ Modifiers ============ */\\n modifier onlyRamp() {\\n require(msg.sender == ramp, \\\"Only Ramp can call this function\\\");\\n _;\\n }\\n\\n /* ============ State Variables ============ */\\n address public immutable ramp;\\n IKeyHashAdapterV2 public mailServerKeyHashAdapter;\\n INullifierRegistry public nullifierRegistry;\\n bytes public emailFromAddress;\\n uint256 public timestampBuffer;\\n\\n /* ============ Constructor ============ */\\n constructor(\\n address _ramp,\\n IKeyHashAdapterV2 _mailServerKeyHashAdapter,\\n INullifierRegistry _nullifierRegistry,\\n string memory _emailFromAddress,\\n uint256 _timestampBuffer\\n )\\n Ownable()\\n {\\n ramp = _ramp;\\n mailServerKeyHashAdapter = _mailServerKeyHashAdapter;\\n nullifierRegistry = _nullifierRegistry;\\n emailFromAddress = bytes(_emailFromAddress);\\n timestampBuffer = _timestampBuffer;\\n }\\n\\n /* ============ External Functions ============ */\\n\\n function setMailserverKeyHashAdapter(IKeyHashAdapterV2 _mailServerKeyHashAdapter) external onlyOwner {\\n mailServerKeyHashAdapter = _mailServerKeyHashAdapter;\\n }\\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 function isMailServerKeyHash(bytes32 _keyHash) public view returns (bool) {\\n return IKeyHashAdapterV2(mailServerKeyHashAdapter).isMailServerKeyHash(_keyHash);\\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\":\"0x207174fcbbfa8d2de65a5a5665f05e3f2d668f7df33b682a0f139c967dd3f6be\",\"license\":\"MIT\"},\"contracts/processors/keyHashAdapters/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/processors/nullifierRegistries/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/ramps/garanti/GarantiRegistrationProcessor.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\n\\nimport { StringUtils } from \\\"@zk-email/contracts/utils/StringUtils.sol\\\";\\n\\nimport { BaseProcessorV2 } from \\\"../../processors/BaseProcessorV2.sol\\\";\\nimport { Groth16Verifier } from \\\"../../verifiers/garanti_registration_verifier.sol\\\";\\nimport { IGarantiBodySuffixHashVerifier } from \\\"./interfaces/IGarantiBodySuffixHashVerifier.sol\\\";\\nimport { IGarantiRegistrationProcessor } from \\\"./interfaces/IGarantiRegistrationProcessor.sol\\\";\\nimport { IKeyHashAdapterV2 } from \\\"../../processors/keyHashAdapters/IKeyHashAdapterV2.sol\\\";\\nimport { INullifierRegistry } from \\\"../../processors/nullifierRegistries/INullifierRegistry.sol\\\";\\n\\npragma solidity ^0.8.18;\\n\\ncontract GarantiRegistrationProcessor is\\n Groth16Verifier,\\n IGarantiRegistrationProcessor,\\n BaseProcessorV2\\n{\\n\\n using StringUtils for uint256[];\\n\\n /* ============ Constants ============ */\\n uint256 constant public PACK_SIZE = 7;\\n\\n /* ============ Public Variables ============ */\\n IGarantiBodySuffixHashVerifier public bodyHashVerifier;\\n \\n /* ============ Constructor ============ */\\n constructor(\\n address _ramp,\\n IKeyHashAdapterV2 _garantiMailserverKeyHashAdapter,\\n INullifierRegistry _nullifierRegistry,\\n IGarantiBodySuffixHashVerifier _bodyHashVerifier,\\n string memory _emailFromAddress,\\n uint256 _timestampBuffer\\n )\\n Groth16Verifier()\\n BaseProcessorV2(\\n _ramp,\\n _garantiMailserverKeyHashAdapter,\\n _nullifierRegistry,\\n _emailFromAddress,\\n _timestampBuffer\\n )\\n {\\n bodyHashVerifier = _bodyHashVerifier;\\n }\\n\\n /* ============ External Functions ============ */\\n\\n function processProof(\\n IGarantiRegistrationProcessor.RegistrationProof calldata _proof,\\n IGarantiBodySuffixHashVerifier.BodySuffixHashProof calldata _bodyHashProof\\n )\\n public\\n override\\n onlyRamp\\n returns(bytes32 userIdHash)\\n {\\n require(this.verifyProof(_proof.a, _proof.b, _proof.c, _proof.signals), \\\"Invalid Proof\\\"); // checks effects iteractions, this should come first\\n require(\\n bodyHashVerifier.verifyProof(_bodyHashProof.a, _bodyHashProof.b, _bodyHashProof.c, _bodyHashProof.signals),\\n \\\"Invalid body hash proof\\\"\\n );\\n _validateIntermediateHash(_proof.signals, _bodyHashProof.signals);\\n\\n require(isMailServerKeyHash(bytes32(_proof.signals[0])), \\\"Invalid mailserver key hash\\\");\\n\\n // Signals [5:10] are the packed from email address\\n string memory fromEmail = _parseSignalArray(_proof.signals, 5, 10);\\n require(keccak256(abi.encodePacked(fromEmail)) == keccak256(emailFromAddress), \\\"Invalid email from address\\\");\\n\\n _validateAndAddNullifier(keccak256(abi.encode(_proof)));\\n\\n // Signals [10] is the packed userIdHash\\n userIdHash = bytes32(_proof.signals[10]);\\n }\\n\\n /* ============ Internal Functions ============ */\\n\\n function _parseSignalArray(uint256[11] calldata _signals, uint8 _from, uint8 _to) internal pure returns (string memory) {\\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 function _validateIntermediateHash(uint256[11] calldata _sendSignals, uint256[4] calldata _bodyHashSignals) internal pure {\\n bytes32 intermediateHash = keccak256(abi.encode(_sendSignals[1], _sendSignals[2], _sendSignals[3], _sendSignals[4]));\\n bytes32 inputHash = keccak256(abi.encode(_bodyHashSignals[0], _bodyHashSignals[1], _bodyHashSignals[2], _bodyHashSignals[3]));\\n require(intermediateHash == inputHash, \\\"Invalid intermediate or output hash\\\");\\n }\\n}\\n\",\"keccak256\":\"0x898ba95c7383b134a46d8cb477e8550d4d5e317e56bbb44618a722fec6a22aa6\",\"license\":\"MIT\"},\"contracts/ramps/garanti/interfaces/IGarantiBodySuffixHashVerifier.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.18;\\n\\ninterface IGarantiBodySuffixHashVerifier {\\n\\n struct BodySuffixHashProof {\\n uint256[2] a;\\n uint256[2][2] b;\\n uint256[2] c;\\n uint256[4] signals;\\n }\\n\\n function verifyProof(\\n uint[2] calldata _pA,\\n uint[2][2] calldata _pB,\\n uint[2] calldata _pC,\\n uint[4] calldata _pubSignals\\n )\\n external\\n view\\n returns (bool);\\n}\\n\",\"keccak256\":\"0x0905608291062ba9262aa3aac9434df6150243ad61d2dba863ac695c97db36d3\",\"license\":\"MIT\"},\"contracts/ramps/garanti/interfaces/IGarantiRegistrationProcessor.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.18;\\n\\nimport { IGarantiBodySuffixHashVerifier } from \\\"./IGarantiBodySuffixHashVerifier.sol\\\";\\n\\ninterface IGarantiRegistrationProcessor {\\n\\n struct RegistrationProof {\\n uint256[2] a;\\n uint256[2][2] b;\\n uint256[2] c;\\n uint256[11] signals;\\n }\\n\\n function processProof(\\n RegistrationProof calldata _proof,\\n IGarantiBodySuffixHashVerifier.BodySuffixHashProof calldata _bodyHashProof\\n )\\n external\\n returns (bytes32);\\n}\\n\",\"keccak256\":\"0xc0f70e4fda7e77a71110f14b943f0be18414d3fde1f89611659f3bfa61e7d220\",\"license\":\"MIT\"},\"contracts/verifiers/garanti_registration_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 = 18981494493146797699413473584003903337500344026674158748356152365740882604347;\\n uint256 constant deltax2 = 18221584421696726841818737862375935398226401959970671461464876789891440943773;\\n uint256 constant deltay1 = 13182257072392169632964104391551423396767366986119198763222331185570216766141;\\n uint256 constant deltay2 = 1055999763619532764683818987535346820930542189966934424182524126391532263114;\\n\\n \\n uint256 constant IC0x = 9579394250047657534563426426095079127489461685731836585345036136643186501106;\\n uint256 constant IC0y = 9099104635803858536528567879429672150768221243251986952752931620888312777966;\\n \\n uint256 constant IC1x = 16742803921251520060956705617051970891800993226648453532191536908864553127292;\\n uint256 constant IC1y = 2370866612075105760679084555015532787057818492816729720553168629900878453411;\\n \\n uint256 constant IC2x = 1198559044032862867053778079830233446818498911409168176648000603364093739186;\\n uint256 constant IC2y = 1705707149442825364231032898199260673345453686156603650050734584575953146683;\\n \\n uint256 constant IC3x = 8227987931602929528667070816607404329077624702451836798457232294948292078891;\\n uint256 constant IC3y = 20063181599207889574438820489532781853843300843638785745397328806539284090642;\\n \\n uint256 constant IC4x = 7125527347590397815378809200378110039642415532864842326060497590633383667506;\\n uint256 constant IC4y = 8163556343727594939335759011237867566342023627791431441294508737734621079426;\\n \\n uint256 constant IC5x = 20997293494068572835171892599738628766725761987729696402069061203595826478359;\\n uint256 constant IC5y = 16059948127534196987124792060676979843199916529699136496438545284995501095602;\\n \\n uint256 constant IC6x = 17021328822525982324390769568000212688520466580333628288761906560962941841995;\\n uint256 constant IC6y = 5261883703408033387118117055674706016521465932763230261610744756010618560924;\\n \\n uint256 constant IC7x = 10901863109753159213080424471809415914535140513760405640349521060137871219075;\\n uint256 constant IC7y = 14778288214979337896639472664043167455491393250289008539543476005381670290683;\\n \\n uint256 constant IC8x = 13998728805440395622299361078362563277551541602983787454571111205410111192315;\\n uint256 constant IC8y = 3559585529617912948298445099059517654792071369006112940929259959502551444001;\\n \\n uint256 constant IC9x = 882238089295873026642043167782680157609481002907959944699397709882967318643;\\n uint256 constant IC9y = 19580305433284686836351193255169672439178344945533214806182941836067594348566;\\n \\n uint256 constant IC10x = 18249568535822147984640535315870134333016531565170750204717365905873651523988;\\n uint256 constant IC10y = 2529169972933823970798378850481383664704791812605724365414811723841765790997;\\n \\n uint256 constant IC11x = 12446414909202635741535199485188270293088983356699925634672281045851347103474;\\n uint256 constant IC11y = 7278349290662903089838342599021073819845167033436014498220846982051650195077;\\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[11] calldata _pubSignals) public view returns (bool) {\\n assembly {\\n function checkField(v) {\\n if iszero(lt(v, q)) {\\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 g1_mulAccC(_pVk, IC11x, IC11y, calldataload(add(pubSignals, 320)))\\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 checkField(calldataload(add(_pubSignals, 352)))\\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\":\"0x684fdc3f6538962fc0a9ddf24d2a302d1ca140e068a784c0e9723843b5aeee57\",\"license\":\"GPL-3.0\"}},\"version\":1}", + "bytecode": "0x60a060405234801562000010575f80fd5b506040516200212e3803806200212e833981016040819052620000339162000136565b85858584846200004333620000bb565b6001600160a01b03858116608052600180546001600160a01b031990811687841617909155600280549091169185169190911790556003620000868382620002eb565b506004555050600580546001600160a01b0319166001600160a01b03969096169590951790945550620003b795505050505050565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b03811681146200011f575f80fd5b50565b634e487b7160e01b5f52604160045260245ffd5b5f805f805f8060c087890312156200014c575f80fd5b865162000159816200010a565b809650506020808801516200016e816200010a565b604089015190965062000181816200010a565b606089015190955062000194816200010a565b60808901519094506001600160401b0380821115620001b1575f80fd5b818a0191508a601f830112620001c5575f80fd5b815181811115620001da57620001da62000122565b604051601f8201601f19908116603f0116810190838211818310171562000205576200020562000122565b816040528281528d868487010111156200021d575f80fd5b5f93505b8284101562000240578484018601518185018701529285019262000221565b5f86848301015280975050505050505060a087015190509295509295509295565b600181811c908216806200027657607f821691505b6020821081036200029557634e487b7160e01b5f52602260045260245ffd5b50919050565b601f821115620002e657805f5260205f20601f840160051c81016020851015620002c25750805b601f840160051c820191505b81811015620002e3575f8155600101620002ce565b50505b505050565b81516001600160401b0381111562000307576200030762000122565b6200031f8162000318845462000261565b846200029b565b602080601f83116001811462000355575f84156200033d5750858301515b5f19600386901b1c1916600185901b178555620003af565b5f85815260208120601f198616915b82811015620003855788860151825594840194600190910190840162000364565b5085821015620003a357878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b608051611d57620003d75f395f818161010f0152610c510152611d575ff3fe608060405234801561000f575f80fd5b5060043610610106575f3560e01c8063b870676c1161009e578063d0b71f991161006e578063d0b71f991461021d578063dbac582114610230578063dc28b2bf14610239578063f2fde38b1461024c578063f6c7226b1461025f575f80fd5b8063b870676c146101da578063b9c6ea87146101ed578063c0d05fed14610200578063ced1e97814610215575f80fd5b80638da5cb5b116100d95780638da5cb5b146101915780639895e5b7146101a1578063a8ef333f146101b4578063b2a3fda4146101c7575f80fd5b806315d276e11461010a57806319d091521461014e5780633d0c9cc414610171578063715018a614610187575b5f80fd5b6101317f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020015b60405180910390f35b61016161015c366004611777565b610272565b6040519015158152602001610145565b610179600781565b604051908152602001610145565b61018f6102e3565b005b5f546001600160a01b0316610131565b600554610131906001600160a01b031681565b600154610131906001600160a01b031681565b61018f6101d5366004611777565b6102f6565b600254610131906001600160a01b031681565b6101616101fb36600461179e565b610303565b610208610aff565b6040516101459190611821565b610208610b8b565b61018f61022b366004611867565b610c1b565b61017960045481565b610179610247366004611889565b610c45565b61018f61025a366004611867565b610f80565b61018f61026d3660046118e1565b610ff6565b600154604051630ce848a960e11b8152600481018390525f916001600160a01b0316906319d0915290602401602060405180830381865afa1580156102b9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102dd919061198c565b92915050565b6102eb61100e565b6102f45f611067565b565b6102fe61100e565b600455565b5f610a3e565b7f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd478110610338575f805260205ff35b50565b5f60405183815284602082015285604082015260408160608360076107d05a03fa91508161036b575f805260205ff35b825160408201526020830151606082015260408360808360066107d05a03fa9150508061039a575f805260205ff35b5050505050565b7f152dbeb8b8ab5eac60f4eef36d566fc91e5bb94e9ef0a08ec6c32127b1e5a5f285527f141de924cf08572281bf199f2e95a5e4b2573700ac3bf62f391ea2c4fbf78cee60208601525f608086018661043d87357f053ddcea331e82cb4f9383d3df2ceb5d593bd9818ac8fc8bb1067ba10e629aa37f25041758d837741ae0d2ef251976f958e3c2705396cea1e9274039c0b18e8d7c8461033b565b61048d60208801357f03c565627ff60ffc102246e6011808710c2ded87eb016e91cb18da96b1f3133b7f02a65c41c7e83b0c9f02b9370500a2f8355a6bbd5b1d9b06c4aa66f8799a40b28461033b565b6104dd60408801357f2c5b5bbde6c28b0991602a967c1fe5e32c2246d7d2880808e48265fb448e8f127f1230e04a6fd464834afed47a0ceaaaf77075c298e0db455136f4c2e218552d2b8461033b565b61052d60608801357f120c68be04314a872c0c388ec55c9cf3b368684ba8a50dab6d2abfb8996527827f0fc0e7d2a54f0a5a5133c038fc67a6d078b688e3c7ce78d00afb06e5b79527328461033b565b61057d60808801357f23819bc7be63a25573e216a2fc729f78d4bd4733558a6a6a4e98d2e175497ab27f2e6c0c05c2879447c6a65803421ba7ec6b6ba7c636f85f8e6a9ea529716abd178461033b565b6105cd60a08801357f0ba21ee1f8053b9ff0fb5e743a04ec8ea70d255d0da0cbeb96556b0744a9a19c7f25a1bb0f9d263a96e44514dcba335f1991134fb33e77bf8a98e400a14ba6724b8461033b565b61061d60c08801357f20ac36f76fb33007fe57317ad2a6f39b907fe7da3d0c817d30ef35869d9dc4fb7f181a3c6101a924a62e0423a93c5a8ee369634777d8c4d38a4e4f9f19c0c219838461033b565b61066d60e08801357f07dea76d67502b94bb38d5cd0a11ffff409213105254477105eae49a52f4ea217f1ef2ffedde9413306e78a2d35b9e6ca44cc080626abd82b44da4a9abad937cfb8461033b565b6106be6101008801357f2b4a0f65746c64cfdf33690e101dc7ad6ab74e9269f2fca0a3d102d7a074a8167f01f3543d78cc7400d2d3581aaea774bb4ef7529860d8fd1c25db5a5d9cf9e0738461033b565b61070f6101208801357f059775a03288dbaecef98e8bbbf58b3b18cbddab69166669fde01f14460255157f2858e3c69ac92153a24e1bca97f59caecbce8d6f6d7100c615b4262a4cce61948461033b565b6107606101408801357f101766538ecad8f3ad02975172f78d4a1b68dfe85762b81cfc20b5c15aedce857f1b846bd35a2b1db5876801ef17b9c07aa4be33cbf19511eada4a1d6a6ae42ef28461033b565b50823581527f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4760208401357f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4703066020820152833560408201526020840135606082015260408401356080820152606084013560a08201527f2d4d9aa7e302d9df41749d5507949d05dbea33fbb16c643b22f599a2be6df2e260c08201527f14bedd503c37ceb061d8ec60209fe345ce89830a19230301f076caff004d192660e08201527f0967032fcbf776d1afc985f88877f182d38480a653f2decaa9794cbc3bf3060c6101008201527f0e187847ad4c798374d0d6732bf501847dd68bc0e071241e0213bc7fc13db7ab6101208201527f304cfbd1e08a704a99f5e847d93f8c3caafddec46b7a0d379da69a4d112346a76101408201527f1739c1b1a457a8c7313123d24d2f9192f896b7c63eea05a9d57f06547ad0cec86101608201525f87015161018082015260205f018701516101a08201527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c26101c08201527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed6101e08201527f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b6102008201527f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa610220820152843561024082015260208501356102608201527f29f725293b71250bc0726fa86bb992cef8d0f14621c9e6f3406e5fcf75cf313b6102808201527f28490d221f4d7ac575e80205e97ce102920dd9df55b2a60d06b8f6a3e05da29d6102a08201527f1d24e4a220ebcbcac369fb98e10d1376e7e30320cb514e0c5ca30fa009196abd6102c08201527f0255acb82ef4a2aa399db24ba36decb1a273a6461348d19bb4dc2da8e8c816ca6102e08201526020816103008360086107d05a03fa9051169695505050505050565b6040516103808101604052610a555f840135610309565b610a626020840135610309565b610a6f6040840135610309565b610a7c6060840135610309565b610a896080840135610309565b610a9660a0840135610309565b610aa360c0840135610309565b610ab060e0840135610309565b610abe610100840135610309565b610acc610120840135610309565b610ada610140840135610309565b610ae8610160840135610309565b610af5818486888a6103a1565b9050805f5260205ff35b60038054610b0c906119ab565b80601f0160208091040260200160405190810160405280929190818152602001828054610b38906119ab565b8015610b835780601f10610b5a57610100808354040283529160200191610b83565b820191905f5260205f20905b815481529060010190602001808311610b6657829003601f168201915b505050505081565b606060038054610b9a906119ab565b80601f0160208091040260200160405190810160405280929190818152602001828054610bc6906119ab565b8015610c115780601f10610be857610100808354040283529160200191610c11565b820191905f5260205f20905b815481529060010190602001808311610bf457829003601f168201915b5050505050905090565b610c2361100e565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b5f336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610cc35760405162461bcd60e51b815260206004820181905260248201527f4f6e6c792052616d702063616e2063616c6c20746869732066756e6374696f6e60448201526064015b60405180910390fd5b6040805163b9c6ea8760e01b8152309163b9c6ea8791610cf69187919082019060c0830190610100840190600401611a06565b602060405180830381865afa158015610d11573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d35919061198c565b610d715760405162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b210283937b7b360991b6044820152606401610cba565b60055460408051635fe8c13b60e01b81526001600160a01b0390921691635fe8c13b91610db091869182019060c0830190610100840190600401611a38565b602060405180830381865afa158015610dcb573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610def919061198c565b610e3b5760405162461bcd60e51b815260206004820152601760248201527f496e76616c696420626f647920686173682070726f6f660000000000000000006044820152606401610cba565b610e4d836101000183610100016110b6565b610e5b610100840135610272565b610ea75760405162461bcd60e51b815260206004820152601b60248201527f496e76616c6964206d61696c736572766572206b6579206861736800000000006044820152606401610cba565b5f610eb984610100016005600a611197565b90506003604051610eca9190611a7d565b604051809103902081604051602001610ee39190611aef565b6040516020818303038152906040528051906020012014610f465760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420656d61696c2066726f6d20616464726573730000000000006044820152606401610cba565b610f7584604051602001610f5a9190611b0a565b60405160208183030381529060405280519060200120611267565b505050610240013590565b610f8861100e565b6001600160a01b038116610fed5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610cba565b61033881611067565b610ffe61100e565b600361100a8282611b8c565b5050565b5f546001600160a01b031633146102f45760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610cba565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6040805160208481013581830152848301358284015260608086013581840152608080870135818501528451808503909101815260a084018552805190830120853560c08501528583013560e08501528585013561010085015290850135610120808501919091528451808503909101815261014090930190935281519101208082146111915760405162461bcd60e51b815260206004820152602360248201527f496e76616c696420696e7465726d656469617465206f72206f757470757420686044820152620c2e6d60eb1b6064820152608401610cba565b50505050565b60605f6111a48484611c60565b60ff1667ffffffffffffffff8111156111bf576111bf6118cd565b6040519080825280602002602001820160405280156111e8578160200160208202803683370190505b50905060ff84165b8360ff16811015611243578581600b811061120d5761120d611a69565b60200201358261122060ff881684611c79565b8151811061123057611230611a69565b60209081029190910101526001016111f0565b5061125e600782516112559190611c8c565b82906007611374565b95945050505050565b60025460405163169394bb60e01b8152600481018390526001600160a01b039091169063169394bb90602401602060405180830381865afa1580156112ae573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112d2919061198c565b1561131f5760405162461bcd60e51b815260206004820152601f60248201527f4e756c6c69666965722068617320616c7265616479206265656e2075736564006044820152606401610cba565b600254604051632dea6f9960e11b8152600481018390526001600160a01b0390911690635bd4df32906024015f604051808303815f87803b158015611362575f80fd5b505af115801561039a573d5f803e3d5ffd5b60605f808386516113859190611c8c565b67ffffffffffffffff81111561139d5761139d6118cd565b6040519080825280601f01601f1916602001820160405280156113c7576020820181803683370190505b5090505f805b87518161ffff161015611561575f888261ffff16815181106113f1576113f1611a69565b602002602001015190505f8767ffffffffffffffff811115611415576114156118cd565b60405190808252806020026020018201604052801561143e578160200160208202803683370190505b5090505f5b8881101561148557611456816008611c8c565b83901c82828151811061146b5761146b611a69565b60ff90921660209283029190910190910152600101611443565b505f5b8881101561154b575f8282815181106114a3576114a3611a69565b602002602001015160ff169050805f14611518578060f81b8787815181106114cd576114cd611a69565b60200101906001600160f81b03191690815f1a905350856114ed81611ca3565b96506114fc9050600289611cbb565b60ff165f0361151357611510600189611ce8565b97505b61153b565b611523600289611cbb565b60ff1660010361153b57611538600189611ce8565b97505b5060089290921c91600101611488565b505050808061155990611d01565b9150506113cd565b5060018360ff1610156116025760405162461bcd60e51b815260206004820152605760248201527f4e6f207061636b656420627974657320666f756e642120496e76616c6964206660448201527f696e616c207374617465206f66207061636b656420627974657320696e20656d60648201527f61696c3b2076616c7565206973206c696b656c79203021000000000000000000608482015260a401610cba565b858111156116705760405162461bcd60e51b815260206004820152603560248201527f5061636b6564206279746573206d6f7265207468616e20616c6c6f776564206d6044820152746178206e756d626572206f66207369676e616c732160581b6064820152608401610cba565b5f61167a83611686565b98975050505050505050565b805160609082905f5b82518110156116cf578281815181106116aa576116aa611a69565b01602001516001600160f81b0319165f036116c7578091506116cf565b60010161168f565b505f8167ffffffffffffffff8111156116ea576116ea6118cd565b6040519080825280601f01601f191660200182016040528015611714576020820181803683370190505b5090505f5b8281101561176e5783818151811061173357611733611a69565b602001015160f81c60f81b82828151811061175057611750611a69565b60200101906001600160f81b03191690815f1a905350600101611719565b50949350505050565b5f60208284031215611787575f80fd5b5035919050565b80604081018310156102dd575f80fd5b5f805f806102608086880312156117b3575f80fd5b6117bd878761178e565b945060c08601878111156117cf575f80fd5b6040870194506117df888261178e565b9350508681870111156117f0575f80fd5b50929591945092610100019150565b5f5b83811015611819578181015183820152602001611801565b50505f910152565b602081525f825180602084015261183f8160408501602087016117ff565b601f01601f19169190910160400192915050565b6001600160a01b0381168114610338575f80fd5b5f60208284031215611877575f80fd5b813561188281611853565b9392505050565b5f808284036103e081121561189c575f80fd5b610260808212156118ab575f80fd5b84935061018061025f19830112156118c1575f80fd5b92959390920193505050565b634e487b7160e01b5f52604160045260245ffd5b5f602082840312156118f1575f80fd5b813567ffffffffffffffff80821115611908575f80fd5b818401915084601f83011261191b575f80fd5b81358181111561192d5761192d6118cd565b604051601f8201601f19908116603f01168101908382118183101715611955576119556118cd565b8160405282815287602084870101111561196d575f80fd5b826020860160208301375f928101602001929092525095945050505050565b5f6020828403121561199c575f80fd5b81518015158114611882575f80fd5b600181811c908216806119bf57607f821691505b6020821081036119dd57634e487b7160e01b5f52602260045260245ffd5b50919050565b805f5b6002811015611191576040808386379384019391909101906001016119e6565b61026081016040868337611a1d60408301866119e3565b60408460c08401376101608361010084013795945050505050565b61018081016040868337611a4f60408301866119e3565b60408460c084013760808361010084013795945050505050565b634e487b7160e01b5f52603260045260245ffd5b5f808354611a8a816119ab565b60018281168015611aa25760018114611ab757611ae3565b60ff1984168752821515830287019450611ae3565b875f526020805f205f5b85811015611ada5781548a820152908401908201611ac1565b50505082870194505b50929695505050505050565b5f8251611b008184602087016117ff565b9190910192915050565b61026081016040838337611b2460408301604085016119e3565b604060c0840160c0840137610100610160818501828501375092915050565b601f821115611b8757805f5260205f20601f840160051c81016020851015611b685750805b601f840160051c820191505b8181101561039a575f8155600101611b74565b505050565b815167ffffffffffffffff811115611ba657611ba66118cd565b611bba81611bb484546119ab565b84611b43565b602080601f831160018114611bed575f8415611bd65750858301515b5f19600386901b1c1916600185901b178555611c44565b5f85815260208120601f198616915b82811015611c1b57888601518255948401946001909101908401611bfc565b5085821015611c3857878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b634e487b7160e01b5f52601160045260245ffd5b60ff82811682821603908111156102dd576102dd611c4c565b818103818111156102dd576102dd611c4c565b80820281158282048414176102dd576102dd611c4c565b5f60018201611cb457611cb4611c4c565b5060010190565b5f60ff831680611cd957634e487b7160e01b5f52601260045260245ffd5b8060ff84160691505092915050565b60ff81811683821601908111156102dd576102dd611c4c565b5f61ffff808316818103611d1757611d17611c4c565b600101939250505056fea26469706673582212208534b2d4c58802be40f868c873108b2a05bd8c1c1760a1e9bfb7bc5303a0b97564736f6c63430008180033", + "deployedBytecode": "0x608060405234801561000f575f80fd5b5060043610610106575f3560e01c8063b870676c1161009e578063d0b71f991161006e578063d0b71f991461021d578063dbac582114610230578063dc28b2bf14610239578063f2fde38b1461024c578063f6c7226b1461025f575f80fd5b8063b870676c146101da578063b9c6ea87146101ed578063c0d05fed14610200578063ced1e97814610215575f80fd5b80638da5cb5b116100d95780638da5cb5b146101915780639895e5b7146101a1578063a8ef333f146101b4578063b2a3fda4146101c7575f80fd5b806315d276e11461010a57806319d091521461014e5780633d0c9cc414610171578063715018a614610187575b5f80fd5b6101317f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020015b60405180910390f35b61016161015c366004611777565b610272565b6040519015158152602001610145565b610179600781565b604051908152602001610145565b61018f6102e3565b005b5f546001600160a01b0316610131565b600554610131906001600160a01b031681565b600154610131906001600160a01b031681565b61018f6101d5366004611777565b6102f6565b600254610131906001600160a01b031681565b6101616101fb36600461179e565b610303565b610208610aff565b6040516101459190611821565b610208610b8b565b61018f61022b366004611867565b610c1b565b61017960045481565b610179610247366004611889565b610c45565b61018f61025a366004611867565b610f80565b61018f61026d3660046118e1565b610ff6565b600154604051630ce848a960e11b8152600481018390525f916001600160a01b0316906319d0915290602401602060405180830381865afa1580156102b9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102dd919061198c565b92915050565b6102eb61100e565b6102f45f611067565b565b6102fe61100e565b600455565b5f610a3e565b7f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd478110610338575f805260205ff35b50565b5f60405183815284602082015285604082015260408160608360076107d05a03fa91508161036b575f805260205ff35b825160408201526020830151606082015260408360808360066107d05a03fa9150508061039a575f805260205ff35b5050505050565b7f152dbeb8b8ab5eac60f4eef36d566fc91e5bb94e9ef0a08ec6c32127b1e5a5f285527f141de924cf08572281bf199f2e95a5e4b2573700ac3bf62f391ea2c4fbf78cee60208601525f608086018661043d87357f053ddcea331e82cb4f9383d3df2ceb5d593bd9818ac8fc8bb1067ba10e629aa37f25041758d837741ae0d2ef251976f958e3c2705396cea1e9274039c0b18e8d7c8461033b565b61048d60208801357f03c565627ff60ffc102246e6011808710c2ded87eb016e91cb18da96b1f3133b7f02a65c41c7e83b0c9f02b9370500a2f8355a6bbd5b1d9b06c4aa66f8799a40b28461033b565b6104dd60408801357f2c5b5bbde6c28b0991602a967c1fe5e32c2246d7d2880808e48265fb448e8f127f1230e04a6fd464834afed47a0ceaaaf77075c298e0db455136f4c2e218552d2b8461033b565b61052d60608801357f120c68be04314a872c0c388ec55c9cf3b368684ba8a50dab6d2abfb8996527827f0fc0e7d2a54f0a5a5133c038fc67a6d078b688e3c7ce78d00afb06e5b79527328461033b565b61057d60808801357f23819bc7be63a25573e216a2fc729f78d4bd4733558a6a6a4e98d2e175497ab27f2e6c0c05c2879447c6a65803421ba7ec6b6ba7c636f85f8e6a9ea529716abd178461033b565b6105cd60a08801357f0ba21ee1f8053b9ff0fb5e743a04ec8ea70d255d0da0cbeb96556b0744a9a19c7f25a1bb0f9d263a96e44514dcba335f1991134fb33e77bf8a98e400a14ba6724b8461033b565b61061d60c08801357f20ac36f76fb33007fe57317ad2a6f39b907fe7da3d0c817d30ef35869d9dc4fb7f181a3c6101a924a62e0423a93c5a8ee369634777d8c4d38a4e4f9f19c0c219838461033b565b61066d60e08801357f07dea76d67502b94bb38d5cd0a11ffff409213105254477105eae49a52f4ea217f1ef2ffedde9413306e78a2d35b9e6ca44cc080626abd82b44da4a9abad937cfb8461033b565b6106be6101008801357f2b4a0f65746c64cfdf33690e101dc7ad6ab74e9269f2fca0a3d102d7a074a8167f01f3543d78cc7400d2d3581aaea774bb4ef7529860d8fd1c25db5a5d9cf9e0738461033b565b61070f6101208801357f059775a03288dbaecef98e8bbbf58b3b18cbddab69166669fde01f14460255157f2858e3c69ac92153a24e1bca97f59caecbce8d6f6d7100c615b4262a4cce61948461033b565b6107606101408801357f101766538ecad8f3ad02975172f78d4a1b68dfe85762b81cfc20b5c15aedce857f1b846bd35a2b1db5876801ef17b9c07aa4be33cbf19511eada4a1d6a6ae42ef28461033b565b50823581527f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4760208401357f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4703066020820152833560408201526020840135606082015260408401356080820152606084013560a08201527f2d4d9aa7e302d9df41749d5507949d05dbea33fbb16c643b22f599a2be6df2e260c08201527f14bedd503c37ceb061d8ec60209fe345ce89830a19230301f076caff004d192660e08201527f0967032fcbf776d1afc985f88877f182d38480a653f2decaa9794cbc3bf3060c6101008201527f0e187847ad4c798374d0d6732bf501847dd68bc0e071241e0213bc7fc13db7ab6101208201527f304cfbd1e08a704a99f5e847d93f8c3caafddec46b7a0d379da69a4d112346a76101408201527f1739c1b1a457a8c7313123d24d2f9192f896b7c63eea05a9d57f06547ad0cec86101608201525f87015161018082015260205f018701516101a08201527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c26101c08201527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed6101e08201527f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b6102008201527f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa610220820152843561024082015260208501356102608201527f29f725293b71250bc0726fa86bb992cef8d0f14621c9e6f3406e5fcf75cf313b6102808201527f28490d221f4d7ac575e80205e97ce102920dd9df55b2a60d06b8f6a3e05da29d6102a08201527f1d24e4a220ebcbcac369fb98e10d1376e7e30320cb514e0c5ca30fa009196abd6102c08201527f0255acb82ef4a2aa399db24ba36decb1a273a6461348d19bb4dc2da8e8c816ca6102e08201526020816103008360086107d05a03fa9051169695505050505050565b6040516103808101604052610a555f840135610309565b610a626020840135610309565b610a6f6040840135610309565b610a7c6060840135610309565b610a896080840135610309565b610a9660a0840135610309565b610aa360c0840135610309565b610ab060e0840135610309565b610abe610100840135610309565b610acc610120840135610309565b610ada610140840135610309565b610ae8610160840135610309565b610af5818486888a6103a1565b9050805f5260205ff35b60038054610b0c906119ab565b80601f0160208091040260200160405190810160405280929190818152602001828054610b38906119ab565b8015610b835780601f10610b5a57610100808354040283529160200191610b83565b820191905f5260205f20905b815481529060010190602001808311610b6657829003601f168201915b505050505081565b606060038054610b9a906119ab565b80601f0160208091040260200160405190810160405280929190818152602001828054610bc6906119ab565b8015610c115780601f10610be857610100808354040283529160200191610c11565b820191905f5260205f20905b815481529060010190602001808311610bf457829003601f168201915b5050505050905090565b610c2361100e565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b5f336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610cc35760405162461bcd60e51b815260206004820181905260248201527f4f6e6c792052616d702063616e2063616c6c20746869732066756e6374696f6e60448201526064015b60405180910390fd5b6040805163b9c6ea8760e01b8152309163b9c6ea8791610cf69187919082019060c0830190610100840190600401611a06565b602060405180830381865afa158015610d11573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d35919061198c565b610d715760405162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b210283937b7b360991b6044820152606401610cba565b60055460408051635fe8c13b60e01b81526001600160a01b0390921691635fe8c13b91610db091869182019060c0830190610100840190600401611a38565b602060405180830381865afa158015610dcb573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610def919061198c565b610e3b5760405162461bcd60e51b815260206004820152601760248201527f496e76616c696420626f647920686173682070726f6f660000000000000000006044820152606401610cba565b610e4d836101000183610100016110b6565b610e5b610100840135610272565b610ea75760405162461bcd60e51b815260206004820152601b60248201527f496e76616c6964206d61696c736572766572206b6579206861736800000000006044820152606401610cba565b5f610eb984610100016005600a611197565b90506003604051610eca9190611a7d565b604051809103902081604051602001610ee39190611aef565b6040516020818303038152906040528051906020012014610f465760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420656d61696c2066726f6d20616464726573730000000000006044820152606401610cba565b610f7584604051602001610f5a9190611b0a565b60405160208183030381529060405280519060200120611267565b505050610240013590565b610f8861100e565b6001600160a01b038116610fed5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610cba565b61033881611067565b610ffe61100e565b600361100a8282611b8c565b5050565b5f546001600160a01b031633146102f45760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610cba565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6040805160208481013581830152848301358284015260608086013581840152608080870135818501528451808503909101815260a084018552805190830120853560c08501528583013560e08501528585013561010085015290850135610120808501919091528451808503909101815261014090930190935281519101208082146111915760405162461bcd60e51b815260206004820152602360248201527f496e76616c696420696e7465726d656469617465206f72206f757470757420686044820152620c2e6d60eb1b6064820152608401610cba565b50505050565b60605f6111a48484611c60565b60ff1667ffffffffffffffff8111156111bf576111bf6118cd565b6040519080825280602002602001820160405280156111e8578160200160208202803683370190505b50905060ff84165b8360ff16811015611243578581600b811061120d5761120d611a69565b60200201358261122060ff881684611c79565b8151811061123057611230611a69565b60209081029190910101526001016111f0565b5061125e600782516112559190611c8c565b82906007611374565b95945050505050565b60025460405163169394bb60e01b8152600481018390526001600160a01b039091169063169394bb90602401602060405180830381865afa1580156112ae573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112d2919061198c565b1561131f5760405162461bcd60e51b815260206004820152601f60248201527f4e756c6c69666965722068617320616c7265616479206265656e2075736564006044820152606401610cba565b600254604051632dea6f9960e11b8152600481018390526001600160a01b0390911690635bd4df32906024015f604051808303815f87803b158015611362575f80fd5b505af115801561039a573d5f803e3d5ffd5b60605f808386516113859190611c8c565b67ffffffffffffffff81111561139d5761139d6118cd565b6040519080825280601f01601f1916602001820160405280156113c7576020820181803683370190505b5090505f805b87518161ffff161015611561575f888261ffff16815181106113f1576113f1611a69565b602002602001015190505f8767ffffffffffffffff811115611415576114156118cd565b60405190808252806020026020018201604052801561143e578160200160208202803683370190505b5090505f5b8881101561148557611456816008611c8c565b83901c82828151811061146b5761146b611a69565b60ff90921660209283029190910190910152600101611443565b505f5b8881101561154b575f8282815181106114a3576114a3611a69565b602002602001015160ff169050805f14611518578060f81b8787815181106114cd576114cd611a69565b60200101906001600160f81b03191690815f1a905350856114ed81611ca3565b96506114fc9050600289611cbb565b60ff165f0361151357611510600189611ce8565b97505b61153b565b611523600289611cbb565b60ff1660010361153b57611538600189611ce8565b97505b5060089290921c91600101611488565b505050808061155990611d01565b9150506113cd565b5060018360ff1610156116025760405162461bcd60e51b815260206004820152605760248201527f4e6f207061636b656420627974657320666f756e642120496e76616c6964206660448201527f696e616c207374617465206f66207061636b656420627974657320696e20656d60648201527f61696c3b2076616c7565206973206c696b656c79203021000000000000000000608482015260a401610cba565b858111156116705760405162461bcd60e51b815260206004820152603560248201527f5061636b6564206279746573206d6f7265207468616e20616c6c6f776564206d6044820152746178206e756d626572206f66207369676e616c732160581b6064820152608401610cba565b5f61167a83611686565b98975050505050505050565b805160609082905f5b82518110156116cf578281815181106116aa576116aa611a69565b01602001516001600160f81b0319165f036116c7578091506116cf565b60010161168f565b505f8167ffffffffffffffff8111156116ea576116ea6118cd565b6040519080825280601f01601f191660200182016040528015611714576020820181803683370190505b5090505f5b8281101561176e5783818151811061173357611733611a69565b602001015160f81c60f81b82828151811061175057611750611a69565b60200101906001600160f81b03191690815f1a905350600101611719565b50949350505050565b5f60208284031215611787575f80fd5b5035919050565b80604081018310156102dd575f80fd5b5f805f806102608086880312156117b3575f80fd5b6117bd878761178e565b945060c08601878111156117cf575f80fd5b6040870194506117df888261178e565b9350508681870111156117f0575f80fd5b50929591945092610100019150565b5f5b83811015611819578181015183820152602001611801565b50505f910152565b602081525f825180602084015261183f8160408501602087016117ff565b601f01601f19169190910160400192915050565b6001600160a01b0381168114610338575f80fd5b5f60208284031215611877575f80fd5b813561188281611853565b9392505050565b5f808284036103e081121561189c575f80fd5b610260808212156118ab575f80fd5b84935061018061025f19830112156118c1575f80fd5b92959390920193505050565b634e487b7160e01b5f52604160045260245ffd5b5f602082840312156118f1575f80fd5b813567ffffffffffffffff80821115611908575f80fd5b818401915084601f83011261191b575f80fd5b81358181111561192d5761192d6118cd565b604051601f8201601f19908116603f01168101908382118183101715611955576119556118cd565b8160405282815287602084870101111561196d575f80fd5b826020860160208301375f928101602001929092525095945050505050565b5f6020828403121561199c575f80fd5b81518015158114611882575f80fd5b600181811c908216806119bf57607f821691505b6020821081036119dd57634e487b7160e01b5f52602260045260245ffd5b50919050565b805f5b6002811015611191576040808386379384019391909101906001016119e6565b61026081016040868337611a1d60408301866119e3565b60408460c08401376101608361010084013795945050505050565b61018081016040868337611a4f60408301866119e3565b60408460c084013760808361010084013795945050505050565b634e487b7160e01b5f52603260045260245ffd5b5f808354611a8a816119ab565b60018281168015611aa25760018114611ab757611ae3565b60ff1984168752821515830287019450611ae3565b875f526020805f205f5b85811015611ada5781548a820152908401908201611ac1565b50505082870194505b50929695505050505050565b5f8251611b008184602087016117ff565b9190910192915050565b61026081016040838337611b2460408301604085016119e3565b604060c0840160c0840137610100610160818501828501375092915050565b601f821115611b8757805f5260205f20601f840160051c81016020851015611b685750805b601f840160051c820191505b8181101561039a575f8155600101611b74565b505050565b815167ffffffffffffffff811115611ba657611ba66118cd565b611bba81611bb484546119ab565b84611b43565b602080601f831160018114611bed575f8415611bd65750858301515b5f19600386901b1c1916600185901b178555611c44565b5f85815260208120601f198616915b82811015611c1b57888601518255948401946001909101908401611bfc565b5085821015611c3857878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b634e487b7160e01b5f52601160045260245ffd5b60ff82811682821603908111156102dd576102dd611c4c565b818103818111156102dd576102dd611c4c565b80820281158282048414176102dd576102dd611c4c565b5f60018201611cb457611cb4611c4c565b5060010190565b5f60ff831680611cd957634e487b7160e01b5f52601260045260245ffd5b8060ff84160691505092915050565b60ff81811683821601908111156102dd576102dd611c4c565b5f61ffff808316818103611d1757611d17611c4c565b600101939250505056fea26469706673582212208534b2d4c58802be40f868c873108b2a05bd8c1c1760a1e9bfb7bc5303a0b97564736f6c63430008180033", + "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/ramps/garanti/GarantiRegistrationProcessor.sol:GarantiRegistrationProcessor", + "label": "_owner", + "offset": 0, + "slot": "0", + "type": "t_address" + }, + { + "astId": 6068, + "contract": "contracts/ramps/garanti/GarantiRegistrationProcessor.sol:GarantiRegistrationProcessor", + "label": "mailServerKeyHashAdapter", + "offset": 0, + "slot": "1", + "type": "t_contract(IKeyHashAdapterV2)6431" + }, + { + "astId": 6071, + "contract": "contracts/ramps/garanti/GarantiRegistrationProcessor.sol:GarantiRegistrationProcessor", + "label": "nullifierRegistry", + "offset": 0, + "slot": "2", + "type": "t_contract(INullifierRegistry)6636" + }, + { + "astId": 6073, + "contract": "contracts/ramps/garanti/GarantiRegistrationProcessor.sol:GarantiRegistrationProcessor", + "label": "emailFromAddress", + "offset": 0, + "slot": "3", + "type": "t_bytes_storage" + }, + { + "astId": 6075, + "contract": "contracts/ramps/garanti/GarantiRegistrationProcessor.sol:GarantiRegistrationProcessor", + "label": "timestampBuffer", + "offset": 0, + "slot": "4", + "type": "t_uint256" + }, + { + "astId": 9034, + "contract": "contracts/ramps/garanti/GarantiRegistrationProcessor.sol:GarantiRegistrationProcessor", + "label": "bodyHashVerifier", + "offset": 0, + "slot": "5", + "type": "t_contract(IGarantiBodySuffixHashVerifier)9706" + } + ], + "types": { + "t_address": { + "encoding": "inplace", + "label": "address", + "numberOfBytes": "20" + }, + "t_bytes_storage": { + "encoding": "bytes", + "label": "bytes", + "numberOfBytes": "32" + }, + "t_contract(IGarantiBodySuffixHashVerifier)9706": { + "encoding": "inplace", + "label": "contract IGarantiBodySuffixHashVerifier", + "numberOfBytes": "20" + }, + "t_contract(IKeyHashAdapterV2)6431": { + "encoding": "inplace", + "label": "contract IKeyHashAdapterV2", + "numberOfBytes": "20" + }, + "t_contract(INullifierRegistry)6636": { + "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/deployments/encifher/GarantiSendProcessor.json b/contracts/deployments/encifher/GarantiSendProcessor.json new file mode 100644 index 000000000..1d53f3f10 --- /dev/null +++ b/contracts/deployments/encifher/GarantiSendProcessor.json @@ -0,0 +1,534 @@ +{ + "address": "0x86b3E65Cdd7f9321118D5d4901A9800200C11b8a", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_ramp", + "type": "address" + }, + { + "internalType": "contract IKeyHashAdapterV2", + "name": "_garantiMailserverKeyHashAdapter", + "type": "address" + }, + { + "internalType": "contract INullifierRegistry", + "name": "_nullifierRegistry", + "type": "address" + }, + { + "internalType": "contract IGarantiBodySuffixHashVerifier", + "name": "_bodyHashVerifier", + "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": "bodyHashVerifier", + "outputs": [ + { + "internalType": "contract IGarantiBodySuffixHashVerifier", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "emailFromAddress", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getEmailFromAddress", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_keyHash", + "type": "bytes32" + } + ], + "name": "isMailServerKeyHash", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "mailServerKeyHashAdapter", + "outputs": [ + { + "internalType": "contract IKeyHashAdapterV2", + "name": "", + "type": "address" + } + ], + "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[28]", + "name": "signals", + "type": "uint256[28]" + } + ], + "internalType": "struct IGarantiSendProcessor.SendProof", + "name": "_proof", + "type": "tuple" + }, + { + "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[4]", + "name": "signals", + "type": "uint256[4]" + } + ], + "internalType": "struct IGarantiBodySuffixHashVerifier.BodySuffixHashProof", + "name": "_bodyHashProof", + "type": "tuple" + } + ], + "name": "processProof", + "outputs": [ + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "timestamp", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "offRamperNameHash", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "offRamperIdHash", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "onRamperIdHash", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "intentHash", + "type": "bytes32" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "ramp", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "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": "contract IKeyHashAdapterV2", + "name": "_mailServerKeyHashAdapter", + "type": "address" + } + ], + "name": "setMailserverKeyHashAdapter", + "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[28]", + "name": "_pubSignals", + "type": "uint256[28]" + } + ], + "name": "verifyProof", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "transactionHash": "0x96ec4a44c833112c41ad8664b32caebea17cf775f872240bb52318efc2804972", + "receipt": { + "to": null, + "from": "0xa0Ee7A142d267C1f36714E4a8F75612F20a79720", + "contractAddress": "0x86b3E65Cdd7f9321118D5d4901A9800200C11b8a", + "transactionIndex": 0, + "gasUsed": "2194527", + "logsBloom": "0x00000000000000000000040000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000001000000000000000008000000000000000000020000000000000000000800000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000804000000020000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0x7e5b7c85c5e362ab0570e8d9c898d1b40c6f2d2a8eea47cbe8d7be9257e86f5c", + "transactionHash": "0x96ec4a44c833112c41ad8664b32caebea17cf775f872240bb52318efc2804972", + "logs": [ + { + "transactionIndex": 0, + "blockNumber": 61395, + "transactionHash": "0x96ec4a44c833112c41ad8664b32caebea17cf775f872240bb52318efc2804972", + "address": "0x86b3E65Cdd7f9321118D5d4901A9800200C11b8a", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x000000000000000000000000a0ee7a142d267c1f36714e4a8f75612f20a79720" + ], + "data": "0x", + "logIndex": 0, + "blockHash": "0x7e5b7c85c5e362ab0570e8d9c898d1b40c6f2d2a8eea47cbe8d7be9257e86f5c" + } + ], + "blockNumber": 61395, + "cumulativeGasUsed": "2194527", + "status": 1, + "byzantium": true + }, + "args": [ + "0x25C74B7124baE93364213a6124a5e45bB0e98889", + "0xD18E3F31bD50B5c6e4cC740CB9Ca637F6eCC2944", + "0x4d8E02BBfCf205828A8352Af4376b165E123D7b0", + "0xE61a6e7442cE84072DB14423FfBBe2609908Ee38", + "garanti@info.garantibbva.com.tr", + "30" + ], + "numDeployments": 1, + "solcInputHash": "75b8f55da346d7ed99a350632554d2fb", + "metadata": "{\"compiler\":{\"version\":\"0.8.24+commit.e11b9ed9\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_ramp\",\"type\":\"address\"},{\"internalType\":\"contract IKeyHashAdapterV2\",\"name\":\"_garantiMailserverKeyHashAdapter\",\"type\":\"address\"},{\"internalType\":\"contract INullifierRegistry\",\"name\":\"_nullifierRegistry\",\"type\":\"address\"},{\"internalType\":\"contract IGarantiBodySuffixHashVerifier\",\"name\":\"_bodyHashVerifier\",\"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\":\"bodyHashVerifier\",\"outputs\":[{\"internalType\":\"contract IGarantiBodySuffixHashVerifier\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"emailFromAddress\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getEmailFromAddress\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_keyHash\",\"type\":\"bytes32\"}],\"name\":\"isMailServerKeyHash\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"mailServerKeyHashAdapter\",\"outputs\":[{\"internalType\":\"contract IKeyHashAdapterV2\",\"name\":\"\",\"type\":\"address\"}],\"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[28]\",\"name\":\"signals\",\"type\":\"uint256[28]\"}],\"internalType\":\"struct IGarantiSendProcessor.SendProof\",\"name\":\"_proof\",\"type\":\"tuple\"},{\"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[4]\",\"name\":\"signals\",\"type\":\"uint256[4]\"}],\"internalType\":\"struct IGarantiBodySuffixHashVerifier.BodySuffixHashProof\",\"name\":\"_bodyHashProof\",\"type\":\"tuple\"}],\"name\":\"processProof\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"offRamperNameHash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"offRamperIdHash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"onRamperIdHash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"intentHash\",\"type\":\"bytes32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ramp\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"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\":\"contract IKeyHashAdapterV2\",\"name\":\"_mailServerKeyHashAdapter\",\"type\":\"address\"}],\"name\":\"setMailserverKeyHashAdapter\",\"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[28]\",\"name\":\"_pubSignals\",\"type\":\"uint256[28]\"}],\"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/ramps/garanti/GarantiSendProcessor.sol\":\"GarantiSendProcessor\"},\"evmVersion\":\"shanghai\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"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 v4.4.1 (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\",\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"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/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/processors/BaseProcessorV2.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\n\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\nimport { IKeyHashAdapterV2 } from \\\"./keyHashAdapters/IKeyHashAdapterV2.sol\\\";\\nimport { INullifierRegistry } from \\\"./nullifierRegistries/INullifierRegistry.sol\\\";\\n\\npragma solidity ^0.8.18;\\n\\ncontract BaseProcessorV2 is Ownable {\\n\\n /* ============ Modifiers ============ */\\n modifier onlyRamp() {\\n require(msg.sender == ramp, \\\"Only Ramp can call this function\\\");\\n _;\\n }\\n\\n /* ============ State Variables ============ */\\n address public immutable ramp;\\n IKeyHashAdapterV2 public mailServerKeyHashAdapter;\\n INullifierRegistry public nullifierRegistry;\\n bytes public emailFromAddress;\\n uint256 public timestampBuffer;\\n\\n /* ============ Constructor ============ */\\n constructor(\\n address _ramp,\\n IKeyHashAdapterV2 _mailServerKeyHashAdapter,\\n INullifierRegistry _nullifierRegistry,\\n string memory _emailFromAddress,\\n uint256 _timestampBuffer\\n )\\n Ownable()\\n {\\n ramp = _ramp;\\n mailServerKeyHashAdapter = _mailServerKeyHashAdapter;\\n nullifierRegistry = _nullifierRegistry;\\n emailFromAddress = bytes(_emailFromAddress);\\n timestampBuffer = _timestampBuffer;\\n }\\n\\n /* ============ External Functions ============ */\\n\\n function setMailserverKeyHashAdapter(IKeyHashAdapterV2 _mailServerKeyHashAdapter) external onlyOwner {\\n mailServerKeyHashAdapter = _mailServerKeyHashAdapter;\\n }\\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 function isMailServerKeyHash(bytes32 _keyHash) public view returns (bool) {\\n return IKeyHashAdapterV2(mailServerKeyHashAdapter).isMailServerKeyHash(_keyHash);\\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\":\"0x207174fcbbfa8d2de65a5a5665f05e3f2d668f7df33b682a0f139c967dd3f6be\",\"license\":\"MIT\"},\"contracts/processors/keyHashAdapters/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/processors/nullifierRegistries/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/ramps/garanti/GarantiSendProcessor.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\n\\nimport { StringUtils } from \\\"@zk-email/contracts/utils/StringUtils.sol\\\";\\n\\nimport { BaseProcessorV2 } from \\\"../../processors/BaseProcessorV2.sol\\\";\\nimport { Groth16Verifier } from \\\"../../verifiers/garanti_send_verifier.sol\\\";\\nimport { IGarantiBodySuffixHashVerifier } from \\\"./interfaces/IGarantiBodySuffixHashVerifier.sol\\\";\\nimport { IGarantiSendProcessor } from \\\"./interfaces/IGarantiSendProcessor.sol\\\";\\nimport { IKeyHashAdapterV2 } from \\\"../../processors/keyHashAdapters/IKeyHashAdapterV2.sol\\\";\\nimport { INullifierRegistry } from \\\"../../processors/nullifierRegistries/INullifierRegistry.sol\\\";\\nimport { StringConversionUtils } from \\\"../../lib/StringConversionUtils.sol\\\";\\n\\npragma solidity ^0.8.18;\\n\\ncontract GarantiSendProcessor is Groth16Verifier, IGarantiSendProcessor, BaseProcessorV2 {\\n \\n using StringUtils for uint256[];\\n using StringConversionUtils for string;\\n\\n /* ============ Constants ============ */\\n uint256 constant PACK_SIZE = 7;\\n\\n /* ============ Public Variables ============ */\\n IGarantiBodySuffixHashVerifier public bodyHashVerifier;\\n\\n /* ============ Constructor ============ */\\n constructor(\\n address _ramp,\\n IKeyHashAdapterV2 _garantiMailserverKeyHashAdapter,\\n INullifierRegistry _nullifierRegistry,\\n IGarantiBodySuffixHashVerifier _bodyHashVerifier,\\n string memory _emailFromAddress,\\n uint256 _timestampBuffer\\n )\\n Groth16Verifier()\\n BaseProcessorV2(\\n _ramp,\\n _garantiMailserverKeyHashAdapter,\\n _nullifierRegistry,\\n _emailFromAddress,\\n _timestampBuffer\\n )\\n {\\n bodyHashVerifier = _bodyHashVerifier;\\n }\\n \\n /* ============ External Functions ============ */\\n function processProof(\\n IGarantiSendProcessor.SendProof calldata _proof,\\n IGarantiBodySuffixHashVerifier.BodySuffixHashProof calldata _bodyHashProof\\n )\\n public\\n override\\n onlyRamp\\n returns(\\n uint256 amount,\\n uint256 timestamp,\\n bytes32 offRamperNameHash,\\n bytes32 offRamperIdHash,\\n bytes32 onRamperIdHash,\\n bytes32 intentHash\\n )\\n {\\n require(this.verifyProof(_proof.a, _proof.b, _proof.c, _proof.signals), \\\"Invalid Proof\\\"); // checks effects iteractions, this should come first\\n require(\\n bodyHashVerifier.verifyProof(_bodyHashProof.a, _bodyHashProof.b, _bodyHashProof.c, _bodyHashProof.signals),\\n \\\"Invalid body hash proof\\\"\\n );\\n\\n _validateIntermediateHash(_proof.signals, _bodyHashProof.signals);\\n\\n require(isMailServerKeyHash(bytes32(_proof.signals[0])), \\\"Invalid mailserver key hash\\\");\\n\\n // Signals [5:10] are the packed from email address\\n string memory fromEmail = _parseSignalArray(_proof.signals, 5, 10);\\n require(keccak256(abi.encodePacked(fromEmail)) == keccak256(emailFromAddress), \\\"Invalid email from address\\\");\\n\\n // Signals [17:19] is the packed amount, since this is a USDC amount we want to make sure the returned number is\\n // properly padded to 6 decimals. If the parsed has more than 6 figures to the right of the decimal it will revert\\n amount = _parseSignalArray(_proof.signals, 23, 25).stringToUint(0x2C, 6);\\n\\n // Signals [10:12] are the packed timestamp, the timestamp is returned as a string in the format, that we need to\\n // parse and convert to a unix timestamp\\n // Add the buffer to build in flexibility with L2 timestamps\\n timestamp = _parseSignalArray(_proof.signals, 10, 12).stringToUint(0) + timestampBuffer;\\n\\n // Signals [19] is the packed onRamperIdHash\\n onRamperIdHash = bytes32(_proof.signals[25]);\\n\\n // Signals [12:17] is the packed name of the Garanti account owner which must be hashed to get the offRamperNameHash\\n offRamperNameHash = keccak256(abi.encodePacked(_parseSignalArray(_proof.signals, 12, 18)));\\n\\n // Signals [12:17] is the packed IBAN number which must be hashed to get the offRamperIdHash\\n offRamperIdHash = keccak256(abi.encodePacked(_parseSignalArray(_proof.signals, 18, 23)));\\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[26]));\\n\\n // Signals [14] is intentHash\\n intentHash = bytes32(_proof.signals[27]);\\n }\\n \\n /* ============ Internal Functions ============ */\\n\\n function _parseSignalArray(uint256[28] calldata _signals, uint8 _from, uint8 _to) internal pure returns (string memory) {\\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 function _validateIntermediateHash(uint256[28] calldata _sendSignals, uint256[4] calldata _bodyHashSignals) internal pure {\\n bytes32 intermediateHash = keccak256(abi.encode(_sendSignals[1], _sendSignals[2], _sendSignals[3], _sendSignals[4]));\\n bytes32 inputHash = keccak256(abi.encode(_bodyHashSignals[0], _bodyHashSignals[1], _bodyHashSignals[2], _bodyHashSignals[3]));\\n require(intermediateHash == inputHash, \\\"Invalid intermediate or output hash\\\");\\n }\\n}\\n\",\"keccak256\":\"0x81ae73e29bc87913b8746b041a6d208c3d0fedd21f80d42be44546d8e19ef10f\",\"license\":\"MIT\"},\"contracts/ramps/garanti/interfaces/IGarantiBodySuffixHashVerifier.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.18;\\n\\ninterface IGarantiBodySuffixHashVerifier {\\n\\n struct BodySuffixHashProof {\\n uint256[2] a;\\n uint256[2][2] b;\\n uint256[2] c;\\n uint256[4] signals;\\n }\\n\\n function verifyProof(\\n uint[2] calldata _pA,\\n uint[2][2] calldata _pB,\\n uint[2] calldata _pC,\\n uint[4] calldata _pubSignals\\n )\\n external\\n view\\n returns (bool);\\n}\\n\",\"keccak256\":\"0x0905608291062ba9262aa3aac9434df6150243ad61d2dba863ac695c97db36d3\",\"license\":\"MIT\"},\"contracts/ramps/garanti/interfaces/IGarantiSendProcessor.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.18;\\n\\nimport { IGarantiBodySuffixHashVerifier } from \\\"./IGarantiBodySuffixHashVerifier.sol\\\";\\n\\ninterface IGarantiSendProcessor {\\n\\n struct SendProof {\\n uint256[2] a;\\n uint256[2][2] b;\\n uint256[2] c;\\n uint256[28] signals;\\n }\\n\\n function processProof(\\n SendProof calldata _proof,\\n IGarantiBodySuffixHashVerifier.BodySuffixHashProof calldata _bodyHashProof\\n )\\n external\\n returns(uint256, uint256, bytes32, bytes32, bytes32, bytes32);\\n}\\n\",\"keccak256\":\"0x70a70e2bf4861b7095bff34a55b10da9bc705735e40bed6104e179c0ecc3da25\",\"license\":\"MIT\"},\"contracts/verifiers/garanti_send_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 = 16343044642992925849324144222241208767090826466619068823722193270756586862401;\\n uint256 constant deltax2 = 10314194466904948834262239669041981907722654474458582136706961656951325286580;\\n uint256 constant deltay1 = 18870959210104009605384605724613549900634110254044850171595460926756475612559;\\n uint256 constant deltay2 = 20925792905154616635554201642170069367235560764483397919960492041377193399415;\\n\\n \\n uint256 constant IC0x = 16279736454292033378580080582261180344588543377812411740103484792347015356622;\\n uint256 constant IC0y = 803733000626129867641117797978078317549395205362063131280860756724996638023;\\n \\n uint256 constant IC1x = 5619211177410198973702607025162236734773579252262834151760411624196842318554;\\n uint256 constant IC1y = 15681435570112682455420063796287496568176754470688920089793013849736514435508;\\n \\n uint256 constant IC2x = 5717814455265966580691161694191686582106132906777222823293831790775696595822;\\n uint256 constant IC2y = 7288198057139032054533375522924224835499925739466115677964293122948640493060;\\n \\n uint256 constant IC3x = 11719874491549074336746418596127831936593847863714866444448223031713643812414;\\n uint256 constant IC3y = 3896921643091289790188930365771248018546305504721622929270212144308780835428;\\n \\n uint256 constant IC4x = 16934638514464830968323332218909199124530296213903795969456913426832964661346;\\n uint256 constant IC4y = 19219084029045271363030542000358821303054800197657303997612890875588511097378;\\n \\n uint256 constant IC5x = 21433322676719947948419816354200354171932787369257885135630906528192815911568;\\n uint256 constant IC5y = 15498974494399429179225623039072826422890776979301626083872919197439857331783;\\n \\n uint256 constant IC6x = 19791360312577802765870043762144676029009513261081081551634408233199622166897;\\n uint256 constant IC6y = 19833757387208994290140152520904701847141710351997160555863681935452894633990;\\n \\n uint256 constant IC7x = 11812987319798762911565293502198240965361030266171903511793751983047671339267;\\n uint256 constant IC7y = 3362118538113056304065427216001833533279308090045141448508689267731951424922;\\n \\n uint256 constant IC8x = 3657617595416795675551564184500064160630109848673253434901020037985236883321;\\n uint256 constant IC8y = 7212064867888157055116070351675888907682605134292867650646453862420866384926;\\n \\n uint256 constant IC9x = 2751759577697788291515493518584254550958879092432516239681454344732308836675;\\n uint256 constant IC9y = 17395718658677435768781780150392352856658297249604860622676183225242767693766;\\n \\n uint256 constant IC10x = 11558057052303902400059702043280340777083666103888311295557744738942786146876;\\n uint256 constant IC10y = 21030565793076706653087540750237162719144743600115243962610282019181365614469;\\n \\n uint256 constant IC11x = 211290016040205171000789973300768147213249959649767730538575620641807752262;\\n uint256 constant IC11y = 14074251329913641447383549058545049618774236675214643503129059817355211685945;\\n \\n uint256 constant IC12x = 5007882212908576436870074686757285949917671554669174089445073689337366116032;\\n uint256 constant IC12y = 8210959292191381885861754575475610556426433048220439915161269333131257813130;\\n \\n uint256 constant IC13x = 13293719279090013504236450573751283305572177027415191811669599490547722825726;\\n uint256 constant IC13y = 8394737425044468237637593002772009401923423400600154508468919657373196692829;\\n \\n uint256 constant IC14x = 17849795851187379032917708589772528668451956196405749334825448419860699439305;\\n uint256 constant IC14y = 20196166092660826205542664729835753060825163009279265243562561763561842525422;\\n \\n uint256 constant IC15x = 17368992658991284229859666999462406799966588789284178471226211727121441855077;\\n uint256 constant IC15y = 19638423699585201994958334447594876287044896849536887922062219468095291438511;\\n \\n uint256 constant IC16x = 19654713907060319277441312033604826926154173819497970431557465349988247571915;\\n uint256 constant IC16y = 3817298700918036836886147395996118992183906216420518826507097883667875267292;\\n \\n uint256 constant IC17x = 7715044101419724963760869030711123766888906257960572330606070125777728578096;\\n uint256 constant IC17y = 2749100633169600021571256078032739990539406582409355713895084604499131892503;\\n \\n uint256 constant IC18x = 1173364949775522746248454406902101588760396247931949401978732835369488287447;\\n uint256 constant IC18y = 9162940134343148423841367568602434228374502231432445416424257085827811468306;\\n \\n uint256 constant IC19x = 8575038783593555420096523497046480724134527603142091243347577907184483020590;\\n uint256 constant IC19y = 3995032950668712745213557428894999127778473468206002684518315008696369722974;\\n \\n uint256 constant IC20x = 16279031557779536503297581695798771201855657790427788979382231118751393888831;\\n uint256 constant IC20y = 11912095810291450993597456027203060366509629970620014777813772359854497244336;\\n \\n uint256 constant IC21x = 497943037882247940402571514635505206539213343750949867327216752909870789343;\\n uint256 constant IC21y = 14079819629540574449052320474177348262506545728548218346242372754966492347379;\\n \\n uint256 constant IC22x = 2466234520097193073740775906158395638512443576205561976749084142029636175391;\\n uint256 constant IC22y = 106854436093524765859901864629893863994296607336300054760758587613638113109;\\n \\n uint256 constant IC23x = 10223460436131205976086221904034407754257122156968155547422280250210902765374;\\n uint256 constant IC23y = 10646352474369269228971861663558957719664548073963349507349868931039896494345;\\n \\n uint256 constant IC24x = 7262802786186402103264187138606829015445409360219261120109243327566500881725;\\n uint256 constant IC24y = 18331284185744023511439764643398593091927871820445384971993219024493909818118;\\n \\n uint256 constant IC25x = 13551021044771273396960595497281785961547884026117011307870286500103178948328;\\n uint256 constant IC25y = 4186342654966538951118943039446911387678070729114812060402041727621399406368;\\n \\n uint256 constant IC26x = 15441069578651304978207067953794626204821594755773027544683951205991389396614;\\n uint256 constant IC26y = 17560455184568150998457976400911956640491317398464001157951114666917781447625;\\n \\n uint256 constant IC27x = 7943633557899190383766787269575005363322575426463196731233157476227666177399;\\n uint256 constant IC27y = 4879497724217437831661729305237201086591299485711452428791616388363643489471;\\n \\n uint256 constant IC28x = 76528467087185644481693720110962395284170988413766942453585983860142660820;\\n uint256 constant IC28y = 14004039488612212499780635126224013900123007327247416988670721391551869445987;\\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[28] calldata _pubSignals) public view returns (bool) {\\n assembly {\\n function checkField(v) {\\n if iszero(lt(v, q)) {\\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 g1_mulAccC(_pVk, IC11x, IC11y, calldataload(add(pubSignals, 320)))\\n \\n g1_mulAccC(_pVk, IC12x, IC12y, calldataload(add(pubSignals, 352)))\\n \\n g1_mulAccC(_pVk, IC13x, IC13y, calldataload(add(pubSignals, 384)))\\n \\n g1_mulAccC(_pVk, IC14x, IC14y, calldataload(add(pubSignals, 416)))\\n \\n g1_mulAccC(_pVk, IC15x, IC15y, calldataload(add(pubSignals, 448)))\\n \\n g1_mulAccC(_pVk, IC16x, IC16y, calldataload(add(pubSignals, 480)))\\n \\n g1_mulAccC(_pVk, IC17x, IC17y, calldataload(add(pubSignals, 512)))\\n \\n g1_mulAccC(_pVk, IC18x, IC18y, calldataload(add(pubSignals, 544)))\\n \\n g1_mulAccC(_pVk, IC19x, IC19y, calldataload(add(pubSignals, 576)))\\n \\n g1_mulAccC(_pVk, IC20x, IC20y, calldataload(add(pubSignals, 608)))\\n \\n g1_mulAccC(_pVk, IC21x, IC21y, calldataload(add(pubSignals, 640)))\\n \\n g1_mulAccC(_pVk, IC22x, IC22y, calldataload(add(pubSignals, 672)))\\n \\n g1_mulAccC(_pVk, IC23x, IC23y, calldataload(add(pubSignals, 704)))\\n \\n g1_mulAccC(_pVk, IC24x, IC24y, calldataload(add(pubSignals, 736)))\\n \\n g1_mulAccC(_pVk, IC25x, IC25y, calldataload(add(pubSignals, 768)))\\n \\n g1_mulAccC(_pVk, IC26x, IC26y, calldataload(add(pubSignals, 800)))\\n \\n g1_mulAccC(_pVk, IC27x, IC27y, calldataload(add(pubSignals, 832)))\\n \\n g1_mulAccC(_pVk, IC28x, IC28y, calldataload(add(pubSignals, 864)))\\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 checkField(calldataload(add(_pubSignals, 352)))\\n \\n checkField(calldataload(add(_pubSignals, 384)))\\n \\n checkField(calldataload(add(_pubSignals, 416)))\\n \\n checkField(calldataload(add(_pubSignals, 448)))\\n \\n checkField(calldataload(add(_pubSignals, 480)))\\n \\n checkField(calldataload(add(_pubSignals, 512)))\\n \\n checkField(calldataload(add(_pubSignals, 544)))\\n \\n checkField(calldataload(add(_pubSignals, 576)))\\n \\n checkField(calldataload(add(_pubSignals, 608)))\\n \\n checkField(calldataload(add(_pubSignals, 640)))\\n \\n checkField(calldataload(add(_pubSignals, 672)))\\n \\n checkField(calldataload(add(_pubSignals, 704)))\\n \\n checkField(calldataload(add(_pubSignals, 736)))\\n \\n checkField(calldataload(add(_pubSignals, 768)))\\n \\n checkField(calldataload(add(_pubSignals, 800)))\\n \\n checkField(calldataload(add(_pubSignals, 832)))\\n \\n checkField(calldataload(add(_pubSignals, 864)))\\n \\n checkField(calldataload(add(_pubSignals, 896)))\\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\":\"0xc792f59c7816b5ce83fbdb4350c0efbf7272f4a9e862b5f2307666bae5d90d8c\",\"license\":\"GPL-3.0\"}},\"version\":1}", + "bytecode": "0x60a060405234801562000010575f80fd5b5060405162002ae338038062002ae3833981016040819052620000339162000136565b85858584846200004333620000bb565b6001600160a01b03858116608052600180546001600160a01b031990811687841617909155600280549091169185169190911790556003620000868382620002eb565b506004555050600580546001600160a01b0319166001600160a01b03969096169590951790945550620003b795505050505050565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b03811681146200011f575f80fd5b50565b634e487b7160e01b5f52604160045260245ffd5b5f805f805f8060c087890312156200014c575f80fd5b865162000159816200010a565b809650506020808801516200016e816200010a565b604089015190965062000181816200010a565b606089015190955062000194816200010a565b60808901519094506001600160401b0380821115620001b1575f80fd5b818a0191508a601f830112620001c5575f80fd5b815181811115620001da57620001da62000122565b604051601f8201601f19908116603f0116810190838211818310171562000205576200020562000122565b816040528281528d868487010111156200021d575f80fd5b5f93505b8284101562000240578484018601518185018701529285019262000221565b5f86848301015280975050505050505060a087015190509295509295509295565b600181811c908216806200027657607f821691505b6020821081036200029557634e487b7160e01b5f52602260045260245ffd5b50919050565b601f821115620002e657805f5260205f20601f840160051c81016020851015620002c25750805b601f840160051c820191505b81811015620002e3575f8155600101620002ce565b50505b505050565b81516001600160401b0381111562000307576200030762000122565b6200031f8162000318845462000261565b846200029b565b602080601f83116001811462000355575f84156200033d5750858301515b5f19600386901b1c1916600185901b178555620003af565b5f85815260208120601f198616915b82811015620003855788860151825594840194600190910190840162000364565b5085821015620003a357878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b60805161270c620003d75f395f8181610149015261029d015261270c5ff3fe608060405234801561000f575f80fd5b50600436106100fb575f3560e01c8063b2a3fda411610093578063d0b71f9911610063578063d0b71f991461023c578063dbac58211461024f578063f2fde38b14610266578063f6c7226b14610279575f80fd5b8063b2a3fda4146101f9578063b870676c1461020c578063c0d05fed1461021f578063ced1e97814610234575f80fd5b8063715018a6116100ce578063715018a6146101b95780638da5cb5b146101c35780639895e5b7146101d3578063a8ef333f146101e6575f80fd5b80630c44b277146100ff57806315d276e11461014457806319d09152146101835780635b2d12ea146101a6575b5f80fd5b61011261010d36600461206e565b61028c565b604080519687526020870195909552938501929092526060840152608083015260a082015260c0015b60405180910390f35b61016b7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161013b565b6101966101913660046120b2565b610680565b604051901515815260200161013b565b6101966101b43660046120d9565b6106f1565b6101c1611539565b005b5f546001600160a01b031661016b565b60055461016b906001600160a01b031681565b60015461016b906001600160a01b031681565b6101c16102073660046120b2565b61154c565b60025461016b906001600160a01b031681565b610227611559565b60405161013b919061215c565b6102276115e5565b6101c161024a3660046121a2565b611675565b61025860045481565b60405190815260200161013b565b6101c16102743660046121a2565b61169f565b6101c16102873660046121d1565b611715565b5f8080808080336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461030f5760405162461bcd60e51b815260206004820181905260248201527f4f6e6c792052616d702063616e2063616c6c20746869732066756e6374696f6e60448201526064015b60405180910390fd5b60408051632d96897560e11b81523091635b2d12ea91610342918c919082019060c083019061010084019060040161229f565b602060405180830381865afa15801561035d573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061038191906122d1565b6103bd5760405162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b210283937b7b360991b6044820152606401610306565b60055460408051635fe8c13b60e01b81526001600160a01b0390921691635fe8c13b916103fc918b9182019060c08301906101008401906004016122f0565b602060405180830381865afa158015610417573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061043b91906122d1565b6104875760405162461bcd60e51b815260206004820152601760248201527f496e76616c696420626f647920686173682070726f6f660000000000000000006044820152606401610306565b6104998861010001886101000161172d565b6104a7610100890135610680565b6104f35760405162461bcd60e51b815260206004820152601b60248201527f496e76616c6964206d61696c736572766572206b6579206861736800000000006044820152606401610306565b5f61050589610100016005600a61180e565b90506003604051610516919061236d565b60405180910390208160405160200161052f91906123df565b60405160208183030381529060405280519060200120146105925760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420656d61696c2066726f6d20616464726573730000000000006044820152606401610306565b6105b4600b60fa1b60066105ad6101008d016017601961180e565b91906118de565b96506004546105d45f6105ce8c61010001600a600c61180e565b90611ab0565b6105de919061240e565b955061042089013592506105f96101008a01600c601261180e565b60405160200161060991906123df565b60405160208183030381529060405280519060200120945061063289610100016012601761180e565b60405160200161064291906123df565b60408051808303601f190181529190528051602090910120935061066a6104408a0135611ac7565b5094979396929550909350916104609091013590565b600154604051630ce848a960e11b8152600481018390525f916001600160a01b0316906319d0915290602401602060405180830381865afa1580156106c7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106eb91906122d1565b92915050565b5f61138a565b7f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd478110610726575f805260205ff35b50565b5f60405183815284602082015285604082015260408160608360076107d05a03fa915081610759575f805260205ff35b825160408201526020830151606082015260408360808360066107d05a03fa91505080610788575f805260205ff35b5050505050565b7f23fe0119e0d86d98fef3296d3987953338f409989ee0d25c2e6f65f1ac69a0ce85527f01c6e591e4f2be7957d3c4d6e6a4bc56531b0b5853fae4cbbb9979dc3fb4054760208601525f608086018661082b87357f22ab60c4aec5bc92a88fb158ea2f8650a673a4c6b22d1129ac1d00be9390f9b47f0c6c5c5e9cd44842f22ea4148cb673cd03856d7a1470fcbadeedfc16e4fdeada84610729565b61087b60208801357f101cf9529c1420aba7bd89319bbe0a2d90c912fdfc582d65c26d563341eb4e047f0ca42b1575a9a329c09d91b81f8b84c130808565de3467e32e109ac740ab9b6e84610729565b6108cb60408801357f089d945945e413f66f09d7d05eced536c1b1c76af63307988e5602c5fa18a2647f19e936c17e4e70f8d4a74a0c5d3c0b6ca8882523a94617e4a8eed449efe2d63e84610729565b61091b60608801357f2a7d9db6e93fe306547d1509e3152be1ad664b5a56700e6d01e1b0ad177562227f2570aa6d600dcb3626e9bdedd465d8f4d67f1662ea70e514fcccdc37dbeb306284610729565b61096b60808801357f22441bd33d5f7d352f09f043001ead6d8dce01fe4f1e06f6d52a3ec025a50e477f2f62d4ab058625a42df361a06e432ea669df600b018d57a3cc9e06d3b323529084610729565b6109bb60a08801357f2bd98244eb34f527cddde82bc7ecd3d82572341b6723c7e204b4b13b4483a0067f2bc1835204d308c4560a3db92bffeb83d72eee6fcc8c286c5f46b11ff208197184610729565b610a0b60c08801357f076ee4439bed6ba9c0363880a2a678899b2ca3f4a8b60c954e4ef908658a959a7f1a1de9f43ef35c391fcc525fe1350dbf6158cb4b977402b318e7a69646b4d90384610729565b610a5b60e08801357f0ff1e251abd89fcb1a7d7933e30545ed1d70fdaa8aefaf38e4f0a8d7a03bc41e7f08162360d15cfd2c53d5ed4f2a5ced2cddc4ca82ce6094b2155d53bc9343177984610729565b610aac6101008801357f2675a0ba71a63d06d61dd6379583ad1c910138768349d0028ab3341a9ddd97c67f061570d382129dff2bac14d938281bc6c434663611bffd8ebae841e89b3a914384610729565b610afd6101208801357f2e7ee0dfebd18a5dce23ca2c9281caadd1e64d18a299c052a315130f01acd7857f198da0e315822dc430064816fa30bff8dc44b12dcaf3bb1f7969e1ed3d1f123c84610729565b610b4d6101408801357f1f1dbe73fe0b80437353249d8a85e029446996809fc833c20d4f2ce5298fc0397e7795fe454ffc3f3e74f9da55cdce061a5e0b00097ddc642b0ce7246bbd5c4684610729565b610b9e6101608801357f12273cff18addf941caf2bfcca416d3ff48b65a5c23f2470379ccc91c1a1988a7f0b125c630f757966a1277c4ba48ee8f917dc2355c9b0ae1e344611c66de4f6c084610729565b610bef6101808801357f128f40c4e75ffaad2b197a6a59752a2a47c91a4cca174dc0efab9f0286c52d5d7f1d63fa7d27b65bae515baf04e661a140a4f6c0429067223beb3b7ab4c36d2ffe84610729565b610c406101a08801357f2ca69ffae97a540015d7c340ba9d751bdddd22c1226e850f47b86fba3bc9c4ee7f2776a05d98ee9432c323b360cae02e275acf2a8d0af78ac0fee9e017c63c60c984610729565b610c916101c08801357f2b6af433c35897a0f9458c8c8dc529ae00bd2f485e0fd1eb1aa9c33510d8b5af7f26668060050e6db758e60e3b944075a05b1708c45c0a7b74609ddcf2e783966584610729565b610ce26101e08801357f087083b6345e3b3a634f91ebac116834623185ce32bee1b57b80bf249e5082dc7f2b742c812404bde4218c3c0d3830669c3bdaf023717c8c6e16342dcd7fae8dcb84610729565b610d336102008801357f0613ef91c62c4fe8695af930288e88015cb0db3f9421f9bd29da3675aa6403177f110e8f6a568e37356c1f05b9f063142461b41e4869e76784d10ef0c52c14223084610729565b610d846102208801357f14420a530bff2b7dbc9956771e90b019ca0035fcd22623c064145c7de21d64127f029819dce317f0ed390d1e4525fb803cd0594a5fc1cd708cc118bf8b46d906d784610729565b610dd56102408801357f08d51bc7ed9e0fa0a16095a14d1f08e59a542a37610dc382c154dba6021eb65e7f12f54cc9fc215b9665fcec7f0ea84278ccfdec9ce0721b3d54c8aad79dadaf2e84610729565b610e266102608801357f1a5601de789a9b9676133a0ca9c5db25d5a96113c9c975e7a102cec68848a4b07f23fd9af7d041dbb03d11a3431c72b5a460a1d36c9c8794d2d3b76093d6dbba3f84610729565b610e776102808801357f1f20e53fb46193851de0c5290fe68ef454d2c0aee9d718d3a26dc1b9a0d1fbf37f0119d365c9bd85d15ae0cfd05222329bedbd2b5af1152bb01a06fd6e927d72df84610729565b610ec76102a08801357e3c7a3b50dc6c29bbecafaf5c20327657603b3f5cdf7e1cfe0b9a872c8937557f0573d6da8283a957bede0e1d662a7826475a7f3503b61ce6731cda9e05b9061f84610729565b610f186102c08801357f17899f38cd9c61264b3a0b6bd8849bccb8d7752a18e26ac11d755f3dde8b61097f169a46074f60fe92e7e2f51c1cb9f1ef137bd9a056c3391eb9f6a7c656ce6f3e84610729565b610f696102e08801357f288723a08481f3ba64b49862bb693af72875ed303cba67d71d79ac19605ebb067f100e99c7a85374b98df7f70dee671d985be259cf23b941d97c9903742aec653d84610729565b610fba6103008801357f094162cf3f32de9b93a59ef13c9a33ac297fd5b803cd9a6b7c888510375d67207f1df59b2a12d7a478bb3abc00b26d86973722485658d0466c5bcb7136b8d00ee884610729565b61100b6103208801357f26d2dd8bcb721ddddf7a89fce7a8174360bfde331abacdcc4e95a544437623c97f222355ee8b12fd4b953be489ce7ac9e0c45c41ae9f9a3e818018a2ef27c8fe8684610729565b61105c6103408801357f0ac9b2a5b59662bfe8d866a43ff5280402ceaff7bf4d0d3321bd5cffb8238cbf7f118feff08485cffea53d0e5750f0cfad7d5f6415985d002708c0ba4cdb806d7784610729565b6110ac6103608801357f1ef601660e69a4d6b550f31e03b229bc114ae46a0dbc611a88c5f2b9da5d67637e2b50469bb49cfb2b946d134a99c282cb9ae18a70ce144bf7bbbe74be9e5cd484610729565b50823581527f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4760208401357f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4703066020820152833560408201526020840135606082015260408401356080820152606084013560a08201527f2d4d9aa7e302d9df41749d5507949d05dbea33fbb16c643b22f599a2be6df2e260c08201527f14bedd503c37ceb061d8ec60209fe345ce89830a19230301f076caff004d192660e08201527f0967032fcbf776d1afc985f88877f182d38480a653f2decaa9794cbc3bf3060c6101008201527f0e187847ad4c798374d0d6732bf501847dd68bc0e071241e0213bc7fc13db7ab6101208201527f304cfbd1e08a704a99f5e847d93f8c3caafddec46b7a0d379da69a4d112346a76101408201527f1739c1b1a457a8c7313123d24d2f9192f896b7c63eea05a9d57f06547ad0cec86101608201525f87015161018082015260205f018701516101a08201527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c26101c08201527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed6101e08201527f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b6102008201527f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa610220820152843561024082015260208501356102608201527f2421d5e11b841e97bba6ebf4f6c52f5e7068b4cac03cfe14b850dab7b03cb7416102808201527f16cda08f8f6fd30da8c340e73ad4829d593f0b6e9adddda9cf9e7992704f60b46102a08201527f29b8959bb7032f74cf68b6fd6b3ae134f46034af7754bff13dd000fb177fad8f6102c08201527f2e43943d84a2aa708872610f2ad74308fe43ac6599953f160297ad9fdac814776102e08201526020816103008360086107d05a03fa9051169695505050505050565b60405161038081016040526113a15f8401356106f7565b6113ae60208401356106f7565b6113bb60408401356106f7565b6113c860608401356106f7565b6113d560808401356106f7565b6113e260a08401356106f7565b6113ef60c08401356106f7565b6113fc60e08401356106f7565b61140a6101008401356106f7565b6114186101208401356106f7565b6114266101408401356106f7565b6114346101608401356106f7565b6114426101808401356106f7565b6114506101a08401356106f7565b61145e6101c08401356106f7565b61146c6101e08401356106f7565b61147a6102008401356106f7565b6114886102208401356106f7565b6114966102408401356106f7565b6114a46102608401356106f7565b6114b26102808401356106f7565b6114c06102a08401356106f7565b6114ce6102c08401356106f7565b6114dc6102e08401356106f7565b6114ea6103008401356106f7565b6114f86103208401356106f7565b6115066103408401356106f7565b6115146103608401356106f7565b6115226103808401356106f7565b61152f818486888a61078f565b9050805f5260205ff35b611541611bd4565b61154a5f611c2d565b565b611554611bd4565b600455565b6003805461156690612335565b80601f016020809104026020016040519081016040528092919081815260200182805461159290612335565b80156115dd5780601f106115b4576101008083540402835291602001916115dd565b820191905f5260205f20905b8154815290600101906020018083116115c057829003601f168201915b505050505081565b6060600380546115f490612335565b80601f016020809104026020016040519081016040528092919081815260200182805461162090612335565b801561166b5780601f106116425761010080835404028352916020019161166b565b820191905f5260205f20905b81548152906001019060200180831161164e57829003601f168201915b5050505050905090565b61167d611bd4565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6116a7611bd4565b6001600160a01b03811661170c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610306565b61072681611c2d565b61171d611bd4565b6003611729828261246a565b5050565b6040805160208481013581830152848301358284015260608086013581840152608080870135818501528451808503909101815260a084018552805190830120853560c08501528583013560e08501528585013561010085015290850135610120808501919091528451808503909101815261014090930190935281519101208082146118085760405162461bcd60e51b815260206004820152602360248201527f496e76616c696420696e7465726d656469617465206f72206f757470757420686044820152620c2e6d60eb1b6064820152608401610306565b50505050565b60605f61181b848461252a565b60ff1667ffffffffffffffff811115611836576118366121bd565b60405190808252806020026020018201604052801561185f578160200160208202803683370190505b50905060ff84165b8360ff168110156118ba578581601c811061188457611884612321565b60200201358261189760ff881684612543565b815181106118a7576118a7612321565b6020908102919091010152600101611867565b506118d5600782516118cc9190612556565b82906007611c7c565b95945050505050565b5f83818080805b8451811015611a2957603060f81b85828151811061190557611905612321565b01602001516001600160f81b031916108015906119465750603960f81b85828151811061193457611934612321565b01602001516001600160f81b03191611155b1561198957603085828151811061195f5761195f612321565b0160200151611971919060f81c612543565b61197c85600a612556565b611986919061240e565b93505b811561199d57826119998161256d565b9350505b876001600160f81b0319168582815181106119ba576119ba612321565b01602001516001600160f81b03191603611a21578115611a1c5760405162461bcd60e51b815260206004820152601c60248201527f537472696e6720686173206d756c7469706c6520646563696d616c73000000006044820152606401610306565b600191505b6001016118e5565b5085821115611a855760405162461bcd60e51b815260206004820152602260248201527f537472696e672068617320746f6f206d616e7920646563696d616c20706c6163604482015261657360f01b6064820152608401610306565b611a8f8287612543565b611a9a90600a612665565b611aa49084612556565b98975050505050505050565b5f611ac083601760f91b846118de565b9392505050565b60025460405163169394bb60e01b8152600481018390526001600160a01b039091169063169394bb90602401602060405180830381865afa158015611b0e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b3291906122d1565b15611b7f5760405162461bcd60e51b815260206004820152601f60248201527f4e756c6c69666965722068617320616c7265616479206265656e2075736564006044820152606401610306565b600254604051632dea6f9960e11b8152600481018390526001600160a01b0390911690635bd4df32906024015f604051808303815f87803b158015611bc2575f80fd5b505af1158015610788573d5f803e3d5ffd5b5f546001600160a01b0316331461154a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610306565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60605f80838651611c8d9190612556565b67ffffffffffffffff811115611ca557611ca56121bd565b6040519080825280601f01601f191660200182016040528015611ccf576020820181803683370190505b5090505f805b87518161ffff161015611e69575f888261ffff1681518110611cf957611cf9612321565b602002602001015190505f8767ffffffffffffffff811115611d1d57611d1d6121bd565b604051908082528060200260200182016040528015611d46578160200160208202803683370190505b5090505f5b88811015611d8d57611d5e816008612556565b83901c828281518110611d7357611d73612321565b60ff90921660209283029190910190910152600101611d4b565b505f5b88811015611e53575f828281518110611dab57611dab612321565b602002602001015160ff169050805f14611e20578060f81b878781518110611dd557611dd5612321565b60200101906001600160f81b03191690815f1a90535085611df58161256d565b9650611e049050600289612670565b60ff165f03611e1b57611e1860018961269d565b97505b611e43565b611e2b600289612670565b60ff16600103611e4357611e4060018961269d565b97505b5060089290921c91600101611d90565b5050508080611e61906126b6565b915050611cd5565b5060018360ff161015611f0a5760405162461bcd60e51b815260206004820152605760248201527f4e6f207061636b656420627974657320666f756e642120496e76616c6964206660448201527f696e616c207374617465206f66207061636b656420627974657320696e20656d60648201527f61696c3b2076616c7565206973206c696b656c79203021000000000000000000608482015260a401610306565b85811115611f785760405162461bcd60e51b815260206004820152603560248201527f5061636b6564206279746573206d6f7265207468616e20616c6c6f776564206d6044820152746178206e756d626572206f66207369676e616c732160581b6064820152608401610306565b5f611aa483805160609082905f5b8251811015611fc657828181518110611fa157611fa1612321565b01602001516001600160f81b0319165f03611fbe57809150611fc6565b600101611f86565b505f8167ffffffffffffffff811115611fe157611fe16121bd565b6040519080825280601f01601f19166020018201604052801561200b576020820181803683370190505b5090505f5b828110156120655783818151811061202a5761202a612321565b602001015160f81c60f81b82828151811061204757612047612321565b60200101906001600160f81b03191690815f1a905350600101612010565b50949350505050565b5f80828403610600811215612081575f80fd5b61048080821215612090575f80fd5b84935061018061047f19830112156120a6575f80fd5b92959390920193505050565b5f602082840312156120c2575f80fd5b5035919050565b80604081018310156106eb575f80fd5b5f805f806104808086880312156120ee575f80fd5b6120f887876120c9565b945060c086018781111561210a575f80fd5b60408701945061211a88826120c9565b93505086818701111561212b575f80fd5b50929591945092610100019150565b5f5b8381101561215457818101518382015260200161213c565b50505f910152565b602081525f825180602084015261217a81604085016020870161213a565b601f01601f19169190910160400192915050565b6001600160a01b0381168114610726575f80fd5b5f602082840312156121b2575f80fd5b8135611ac08161218e565b634e487b7160e01b5f52604160045260245ffd5b5f602082840312156121e1575f80fd5b813567ffffffffffffffff808211156121f8575f80fd5b818401915084601f83011261220b575f80fd5b81358181111561221d5761221d6121bd565b604051601f8201601f19908116603f01168101908382118183101715612245576122456121bd565b8160405282815287602084870101111561225d575f80fd5b826020860160208301375f928101602001929092525095945050505050565b805f5b60028110156118085760408083863793840193919091019060010161227f565b610480810160408683376122b6604083018661227c565b60408460c08401376103808361010084013795945050505050565b5f602082840312156122e1575f80fd5b81518015158114611ac0575f80fd5b61018081016040868337612307604083018661227c565b60408460c084013760808361010084013795945050505050565b634e487b7160e01b5f52603260045260245ffd5b600181811c9082168061234957607f821691505b60208210810361236757634e487b7160e01b5f52602260045260245ffd5b50919050565b5f80835461237a81612335565b6001828116801561239257600181146123a7576123d3565b60ff19841687528215158302870194506123d3565b875f526020805f205f5b858110156123ca5781548a8201529084019082016123b1565b50505082870194505b50929695505050505050565b5f82516123f081846020870161213a565b9190910192915050565b634e487b7160e01b5f52601160045260245ffd5b808201808211156106eb576106eb6123fa565b601f82111561246557805f5260205f20601f840160051c810160208510156124465750805b601f840160051c820191505b81811015610788575f8155600101612452565b505050565b815167ffffffffffffffff811115612484576124846121bd565b612498816124928454612335565b84612421565b602080601f8311600181146124cb575f84156124b45750858301515b5f19600386901b1c1916600185901b178555612522565b5f85815260208120601f198616915b828110156124f9578886015182559484019460019091019084016124da565b508582101561251657878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b60ff82811682821603908111156106eb576106eb6123fa565b818103818111156106eb576106eb6123fa565b80820281158282048414176106eb576106eb6123fa565b5f6001820161257e5761257e6123fa565b5060010190565b600181815b808511156125bf57815f19048211156125a5576125a56123fa565b808516156125b257918102915b93841c939080029061258a565b509250929050565b5f826125d5575060016106eb565b816125e157505f6106eb565b81600181146125f757600281146126015761261d565b60019150506106eb565b60ff841115612612576126126123fa565b50506001821b6106eb565b5060208310610133831016604e8410600b8410161715612640575081810a6106eb565b61264a8383612585565b805f190482111561265d5761265d6123fa565b029392505050565b5f611ac083836125c7565b5f60ff83168061268e57634e487b7160e01b5f52601260045260245ffd5b8060ff84160691505092915050565b60ff81811683821601908111156106eb576106eb6123fa565b5f61ffff8083168181036126cc576126cc6123fa565b600101939250505056fea2646970667358221220427926438d920519dfacfd131047ae605249ccd870e2719cbedeaa2b51ecf5eb64736f6c63430008180033", + "deployedBytecode": "0x608060405234801561000f575f80fd5b50600436106100fb575f3560e01c8063b2a3fda411610093578063d0b71f9911610063578063d0b71f991461023c578063dbac58211461024f578063f2fde38b14610266578063f6c7226b14610279575f80fd5b8063b2a3fda4146101f9578063b870676c1461020c578063c0d05fed1461021f578063ced1e97814610234575f80fd5b8063715018a6116100ce578063715018a6146101b95780638da5cb5b146101c35780639895e5b7146101d3578063a8ef333f146101e6575f80fd5b80630c44b277146100ff57806315d276e11461014457806319d09152146101835780635b2d12ea146101a6575b5f80fd5b61011261010d36600461206e565b61028c565b604080519687526020870195909552938501929092526060840152608083015260a082015260c0015b60405180910390f35b61016b7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161013b565b6101966101913660046120b2565b610680565b604051901515815260200161013b565b6101966101b43660046120d9565b6106f1565b6101c1611539565b005b5f546001600160a01b031661016b565b60055461016b906001600160a01b031681565b60015461016b906001600160a01b031681565b6101c16102073660046120b2565b61154c565b60025461016b906001600160a01b031681565b610227611559565b60405161013b919061215c565b6102276115e5565b6101c161024a3660046121a2565b611675565b61025860045481565b60405190815260200161013b565b6101c16102743660046121a2565b61169f565b6101c16102873660046121d1565b611715565b5f8080808080336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461030f5760405162461bcd60e51b815260206004820181905260248201527f4f6e6c792052616d702063616e2063616c6c20746869732066756e6374696f6e60448201526064015b60405180910390fd5b60408051632d96897560e11b81523091635b2d12ea91610342918c919082019060c083019061010084019060040161229f565b602060405180830381865afa15801561035d573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061038191906122d1565b6103bd5760405162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b210283937b7b360991b6044820152606401610306565b60055460408051635fe8c13b60e01b81526001600160a01b0390921691635fe8c13b916103fc918b9182019060c08301906101008401906004016122f0565b602060405180830381865afa158015610417573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061043b91906122d1565b6104875760405162461bcd60e51b815260206004820152601760248201527f496e76616c696420626f647920686173682070726f6f660000000000000000006044820152606401610306565b6104998861010001886101000161172d565b6104a7610100890135610680565b6104f35760405162461bcd60e51b815260206004820152601b60248201527f496e76616c6964206d61696c736572766572206b6579206861736800000000006044820152606401610306565b5f61050589610100016005600a61180e565b90506003604051610516919061236d565b60405180910390208160405160200161052f91906123df565b60405160208183030381529060405280519060200120146105925760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420656d61696c2066726f6d20616464726573730000000000006044820152606401610306565b6105b4600b60fa1b60066105ad6101008d016017601961180e565b91906118de565b96506004546105d45f6105ce8c61010001600a600c61180e565b90611ab0565b6105de919061240e565b955061042089013592506105f96101008a01600c601261180e565b60405160200161060991906123df565b60405160208183030381529060405280519060200120945061063289610100016012601761180e565b60405160200161064291906123df565b60408051808303601f190181529190528051602090910120935061066a6104408a0135611ac7565b5094979396929550909350916104609091013590565b600154604051630ce848a960e11b8152600481018390525f916001600160a01b0316906319d0915290602401602060405180830381865afa1580156106c7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106eb91906122d1565b92915050565b5f61138a565b7f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd478110610726575f805260205ff35b50565b5f60405183815284602082015285604082015260408160608360076107d05a03fa915081610759575f805260205ff35b825160408201526020830151606082015260408360808360066107d05a03fa91505080610788575f805260205ff35b5050505050565b7f23fe0119e0d86d98fef3296d3987953338f409989ee0d25c2e6f65f1ac69a0ce85527f01c6e591e4f2be7957d3c4d6e6a4bc56531b0b5853fae4cbbb9979dc3fb4054760208601525f608086018661082b87357f22ab60c4aec5bc92a88fb158ea2f8650a673a4c6b22d1129ac1d00be9390f9b47f0c6c5c5e9cd44842f22ea4148cb673cd03856d7a1470fcbadeedfc16e4fdeada84610729565b61087b60208801357f101cf9529c1420aba7bd89319bbe0a2d90c912fdfc582d65c26d563341eb4e047f0ca42b1575a9a329c09d91b81f8b84c130808565de3467e32e109ac740ab9b6e84610729565b6108cb60408801357f089d945945e413f66f09d7d05eced536c1b1c76af63307988e5602c5fa18a2647f19e936c17e4e70f8d4a74a0c5d3c0b6ca8882523a94617e4a8eed449efe2d63e84610729565b61091b60608801357f2a7d9db6e93fe306547d1509e3152be1ad664b5a56700e6d01e1b0ad177562227f2570aa6d600dcb3626e9bdedd465d8f4d67f1662ea70e514fcccdc37dbeb306284610729565b61096b60808801357f22441bd33d5f7d352f09f043001ead6d8dce01fe4f1e06f6d52a3ec025a50e477f2f62d4ab058625a42df361a06e432ea669df600b018d57a3cc9e06d3b323529084610729565b6109bb60a08801357f2bd98244eb34f527cddde82bc7ecd3d82572341b6723c7e204b4b13b4483a0067f2bc1835204d308c4560a3db92bffeb83d72eee6fcc8c286c5f46b11ff208197184610729565b610a0b60c08801357f076ee4439bed6ba9c0363880a2a678899b2ca3f4a8b60c954e4ef908658a959a7f1a1de9f43ef35c391fcc525fe1350dbf6158cb4b977402b318e7a69646b4d90384610729565b610a5b60e08801357f0ff1e251abd89fcb1a7d7933e30545ed1d70fdaa8aefaf38e4f0a8d7a03bc41e7f08162360d15cfd2c53d5ed4f2a5ced2cddc4ca82ce6094b2155d53bc9343177984610729565b610aac6101008801357f2675a0ba71a63d06d61dd6379583ad1c910138768349d0028ab3341a9ddd97c67f061570d382129dff2bac14d938281bc6c434663611bffd8ebae841e89b3a914384610729565b610afd6101208801357f2e7ee0dfebd18a5dce23ca2c9281caadd1e64d18a299c052a315130f01acd7857f198da0e315822dc430064816fa30bff8dc44b12dcaf3bb1f7969e1ed3d1f123c84610729565b610b4d6101408801357f1f1dbe73fe0b80437353249d8a85e029446996809fc833c20d4f2ce5298fc0397e7795fe454ffc3f3e74f9da55cdce061a5e0b00097ddc642b0ce7246bbd5c4684610729565b610b9e6101608801357f12273cff18addf941caf2bfcca416d3ff48b65a5c23f2470379ccc91c1a1988a7f0b125c630f757966a1277c4ba48ee8f917dc2355c9b0ae1e344611c66de4f6c084610729565b610bef6101808801357f128f40c4e75ffaad2b197a6a59752a2a47c91a4cca174dc0efab9f0286c52d5d7f1d63fa7d27b65bae515baf04e661a140a4f6c0429067223beb3b7ab4c36d2ffe84610729565b610c406101a08801357f2ca69ffae97a540015d7c340ba9d751bdddd22c1226e850f47b86fba3bc9c4ee7f2776a05d98ee9432c323b360cae02e275acf2a8d0af78ac0fee9e017c63c60c984610729565b610c916101c08801357f2b6af433c35897a0f9458c8c8dc529ae00bd2f485e0fd1eb1aa9c33510d8b5af7f26668060050e6db758e60e3b944075a05b1708c45c0a7b74609ddcf2e783966584610729565b610ce26101e08801357f087083b6345e3b3a634f91ebac116834623185ce32bee1b57b80bf249e5082dc7f2b742c812404bde4218c3c0d3830669c3bdaf023717c8c6e16342dcd7fae8dcb84610729565b610d336102008801357f0613ef91c62c4fe8695af930288e88015cb0db3f9421f9bd29da3675aa6403177f110e8f6a568e37356c1f05b9f063142461b41e4869e76784d10ef0c52c14223084610729565b610d846102208801357f14420a530bff2b7dbc9956771e90b019ca0035fcd22623c064145c7de21d64127f029819dce317f0ed390d1e4525fb803cd0594a5fc1cd708cc118bf8b46d906d784610729565b610dd56102408801357f08d51bc7ed9e0fa0a16095a14d1f08e59a542a37610dc382c154dba6021eb65e7f12f54cc9fc215b9665fcec7f0ea84278ccfdec9ce0721b3d54c8aad79dadaf2e84610729565b610e266102608801357f1a5601de789a9b9676133a0ca9c5db25d5a96113c9c975e7a102cec68848a4b07f23fd9af7d041dbb03d11a3431c72b5a460a1d36c9c8794d2d3b76093d6dbba3f84610729565b610e776102808801357f1f20e53fb46193851de0c5290fe68ef454d2c0aee9d718d3a26dc1b9a0d1fbf37f0119d365c9bd85d15ae0cfd05222329bedbd2b5af1152bb01a06fd6e927d72df84610729565b610ec76102a08801357e3c7a3b50dc6c29bbecafaf5c20327657603b3f5cdf7e1cfe0b9a872c8937557f0573d6da8283a957bede0e1d662a7826475a7f3503b61ce6731cda9e05b9061f84610729565b610f186102c08801357f17899f38cd9c61264b3a0b6bd8849bccb8d7752a18e26ac11d755f3dde8b61097f169a46074f60fe92e7e2f51c1cb9f1ef137bd9a056c3391eb9f6a7c656ce6f3e84610729565b610f696102e08801357f288723a08481f3ba64b49862bb693af72875ed303cba67d71d79ac19605ebb067f100e99c7a85374b98df7f70dee671d985be259cf23b941d97c9903742aec653d84610729565b610fba6103008801357f094162cf3f32de9b93a59ef13c9a33ac297fd5b803cd9a6b7c888510375d67207f1df59b2a12d7a478bb3abc00b26d86973722485658d0466c5bcb7136b8d00ee884610729565b61100b6103208801357f26d2dd8bcb721ddddf7a89fce7a8174360bfde331abacdcc4e95a544437623c97f222355ee8b12fd4b953be489ce7ac9e0c45c41ae9f9a3e818018a2ef27c8fe8684610729565b61105c6103408801357f0ac9b2a5b59662bfe8d866a43ff5280402ceaff7bf4d0d3321bd5cffb8238cbf7f118feff08485cffea53d0e5750f0cfad7d5f6415985d002708c0ba4cdb806d7784610729565b6110ac6103608801357f1ef601660e69a4d6b550f31e03b229bc114ae46a0dbc611a88c5f2b9da5d67637e2b50469bb49cfb2b946d134a99c282cb9ae18a70ce144bf7bbbe74be9e5cd484610729565b50823581527f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4760208401357f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4703066020820152833560408201526020840135606082015260408401356080820152606084013560a08201527f2d4d9aa7e302d9df41749d5507949d05dbea33fbb16c643b22f599a2be6df2e260c08201527f14bedd503c37ceb061d8ec60209fe345ce89830a19230301f076caff004d192660e08201527f0967032fcbf776d1afc985f88877f182d38480a653f2decaa9794cbc3bf3060c6101008201527f0e187847ad4c798374d0d6732bf501847dd68bc0e071241e0213bc7fc13db7ab6101208201527f304cfbd1e08a704a99f5e847d93f8c3caafddec46b7a0d379da69a4d112346a76101408201527f1739c1b1a457a8c7313123d24d2f9192f896b7c63eea05a9d57f06547ad0cec86101608201525f87015161018082015260205f018701516101a08201527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c26101c08201527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed6101e08201527f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b6102008201527f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa610220820152843561024082015260208501356102608201527f2421d5e11b841e97bba6ebf4f6c52f5e7068b4cac03cfe14b850dab7b03cb7416102808201527f16cda08f8f6fd30da8c340e73ad4829d593f0b6e9adddda9cf9e7992704f60b46102a08201527f29b8959bb7032f74cf68b6fd6b3ae134f46034af7754bff13dd000fb177fad8f6102c08201527f2e43943d84a2aa708872610f2ad74308fe43ac6599953f160297ad9fdac814776102e08201526020816103008360086107d05a03fa9051169695505050505050565b60405161038081016040526113a15f8401356106f7565b6113ae60208401356106f7565b6113bb60408401356106f7565b6113c860608401356106f7565b6113d560808401356106f7565b6113e260a08401356106f7565b6113ef60c08401356106f7565b6113fc60e08401356106f7565b61140a6101008401356106f7565b6114186101208401356106f7565b6114266101408401356106f7565b6114346101608401356106f7565b6114426101808401356106f7565b6114506101a08401356106f7565b61145e6101c08401356106f7565b61146c6101e08401356106f7565b61147a6102008401356106f7565b6114886102208401356106f7565b6114966102408401356106f7565b6114a46102608401356106f7565b6114b26102808401356106f7565b6114c06102a08401356106f7565b6114ce6102c08401356106f7565b6114dc6102e08401356106f7565b6114ea6103008401356106f7565b6114f86103208401356106f7565b6115066103408401356106f7565b6115146103608401356106f7565b6115226103808401356106f7565b61152f818486888a61078f565b9050805f5260205ff35b611541611bd4565b61154a5f611c2d565b565b611554611bd4565b600455565b6003805461156690612335565b80601f016020809104026020016040519081016040528092919081815260200182805461159290612335565b80156115dd5780601f106115b4576101008083540402835291602001916115dd565b820191905f5260205f20905b8154815290600101906020018083116115c057829003601f168201915b505050505081565b6060600380546115f490612335565b80601f016020809104026020016040519081016040528092919081815260200182805461162090612335565b801561166b5780601f106116425761010080835404028352916020019161166b565b820191905f5260205f20905b81548152906001019060200180831161164e57829003601f168201915b5050505050905090565b61167d611bd4565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6116a7611bd4565b6001600160a01b03811661170c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610306565b61072681611c2d565b61171d611bd4565b6003611729828261246a565b5050565b6040805160208481013581830152848301358284015260608086013581840152608080870135818501528451808503909101815260a084018552805190830120853560c08501528583013560e08501528585013561010085015290850135610120808501919091528451808503909101815261014090930190935281519101208082146118085760405162461bcd60e51b815260206004820152602360248201527f496e76616c696420696e7465726d656469617465206f72206f757470757420686044820152620c2e6d60eb1b6064820152608401610306565b50505050565b60605f61181b848461252a565b60ff1667ffffffffffffffff811115611836576118366121bd565b60405190808252806020026020018201604052801561185f578160200160208202803683370190505b50905060ff84165b8360ff168110156118ba578581601c811061188457611884612321565b60200201358261189760ff881684612543565b815181106118a7576118a7612321565b6020908102919091010152600101611867565b506118d5600782516118cc9190612556565b82906007611c7c565b95945050505050565b5f83818080805b8451811015611a2957603060f81b85828151811061190557611905612321565b01602001516001600160f81b031916108015906119465750603960f81b85828151811061193457611934612321565b01602001516001600160f81b03191611155b1561198957603085828151811061195f5761195f612321565b0160200151611971919060f81c612543565b61197c85600a612556565b611986919061240e565b93505b811561199d57826119998161256d565b9350505b876001600160f81b0319168582815181106119ba576119ba612321565b01602001516001600160f81b03191603611a21578115611a1c5760405162461bcd60e51b815260206004820152601c60248201527f537472696e6720686173206d756c7469706c6520646563696d616c73000000006044820152606401610306565b600191505b6001016118e5565b5085821115611a855760405162461bcd60e51b815260206004820152602260248201527f537472696e672068617320746f6f206d616e7920646563696d616c20706c6163604482015261657360f01b6064820152608401610306565b611a8f8287612543565b611a9a90600a612665565b611aa49084612556565b98975050505050505050565b5f611ac083601760f91b846118de565b9392505050565b60025460405163169394bb60e01b8152600481018390526001600160a01b039091169063169394bb90602401602060405180830381865afa158015611b0e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b3291906122d1565b15611b7f5760405162461bcd60e51b815260206004820152601f60248201527f4e756c6c69666965722068617320616c7265616479206265656e2075736564006044820152606401610306565b600254604051632dea6f9960e11b8152600481018390526001600160a01b0390911690635bd4df32906024015f604051808303815f87803b158015611bc2575f80fd5b505af1158015610788573d5f803e3d5ffd5b5f546001600160a01b0316331461154a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610306565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60605f80838651611c8d9190612556565b67ffffffffffffffff811115611ca557611ca56121bd565b6040519080825280601f01601f191660200182016040528015611ccf576020820181803683370190505b5090505f805b87518161ffff161015611e69575f888261ffff1681518110611cf957611cf9612321565b602002602001015190505f8767ffffffffffffffff811115611d1d57611d1d6121bd565b604051908082528060200260200182016040528015611d46578160200160208202803683370190505b5090505f5b88811015611d8d57611d5e816008612556565b83901c828281518110611d7357611d73612321565b60ff90921660209283029190910190910152600101611d4b565b505f5b88811015611e53575f828281518110611dab57611dab612321565b602002602001015160ff169050805f14611e20578060f81b878781518110611dd557611dd5612321565b60200101906001600160f81b03191690815f1a90535085611df58161256d565b9650611e049050600289612670565b60ff165f03611e1b57611e1860018961269d565b97505b611e43565b611e2b600289612670565b60ff16600103611e4357611e4060018961269d565b97505b5060089290921c91600101611d90565b5050508080611e61906126b6565b915050611cd5565b5060018360ff161015611f0a5760405162461bcd60e51b815260206004820152605760248201527f4e6f207061636b656420627974657320666f756e642120496e76616c6964206660448201527f696e616c207374617465206f66207061636b656420627974657320696e20656d60648201527f61696c3b2076616c7565206973206c696b656c79203021000000000000000000608482015260a401610306565b85811115611f785760405162461bcd60e51b815260206004820152603560248201527f5061636b6564206279746573206d6f7265207468616e20616c6c6f776564206d6044820152746178206e756d626572206f66207369676e616c732160581b6064820152608401610306565b5f611aa483805160609082905f5b8251811015611fc657828181518110611fa157611fa1612321565b01602001516001600160f81b0319165f03611fbe57809150611fc6565b600101611f86565b505f8167ffffffffffffffff811115611fe157611fe16121bd565b6040519080825280601f01601f19166020018201604052801561200b576020820181803683370190505b5090505f5b828110156120655783818151811061202a5761202a612321565b602001015160f81c60f81b82828151811061204757612047612321565b60200101906001600160f81b03191690815f1a905350600101612010565b50949350505050565b5f80828403610600811215612081575f80fd5b61048080821215612090575f80fd5b84935061018061047f19830112156120a6575f80fd5b92959390920193505050565b5f602082840312156120c2575f80fd5b5035919050565b80604081018310156106eb575f80fd5b5f805f806104808086880312156120ee575f80fd5b6120f887876120c9565b945060c086018781111561210a575f80fd5b60408701945061211a88826120c9565b93505086818701111561212b575f80fd5b50929591945092610100019150565b5f5b8381101561215457818101518382015260200161213c565b50505f910152565b602081525f825180602084015261217a81604085016020870161213a565b601f01601f19169190910160400192915050565b6001600160a01b0381168114610726575f80fd5b5f602082840312156121b2575f80fd5b8135611ac08161218e565b634e487b7160e01b5f52604160045260245ffd5b5f602082840312156121e1575f80fd5b813567ffffffffffffffff808211156121f8575f80fd5b818401915084601f83011261220b575f80fd5b81358181111561221d5761221d6121bd565b604051601f8201601f19908116603f01168101908382118183101715612245576122456121bd565b8160405282815287602084870101111561225d575f80fd5b826020860160208301375f928101602001929092525095945050505050565b805f5b60028110156118085760408083863793840193919091019060010161227f565b610480810160408683376122b6604083018661227c565b60408460c08401376103808361010084013795945050505050565b5f602082840312156122e1575f80fd5b81518015158114611ac0575f80fd5b61018081016040868337612307604083018661227c565b60408460c084013760808361010084013795945050505050565b634e487b7160e01b5f52603260045260245ffd5b600181811c9082168061234957607f821691505b60208210810361236757634e487b7160e01b5f52602260045260245ffd5b50919050565b5f80835461237a81612335565b6001828116801561239257600181146123a7576123d3565b60ff19841687528215158302870194506123d3565b875f526020805f205f5b858110156123ca5781548a8201529084019082016123b1565b50505082870194505b50929695505050505050565b5f82516123f081846020870161213a565b9190910192915050565b634e487b7160e01b5f52601160045260245ffd5b808201808211156106eb576106eb6123fa565b601f82111561246557805f5260205f20601f840160051c810160208510156124465750805b601f840160051c820191505b81811015610788575f8155600101612452565b505050565b815167ffffffffffffffff811115612484576124846121bd565b612498816124928454612335565b84612421565b602080601f8311600181146124cb575f84156124b45750858301515b5f19600386901b1c1916600185901b178555612522565b5f85815260208120601f198616915b828110156124f9578886015182559484019460019091019084016124da565b508582101561251657878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b60ff82811682821603908111156106eb576106eb6123fa565b818103818111156106eb576106eb6123fa565b80820281158282048414176106eb576106eb6123fa565b5f6001820161257e5761257e6123fa565b5060010190565b600181815b808511156125bf57815f19048211156125a5576125a56123fa565b808516156125b257918102915b93841c939080029061258a565b509250929050565b5f826125d5575060016106eb565b816125e157505f6106eb565b81600181146125f757600281146126015761261d565b60019150506106eb565b60ff841115612612576126126123fa565b50506001821b6106eb565b5060208310610133831016604e8410600b8410161715612640575081810a6106eb565b61264a8383612585565b805f190482111561265d5761265d6123fa565b029392505050565b5f611ac083836125c7565b5f60ff83168061268e57634e487b7160e01b5f52601260045260245ffd5b8060ff84160691505092915050565b60ff81811683821601908111156106eb576106eb6123fa565b5f61ffff8083168181036126cc576126cc6123fa565b600101939250505056fea2646970667358221220427926438d920519dfacfd131047ae605249ccd870e2719cbedeaa2b51ecf5eb64736f6c63430008180033", + "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/ramps/garanti/GarantiSendProcessor.sol:GarantiSendProcessor", + "label": "_owner", + "offset": 0, + "slot": "0", + "type": "t_address" + }, + { + "astId": 6068, + "contract": "contracts/ramps/garanti/GarantiSendProcessor.sol:GarantiSendProcessor", + "label": "mailServerKeyHashAdapter", + "offset": 0, + "slot": "1", + "type": "t_contract(IKeyHashAdapterV2)6431" + }, + { + "astId": 6071, + "contract": "contracts/ramps/garanti/GarantiSendProcessor.sol:GarantiSendProcessor", + "label": "nullifierRegistry", + "offset": 0, + "slot": "2", + "type": "t_contract(INullifierRegistry)6636" + }, + { + "astId": 6073, + "contract": "contracts/ramps/garanti/GarantiSendProcessor.sol:GarantiSendProcessor", + "label": "emailFromAddress", + "offset": 0, + "slot": "3", + "type": "t_bytes_storage" + }, + { + "astId": 6075, + "contract": "contracts/ramps/garanti/GarantiSendProcessor.sol:GarantiSendProcessor", + "label": "timestampBuffer", + "offset": 0, + "slot": "4", + "type": "t_uint256" + }, + { + "astId": 9328, + "contract": "contracts/ramps/garanti/GarantiSendProcessor.sol:GarantiSendProcessor", + "label": "bodyHashVerifier", + "offset": 0, + "slot": "5", + "type": "t_contract(IGarantiBodySuffixHashVerifier)9706" + } + ], + "types": { + "t_address": { + "encoding": "inplace", + "label": "address", + "numberOfBytes": "20" + }, + "t_bytes_storage": { + "encoding": "bytes", + "label": "bytes", + "numberOfBytes": "32" + }, + "t_contract(IGarantiBodySuffixHashVerifier)9706": { + "encoding": "inplace", + "label": "contract IGarantiBodySuffixHashVerifier", + "numberOfBytes": "20" + }, + "t_contract(IKeyHashAdapterV2)6431": { + "encoding": "inplace", + "label": "contract IKeyHashAdapterV2", + "numberOfBytes": "20" + }, + "t_contract(INullifierRegistry)6636": { + "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/deployments/encifher/HDFCManagedKeyHashAdapter.json b/contracts/deployments/encifher/HDFCManagedKeyHashAdapter.json new file mode 100644 index 000000000..7cece2c2e --- /dev/null +++ b/contracts/deployments/encifher/HDFCManagedKeyHashAdapter.json @@ -0,0 +1,291 @@ +{ + "address": "0x4C073a92B1C8Fb55313102Ab412fb7F1704bcBdD", + "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": "0xd4618d35eedecae909c0df7eda2a902f7fcafe167aa9221e3413d060235f31f2", + "receipt": { + "to": null, + "from": "0xa0Ee7A142d267C1f36714E4a8F75612F20a79720", + "contractAddress": "0x4C073a92B1C8Fb55313102Ab412fb7F1704bcBdD", + "transactionIndex": 0, + "gasUsed": "520722", + "logsBloom": "0x00000000000000000000040000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000008000000000002000000020000000000000200004800000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000020000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0x319e081f19c021fe143a209744032f9a18d6b20fdb58483c1ad3db001471f8ae", + "transactionHash": "0xd4618d35eedecae909c0df7eda2a902f7fcafe167aa9221e3413d060235f31f2", + "logs": [ + { + "transactionIndex": 0, + "blockNumber": 61368, + "transactionHash": "0xd4618d35eedecae909c0df7eda2a902f7fcafe167aa9221e3413d060235f31f2", + "address": "0x4C073a92B1C8Fb55313102Ab412fb7F1704bcBdD", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x000000000000000000000000a0ee7a142d267c1f36714e4a8f75612f20a79720" + ], + "data": "0x", + "logIndex": 0, + "blockHash": "0x319e081f19c021fe143a209744032f9a18d6b20fdb58483c1ad3db001471f8ae" + } + ], + "blockNumber": 61368, + "cumulativeGasUsed": "520722", + "status": 1, + "byzantium": true + }, + "args": [ + [ + "0x23421f99fa0b530a42c1d1cd7c7b45e09cf4a02963646248bee3ec4aee13c214", + "0x2d6f556514af89727d18b24fc9f30e24015663eb289cb69c712b5814420b3fed" + ] + ], + "numDeployments": 1, + "solcInputHash": "75b8f55da346d7ed99a350632554d2fb", + "metadata": "{\"compiler\":{\"version\":\"0.8.24+commit.e11b9ed9\"},\"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/processors/keyHashAdapters/ManagedKeyHashAdapterV2.sol\":\"ManagedKeyHashAdapterV2\"},\"evmVersion\":\"shanghai\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"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 v4.4.1 (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\",\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"license\":\"MIT\"},\"contracts/external/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/processors/keyHashAdapters/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/processors/keyHashAdapters/ManagedKeyHashAdapterV2.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\n\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\nimport { IKeyHashAdapterV2 } from \\\"./IKeyHashAdapterV2.sol\\\";\\nimport { Bytes32ArrayUtils } from \\\"../../external/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\":\"0xb508d88dca3849e44c40adf29466772b5e6368e0b2eabad5652961344c72f58c\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x608060405234801561000f575f80fd5b5060405161096a38038061096a83398101604081905261002e91610183565b61003733610120565b5f5b8151811015610119575f8282815181106100555761005561023b565b6020908102919091018101515f818152600190925260409091205490915060ff16156100c75760405162461bcd60e51b815260206004820152601660248201527f4b6579206861736820616c726561647920616464656400000000000000000000604482015260640160405180910390fd5b5f8181526001602081905260408220805460ff19168217905560028054808301825592527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace9091019190915501610039565b505061024f565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b634e487b7160e01b5f52604160045260245ffd5b5f6020808385031215610194575f80fd5b82516001600160401b03808211156101aa575f80fd5b818501915085601f8301126101bd575f80fd5b8151818111156101cf576101cf61016f565b8060051b604051601f19603f830116810181811085821117156101f4576101f461016f565b604052918252848201925083810185019188831115610211575f80fd5b938501935b8285101561022f57845184529385019392850192610216565b98975050505050505050565b634e487b7160e01b5f52603260045260245ffd5b61070e8061025c5f395ff3fe608060405234801561000f575f80fd5b5060043610610085575f3560e01c80638da5cb5b116100585780638da5cb5b146100f2578063a26c04ee1461010c578063b86e2d721461011f578063f2fde38b14610140575f80fd5b806319d091521461008957806361ba662a146100c0578063687bc0ab146100d5578063715018a6146100ea575b5f80fd5b6100ab610097366004610604565b60016020525f908152604090205460ff1681565b60405190151581526020015b60405180910390f35b6100d36100ce366004610604565b610153565b005b6100dd61023d565b6040516100b7919061061b565b6100d3610293565b5f546040516001600160a01b0390911681526020016100b7565b6100d361011a366004610604565b6102a6565b61013261012d366004610604565b610350565b6040519081526020016100b7565b6100d361014e36600461065e565b61036f565b61015b6103e8565b5f8181526001602052604090205460ff16156101b75760405162461bcd60e51b815260206004820152601660248201527512d95e481a185cda08185b1c9958591e48185919195960521b60448201526064015b60405180910390fd5b5f818152600160208190526040808320805460ff1916831790556002805492830181559092527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace01829055517fc1674d5f4b3c1397f7aad948ab8fb7adfb24a8f170f8c07349d880c342da030b906102329083815260200190565b60405180910390a150565b6060600280548060200260200160405190810160405280929190818152602001828054801561028957602002820191905f5260205f20905b815481526020019060010190808311610275575b5050505050905090565b61029b6103e8565b6102a45f610441565b565b6102ae6103e8565b5f8181526001602052604090205460ff166103005760405162461bcd60e51b815260206004820152601260248201527112d95e481a185cda081b9bdd08185919195960721b60448201526064016101ae565b5f818152600160205260409020805460ff19169055610320600282610490565b6040518181527f57f03401c03965ea5770efca656f696bdaa598efbaa2c899de9c70749634fabd90602001610232565b6002818154811061035f575f80fd5b5f91825260209091200154905081565b6103776103e8565b6001600160a01b0381166103dc5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016101ae565b6103e581610441565b50565b5f546001600160a01b031633146102a45760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016101ae565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f806104e9848054806020026020016040519081016040528092919081815260200182805480156104de57602002820191905f5260205f20905b8154815260200190600101908083116104ca575b5050505050846105ae565b91509150806105325760405162461bcd60e51b8152602060048201526015602482015274313cba32b99999103737ba1034b71030b93930bc9760591b60448201526064016101ae565b83545f906105429060019061068b565b90508083146105845784818154811061055d5761055d6106b0565b905f5260205f200154858481548110610578576105786106b0565b5f918252602090912001555b84805480610594576105946106c4565b600190038181905f5260205f20015f905590555050505050565b81515f908190815b818110156105f357848682815181106105d1576105d16106b0565b6020026020010151036105eb579250600191506105fd9050565b6001016105b6565b505f195f92509250505b9250929050565b5f60208284031215610614575f80fd5b5035919050565b602080825282518282018190525f9190848201906040850190845b8181101561065257835183529284019291840191600101610636565b50909695505050505050565b5f6020828403121561066e575f80fd5b81356001600160a01b0381168114610684575f80fd5b9392505050565b818103818111156106aa57634e487b7160e01b5f52601160045260245ffd5b92915050565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52603160045260245ffdfea2646970667358221220ab41a7f4861f5df1c1f6a360281ac8bbfe83cb487622b9bc8e87526525d04f8764736f6c63430008180033", + "deployedBytecode": "0x608060405234801561000f575f80fd5b5060043610610085575f3560e01c80638da5cb5b116100585780638da5cb5b146100f2578063a26c04ee1461010c578063b86e2d721461011f578063f2fde38b14610140575f80fd5b806319d091521461008957806361ba662a146100c0578063687bc0ab146100d5578063715018a6146100ea575b5f80fd5b6100ab610097366004610604565b60016020525f908152604090205460ff1681565b60405190151581526020015b60405180910390f35b6100d36100ce366004610604565b610153565b005b6100dd61023d565b6040516100b7919061061b565b6100d3610293565b5f546040516001600160a01b0390911681526020016100b7565b6100d361011a366004610604565b6102a6565b61013261012d366004610604565b610350565b6040519081526020016100b7565b6100d361014e36600461065e565b61036f565b61015b6103e8565b5f8181526001602052604090205460ff16156101b75760405162461bcd60e51b815260206004820152601660248201527512d95e481a185cda08185b1c9958591e48185919195960521b60448201526064015b60405180910390fd5b5f818152600160208190526040808320805460ff1916831790556002805492830181559092527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace01829055517fc1674d5f4b3c1397f7aad948ab8fb7adfb24a8f170f8c07349d880c342da030b906102329083815260200190565b60405180910390a150565b6060600280548060200260200160405190810160405280929190818152602001828054801561028957602002820191905f5260205f20905b815481526020019060010190808311610275575b5050505050905090565b61029b6103e8565b6102a45f610441565b565b6102ae6103e8565b5f8181526001602052604090205460ff166103005760405162461bcd60e51b815260206004820152601260248201527112d95e481a185cda081b9bdd08185919195960721b60448201526064016101ae565b5f818152600160205260409020805460ff19169055610320600282610490565b6040518181527f57f03401c03965ea5770efca656f696bdaa598efbaa2c899de9c70749634fabd90602001610232565b6002818154811061035f575f80fd5b5f91825260209091200154905081565b6103776103e8565b6001600160a01b0381166103dc5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016101ae565b6103e581610441565b50565b5f546001600160a01b031633146102a45760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016101ae565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f806104e9848054806020026020016040519081016040528092919081815260200182805480156104de57602002820191905f5260205f20905b8154815260200190600101908083116104ca575b5050505050846105ae565b91509150806105325760405162461bcd60e51b8152602060048201526015602482015274313cba32b99999103737ba1034b71030b93930bc9760591b60448201526064016101ae565b83545f906105429060019061068b565b90508083146105845784818154811061055d5761055d6106b0565b905f5260205f200154858481548110610578576105786106b0565b5f918252602090912001555b84805480610594576105946106c4565b600190038181905f5260205f20015f905590555050505050565b81515f908190815b818110156105f357848682815181106105d1576105d16106b0565b6020026020010151036105eb579250600191506105fd9050565b6001016105b6565b505f195f92509250505b9250929050565b5f60208284031215610614575f80fd5b5035919050565b602080825282518282018190525f9190848201906040850190845b8181101561065257835183529284019291840191600101610636565b50909695505050505050565b5f6020828403121561066e575f80fd5b81356001600160a01b0381168114610684575f80fd5b9392505050565b818103818111156106aa57634e487b7160e01b5f52601160045260245ffd5b92915050565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52603160045260245ffdfea2646970667358221220ab41a7f4861f5df1c1f6a360281ac8bbfe83cb487622b9bc8e87526525d04f8764736f6c63430008180033", + "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/processors/keyHashAdapters/ManagedKeyHashAdapterV2.sol:ManagedKeyHashAdapterV2", + "label": "_owner", + "offset": 0, + "slot": "0", + "type": "t_address" + }, + { + "astId": 6496, + "contract": "contracts/processors/keyHashAdapters/ManagedKeyHashAdapterV2.sol:ManagedKeyHashAdapterV2", + "label": "isMailServerKeyHash", + "offset": 0, + "slot": "1", + "type": "t_mapping(t_bytes32,t_bool)" + }, + { + "astId": 6499, + "contract": "contracts/processors/keyHashAdapters/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/deployments/encifher/HDFCRamp.json b/contracts/deployments/encifher/HDFCRamp.json new file mode 100644 index 000000000..971d36fb8 --- /dev/null +++ b/contracts/deployments/encifher/HDFCRamp.json @@ -0,0 +1,2234 @@ +{ + "address": "0xb1527802E7800034D6887b0a99a5Ad2683184b95", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "internalType": "contract IERC20", + "name": "_usdc", + "type": "address" + }, + { + "internalType": "contract IeERC20", + "name": "_eusdc", + "type": "address" + }, + { + "internalType": "contract IPoseidon3", + "name": "_poseidon3", + "type": "address" + }, + { + "internalType": "contract IPoseidon6", + "name": "_poseidon6", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_minDepositAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_maxOnRampAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_intentExpirationPeriod", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_onRampCooldownPeriod", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_sustainabilityFee", + "type": "uint256" + }, + { + "internalType": "address", + "name": "_sustainabilityFeeRecipient", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "accountOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "idHash", + "type": "bytes32" + } + ], + "name": "AccountRegistered", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "depositId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "address", + "name": "depositor", + "type": "address" + } + ], + "name": "DepositClosed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "depositId", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "idHash", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "conversionRate", + "type": "uint256" + } + ], + "name": "DepositReceived", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "depositId", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "address", + "name": "depositor", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "DepositWithdrawn", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "depositId", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "idHash", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "euint32", + "name": "amount", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "euint32", + "name": "conversionRate", + "type": "uint256" + } + ], + "name": "EncryptedDepositReceived", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "intentExpirationPeriod", + "type": "uint256" + } + ], + "name": "IntentExpirationPeriodSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "intentHash", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "depositId", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "address", + "name": "onRamper", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "feeAmount", + "type": "uint256" + } + ], + "name": "IntentFulfilled", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "intentHash", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "depositId", + "type": "uint256" + } + ], + "name": "IntentPruned", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "intentHash", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "depositId", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "idHash", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "timestamp", + "type": "uint256" + } + ], + "name": "IntentSignaled", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "maxOnRampAmount", + "type": "uint256" + } + ], + "name": "MaxOnRampAmountSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "minDepositAmount", + "type": "uint256" + } + ], + "name": "MinDepositAmountSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "receiveProcessor", + "type": "address" + } + ], + "name": "NewReceiveProcessorSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "registrationProcessor", + "type": "address" + } + ], + "name": "NewRegistrationProcessorSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "sendProcessor", + "type": "address" + } + ], + "name": "NewSendProcessorSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "onRampCooldownPeriod", + "type": "uint256" + } + ], + "name": "OnRampCooldownPeriodSet", + "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": "feeRecipient", + "type": "address" + } + ], + "name": "SustainabilityFeeRecipientUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "fee", + "type": "uint256" + } + ], + "name": "SustainabilityFeeUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bytes32", + "name": "listOwner", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "deniedUser", + "type": "bytes32" + } + ], + "name": "UserAddedToDenylist", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bytes32", + "name": "listOwner", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "approvedUser", + "type": "bytes32" + } + ], + "name": "UserRemovedFromDenylist", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_deniedUser", + "type": "bytes32" + } + ], + "name": "addAccountToDenylist", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_intentHash", + "type": "bytes32" + } + ], + "name": "cancelIntent", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "depositCounter", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "deposits", + "outputs": [ + { + "internalType": "address", + "name": "depositor", + "type": "address" + }, + { + "internalType": "uint256", + "name": "depositAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "remainingDeposits", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "outstandingIntentAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "conversionRate", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "encryptedDeposits", + "outputs": [ + { + "internalType": "address", + "name": "despositor", + "type": "address" + }, + { + "internalType": "euint32", + "name": "depositAmount", + "type": "uint256" + }, + { + "internalType": "euint32", + "name": "remainingDeposits", + "type": "uint256" + }, + { + "internalType": "euint32", + "name": "outstandingIntentAmount", + "type": "uint256" + }, + { + "internalType": "euint32", + "name": "conversionRate", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "eusdc", + "outputs": [ + { + "internalType": "contract IeERC20", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_account", + "type": "address" + } + ], + "name": "getAccountDeposits", + "outputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "depositId", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "depositorIdHash", + "type": "bytes32" + }, + { + "components": [ + { + "internalType": "address", + "name": "depositor", + "type": "address" + }, + { + "internalType": "uint256[8]", + "name": "upiId", + "type": "uint256[8]" + }, + { + "internalType": "uint256", + "name": "depositAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "remainingDeposits", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "outstandingIntentAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "conversionRate", + "type": "uint256" + }, + { + "internalType": "bytes32[]", + "name": "intentHashes", + "type": "bytes32[]" + } + ], + "internalType": "struct HDFCRamp.Deposit", + "name": "deposit", + "type": "tuple" + }, + { + "internalType": "uint256", + "name": "availableLiquidity", + "type": "uint256" + } + ], + "internalType": "struct HDFCRamp.DepositWithAvailableLiquidity[]", + "name": "accountDeposits", + "type": "tuple[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_account", + "type": "address" + } + ], + "name": "getAccountInfo", + "outputs": [ + { + "components": [ + { + "internalType": "bytes32", + "name": "idHash", + "type": "bytes32" + }, + { + "internalType": "uint256[]", + "name": "deposits", + "type": "uint256[]" + } + ], + "internalType": "struct HDFCRamp.AccountInfo", + "name": "", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_account", + "type": "address" + } + ], + "name": "getDeniedUsers", + "outputs": [ + { + "internalType": "bytes32[]", + "name": "", + "type": "bytes32[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_depositId", + "type": "uint256" + } + ], + "name": "getDeposit", + "outputs": [ + { + "components": [ + { + "internalType": "address", + "name": "depositor", + "type": "address" + }, + { + "internalType": "uint256[8]", + "name": "upiId", + "type": "uint256[8]" + }, + { + "internalType": "uint256", + "name": "depositAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "remainingDeposits", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "outstandingIntentAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "conversionRate", + "type": "uint256" + }, + { + "internalType": "bytes32[]", + "name": "intentHashes", + "type": "bytes32[]" + } + ], + "internalType": "struct HDFCRamp.Deposit", + "name": "", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256[]", + "name": "_depositIds", + "type": "uint256[]" + } + ], + "name": "getDepositFromIds", + "outputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "depositId", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "depositorIdHash", + "type": "bytes32" + }, + { + "components": [ + { + "internalType": "address", + "name": "depositor", + "type": "address" + }, + { + "internalType": "uint256[8]", + "name": "upiId", + "type": "uint256[8]" + }, + { + "internalType": "uint256", + "name": "depositAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "remainingDeposits", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "outstandingIntentAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "conversionRate", + "type": "uint256" + }, + { + "internalType": "bytes32[]", + "name": "intentHashes", + "type": "bytes32[]" + } + ], + "internalType": "struct HDFCRamp.Deposit", + "name": "deposit", + "type": "tuple" + }, + { + "internalType": "uint256", + "name": "availableLiquidity", + "type": "uint256" + } + ], + "internalType": "struct HDFCRamp.DepositWithAvailableLiquidity[]", + "name": "depositArray", + "type": "tuple[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_account", + "type": "address" + } + ], + "name": "getIdCurrentIntentHash", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32[]", + "name": "_intentHashes", + "type": "bytes32[]" + } + ], + "name": "getIntentsWithOnRamperId", + "outputs": [ + { + "components": [ + { + "internalType": "bytes32", + "name": "intentHash", + "type": "bytes32" + }, + { + "components": [ + { + "internalType": "address", + "name": "onRamper", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "deposit", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "intentTimestamp", + "type": "uint256" + } + ], + "internalType": "struct HDFCRamp.Intent", + "name": "intent", + "type": "tuple" + }, + { + "internalType": "bytes32", + "name": "onRamperIdHash", + "type": "bytes32" + } + ], + "internalType": "struct HDFCRamp.IntentWithOnRamperId[]", + "name": "", + "type": "tuple[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_account", + "type": "address" + } + ], + "name": "getLastOnRampTimestamp", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IRegistrationProcessor", + "name": "_registrationProcessor", + "type": "address" + }, + { + "internalType": "contract IHDFCSendProcessor", + "name": "_sendProcessor", + "type": "address" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "intentExpirationPeriod", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "name": "intents", + "outputs": [ + { + "internalType": "address", + "name": "onRamper", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "deposit", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "intentTimestamp", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_account", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "_deniedUser", + "type": "bytes32" + } + ], + "name": "isDeniedUser", + "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": "maxOnRampAmount", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "minDepositAmount", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256[8]", + "name": "_upiId", + "type": "uint256[8]" + }, + { + "internalType": "uint256", + "name": "_depositAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_receiveAmount", + "type": "uint256" + } + ], + "name": "offRamp", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "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[15]", + "name": "_signals", + "type": "uint256[15]" + } + ], + "name": "onRamp", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "onRampCooldownPeriod", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "poseidon3", + "outputs": [ + { + "internalType": "contract IPoseidon3", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "poseidon6", + "outputs": [ + { + "internalType": "contract IPoseidon6", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256[8]", + "name": "_upiId", + "type": "uint256[8]" + }, + { + "internalType": "einput", + "name": "_encryptedDepositAmount", + "type": "bytes32" + }, + { + "internalType": "einput", + "name": "_encryptedReceiveAmount", + "type": "bytes32" + }, + { + "internalType": "bytes", + "name": "_inputProof", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "_depositAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_receiveAmount", + "type": "uint256" + } + ], + "name": "privateOffRamp", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "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[5]", + "name": "_signals", + "type": "uint256[5]" + } + ], + "name": "register", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "registrationProcessor", + "outputs": [ + { + "internalType": "contract IRegistrationProcessor", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_intentHash", + "type": "bytes32" + } + ], + "name": "releaseFundsToOnramper", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_approvedUser", + "type": "bytes32" + } + ], + "name": "removeAccountFromDenylist", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "sendProcessor", + "outputs": [ + { + "internalType": "contract IHDFCSendProcessor", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_intentExpirationPeriod", + "type": "uint256" + } + ], + "name": "setIntentExpirationPeriod", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_maxOnRampAmount", + "type": "uint256" + } + ], + "name": "setMaxOnRampAmount", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_minDepositAmount", + "type": "uint256" + } + ], + "name": "setMinDepositAmount", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_onRampCooldownPeriod", + "type": "uint256" + } + ], + "name": "setOnRampCooldownPeriod", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IRegistrationProcessor", + "name": "_registrationProcessor", + "type": "address" + } + ], + "name": "setRegistrationProcessor", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IHDFCSendProcessor", + "name": "_sendProcessor", + "type": "address" + } + ], + "name": "setSendProcessor", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_fee", + "type": "uint256" + } + ], + "name": "setSustainabilityFee", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_feeRecipient", + "type": "address" + } + ], + "name": "setSustainabilityFeeRecipient", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_depositId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + }, + { + "internalType": "address", + "name": "_to", + "type": "address" + } + ], + "name": "signalIntent", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "sustainabilityFee", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "sustainabilityFeeRecipient", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "usdc", + "outputs": [ + { + "internalType": "contract IERC20", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256[]", + "name": "_depositIds", + "type": "uint256[]" + } + ], + "name": "withdrawDeposit", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "transactionHash": "0xa0645d092d24aee1550d0e2cc9193f9f00dcc7c1ba2c1e2f533a3647211cd035", + "receipt": { + "to": null, + "from": "0xa0Ee7A142d267C1f36714E4a8F75612F20a79720", + "contractAddress": "0xb1527802E7800034D6887b0a99a5Ad2683184b95", + "transactionIndex": 0, + "gasUsed": "3824308", + "logsBloom": "0x00000000000000000000040000000000000000000000000000800000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000001000080000000000008000000000000000000020000000000000000000800000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000020000000000000000000000000800000000000000000000000000000000000000000", + "blockHash": "0x9c4fc79dd7c797087962769596b4a0221edc5757db2ae75fbd1a016a00ecb8e8", + "transactionHash": "0xa0645d092d24aee1550d0e2cc9193f9f00dcc7c1ba2c1e2f533a3647211cd035", + "logs": [ + { + "transactionIndex": 0, + "blockNumber": 61366, + "transactionHash": "0xa0645d092d24aee1550d0e2cc9193f9f00dcc7c1ba2c1e2f533a3647211cd035", + "address": "0xb1527802E7800034D6887b0a99a5Ad2683184b95", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x000000000000000000000000a0ee7a142d267c1f36714e4a8f75612f20a79720" + ], + "data": "0x", + "logIndex": 0, + "blockHash": "0x9c4fc79dd7c797087962769596b4a0221edc5757db2ae75fbd1a016a00ecb8e8" + }, + { + "transactionIndex": 0, + "blockNumber": 61366, + "transactionHash": "0xa0645d092d24aee1550d0e2cc9193f9f00dcc7c1ba2c1e2f533a3647211cd035", + "address": "0xb1527802E7800034D6887b0a99a5Ad2683184b95", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x000000000000000000000000a0ee7a142d267c1f36714e4a8f75612f20a79720", + "0x000000000000000000000000a0ee7a142d267c1f36714e4a8f75612f20a79720" + ], + "data": "0x", + "logIndex": 1, + "blockHash": "0x9c4fc79dd7c797087962769596b4a0221edc5757db2ae75fbd1a016a00ecb8e8" + } + ], + "blockNumber": 61366, + "cumulativeGasUsed": "3824308", + "status": 1, + "byzantium": true + }, + "args": [ + "0xa0Ee7A142d267C1f36714E4a8F75612F20a79720", + "0x04fc820176617A99AE134904935Bc854b2e51628", + "0x04fc820176617A99AE134904935Bc854b2e51628", + "0xF1078fD568Ad76E49E6F88D1fF485402a086976b", + "0x3A1D75769758705caB1385377d4D88b8193A5f37", + "10000000", + "999000000", + "180", + "180", + "1000000000000000", + "0xa0Ee7A142d267C1f36714E4a8F75612F20a79720" + ], + "numDeployments": 1, + "solcInputHash": "75b8f55da346d7ed99a350632554d2fb", + "metadata": "{\"compiler\":{\"version\":\"0.8.24+commit.e11b9ed9\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"},{\"internalType\":\"contract IERC20\",\"name\":\"_usdc\",\"type\":\"address\"},{\"internalType\":\"contract IeERC20\",\"name\":\"_eusdc\",\"type\":\"address\"},{\"internalType\":\"contract IPoseidon3\",\"name\":\"_poseidon3\",\"type\":\"address\"},{\"internalType\":\"contract IPoseidon6\",\"name\":\"_poseidon6\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_minDepositAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_maxOnRampAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_intentExpirationPeriod\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_onRampCooldownPeriod\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_sustainabilityFee\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_sustainabilityFeeRecipient\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"accountOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"idHash\",\"type\":\"bytes32\"}],\"name\":\"AccountRegistered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"depositId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"depositor\",\"type\":\"address\"}],\"name\":\"DepositClosed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"depositId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"idHash\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"conversionRate\",\"type\":\"uint256\"}],\"name\":\"DepositReceived\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"depositId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"depositor\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"DepositWithdrawn\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"depositId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"idHash\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"euint32\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"euint32\",\"name\":\"conversionRate\",\"type\":\"uint256\"}],\"name\":\"EncryptedDepositReceived\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"intentExpirationPeriod\",\"type\":\"uint256\"}],\"name\":\"IntentExpirationPeriodSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"intentHash\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"depositId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"onRamper\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"feeAmount\",\"type\":\"uint256\"}],\"name\":\"IntentFulfilled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"intentHash\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"depositId\",\"type\":\"uint256\"}],\"name\":\"IntentPruned\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"intentHash\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"depositId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"idHash\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"}],\"name\":\"IntentSignaled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"maxOnRampAmount\",\"type\":\"uint256\"}],\"name\":\"MaxOnRampAmountSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"minDepositAmount\",\"type\":\"uint256\"}],\"name\":\"MinDepositAmountSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"receiveProcessor\",\"type\":\"address\"}],\"name\":\"NewReceiveProcessorSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"registrationProcessor\",\"type\":\"address\"}],\"name\":\"NewRegistrationProcessorSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"sendProcessor\",\"type\":\"address\"}],\"name\":\"NewSendProcessorSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"onRampCooldownPeriod\",\"type\":\"uint256\"}],\"name\":\"OnRampCooldownPeriodSet\",\"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\":\"feeRecipient\",\"type\":\"address\"}],\"name\":\"SustainabilityFeeRecipientUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"fee\",\"type\":\"uint256\"}],\"name\":\"SustainabilityFeeUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"listOwner\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"deniedUser\",\"type\":\"bytes32\"}],\"name\":\"UserAddedToDenylist\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"listOwner\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"approvedUser\",\"type\":\"bytes32\"}],\"name\":\"UserRemovedFromDenylist\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_deniedUser\",\"type\":\"bytes32\"}],\"name\":\"addAccountToDenylist\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_intentHash\",\"type\":\"bytes32\"}],\"name\":\"cancelIntent\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"depositCounter\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"deposits\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"depositor\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"depositAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"remainingDeposits\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"outstandingIntentAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"conversionRate\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"encryptedDeposits\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"despositor\",\"type\":\"address\"},{\"internalType\":\"euint32\",\"name\":\"depositAmount\",\"type\":\"uint256\"},{\"internalType\":\"euint32\",\"name\":\"remainingDeposits\",\"type\":\"uint256\"},{\"internalType\":\"euint32\",\"name\":\"outstandingIntentAmount\",\"type\":\"uint256\"},{\"internalType\":\"euint32\",\"name\":\"conversionRate\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"eusdc\",\"outputs\":[{\"internalType\":\"contract IeERC20\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_account\",\"type\":\"address\"}],\"name\":\"getAccountDeposits\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"depositId\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"depositorIdHash\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"depositor\",\"type\":\"address\"},{\"internalType\":\"uint256[8]\",\"name\":\"upiId\",\"type\":\"uint256[8]\"},{\"internalType\":\"uint256\",\"name\":\"depositAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"remainingDeposits\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"outstandingIntentAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"conversionRate\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[]\",\"name\":\"intentHashes\",\"type\":\"bytes32[]\"}],\"internalType\":\"struct HDFCRamp.Deposit\",\"name\":\"deposit\",\"type\":\"tuple\"},{\"internalType\":\"uint256\",\"name\":\"availableLiquidity\",\"type\":\"uint256\"}],\"internalType\":\"struct HDFCRamp.DepositWithAvailableLiquidity[]\",\"name\":\"accountDeposits\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_account\",\"type\":\"address\"}],\"name\":\"getAccountInfo\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"idHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint256[]\",\"name\":\"deposits\",\"type\":\"uint256[]\"}],\"internalType\":\"struct HDFCRamp.AccountInfo\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_account\",\"type\":\"address\"}],\"name\":\"getDeniedUsers\",\"outputs\":[{\"internalType\":\"bytes32[]\",\"name\":\"\",\"type\":\"bytes32[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_depositId\",\"type\":\"uint256\"}],\"name\":\"getDeposit\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"depositor\",\"type\":\"address\"},{\"internalType\":\"uint256[8]\",\"name\":\"upiId\",\"type\":\"uint256[8]\"},{\"internalType\":\"uint256\",\"name\":\"depositAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"remainingDeposits\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"outstandingIntentAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"conversionRate\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[]\",\"name\":\"intentHashes\",\"type\":\"bytes32[]\"}],\"internalType\":\"struct HDFCRamp.Deposit\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256[]\",\"name\":\"_depositIds\",\"type\":\"uint256[]\"}],\"name\":\"getDepositFromIds\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"depositId\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"depositorIdHash\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"depositor\",\"type\":\"address\"},{\"internalType\":\"uint256[8]\",\"name\":\"upiId\",\"type\":\"uint256[8]\"},{\"internalType\":\"uint256\",\"name\":\"depositAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"remainingDeposits\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"outstandingIntentAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"conversionRate\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[]\",\"name\":\"intentHashes\",\"type\":\"bytes32[]\"}],\"internalType\":\"struct HDFCRamp.Deposit\",\"name\":\"deposit\",\"type\":\"tuple\"},{\"internalType\":\"uint256\",\"name\":\"availableLiquidity\",\"type\":\"uint256\"}],\"internalType\":\"struct HDFCRamp.DepositWithAvailableLiquidity[]\",\"name\":\"depositArray\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_account\",\"type\":\"address\"}],\"name\":\"getIdCurrentIntentHash\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[]\",\"name\":\"_intentHashes\",\"type\":\"bytes32[]\"}],\"name\":\"getIntentsWithOnRamperId\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"intentHash\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"onRamper\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"deposit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"intentTimestamp\",\"type\":\"uint256\"}],\"internalType\":\"struct HDFCRamp.Intent\",\"name\":\"intent\",\"type\":\"tuple\"},{\"internalType\":\"bytes32\",\"name\":\"onRamperIdHash\",\"type\":\"bytes32\"}],\"internalType\":\"struct HDFCRamp.IntentWithOnRamperId[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_account\",\"type\":\"address\"}],\"name\":\"getLastOnRampTimestamp\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IRegistrationProcessor\",\"name\":\"_registrationProcessor\",\"type\":\"address\"},{\"internalType\":\"contract IHDFCSendProcessor\",\"name\":\"_sendProcessor\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"intentExpirationPeriod\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"intents\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"onRamper\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"deposit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"intentTimestamp\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_account\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"_deniedUser\",\"type\":\"bytes32\"}],\"name\":\"isDeniedUser\",\"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\":\"maxOnRampAmount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"minDepositAmount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256[8]\",\"name\":\"_upiId\",\"type\":\"uint256[8]\"},{\"internalType\":\"uint256\",\"name\":\"_depositAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_receiveAmount\",\"type\":\"uint256\"}],\"name\":\"offRamp\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"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[15]\",\"name\":\"_signals\",\"type\":\"uint256[15]\"}],\"name\":\"onRamp\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"onRampCooldownPeriod\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"poseidon3\",\"outputs\":[{\"internalType\":\"contract IPoseidon3\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"poseidon6\",\"outputs\":[{\"internalType\":\"contract IPoseidon6\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256[8]\",\"name\":\"_upiId\",\"type\":\"uint256[8]\"},{\"internalType\":\"einput\",\"name\":\"_encryptedDepositAmount\",\"type\":\"bytes32\"},{\"internalType\":\"einput\",\"name\":\"_encryptedReceiveAmount\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"_inputProof\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"_depositAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_receiveAmount\",\"type\":\"uint256\"}],\"name\":\"privateOffRamp\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"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[5]\",\"name\":\"_signals\",\"type\":\"uint256[5]\"}],\"name\":\"register\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"registrationProcessor\",\"outputs\":[{\"internalType\":\"contract IRegistrationProcessor\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_intentHash\",\"type\":\"bytes32\"}],\"name\":\"releaseFundsToOnramper\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_approvedUser\",\"type\":\"bytes32\"}],\"name\":\"removeAccountFromDenylist\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"sendProcessor\",\"outputs\":[{\"internalType\":\"contract IHDFCSendProcessor\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_intentExpirationPeriod\",\"type\":\"uint256\"}],\"name\":\"setIntentExpirationPeriod\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_maxOnRampAmount\",\"type\":\"uint256\"}],\"name\":\"setMaxOnRampAmount\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_minDepositAmount\",\"type\":\"uint256\"}],\"name\":\"setMinDepositAmount\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_onRampCooldownPeriod\",\"type\":\"uint256\"}],\"name\":\"setOnRampCooldownPeriod\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IRegistrationProcessor\",\"name\":\"_registrationProcessor\",\"type\":\"address\"}],\"name\":\"setRegistrationProcessor\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IHDFCSendProcessor\",\"name\":\"_sendProcessor\",\"type\":\"address\"}],\"name\":\"setSendProcessor\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_fee\",\"type\":\"uint256\"}],\"name\":\"setSustainabilityFee\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_feeRecipient\",\"type\":\"address\"}],\"name\":\"setSustainabilityFeeRecipient\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_depositId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"}],\"name\":\"signalIntent\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"sustainabilityFee\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"sustainabilityFeeRecipient\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"usdc\",\"outputs\":[{\"internalType\":\"contract IERC20\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256[]\",\"name\":\"_depositIds\",\"type\":\"uint256[]\"}],\"name\":\"withdrawDeposit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"addAccountToDenylist(bytes32)\":{\"params\":{\"_deniedUser\":\"Poseidon hash of the idHash being banned\"}},\"cancelIntent(bytes32)\":{\"params\":{\"_intentHash\":\"Hash of intent being cancelled\"}},\"initialize(address,address)\":{\"params\":{\"_registrationProcessor\":\"Registration processor address\",\"_sendProcessor\":\"Send processor address\"}},\"offRamp(uint256[8],uint256,uint256)\":{\"params\":{\"_depositAmount\":\"The amount of USDC to off-ramp\",\"_receiveAmount\":\"The amount of USD to receive\",\"_upiId\":\"The packed upi ID of the depositor\"}},\"onRamp(uint256[2],uint256[2][2],uint256[2],uint256[15])\":{\"params\":{\"_a\":\"Parameter of zk proof\",\"_b\":\"Parameter of zk proof\",\"_c\":\"Parameter of zk proof\",\"_signals\":\"Encoded public signals of the zk proof, contains mailserverHash, fromEmail, timestamp, onRamperIdHash, nullifier, intentHash\"}},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"register(uint256[2],uint256[2][2],uint256[2],uint256[5])\":{\"params\":{\"_a\":\"Parameter of zk proof\",\"_b\":\"Parameter of zk proof\",\"_c\":\"Parameter of zk proof\",\"_signals\":\"Encoded public signals of the zk proof, contains mailserverHash, fromEmail, userIdHash\"}},\"releaseFundsToOnramper(bytes32)\":{\"params\":{\"_intentHash\":\"Hash of intent to resolve by releasing the funds\"}},\"removeAccountFromDenylist(bytes32)\":{\"params\":{\"_approvedUser\":\"Poseidon hash of the idHash being approved\"}},\"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.\"},\"setIntentExpirationPeriod(uint256)\":{\"params\":{\"_intentExpirationPeriod\":\"New intent expiration period\"}},\"setMaxOnRampAmount(uint256)\":{\"params\":{\"_maxOnRampAmount\":\"The new max on ramp amount\"}},\"setMinDepositAmount(uint256)\":{\"params\":{\"_minDepositAmount\":\"The new minimum deposit amount\"}},\"setOnRampCooldownPeriod(uint256)\":{\"params\":{\"_onRampCooldownPeriod\":\"New on-ramp cooldown period\"}},\"setRegistrationProcessor(address)\":{\"params\":{\"_registrationProcessor\":\"New registration proccesor address\"}},\"setSendProcessor(address)\":{\"params\":{\"_sendProcessor\":\"New send proccesor address\"}},\"setSustainabilityFee(uint256)\":{\"params\":{\"_fee\":\"The new sustainability fee in precise units (10**18, ie 10% = 1e17)\"}},\"setSustainabilityFeeRecipient(address)\":{\"params\":{\"_feeRecipient\":\"The new fee recipient address\"}},\"signalIntent(uint256,uint256,address)\":{\"params\":{\"_amount\":\"The amount of USDC the user wants to on-ramp\",\"_depositId\":\"The ID of the deposit the on-ramper intends to use for \",\"_to\":\"Address to forward funds to (can be same as onRamper)\"}},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"},\"withdrawDeposit(uint256[])\":{\"params\":{\"_depositIds\":\"Array of depositIds the depositor is attempting to withdraw\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"addAccountToDenylist(bytes32)\":{\"notice\":\"Adds an idHash to a depositor's deny list. If an address associated with the banned idHash attempts to signal an intent on the user's deposit they will be denied.\"},\"cancelIntent(bytes32)\":{\"notice\":\"Only callable by the originator of the intent. Cancels an outstanding intent thus allowing user to signal a new intent. Deposit state is updated to reflect the cancelled intent.\"},\"initialize(address,address)\":{\"notice\":\"Initialize Ramp with the addresses of the Processors\"},\"offRamp(uint256[8],uint256,uint256)\":{\"notice\":\"Generates a deposit entry for off-rampers that can then be fulfilled by an on-ramper. This function will not add to previous deposits. Every deposit has it's own unique identifier. User must approve the contract to transfer the deposit amount of USDC.\"},\"onRamp(uint256[2],uint256[2][2],uint256[2],uint256[15])\":{\"notice\":\"Anyone can submit an on-ramp transaction, even if caller isn't on-ramper. Upon submission the proof is validated, intent is removed, and deposit state is updated. USDC is transferred to the on-ramper.\"},\"register(uint256[2],uint256[2][2],uint256[2],uint256[5])\":{\"notice\":\"Registers a new account by pulling the hash of the account id from the proof and assigning the account owner to the sender of the transaction. One HDFC account can be registered to multiple Ethereum addresses.\"},\"releaseFundsToOnramper(bytes32)\":{\"notice\":\"Allows off-ramper to release funds to the on-ramper in case of a failed on-ramp or because of some other arrangement between the two parties. Upon submission we check to make sure the msg.sender is the depositor, the intent is removed, and deposit state is updated. USDC is transferred to the on-ramper.\"},\"removeAccountFromDenylist(bytes32)\":{\"notice\":\"Removes a idHash from a depositor's deny list.\"},\"setIntentExpirationPeriod(uint256)\":{\"notice\":\"GOVERNANCE ONLY: Updates the intent expiration period, after this period elapses an intent can be pruned to prevent locking up a depositor's funds.\"},\"setMaxOnRampAmount(uint256)\":{\"notice\":\"GOVERNANCE ONLY: Updates the max amount allowed to be on-ramped in each transaction. To on-ramp more than this amount a user must make multiple transactions.\"},\"setMinDepositAmount(uint256)\":{\"notice\":\"GOVERNANCE ONLY: Updates the minimum deposit amount a user can specify for off-ramping.\"},\"setOnRampCooldownPeriod(uint256)\":{\"notice\":\"GOVERNANCE ONLY: Updates the on-ramp cooldown period, once an on-ramp transaction is completed the user must wait this amount of time before they can signalIntent to on-ramp again.\"},\"setRegistrationProcessor(address)\":{\"notice\":\"GOVERNANCE ONLY: Updates the registration processor address used for validating and interpreting zk proofs.\"},\"setSendProcessor(address)\":{\"notice\":\"GOVERNANCE ONLY: Updates the send processor address used for validating and interpreting zk proofs.\"},\"setSustainabilityFee(uint256)\":{\"notice\":\"GOVERNANCE ONLY: Updates the sustainability fee. This fee is charged to on-rampers upon a successful on-ramp.\"},\"setSustainabilityFeeRecipient(address)\":{\"notice\":\"GOVERNANCE ONLY: Updates the recepient of sustainability fees.\"},\"signalIntent(uint256,uint256,address)\":{\"notice\":\"Signals intent to pay the depositor defined in the _depositId the _amount * deposit conversionRate off-chain in order to unlock _amount of funds on-chain. Each user can only have one outstanding intent at a time regardless of address (tracked using idHash). Caller must not be on the depositor's deny list. If there are prunable intents then they will be deleted from the deposit to be able to maintain state hygiene.\"},\"withdrawDeposit(uint256[])\":{\"notice\":\"Caller must be the depositor for each depositId in the array, if not whole function fails. Depositor is returned all remaining deposits and any outstanding intents that are expired. If an intent is not expired then those funds will not be returned. Deposit will be deleted as long as there are no more outstanding intents.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/ramps/hdfc/HDFCRamp.sol\":\"HDFCRamp\"},\"evmVersion\":\"shanghai\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"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/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/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (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\",\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"license\":\"MIT\"},\"contracts/external/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/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 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\":\"0x102021415f8444ff563fc6d0082f39296f47c09ce73fb4cd642e700ac489eefe\",\"license\":\"Apache-2.0\"},\"contracts/interfaces/IEERC20.sol\":{\"content\":\"// SPDX-License-Identifier: UNLICENSED\\n\\npragma solidity ^0.8.24;\\n\\nimport \\\"fhevm/lib/TFHE.sol\\\";\\n\\ninterface IeERC20 {\\n event Transfer(address indexed from, address indexed to);\\n event Approval(address indexed owner, address indexed spender);\\n event Mint(address indexed to, uint64 amount);\\n\\n // Returns the name of the token.\\n function name() external view returns (string memory);\\n\\n // Returns the symbol of the token, usually a shorter version of the name.\\n function symbol() external view returns (string memory);\\n\\n // Returns the total supply of the token.\\n function totalSupply() external view returns (uint64);\\n\\n // Transfers an encrypted amount from the message sender address to the `to` address.\\n function transfer(address to, einput encryptedAmount, bytes calldata inputProof) external returns (bool);\\n\\n // Transfers an amount from the message sender address to the `to` address.\\n function transfer(address to, euint64 amount) external returns (bool);\\n\\n // Returns the balance handle of the specified wallet.\\n function balanceOf(address wallet) external view returns (euint64);\\n\\n // Sets the `encryptedAmount` as the allowance of `spender` over the caller's tokens.\\n function approve(address spender, einput encryptedAmount, bytes calldata inputProof) external returns (bool);\\n\\n // Sets the `amount` as the allowance of `spender` over the caller's tokens.\\n function approve(address spender, euint64 amount) external returns (bool);\\n\\n // Returns the remaining number of tokens that `spender` is allowed to spend on behalf of the owner.\\n function allowance(address owner, address spender) external view returns (euint64);\\n\\n // Transfers `encryptedAmount` tokens using the caller's allowance.\\n function transferFrom(\\n address from,\\n address to,\\n einput encryptedAmount,\\n bytes calldata inputProof\\n ) external returns (bool);\\n\\n // Transfers `amount` tokens using the caller's allowance.\\n function transferFrom(address from, address to, euint64 amount) external returns (bool);\\n}\\n\",\"keccak256\":\"0x59b5b6381aa9867da41b15b32c63531d1a8c194f5686b9ecd788ba932e8b1c06\",\"license\":\"UNLICENSED\"},\"contracts/interfaces/IPoseidon3.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.18;\\n\\ninterface IPoseidon3 {\\n function poseidon(uint256[3] memory _a) external pure returns(uint256);\\n}\\n\",\"keccak256\":\"0x39cd67d4a7ef93e243c77b7c8a40c3842c060a7f444b0b2c875bce7d8d0c24fa\",\"license\":\"MIT\"},\"contracts/interfaces/IPoseidon6.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.18;\\n\\ninterface IPoseidon6 {\\n function poseidon(uint256[6] memory _a) external pure returns(uint256);\\n}\\n\",\"keccak256\":\"0x9609bcff68e45a22b551bf5f42a5ea62ea0b33e433a89f7c89a6b0714df09229\",\"license\":\"MIT\"},\"contracts/ramps/hdfc/HDFCRamp.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\n\\nimport { IERC20 } from \\\"@openzeppelin/contracts/token/ERC20/IERC20.sol\\\";\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\nimport { Bytes32ArrayUtils } from \\\"../../external/Bytes32ArrayUtils.sol\\\";\\nimport { Uint256ArrayUtils } from \\\"../../external/Uint256ArrayUtils.sol\\\";\\n\\nimport { IPoseidon3 } from \\\"../../interfaces/IPoseidon3.sol\\\";\\nimport { IPoseidon6 } from \\\"../../interfaces/IPoseidon6.sol\\\";\\nimport { IRegistrationProcessor } from \\\"./interfaces/IRegistrationProcessor.sol\\\";\\nimport { IHDFCSendProcessor } from \\\"./interfaces/IHDFCSendProcessor.sol\\\";\\n\\nimport { IeERC20 } from \\\"../../interfaces/IEERC20.sol\\\";\\nimport \\\"fhevm/lib/TFHE.sol\\\";\\n\\npragma solidity ^0.8.18;\\ncontract HDFCRamp is Ownable {\\n\\n using Bytes32ArrayUtils for bytes32[];\\n using Uint256ArrayUtils for uint256[];\\n\\n /* ============ Events ============ */\\n event AccountRegistered(address indexed accountOwner, bytes32 indexed idHash);\\n event DepositReceived(\\n uint256 indexed depositId,\\n bytes32 indexed idHash,\\n uint256 amount,\\n uint256 conversionRate\\n );\\n\\n event EncryptedDepositReceived(\\n uint256 indexed depositId,\\n bytes32 indexed idHash,\\n euint32 amount,\\n euint32 conversionRate\\n );\\n\\n event IntentSignaled(\\n bytes32 indexed intentHash,\\n uint256 indexed depositId,\\n bytes32 indexed idHash,\\n address to,\\n uint256 amount,\\n uint256 timestamp\\n );\\n\\n event IntentPruned(\\n bytes32 indexed intentHash,\\n uint256 indexed depositId\\n );\\n // Do we want to emit the onRamper or the idHash\\n event IntentFulfilled(\\n bytes32 indexed intentHash,\\n uint256 indexed depositId,\\n address indexed onRamper,\\n address to,\\n uint256 amount,\\n uint256 feeAmount\\n );\\n event DepositWithdrawn(\\n uint256 indexed depositId,\\n address indexed depositor,\\n uint256 amount\\n );\\n\\n event DepositClosed(uint256 depositId, address depositor);\\n event UserAddedToDenylist(bytes32 listOwner, bytes32 deniedUser);\\n event UserRemovedFromDenylist(bytes32 listOwner, bytes32 approvedUser);\\n event MinDepositAmountSet(uint256 minDepositAmount);\\n event MaxOnRampAmountSet(uint256 maxOnRampAmount);\\n event IntentExpirationPeriodSet(uint256 intentExpirationPeriod);\\n event OnRampCooldownPeriodSet(uint256 onRampCooldownPeriod);\\n event SustainabilityFeeUpdated(uint256 fee);\\n event SustainabilityFeeRecipientUpdated(address feeRecipient);\\n event NewSendProcessorSet(address sendProcessor);\\n event NewRegistrationProcessorSet(address registrationProcessor);\\n event NewReceiveProcessorSet(address receiveProcessor);\\n\\n /* ============ Structs ============ */\\n\\n // Each Account is tied to a GlobalAccount via its associated idHash. Each account is represented by an Ethereum address\\n // and is allowed to have at most 5 deposits associated with it.\\n struct AccountInfo {\\n bytes32 idHash; // Hash of payment processor id\\n uint256[] deposits; // Array of open account deposits\\n }\\n\\n struct Deposit {\\n address depositor;\\n uint256[8] upiId;\\n uint256 depositAmount; // Amount of USDC deposited\\n uint256 remainingDeposits; // Amount of remaining deposited liquidity\\n uint256 outstandingIntentAmount; // Amount of outstanding intents (may include expired intents)\\n uint256 conversionRate; // Conversion required by off-ramper between USDC/USD\\n bytes32[] intentHashes; // Array of hashes of all open intents (may include some expired if not pruned)\\n }\\n\\n struct EncryptedDeposit {\\n address despositor;\\n uint256[8] upiId;\\n euint32 depositAmount;\\n euint32 remainingDeposits;\\n euint32 outstandingIntentAmount;\\n euint32 conversionRate;\\n bytes32[] intentHashes;\\n }\\n\\n struct DepositWithAvailableLiquidity {\\n uint256 depositId; // ID of the deposit\\n bytes32 depositorIdHash; // Depositor's idHash \\n Deposit deposit; // Deposit struct\\n uint256 availableLiquidity; // Amount of liquidity available to signal intents (net of expired intents)\\n }\\n\\n struct Intent {\\n address onRamper; // On-ramper's address\\n address to; // Address to forward funds to (can be same as onRamper)\\n uint256 deposit; // ID of the deposit the intent is signaling on\\n uint256 amount; // Amount of USDC the on-ramper signals intent for on-chain\\n uint256 intentTimestamp; // Timestamp of when the intent was signaled\\n }\\n\\n struct IntentWithOnRamperId {\\n bytes32 intentHash; // Intent hash\\n Intent intent; // Intent struct\\n bytes32 onRamperIdHash; // Poseidon hash of the on-ramper's idHash\\n }\\n\\n struct DenyList {\\n bytes32[] deniedUsers; // Array of idHashes that are denied from taking depositors liquidity\\n mapping(bytes32 => bool) isDenied; // Mapping of idHash to boolean indicating if the user is denied\\n }\\n\\n // A Global Account is defined as an account represented by one idHash. This is used to enforce limitations on actions across\\n // all Ethereum addresses that are associated with that idHash. In this case we use it to enforce a cooldown period between on ramps,\\n // restrict each HDFC account to one outstanding intent at a time, and to enforce deny lists.\\n struct GlobalAccountInfo {\\n bytes32 currentIntentHash; // Hash of the current open intent (if exists)\\n uint256 lastOnrampTimestamp; // Timestamp of the last on-ramp transaction used to check if cooldown period elapsed\\n DenyList denyList; // Deny list of the account\\n }\\n\\n /* ============ Modifiers ============ */\\n modifier onlyRegisteredUser() {\\n require(accounts[msg.sender].idHash != bytes32(0), \\\"Caller must be registered user\\\");\\n _;\\n }\\n\\n /* ============ Constants ============ */\\n uint256 internal constant PRECISE_UNIT = 1e18;\\n uint256 internal constant MAX_DEPOSITS = 5; // An account can only have max 5 different deposit parameterizations to prevent locking funds\\n uint256 constant CIRCOM_PRIME_FIELD = 21888242871839275222246405745257275088548364400416034343698204186575808495617;\\n uint256 constant MAX_SUSTAINABILITY_FEE = 5e16; // 5% max sustainability fee\\n \\n /* ============ State Variables ============ */\\n IERC20 public immutable usdc; // USDC token contract\\n IeERC20 public immutable eusdc; // Encrypted USDC token contract (just named is encrypted usdc lol)\\n IPoseidon3 public immutable poseidon3; // Poseidon hashing contract\\n IPoseidon6 public immutable poseidon6; // Poseidon hashing contract\\n IRegistrationProcessor public registrationProcessor; // Address of registration processor contract, verifies registration e-mails\\n IHDFCSendProcessor public sendProcessor; // Address of send processor contract, verifies onRamp emails\\n\\n bool public isInitialized; // Indicates if contract has been initialized\\n\\n mapping(bytes32 => GlobalAccountInfo) internal globalAccount; // Mapping of idHash to information used to enforce actions across Ethereum accounts\\n mapping(address => AccountInfo) internal accounts; // Mapping of Ethereum accounts to their account information (idHash and deposits)\\n mapping(uint256 => Deposit) public deposits; // Mapping of depositIds to deposit structs\\n mapping(uint256 => EncryptedDeposit) public encryptedDeposits; // Mapping of depositIds to deposit structs\\n mapping(bytes32 => Intent) public intents; // Mapping of intentHashes to intent structs\\n\\n uint256 public minDepositAmount; // Minimum amount of USDC that can be deposited\\n uint256 public maxOnRampAmount; // Maximum amount of USDC that can be on-ramped in a single transaction\\n uint256 public onRampCooldownPeriod; // Time period that must elapse between completing an on-ramp and signaling a new intent\\n uint256 public intentExpirationPeriod; // Time period after which an intent can be pruned from the system\\n uint256 public sustainabilityFee; // Fee charged to on-rampers in preciseUnits (1e16 = 1%)\\n address public sustainabilityFeeRecipient; // Address that receives the sustainability fee\\n\\n uint256 public depositCounter; // Counter for depositIds\\n\\n /* ============ Constructor ============ */\\n constructor(\\n address _owner,\\n IERC20 _usdc,\\n IeERC20 _eusdc,\\n IPoseidon3 _poseidon3,\\n IPoseidon6 _poseidon6,\\n uint256 _minDepositAmount,\\n uint256 _maxOnRampAmount,\\n uint256 _intentExpirationPeriod,\\n uint256 _onRampCooldownPeriod,\\n uint256 _sustainabilityFee,\\n address _sustainabilityFeeRecipient\\n )\\n Ownable()\\n {\\n usdc = _usdc;\\n eusdc = _eusdc;\\n poseidon3 = _poseidon3;\\n poseidon6 = _poseidon6;\\n minDepositAmount = _minDepositAmount;\\n maxOnRampAmount = _maxOnRampAmount;\\n intentExpirationPeriod = _intentExpirationPeriod;\\n onRampCooldownPeriod = _onRampCooldownPeriod;\\n sustainabilityFee = _sustainabilityFee;\\n sustainabilityFeeRecipient = _sustainabilityFeeRecipient;\\n\\n transferOwnership(_owner);\\n }\\n\\n /* ============ External Functions ============ */\\n\\n /**\\n * @notice Initialize Ramp with the addresses of the Processors\\n *\\n * @param _registrationProcessor Registration processor address\\n * @param _sendProcessor Send processor address\\n */\\n function initialize(\\n IRegistrationProcessor _registrationProcessor,\\n IHDFCSendProcessor _sendProcessor\\n )\\n external\\n onlyOwner\\n {\\n require(!isInitialized, \\\"Already initialized\\\");\\n\\n registrationProcessor = _registrationProcessor;\\n sendProcessor = _sendProcessor;\\n\\n isInitialized = true;\\n }\\n\\n /**\\n * @notice Registers a new account by pulling the hash of the account id from the proof and assigning the account owner to the\\n * sender of the transaction. One HDFC account can be registered to multiple Ethereum addresses.\\n *\\n * @param _a Parameter of zk proof\\n * @param _b Parameter of zk proof\\n * @param _c Parameter of zk proof\\n * @param _signals Encoded public signals of the zk proof, contains mailserverHash, fromEmail, userIdHash\\n */\\n function register(\\n uint[2] memory _a,\\n uint[2][2] memory _b,\\n uint[2] memory _c,\\n uint[5] memory _signals\\n )\\n external\\n {\\n require(accounts[msg.sender].idHash == bytes32(0), \\\"Account already associated with idHash\\\");\\n bytes32 idHash = _verifyRegistrationProof(_a, _b, _c, _signals);\\n\\n accounts[msg.sender].idHash = idHash;\\n\\n emit AccountRegistered(msg.sender, idHash);\\n }\\n\\n /**\\n * @notice Generates a deposit entry for off-rampers that can then be fulfilled by an on-ramper. This function will not add to\\n * previous deposits. Every deposit has it's own unique identifier. User must approve the contract to transfer the deposit amount\\n * of USDC.\\n *\\n * @param _upiId The packed upi ID of the depositor\\n * @param _depositAmount The amount of USDC to off-ramp\\n * @param _receiveAmount The amount of USD to receive\\n */\\n function offRamp(\\n uint256[8] memory _upiId,\\n uint256 _depositAmount,\\n uint256 _receiveAmount\\n )\\n external\\n onlyRegisteredUser\\n {\\n require(accounts[msg.sender].deposits.length < MAX_DEPOSITS, \\\"Maximum deposit amount reached\\\");\\n require(_depositAmount >= minDepositAmount, \\\"Deposit amount must be greater than min deposit amount\\\");\\n require(_receiveAmount > 0, \\\"Receive amount must be greater than 0\\\");\\n\\n uint256 conversionRate = (_depositAmount * PRECISE_UNIT) / _receiveAmount;\\n uint256 depositId = depositCounter++;\\n\\n AccountInfo storage account = accounts[msg.sender];\\n account.deposits.push(depositId);\\n\\n deposits[depositId] = Deposit({\\n depositor: msg.sender,\\n upiId: _upiId,\\n depositAmount: _depositAmount,\\n remainingDeposits: _depositAmount,\\n outstandingIntentAmount: 0,\\n conversionRate: conversionRate,\\n intentHashes: new bytes32[](0)\\n });\\n\\n usdc.transferFrom(msg.sender, address(this), _depositAmount);\\n\\n emit DepositReceived(depositId, account.idHash, _depositAmount, conversionRate);\\n }\\n\\n // for simplicity considering uint32 only\\n // this method doesn't implements requires and assumes parameters are valid for simplicity\\n function privateOffRamp(\\n uint256[8] memory _upiId,\\n einput _encryptedDepositAmount, \\n einput _encryptedReceiveAmount,\\n bytes calldata _inputProof,\\n uint256 _depositAmount,\\n uint256 _receiveAmount\\n )\\n external\\n onlyRegisteredUser\\n {\\n // require(accounts[msg.sender].deposits.length < MAX_DEPOSITS, \\\"Maximum deposit amount reached\\\");\\n euint32 encryptedDepositAmount = TFHE.asEuint32(_encryptedDepositAmount, _inputProof);\\n euint32 encryptedReceiveAmount = TFHE.asEuint32(_encryptedReceiveAmount, _inputProof);\\n\\n // ebool depositAmountGreaterThanMinDeposit = TFHE.gt(encryptedDepositAmount, TFHE.asEuint32(minDepositAmount));\\n // ebool receivedAmountGreaterThanZero = TFHE.gt(encryptedReceiveAmount, TFHE.asEuint32(0));\\n\\n // require(_depositAmount >= minDepositAmount, \\\"Deposit amount must be greater than min deposit amount\\\");\\n // require(_receiveAmount > 0, \\\"Receive amount must be greater than 0\\\");\\n\\n // uint256 conversionRate = (_depositAmount * PRECISE_UNIT) / _receiveAmount;\\n\\n // since 1e18 can't fit into 2^64\\n uint32 ENC_PRECISE_UINT = 1e9;\\n // for now let's keep the conversion uint as 1 since division between two encrypted values is not supported\\n euint32 encryptedConversionRate = TFHE.asEuint32(1);\\n // TFHE.div(TFHE.mul(encryptedDepositAmount, TFHE.asEuint32(ENC_PRECISE_UINT)), encryptedReceiveAmount);\\n uint256 depositId = depositCounter++;\\n\\n AccountInfo storage account = accounts[msg.sender];\\n account.deposits.push(depositId);\\n\\n encryptedDeposits[depositId] = EncryptedDeposit({\\n despositor: msg.sender,\\n upiId: _upiId,\\n depositAmount: encryptedDepositAmount,\\n remainingDeposits: encryptedDepositAmount,\\n outstandingIntentAmount: TFHE.asEuint32(0),\\n conversionRate: encryptedConversionRate,\\n intentHashes: new bytes32[](0)\\n });\\n\\n // deposits[depositId] = Deposit({\\n // depositor: msg.sender,\\n // upiId: _upiId,\\n // depositAmount: _depositAmount,\\n // remainingDeposits: _depositAmount,\\n // outstandingIntentAmount: 0,\\n // conversionRate: conversionRate,\\n // intentHashes: new bytes32[](0)\\n // });\\n\\n // usdc.transferFrom(msg.sender, address(this), _depositAmount);\\n // transferFrom will implicitly convert euint32 to euint64\\n eusdc.transferFrom(msg.sender, address(this), _encryptedDepositAmount, _inputProof);\\n emit EncryptedDepositReceived(depositId, account.idHash, encryptedDepositAmount, encryptedConversionRate);\\n // emit DepositReceived(depositId, account.idHash, _depositAmount, conversionRate);\\n }\\n\\n /**\\n * @notice Signals intent to pay the depositor defined in the _depositId the _amount * deposit conversionRate off-chain\\n * in order to unlock _amount of funds on-chain. Each user can only have one outstanding intent at a time regardless of\\n * address (tracked using idHash). Caller must not be on the depositor's deny list. If there are prunable intents then\\n * they will be deleted from the deposit to be able to maintain state hygiene.\\n *\\n * @param _depositId The ID of the deposit the on-ramper intends to use for \\n * @param _amount The amount of USDC the user wants to on-ramp\\n * @param _to Address to forward funds to (can be same as onRamper)\\n */\\n function signalIntent(uint256 _depositId, uint256 _amount, address _to) external onlyRegisteredUser {\\n bytes32 idHash = accounts[msg.sender].idHash;\\n Deposit storage deposit = deposits[_depositId];\\n bytes32 depositorIdHash = accounts[deposit.depositor].idHash;\\n\\n // Caller validity checks\\n require(!globalAccount[depositorIdHash].denyList.isDenied[idHash], \\\"Onramper on depositor's denylist\\\");\\n require(\\n globalAccount[idHash].lastOnrampTimestamp + onRampCooldownPeriod <= block.timestamp,\\n \\\"On ramp cool down period not elapsed\\\"\\n );\\n require(globalAccount[idHash].currentIntentHash == bytes32(0), \\\"Intent still outstanding\\\");\\n require(depositorIdHash != idHash, \\\"Sender cannot be the depositor\\\");\\n\\n // Intent information checks\\n require(deposit.depositor != address(0), \\\"Deposit does not exist\\\");\\n require(_amount > 0, \\\"Signaled amount must be greater than 0\\\");\\n require(_amount <= maxOnRampAmount, \\\"Signaled amount must be less than max on-ramp amount\\\");\\n require(_to != address(0), \\\"Cannot send to zero address\\\");\\n\\n bytes32 intentHash = _calculateIntentHash(idHash, _depositId);\\n\\n if (deposit.remainingDeposits < _amount) {\\n (\\n bytes32[] memory prunableIntents,\\n uint256 reclaimableAmount\\n ) = _getPrunableIntents(_depositId);\\n\\n require(deposit.remainingDeposits + reclaimableAmount >= _amount, \\\"Not enough liquidity\\\");\\n\\n _pruneIntents(deposit, prunableIntents);\\n deposit.remainingDeposits += reclaimableAmount;\\n deposit.outstandingIntentAmount -= reclaimableAmount;\\n }\\n\\n intents[intentHash] = Intent({\\n onRamper: msg.sender,\\n to: _to,\\n deposit: _depositId,\\n amount: _amount,\\n intentTimestamp: block.timestamp\\n });\\n\\n globalAccount[idHash].currentIntentHash = intentHash;\\n\\n deposit.remainingDeposits -= _amount;\\n deposit.outstandingIntentAmount += _amount;\\n deposit.intentHashes.push(intentHash);\\n\\n emit IntentSignaled(intentHash, _depositId, idHash, _to, _amount, block.timestamp);\\n }\\n\\n /**\\n * @notice Only callable by the originator of the intent. Cancels an outstanding intent thus allowing user to signal a new\\n * intent. Deposit state is updated to reflect the cancelled intent.\\n *\\n * @param _intentHash Hash of intent being cancelled\\n */\\n function cancelIntent(bytes32 _intentHash) external {\\n Intent memory intent = intents[_intentHash];\\n \\n require(intent.intentTimestamp != 0, \\\"Intent does not exist\\\");\\n require(\\n accounts[intent.onRamper].idHash == accounts[msg.sender].idHash,\\n \\\"Sender must be the on-ramper\\\"\\n );\\n\\n Deposit storage deposit = deposits[intent.deposit];\\n\\n _pruneIntent(deposit, _intentHash);\\n\\n deposit.remainingDeposits += intent.amount;\\n deposit.outstandingIntentAmount -= intent.amount;\\n }\\n\\n /**\\n * @notice Anyone can submit an on-ramp transaction, even if caller isn't on-ramper. Upon submission the proof is validated,\\n * intent is removed, and deposit state is updated. USDC is transferred to the on-ramper.\\n *\\n * @param _a Parameter of zk proof\\n * @param _b Parameter of zk proof\\n * @param _c Parameter of zk proof\\n * @param _signals Encoded public signals of the zk proof, contains mailserverHash, fromEmail, timestamp, onRamperIdHash,\\n * nullifier, intentHash\\n */\\n function onRamp(\\n uint256[2] memory _a,\\n uint256[2][2] memory _b,\\n uint256[2] memory _c,\\n uint256[15] memory _signals\\n )\\n external\\n {\\n (\\n Intent memory intent,\\n Deposit storage deposit,\\n bytes32 intentHash\\n ) = _verifyOnRampProof(_a, _b, _c, _signals);\\n\\n _pruneIntent(deposit, intentHash);\\n\\n deposit.outstandingIntentAmount -= intent.amount;\\n globalAccount[accounts[intent.onRamper].idHash].lastOnrampTimestamp = block.timestamp;\\n _closeDepositIfNecessary(intent.deposit, deposit);\\n\\n _transferFunds(intentHash, intent);\\n }\\n\\n /**\\n * @notice Allows off-ramper to release funds to the on-ramper in case of a failed on-ramp or because of some other arrangement\\n * between the two parties. Upon submission we check to make sure the msg.sender is the depositor, the intent is removed, and \\n * deposit state is updated. USDC is transferred to the on-ramper.\\n *\\n * @param _intentHash Hash of intent to resolve by releasing the funds\\n */\\n function releaseFundsToOnramper(bytes32 _intentHash) external {\\n Intent memory intent = intents[_intentHash];\\n Deposit storage deposit = deposits[intent.deposit];\\n\\n require(intent.onRamper != address(0), \\\"Intent does not exist\\\");\\n require(deposit.depositor == msg.sender, \\\"Caller must be the depositor\\\");\\n\\n _pruneIntent(deposit, _intentHash);\\n\\n deposit.outstandingIntentAmount -= intent.amount;\\n globalAccount[accounts[intent.onRamper].idHash].lastOnrampTimestamp = block.timestamp;\\n _closeDepositIfNecessary(intent.deposit, deposit);\\n\\n _transferFunds(_intentHash, intent);\\n }\\n\\n /**\\n * @notice Caller must be the depositor for each depositId in the array, if not whole function fails. Depositor is returned all\\n * remaining deposits and any outstanding intents that are expired. If an intent is not expired then those funds will not be\\n * returned. Deposit will be deleted as long as there are no more outstanding intents.\\n *\\n * @param _depositIds Array of depositIds the depositor is attempting to withdraw\\n */\\n function withdrawDeposit(uint256[] memory _depositIds) external {\\n uint256 returnAmount;\\n\\n for (uint256 i = 0; i < _depositIds.length; ++i) {\\n uint256 depositId = _depositIds[i];\\n Deposit storage deposit = deposits[depositId];\\n\\n require(deposit.depositor == msg.sender, \\\"Sender must be the depositor\\\");\\n\\n (\\n bytes32[] memory prunableIntents,\\n uint256 reclaimableAmount\\n ) = _getPrunableIntents(depositId);\\n\\n _pruneIntents(deposit, prunableIntents);\\n\\n returnAmount += deposit.remainingDeposits + reclaimableAmount;\\n \\n deposit.outstandingIntentAmount -= reclaimableAmount;\\n\\n emit DepositWithdrawn(depositId, deposit.depositor, deposit.remainingDeposits + reclaimableAmount);\\n \\n delete deposit.remainingDeposits;\\n _closeDepositIfNecessary(depositId, deposit);\\n }\\n\\n usdc.transfer(msg.sender, returnAmount);\\n }\\n\\n /**\\n * @notice Adds an idHash to a depositor's deny list. If an address associated with the banned idHash attempts to\\n * signal an intent on the user's deposit they will be denied.\\n *\\n * @param _deniedUser Poseidon hash of the idHash being banned\\n */\\n function addAccountToDenylist(bytes32 _deniedUser) external onlyRegisteredUser {\\n bytes32 denyingUser = accounts[msg.sender].idHash;\\n\\n require(!globalAccount[denyingUser].denyList.isDenied[_deniedUser], \\\"User already on denylist\\\");\\n\\n globalAccount[denyingUser].denyList.isDenied[_deniedUser] = true;\\n globalAccount[denyingUser].denyList.deniedUsers.push(_deniedUser);\\n\\n emit UserAddedToDenylist(denyingUser, _deniedUser);\\n }\\n\\n /**\\n * @notice Removes a idHash from a depositor's deny list.\\n *\\n * @param _approvedUser Poseidon hash of the idHash being approved\\n */\\n function removeAccountFromDenylist(bytes32 _approvedUser) external onlyRegisteredUser {\\n bytes32 approvingUser = accounts[msg.sender].idHash;\\n\\n require(globalAccount[approvingUser].denyList.isDenied[_approvedUser], \\\"User not on denylist\\\");\\n\\n globalAccount[approvingUser].denyList.isDenied[_approvedUser] = false;\\n globalAccount[approvingUser].denyList.deniedUsers.removeStorage(_approvedUser);\\n\\n emit UserRemovedFromDenylist(approvingUser, _approvedUser);\\n }\\n\\n /* ============ Governance Functions ============ */\\n\\n /**\\n * @notice GOVERNANCE ONLY: Updates the send processor address used for validating and interpreting zk proofs.\\n *\\n * @param _sendProcessor New send proccesor address\\n */\\n function setSendProcessor(IHDFCSendProcessor _sendProcessor) external onlyOwner {\\n sendProcessor = _sendProcessor;\\n emit NewSendProcessorSet(address(_sendProcessor));\\n }\\n\\n /**\\n * @notice GOVERNANCE ONLY: Updates the registration processor address used for validating and interpreting zk proofs.\\n *\\n * @param _registrationProcessor New registration proccesor address\\n */\\n function setRegistrationProcessor(IRegistrationProcessor _registrationProcessor) external onlyOwner {\\n registrationProcessor = _registrationProcessor;\\n emit NewRegistrationProcessorSet(address(_registrationProcessor));\\n }\\n\\n /**\\n * @notice GOVERNANCE ONLY: Updates the minimum deposit amount a user can specify for off-ramping.\\n *\\n * @param _minDepositAmount The new minimum deposit amount\\n */\\n function setMinDepositAmount(uint256 _minDepositAmount) external onlyOwner {\\n require(_minDepositAmount != 0, \\\"Minimum deposit cannot be zero\\\");\\n\\n minDepositAmount = _minDepositAmount;\\n emit MinDepositAmountSet(_minDepositAmount);\\n }\\n\\n /**\\n * @notice GOVERNANCE ONLY: Updates the sustainability fee. This fee is charged to on-rampers upon a successful on-ramp.\\n *\\n * @param _fee The new sustainability fee in precise units (10**18, ie 10% = 1e17)\\n */\\n function setSustainabilityFee(uint256 _fee) external onlyOwner {\\n require(_fee <= MAX_SUSTAINABILITY_FEE, \\\"Fee cannot be greater than max fee\\\");\\n\\n sustainabilityFee = _fee;\\n emit SustainabilityFeeUpdated(_fee);\\n }\\n\\n /**\\n * @notice GOVERNANCE ONLY: Updates the recepient of sustainability fees.\\n *\\n * @param _feeRecipient The new fee recipient address\\n */\\n function setSustainabilityFeeRecipient(address _feeRecipient) external onlyOwner {\\n require(_feeRecipient != address(0), \\\"Fee recipient cannot be zero address\\\");\\n\\n sustainabilityFeeRecipient = _feeRecipient;\\n emit SustainabilityFeeRecipientUpdated(_feeRecipient);\\n }\\n\\n /**\\n * @notice GOVERNANCE ONLY: Updates the max amount allowed to be on-ramped in each transaction. To on-ramp more than\\n * this amount a user must make multiple transactions.\\n *\\n * @param _maxOnRampAmount The new max on ramp amount\\n */\\n function setMaxOnRampAmount(uint256 _maxOnRampAmount) external onlyOwner {\\n require(_maxOnRampAmount != 0, \\\"Max on ramp amount cannot be zero\\\");\\n\\n maxOnRampAmount = _maxOnRampAmount;\\n emit MaxOnRampAmountSet(_maxOnRampAmount);\\n }\\n\\n /**\\n * @notice GOVERNANCE ONLY: Updates the on-ramp cooldown period, once an on-ramp transaction is completed the user must wait this\\n * amount of time before they can signalIntent to on-ramp again.\\n *\\n * @param _onRampCooldownPeriod New on-ramp cooldown period\\n */\\n function setOnRampCooldownPeriod(uint256 _onRampCooldownPeriod) external onlyOwner {\\n onRampCooldownPeriod = _onRampCooldownPeriod;\\n emit OnRampCooldownPeriodSet(_onRampCooldownPeriod);\\n }\\n\\n /**\\n * @notice GOVERNANCE ONLY: Updates the intent expiration period, after this period elapses an intent can be pruned to prevent\\n * locking up a depositor's funds.\\n *\\n * @param _intentExpirationPeriod New intent expiration period\\n */\\n function setIntentExpirationPeriod(uint256 _intentExpirationPeriod) external onlyOwner {\\n require(_intentExpirationPeriod != 0, \\\"Max intent expiration period cannot be zero\\\");\\n\\n intentExpirationPeriod = _intentExpirationPeriod;\\n emit IntentExpirationPeriodSet(_intentExpirationPeriod);\\n }\\n\\n\\n /* ============ External View Functions ============ */\\n\\n function getDeposit(uint256 _depositId) external view returns (Deposit memory) {\\n return deposits[_depositId];\\n }\\n\\n function getAccountInfo(address _account) external view returns (AccountInfo memory) {\\n return accounts[_account];\\n }\\n\\n function getIdCurrentIntentHash(address _account) external view returns (bytes32) {\\n return globalAccount[accounts[_account].idHash].currentIntentHash;\\n }\\n\\n function getLastOnRampTimestamp(address _account) external view returns (uint256) {\\n return globalAccount[accounts[_account].idHash].lastOnrampTimestamp;\\n }\\n\\n function getDeniedUsers(address _account) external view returns (bytes32[] memory) {\\n return globalAccount[accounts[_account].idHash].denyList.deniedUsers;\\n }\\n\\n function isDeniedUser(address _account, bytes32 _deniedUser) external view returns (bool) {\\n return globalAccount[accounts[_account].idHash].denyList.isDenied[_deniedUser];\\n }\\n\\n function getIntentsWithOnRamperId(bytes32[] calldata _intentHashes) external view returns (IntentWithOnRamperId[] memory) {\\n IntentWithOnRamperId[] memory intentsWithOnRamperId = new IntentWithOnRamperId[](_intentHashes.length);\\n\\n for (uint256 i = 0; i < _intentHashes.length; ++i) {\\n bytes32 intentHash = _intentHashes[i];\\n Intent memory intent = intents[intentHash];\\n intentsWithOnRamperId[i] = IntentWithOnRamperId({\\n intentHash: _intentHashes[i],\\n intent: intent,\\n onRamperIdHash: accounts[intent.onRamper].idHash\\n });\\n }\\n\\n return intentsWithOnRamperId;\\n }\\n\\n function getAccountDeposits(address _account) external view returns (DepositWithAvailableLiquidity[] memory accountDeposits) {\\n uint256[] memory accountDepositIds = accounts[_account].deposits;\\n accountDeposits = new DepositWithAvailableLiquidity[](accountDepositIds.length);\\n \\n for (uint256 i = 0; i < accountDepositIds.length; ++i) {\\n uint256 depositId = accountDepositIds[i];\\n Deposit memory deposit = deposits[depositId];\\n ( , uint256 reclaimableAmount) = _getPrunableIntents(depositId);\\n\\n accountDeposits[i] = DepositWithAvailableLiquidity({\\n depositId: depositId,\\n depositorIdHash: accounts[deposit.depositor].idHash,\\n deposit: deposit,\\n availableLiquidity: deposit.remainingDeposits + reclaimableAmount\\n });\\n }\\n }\\n\\n function getDepositFromIds(uint256[] memory _depositIds) external view returns (DepositWithAvailableLiquidity[] memory depositArray) {\\n depositArray = new DepositWithAvailableLiquidity[](_depositIds.length);\\n\\n for (uint256 i = 0; i < _depositIds.length; ++i) {\\n uint256 depositId = _depositIds[i];\\n Deposit memory deposit = deposits[depositId];\\n ( , uint256 reclaimableAmount) = _getPrunableIntents(depositId);\\n\\n depositArray[i] = DepositWithAvailableLiquidity({\\n depositId: depositId,\\n depositorIdHash: accounts[deposit.depositor].idHash,\\n deposit: deposit,\\n availableLiquidity: deposit.remainingDeposits + reclaimableAmount\\n });\\n }\\n\\n return depositArray;\\n }\\n\\n /* ============ Internal Functions ============ */\\n\\n /**\\n * @notice Calculates the intentHash of new intent\\n */\\n function _calculateIntentHash(\\n bytes32 _idHash,\\n uint256 _depositId\\n )\\n internal\\n view\\n virtual\\n returns (bytes32 intentHash)\\n {\\n // Mod with circom prime field to make sure it fits in a 254-bit field\\n uint256 intermediateHash = uint256(keccak256(abi.encodePacked(_idHash, _depositId, block.timestamp)));\\n intentHash = bytes32(intermediateHash % CIRCOM_PRIME_FIELD);\\n }\\n\\n /**\\n * @notice Cycles through all intents currently open on a deposit and sees if any have expired. If they have expired\\n * the outstanding amounts are summed and returned alongside the intentHashes\\n */\\n function _getPrunableIntents(\\n uint256 _depositId\\n )\\n internal\\n view\\n returns(bytes32[] memory prunableIntents, uint256 reclaimedAmount)\\n {\\n bytes32[] memory intentHashes = deposits[_depositId].intentHashes;\\n prunableIntents = new bytes32[](intentHashes.length);\\n\\n for (uint256 i = 0; i < intentHashes.length; ++i) {\\n Intent memory intent = intents[intentHashes[i]];\\n if (intent.intentTimestamp + intentExpirationPeriod < block.timestamp) {\\n prunableIntents[i] = intentHashes[i];\\n reclaimedAmount += intent.amount;\\n }\\n }\\n }\\n\\n function _pruneIntents(Deposit storage _deposit, bytes32[] memory _intents) internal {\\n for (uint256 i = 0; i < _intents.length; ++i) {\\n if (_intents[i] != bytes32(0)) {\\n _pruneIntent(_deposit, _intents[i]);\\n }\\n }\\n }\\n\\n /**\\n * @notice Pruning an intent involves deleting its state from the intents mapping, zeroing out the intendee's currentIntentHash in\\n * their global account mapping, and deleting the intentHash from the deposit's intentHashes array.\\n */\\n function _pruneIntent(Deposit storage _deposit, bytes32 _intentHash) internal {\\n Intent memory intent = intents[_intentHash];\\n\\n delete globalAccount[accounts[intent.onRamper].idHash].currentIntentHash;\\n delete intents[_intentHash];\\n _deposit.intentHashes.removeStorage(_intentHash);\\n\\n emit IntentPruned(_intentHash, intent.deposit);\\n }\\n\\n /**\\n * @notice Removes a deposit if no outstanding intents AND no remaining deposits. Deleting a deposit deletes it from the\\n * deposits mapping and removes tracking it in the user's accounts mapping.\\n */\\n function _closeDepositIfNecessary(uint256 _depositId, Deposit storage _deposit) internal {\\n uint256 openDepositAmount = _deposit.outstandingIntentAmount + _deposit.remainingDeposits;\\n if (openDepositAmount == 0) {\\n accounts[_deposit.depositor].deposits.removeStorage(_depositId);\\n emit DepositClosed(_depositId, _deposit.depositor);\\n delete deposits[_depositId];\\n }\\n }\\n\\n /**\\n * @notice Checks if sustainability fee has been defined, if so sends fee to the fee recipient and intent amount minus fee\\n * to the on-ramper. If sustainability fee is undefined then full intent amount is transferred to on-ramper.\\n */\\n function _transferFunds(bytes32 _intentHash, Intent memory _intent) internal {\\n uint256 fee;\\n if (sustainabilityFee != 0) {\\n fee = (_intent.amount * sustainabilityFee) / PRECISE_UNIT;\\n usdc.transfer(sustainabilityFeeRecipient, fee);\\n }\\n\\n uint256 onRampAmount = _intent.amount - fee;\\n usdc.transfer(_intent.to, onRampAmount);\\n\\n emit IntentFulfilled(_intentHash, _intent.deposit, _intent.onRamper, _intent.to, onRampAmount, fee);\\n }\\n\\n /**\\n * @notice Validate send payment email and check that it hasn't already been used (done on SendProcessor).\\n * Additionally, we validate that the offRamperIdHash matches the one from the specified intent and that enough\\n * was paid off-chain inclusive of the conversionRate.\\n */\\n function _verifyOnRampProof(\\n uint256[2] memory _a,\\n uint256[2][2] memory _b,\\n uint256[2] memory _c,\\n uint256[15] memory _signals\\n )\\n internal\\n returns(Intent memory, Deposit storage, bytes32)\\n {\\n (\\n uint256 amount,\\n uint256 timestamp,\\n bytes32 offRamperIdHash,\\n bytes32 onRamperIdHash,\\n bytes32 intentHash\\n ) = sendProcessor.processProof(\\n IHDFCSendProcessor.SendProof({\\n a: _a,\\n b: _b,\\n c: _c,\\n signals: _signals\\n })\\n );\\n\\n Intent memory intent = intents[intentHash];\\n Deposit storage deposit = deposits[intent.deposit];\\n\\n require(intent.onRamper != address(0), \\\"Intent does not exist\\\");\\n require(intent.intentTimestamp <= timestamp, \\\"Intent was not created before send\\\");\\n require(bytes32(_getUpiIdHash(deposit.upiId)) == offRamperIdHash, \\\"Offramper id does not match\\\");\\n require(accounts[intent.onRamper].idHash == onRamperIdHash, \\\"Onramper id does not match\\\");\\n require(amount >= (intent.amount * PRECISE_UNIT) / deposit.conversionRate, \\\"Payment was not enough\\\");\\n\\n return (intent, deposit, intentHash);\\n }\\n\\n /**\\n * @notice Validate the user has an HDFC account, we do not nullify this email since it can be reused to register under\\n * different addresses.\\n */\\n function _verifyRegistrationProof(\\n uint256[2] memory _a,\\n uint256[2][2] memory _b,\\n uint256[2] memory _c,\\n uint256[5] memory _signals\\n )\\n internal\\n returns(bytes32)\\n {\\n bytes32 idHash = registrationProcessor.processProof(\\n IRegistrationProcessor.RegistrationProof({\\n a: _a,\\n b: _b,\\n c: _c,\\n signals: _signals\\n })\\n );\\n\\n return idHash;\\n }\\n\\n /**\\n * @notice Returns the poseidon hash of the given raw UPI ID \\n */\\n function _getUpiIdHash(uint256[8] memory _upiId) internal view returns (bytes32) {\\n uint256[6] memory temp1;\\n uint256[3] memory temp2;\\n\\n for (uint256 i = 0; i < 6; ++i) {\\n temp1[i] = _upiId[i];\\n }\\n temp2[0] = poseidon6.poseidon(temp1);\\n temp2[1] = _upiId[6];\\n temp2[2] = _upiId[7];\\n\\n return bytes32(poseidon3.poseidon(temp2));\\n }\\n}\\n\",\"keccak256\":\"0xbbc8cf27fd7e8e1d0f782b6e90963019eeffaf192c122f6cd06ea4dff535ba04\",\"license\":\"MIT\"},\"contracts/ramps/hdfc/interfaces/IHDFCSendProcessor.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.18;\\n\\ninterface IHDFCSendProcessor {\\n\\n struct SendProof {\\n uint256[2] a;\\n uint256[2][2] b;\\n uint256[2] c;\\n uint256[15] signals;\\n }\\n\\n function processProof(\\n SendProof calldata _proof\\n )\\n external\\n returns(uint256, uint256, bytes32, bytes32, bytes32);\\n}\\n\",\"keccak256\":\"0xe022a0768bd0928ca85ebcfc7541907038fc0b786572701c5a37b97ec6040847\",\"license\":\"MIT\"},\"contracts/ramps/hdfc/interfaces/IRegistrationProcessor.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.18;\\n\\ninterface IRegistrationProcessor {\\n\\n struct RegistrationProof {\\n uint256[2] a;\\n uint256[2][2] b;\\n uint256[2] c;\\n uint256[5] signals;\\n }\\n\\n function processProof(\\n RegistrationProof calldata _proof\\n )\\n external\\n returns (bytes32);\\n}\\n\",\"keccak256\":\"0x6a89de57b7dfd51409bd06565af608c976dda3fc267d939df728b37d4c1f5006\",\"license\":\"MIT\"},\"fhevm/lib/ACLAddress.sol\":{\"content\":\"// SPDX-License-Identifier: BSD-3-Clause-Clear\\n\\npragma solidity ^0.8.24;\\n\\naddress constant aclAdd = 0x2Fb4341027eb1d2aD8B5D9708187df8633cAFA92;\\n\",\"keccak256\":\"0x3f230cc2d79b3ba9fbcfa93da6bffc53074ecbd7cda6f23290fcddf969cf3666\",\"license\":\"BSD-3-Clause-Clear\"},\"fhevm/lib/FHEVMCoprocessorAddress.sol\":{\"content\":\"// SPDX-License-Identifier: BSD-3-Clause-Clear\\n\\npragma solidity ^0.8.24;\\n\\naddress constant fhevmCoprocessorAdd = 0x05fD9B5EFE0a996095f42Ed7e77c390810CF660c;\\n\",\"keccak256\":\"0x5587daee4532696f09c0c260b3a12e08c5caa1c8a690986eb7d11547a72f0723\",\"license\":\"BSD-3-Clause-Clear\"},\"fhevm/lib/Impl.sol\":{\"content\":\"// SPDX-License-Identifier: BSD-3-Clause-Clear\\n\\npragma solidity ^0.8.24;\\n\\nimport \\\"./TFHE.sol\\\";\\nimport \\\"./FHEVMCoprocessorAddress.sol\\\";\\nimport \\\"./ACLAddress.sol\\\";\\n\\ninterface IFHEVMCoprocessor {\\n function fheAdd(uint256 lhs, uint256 rhs, bytes1 scalarByte) external returns (uint256 result);\\n function fheSub(uint256 lhs, uint256 rhs, bytes1 scalarByte) external returns (uint256 result);\\n function fheMul(uint256 lhs, uint256 rhs, bytes1 scalarByte) external returns (uint256 result);\\n function fheDiv(uint256 lhs, uint256 rhs, bytes1 scalarByte) external returns (uint256 result);\\n function fheRem(uint256 lhs, uint256 rhs, bytes1 scalarByte) external returns (uint256 result);\\n function fheBitAnd(uint256 lhs, uint256 rhs, bytes1 scalarByte) external returns (uint256 result);\\n function fheBitOr(uint256 lhs, uint256 rhs, bytes1 scalarByte) external returns (uint256 result);\\n function fheBitXor(uint256 lhs, uint256 rhs, bytes1 scalarByte) external returns (uint256 result);\\n function fheShl(uint256 lhs, uint256 rhs, bytes1 scalarByte) external returns (uint256 result);\\n function fheShr(uint256 lhs, uint256 rhs, bytes1 scalarByte) external returns (uint256 result);\\n function fheRotl(uint256 lhs, uint256 rhs, bytes1 scalarByte) external returns (uint256 result);\\n function fheRotr(uint256 lhs, uint256 rhs, bytes1 scalarByte) external returns (uint256 result);\\n function fheEq(uint256 lhs, uint256 rhs, bytes1 scalarByte) external returns (uint256 result);\\n function fheNe(uint256 lhs, uint256 rhs, bytes1 scalarByte) external returns (uint256 result);\\n function fheGe(uint256 lhs, uint256 rhs, bytes1 scalarByte) external returns (uint256 result);\\n function fheGt(uint256 lhs, uint256 rhs, bytes1 scalarByte) external returns (uint256 result);\\n function fheLe(uint256 lhs, uint256 rhs, bytes1 scalarByte) external returns (uint256 result);\\n function fheLt(uint256 lhs, uint256 rhs, bytes1 scalarByte) external returns (uint256 result);\\n function fheMin(uint256 lhs, uint256 rhs, bytes1 scalarByte) external returns (uint256 result);\\n function fheMax(uint256 lhs, uint256 rhs, bytes1 scalarByte) external returns (uint256 result);\\n function fheNeg(uint256 ct) external returns (uint256 result);\\n function fheNot(uint256 ct) external returns (uint256 result);\\n function verifyCiphertext(\\n bytes32 inputHandle,\\n address callerAddress,\\n bytes memory inputProof,\\n bytes1 inputType\\n ) external returns (uint256 result);\\n function cast(uint256 ct, bytes1 toType) external returns (uint256 result);\\n function trivialEncrypt(uint256 ct, bytes1 toType) external returns (uint256 result);\\n function fheIfThenElse(uint256 control, uint256 ifTrue, uint256 ifFalse) external returns (uint256 result);\\n function fheRand(bytes1 randType) external returns (uint256 result);\\n function fheRandBounded(uint256 upperBound, bytes1 randType) external returns (uint256 result);\\n function cleanTransientStorage() external;\\n}\\n\\ninterface IACL {\\n function allowTransient(uint256 ciphertext, address account) external;\\n function allow(uint256 handle, address account) external;\\n function cleanTransientStorage() external;\\n function isAllowed(uint256 handle, address account) external view returns (bool);\\n}\\n\\nlibrary Impl {\\n function add(uint256 lhs, uint256 rhs, bool scalar) internal returns (uint256 result) {\\n bytes1 scalarByte;\\n if (scalar) {\\n scalarByte = 0x01;\\n } else {\\n scalarByte = 0x00;\\n }\\n result = IFHEVMCoprocessor(fhevmCoprocessorAdd).fheAdd(lhs, rhs, scalarByte);\\n }\\n\\n function sub(uint256 lhs, uint256 rhs, bool scalar) internal returns (uint256 result) {\\n bytes1 scalarByte;\\n if (scalar) {\\n scalarByte = 0x01;\\n } else {\\n scalarByte = 0x00;\\n }\\n result = IFHEVMCoprocessor(fhevmCoprocessorAdd).fheSub(lhs, rhs, scalarByte);\\n }\\n\\n function mul(uint256 lhs, uint256 rhs, bool scalar) internal returns (uint256 result) {\\n bytes1 scalarByte;\\n if (scalar) {\\n scalarByte = 0x01;\\n } else {\\n scalarByte = 0x00;\\n }\\n result = IFHEVMCoprocessor(fhevmCoprocessorAdd).fheMul(lhs, rhs, scalarByte);\\n }\\n\\n function div(uint256 lhs, uint256 rhs) internal returns (uint256 result) {\\n bytes1 scalarByte = 0x01;\\n result = IFHEVMCoprocessor(fhevmCoprocessorAdd).fheDiv(lhs, rhs, scalarByte);\\n }\\n\\n function rem(uint256 lhs, uint256 rhs) internal returns (uint256 result) {\\n bytes1 scalarByte = 0x01;\\n result = IFHEVMCoprocessor(fhevmCoprocessorAdd).fheRem(lhs, rhs, scalarByte);\\n }\\n\\n function and(uint256 lhs, uint256 rhs) internal returns (uint256 result) {\\n bytes1 scalarByte = 0x00;\\n result = IFHEVMCoprocessor(fhevmCoprocessorAdd).fheBitAnd(lhs, rhs, scalarByte);\\n }\\n\\n function or(uint256 lhs, uint256 rhs) internal returns (uint256 result) {\\n bytes1 scalarByte = 0x00;\\n result = IFHEVMCoprocessor(fhevmCoprocessorAdd).fheBitOr(lhs, rhs, scalarByte);\\n }\\n\\n function xor(uint256 lhs, uint256 rhs) internal returns (uint256 result) {\\n bytes1 scalarByte = 0x00;\\n result = IFHEVMCoprocessor(fhevmCoprocessorAdd).fheBitXor(lhs, rhs, scalarByte);\\n }\\n\\n function shl(uint256 lhs, uint256 rhs, bool scalar) internal returns (uint256 result) {\\n bytes1 scalarByte;\\n if (scalar) {\\n scalarByte = 0x01;\\n } else {\\n scalarByte = 0x00;\\n }\\n result = IFHEVMCoprocessor(fhevmCoprocessorAdd).fheShl(lhs, rhs, scalarByte);\\n }\\n\\n function shr(uint256 lhs, uint256 rhs, bool scalar) internal returns (uint256 result) {\\n bytes1 scalarByte;\\n if (scalar) {\\n scalarByte = 0x01;\\n } else {\\n scalarByte = 0x00;\\n }\\n result = IFHEVMCoprocessor(fhevmCoprocessorAdd).fheShr(lhs, rhs, scalarByte);\\n }\\n\\n function rotl(uint256 lhs, uint256 rhs, bool scalar) internal returns (uint256 result) {\\n bytes1 scalarByte;\\n if (scalar) {\\n scalarByte = 0x01;\\n } else {\\n scalarByte = 0x00;\\n }\\n result = IFHEVMCoprocessor(fhevmCoprocessorAdd).fheRotl(lhs, rhs, scalarByte);\\n }\\n\\n function rotr(uint256 lhs, uint256 rhs, bool scalar) internal returns (uint256 result) {\\n bytes1 scalarByte;\\n if (scalar) {\\n scalarByte = 0x01;\\n } else {\\n scalarByte = 0x00;\\n }\\n result = IFHEVMCoprocessor(fhevmCoprocessorAdd).fheRotr(lhs, rhs, scalarByte);\\n }\\n\\n function eq(uint256 lhs, uint256 rhs, bool scalar) internal returns (uint256 result) {\\n bytes1 scalarByte;\\n if (scalar) {\\n scalarByte = 0x01;\\n } else {\\n scalarByte = 0x00;\\n }\\n result = IFHEVMCoprocessor(fhevmCoprocessorAdd).fheEq(lhs, rhs, scalarByte);\\n }\\n\\n function ne(uint256 lhs, uint256 rhs, bool scalar) internal returns (uint256 result) {\\n bytes1 scalarByte;\\n if (scalar) {\\n scalarByte = 0x01;\\n } else {\\n scalarByte = 0x00;\\n }\\n result = IFHEVMCoprocessor(fhevmCoprocessorAdd).fheNe(lhs, rhs, scalarByte);\\n }\\n\\n function ge(uint256 lhs, uint256 rhs, bool scalar) internal returns (uint256 result) {\\n bytes1 scalarByte;\\n if (scalar) {\\n scalarByte = 0x01;\\n } else {\\n scalarByte = 0x00;\\n }\\n result = IFHEVMCoprocessor(fhevmCoprocessorAdd).fheGe(lhs, rhs, scalarByte);\\n }\\n\\n function gt(uint256 lhs, uint256 rhs, bool scalar) internal returns (uint256 result) {\\n bytes1 scalarByte;\\n if (scalar) {\\n scalarByte = 0x01;\\n } else {\\n scalarByte = 0x00;\\n }\\n result = IFHEVMCoprocessor(fhevmCoprocessorAdd).fheGt(lhs, rhs, scalarByte);\\n }\\n\\n function le(uint256 lhs, uint256 rhs, bool scalar) internal returns (uint256 result) {\\n bytes1 scalarByte;\\n if (scalar) {\\n scalarByte = 0x01;\\n } else {\\n scalarByte = 0x00;\\n }\\n result = IFHEVMCoprocessor(fhevmCoprocessorAdd).fheLe(lhs, rhs, scalarByte);\\n }\\n\\n function lt(uint256 lhs, uint256 rhs, bool scalar) internal returns (uint256 result) {\\n bytes1 scalarByte;\\n if (scalar) {\\n scalarByte = 0x01;\\n } else {\\n scalarByte = 0x00;\\n }\\n result = IFHEVMCoprocessor(fhevmCoprocessorAdd).fheLt(lhs, rhs, scalarByte);\\n }\\n\\n function min(uint256 lhs, uint256 rhs, bool scalar) internal returns (uint256 result) {\\n bytes1 scalarByte;\\n if (scalar) {\\n scalarByte = 0x01;\\n } else {\\n scalarByte = 0x00;\\n }\\n result = IFHEVMCoprocessor(fhevmCoprocessorAdd).fheMin(lhs, rhs, scalarByte);\\n }\\n\\n function max(uint256 lhs, uint256 rhs, bool scalar) internal returns (uint256 result) {\\n bytes1 scalarByte;\\n if (scalar) {\\n scalarByte = 0x01;\\n } else {\\n scalarByte = 0x00;\\n }\\n result = IFHEVMCoprocessor(fhevmCoprocessorAdd).fheMax(lhs, rhs, scalarByte);\\n }\\n\\n function neg(uint256 ct) internal returns (uint256 result) {\\n result = IFHEVMCoprocessor(fhevmCoprocessorAdd).fheNeg(ct);\\n }\\n\\n function not(uint256 ct) internal returns (uint256 result) {\\n result = IFHEVMCoprocessor(fhevmCoprocessorAdd).fheNot(ct);\\n }\\n\\n // If 'control's value is 'true', the result has the same value as 'ifTrue'.\\n // If 'control's value is 'false', the result has the same value as 'ifFalse'.\\n function select(uint256 control, uint256 ifTrue, uint256 ifFalse) internal returns (uint256 result) {\\n result = IFHEVMCoprocessor(fhevmCoprocessorAdd).fheIfThenElse(control, ifTrue, ifFalse);\\n }\\n\\n function verify(bytes32 inputHandle, bytes memory inputProof, uint8 toType) internal returns (uint256 result) {\\n result = IFHEVMCoprocessor(fhevmCoprocessorAdd).verifyCiphertext(\\n inputHandle,\\n msg.sender,\\n inputProof,\\n bytes1(toType)\\n );\\n IACL(aclAdd).allowTransient(result, msg.sender);\\n }\\n\\n function cast(uint256 ciphertext, uint8 toType) internal returns (uint256 result) {\\n result = IFHEVMCoprocessor(fhevmCoprocessorAdd).cast(ciphertext, bytes1(toType));\\n }\\n\\n function trivialEncrypt(uint256 value, uint8 toType) internal returns (uint256 result) {\\n result = IFHEVMCoprocessor(fhevmCoprocessorAdd).trivialEncrypt(value, bytes1(toType));\\n }\\n\\n function rand(uint8 randType) internal returns (uint256 result) {\\n result = IFHEVMCoprocessor(fhevmCoprocessorAdd).fheRand(bytes1(randType));\\n }\\n\\n function randBounded(uint256 upperBound, uint8 randType) internal returns (uint256 result) {\\n result = IFHEVMCoprocessor(fhevmCoprocessorAdd).fheRandBounded(upperBound, bytes1(randType));\\n }\\n\\n function allowTransient(uint256 handle, address account) internal {\\n IACL(aclAdd).allowTransient(handle, account);\\n }\\n\\n function allow(uint256 handle, address account) internal {\\n IACL(aclAdd).allow(handle, account);\\n }\\n\\n function cleanTransientStorage() internal {\\n IACL(aclAdd).cleanTransientStorage();\\n IFHEVMCoprocessor(fhevmCoprocessorAdd).cleanTransientStorage();\\n }\\n\\n function isAllowed(uint256 handle, address account) internal view returns (bool) {\\n return IACL(aclAdd).isAllowed(handle, account);\\n }\\n}\\n\",\"keccak256\":\"0x39023bade84cd31772afea18a682b5f1aef96496a859d8fb38a95e9b34aa4e43\",\"license\":\"BSD-3-Clause-Clear\"},\"fhevm/lib/TFHE.sol\":{\"content\":\"// SPDX-License-Identifier: BSD-3-Clause-Clear\\n\\npragma solidity ^0.8.24;\\n\\ntype ebool is uint256;\\ntype euint4 is uint256;\\ntype euint8 is uint256;\\ntype euint16 is uint256;\\ntype euint32 is uint256;\\ntype euint64 is uint256;\\ntype eaddress is uint256;\\ntype ebytes256 is uint256;\\ntype einput is bytes32;\\n\\nlibrary Common {\\n // Values used to communicate types to the runtime.\\n uint8 internal constant ebool_t = 0;\\n uint8 internal constant euint4_t = 1;\\n uint8 internal constant euint8_t = 2;\\n uint8 internal constant euint16_t = 3;\\n uint8 internal constant euint32_t = 4;\\n uint8 internal constant euint64_t = 5;\\n uint8 internal constant euint128_t = 6;\\n uint8 internal constant euint160_t = 7;\\n uint8 internal constant euint256_t = 8;\\n uint8 internal constant ebytes64_t = 9;\\n uint8 internal constant ebytes128_t = 10;\\n uint8 internal constant ebytes256_t = 11;\\n}\\n\\nimport \\\"./Impl.sol\\\";\\n\\nlibrary TFHE {\\n euint4 constant NIL4 = euint4.wrap(0);\\n euint8 constant NIL8 = euint8.wrap(0);\\n euint16 constant NIL16 = euint16.wrap(0);\\n euint32 constant NIL32 = euint32.wrap(0);\\n euint64 constant NIL64 = euint64.wrap(0);\\n\\n // Return true if the enrypted bool is initialized and false otherwise.\\n function isInitialized(ebool v) internal pure returns (bool) {\\n return ebool.unwrap(v) != 0;\\n }\\n\\n // Return true if the enrypted integer is initialized and false otherwise.\\n function isInitialized(euint4 v) internal pure returns (bool) {\\n return euint4.unwrap(v) != 0;\\n }\\n\\n // Return true if the enrypted integer is initialized and false otherwise.\\n function isInitialized(euint8 v) internal pure returns (bool) {\\n return euint8.unwrap(v) != 0;\\n }\\n\\n // Return true if the enrypted integer is initialized and false otherwise.\\n function isInitialized(euint16 v) internal pure returns (bool) {\\n return euint16.unwrap(v) != 0;\\n }\\n\\n // Return true if the enrypted integer is initialized and false otherwise.\\n function isInitialized(euint32 v) internal pure returns (bool) {\\n return euint32.unwrap(v) != 0;\\n }\\n\\n // Return true if the enrypted integer is initialized and false otherwise.\\n function isInitialized(euint64 v) internal pure returns (bool) {\\n return euint64.unwrap(v) != 0;\\n }\\n\\n // Evaluate add(a, b) and return the result.\\n function add(euint4 a, euint4 b) internal returns (euint4) {\\n if (!isInitialized(a)) {\\n a = asEuint4(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint4(0);\\n }\\n return euint4.wrap(Impl.add(euint4.unwrap(a), euint4.unwrap(b), false));\\n }\\n\\n // Evaluate sub(a, b) and return the result.\\n function sub(euint4 a, euint4 b) internal returns (euint4) {\\n if (!isInitialized(a)) {\\n a = asEuint4(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint4(0);\\n }\\n return euint4.wrap(Impl.sub(euint4.unwrap(a), euint4.unwrap(b), false));\\n }\\n\\n // Evaluate mul(a, b) and return the result.\\n function mul(euint4 a, euint4 b) internal returns (euint4) {\\n if (!isInitialized(a)) {\\n a = asEuint4(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint4(0);\\n }\\n return euint4.wrap(Impl.mul(euint4.unwrap(a), euint4.unwrap(b), false));\\n }\\n\\n // Evaluate and(a, b) and return the result.\\n function and(euint4 a, euint4 b) internal returns (euint4) {\\n if (!isInitialized(a)) {\\n a = asEuint4(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint4(0);\\n }\\n return euint4.wrap(Impl.and(euint4.unwrap(a), euint4.unwrap(b)));\\n }\\n\\n // Evaluate or(a, b) and return the result.\\n function or(euint4 a, euint4 b) internal returns (euint4) {\\n if (!isInitialized(a)) {\\n a = asEuint4(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint4(0);\\n }\\n return euint4.wrap(Impl.or(euint4.unwrap(a), euint4.unwrap(b)));\\n }\\n\\n // Evaluate xor(a, b) and return the result.\\n function xor(euint4 a, euint4 b) internal returns (euint4) {\\n if (!isInitialized(a)) {\\n a = asEuint4(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint4(0);\\n }\\n return euint4.wrap(Impl.xor(euint4.unwrap(a), euint4.unwrap(b)));\\n }\\n\\n // Evaluate eq(a, b) and return the result.\\n function eq(euint4 a, euint4 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint4(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint4(0);\\n }\\n return ebool.wrap(Impl.eq(euint4.unwrap(a), euint4.unwrap(b), false));\\n }\\n\\n // Evaluate ne(a, b) and return the result.\\n function ne(euint4 a, euint4 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint4(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint4(0);\\n }\\n return ebool.wrap(Impl.ne(euint4.unwrap(a), euint4.unwrap(b), false));\\n }\\n\\n // Evaluate ge(a, b) and return the result.\\n function ge(euint4 a, euint4 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint4(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint4(0);\\n }\\n return ebool.wrap(Impl.ge(euint4.unwrap(a), euint4.unwrap(b), false));\\n }\\n\\n // Evaluate gt(a, b) and return the result.\\n function gt(euint4 a, euint4 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint4(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint4(0);\\n }\\n return ebool.wrap(Impl.gt(euint4.unwrap(a), euint4.unwrap(b), false));\\n }\\n\\n // Evaluate le(a, b) and return the result.\\n function le(euint4 a, euint4 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint4(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint4(0);\\n }\\n return ebool.wrap(Impl.le(euint4.unwrap(a), euint4.unwrap(b), false));\\n }\\n\\n // Evaluate lt(a, b) and return the result.\\n function lt(euint4 a, euint4 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint4(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint4(0);\\n }\\n return ebool.wrap(Impl.lt(euint4.unwrap(a), euint4.unwrap(b), false));\\n }\\n\\n // Evaluate min(a, b) and return the result.\\n function min(euint4 a, euint4 b) internal returns (euint4) {\\n if (!isInitialized(a)) {\\n a = asEuint4(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint4(0);\\n }\\n return euint4.wrap(Impl.min(euint4.unwrap(a), euint4.unwrap(b), false));\\n }\\n\\n // Evaluate max(a, b) and return the result.\\n function max(euint4 a, euint4 b) internal returns (euint4) {\\n if (!isInitialized(a)) {\\n a = asEuint4(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint4(0);\\n }\\n return euint4.wrap(Impl.max(euint4.unwrap(a), euint4.unwrap(b), false));\\n }\\n\\n // Evaluate add(a, b) and return the result.\\n function add(euint4 a, euint8 b) internal returns (euint8) {\\n if (!isInitialized(a)) {\\n a = asEuint4(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint8(0);\\n }\\n return euint8.wrap(Impl.add(euint8.unwrap(asEuint8(a)), euint8.unwrap(b), false));\\n }\\n\\n // Evaluate sub(a, b) and return the result.\\n function sub(euint4 a, euint8 b) internal returns (euint8) {\\n if (!isInitialized(a)) {\\n a = asEuint4(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint8(0);\\n }\\n return euint8.wrap(Impl.sub(euint8.unwrap(asEuint8(a)), euint8.unwrap(b), false));\\n }\\n\\n // Evaluate mul(a, b) and return the result.\\n function mul(euint4 a, euint8 b) internal returns (euint8) {\\n if (!isInitialized(a)) {\\n a = asEuint4(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint8(0);\\n }\\n return euint8.wrap(Impl.mul(euint8.unwrap(asEuint8(a)), euint8.unwrap(b), false));\\n }\\n\\n // Evaluate and(a, b) and return the result.\\n function and(euint4 a, euint8 b) internal returns (euint8) {\\n if (!isInitialized(a)) {\\n a = asEuint4(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint8(0);\\n }\\n return euint8.wrap(Impl.and(euint8.unwrap(asEuint8(a)), euint8.unwrap(b)));\\n }\\n\\n // Evaluate or(a, b) and return the result.\\n function or(euint4 a, euint8 b) internal returns (euint8) {\\n if (!isInitialized(a)) {\\n a = asEuint4(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint8(0);\\n }\\n return euint8.wrap(Impl.or(euint8.unwrap(asEuint8(a)), euint8.unwrap(b)));\\n }\\n\\n // Evaluate xor(a, b) and return the result.\\n function xor(euint4 a, euint8 b) internal returns (euint8) {\\n if (!isInitialized(a)) {\\n a = asEuint4(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint8(0);\\n }\\n return euint8.wrap(Impl.xor(euint8.unwrap(asEuint8(a)), euint8.unwrap(b)));\\n }\\n\\n // Evaluate eq(a, b) and return the result.\\n function eq(euint4 a, euint8 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint4(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint8(0);\\n }\\n return ebool.wrap(Impl.eq(euint8.unwrap(asEuint8(a)), euint8.unwrap(b), false));\\n }\\n\\n // Evaluate ne(a, b) and return the result.\\n function ne(euint4 a, euint8 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint4(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint8(0);\\n }\\n return ebool.wrap(Impl.ne(euint8.unwrap(asEuint8(a)), euint8.unwrap(b), false));\\n }\\n\\n // Evaluate ge(a, b) and return the result.\\n function ge(euint4 a, euint8 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint4(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint8(0);\\n }\\n return ebool.wrap(Impl.ge(euint8.unwrap(asEuint8(a)), euint8.unwrap(b), false));\\n }\\n\\n // Evaluate gt(a, b) and return the result.\\n function gt(euint4 a, euint8 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint4(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint8(0);\\n }\\n return ebool.wrap(Impl.gt(euint8.unwrap(asEuint8(a)), euint8.unwrap(b), false));\\n }\\n\\n // Evaluate le(a, b) and return the result.\\n function le(euint4 a, euint8 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint4(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint8(0);\\n }\\n return ebool.wrap(Impl.le(euint8.unwrap(asEuint8(a)), euint8.unwrap(b), false));\\n }\\n\\n // Evaluate lt(a, b) and return the result.\\n function lt(euint4 a, euint8 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint4(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint8(0);\\n }\\n return ebool.wrap(Impl.lt(euint8.unwrap(asEuint8(a)), euint8.unwrap(b), false));\\n }\\n\\n // Evaluate min(a, b) and return the result.\\n function min(euint4 a, euint8 b) internal returns (euint8) {\\n if (!isInitialized(a)) {\\n a = asEuint4(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint8(0);\\n }\\n return euint8.wrap(Impl.min(euint8.unwrap(asEuint8(a)), euint8.unwrap(b), false));\\n }\\n\\n // Evaluate max(a, b) and return the result.\\n function max(euint4 a, euint8 b) internal returns (euint8) {\\n if (!isInitialized(a)) {\\n a = asEuint4(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint8(0);\\n }\\n return euint8.wrap(Impl.max(euint8.unwrap(asEuint8(a)), euint8.unwrap(b), false));\\n }\\n\\n // Evaluate add(a, b) and return the result.\\n function add(euint4 a, euint16 b) internal returns (euint16) {\\n if (!isInitialized(a)) {\\n a = asEuint4(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint16(0);\\n }\\n return euint16.wrap(Impl.add(euint16.unwrap(asEuint16(a)), euint16.unwrap(b), false));\\n }\\n\\n // Evaluate sub(a, b) and return the result.\\n function sub(euint4 a, euint16 b) internal returns (euint16) {\\n if (!isInitialized(a)) {\\n a = asEuint4(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint16(0);\\n }\\n return euint16.wrap(Impl.sub(euint16.unwrap(asEuint16(a)), euint16.unwrap(b), false));\\n }\\n\\n // Evaluate mul(a, b) and return the result.\\n function mul(euint4 a, euint16 b) internal returns (euint16) {\\n if (!isInitialized(a)) {\\n a = asEuint4(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint16(0);\\n }\\n return euint16.wrap(Impl.mul(euint16.unwrap(asEuint16(a)), euint16.unwrap(b), false));\\n }\\n\\n // Evaluate and(a, b) and return the result.\\n function and(euint4 a, euint16 b) internal returns (euint16) {\\n if (!isInitialized(a)) {\\n a = asEuint4(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint16(0);\\n }\\n return euint16.wrap(Impl.and(euint16.unwrap(asEuint16(a)), euint16.unwrap(b)));\\n }\\n\\n // Evaluate or(a, b) and return the result.\\n function or(euint4 a, euint16 b) internal returns (euint16) {\\n if (!isInitialized(a)) {\\n a = asEuint4(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint16(0);\\n }\\n return euint16.wrap(Impl.or(euint16.unwrap(asEuint16(a)), euint16.unwrap(b)));\\n }\\n\\n // Evaluate xor(a, b) and return the result.\\n function xor(euint4 a, euint16 b) internal returns (euint16) {\\n if (!isInitialized(a)) {\\n a = asEuint4(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint16(0);\\n }\\n return euint16.wrap(Impl.xor(euint16.unwrap(asEuint16(a)), euint16.unwrap(b)));\\n }\\n\\n // Evaluate eq(a, b) and return the result.\\n function eq(euint4 a, euint16 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint4(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint16(0);\\n }\\n return ebool.wrap(Impl.eq(euint16.unwrap(asEuint16(a)), euint16.unwrap(b), false));\\n }\\n\\n // Evaluate ne(a, b) and return the result.\\n function ne(euint4 a, euint16 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint4(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint16(0);\\n }\\n return ebool.wrap(Impl.ne(euint16.unwrap(asEuint16(a)), euint16.unwrap(b), false));\\n }\\n\\n // Evaluate ge(a, b) and return the result.\\n function ge(euint4 a, euint16 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint4(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint16(0);\\n }\\n return ebool.wrap(Impl.ge(euint16.unwrap(asEuint16(a)), euint16.unwrap(b), false));\\n }\\n\\n // Evaluate gt(a, b) and return the result.\\n function gt(euint4 a, euint16 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint4(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint16(0);\\n }\\n return ebool.wrap(Impl.gt(euint16.unwrap(asEuint16(a)), euint16.unwrap(b), false));\\n }\\n\\n // Evaluate le(a, b) and return the result.\\n function le(euint4 a, euint16 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint4(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint16(0);\\n }\\n return ebool.wrap(Impl.le(euint16.unwrap(asEuint16(a)), euint16.unwrap(b), false));\\n }\\n\\n // Evaluate lt(a, b) and return the result.\\n function lt(euint4 a, euint16 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint4(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint16(0);\\n }\\n return ebool.wrap(Impl.lt(euint16.unwrap(asEuint16(a)), euint16.unwrap(b), false));\\n }\\n\\n // Evaluate min(a, b) and return the result.\\n function min(euint4 a, euint16 b) internal returns (euint16) {\\n if (!isInitialized(a)) {\\n a = asEuint4(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint16(0);\\n }\\n return euint16.wrap(Impl.min(euint16.unwrap(asEuint16(a)), euint16.unwrap(b), false));\\n }\\n\\n // Evaluate max(a, b) and return the result.\\n function max(euint4 a, euint16 b) internal returns (euint16) {\\n if (!isInitialized(a)) {\\n a = asEuint4(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint16(0);\\n }\\n return euint16.wrap(Impl.max(euint16.unwrap(asEuint16(a)), euint16.unwrap(b), false));\\n }\\n\\n // Evaluate add(a, b) and return the result.\\n function add(euint4 a, euint32 b) internal returns (euint32) {\\n if (!isInitialized(a)) {\\n a = asEuint4(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint32(0);\\n }\\n return euint32.wrap(Impl.add(euint32.unwrap(asEuint32(a)), euint32.unwrap(b), false));\\n }\\n\\n // Evaluate sub(a, b) and return the result.\\n function sub(euint4 a, euint32 b) internal returns (euint32) {\\n if (!isInitialized(a)) {\\n a = asEuint4(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint32(0);\\n }\\n return euint32.wrap(Impl.sub(euint32.unwrap(asEuint32(a)), euint32.unwrap(b), false));\\n }\\n\\n // Evaluate mul(a, b) and return the result.\\n function mul(euint4 a, euint32 b) internal returns (euint32) {\\n if (!isInitialized(a)) {\\n a = asEuint4(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint32(0);\\n }\\n return euint32.wrap(Impl.mul(euint32.unwrap(asEuint32(a)), euint32.unwrap(b), false));\\n }\\n\\n // Evaluate and(a, b) and return the result.\\n function and(euint4 a, euint32 b) internal returns (euint32) {\\n if (!isInitialized(a)) {\\n a = asEuint4(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint32(0);\\n }\\n return euint32.wrap(Impl.and(euint32.unwrap(asEuint32(a)), euint32.unwrap(b)));\\n }\\n\\n // Evaluate or(a, b) and return the result.\\n function or(euint4 a, euint32 b) internal returns (euint32) {\\n if (!isInitialized(a)) {\\n a = asEuint4(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint32(0);\\n }\\n return euint32.wrap(Impl.or(euint32.unwrap(asEuint32(a)), euint32.unwrap(b)));\\n }\\n\\n // Evaluate xor(a, b) and return the result.\\n function xor(euint4 a, euint32 b) internal returns (euint32) {\\n if (!isInitialized(a)) {\\n a = asEuint4(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint32(0);\\n }\\n return euint32.wrap(Impl.xor(euint32.unwrap(asEuint32(a)), euint32.unwrap(b)));\\n }\\n\\n // Evaluate eq(a, b) and return the result.\\n function eq(euint4 a, euint32 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint4(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint32(0);\\n }\\n return ebool.wrap(Impl.eq(euint32.unwrap(asEuint32(a)), euint32.unwrap(b), false));\\n }\\n\\n // Evaluate ne(a, b) and return the result.\\n function ne(euint4 a, euint32 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint4(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint32(0);\\n }\\n return ebool.wrap(Impl.ne(euint32.unwrap(asEuint32(a)), euint32.unwrap(b), false));\\n }\\n\\n // Evaluate ge(a, b) and return the result.\\n function ge(euint4 a, euint32 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint4(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint32(0);\\n }\\n return ebool.wrap(Impl.ge(euint32.unwrap(asEuint32(a)), euint32.unwrap(b), false));\\n }\\n\\n // Evaluate gt(a, b) and return the result.\\n function gt(euint4 a, euint32 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint4(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint32(0);\\n }\\n return ebool.wrap(Impl.gt(euint32.unwrap(asEuint32(a)), euint32.unwrap(b), false));\\n }\\n\\n // Evaluate le(a, b) and return the result.\\n function le(euint4 a, euint32 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint4(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint32(0);\\n }\\n return ebool.wrap(Impl.le(euint32.unwrap(asEuint32(a)), euint32.unwrap(b), false));\\n }\\n\\n // Evaluate lt(a, b) and return the result.\\n function lt(euint4 a, euint32 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint4(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint32(0);\\n }\\n return ebool.wrap(Impl.lt(euint32.unwrap(asEuint32(a)), euint32.unwrap(b), false));\\n }\\n\\n // Evaluate min(a, b) and return the result.\\n function min(euint4 a, euint32 b) internal returns (euint32) {\\n if (!isInitialized(a)) {\\n a = asEuint4(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint32(0);\\n }\\n return euint32.wrap(Impl.min(euint32.unwrap(asEuint32(a)), euint32.unwrap(b), false));\\n }\\n\\n // Evaluate max(a, b) and return the result.\\n function max(euint4 a, euint32 b) internal returns (euint32) {\\n if (!isInitialized(a)) {\\n a = asEuint4(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint32(0);\\n }\\n return euint32.wrap(Impl.max(euint32.unwrap(asEuint32(a)), euint32.unwrap(b), false));\\n }\\n\\n // Evaluate add(a, b) and return the result.\\n function add(euint4 a, euint64 b) internal returns (euint64) {\\n if (!isInitialized(a)) {\\n a = asEuint4(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint64(0);\\n }\\n return euint64.wrap(Impl.add(euint64.unwrap(asEuint64(a)), euint64.unwrap(b), false));\\n }\\n\\n // Evaluate sub(a, b) and return the result.\\n function sub(euint4 a, euint64 b) internal returns (euint64) {\\n if (!isInitialized(a)) {\\n a = asEuint4(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint64(0);\\n }\\n return euint64.wrap(Impl.sub(euint64.unwrap(asEuint64(a)), euint64.unwrap(b), false));\\n }\\n\\n // Evaluate mul(a, b) and return the result.\\n function mul(euint4 a, euint64 b) internal returns (euint64) {\\n if (!isInitialized(a)) {\\n a = asEuint4(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint64(0);\\n }\\n return euint64.wrap(Impl.mul(euint64.unwrap(asEuint64(a)), euint64.unwrap(b), false));\\n }\\n\\n // Evaluate and(a, b) and return the result.\\n function and(euint4 a, euint64 b) internal returns (euint64) {\\n if (!isInitialized(a)) {\\n a = asEuint4(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint64(0);\\n }\\n return euint64.wrap(Impl.and(euint64.unwrap(asEuint64(a)), euint64.unwrap(b)));\\n }\\n\\n // Evaluate or(a, b) and return the result.\\n function or(euint4 a, euint64 b) internal returns (euint64) {\\n if (!isInitialized(a)) {\\n a = asEuint4(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint64(0);\\n }\\n return euint64.wrap(Impl.or(euint64.unwrap(asEuint64(a)), euint64.unwrap(b)));\\n }\\n\\n // Evaluate xor(a, b) and return the result.\\n function xor(euint4 a, euint64 b) internal returns (euint64) {\\n if (!isInitialized(a)) {\\n a = asEuint4(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint64(0);\\n }\\n return euint64.wrap(Impl.xor(euint64.unwrap(asEuint64(a)), euint64.unwrap(b)));\\n }\\n\\n // Evaluate eq(a, b) and return the result.\\n function eq(euint4 a, euint64 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint4(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint64(0);\\n }\\n return ebool.wrap(Impl.eq(euint64.unwrap(asEuint64(a)), euint64.unwrap(b), false));\\n }\\n\\n // Evaluate ne(a, b) and return the result.\\n function ne(euint4 a, euint64 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint4(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint64(0);\\n }\\n return ebool.wrap(Impl.ne(euint64.unwrap(asEuint64(a)), euint64.unwrap(b), false));\\n }\\n\\n // Evaluate ge(a, b) and return the result.\\n function ge(euint4 a, euint64 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint4(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint64(0);\\n }\\n return ebool.wrap(Impl.ge(euint64.unwrap(asEuint64(a)), euint64.unwrap(b), false));\\n }\\n\\n // Evaluate gt(a, b) and return the result.\\n function gt(euint4 a, euint64 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint4(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint64(0);\\n }\\n return ebool.wrap(Impl.gt(euint64.unwrap(asEuint64(a)), euint64.unwrap(b), false));\\n }\\n\\n // Evaluate le(a, b) and return the result.\\n function le(euint4 a, euint64 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint4(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint64(0);\\n }\\n return ebool.wrap(Impl.le(euint64.unwrap(asEuint64(a)), euint64.unwrap(b), false));\\n }\\n\\n // Evaluate lt(a, b) and return the result.\\n function lt(euint4 a, euint64 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint4(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint64(0);\\n }\\n return ebool.wrap(Impl.lt(euint64.unwrap(asEuint64(a)), euint64.unwrap(b), false));\\n }\\n\\n // Evaluate min(a, b) and return the result.\\n function min(euint4 a, euint64 b) internal returns (euint64) {\\n if (!isInitialized(a)) {\\n a = asEuint4(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint64(0);\\n }\\n return euint64.wrap(Impl.min(euint64.unwrap(asEuint64(a)), euint64.unwrap(b), false));\\n }\\n\\n // Evaluate max(a, b) and return the result.\\n function max(euint4 a, euint64 b) internal returns (euint64) {\\n if (!isInitialized(a)) {\\n a = asEuint4(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint64(0);\\n }\\n return euint64.wrap(Impl.max(euint64.unwrap(asEuint64(a)), euint64.unwrap(b), false));\\n }\\n\\n // Evaluate add(a, b) and return the result.\\n function add(euint4 a, uint8 b) internal returns (euint4) {\\n if (!isInitialized(a)) {\\n a = asEuint4(0);\\n }\\n return euint4.wrap(Impl.add(euint4.unwrap(a), uint256(b), true));\\n }\\n\\n // Evaluate add(a, b) and return the result.\\n function add(uint8 a, euint4 b) internal returns (euint4) {\\n if (!isInitialized(b)) {\\n b = asEuint4(0);\\n }\\n return euint4.wrap(Impl.add(euint4.unwrap(b), uint256(a), true));\\n }\\n\\n // Evaluate sub(a, b) and return the result.\\n function sub(euint4 a, uint8 b) internal returns (euint4) {\\n if (!isInitialized(a)) {\\n a = asEuint4(0);\\n }\\n return euint4.wrap(Impl.sub(euint4.unwrap(a), uint256(b), true));\\n }\\n\\n // Evaluate sub(a, b) and return the result.\\n function sub(uint8 a, euint4 b) internal returns (euint4) {\\n euint4 aEnc = asEuint4(a);\\n if (!isInitialized(b)) {\\n b = asEuint4(0);\\n }\\n return euint4.wrap(Impl.sub(euint4.unwrap(aEnc), euint4.unwrap(b), false));\\n }\\n\\n // Evaluate mul(a, b) and return the result.\\n function mul(euint4 a, uint8 b) internal returns (euint4) {\\n if (!isInitialized(a)) {\\n a = asEuint4(0);\\n }\\n return euint4.wrap(Impl.mul(euint4.unwrap(a), uint256(b), true));\\n }\\n\\n // Evaluate mul(a, b) and return the result.\\n function mul(uint8 a, euint4 b) internal returns (euint4) {\\n if (!isInitialized(b)) {\\n b = asEuint4(0);\\n }\\n return euint4.wrap(Impl.mul(euint4.unwrap(b), uint256(a), true));\\n }\\n\\n // Evaluate div(a, b) and return the result.\\n function div(euint4 a, uint8 b) internal returns (euint4) {\\n if (!isInitialized(a)) {\\n a = asEuint4(0);\\n }\\n return euint4.wrap(Impl.div(euint4.unwrap(a), uint256(b)));\\n }\\n\\n // Evaluate rem(a, b) and return the result.\\n function rem(euint4 a, uint8 b) internal returns (euint4) {\\n if (!isInitialized(a)) {\\n a = asEuint4(0);\\n }\\n return euint4.wrap(Impl.rem(euint4.unwrap(a), uint256(b)));\\n }\\n\\n // Evaluate eq(a, b) and return the result.\\n function eq(euint4 a, uint8 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint4(0);\\n }\\n return ebool.wrap(Impl.eq(euint4.unwrap(a), uint256(b), true));\\n }\\n\\n // Evaluate eq(a, b) and return the result.\\n function eq(uint8 a, euint4 b) internal returns (ebool) {\\n if (!isInitialized(b)) {\\n b = asEuint4(0);\\n }\\n return ebool.wrap(Impl.eq(euint4.unwrap(b), uint256(a), true));\\n }\\n\\n // Evaluate ne(a, b) and return the result.\\n function ne(euint4 a, uint8 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint4(0);\\n }\\n return ebool.wrap(Impl.ne(euint4.unwrap(a), uint256(b), true));\\n }\\n\\n // Evaluate ne(a, b) and return the result.\\n function ne(uint8 a, euint4 b) internal returns (ebool) {\\n if (!isInitialized(b)) {\\n b = asEuint4(0);\\n }\\n return ebool.wrap(Impl.ne(euint4.unwrap(b), uint256(a), true));\\n }\\n\\n // Evaluate ge(a, b) and return the result.\\n function ge(euint4 a, uint8 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint4(0);\\n }\\n return ebool.wrap(Impl.ge(euint4.unwrap(a), uint256(b), true));\\n }\\n\\n // Evaluate ge(a, b) and return the result.\\n function ge(uint8 a, euint4 b) internal returns (ebool) {\\n if (!isInitialized(b)) {\\n b = asEuint4(0);\\n }\\n return ebool.wrap(Impl.le(euint4.unwrap(b), uint256(a), true));\\n }\\n\\n // Evaluate gt(a, b) and return the result.\\n function gt(euint4 a, uint8 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint4(0);\\n }\\n return ebool.wrap(Impl.gt(euint4.unwrap(a), uint256(b), true));\\n }\\n\\n // Evaluate gt(a, b) and return the result.\\n function gt(uint8 a, euint4 b) internal returns (ebool) {\\n if (!isInitialized(b)) {\\n b = asEuint4(0);\\n }\\n return ebool.wrap(Impl.lt(euint4.unwrap(b), uint256(a), true));\\n }\\n\\n // Evaluate le(a, b) and return the result.\\n function le(euint4 a, uint8 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint4(0);\\n }\\n return ebool.wrap(Impl.le(euint4.unwrap(a), uint256(b), true));\\n }\\n\\n // Evaluate le(a, b) and return the result.\\n function le(uint8 a, euint4 b) internal returns (ebool) {\\n if (!isInitialized(b)) {\\n b = asEuint4(0);\\n }\\n return ebool.wrap(Impl.ge(euint4.unwrap(b), uint256(a), true));\\n }\\n\\n // Evaluate lt(a, b) and return the result.\\n function lt(euint4 a, uint8 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint4(0);\\n }\\n return ebool.wrap(Impl.lt(euint4.unwrap(a), uint256(b), true));\\n }\\n\\n // Evaluate lt(a, b) and return the result.\\n function lt(uint8 a, euint4 b) internal returns (ebool) {\\n if (!isInitialized(b)) {\\n b = asEuint4(0);\\n }\\n return ebool.wrap(Impl.gt(euint4.unwrap(b), uint256(a), true));\\n }\\n\\n // Evaluate min(a, b) and return the result.\\n function min(euint4 a, uint8 b) internal returns (euint4) {\\n if (!isInitialized(a)) {\\n a = asEuint4(0);\\n }\\n return euint4.wrap(Impl.min(euint4.unwrap(a), uint256(b), true));\\n }\\n\\n // Evaluate min(a, b) and return the result.\\n function min(uint8 a, euint4 b) internal returns (euint4) {\\n if (!isInitialized(b)) {\\n b = asEuint4(0);\\n }\\n return euint4.wrap(Impl.min(euint4.unwrap(b), uint256(a), true));\\n }\\n\\n // Evaluate max(a, b) and return the result.\\n function max(euint4 a, uint8 b) internal returns (euint4) {\\n if (!isInitialized(a)) {\\n a = asEuint4(0);\\n }\\n return euint4.wrap(Impl.max(euint4.unwrap(a), uint256(b), true));\\n }\\n\\n // Evaluate max(a, b) and return the result.\\n function max(uint8 a, euint4 b) internal returns (euint4) {\\n if (!isInitialized(b)) {\\n b = asEuint4(0);\\n }\\n return euint4.wrap(Impl.max(euint4.unwrap(b), uint256(a), true));\\n }\\n\\n // Evaluate add(a, b) and return the result.\\n function add(euint8 a, euint4 b) internal returns (euint8) {\\n if (!isInitialized(a)) {\\n a = asEuint8(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint4(0);\\n }\\n return euint8.wrap(Impl.add(euint8.unwrap(a), euint8.unwrap(asEuint8(b)), false));\\n }\\n\\n // Evaluate sub(a, b) and return the result.\\n function sub(euint8 a, euint4 b) internal returns (euint8) {\\n if (!isInitialized(a)) {\\n a = asEuint8(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint4(0);\\n }\\n return euint8.wrap(Impl.sub(euint8.unwrap(a), euint8.unwrap(asEuint8(b)), false));\\n }\\n\\n // Evaluate mul(a, b) and return the result.\\n function mul(euint8 a, euint4 b) internal returns (euint8) {\\n if (!isInitialized(a)) {\\n a = asEuint8(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint4(0);\\n }\\n return euint8.wrap(Impl.mul(euint8.unwrap(a), euint8.unwrap(asEuint8(b)), false));\\n }\\n\\n // Evaluate and(a, b) and return the result.\\n function and(euint8 a, euint4 b) internal returns (euint8) {\\n if (!isInitialized(a)) {\\n a = asEuint8(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint4(0);\\n }\\n return euint8.wrap(Impl.and(euint8.unwrap(a), euint8.unwrap(asEuint8(b))));\\n }\\n\\n // Evaluate or(a, b) and return the result.\\n function or(euint8 a, euint4 b) internal returns (euint8) {\\n if (!isInitialized(a)) {\\n a = asEuint8(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint4(0);\\n }\\n return euint8.wrap(Impl.or(euint8.unwrap(a), euint8.unwrap(asEuint8(b))));\\n }\\n\\n // Evaluate xor(a, b) and return the result.\\n function xor(euint8 a, euint4 b) internal returns (euint8) {\\n if (!isInitialized(a)) {\\n a = asEuint8(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint4(0);\\n }\\n return euint8.wrap(Impl.xor(euint8.unwrap(a), euint8.unwrap(asEuint8(b))));\\n }\\n\\n // Evaluate eq(a, b) and return the result.\\n function eq(euint8 a, euint4 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint8(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint4(0);\\n }\\n return ebool.wrap(Impl.eq(euint8.unwrap(a), euint8.unwrap(asEuint8(b)), false));\\n }\\n\\n // Evaluate ne(a, b) and return the result.\\n function ne(euint8 a, euint4 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint8(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint4(0);\\n }\\n return ebool.wrap(Impl.ne(euint8.unwrap(a), euint8.unwrap(asEuint8(b)), false));\\n }\\n\\n // Evaluate ge(a, b) and return the result.\\n function ge(euint8 a, euint4 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint8(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint4(0);\\n }\\n return ebool.wrap(Impl.ge(euint8.unwrap(a), euint8.unwrap(asEuint8(b)), false));\\n }\\n\\n // Evaluate gt(a, b) and return the result.\\n function gt(euint8 a, euint4 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint8(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint4(0);\\n }\\n return ebool.wrap(Impl.gt(euint8.unwrap(a), euint8.unwrap(asEuint8(b)), false));\\n }\\n\\n // Evaluate le(a, b) and return the result.\\n function le(euint8 a, euint4 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint8(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint4(0);\\n }\\n return ebool.wrap(Impl.le(euint8.unwrap(a), euint8.unwrap(asEuint8(b)), false));\\n }\\n\\n // Evaluate lt(a, b) and return the result.\\n function lt(euint8 a, euint4 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint8(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint4(0);\\n }\\n return ebool.wrap(Impl.lt(euint8.unwrap(a), euint8.unwrap(asEuint8(b)), false));\\n }\\n\\n // Evaluate min(a, b) and return the result.\\n function min(euint8 a, euint4 b) internal returns (euint8) {\\n if (!isInitialized(a)) {\\n a = asEuint8(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint4(0);\\n }\\n return euint8.wrap(Impl.min(euint8.unwrap(a), euint8.unwrap(asEuint8(b)), false));\\n }\\n\\n // Evaluate max(a, b) and return the result.\\n function max(euint8 a, euint4 b) internal returns (euint8) {\\n if (!isInitialized(a)) {\\n a = asEuint8(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint4(0);\\n }\\n return euint8.wrap(Impl.max(euint8.unwrap(a), euint8.unwrap(asEuint8(b)), false));\\n }\\n\\n // Evaluate add(a, b) and return the result.\\n function add(euint8 a, euint8 b) internal returns (euint8) {\\n if (!isInitialized(a)) {\\n a = asEuint8(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint8(0);\\n }\\n return euint8.wrap(Impl.add(euint8.unwrap(a), euint8.unwrap(b), false));\\n }\\n\\n // Evaluate sub(a, b) and return the result.\\n function sub(euint8 a, euint8 b) internal returns (euint8) {\\n if (!isInitialized(a)) {\\n a = asEuint8(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint8(0);\\n }\\n return euint8.wrap(Impl.sub(euint8.unwrap(a), euint8.unwrap(b), false));\\n }\\n\\n // Evaluate mul(a, b) and return the result.\\n function mul(euint8 a, euint8 b) internal returns (euint8) {\\n if (!isInitialized(a)) {\\n a = asEuint8(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint8(0);\\n }\\n return euint8.wrap(Impl.mul(euint8.unwrap(a), euint8.unwrap(b), false));\\n }\\n\\n // Evaluate and(a, b) and return the result.\\n function and(euint8 a, euint8 b) internal returns (euint8) {\\n if (!isInitialized(a)) {\\n a = asEuint8(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint8(0);\\n }\\n return euint8.wrap(Impl.and(euint8.unwrap(a), euint8.unwrap(b)));\\n }\\n\\n // Evaluate or(a, b) and return the result.\\n function or(euint8 a, euint8 b) internal returns (euint8) {\\n if (!isInitialized(a)) {\\n a = asEuint8(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint8(0);\\n }\\n return euint8.wrap(Impl.or(euint8.unwrap(a), euint8.unwrap(b)));\\n }\\n\\n // Evaluate xor(a, b) and return the result.\\n function xor(euint8 a, euint8 b) internal returns (euint8) {\\n if (!isInitialized(a)) {\\n a = asEuint8(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint8(0);\\n }\\n return euint8.wrap(Impl.xor(euint8.unwrap(a), euint8.unwrap(b)));\\n }\\n\\n // Evaluate eq(a, b) and return the result.\\n function eq(euint8 a, euint8 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint8(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint8(0);\\n }\\n return ebool.wrap(Impl.eq(euint8.unwrap(a), euint8.unwrap(b), false));\\n }\\n\\n // Evaluate ne(a, b) and return the result.\\n function ne(euint8 a, euint8 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint8(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint8(0);\\n }\\n return ebool.wrap(Impl.ne(euint8.unwrap(a), euint8.unwrap(b), false));\\n }\\n\\n // Evaluate ge(a, b) and return the result.\\n function ge(euint8 a, euint8 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint8(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint8(0);\\n }\\n return ebool.wrap(Impl.ge(euint8.unwrap(a), euint8.unwrap(b), false));\\n }\\n\\n // Evaluate gt(a, b) and return the result.\\n function gt(euint8 a, euint8 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint8(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint8(0);\\n }\\n return ebool.wrap(Impl.gt(euint8.unwrap(a), euint8.unwrap(b), false));\\n }\\n\\n // Evaluate le(a, b) and return the result.\\n function le(euint8 a, euint8 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint8(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint8(0);\\n }\\n return ebool.wrap(Impl.le(euint8.unwrap(a), euint8.unwrap(b), false));\\n }\\n\\n // Evaluate lt(a, b) and return the result.\\n function lt(euint8 a, euint8 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint8(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint8(0);\\n }\\n return ebool.wrap(Impl.lt(euint8.unwrap(a), euint8.unwrap(b), false));\\n }\\n\\n // Evaluate min(a, b) and return the result.\\n function min(euint8 a, euint8 b) internal returns (euint8) {\\n if (!isInitialized(a)) {\\n a = asEuint8(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint8(0);\\n }\\n return euint8.wrap(Impl.min(euint8.unwrap(a), euint8.unwrap(b), false));\\n }\\n\\n // Evaluate max(a, b) and return the result.\\n function max(euint8 a, euint8 b) internal returns (euint8) {\\n if (!isInitialized(a)) {\\n a = asEuint8(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint8(0);\\n }\\n return euint8.wrap(Impl.max(euint8.unwrap(a), euint8.unwrap(b), false));\\n }\\n\\n // Evaluate add(a, b) and return the result.\\n function add(euint8 a, euint16 b) internal returns (euint16) {\\n if (!isInitialized(a)) {\\n a = asEuint8(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint16(0);\\n }\\n return euint16.wrap(Impl.add(euint16.unwrap(asEuint16(a)), euint16.unwrap(b), false));\\n }\\n\\n // Evaluate sub(a, b) and return the result.\\n function sub(euint8 a, euint16 b) internal returns (euint16) {\\n if (!isInitialized(a)) {\\n a = asEuint8(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint16(0);\\n }\\n return euint16.wrap(Impl.sub(euint16.unwrap(asEuint16(a)), euint16.unwrap(b), false));\\n }\\n\\n // Evaluate mul(a, b) and return the result.\\n function mul(euint8 a, euint16 b) internal returns (euint16) {\\n if (!isInitialized(a)) {\\n a = asEuint8(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint16(0);\\n }\\n return euint16.wrap(Impl.mul(euint16.unwrap(asEuint16(a)), euint16.unwrap(b), false));\\n }\\n\\n // Evaluate and(a, b) and return the result.\\n function and(euint8 a, euint16 b) internal returns (euint16) {\\n if (!isInitialized(a)) {\\n a = asEuint8(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint16(0);\\n }\\n return euint16.wrap(Impl.and(euint16.unwrap(asEuint16(a)), euint16.unwrap(b)));\\n }\\n\\n // Evaluate or(a, b) and return the result.\\n function or(euint8 a, euint16 b) internal returns (euint16) {\\n if (!isInitialized(a)) {\\n a = asEuint8(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint16(0);\\n }\\n return euint16.wrap(Impl.or(euint16.unwrap(asEuint16(a)), euint16.unwrap(b)));\\n }\\n\\n // Evaluate xor(a, b) and return the result.\\n function xor(euint8 a, euint16 b) internal returns (euint16) {\\n if (!isInitialized(a)) {\\n a = asEuint8(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint16(0);\\n }\\n return euint16.wrap(Impl.xor(euint16.unwrap(asEuint16(a)), euint16.unwrap(b)));\\n }\\n\\n // Evaluate eq(a, b) and return the result.\\n function eq(euint8 a, euint16 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint8(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint16(0);\\n }\\n return ebool.wrap(Impl.eq(euint16.unwrap(asEuint16(a)), euint16.unwrap(b), false));\\n }\\n\\n // Evaluate ne(a, b) and return the result.\\n function ne(euint8 a, euint16 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint8(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint16(0);\\n }\\n return ebool.wrap(Impl.ne(euint16.unwrap(asEuint16(a)), euint16.unwrap(b), false));\\n }\\n\\n // Evaluate ge(a, b) and return the result.\\n function ge(euint8 a, euint16 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint8(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint16(0);\\n }\\n return ebool.wrap(Impl.ge(euint16.unwrap(asEuint16(a)), euint16.unwrap(b), false));\\n }\\n\\n // Evaluate gt(a, b) and return the result.\\n function gt(euint8 a, euint16 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint8(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint16(0);\\n }\\n return ebool.wrap(Impl.gt(euint16.unwrap(asEuint16(a)), euint16.unwrap(b), false));\\n }\\n\\n // Evaluate le(a, b) and return the result.\\n function le(euint8 a, euint16 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint8(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint16(0);\\n }\\n return ebool.wrap(Impl.le(euint16.unwrap(asEuint16(a)), euint16.unwrap(b), false));\\n }\\n\\n // Evaluate lt(a, b) and return the result.\\n function lt(euint8 a, euint16 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint8(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint16(0);\\n }\\n return ebool.wrap(Impl.lt(euint16.unwrap(asEuint16(a)), euint16.unwrap(b), false));\\n }\\n\\n // Evaluate min(a, b) and return the result.\\n function min(euint8 a, euint16 b) internal returns (euint16) {\\n if (!isInitialized(a)) {\\n a = asEuint8(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint16(0);\\n }\\n return euint16.wrap(Impl.min(euint16.unwrap(asEuint16(a)), euint16.unwrap(b), false));\\n }\\n\\n // Evaluate max(a, b) and return the result.\\n function max(euint8 a, euint16 b) internal returns (euint16) {\\n if (!isInitialized(a)) {\\n a = asEuint8(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint16(0);\\n }\\n return euint16.wrap(Impl.max(euint16.unwrap(asEuint16(a)), euint16.unwrap(b), false));\\n }\\n\\n // Evaluate add(a, b) and return the result.\\n function add(euint8 a, euint32 b) internal returns (euint32) {\\n if (!isInitialized(a)) {\\n a = asEuint8(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint32(0);\\n }\\n return euint32.wrap(Impl.add(euint32.unwrap(asEuint32(a)), euint32.unwrap(b), false));\\n }\\n\\n // Evaluate sub(a, b) and return the result.\\n function sub(euint8 a, euint32 b) internal returns (euint32) {\\n if (!isInitialized(a)) {\\n a = asEuint8(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint32(0);\\n }\\n return euint32.wrap(Impl.sub(euint32.unwrap(asEuint32(a)), euint32.unwrap(b), false));\\n }\\n\\n // Evaluate mul(a, b) and return the result.\\n function mul(euint8 a, euint32 b) internal returns (euint32) {\\n if (!isInitialized(a)) {\\n a = asEuint8(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint32(0);\\n }\\n return euint32.wrap(Impl.mul(euint32.unwrap(asEuint32(a)), euint32.unwrap(b), false));\\n }\\n\\n // Evaluate and(a, b) and return the result.\\n function and(euint8 a, euint32 b) internal returns (euint32) {\\n if (!isInitialized(a)) {\\n a = asEuint8(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint32(0);\\n }\\n return euint32.wrap(Impl.and(euint32.unwrap(asEuint32(a)), euint32.unwrap(b)));\\n }\\n\\n // Evaluate or(a, b) and return the result.\\n function or(euint8 a, euint32 b) internal returns (euint32) {\\n if (!isInitialized(a)) {\\n a = asEuint8(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint32(0);\\n }\\n return euint32.wrap(Impl.or(euint32.unwrap(asEuint32(a)), euint32.unwrap(b)));\\n }\\n\\n // Evaluate xor(a, b) and return the result.\\n function xor(euint8 a, euint32 b) internal returns (euint32) {\\n if (!isInitialized(a)) {\\n a = asEuint8(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint32(0);\\n }\\n return euint32.wrap(Impl.xor(euint32.unwrap(asEuint32(a)), euint32.unwrap(b)));\\n }\\n\\n // Evaluate eq(a, b) and return the result.\\n function eq(euint8 a, euint32 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint8(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint32(0);\\n }\\n return ebool.wrap(Impl.eq(euint32.unwrap(asEuint32(a)), euint32.unwrap(b), false));\\n }\\n\\n // Evaluate ne(a, b) and return the result.\\n function ne(euint8 a, euint32 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint8(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint32(0);\\n }\\n return ebool.wrap(Impl.ne(euint32.unwrap(asEuint32(a)), euint32.unwrap(b), false));\\n }\\n\\n // Evaluate ge(a, b) and return the result.\\n function ge(euint8 a, euint32 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint8(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint32(0);\\n }\\n return ebool.wrap(Impl.ge(euint32.unwrap(asEuint32(a)), euint32.unwrap(b), false));\\n }\\n\\n // Evaluate gt(a, b) and return the result.\\n function gt(euint8 a, euint32 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint8(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint32(0);\\n }\\n return ebool.wrap(Impl.gt(euint32.unwrap(asEuint32(a)), euint32.unwrap(b), false));\\n }\\n\\n // Evaluate le(a, b) and return the result.\\n function le(euint8 a, euint32 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint8(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint32(0);\\n }\\n return ebool.wrap(Impl.le(euint32.unwrap(asEuint32(a)), euint32.unwrap(b), false));\\n }\\n\\n // Evaluate lt(a, b) and return the result.\\n function lt(euint8 a, euint32 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint8(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint32(0);\\n }\\n return ebool.wrap(Impl.lt(euint32.unwrap(asEuint32(a)), euint32.unwrap(b), false));\\n }\\n\\n // Evaluate min(a, b) and return the result.\\n function min(euint8 a, euint32 b) internal returns (euint32) {\\n if (!isInitialized(a)) {\\n a = asEuint8(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint32(0);\\n }\\n return euint32.wrap(Impl.min(euint32.unwrap(asEuint32(a)), euint32.unwrap(b), false));\\n }\\n\\n // Evaluate max(a, b) and return the result.\\n function max(euint8 a, euint32 b) internal returns (euint32) {\\n if (!isInitialized(a)) {\\n a = asEuint8(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint32(0);\\n }\\n return euint32.wrap(Impl.max(euint32.unwrap(asEuint32(a)), euint32.unwrap(b), false));\\n }\\n\\n // Evaluate add(a, b) and return the result.\\n function add(euint8 a, euint64 b) internal returns (euint64) {\\n if (!isInitialized(a)) {\\n a = asEuint8(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint64(0);\\n }\\n return euint64.wrap(Impl.add(euint64.unwrap(asEuint64(a)), euint64.unwrap(b), false));\\n }\\n\\n // Evaluate sub(a, b) and return the result.\\n function sub(euint8 a, euint64 b) internal returns (euint64) {\\n if (!isInitialized(a)) {\\n a = asEuint8(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint64(0);\\n }\\n return euint64.wrap(Impl.sub(euint64.unwrap(asEuint64(a)), euint64.unwrap(b), false));\\n }\\n\\n // Evaluate mul(a, b) and return the result.\\n function mul(euint8 a, euint64 b) internal returns (euint64) {\\n if (!isInitialized(a)) {\\n a = asEuint8(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint64(0);\\n }\\n return euint64.wrap(Impl.mul(euint64.unwrap(asEuint64(a)), euint64.unwrap(b), false));\\n }\\n\\n // Evaluate and(a, b) and return the result.\\n function and(euint8 a, euint64 b) internal returns (euint64) {\\n if (!isInitialized(a)) {\\n a = asEuint8(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint64(0);\\n }\\n return euint64.wrap(Impl.and(euint64.unwrap(asEuint64(a)), euint64.unwrap(b)));\\n }\\n\\n // Evaluate or(a, b) and return the result.\\n function or(euint8 a, euint64 b) internal returns (euint64) {\\n if (!isInitialized(a)) {\\n a = asEuint8(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint64(0);\\n }\\n return euint64.wrap(Impl.or(euint64.unwrap(asEuint64(a)), euint64.unwrap(b)));\\n }\\n\\n // Evaluate xor(a, b) and return the result.\\n function xor(euint8 a, euint64 b) internal returns (euint64) {\\n if (!isInitialized(a)) {\\n a = asEuint8(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint64(0);\\n }\\n return euint64.wrap(Impl.xor(euint64.unwrap(asEuint64(a)), euint64.unwrap(b)));\\n }\\n\\n // Evaluate eq(a, b) and return the result.\\n function eq(euint8 a, euint64 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint8(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint64(0);\\n }\\n return ebool.wrap(Impl.eq(euint64.unwrap(asEuint64(a)), euint64.unwrap(b), false));\\n }\\n\\n // Evaluate ne(a, b) and return the result.\\n function ne(euint8 a, euint64 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint8(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint64(0);\\n }\\n return ebool.wrap(Impl.ne(euint64.unwrap(asEuint64(a)), euint64.unwrap(b), false));\\n }\\n\\n // Evaluate ge(a, b) and return the result.\\n function ge(euint8 a, euint64 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint8(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint64(0);\\n }\\n return ebool.wrap(Impl.ge(euint64.unwrap(asEuint64(a)), euint64.unwrap(b), false));\\n }\\n\\n // Evaluate gt(a, b) and return the result.\\n function gt(euint8 a, euint64 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint8(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint64(0);\\n }\\n return ebool.wrap(Impl.gt(euint64.unwrap(asEuint64(a)), euint64.unwrap(b), false));\\n }\\n\\n // Evaluate le(a, b) and return the result.\\n function le(euint8 a, euint64 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint8(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint64(0);\\n }\\n return ebool.wrap(Impl.le(euint64.unwrap(asEuint64(a)), euint64.unwrap(b), false));\\n }\\n\\n // Evaluate lt(a, b) and return the result.\\n function lt(euint8 a, euint64 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint8(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint64(0);\\n }\\n return ebool.wrap(Impl.lt(euint64.unwrap(asEuint64(a)), euint64.unwrap(b), false));\\n }\\n\\n // Evaluate min(a, b) and return the result.\\n function min(euint8 a, euint64 b) internal returns (euint64) {\\n if (!isInitialized(a)) {\\n a = asEuint8(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint64(0);\\n }\\n return euint64.wrap(Impl.min(euint64.unwrap(asEuint64(a)), euint64.unwrap(b), false));\\n }\\n\\n // Evaluate max(a, b) and return the result.\\n function max(euint8 a, euint64 b) internal returns (euint64) {\\n if (!isInitialized(a)) {\\n a = asEuint8(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint64(0);\\n }\\n return euint64.wrap(Impl.max(euint64.unwrap(asEuint64(a)), euint64.unwrap(b), false));\\n }\\n\\n // Evaluate add(a, b) and return the result.\\n function add(euint8 a, uint8 b) internal returns (euint8) {\\n if (!isInitialized(a)) {\\n a = asEuint8(0);\\n }\\n return euint8.wrap(Impl.add(euint8.unwrap(a), uint256(b), true));\\n }\\n\\n // Evaluate add(a, b) and return the result.\\n function add(uint8 a, euint8 b) internal returns (euint8) {\\n if (!isInitialized(b)) {\\n b = asEuint8(0);\\n }\\n return euint8.wrap(Impl.add(euint8.unwrap(b), uint256(a), true));\\n }\\n\\n // Evaluate sub(a, b) and return the result.\\n function sub(euint8 a, uint8 b) internal returns (euint8) {\\n if (!isInitialized(a)) {\\n a = asEuint8(0);\\n }\\n return euint8.wrap(Impl.sub(euint8.unwrap(a), uint256(b), true));\\n }\\n\\n // Evaluate sub(a, b) and return the result.\\n function sub(uint8 a, euint8 b) internal returns (euint8) {\\n euint8 aEnc = asEuint8(a);\\n if (!isInitialized(b)) {\\n b = asEuint8(0);\\n }\\n return euint8.wrap(Impl.sub(euint8.unwrap(aEnc), euint8.unwrap(b), false));\\n }\\n\\n // Evaluate mul(a, b) and return the result.\\n function mul(euint8 a, uint8 b) internal returns (euint8) {\\n if (!isInitialized(a)) {\\n a = asEuint8(0);\\n }\\n return euint8.wrap(Impl.mul(euint8.unwrap(a), uint256(b), true));\\n }\\n\\n // Evaluate mul(a, b) and return the result.\\n function mul(uint8 a, euint8 b) internal returns (euint8) {\\n if (!isInitialized(b)) {\\n b = asEuint8(0);\\n }\\n return euint8.wrap(Impl.mul(euint8.unwrap(b), uint256(a), true));\\n }\\n\\n // Evaluate div(a, b) and return the result.\\n function div(euint8 a, uint8 b) internal returns (euint8) {\\n if (!isInitialized(a)) {\\n a = asEuint8(0);\\n }\\n return euint8.wrap(Impl.div(euint8.unwrap(a), uint256(b)));\\n }\\n\\n // Evaluate rem(a, b) and return the result.\\n function rem(euint8 a, uint8 b) internal returns (euint8) {\\n if (!isInitialized(a)) {\\n a = asEuint8(0);\\n }\\n return euint8.wrap(Impl.rem(euint8.unwrap(a), uint256(b)));\\n }\\n\\n // Evaluate eq(a, b) and return the result.\\n function eq(euint8 a, uint8 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint8(0);\\n }\\n return ebool.wrap(Impl.eq(euint8.unwrap(a), uint256(b), true));\\n }\\n\\n // Evaluate eq(a, b) and return the result.\\n function eq(uint8 a, euint8 b) internal returns (ebool) {\\n if (!isInitialized(b)) {\\n b = asEuint8(0);\\n }\\n return ebool.wrap(Impl.eq(euint8.unwrap(b), uint256(a), true));\\n }\\n\\n // Evaluate ne(a, b) and return the result.\\n function ne(euint8 a, uint8 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint8(0);\\n }\\n return ebool.wrap(Impl.ne(euint8.unwrap(a), uint256(b), true));\\n }\\n\\n // Evaluate ne(a, b) and return the result.\\n function ne(uint8 a, euint8 b) internal returns (ebool) {\\n if (!isInitialized(b)) {\\n b = asEuint8(0);\\n }\\n return ebool.wrap(Impl.ne(euint8.unwrap(b), uint256(a), true));\\n }\\n\\n // Evaluate ge(a, b) and return the result.\\n function ge(euint8 a, uint8 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint8(0);\\n }\\n return ebool.wrap(Impl.ge(euint8.unwrap(a), uint256(b), true));\\n }\\n\\n // Evaluate ge(a, b) and return the result.\\n function ge(uint8 a, euint8 b) internal returns (ebool) {\\n if (!isInitialized(b)) {\\n b = asEuint8(0);\\n }\\n return ebool.wrap(Impl.le(euint8.unwrap(b), uint256(a), true));\\n }\\n\\n // Evaluate gt(a, b) and return the result.\\n function gt(euint8 a, uint8 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint8(0);\\n }\\n return ebool.wrap(Impl.gt(euint8.unwrap(a), uint256(b), true));\\n }\\n\\n // Evaluate gt(a, b) and return the result.\\n function gt(uint8 a, euint8 b) internal returns (ebool) {\\n if (!isInitialized(b)) {\\n b = asEuint8(0);\\n }\\n return ebool.wrap(Impl.lt(euint8.unwrap(b), uint256(a), true));\\n }\\n\\n // Evaluate le(a, b) and return the result.\\n function le(euint8 a, uint8 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint8(0);\\n }\\n return ebool.wrap(Impl.le(euint8.unwrap(a), uint256(b), true));\\n }\\n\\n // Evaluate le(a, b) and return the result.\\n function le(uint8 a, euint8 b) internal returns (ebool) {\\n if (!isInitialized(b)) {\\n b = asEuint8(0);\\n }\\n return ebool.wrap(Impl.ge(euint8.unwrap(b), uint256(a), true));\\n }\\n\\n // Evaluate lt(a, b) and return the result.\\n function lt(euint8 a, uint8 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint8(0);\\n }\\n return ebool.wrap(Impl.lt(euint8.unwrap(a), uint256(b), true));\\n }\\n\\n // Evaluate lt(a, b) and return the result.\\n function lt(uint8 a, euint8 b) internal returns (ebool) {\\n if (!isInitialized(b)) {\\n b = asEuint8(0);\\n }\\n return ebool.wrap(Impl.gt(euint8.unwrap(b), uint256(a), true));\\n }\\n\\n // Evaluate min(a, b) and return the result.\\n function min(euint8 a, uint8 b) internal returns (euint8) {\\n if (!isInitialized(a)) {\\n a = asEuint8(0);\\n }\\n return euint8.wrap(Impl.min(euint8.unwrap(a), uint256(b), true));\\n }\\n\\n // Evaluate min(a, b) and return the result.\\n function min(uint8 a, euint8 b) internal returns (euint8) {\\n if (!isInitialized(b)) {\\n b = asEuint8(0);\\n }\\n return euint8.wrap(Impl.min(euint8.unwrap(b), uint256(a), true));\\n }\\n\\n // Evaluate max(a, b) and return the result.\\n function max(euint8 a, uint8 b) internal returns (euint8) {\\n if (!isInitialized(a)) {\\n a = asEuint8(0);\\n }\\n return euint8.wrap(Impl.max(euint8.unwrap(a), uint256(b), true));\\n }\\n\\n // Evaluate max(a, b) and return the result.\\n function max(uint8 a, euint8 b) internal returns (euint8) {\\n if (!isInitialized(b)) {\\n b = asEuint8(0);\\n }\\n return euint8.wrap(Impl.max(euint8.unwrap(b), uint256(a), true));\\n }\\n\\n // Evaluate add(a, b) and return the result.\\n function add(euint16 a, euint4 b) internal returns (euint16) {\\n if (!isInitialized(a)) {\\n a = asEuint16(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint4(0);\\n }\\n return euint16.wrap(Impl.add(euint16.unwrap(a), euint16.unwrap(asEuint16(b)), false));\\n }\\n\\n // Evaluate sub(a, b) and return the result.\\n function sub(euint16 a, euint4 b) internal returns (euint16) {\\n if (!isInitialized(a)) {\\n a = asEuint16(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint4(0);\\n }\\n return euint16.wrap(Impl.sub(euint16.unwrap(a), euint16.unwrap(asEuint16(b)), false));\\n }\\n\\n // Evaluate mul(a, b) and return the result.\\n function mul(euint16 a, euint4 b) internal returns (euint16) {\\n if (!isInitialized(a)) {\\n a = asEuint16(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint4(0);\\n }\\n return euint16.wrap(Impl.mul(euint16.unwrap(a), euint16.unwrap(asEuint16(b)), false));\\n }\\n\\n // Evaluate and(a, b) and return the result.\\n function and(euint16 a, euint4 b) internal returns (euint16) {\\n if (!isInitialized(a)) {\\n a = asEuint16(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint4(0);\\n }\\n return euint16.wrap(Impl.and(euint16.unwrap(a), euint16.unwrap(asEuint16(b))));\\n }\\n\\n // Evaluate or(a, b) and return the result.\\n function or(euint16 a, euint4 b) internal returns (euint16) {\\n if (!isInitialized(a)) {\\n a = asEuint16(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint4(0);\\n }\\n return euint16.wrap(Impl.or(euint16.unwrap(a), euint16.unwrap(asEuint16(b))));\\n }\\n\\n // Evaluate xor(a, b) and return the result.\\n function xor(euint16 a, euint4 b) internal returns (euint16) {\\n if (!isInitialized(a)) {\\n a = asEuint16(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint4(0);\\n }\\n return euint16.wrap(Impl.xor(euint16.unwrap(a), euint16.unwrap(asEuint16(b))));\\n }\\n\\n // Evaluate eq(a, b) and return the result.\\n function eq(euint16 a, euint4 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint16(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint4(0);\\n }\\n return ebool.wrap(Impl.eq(euint16.unwrap(a), euint16.unwrap(asEuint16(b)), false));\\n }\\n\\n // Evaluate ne(a, b) and return the result.\\n function ne(euint16 a, euint4 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint16(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint4(0);\\n }\\n return ebool.wrap(Impl.ne(euint16.unwrap(a), euint16.unwrap(asEuint16(b)), false));\\n }\\n\\n // Evaluate ge(a, b) and return the result.\\n function ge(euint16 a, euint4 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint16(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint4(0);\\n }\\n return ebool.wrap(Impl.ge(euint16.unwrap(a), euint16.unwrap(asEuint16(b)), false));\\n }\\n\\n // Evaluate gt(a, b) and return the result.\\n function gt(euint16 a, euint4 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint16(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint4(0);\\n }\\n return ebool.wrap(Impl.gt(euint16.unwrap(a), euint16.unwrap(asEuint16(b)), false));\\n }\\n\\n // Evaluate le(a, b) and return the result.\\n function le(euint16 a, euint4 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint16(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint4(0);\\n }\\n return ebool.wrap(Impl.le(euint16.unwrap(a), euint16.unwrap(asEuint16(b)), false));\\n }\\n\\n // Evaluate lt(a, b) and return the result.\\n function lt(euint16 a, euint4 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint16(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint4(0);\\n }\\n return ebool.wrap(Impl.lt(euint16.unwrap(a), euint16.unwrap(asEuint16(b)), false));\\n }\\n\\n // Evaluate min(a, b) and return the result.\\n function min(euint16 a, euint4 b) internal returns (euint16) {\\n if (!isInitialized(a)) {\\n a = asEuint16(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint4(0);\\n }\\n return euint16.wrap(Impl.min(euint16.unwrap(a), euint16.unwrap(asEuint16(b)), false));\\n }\\n\\n // Evaluate max(a, b) and return the result.\\n function max(euint16 a, euint4 b) internal returns (euint16) {\\n if (!isInitialized(a)) {\\n a = asEuint16(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint4(0);\\n }\\n return euint16.wrap(Impl.max(euint16.unwrap(a), euint16.unwrap(asEuint16(b)), false));\\n }\\n\\n // Evaluate add(a, b) and return the result.\\n function add(euint16 a, euint8 b) internal returns (euint16) {\\n if (!isInitialized(a)) {\\n a = asEuint16(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint8(0);\\n }\\n return euint16.wrap(Impl.add(euint16.unwrap(a), euint16.unwrap(asEuint16(b)), false));\\n }\\n\\n // Evaluate sub(a, b) and return the result.\\n function sub(euint16 a, euint8 b) internal returns (euint16) {\\n if (!isInitialized(a)) {\\n a = asEuint16(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint8(0);\\n }\\n return euint16.wrap(Impl.sub(euint16.unwrap(a), euint16.unwrap(asEuint16(b)), false));\\n }\\n\\n // Evaluate mul(a, b) and return the result.\\n function mul(euint16 a, euint8 b) internal returns (euint16) {\\n if (!isInitialized(a)) {\\n a = asEuint16(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint8(0);\\n }\\n return euint16.wrap(Impl.mul(euint16.unwrap(a), euint16.unwrap(asEuint16(b)), false));\\n }\\n\\n // Evaluate and(a, b) and return the result.\\n function and(euint16 a, euint8 b) internal returns (euint16) {\\n if (!isInitialized(a)) {\\n a = asEuint16(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint8(0);\\n }\\n return euint16.wrap(Impl.and(euint16.unwrap(a), euint16.unwrap(asEuint16(b))));\\n }\\n\\n // Evaluate or(a, b) and return the result.\\n function or(euint16 a, euint8 b) internal returns (euint16) {\\n if (!isInitialized(a)) {\\n a = asEuint16(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint8(0);\\n }\\n return euint16.wrap(Impl.or(euint16.unwrap(a), euint16.unwrap(asEuint16(b))));\\n }\\n\\n // Evaluate xor(a, b) and return the result.\\n function xor(euint16 a, euint8 b) internal returns (euint16) {\\n if (!isInitialized(a)) {\\n a = asEuint16(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint8(0);\\n }\\n return euint16.wrap(Impl.xor(euint16.unwrap(a), euint16.unwrap(asEuint16(b))));\\n }\\n\\n // Evaluate eq(a, b) and return the result.\\n function eq(euint16 a, euint8 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint16(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint8(0);\\n }\\n return ebool.wrap(Impl.eq(euint16.unwrap(a), euint16.unwrap(asEuint16(b)), false));\\n }\\n\\n // Evaluate ne(a, b) and return the result.\\n function ne(euint16 a, euint8 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint16(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint8(0);\\n }\\n return ebool.wrap(Impl.ne(euint16.unwrap(a), euint16.unwrap(asEuint16(b)), false));\\n }\\n\\n // Evaluate ge(a, b) and return the result.\\n function ge(euint16 a, euint8 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint16(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint8(0);\\n }\\n return ebool.wrap(Impl.ge(euint16.unwrap(a), euint16.unwrap(asEuint16(b)), false));\\n }\\n\\n // Evaluate gt(a, b) and return the result.\\n function gt(euint16 a, euint8 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint16(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint8(0);\\n }\\n return ebool.wrap(Impl.gt(euint16.unwrap(a), euint16.unwrap(asEuint16(b)), false));\\n }\\n\\n // Evaluate le(a, b) and return the result.\\n function le(euint16 a, euint8 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint16(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint8(0);\\n }\\n return ebool.wrap(Impl.le(euint16.unwrap(a), euint16.unwrap(asEuint16(b)), false));\\n }\\n\\n // Evaluate lt(a, b) and return the result.\\n function lt(euint16 a, euint8 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint16(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint8(0);\\n }\\n return ebool.wrap(Impl.lt(euint16.unwrap(a), euint16.unwrap(asEuint16(b)), false));\\n }\\n\\n // Evaluate min(a, b) and return the result.\\n function min(euint16 a, euint8 b) internal returns (euint16) {\\n if (!isInitialized(a)) {\\n a = asEuint16(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint8(0);\\n }\\n return euint16.wrap(Impl.min(euint16.unwrap(a), euint16.unwrap(asEuint16(b)), false));\\n }\\n\\n // Evaluate max(a, b) and return the result.\\n function max(euint16 a, euint8 b) internal returns (euint16) {\\n if (!isInitialized(a)) {\\n a = asEuint16(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint8(0);\\n }\\n return euint16.wrap(Impl.max(euint16.unwrap(a), euint16.unwrap(asEuint16(b)), false));\\n }\\n\\n // Evaluate add(a, b) and return the result.\\n function add(euint16 a, euint16 b) internal returns (euint16) {\\n if (!isInitialized(a)) {\\n a = asEuint16(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint16(0);\\n }\\n return euint16.wrap(Impl.add(euint16.unwrap(a), euint16.unwrap(b), false));\\n }\\n\\n // Evaluate sub(a, b) and return the result.\\n function sub(euint16 a, euint16 b) internal returns (euint16) {\\n if (!isInitialized(a)) {\\n a = asEuint16(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint16(0);\\n }\\n return euint16.wrap(Impl.sub(euint16.unwrap(a), euint16.unwrap(b), false));\\n }\\n\\n // Evaluate mul(a, b) and return the result.\\n function mul(euint16 a, euint16 b) internal returns (euint16) {\\n if (!isInitialized(a)) {\\n a = asEuint16(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint16(0);\\n }\\n return euint16.wrap(Impl.mul(euint16.unwrap(a), euint16.unwrap(b), false));\\n }\\n\\n // Evaluate and(a, b) and return the result.\\n function and(euint16 a, euint16 b) internal returns (euint16) {\\n if (!isInitialized(a)) {\\n a = asEuint16(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint16(0);\\n }\\n return euint16.wrap(Impl.and(euint16.unwrap(a), euint16.unwrap(b)));\\n }\\n\\n // Evaluate or(a, b) and return the result.\\n function or(euint16 a, euint16 b) internal returns (euint16) {\\n if (!isInitialized(a)) {\\n a = asEuint16(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint16(0);\\n }\\n return euint16.wrap(Impl.or(euint16.unwrap(a), euint16.unwrap(b)));\\n }\\n\\n // Evaluate xor(a, b) and return the result.\\n function xor(euint16 a, euint16 b) internal returns (euint16) {\\n if (!isInitialized(a)) {\\n a = asEuint16(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint16(0);\\n }\\n return euint16.wrap(Impl.xor(euint16.unwrap(a), euint16.unwrap(b)));\\n }\\n\\n // Evaluate eq(a, b) and return the result.\\n function eq(euint16 a, euint16 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint16(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint16(0);\\n }\\n return ebool.wrap(Impl.eq(euint16.unwrap(a), euint16.unwrap(b), false));\\n }\\n\\n // Evaluate ne(a, b) and return the result.\\n function ne(euint16 a, euint16 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint16(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint16(0);\\n }\\n return ebool.wrap(Impl.ne(euint16.unwrap(a), euint16.unwrap(b), false));\\n }\\n\\n // Evaluate ge(a, b) and return the result.\\n function ge(euint16 a, euint16 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint16(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint16(0);\\n }\\n return ebool.wrap(Impl.ge(euint16.unwrap(a), euint16.unwrap(b), false));\\n }\\n\\n // Evaluate gt(a, b) and return the result.\\n function gt(euint16 a, euint16 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint16(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint16(0);\\n }\\n return ebool.wrap(Impl.gt(euint16.unwrap(a), euint16.unwrap(b), false));\\n }\\n\\n // Evaluate le(a, b) and return the result.\\n function le(euint16 a, euint16 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint16(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint16(0);\\n }\\n return ebool.wrap(Impl.le(euint16.unwrap(a), euint16.unwrap(b), false));\\n }\\n\\n // Evaluate lt(a, b) and return the result.\\n function lt(euint16 a, euint16 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint16(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint16(0);\\n }\\n return ebool.wrap(Impl.lt(euint16.unwrap(a), euint16.unwrap(b), false));\\n }\\n\\n // Evaluate min(a, b) and return the result.\\n function min(euint16 a, euint16 b) internal returns (euint16) {\\n if (!isInitialized(a)) {\\n a = asEuint16(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint16(0);\\n }\\n return euint16.wrap(Impl.min(euint16.unwrap(a), euint16.unwrap(b), false));\\n }\\n\\n // Evaluate max(a, b) and return the result.\\n function max(euint16 a, euint16 b) internal returns (euint16) {\\n if (!isInitialized(a)) {\\n a = asEuint16(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint16(0);\\n }\\n return euint16.wrap(Impl.max(euint16.unwrap(a), euint16.unwrap(b), false));\\n }\\n\\n // Evaluate add(a, b) and return the result.\\n function add(euint16 a, euint32 b) internal returns (euint32) {\\n if (!isInitialized(a)) {\\n a = asEuint16(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint32(0);\\n }\\n return euint32.wrap(Impl.add(euint32.unwrap(asEuint32(a)), euint32.unwrap(b), false));\\n }\\n\\n // Evaluate sub(a, b) and return the result.\\n function sub(euint16 a, euint32 b) internal returns (euint32) {\\n if (!isInitialized(a)) {\\n a = asEuint16(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint32(0);\\n }\\n return euint32.wrap(Impl.sub(euint32.unwrap(asEuint32(a)), euint32.unwrap(b), false));\\n }\\n\\n // Evaluate mul(a, b) and return the result.\\n function mul(euint16 a, euint32 b) internal returns (euint32) {\\n if (!isInitialized(a)) {\\n a = asEuint16(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint32(0);\\n }\\n return euint32.wrap(Impl.mul(euint32.unwrap(asEuint32(a)), euint32.unwrap(b), false));\\n }\\n\\n // Evaluate and(a, b) and return the result.\\n function and(euint16 a, euint32 b) internal returns (euint32) {\\n if (!isInitialized(a)) {\\n a = asEuint16(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint32(0);\\n }\\n return euint32.wrap(Impl.and(euint32.unwrap(asEuint32(a)), euint32.unwrap(b)));\\n }\\n\\n // Evaluate or(a, b) and return the result.\\n function or(euint16 a, euint32 b) internal returns (euint32) {\\n if (!isInitialized(a)) {\\n a = asEuint16(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint32(0);\\n }\\n return euint32.wrap(Impl.or(euint32.unwrap(asEuint32(a)), euint32.unwrap(b)));\\n }\\n\\n // Evaluate xor(a, b) and return the result.\\n function xor(euint16 a, euint32 b) internal returns (euint32) {\\n if (!isInitialized(a)) {\\n a = asEuint16(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint32(0);\\n }\\n return euint32.wrap(Impl.xor(euint32.unwrap(asEuint32(a)), euint32.unwrap(b)));\\n }\\n\\n // Evaluate eq(a, b) and return the result.\\n function eq(euint16 a, euint32 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint16(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint32(0);\\n }\\n return ebool.wrap(Impl.eq(euint32.unwrap(asEuint32(a)), euint32.unwrap(b), false));\\n }\\n\\n // Evaluate ne(a, b) and return the result.\\n function ne(euint16 a, euint32 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint16(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint32(0);\\n }\\n return ebool.wrap(Impl.ne(euint32.unwrap(asEuint32(a)), euint32.unwrap(b), false));\\n }\\n\\n // Evaluate ge(a, b) and return the result.\\n function ge(euint16 a, euint32 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint16(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint32(0);\\n }\\n return ebool.wrap(Impl.ge(euint32.unwrap(asEuint32(a)), euint32.unwrap(b), false));\\n }\\n\\n // Evaluate gt(a, b) and return the result.\\n function gt(euint16 a, euint32 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint16(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint32(0);\\n }\\n return ebool.wrap(Impl.gt(euint32.unwrap(asEuint32(a)), euint32.unwrap(b), false));\\n }\\n\\n // Evaluate le(a, b) and return the result.\\n function le(euint16 a, euint32 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint16(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint32(0);\\n }\\n return ebool.wrap(Impl.le(euint32.unwrap(asEuint32(a)), euint32.unwrap(b), false));\\n }\\n\\n // Evaluate lt(a, b) and return the result.\\n function lt(euint16 a, euint32 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint16(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint32(0);\\n }\\n return ebool.wrap(Impl.lt(euint32.unwrap(asEuint32(a)), euint32.unwrap(b), false));\\n }\\n\\n // Evaluate min(a, b) and return the result.\\n function min(euint16 a, euint32 b) internal returns (euint32) {\\n if (!isInitialized(a)) {\\n a = asEuint16(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint32(0);\\n }\\n return euint32.wrap(Impl.min(euint32.unwrap(asEuint32(a)), euint32.unwrap(b), false));\\n }\\n\\n // Evaluate max(a, b) and return the result.\\n function max(euint16 a, euint32 b) internal returns (euint32) {\\n if (!isInitialized(a)) {\\n a = asEuint16(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint32(0);\\n }\\n return euint32.wrap(Impl.max(euint32.unwrap(asEuint32(a)), euint32.unwrap(b), false));\\n }\\n\\n // Evaluate add(a, b) and return the result.\\n function add(euint16 a, euint64 b) internal returns (euint64) {\\n if (!isInitialized(a)) {\\n a = asEuint16(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint64(0);\\n }\\n return euint64.wrap(Impl.add(euint64.unwrap(asEuint64(a)), euint64.unwrap(b), false));\\n }\\n\\n // Evaluate sub(a, b) and return the result.\\n function sub(euint16 a, euint64 b) internal returns (euint64) {\\n if (!isInitialized(a)) {\\n a = asEuint16(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint64(0);\\n }\\n return euint64.wrap(Impl.sub(euint64.unwrap(asEuint64(a)), euint64.unwrap(b), false));\\n }\\n\\n // Evaluate mul(a, b) and return the result.\\n function mul(euint16 a, euint64 b) internal returns (euint64) {\\n if (!isInitialized(a)) {\\n a = asEuint16(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint64(0);\\n }\\n return euint64.wrap(Impl.mul(euint64.unwrap(asEuint64(a)), euint64.unwrap(b), false));\\n }\\n\\n // Evaluate and(a, b) and return the result.\\n function and(euint16 a, euint64 b) internal returns (euint64) {\\n if (!isInitialized(a)) {\\n a = asEuint16(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint64(0);\\n }\\n return euint64.wrap(Impl.and(euint64.unwrap(asEuint64(a)), euint64.unwrap(b)));\\n }\\n\\n // Evaluate or(a, b) and return the result.\\n function or(euint16 a, euint64 b) internal returns (euint64) {\\n if (!isInitialized(a)) {\\n a = asEuint16(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint64(0);\\n }\\n return euint64.wrap(Impl.or(euint64.unwrap(asEuint64(a)), euint64.unwrap(b)));\\n }\\n\\n // Evaluate xor(a, b) and return the result.\\n function xor(euint16 a, euint64 b) internal returns (euint64) {\\n if (!isInitialized(a)) {\\n a = asEuint16(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint64(0);\\n }\\n return euint64.wrap(Impl.xor(euint64.unwrap(asEuint64(a)), euint64.unwrap(b)));\\n }\\n\\n // Evaluate eq(a, b) and return the result.\\n function eq(euint16 a, euint64 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint16(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint64(0);\\n }\\n return ebool.wrap(Impl.eq(euint64.unwrap(asEuint64(a)), euint64.unwrap(b), false));\\n }\\n\\n // Evaluate ne(a, b) and return the result.\\n function ne(euint16 a, euint64 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint16(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint64(0);\\n }\\n return ebool.wrap(Impl.ne(euint64.unwrap(asEuint64(a)), euint64.unwrap(b), false));\\n }\\n\\n // Evaluate ge(a, b) and return the result.\\n function ge(euint16 a, euint64 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint16(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint64(0);\\n }\\n return ebool.wrap(Impl.ge(euint64.unwrap(asEuint64(a)), euint64.unwrap(b), false));\\n }\\n\\n // Evaluate gt(a, b) and return the result.\\n function gt(euint16 a, euint64 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint16(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint64(0);\\n }\\n return ebool.wrap(Impl.gt(euint64.unwrap(asEuint64(a)), euint64.unwrap(b), false));\\n }\\n\\n // Evaluate le(a, b) and return the result.\\n function le(euint16 a, euint64 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint16(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint64(0);\\n }\\n return ebool.wrap(Impl.le(euint64.unwrap(asEuint64(a)), euint64.unwrap(b), false));\\n }\\n\\n // Evaluate lt(a, b) and return the result.\\n function lt(euint16 a, euint64 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint16(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint64(0);\\n }\\n return ebool.wrap(Impl.lt(euint64.unwrap(asEuint64(a)), euint64.unwrap(b), false));\\n }\\n\\n // Evaluate min(a, b) and return the result.\\n function min(euint16 a, euint64 b) internal returns (euint64) {\\n if (!isInitialized(a)) {\\n a = asEuint16(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint64(0);\\n }\\n return euint64.wrap(Impl.min(euint64.unwrap(asEuint64(a)), euint64.unwrap(b), false));\\n }\\n\\n // Evaluate max(a, b) and return the result.\\n function max(euint16 a, euint64 b) internal returns (euint64) {\\n if (!isInitialized(a)) {\\n a = asEuint16(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint64(0);\\n }\\n return euint64.wrap(Impl.max(euint64.unwrap(asEuint64(a)), euint64.unwrap(b), false));\\n }\\n\\n // Evaluate add(a, b) and return the result.\\n function add(euint16 a, uint16 b) internal returns (euint16) {\\n if (!isInitialized(a)) {\\n a = asEuint16(0);\\n }\\n return euint16.wrap(Impl.add(euint16.unwrap(a), uint256(b), true));\\n }\\n\\n // Evaluate add(a, b) and return the result.\\n function add(uint16 a, euint16 b) internal returns (euint16) {\\n if (!isInitialized(b)) {\\n b = asEuint16(0);\\n }\\n return euint16.wrap(Impl.add(euint16.unwrap(b), uint256(a), true));\\n }\\n\\n // Evaluate sub(a, b) and return the result.\\n function sub(euint16 a, uint16 b) internal returns (euint16) {\\n if (!isInitialized(a)) {\\n a = asEuint16(0);\\n }\\n return euint16.wrap(Impl.sub(euint16.unwrap(a), uint256(b), true));\\n }\\n\\n // Evaluate sub(a, b) and return the result.\\n function sub(uint16 a, euint16 b) internal returns (euint16) {\\n euint16 aEnc = asEuint16(a);\\n if (!isInitialized(b)) {\\n b = asEuint16(0);\\n }\\n return euint16.wrap(Impl.sub(euint16.unwrap(aEnc), euint16.unwrap(b), false));\\n }\\n\\n // Evaluate mul(a, b) and return the result.\\n function mul(euint16 a, uint16 b) internal returns (euint16) {\\n if (!isInitialized(a)) {\\n a = asEuint16(0);\\n }\\n return euint16.wrap(Impl.mul(euint16.unwrap(a), uint256(b), true));\\n }\\n\\n // Evaluate mul(a, b) and return the result.\\n function mul(uint16 a, euint16 b) internal returns (euint16) {\\n if (!isInitialized(b)) {\\n b = asEuint16(0);\\n }\\n return euint16.wrap(Impl.mul(euint16.unwrap(b), uint256(a), true));\\n }\\n\\n // Evaluate div(a, b) and return the result.\\n function div(euint16 a, uint16 b) internal returns (euint16) {\\n if (!isInitialized(a)) {\\n a = asEuint16(0);\\n }\\n return euint16.wrap(Impl.div(euint16.unwrap(a), uint256(b)));\\n }\\n\\n // Evaluate rem(a, b) and return the result.\\n function rem(euint16 a, uint16 b) internal returns (euint16) {\\n if (!isInitialized(a)) {\\n a = asEuint16(0);\\n }\\n return euint16.wrap(Impl.rem(euint16.unwrap(a), uint256(b)));\\n }\\n\\n // Evaluate eq(a, b) and return the result.\\n function eq(euint16 a, uint16 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint16(0);\\n }\\n return ebool.wrap(Impl.eq(euint16.unwrap(a), uint256(b), true));\\n }\\n\\n // Evaluate eq(a, b) and return the result.\\n function eq(uint16 a, euint16 b) internal returns (ebool) {\\n if (!isInitialized(b)) {\\n b = asEuint16(0);\\n }\\n return ebool.wrap(Impl.eq(euint16.unwrap(b), uint256(a), true));\\n }\\n\\n // Evaluate ne(a, b) and return the result.\\n function ne(euint16 a, uint16 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint16(0);\\n }\\n return ebool.wrap(Impl.ne(euint16.unwrap(a), uint256(b), true));\\n }\\n\\n // Evaluate ne(a, b) and return the result.\\n function ne(uint16 a, euint16 b) internal returns (ebool) {\\n if (!isInitialized(b)) {\\n b = asEuint16(0);\\n }\\n return ebool.wrap(Impl.ne(euint16.unwrap(b), uint256(a), true));\\n }\\n\\n // Evaluate ge(a, b) and return the result.\\n function ge(euint16 a, uint16 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint16(0);\\n }\\n return ebool.wrap(Impl.ge(euint16.unwrap(a), uint256(b), true));\\n }\\n\\n // Evaluate ge(a, b) and return the result.\\n function ge(uint16 a, euint16 b) internal returns (ebool) {\\n if (!isInitialized(b)) {\\n b = asEuint16(0);\\n }\\n return ebool.wrap(Impl.le(euint16.unwrap(b), uint256(a), true));\\n }\\n\\n // Evaluate gt(a, b) and return the result.\\n function gt(euint16 a, uint16 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint16(0);\\n }\\n return ebool.wrap(Impl.gt(euint16.unwrap(a), uint256(b), true));\\n }\\n\\n // Evaluate gt(a, b) and return the result.\\n function gt(uint16 a, euint16 b) internal returns (ebool) {\\n if (!isInitialized(b)) {\\n b = asEuint16(0);\\n }\\n return ebool.wrap(Impl.lt(euint16.unwrap(b), uint256(a), true));\\n }\\n\\n // Evaluate le(a, b) and return the result.\\n function le(euint16 a, uint16 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint16(0);\\n }\\n return ebool.wrap(Impl.le(euint16.unwrap(a), uint256(b), true));\\n }\\n\\n // Evaluate le(a, b) and return the result.\\n function le(uint16 a, euint16 b) internal returns (ebool) {\\n if (!isInitialized(b)) {\\n b = asEuint16(0);\\n }\\n return ebool.wrap(Impl.ge(euint16.unwrap(b), uint256(a), true));\\n }\\n\\n // Evaluate lt(a, b) and return the result.\\n function lt(euint16 a, uint16 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint16(0);\\n }\\n return ebool.wrap(Impl.lt(euint16.unwrap(a), uint256(b), true));\\n }\\n\\n // Evaluate lt(a, b) and return the result.\\n function lt(uint16 a, euint16 b) internal returns (ebool) {\\n if (!isInitialized(b)) {\\n b = asEuint16(0);\\n }\\n return ebool.wrap(Impl.gt(euint16.unwrap(b), uint256(a), true));\\n }\\n\\n // Evaluate min(a, b) and return the result.\\n function min(euint16 a, uint16 b) internal returns (euint16) {\\n if (!isInitialized(a)) {\\n a = asEuint16(0);\\n }\\n return euint16.wrap(Impl.min(euint16.unwrap(a), uint256(b), true));\\n }\\n\\n // Evaluate min(a, b) and return the result.\\n function min(uint16 a, euint16 b) internal returns (euint16) {\\n if (!isInitialized(b)) {\\n b = asEuint16(0);\\n }\\n return euint16.wrap(Impl.min(euint16.unwrap(b), uint256(a), true));\\n }\\n\\n // Evaluate max(a, b) and return the result.\\n function max(euint16 a, uint16 b) internal returns (euint16) {\\n if (!isInitialized(a)) {\\n a = asEuint16(0);\\n }\\n return euint16.wrap(Impl.max(euint16.unwrap(a), uint256(b), true));\\n }\\n\\n // Evaluate max(a, b) and return the result.\\n function max(uint16 a, euint16 b) internal returns (euint16) {\\n if (!isInitialized(b)) {\\n b = asEuint16(0);\\n }\\n return euint16.wrap(Impl.max(euint16.unwrap(b), uint256(a), true));\\n }\\n\\n // Evaluate add(a, b) and return the result.\\n function add(euint32 a, euint4 b) internal returns (euint32) {\\n if (!isInitialized(a)) {\\n a = asEuint32(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint4(0);\\n }\\n return euint32.wrap(Impl.add(euint32.unwrap(a), euint32.unwrap(asEuint32(b)), false));\\n }\\n\\n // Evaluate sub(a, b) and return the result.\\n function sub(euint32 a, euint4 b) internal returns (euint32) {\\n if (!isInitialized(a)) {\\n a = asEuint32(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint4(0);\\n }\\n return euint32.wrap(Impl.sub(euint32.unwrap(a), euint32.unwrap(asEuint32(b)), false));\\n }\\n\\n // Evaluate mul(a, b) and return the result.\\n function mul(euint32 a, euint4 b) internal returns (euint32) {\\n if (!isInitialized(a)) {\\n a = asEuint32(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint4(0);\\n }\\n return euint32.wrap(Impl.mul(euint32.unwrap(a), euint32.unwrap(asEuint32(b)), false));\\n }\\n\\n // Evaluate and(a, b) and return the result.\\n function and(euint32 a, euint4 b) internal returns (euint32) {\\n if (!isInitialized(a)) {\\n a = asEuint32(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint4(0);\\n }\\n return euint32.wrap(Impl.and(euint32.unwrap(a), euint32.unwrap(asEuint32(b))));\\n }\\n\\n // Evaluate or(a, b) and return the result.\\n function or(euint32 a, euint4 b) internal returns (euint32) {\\n if (!isInitialized(a)) {\\n a = asEuint32(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint4(0);\\n }\\n return euint32.wrap(Impl.or(euint32.unwrap(a), euint32.unwrap(asEuint32(b))));\\n }\\n\\n // Evaluate xor(a, b) and return the result.\\n function xor(euint32 a, euint4 b) internal returns (euint32) {\\n if (!isInitialized(a)) {\\n a = asEuint32(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint4(0);\\n }\\n return euint32.wrap(Impl.xor(euint32.unwrap(a), euint32.unwrap(asEuint32(b))));\\n }\\n\\n // Evaluate eq(a, b) and return the result.\\n function eq(euint32 a, euint4 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint32(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint4(0);\\n }\\n return ebool.wrap(Impl.eq(euint32.unwrap(a), euint32.unwrap(asEuint32(b)), false));\\n }\\n\\n // Evaluate ne(a, b) and return the result.\\n function ne(euint32 a, euint4 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint32(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint4(0);\\n }\\n return ebool.wrap(Impl.ne(euint32.unwrap(a), euint32.unwrap(asEuint32(b)), false));\\n }\\n\\n // Evaluate ge(a, b) and return the result.\\n function ge(euint32 a, euint4 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint32(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint4(0);\\n }\\n return ebool.wrap(Impl.ge(euint32.unwrap(a), euint32.unwrap(asEuint32(b)), false));\\n }\\n\\n // Evaluate gt(a, b) and return the result.\\n function gt(euint32 a, euint4 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint32(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint4(0);\\n }\\n return ebool.wrap(Impl.gt(euint32.unwrap(a), euint32.unwrap(asEuint32(b)), false));\\n }\\n\\n // Evaluate le(a, b) and return the result.\\n function le(euint32 a, euint4 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint32(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint4(0);\\n }\\n return ebool.wrap(Impl.le(euint32.unwrap(a), euint32.unwrap(asEuint32(b)), false));\\n }\\n\\n // Evaluate lt(a, b) and return the result.\\n function lt(euint32 a, euint4 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint32(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint4(0);\\n }\\n return ebool.wrap(Impl.lt(euint32.unwrap(a), euint32.unwrap(asEuint32(b)), false));\\n }\\n\\n // Evaluate min(a, b) and return the result.\\n function min(euint32 a, euint4 b) internal returns (euint32) {\\n if (!isInitialized(a)) {\\n a = asEuint32(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint4(0);\\n }\\n return euint32.wrap(Impl.min(euint32.unwrap(a), euint32.unwrap(asEuint32(b)), false));\\n }\\n\\n // Evaluate max(a, b) and return the result.\\n function max(euint32 a, euint4 b) internal returns (euint32) {\\n if (!isInitialized(a)) {\\n a = asEuint32(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint4(0);\\n }\\n return euint32.wrap(Impl.max(euint32.unwrap(a), euint32.unwrap(asEuint32(b)), false));\\n }\\n\\n // Evaluate add(a, b) and return the result.\\n function add(euint32 a, euint8 b) internal returns (euint32) {\\n if (!isInitialized(a)) {\\n a = asEuint32(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint8(0);\\n }\\n return euint32.wrap(Impl.add(euint32.unwrap(a), euint32.unwrap(asEuint32(b)), false));\\n }\\n\\n // Evaluate sub(a, b) and return the result.\\n function sub(euint32 a, euint8 b) internal returns (euint32) {\\n if (!isInitialized(a)) {\\n a = asEuint32(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint8(0);\\n }\\n return euint32.wrap(Impl.sub(euint32.unwrap(a), euint32.unwrap(asEuint32(b)), false));\\n }\\n\\n // Evaluate mul(a, b) and return the result.\\n function mul(euint32 a, euint8 b) internal returns (euint32) {\\n if (!isInitialized(a)) {\\n a = asEuint32(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint8(0);\\n }\\n return euint32.wrap(Impl.mul(euint32.unwrap(a), euint32.unwrap(asEuint32(b)), false));\\n }\\n\\n // Evaluate and(a, b) and return the result.\\n function and(euint32 a, euint8 b) internal returns (euint32) {\\n if (!isInitialized(a)) {\\n a = asEuint32(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint8(0);\\n }\\n return euint32.wrap(Impl.and(euint32.unwrap(a), euint32.unwrap(asEuint32(b))));\\n }\\n\\n // Evaluate or(a, b) and return the result.\\n function or(euint32 a, euint8 b) internal returns (euint32) {\\n if (!isInitialized(a)) {\\n a = asEuint32(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint8(0);\\n }\\n return euint32.wrap(Impl.or(euint32.unwrap(a), euint32.unwrap(asEuint32(b))));\\n }\\n\\n // Evaluate xor(a, b) and return the result.\\n function xor(euint32 a, euint8 b) internal returns (euint32) {\\n if (!isInitialized(a)) {\\n a = asEuint32(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint8(0);\\n }\\n return euint32.wrap(Impl.xor(euint32.unwrap(a), euint32.unwrap(asEuint32(b))));\\n }\\n\\n // Evaluate eq(a, b) and return the result.\\n function eq(euint32 a, euint8 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint32(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint8(0);\\n }\\n return ebool.wrap(Impl.eq(euint32.unwrap(a), euint32.unwrap(asEuint32(b)), false));\\n }\\n\\n // Evaluate ne(a, b) and return the result.\\n function ne(euint32 a, euint8 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint32(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint8(0);\\n }\\n return ebool.wrap(Impl.ne(euint32.unwrap(a), euint32.unwrap(asEuint32(b)), false));\\n }\\n\\n // Evaluate ge(a, b) and return the result.\\n function ge(euint32 a, euint8 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint32(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint8(0);\\n }\\n return ebool.wrap(Impl.ge(euint32.unwrap(a), euint32.unwrap(asEuint32(b)), false));\\n }\\n\\n // Evaluate gt(a, b) and return the result.\\n function gt(euint32 a, euint8 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint32(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint8(0);\\n }\\n return ebool.wrap(Impl.gt(euint32.unwrap(a), euint32.unwrap(asEuint32(b)), false));\\n }\\n\\n // Evaluate le(a, b) and return the result.\\n function le(euint32 a, euint8 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint32(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint8(0);\\n }\\n return ebool.wrap(Impl.le(euint32.unwrap(a), euint32.unwrap(asEuint32(b)), false));\\n }\\n\\n // Evaluate lt(a, b) and return the result.\\n function lt(euint32 a, euint8 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint32(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint8(0);\\n }\\n return ebool.wrap(Impl.lt(euint32.unwrap(a), euint32.unwrap(asEuint32(b)), false));\\n }\\n\\n // Evaluate min(a, b) and return the result.\\n function min(euint32 a, euint8 b) internal returns (euint32) {\\n if (!isInitialized(a)) {\\n a = asEuint32(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint8(0);\\n }\\n return euint32.wrap(Impl.min(euint32.unwrap(a), euint32.unwrap(asEuint32(b)), false));\\n }\\n\\n // Evaluate max(a, b) and return the result.\\n function max(euint32 a, euint8 b) internal returns (euint32) {\\n if (!isInitialized(a)) {\\n a = asEuint32(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint8(0);\\n }\\n return euint32.wrap(Impl.max(euint32.unwrap(a), euint32.unwrap(asEuint32(b)), false));\\n }\\n\\n // Evaluate add(a, b) and return the result.\\n function add(euint32 a, euint16 b) internal returns (euint32) {\\n if (!isInitialized(a)) {\\n a = asEuint32(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint16(0);\\n }\\n return euint32.wrap(Impl.add(euint32.unwrap(a), euint32.unwrap(asEuint32(b)), false));\\n }\\n\\n // Evaluate sub(a, b) and return the result.\\n function sub(euint32 a, euint16 b) internal returns (euint32) {\\n if (!isInitialized(a)) {\\n a = asEuint32(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint16(0);\\n }\\n return euint32.wrap(Impl.sub(euint32.unwrap(a), euint32.unwrap(asEuint32(b)), false));\\n }\\n\\n // Evaluate mul(a, b) and return the result.\\n function mul(euint32 a, euint16 b) internal returns (euint32) {\\n if (!isInitialized(a)) {\\n a = asEuint32(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint16(0);\\n }\\n return euint32.wrap(Impl.mul(euint32.unwrap(a), euint32.unwrap(asEuint32(b)), false));\\n }\\n\\n // Evaluate and(a, b) and return the result.\\n function and(euint32 a, euint16 b) internal returns (euint32) {\\n if (!isInitialized(a)) {\\n a = asEuint32(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint16(0);\\n }\\n return euint32.wrap(Impl.and(euint32.unwrap(a), euint32.unwrap(asEuint32(b))));\\n }\\n\\n // Evaluate or(a, b) and return the result.\\n function or(euint32 a, euint16 b) internal returns (euint32) {\\n if (!isInitialized(a)) {\\n a = asEuint32(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint16(0);\\n }\\n return euint32.wrap(Impl.or(euint32.unwrap(a), euint32.unwrap(asEuint32(b))));\\n }\\n\\n // Evaluate xor(a, b) and return the result.\\n function xor(euint32 a, euint16 b) internal returns (euint32) {\\n if (!isInitialized(a)) {\\n a = asEuint32(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint16(0);\\n }\\n return euint32.wrap(Impl.xor(euint32.unwrap(a), euint32.unwrap(asEuint32(b))));\\n }\\n\\n // Evaluate eq(a, b) and return the result.\\n function eq(euint32 a, euint16 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint32(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint16(0);\\n }\\n return ebool.wrap(Impl.eq(euint32.unwrap(a), euint32.unwrap(asEuint32(b)), false));\\n }\\n\\n // Evaluate ne(a, b) and return the result.\\n function ne(euint32 a, euint16 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint32(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint16(0);\\n }\\n return ebool.wrap(Impl.ne(euint32.unwrap(a), euint32.unwrap(asEuint32(b)), false));\\n }\\n\\n // Evaluate ge(a, b) and return the result.\\n function ge(euint32 a, euint16 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint32(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint16(0);\\n }\\n return ebool.wrap(Impl.ge(euint32.unwrap(a), euint32.unwrap(asEuint32(b)), false));\\n }\\n\\n // Evaluate gt(a, b) and return the result.\\n function gt(euint32 a, euint16 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint32(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint16(0);\\n }\\n return ebool.wrap(Impl.gt(euint32.unwrap(a), euint32.unwrap(asEuint32(b)), false));\\n }\\n\\n // Evaluate le(a, b) and return the result.\\n function le(euint32 a, euint16 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint32(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint16(0);\\n }\\n return ebool.wrap(Impl.le(euint32.unwrap(a), euint32.unwrap(asEuint32(b)), false));\\n }\\n\\n // Evaluate lt(a, b) and return the result.\\n function lt(euint32 a, euint16 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint32(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint16(0);\\n }\\n return ebool.wrap(Impl.lt(euint32.unwrap(a), euint32.unwrap(asEuint32(b)), false));\\n }\\n\\n // Evaluate min(a, b) and return the result.\\n function min(euint32 a, euint16 b) internal returns (euint32) {\\n if (!isInitialized(a)) {\\n a = asEuint32(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint16(0);\\n }\\n return euint32.wrap(Impl.min(euint32.unwrap(a), euint32.unwrap(asEuint32(b)), false));\\n }\\n\\n // Evaluate max(a, b) and return the result.\\n function max(euint32 a, euint16 b) internal returns (euint32) {\\n if (!isInitialized(a)) {\\n a = asEuint32(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint16(0);\\n }\\n return euint32.wrap(Impl.max(euint32.unwrap(a), euint32.unwrap(asEuint32(b)), false));\\n }\\n\\n // Evaluate add(a, b) and return the result.\\n function add(euint32 a, euint32 b) internal returns (euint32) {\\n if (!isInitialized(a)) {\\n a = asEuint32(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint32(0);\\n }\\n return euint32.wrap(Impl.add(euint32.unwrap(a), euint32.unwrap(b), false));\\n }\\n\\n // Evaluate sub(a, b) and return the result.\\n function sub(euint32 a, euint32 b) internal returns (euint32) {\\n if (!isInitialized(a)) {\\n a = asEuint32(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint32(0);\\n }\\n return euint32.wrap(Impl.sub(euint32.unwrap(a), euint32.unwrap(b), false));\\n }\\n\\n // Evaluate mul(a, b) and return the result.\\n function mul(euint32 a, euint32 b) internal returns (euint32) {\\n if (!isInitialized(a)) {\\n a = asEuint32(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint32(0);\\n }\\n return euint32.wrap(Impl.mul(euint32.unwrap(a), euint32.unwrap(b), false));\\n }\\n\\n // Evaluate and(a, b) and return the result.\\n function and(euint32 a, euint32 b) internal returns (euint32) {\\n if (!isInitialized(a)) {\\n a = asEuint32(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint32(0);\\n }\\n return euint32.wrap(Impl.and(euint32.unwrap(a), euint32.unwrap(b)));\\n }\\n\\n // Evaluate or(a, b) and return the result.\\n function or(euint32 a, euint32 b) internal returns (euint32) {\\n if (!isInitialized(a)) {\\n a = asEuint32(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint32(0);\\n }\\n return euint32.wrap(Impl.or(euint32.unwrap(a), euint32.unwrap(b)));\\n }\\n\\n // Evaluate xor(a, b) and return the result.\\n function xor(euint32 a, euint32 b) internal returns (euint32) {\\n if (!isInitialized(a)) {\\n a = asEuint32(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint32(0);\\n }\\n return euint32.wrap(Impl.xor(euint32.unwrap(a), euint32.unwrap(b)));\\n }\\n\\n // Evaluate eq(a, b) and return the result.\\n function eq(euint32 a, euint32 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint32(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint32(0);\\n }\\n return ebool.wrap(Impl.eq(euint32.unwrap(a), euint32.unwrap(b), false));\\n }\\n\\n // Evaluate ne(a, b) and return the result.\\n function ne(euint32 a, euint32 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint32(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint32(0);\\n }\\n return ebool.wrap(Impl.ne(euint32.unwrap(a), euint32.unwrap(b), false));\\n }\\n\\n // Evaluate ge(a, b) and return the result.\\n function ge(euint32 a, euint32 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint32(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint32(0);\\n }\\n return ebool.wrap(Impl.ge(euint32.unwrap(a), euint32.unwrap(b), false));\\n }\\n\\n // Evaluate gt(a, b) and return the result.\\n function gt(euint32 a, euint32 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint32(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint32(0);\\n }\\n return ebool.wrap(Impl.gt(euint32.unwrap(a), euint32.unwrap(b), false));\\n }\\n\\n // Evaluate le(a, b) and return the result.\\n function le(euint32 a, euint32 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint32(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint32(0);\\n }\\n return ebool.wrap(Impl.le(euint32.unwrap(a), euint32.unwrap(b), false));\\n }\\n\\n // Evaluate lt(a, b) and return the result.\\n function lt(euint32 a, euint32 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint32(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint32(0);\\n }\\n return ebool.wrap(Impl.lt(euint32.unwrap(a), euint32.unwrap(b), false));\\n }\\n\\n // Evaluate min(a, b) and return the result.\\n function min(euint32 a, euint32 b) internal returns (euint32) {\\n if (!isInitialized(a)) {\\n a = asEuint32(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint32(0);\\n }\\n return euint32.wrap(Impl.min(euint32.unwrap(a), euint32.unwrap(b), false));\\n }\\n\\n // Evaluate max(a, b) and return the result.\\n function max(euint32 a, euint32 b) internal returns (euint32) {\\n if (!isInitialized(a)) {\\n a = asEuint32(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint32(0);\\n }\\n return euint32.wrap(Impl.max(euint32.unwrap(a), euint32.unwrap(b), false));\\n }\\n\\n // Evaluate add(a, b) and return the result.\\n function add(euint32 a, euint64 b) internal returns (euint64) {\\n if (!isInitialized(a)) {\\n a = asEuint32(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint64(0);\\n }\\n return euint64.wrap(Impl.add(euint64.unwrap(asEuint64(a)), euint64.unwrap(b), false));\\n }\\n\\n // Evaluate sub(a, b) and return the result.\\n function sub(euint32 a, euint64 b) internal returns (euint64) {\\n if (!isInitialized(a)) {\\n a = asEuint32(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint64(0);\\n }\\n return euint64.wrap(Impl.sub(euint64.unwrap(asEuint64(a)), euint64.unwrap(b), false));\\n }\\n\\n // Evaluate mul(a, b) and return the result.\\n function mul(euint32 a, euint64 b) internal returns (euint64) {\\n if (!isInitialized(a)) {\\n a = asEuint32(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint64(0);\\n }\\n return euint64.wrap(Impl.mul(euint64.unwrap(asEuint64(a)), euint64.unwrap(b), false));\\n }\\n\\n // Evaluate and(a, b) and return the result.\\n function and(euint32 a, euint64 b) internal returns (euint64) {\\n if (!isInitialized(a)) {\\n a = asEuint32(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint64(0);\\n }\\n return euint64.wrap(Impl.and(euint64.unwrap(asEuint64(a)), euint64.unwrap(b)));\\n }\\n\\n // Evaluate or(a, b) and return the result.\\n function or(euint32 a, euint64 b) internal returns (euint64) {\\n if (!isInitialized(a)) {\\n a = asEuint32(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint64(0);\\n }\\n return euint64.wrap(Impl.or(euint64.unwrap(asEuint64(a)), euint64.unwrap(b)));\\n }\\n\\n // Evaluate xor(a, b) and return the result.\\n function xor(euint32 a, euint64 b) internal returns (euint64) {\\n if (!isInitialized(a)) {\\n a = asEuint32(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint64(0);\\n }\\n return euint64.wrap(Impl.xor(euint64.unwrap(asEuint64(a)), euint64.unwrap(b)));\\n }\\n\\n // Evaluate eq(a, b) and return the result.\\n function eq(euint32 a, euint64 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint32(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint64(0);\\n }\\n return ebool.wrap(Impl.eq(euint64.unwrap(asEuint64(a)), euint64.unwrap(b), false));\\n }\\n\\n // Evaluate ne(a, b) and return the result.\\n function ne(euint32 a, euint64 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint32(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint64(0);\\n }\\n return ebool.wrap(Impl.ne(euint64.unwrap(asEuint64(a)), euint64.unwrap(b), false));\\n }\\n\\n // Evaluate ge(a, b) and return the result.\\n function ge(euint32 a, euint64 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint32(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint64(0);\\n }\\n return ebool.wrap(Impl.ge(euint64.unwrap(asEuint64(a)), euint64.unwrap(b), false));\\n }\\n\\n // Evaluate gt(a, b) and return the result.\\n function gt(euint32 a, euint64 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint32(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint64(0);\\n }\\n return ebool.wrap(Impl.gt(euint64.unwrap(asEuint64(a)), euint64.unwrap(b), false));\\n }\\n\\n // Evaluate le(a, b) and return the result.\\n function le(euint32 a, euint64 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint32(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint64(0);\\n }\\n return ebool.wrap(Impl.le(euint64.unwrap(asEuint64(a)), euint64.unwrap(b), false));\\n }\\n\\n // Evaluate lt(a, b) and return the result.\\n function lt(euint32 a, euint64 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint32(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint64(0);\\n }\\n return ebool.wrap(Impl.lt(euint64.unwrap(asEuint64(a)), euint64.unwrap(b), false));\\n }\\n\\n // Evaluate min(a, b) and return the result.\\n function min(euint32 a, euint64 b) internal returns (euint64) {\\n if (!isInitialized(a)) {\\n a = asEuint32(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint64(0);\\n }\\n return euint64.wrap(Impl.min(euint64.unwrap(asEuint64(a)), euint64.unwrap(b), false));\\n }\\n\\n // Evaluate max(a, b) and return the result.\\n function max(euint32 a, euint64 b) internal returns (euint64) {\\n if (!isInitialized(a)) {\\n a = asEuint32(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint64(0);\\n }\\n return euint64.wrap(Impl.max(euint64.unwrap(asEuint64(a)), euint64.unwrap(b), false));\\n }\\n\\n // Evaluate add(a, b) and return the result.\\n function add(euint32 a, uint32 b) internal returns (euint32) {\\n if (!isInitialized(a)) {\\n a = asEuint32(0);\\n }\\n return euint32.wrap(Impl.add(euint32.unwrap(a), uint256(b), true));\\n }\\n\\n // Evaluate add(a, b) and return the result.\\n function add(uint32 a, euint32 b) internal returns (euint32) {\\n if (!isInitialized(b)) {\\n b = asEuint32(0);\\n }\\n return euint32.wrap(Impl.add(euint32.unwrap(b), uint256(a), true));\\n }\\n\\n // Evaluate sub(a, b) and return the result.\\n function sub(euint32 a, uint32 b) internal returns (euint32) {\\n if (!isInitialized(a)) {\\n a = asEuint32(0);\\n }\\n return euint32.wrap(Impl.sub(euint32.unwrap(a), uint256(b), true));\\n }\\n\\n // Evaluate sub(a, b) and return the result.\\n function sub(uint32 a, euint32 b) internal returns (euint32) {\\n euint32 aEnc = asEuint32(a);\\n if (!isInitialized(b)) {\\n b = asEuint32(0);\\n }\\n return euint32.wrap(Impl.sub(euint32.unwrap(aEnc), euint32.unwrap(b), false));\\n }\\n\\n // Evaluate mul(a, b) and return the result.\\n function mul(euint32 a, uint32 b) internal returns (euint32) {\\n if (!isInitialized(a)) {\\n a = asEuint32(0);\\n }\\n return euint32.wrap(Impl.mul(euint32.unwrap(a), uint256(b), true));\\n }\\n\\n // Evaluate mul(a, b) and return the result.\\n function mul(uint32 a, euint32 b) internal returns (euint32) {\\n if (!isInitialized(b)) {\\n b = asEuint32(0);\\n }\\n return euint32.wrap(Impl.mul(euint32.unwrap(b), uint256(a), true));\\n }\\n\\n // Evaluate div(a, b) and return the result.\\n function div(euint32 a, uint32 b) internal returns (euint32) {\\n if (!isInitialized(a)) {\\n a = asEuint32(0);\\n }\\n return euint32.wrap(Impl.div(euint32.unwrap(a), uint256(b)));\\n }\\n\\n // Evaluate rem(a, b) and return the result.\\n function rem(euint32 a, uint32 b) internal returns (euint32) {\\n if (!isInitialized(a)) {\\n a = asEuint32(0);\\n }\\n return euint32.wrap(Impl.rem(euint32.unwrap(a), uint256(b)));\\n }\\n\\n // Evaluate eq(a, b) and return the result.\\n function eq(euint32 a, uint32 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint32(0);\\n }\\n return ebool.wrap(Impl.eq(euint32.unwrap(a), uint256(b), true));\\n }\\n\\n // Evaluate eq(a, b) and return the result.\\n function eq(uint32 a, euint32 b) internal returns (ebool) {\\n if (!isInitialized(b)) {\\n b = asEuint32(0);\\n }\\n return ebool.wrap(Impl.eq(euint32.unwrap(b), uint256(a), true));\\n }\\n\\n // Evaluate ne(a, b) and return the result.\\n function ne(euint32 a, uint32 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint32(0);\\n }\\n return ebool.wrap(Impl.ne(euint32.unwrap(a), uint256(b), true));\\n }\\n\\n // Evaluate ne(a, b) and return the result.\\n function ne(uint32 a, euint32 b) internal returns (ebool) {\\n if (!isInitialized(b)) {\\n b = asEuint32(0);\\n }\\n return ebool.wrap(Impl.ne(euint32.unwrap(b), uint256(a), true));\\n }\\n\\n // Evaluate ge(a, b) and return the result.\\n function ge(euint32 a, uint32 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint32(0);\\n }\\n return ebool.wrap(Impl.ge(euint32.unwrap(a), uint256(b), true));\\n }\\n\\n // Evaluate ge(a, b) and return the result.\\n function ge(uint32 a, euint32 b) internal returns (ebool) {\\n if (!isInitialized(b)) {\\n b = asEuint32(0);\\n }\\n return ebool.wrap(Impl.le(euint32.unwrap(b), uint256(a), true));\\n }\\n\\n // Evaluate gt(a, b) and return the result.\\n function gt(euint32 a, uint32 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint32(0);\\n }\\n return ebool.wrap(Impl.gt(euint32.unwrap(a), uint256(b), true));\\n }\\n\\n // Evaluate gt(a, b) and return the result.\\n function gt(uint32 a, euint32 b) internal returns (ebool) {\\n if (!isInitialized(b)) {\\n b = asEuint32(0);\\n }\\n return ebool.wrap(Impl.lt(euint32.unwrap(b), uint256(a), true));\\n }\\n\\n // Evaluate le(a, b) and return the result.\\n function le(euint32 a, uint32 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint32(0);\\n }\\n return ebool.wrap(Impl.le(euint32.unwrap(a), uint256(b), true));\\n }\\n\\n // Evaluate le(a, b) and return the result.\\n function le(uint32 a, euint32 b) internal returns (ebool) {\\n if (!isInitialized(b)) {\\n b = asEuint32(0);\\n }\\n return ebool.wrap(Impl.ge(euint32.unwrap(b), uint256(a), true));\\n }\\n\\n // Evaluate lt(a, b) and return the result.\\n function lt(euint32 a, uint32 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint32(0);\\n }\\n return ebool.wrap(Impl.lt(euint32.unwrap(a), uint256(b), true));\\n }\\n\\n // Evaluate lt(a, b) and return the result.\\n function lt(uint32 a, euint32 b) internal returns (ebool) {\\n if (!isInitialized(b)) {\\n b = asEuint32(0);\\n }\\n return ebool.wrap(Impl.gt(euint32.unwrap(b), uint256(a), true));\\n }\\n\\n // Evaluate min(a, b) and return the result.\\n function min(euint32 a, uint32 b) internal returns (euint32) {\\n if (!isInitialized(a)) {\\n a = asEuint32(0);\\n }\\n return euint32.wrap(Impl.min(euint32.unwrap(a), uint256(b), true));\\n }\\n\\n // Evaluate min(a, b) and return the result.\\n function min(uint32 a, euint32 b) internal returns (euint32) {\\n if (!isInitialized(b)) {\\n b = asEuint32(0);\\n }\\n return euint32.wrap(Impl.min(euint32.unwrap(b), uint256(a), true));\\n }\\n\\n // Evaluate max(a, b) and return the result.\\n function max(euint32 a, uint32 b) internal returns (euint32) {\\n if (!isInitialized(a)) {\\n a = asEuint32(0);\\n }\\n return euint32.wrap(Impl.max(euint32.unwrap(a), uint256(b), true));\\n }\\n\\n // Evaluate max(a, b) and return the result.\\n function max(uint32 a, euint32 b) internal returns (euint32) {\\n if (!isInitialized(b)) {\\n b = asEuint32(0);\\n }\\n return euint32.wrap(Impl.max(euint32.unwrap(b), uint256(a), true));\\n }\\n\\n // Evaluate add(a, b) and return the result.\\n function add(euint64 a, euint4 b) internal returns (euint64) {\\n if (!isInitialized(a)) {\\n a = asEuint64(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint4(0);\\n }\\n return euint64.wrap(Impl.add(euint64.unwrap(a), euint64.unwrap(asEuint64(b)), false));\\n }\\n\\n // Evaluate sub(a, b) and return the result.\\n function sub(euint64 a, euint4 b) internal returns (euint64) {\\n if (!isInitialized(a)) {\\n a = asEuint64(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint4(0);\\n }\\n return euint64.wrap(Impl.sub(euint64.unwrap(a), euint64.unwrap(asEuint64(b)), false));\\n }\\n\\n // Evaluate mul(a, b) and return the result.\\n function mul(euint64 a, euint4 b) internal returns (euint64) {\\n if (!isInitialized(a)) {\\n a = asEuint64(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint4(0);\\n }\\n return euint64.wrap(Impl.mul(euint64.unwrap(a), euint64.unwrap(asEuint64(b)), false));\\n }\\n\\n // Evaluate and(a, b) and return the result.\\n function and(euint64 a, euint4 b) internal returns (euint64) {\\n if (!isInitialized(a)) {\\n a = asEuint64(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint4(0);\\n }\\n return euint64.wrap(Impl.and(euint64.unwrap(a), euint64.unwrap(asEuint64(b))));\\n }\\n\\n // Evaluate or(a, b) and return the result.\\n function or(euint64 a, euint4 b) internal returns (euint64) {\\n if (!isInitialized(a)) {\\n a = asEuint64(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint4(0);\\n }\\n return euint64.wrap(Impl.or(euint64.unwrap(a), euint64.unwrap(asEuint64(b))));\\n }\\n\\n // Evaluate xor(a, b) and return the result.\\n function xor(euint64 a, euint4 b) internal returns (euint64) {\\n if (!isInitialized(a)) {\\n a = asEuint64(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint4(0);\\n }\\n return euint64.wrap(Impl.xor(euint64.unwrap(a), euint64.unwrap(asEuint64(b))));\\n }\\n\\n // Evaluate eq(a, b) and return the result.\\n function eq(euint64 a, euint4 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint64(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint4(0);\\n }\\n return ebool.wrap(Impl.eq(euint64.unwrap(a), euint64.unwrap(asEuint64(b)), false));\\n }\\n\\n // Evaluate ne(a, b) and return the result.\\n function ne(euint64 a, euint4 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint64(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint4(0);\\n }\\n return ebool.wrap(Impl.ne(euint64.unwrap(a), euint64.unwrap(asEuint64(b)), false));\\n }\\n\\n // Evaluate ge(a, b) and return the result.\\n function ge(euint64 a, euint4 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint64(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint4(0);\\n }\\n return ebool.wrap(Impl.ge(euint64.unwrap(a), euint64.unwrap(asEuint64(b)), false));\\n }\\n\\n // Evaluate gt(a, b) and return the result.\\n function gt(euint64 a, euint4 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint64(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint4(0);\\n }\\n return ebool.wrap(Impl.gt(euint64.unwrap(a), euint64.unwrap(asEuint64(b)), false));\\n }\\n\\n // Evaluate le(a, b) and return the result.\\n function le(euint64 a, euint4 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint64(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint4(0);\\n }\\n return ebool.wrap(Impl.le(euint64.unwrap(a), euint64.unwrap(asEuint64(b)), false));\\n }\\n\\n // Evaluate lt(a, b) and return the result.\\n function lt(euint64 a, euint4 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint64(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint4(0);\\n }\\n return ebool.wrap(Impl.lt(euint64.unwrap(a), euint64.unwrap(asEuint64(b)), false));\\n }\\n\\n // Evaluate min(a, b) and return the result.\\n function min(euint64 a, euint4 b) internal returns (euint64) {\\n if (!isInitialized(a)) {\\n a = asEuint64(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint4(0);\\n }\\n return euint64.wrap(Impl.min(euint64.unwrap(a), euint64.unwrap(asEuint64(b)), false));\\n }\\n\\n // Evaluate max(a, b) and return the result.\\n function max(euint64 a, euint4 b) internal returns (euint64) {\\n if (!isInitialized(a)) {\\n a = asEuint64(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint4(0);\\n }\\n return euint64.wrap(Impl.max(euint64.unwrap(a), euint64.unwrap(asEuint64(b)), false));\\n }\\n\\n // Evaluate add(a, b) and return the result.\\n function add(euint64 a, euint8 b) internal returns (euint64) {\\n if (!isInitialized(a)) {\\n a = asEuint64(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint8(0);\\n }\\n return euint64.wrap(Impl.add(euint64.unwrap(a), euint64.unwrap(asEuint64(b)), false));\\n }\\n\\n // Evaluate sub(a, b) and return the result.\\n function sub(euint64 a, euint8 b) internal returns (euint64) {\\n if (!isInitialized(a)) {\\n a = asEuint64(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint8(0);\\n }\\n return euint64.wrap(Impl.sub(euint64.unwrap(a), euint64.unwrap(asEuint64(b)), false));\\n }\\n\\n // Evaluate mul(a, b) and return the result.\\n function mul(euint64 a, euint8 b) internal returns (euint64) {\\n if (!isInitialized(a)) {\\n a = asEuint64(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint8(0);\\n }\\n return euint64.wrap(Impl.mul(euint64.unwrap(a), euint64.unwrap(asEuint64(b)), false));\\n }\\n\\n // Evaluate and(a, b) and return the result.\\n function and(euint64 a, euint8 b) internal returns (euint64) {\\n if (!isInitialized(a)) {\\n a = asEuint64(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint8(0);\\n }\\n return euint64.wrap(Impl.and(euint64.unwrap(a), euint64.unwrap(asEuint64(b))));\\n }\\n\\n // Evaluate or(a, b) and return the result.\\n function or(euint64 a, euint8 b) internal returns (euint64) {\\n if (!isInitialized(a)) {\\n a = asEuint64(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint8(0);\\n }\\n return euint64.wrap(Impl.or(euint64.unwrap(a), euint64.unwrap(asEuint64(b))));\\n }\\n\\n // Evaluate xor(a, b) and return the result.\\n function xor(euint64 a, euint8 b) internal returns (euint64) {\\n if (!isInitialized(a)) {\\n a = asEuint64(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint8(0);\\n }\\n return euint64.wrap(Impl.xor(euint64.unwrap(a), euint64.unwrap(asEuint64(b))));\\n }\\n\\n // Evaluate eq(a, b) and return the result.\\n function eq(euint64 a, euint8 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint64(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint8(0);\\n }\\n return ebool.wrap(Impl.eq(euint64.unwrap(a), euint64.unwrap(asEuint64(b)), false));\\n }\\n\\n // Evaluate ne(a, b) and return the result.\\n function ne(euint64 a, euint8 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint64(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint8(0);\\n }\\n return ebool.wrap(Impl.ne(euint64.unwrap(a), euint64.unwrap(asEuint64(b)), false));\\n }\\n\\n // Evaluate ge(a, b) and return the result.\\n function ge(euint64 a, euint8 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint64(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint8(0);\\n }\\n return ebool.wrap(Impl.ge(euint64.unwrap(a), euint64.unwrap(asEuint64(b)), false));\\n }\\n\\n // Evaluate gt(a, b) and return the result.\\n function gt(euint64 a, euint8 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint64(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint8(0);\\n }\\n return ebool.wrap(Impl.gt(euint64.unwrap(a), euint64.unwrap(asEuint64(b)), false));\\n }\\n\\n // Evaluate le(a, b) and return the result.\\n function le(euint64 a, euint8 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint64(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint8(0);\\n }\\n return ebool.wrap(Impl.le(euint64.unwrap(a), euint64.unwrap(asEuint64(b)), false));\\n }\\n\\n // Evaluate lt(a, b) and return the result.\\n function lt(euint64 a, euint8 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint64(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint8(0);\\n }\\n return ebool.wrap(Impl.lt(euint64.unwrap(a), euint64.unwrap(asEuint64(b)), false));\\n }\\n\\n // Evaluate min(a, b) and return the result.\\n function min(euint64 a, euint8 b) internal returns (euint64) {\\n if (!isInitialized(a)) {\\n a = asEuint64(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint8(0);\\n }\\n return euint64.wrap(Impl.min(euint64.unwrap(a), euint64.unwrap(asEuint64(b)), false));\\n }\\n\\n // Evaluate max(a, b) and return the result.\\n function max(euint64 a, euint8 b) internal returns (euint64) {\\n if (!isInitialized(a)) {\\n a = asEuint64(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint8(0);\\n }\\n return euint64.wrap(Impl.max(euint64.unwrap(a), euint64.unwrap(asEuint64(b)), false));\\n }\\n\\n // Evaluate add(a, b) and return the result.\\n function add(euint64 a, euint16 b) internal returns (euint64) {\\n if (!isInitialized(a)) {\\n a = asEuint64(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint16(0);\\n }\\n return euint64.wrap(Impl.add(euint64.unwrap(a), euint64.unwrap(asEuint64(b)), false));\\n }\\n\\n // Evaluate sub(a, b) and return the result.\\n function sub(euint64 a, euint16 b) internal returns (euint64) {\\n if (!isInitialized(a)) {\\n a = asEuint64(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint16(0);\\n }\\n return euint64.wrap(Impl.sub(euint64.unwrap(a), euint64.unwrap(asEuint64(b)), false));\\n }\\n\\n // Evaluate mul(a, b) and return the result.\\n function mul(euint64 a, euint16 b) internal returns (euint64) {\\n if (!isInitialized(a)) {\\n a = asEuint64(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint16(0);\\n }\\n return euint64.wrap(Impl.mul(euint64.unwrap(a), euint64.unwrap(asEuint64(b)), false));\\n }\\n\\n // Evaluate and(a, b) and return the result.\\n function and(euint64 a, euint16 b) internal returns (euint64) {\\n if (!isInitialized(a)) {\\n a = asEuint64(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint16(0);\\n }\\n return euint64.wrap(Impl.and(euint64.unwrap(a), euint64.unwrap(asEuint64(b))));\\n }\\n\\n // Evaluate or(a, b) and return the result.\\n function or(euint64 a, euint16 b) internal returns (euint64) {\\n if (!isInitialized(a)) {\\n a = asEuint64(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint16(0);\\n }\\n return euint64.wrap(Impl.or(euint64.unwrap(a), euint64.unwrap(asEuint64(b))));\\n }\\n\\n // Evaluate xor(a, b) and return the result.\\n function xor(euint64 a, euint16 b) internal returns (euint64) {\\n if (!isInitialized(a)) {\\n a = asEuint64(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint16(0);\\n }\\n return euint64.wrap(Impl.xor(euint64.unwrap(a), euint64.unwrap(asEuint64(b))));\\n }\\n\\n // Evaluate eq(a, b) and return the result.\\n function eq(euint64 a, euint16 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint64(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint16(0);\\n }\\n return ebool.wrap(Impl.eq(euint64.unwrap(a), euint64.unwrap(asEuint64(b)), false));\\n }\\n\\n // Evaluate ne(a, b) and return the result.\\n function ne(euint64 a, euint16 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint64(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint16(0);\\n }\\n return ebool.wrap(Impl.ne(euint64.unwrap(a), euint64.unwrap(asEuint64(b)), false));\\n }\\n\\n // Evaluate ge(a, b) and return the result.\\n function ge(euint64 a, euint16 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint64(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint16(0);\\n }\\n return ebool.wrap(Impl.ge(euint64.unwrap(a), euint64.unwrap(asEuint64(b)), false));\\n }\\n\\n // Evaluate gt(a, b) and return the result.\\n function gt(euint64 a, euint16 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint64(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint16(0);\\n }\\n return ebool.wrap(Impl.gt(euint64.unwrap(a), euint64.unwrap(asEuint64(b)), false));\\n }\\n\\n // Evaluate le(a, b) and return the result.\\n function le(euint64 a, euint16 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint64(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint16(0);\\n }\\n return ebool.wrap(Impl.le(euint64.unwrap(a), euint64.unwrap(asEuint64(b)), false));\\n }\\n\\n // Evaluate lt(a, b) and return the result.\\n function lt(euint64 a, euint16 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint64(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint16(0);\\n }\\n return ebool.wrap(Impl.lt(euint64.unwrap(a), euint64.unwrap(asEuint64(b)), false));\\n }\\n\\n // Evaluate min(a, b) and return the result.\\n function min(euint64 a, euint16 b) internal returns (euint64) {\\n if (!isInitialized(a)) {\\n a = asEuint64(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint16(0);\\n }\\n return euint64.wrap(Impl.min(euint64.unwrap(a), euint64.unwrap(asEuint64(b)), false));\\n }\\n\\n // Evaluate max(a, b) and return the result.\\n function max(euint64 a, euint16 b) internal returns (euint64) {\\n if (!isInitialized(a)) {\\n a = asEuint64(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint16(0);\\n }\\n return euint64.wrap(Impl.max(euint64.unwrap(a), euint64.unwrap(asEuint64(b)), false));\\n }\\n\\n // Evaluate add(a, b) and return the result.\\n function add(euint64 a, euint32 b) internal returns (euint64) {\\n if (!isInitialized(a)) {\\n a = asEuint64(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint32(0);\\n }\\n return euint64.wrap(Impl.add(euint64.unwrap(a), euint64.unwrap(asEuint64(b)), false));\\n }\\n\\n // Evaluate sub(a, b) and return the result.\\n function sub(euint64 a, euint32 b) internal returns (euint64) {\\n if (!isInitialized(a)) {\\n a = asEuint64(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint32(0);\\n }\\n return euint64.wrap(Impl.sub(euint64.unwrap(a), euint64.unwrap(asEuint64(b)), false));\\n }\\n\\n // Evaluate mul(a, b) and return the result.\\n function mul(euint64 a, euint32 b) internal returns (euint64) {\\n if (!isInitialized(a)) {\\n a = asEuint64(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint32(0);\\n }\\n return euint64.wrap(Impl.mul(euint64.unwrap(a), euint64.unwrap(asEuint64(b)), false));\\n }\\n\\n // Evaluate and(a, b) and return the result.\\n function and(euint64 a, euint32 b) internal returns (euint64) {\\n if (!isInitialized(a)) {\\n a = asEuint64(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint32(0);\\n }\\n return euint64.wrap(Impl.and(euint64.unwrap(a), euint64.unwrap(asEuint64(b))));\\n }\\n\\n // Evaluate or(a, b) and return the result.\\n function or(euint64 a, euint32 b) internal returns (euint64) {\\n if (!isInitialized(a)) {\\n a = asEuint64(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint32(0);\\n }\\n return euint64.wrap(Impl.or(euint64.unwrap(a), euint64.unwrap(asEuint64(b))));\\n }\\n\\n // Evaluate xor(a, b) and return the result.\\n function xor(euint64 a, euint32 b) internal returns (euint64) {\\n if (!isInitialized(a)) {\\n a = asEuint64(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint32(0);\\n }\\n return euint64.wrap(Impl.xor(euint64.unwrap(a), euint64.unwrap(asEuint64(b))));\\n }\\n\\n // Evaluate eq(a, b) and return the result.\\n function eq(euint64 a, euint32 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint64(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint32(0);\\n }\\n return ebool.wrap(Impl.eq(euint64.unwrap(a), euint64.unwrap(asEuint64(b)), false));\\n }\\n\\n // Evaluate ne(a, b) and return the result.\\n function ne(euint64 a, euint32 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint64(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint32(0);\\n }\\n return ebool.wrap(Impl.ne(euint64.unwrap(a), euint64.unwrap(asEuint64(b)), false));\\n }\\n\\n // Evaluate ge(a, b) and return the result.\\n function ge(euint64 a, euint32 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint64(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint32(0);\\n }\\n return ebool.wrap(Impl.ge(euint64.unwrap(a), euint64.unwrap(asEuint64(b)), false));\\n }\\n\\n // Evaluate gt(a, b) and return the result.\\n function gt(euint64 a, euint32 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint64(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint32(0);\\n }\\n return ebool.wrap(Impl.gt(euint64.unwrap(a), euint64.unwrap(asEuint64(b)), false));\\n }\\n\\n // Evaluate le(a, b) and return the result.\\n function le(euint64 a, euint32 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint64(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint32(0);\\n }\\n return ebool.wrap(Impl.le(euint64.unwrap(a), euint64.unwrap(asEuint64(b)), false));\\n }\\n\\n // Evaluate lt(a, b) and return the result.\\n function lt(euint64 a, euint32 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint64(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint32(0);\\n }\\n return ebool.wrap(Impl.lt(euint64.unwrap(a), euint64.unwrap(asEuint64(b)), false));\\n }\\n\\n // Evaluate min(a, b) and return the result.\\n function min(euint64 a, euint32 b) internal returns (euint64) {\\n if (!isInitialized(a)) {\\n a = asEuint64(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint32(0);\\n }\\n return euint64.wrap(Impl.min(euint64.unwrap(a), euint64.unwrap(asEuint64(b)), false));\\n }\\n\\n // Evaluate max(a, b) and return the result.\\n function max(euint64 a, euint32 b) internal returns (euint64) {\\n if (!isInitialized(a)) {\\n a = asEuint64(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint32(0);\\n }\\n return euint64.wrap(Impl.max(euint64.unwrap(a), euint64.unwrap(asEuint64(b)), false));\\n }\\n\\n // Evaluate add(a, b) and return the result.\\n function add(euint64 a, euint64 b) internal returns (euint64) {\\n if (!isInitialized(a)) {\\n a = asEuint64(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint64(0);\\n }\\n return euint64.wrap(Impl.add(euint64.unwrap(a), euint64.unwrap(b), false));\\n }\\n\\n // Evaluate sub(a, b) and return the result.\\n function sub(euint64 a, euint64 b) internal returns (euint64) {\\n if (!isInitialized(a)) {\\n a = asEuint64(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint64(0);\\n }\\n return euint64.wrap(Impl.sub(euint64.unwrap(a), euint64.unwrap(b), false));\\n }\\n\\n // Evaluate mul(a, b) and return the result.\\n function mul(euint64 a, euint64 b) internal returns (euint64) {\\n if (!isInitialized(a)) {\\n a = asEuint64(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint64(0);\\n }\\n return euint64.wrap(Impl.mul(euint64.unwrap(a), euint64.unwrap(b), false));\\n }\\n\\n // Evaluate and(a, b) and return the result.\\n function and(euint64 a, euint64 b) internal returns (euint64) {\\n if (!isInitialized(a)) {\\n a = asEuint64(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint64(0);\\n }\\n return euint64.wrap(Impl.and(euint64.unwrap(a), euint64.unwrap(b)));\\n }\\n\\n // Evaluate or(a, b) and return the result.\\n function or(euint64 a, euint64 b) internal returns (euint64) {\\n if (!isInitialized(a)) {\\n a = asEuint64(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint64(0);\\n }\\n return euint64.wrap(Impl.or(euint64.unwrap(a), euint64.unwrap(b)));\\n }\\n\\n // Evaluate xor(a, b) and return the result.\\n function xor(euint64 a, euint64 b) internal returns (euint64) {\\n if (!isInitialized(a)) {\\n a = asEuint64(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint64(0);\\n }\\n return euint64.wrap(Impl.xor(euint64.unwrap(a), euint64.unwrap(b)));\\n }\\n\\n // Evaluate eq(a, b) and return the result.\\n function eq(euint64 a, euint64 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint64(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint64(0);\\n }\\n return ebool.wrap(Impl.eq(euint64.unwrap(a), euint64.unwrap(b), false));\\n }\\n\\n // Evaluate ne(a, b) and return the result.\\n function ne(euint64 a, euint64 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint64(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint64(0);\\n }\\n return ebool.wrap(Impl.ne(euint64.unwrap(a), euint64.unwrap(b), false));\\n }\\n\\n // Evaluate ge(a, b) and return the result.\\n function ge(euint64 a, euint64 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint64(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint64(0);\\n }\\n return ebool.wrap(Impl.ge(euint64.unwrap(a), euint64.unwrap(b), false));\\n }\\n\\n // Evaluate gt(a, b) and return the result.\\n function gt(euint64 a, euint64 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint64(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint64(0);\\n }\\n return ebool.wrap(Impl.gt(euint64.unwrap(a), euint64.unwrap(b), false));\\n }\\n\\n // Evaluate le(a, b) and return the result.\\n function le(euint64 a, euint64 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint64(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint64(0);\\n }\\n return ebool.wrap(Impl.le(euint64.unwrap(a), euint64.unwrap(b), false));\\n }\\n\\n // Evaluate lt(a, b) and return the result.\\n function lt(euint64 a, euint64 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint64(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint64(0);\\n }\\n return ebool.wrap(Impl.lt(euint64.unwrap(a), euint64.unwrap(b), false));\\n }\\n\\n // Evaluate min(a, b) and return the result.\\n function min(euint64 a, euint64 b) internal returns (euint64) {\\n if (!isInitialized(a)) {\\n a = asEuint64(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint64(0);\\n }\\n return euint64.wrap(Impl.min(euint64.unwrap(a), euint64.unwrap(b), false));\\n }\\n\\n // Evaluate max(a, b) and return the result.\\n function max(euint64 a, euint64 b) internal returns (euint64) {\\n if (!isInitialized(a)) {\\n a = asEuint64(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint64(0);\\n }\\n return euint64.wrap(Impl.max(euint64.unwrap(a), euint64.unwrap(b), false));\\n }\\n\\n // Evaluate add(a, b) and return the result.\\n function add(euint64 a, uint64 b) internal returns (euint64) {\\n if (!isInitialized(a)) {\\n a = asEuint64(0);\\n }\\n return euint64.wrap(Impl.add(euint64.unwrap(a), uint256(b), true));\\n }\\n\\n // Evaluate add(a, b) and return the result.\\n function add(uint64 a, euint64 b) internal returns (euint64) {\\n if (!isInitialized(b)) {\\n b = asEuint64(0);\\n }\\n return euint64.wrap(Impl.add(euint64.unwrap(b), uint256(a), true));\\n }\\n\\n // Evaluate sub(a, b) and return the result.\\n function sub(euint64 a, uint64 b) internal returns (euint64) {\\n if (!isInitialized(a)) {\\n a = asEuint64(0);\\n }\\n return euint64.wrap(Impl.sub(euint64.unwrap(a), uint256(b), true));\\n }\\n\\n // Evaluate sub(a, b) and return the result.\\n function sub(uint64 a, euint64 b) internal returns (euint64) {\\n euint64 aEnc = asEuint64(a);\\n if (!isInitialized(b)) {\\n b = asEuint64(0);\\n }\\n return euint64.wrap(Impl.sub(euint64.unwrap(aEnc), euint64.unwrap(b), false));\\n }\\n\\n // Evaluate mul(a, b) and return the result.\\n function mul(euint64 a, uint64 b) internal returns (euint64) {\\n if (!isInitialized(a)) {\\n a = asEuint64(0);\\n }\\n return euint64.wrap(Impl.mul(euint64.unwrap(a), uint256(b), true));\\n }\\n\\n // Evaluate mul(a, b) and return the result.\\n function mul(uint64 a, euint64 b) internal returns (euint64) {\\n if (!isInitialized(b)) {\\n b = asEuint64(0);\\n }\\n return euint64.wrap(Impl.mul(euint64.unwrap(b), uint256(a), true));\\n }\\n\\n // Evaluate div(a, b) and return the result.\\n function div(euint64 a, uint64 b) internal returns (euint64) {\\n if (!isInitialized(a)) {\\n a = asEuint64(0);\\n }\\n return euint64.wrap(Impl.div(euint64.unwrap(a), uint256(b)));\\n }\\n\\n // Evaluate rem(a, b) and return the result.\\n function rem(euint64 a, uint64 b) internal returns (euint64) {\\n if (!isInitialized(a)) {\\n a = asEuint64(0);\\n }\\n return euint64.wrap(Impl.rem(euint64.unwrap(a), uint256(b)));\\n }\\n\\n // Evaluate eq(a, b) and return the result.\\n function eq(euint64 a, uint64 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint64(0);\\n }\\n return ebool.wrap(Impl.eq(euint64.unwrap(a), uint256(b), true));\\n }\\n\\n // Evaluate eq(a, b) and return the result.\\n function eq(uint64 a, euint64 b) internal returns (ebool) {\\n if (!isInitialized(b)) {\\n b = asEuint64(0);\\n }\\n return ebool.wrap(Impl.eq(euint64.unwrap(b), uint256(a), true));\\n }\\n\\n // Evaluate ne(a, b) and return the result.\\n function ne(euint64 a, uint64 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint64(0);\\n }\\n return ebool.wrap(Impl.ne(euint64.unwrap(a), uint256(b), true));\\n }\\n\\n // Evaluate ne(a, b) and return the result.\\n function ne(uint64 a, euint64 b) internal returns (ebool) {\\n if (!isInitialized(b)) {\\n b = asEuint64(0);\\n }\\n return ebool.wrap(Impl.ne(euint64.unwrap(b), uint256(a), true));\\n }\\n\\n // Evaluate ge(a, b) and return the result.\\n function ge(euint64 a, uint64 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint64(0);\\n }\\n return ebool.wrap(Impl.ge(euint64.unwrap(a), uint256(b), true));\\n }\\n\\n // Evaluate ge(a, b) and return the result.\\n function ge(uint64 a, euint64 b) internal returns (ebool) {\\n if (!isInitialized(b)) {\\n b = asEuint64(0);\\n }\\n return ebool.wrap(Impl.le(euint64.unwrap(b), uint256(a), true));\\n }\\n\\n // Evaluate gt(a, b) and return the result.\\n function gt(euint64 a, uint64 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint64(0);\\n }\\n return ebool.wrap(Impl.gt(euint64.unwrap(a), uint256(b), true));\\n }\\n\\n // Evaluate gt(a, b) and return the result.\\n function gt(uint64 a, euint64 b) internal returns (ebool) {\\n if (!isInitialized(b)) {\\n b = asEuint64(0);\\n }\\n return ebool.wrap(Impl.lt(euint64.unwrap(b), uint256(a), true));\\n }\\n\\n // Evaluate le(a, b) and return the result.\\n function le(euint64 a, uint64 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint64(0);\\n }\\n return ebool.wrap(Impl.le(euint64.unwrap(a), uint256(b), true));\\n }\\n\\n // Evaluate le(a, b) and return the result.\\n function le(uint64 a, euint64 b) internal returns (ebool) {\\n if (!isInitialized(b)) {\\n b = asEuint64(0);\\n }\\n return ebool.wrap(Impl.ge(euint64.unwrap(b), uint256(a), true));\\n }\\n\\n // Evaluate lt(a, b) and return the result.\\n function lt(euint64 a, uint64 b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEuint64(0);\\n }\\n return ebool.wrap(Impl.lt(euint64.unwrap(a), uint256(b), true));\\n }\\n\\n // Evaluate lt(a, b) and return the result.\\n function lt(uint64 a, euint64 b) internal returns (ebool) {\\n if (!isInitialized(b)) {\\n b = asEuint64(0);\\n }\\n return ebool.wrap(Impl.gt(euint64.unwrap(b), uint256(a), true));\\n }\\n\\n // Evaluate min(a, b) and return the result.\\n function min(euint64 a, uint64 b) internal returns (euint64) {\\n if (!isInitialized(a)) {\\n a = asEuint64(0);\\n }\\n return euint64.wrap(Impl.min(euint64.unwrap(a), uint256(b), true));\\n }\\n\\n // Evaluate min(a, b) and return the result.\\n function min(uint64 a, euint64 b) internal returns (euint64) {\\n if (!isInitialized(b)) {\\n b = asEuint64(0);\\n }\\n return euint64.wrap(Impl.min(euint64.unwrap(b), uint256(a), true));\\n }\\n\\n // Evaluate max(a, b) and return the result.\\n function max(euint64 a, uint64 b) internal returns (euint64) {\\n if (!isInitialized(a)) {\\n a = asEuint64(0);\\n }\\n return euint64.wrap(Impl.max(euint64.unwrap(a), uint256(b), true));\\n }\\n\\n // Evaluate max(a, b) and return the result.\\n function max(uint64 a, euint64 b) internal returns (euint64) {\\n if (!isInitialized(b)) {\\n b = asEuint64(0);\\n }\\n return euint64.wrap(Impl.max(euint64.unwrap(b), uint256(a), true));\\n }\\n\\n // Evaluate shl(a, b) and return the result.\\n function shl(euint4 a, uint8 b) internal returns (euint4) {\\n if (!isInitialized(a)) {\\n a = asEuint4(0);\\n }\\n return euint4.wrap(Impl.shl(euint4.unwrap(a), uint256(b), true));\\n }\\n\\n // Evaluate shr(a, b) and return the result.\\n function shr(euint4 a, uint8 b) internal returns (euint4) {\\n if (!isInitialized(a)) {\\n a = asEuint4(0);\\n }\\n return euint4.wrap(Impl.shr(euint4.unwrap(a), uint256(b), true));\\n }\\n\\n // Evaluate rotl(a, b) and return the result.\\n function rotl(euint4 a, uint8 b) internal returns (euint4) {\\n if (!isInitialized(a)) {\\n a = asEuint4(0);\\n }\\n return euint4.wrap(Impl.rotl(euint4.unwrap(a), uint256(b), true));\\n }\\n\\n // Evaluate rotr(a, b) and return the result.\\n function rotr(euint4 a, uint8 b) internal returns (euint4) {\\n if (!isInitialized(a)) {\\n a = asEuint4(0);\\n }\\n return euint4.wrap(Impl.rotr(euint4.unwrap(a), uint256(b), true));\\n }\\n\\n // Evaluate shl(a, b) and return the result.\\n function shl(euint8 a, euint8 b) internal returns (euint8) {\\n if (!isInitialized(a)) {\\n a = asEuint8(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint8(0);\\n }\\n return euint8.wrap(Impl.shl(euint8.unwrap(a), euint8.unwrap(b), false));\\n }\\n\\n // Evaluate shl(a, b) and return the result.\\n function shl(euint8 a, uint8 b) internal returns (euint8) {\\n if (!isInitialized(a)) {\\n a = asEuint8(0);\\n }\\n return euint8.wrap(Impl.shl(euint8.unwrap(a), uint256(b), true));\\n }\\n\\n // Evaluate shr(a, b) and return the result.\\n function shr(euint8 a, euint8 b) internal returns (euint8) {\\n if (!isInitialized(a)) {\\n a = asEuint8(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint8(0);\\n }\\n return euint8.wrap(Impl.shr(euint8.unwrap(a), euint8.unwrap(b), false));\\n }\\n\\n // Evaluate shr(a, b) and return the result.\\n function shr(euint8 a, uint8 b) internal returns (euint8) {\\n if (!isInitialized(a)) {\\n a = asEuint8(0);\\n }\\n return euint8.wrap(Impl.shr(euint8.unwrap(a), uint256(b), true));\\n }\\n\\n // Evaluate rotl(a, b) and return the result.\\n function rotl(euint8 a, euint8 b) internal returns (euint8) {\\n if (!isInitialized(a)) {\\n a = asEuint8(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint8(0);\\n }\\n return euint8.wrap(Impl.rotl(euint8.unwrap(a), euint8.unwrap(b), false));\\n }\\n\\n // Evaluate rotl(a, b) and return the result.\\n function rotl(euint8 a, uint8 b) internal returns (euint8) {\\n if (!isInitialized(a)) {\\n a = asEuint8(0);\\n }\\n return euint8.wrap(Impl.rotl(euint8.unwrap(a), uint256(b), true));\\n }\\n\\n // Evaluate rotr(a, b) and return the result.\\n function rotr(euint8 a, euint8 b) internal returns (euint8) {\\n if (!isInitialized(a)) {\\n a = asEuint8(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint8(0);\\n }\\n return euint8.wrap(Impl.rotr(euint8.unwrap(a), euint8.unwrap(b), false));\\n }\\n\\n // Evaluate rotr(a, b) and return the result.\\n function rotr(euint8 a, uint8 b) internal returns (euint8) {\\n if (!isInitialized(a)) {\\n a = asEuint8(0);\\n }\\n return euint8.wrap(Impl.rotr(euint8.unwrap(a), uint256(b), true));\\n }\\n\\n // Evaluate shl(a, b) and return the result.\\n function shl(euint16 a, euint8 b) internal returns (euint16) {\\n if (!isInitialized(a)) {\\n a = asEuint16(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint8(0);\\n }\\n return euint16.wrap(Impl.shl(euint16.unwrap(a), euint16.unwrap(asEuint16(b)), false));\\n }\\n\\n // Evaluate shl(a, b) and return the result.\\n function shl(euint16 a, uint8 b) internal returns (euint16) {\\n if (!isInitialized(a)) {\\n a = asEuint16(0);\\n }\\n return euint16.wrap(Impl.shl(euint16.unwrap(a), uint256(b), true));\\n }\\n\\n // Evaluate shr(a, b) and return the result.\\n function shr(euint16 a, euint8 b) internal returns (euint16) {\\n if (!isInitialized(a)) {\\n a = asEuint16(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint8(0);\\n }\\n return euint16.wrap(Impl.shr(euint16.unwrap(a), euint16.unwrap(asEuint16(b)), false));\\n }\\n\\n // Evaluate shr(a, b) and return the result.\\n function shr(euint16 a, uint8 b) internal returns (euint16) {\\n if (!isInitialized(a)) {\\n a = asEuint16(0);\\n }\\n return euint16.wrap(Impl.shr(euint16.unwrap(a), uint256(b), true));\\n }\\n\\n // Evaluate rotl(a, b) and return the result.\\n function rotl(euint16 a, euint8 b) internal returns (euint16) {\\n if (!isInitialized(a)) {\\n a = asEuint16(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint8(0);\\n }\\n return euint16.wrap(Impl.rotl(euint16.unwrap(a), euint16.unwrap(asEuint16(b)), false));\\n }\\n\\n // Evaluate rotl(a, b) and return the result.\\n function rotl(euint16 a, uint8 b) internal returns (euint16) {\\n if (!isInitialized(a)) {\\n a = asEuint16(0);\\n }\\n return euint16.wrap(Impl.rotl(euint16.unwrap(a), uint256(b), true));\\n }\\n\\n // Evaluate rotr(a, b) and return the result.\\n function rotr(euint16 a, euint8 b) internal returns (euint16) {\\n if (!isInitialized(a)) {\\n a = asEuint16(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint8(0);\\n }\\n return euint16.wrap(Impl.rotr(euint16.unwrap(a), euint16.unwrap(asEuint16(b)), false));\\n }\\n\\n // Evaluate rotr(a, b) and return the result.\\n function rotr(euint16 a, uint8 b) internal returns (euint16) {\\n if (!isInitialized(a)) {\\n a = asEuint16(0);\\n }\\n return euint16.wrap(Impl.rotr(euint16.unwrap(a), uint256(b), true));\\n }\\n\\n // Evaluate shl(a, b) and return the result.\\n function shl(euint32 a, euint8 b) internal returns (euint32) {\\n if (!isInitialized(a)) {\\n a = asEuint32(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint8(0);\\n }\\n return euint32.wrap(Impl.shl(euint32.unwrap(a), euint32.unwrap(asEuint32(b)), false));\\n }\\n\\n // Evaluate shl(a, b) and return the result.\\n function shl(euint32 a, uint8 b) internal returns (euint32) {\\n if (!isInitialized(a)) {\\n a = asEuint32(0);\\n }\\n return euint32.wrap(Impl.shl(euint32.unwrap(a), uint256(b), true));\\n }\\n\\n // Evaluate shr(a, b) and return the result.\\n function shr(euint32 a, euint8 b) internal returns (euint32) {\\n if (!isInitialized(a)) {\\n a = asEuint32(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint8(0);\\n }\\n return euint32.wrap(Impl.shr(euint32.unwrap(a), euint32.unwrap(asEuint32(b)), false));\\n }\\n\\n // Evaluate shr(a, b) and return the result.\\n function shr(euint32 a, uint8 b) internal returns (euint32) {\\n if (!isInitialized(a)) {\\n a = asEuint32(0);\\n }\\n return euint32.wrap(Impl.shr(euint32.unwrap(a), uint256(b), true));\\n }\\n\\n // Evaluate rotl(a, b) and return the result.\\n function rotl(euint32 a, euint8 b) internal returns (euint32) {\\n if (!isInitialized(a)) {\\n a = asEuint32(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint8(0);\\n }\\n return euint32.wrap(Impl.rotl(euint32.unwrap(a), euint32.unwrap(asEuint32(b)), false));\\n }\\n\\n // Evaluate rotl(a, b) and return the result.\\n function rotl(euint32 a, uint8 b) internal returns (euint32) {\\n if (!isInitialized(a)) {\\n a = asEuint32(0);\\n }\\n return euint32.wrap(Impl.rotl(euint32.unwrap(a), uint256(b), true));\\n }\\n\\n // Evaluate rotr(a, b) and return the result.\\n function rotr(euint32 a, euint8 b) internal returns (euint32) {\\n if (!isInitialized(a)) {\\n a = asEuint32(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint8(0);\\n }\\n return euint32.wrap(Impl.rotr(euint32.unwrap(a), euint32.unwrap(asEuint32(b)), false));\\n }\\n\\n // Evaluate rotr(a, b) and return the result.\\n function rotr(euint32 a, uint8 b) internal returns (euint32) {\\n if (!isInitialized(a)) {\\n a = asEuint32(0);\\n }\\n return euint32.wrap(Impl.rotr(euint32.unwrap(a), uint256(b), true));\\n }\\n\\n // Evaluate shl(a, b) and return the result.\\n function shl(euint64 a, euint8 b) internal returns (euint64) {\\n if (!isInitialized(a)) {\\n a = asEuint64(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint8(0);\\n }\\n return euint64.wrap(Impl.shl(euint64.unwrap(a), euint64.unwrap(asEuint64(b)), false));\\n }\\n\\n // Evaluate shl(a, b) and return the result.\\n function shl(euint64 a, uint8 b) internal returns (euint64) {\\n if (!isInitialized(a)) {\\n a = asEuint64(0);\\n }\\n return euint64.wrap(Impl.shl(euint64.unwrap(a), uint256(b), true));\\n }\\n\\n // Evaluate shr(a, b) and return the result.\\n function shr(euint64 a, euint8 b) internal returns (euint64) {\\n if (!isInitialized(a)) {\\n a = asEuint64(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint8(0);\\n }\\n return euint64.wrap(Impl.shr(euint64.unwrap(a), euint64.unwrap(asEuint64(b)), false));\\n }\\n\\n // Evaluate shr(a, b) and return the result.\\n function shr(euint64 a, uint8 b) internal returns (euint64) {\\n if (!isInitialized(a)) {\\n a = asEuint64(0);\\n }\\n return euint64.wrap(Impl.shr(euint64.unwrap(a), uint256(b), true));\\n }\\n\\n // Evaluate rotl(a, b) and return the result.\\n function rotl(euint64 a, euint8 b) internal returns (euint64) {\\n if (!isInitialized(a)) {\\n a = asEuint64(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint8(0);\\n }\\n return euint64.wrap(Impl.rotl(euint64.unwrap(a), euint64.unwrap(asEuint64(b)), false));\\n }\\n\\n // Evaluate rotl(a, b) and return the result.\\n function rotl(euint64 a, uint8 b) internal returns (euint64) {\\n if (!isInitialized(a)) {\\n a = asEuint64(0);\\n }\\n return euint64.wrap(Impl.rotl(euint64.unwrap(a), uint256(b), true));\\n }\\n\\n // Evaluate rotr(a, b) and return the result.\\n function rotr(euint64 a, euint8 b) internal returns (euint64) {\\n if (!isInitialized(a)) {\\n a = asEuint64(0);\\n }\\n if (!isInitialized(b)) {\\n b = asEuint8(0);\\n }\\n return euint64.wrap(Impl.rotr(euint64.unwrap(a), euint64.unwrap(asEuint64(b)), false));\\n }\\n\\n // Evaluate rotr(a, b) and return the result.\\n function rotr(euint64 a, uint8 b) internal returns (euint64) {\\n if (!isInitialized(a)) {\\n a = asEuint64(0);\\n }\\n return euint64.wrap(Impl.rotr(euint64.unwrap(a), uint256(b), true));\\n }\\n\\n // If 'control''s value is 'true', the result has the same value as 'a'.\\n // If 'control''s value is 'false', the result has the same value as 'b'.\\n function select(ebool control, euint4 a, euint4 b) internal returns (euint4) {\\n return euint4.wrap(Impl.select(ebool.unwrap(control), euint4.unwrap(a), euint4.unwrap(b)));\\n }\\n // If 'control''s value is 'true', the result has the same value as 'a'.\\n // If 'control''s value is 'false', the result has the same value as 'b'.\\n function select(ebool control, euint8 a, euint8 b) internal returns (euint8) {\\n return euint8.wrap(Impl.select(ebool.unwrap(control), euint8.unwrap(a), euint8.unwrap(b)));\\n }\\n // If 'control''s value is 'true', the result has the same value as 'a'.\\n // If 'control''s value is 'false', the result has the same value as 'b'.\\n function select(ebool control, euint16 a, euint16 b) internal returns (euint16) {\\n return euint16.wrap(Impl.select(ebool.unwrap(control), euint16.unwrap(a), euint16.unwrap(b)));\\n }\\n // If 'control''s value is 'true', the result has the same value as 'a'.\\n // If 'control''s value is 'false', the result has the same value as 'b'.\\n function select(ebool control, euint32 a, euint32 b) internal returns (euint32) {\\n return euint32.wrap(Impl.select(ebool.unwrap(control), euint32.unwrap(a), euint32.unwrap(b)));\\n }\\n // If 'control''s value is 'true', the result has the same value as 'a'.\\n // If 'control''s value is 'false', the result has the same value as 'b'.\\n function select(ebool control, euint64 a, euint64 b) internal returns (euint64) {\\n return euint64.wrap(Impl.select(ebool.unwrap(control), euint64.unwrap(a), euint64.unwrap(b)));\\n }\\n // Cast an encrypted integer from euint8 to euint4.\\n function asEuint4(euint8 value) internal returns (euint4) {\\n return euint4.wrap(Impl.cast(euint8.unwrap(value), Common.euint4_t));\\n }\\n\\n // Cast an encrypted integer from euint16 to euint4.\\n function asEuint4(euint16 value) internal returns (euint4) {\\n return euint4.wrap(Impl.cast(euint16.unwrap(value), Common.euint4_t));\\n }\\n\\n // Cast an encrypted integer from euint32 to euint4.\\n function asEuint4(euint32 value) internal returns (euint4) {\\n return euint4.wrap(Impl.cast(euint32.unwrap(value), Common.euint4_t));\\n }\\n\\n // Cast an encrypted integer from euint64 to euint4.\\n function asEuint4(euint64 value) internal returns (euint4) {\\n return euint4.wrap(Impl.cast(euint64.unwrap(value), Common.euint4_t));\\n }\\n\\n // Cast an encrypted integer from euint4 to ebool.\\n function asEbool(euint4 value) internal returns (ebool) {\\n return ne(value, 0);\\n }\\n\\n // Converts an 'ebool' to an 'euint4'.\\n function asEuint4(ebool b) internal returns (euint4) {\\n return euint4.wrap(Impl.cast(ebool.unwrap(b), Common.euint4_t));\\n }\\n\\n // Cast an encrypted integer from euint4 to euint8.\\n function asEuint8(euint4 value) internal returns (euint8) {\\n return euint8.wrap(Impl.cast(euint4.unwrap(value), Common.euint8_t));\\n }\\n\\n // Cast an encrypted integer from euint16 to euint8.\\n function asEuint8(euint16 value) internal returns (euint8) {\\n return euint8.wrap(Impl.cast(euint16.unwrap(value), Common.euint8_t));\\n }\\n\\n // Cast an encrypted integer from euint32 to euint8.\\n function asEuint8(euint32 value) internal returns (euint8) {\\n return euint8.wrap(Impl.cast(euint32.unwrap(value), Common.euint8_t));\\n }\\n\\n // Cast an encrypted integer from euint64 to euint8.\\n function asEuint8(euint64 value) internal returns (euint8) {\\n return euint8.wrap(Impl.cast(euint64.unwrap(value), Common.euint8_t));\\n }\\n\\n // Cast an encrypted integer from euint8 to ebool.\\n function asEbool(euint8 value) internal returns (ebool) {\\n return ne(value, 0);\\n }\\n\\n // Convert an inputHandle with corresponding inputProof to an encrypted boolean.\\n function asEbool(einput inputHandle, bytes memory inputProof) internal returns (ebool) {\\n return ebool.wrap(Impl.verify(einput.unwrap(inputHandle), inputProof, Common.ebool_t));\\n }\\n\\n // Convert a plaintext value to an encrypted boolean.\\n function asEbool(uint256 value) internal returns (ebool) {\\n return ebool.wrap(Impl.trivialEncrypt(value, Common.ebool_t));\\n }\\n\\n // Convert a plaintext boolean to an encrypted boolean.\\n function asEbool(bool value) internal returns (ebool) {\\n if (value) {\\n return asEbool(1);\\n } else {\\n return asEbool(0);\\n }\\n }\\n\\n // Converts an 'ebool' to an 'euint8'.\\n function asEuint8(ebool value) internal returns (euint8) {\\n return euint8.wrap(Impl.cast(ebool.unwrap(value), Common.euint8_t));\\n }\\n\\n // Evaluate and(a, b) and return the result.\\n function and(ebool a, ebool b) internal returns (ebool) {\\n return ebool.wrap(Impl.and(ebool.unwrap(a), ebool.unwrap(b)));\\n }\\n\\n // Evaluate or(a, b) and return the result.\\n function or(ebool a, ebool b) internal returns (ebool) {\\n return ebool.wrap(Impl.or(ebool.unwrap(a), ebool.unwrap(b)));\\n }\\n\\n // Evaluate xor(a, b) and return the result.\\n function xor(ebool a, ebool b) internal returns (ebool) {\\n return ebool.wrap(Impl.xor(ebool.unwrap(a), ebool.unwrap(b)));\\n }\\n\\n function not(ebool a) internal returns (ebool) {\\n return ebool.wrap(Impl.not(ebool.unwrap(a)));\\n }\\n\\n // Cast an encrypted integer from euint4 to euint16.\\n function asEuint16(euint4 value) internal returns (euint16) {\\n return euint16.wrap(Impl.cast(euint4.unwrap(value), Common.euint16_t));\\n }\\n\\n // Cast an encrypted integer from euint8 to euint16.\\n function asEuint16(euint8 value) internal returns (euint16) {\\n return euint16.wrap(Impl.cast(euint8.unwrap(value), Common.euint16_t));\\n }\\n\\n // Cast an encrypted integer from euint32 to euint16.\\n function asEuint16(euint32 value) internal returns (euint16) {\\n return euint16.wrap(Impl.cast(euint32.unwrap(value), Common.euint16_t));\\n }\\n\\n // Cast an encrypted integer from euint64 to euint16.\\n function asEuint16(euint64 value) internal returns (euint16) {\\n return euint16.wrap(Impl.cast(euint64.unwrap(value), Common.euint16_t));\\n }\\n\\n // Cast an encrypted integer from euint16 to ebool.\\n function asEbool(euint16 value) internal returns (ebool) {\\n return ne(value, 0);\\n }\\n\\n // Converts an 'ebool' to an 'euint16'.\\n function asEuint16(ebool b) internal returns (euint16) {\\n return euint16.wrap(Impl.cast(ebool.unwrap(b), Common.euint16_t));\\n }\\n\\n // Cast an encrypted integer from euint4 to euint32.\\n function asEuint32(euint4 value) internal returns (euint32) {\\n return euint32.wrap(Impl.cast(euint4.unwrap(value), Common.euint32_t));\\n }\\n\\n // Cast an encrypted integer from euint8 to euint32.\\n function asEuint32(euint8 value) internal returns (euint32) {\\n return euint32.wrap(Impl.cast(euint8.unwrap(value), Common.euint32_t));\\n }\\n\\n // Cast an encrypted integer from euint16 to euint32.\\n function asEuint32(euint16 value) internal returns (euint32) {\\n return euint32.wrap(Impl.cast(euint16.unwrap(value), Common.euint32_t));\\n }\\n\\n // Cast an encrypted integer from euint64 to euint32.\\n function asEuint32(euint64 value) internal returns (euint32) {\\n return euint32.wrap(Impl.cast(euint64.unwrap(value), Common.euint32_t));\\n }\\n\\n // Cast an encrypted integer from euint32 to ebool.\\n function asEbool(euint32 value) internal returns (ebool) {\\n return ne(value, 0);\\n }\\n\\n // Converts an 'ebool' to an 'euint32'.\\n function asEuint32(ebool b) internal returns (euint32) {\\n return euint32.wrap(Impl.cast(ebool.unwrap(b), Common.euint32_t));\\n }\\n\\n // Cast an encrypted integer from euint4 to euint64.\\n function asEuint64(euint4 value) internal returns (euint64) {\\n return euint64.wrap(Impl.cast(euint4.unwrap(value), Common.euint64_t));\\n }\\n\\n // Cast an encrypted integer from euint8 to euint64.\\n function asEuint64(euint8 value) internal returns (euint64) {\\n return euint64.wrap(Impl.cast(euint8.unwrap(value), Common.euint64_t));\\n }\\n\\n // Cast an encrypted integer from euint16 to euint64.\\n function asEuint64(euint16 value) internal returns (euint64) {\\n return euint64.wrap(Impl.cast(euint16.unwrap(value), Common.euint64_t));\\n }\\n\\n // Cast an encrypted integer from euint32 to euint64.\\n function asEuint64(euint32 value) internal returns (euint64) {\\n return euint64.wrap(Impl.cast(euint32.unwrap(value), Common.euint64_t));\\n }\\n\\n // Cast an encrypted integer from euint64 to ebool.\\n function asEbool(euint64 value) internal returns (ebool) {\\n return ne(value, 0);\\n }\\n\\n // Converts an 'ebool' to an 'euint64'.\\n function asEuint64(ebool b) internal returns (euint64) {\\n return euint64.wrap(Impl.cast(ebool.unwrap(b), Common.euint64_t));\\n }\\n\\n function neg(euint4 value) internal returns (euint4) {\\n return euint4.wrap(Impl.neg(euint4.unwrap(value)));\\n }\\n\\n function not(euint4 value) internal returns (euint4) {\\n return euint4.wrap(Impl.not(euint4.unwrap(value)));\\n }\\n\\n function neg(euint8 value) internal returns (euint8) {\\n return euint8.wrap(Impl.neg(euint8.unwrap(value)));\\n }\\n\\n function not(euint8 value) internal returns (euint8) {\\n return euint8.wrap(Impl.not(euint8.unwrap(value)));\\n }\\n\\n function neg(euint16 value) internal returns (euint16) {\\n return euint16.wrap(Impl.neg(euint16.unwrap(value)));\\n }\\n\\n function not(euint16 value) internal returns (euint16) {\\n return euint16.wrap(Impl.not(euint16.unwrap(value)));\\n }\\n\\n function neg(euint32 value) internal returns (euint32) {\\n return euint32.wrap(Impl.neg(euint32.unwrap(value)));\\n }\\n\\n function not(euint32 value) internal returns (euint32) {\\n return euint32.wrap(Impl.not(euint32.unwrap(value)));\\n }\\n\\n function neg(euint64 value) internal returns (euint64) {\\n return euint64.wrap(Impl.neg(euint64.unwrap(value)));\\n }\\n\\n function not(euint64 value) internal returns (euint64) {\\n return euint64.wrap(Impl.not(euint64.unwrap(value)));\\n }\\n\\n // Convert an inputHandle with corresponding inputProof to an encrypted euint4 integer.\\n function asEuint4(einput inputHandle, bytes memory inputProof) internal returns (euint4) {\\n return euint4.wrap(Impl.verify(einput.unwrap(inputHandle), inputProof, Common.euint4_t));\\n }\\n\\n // Convert a plaintext value to an encrypted euint4 integer.\\n function asEuint4(uint256 value) internal returns (euint4) {\\n return euint4.wrap(Impl.trivialEncrypt(value, Common.euint4_t));\\n }\\n\\n // Convert an inputHandle with corresponding inputProof to an encrypted euint8 integer.\\n function asEuint8(einput inputHandle, bytes memory inputProof) internal returns (euint8) {\\n return euint8.wrap(Impl.verify(einput.unwrap(inputHandle), inputProof, Common.euint8_t));\\n }\\n\\n // Convert a plaintext value to an encrypted euint8 integer.\\n function asEuint8(uint256 value) internal returns (euint8) {\\n return euint8.wrap(Impl.trivialEncrypt(value, Common.euint8_t));\\n }\\n\\n // Convert an inputHandle with corresponding inputProof to an encrypted euint16 integer.\\n function asEuint16(einput inputHandle, bytes memory inputProof) internal returns (euint16) {\\n return euint16.wrap(Impl.verify(einput.unwrap(inputHandle), inputProof, Common.euint16_t));\\n }\\n\\n // Convert a plaintext value to an encrypted euint16 integer.\\n function asEuint16(uint256 value) internal returns (euint16) {\\n return euint16.wrap(Impl.trivialEncrypt(value, Common.euint16_t));\\n }\\n\\n // Convert an inputHandle with corresponding inputProof to an encrypted euint32 integer.\\n function asEuint32(einput inputHandle, bytes memory inputProof) internal returns (euint32) {\\n return euint32.wrap(Impl.verify(einput.unwrap(inputHandle), inputProof, Common.euint32_t));\\n }\\n\\n // Convert a plaintext value to an encrypted euint32 integer.\\n function asEuint32(uint256 value) internal returns (euint32) {\\n return euint32.wrap(Impl.trivialEncrypt(value, Common.euint32_t));\\n }\\n\\n // Convert an inputHandle with corresponding inputProof to an encrypted euint64 integer.\\n function asEuint64(einput inputHandle, bytes memory inputProof) internal returns (euint64) {\\n return euint64.wrap(Impl.verify(einput.unwrap(inputHandle), inputProof, Common.euint64_t));\\n }\\n\\n // Convert a plaintext value to an encrypted euint64 integer.\\n function asEuint64(uint256 value) internal returns (euint64) {\\n return euint64.wrap(Impl.trivialEncrypt(value, Common.euint64_t));\\n }\\n\\n // Generates a random encrypted 8-bit unsigned integer.\\n // Important: The random integer is generated in the plain! An FHE-based version is coming soon.\\n function randEuint8() internal returns (euint8) {\\n return euint8.wrap(Impl.rand(Common.euint8_t));\\n }\\n\\n // Generates a random encrypted 8-bit unsigned integer in the [0, upperBound) range.\\n // The upperBound must be a power of 2.\\n // Important: The random integer is generated in the plain! An FHE-based version is coming soon.\\n function randEuint8(uint8 upperBound) internal returns (euint8) {\\n return euint8.wrap(Impl.randBounded(upperBound, Common.euint8_t));\\n }\\n\\n // Generates a random encrypted 16-bit unsigned integer.\\n // Important: The random integer is generated in the plain! An FHE-based version is coming soon.\\n function randEuint16() internal returns (euint16) {\\n return euint16.wrap(Impl.rand(Common.euint16_t));\\n }\\n\\n // Generates a random encrypted 16-bit unsigned integer in the [0, upperBound) range.\\n // The upperBound must be a power of 2.\\n // Important: The random integer is generated in the plain! An FHE-based version is coming soon.\\n function randEuint16(uint16 upperBound) internal returns (euint16) {\\n return euint16.wrap(Impl.randBounded(upperBound, Common.euint16_t));\\n }\\n\\n // Generates a random encrypted 32-bit unsigned integer.\\n // Important: The random integer is generated in the plain! An FHE-based version is coming soon.\\n function randEuint32() internal returns (euint32) {\\n return euint32.wrap(Impl.rand(Common.euint32_t));\\n }\\n\\n // Generates a random encrypted 32-bit unsigned integer in the [0, upperBound) range.\\n // The upperBound must be a power of 2.\\n // Important: The random integer is generated in the plain! An FHE-based version is coming soon.\\n function randEuint32(uint32 upperBound) internal returns (euint32) {\\n return euint32.wrap(Impl.randBounded(upperBound, Common.euint32_t));\\n }\\n\\n // Generates a random encrypted 64-bit unsigned integer.\\n // Important: The random integer is generated in the plain! An FHE-based version is coming soon.\\n function randEuint64() internal returns (euint64) {\\n return euint64.wrap(Impl.rand(Common.euint64_t));\\n }\\n\\n // Generates a random encrypted 64-bit unsigned integer in the [0, upperBound) range.\\n // The upperBound must be a power of 2.\\n // Important: The random integer is generated in the plain! An FHE-based version is coming soon.\\n function randEuint64(uint64 upperBound) internal returns (euint64) {\\n return euint64.wrap(Impl.randBounded(upperBound, Common.euint64_t));\\n }\\n\\n // Convert an inputHandle with corresponding inputProof to an encrypted eaddress.\\n function asEaddress(einput inputHandle, bytes memory inputProof) internal returns (eaddress) {\\n return eaddress.wrap(Impl.verify(einput.unwrap(inputHandle), inputProof, Common.euint160_t));\\n }\\n\\n // Convert a plaintext value to an encrypted asEaddress.\\n function asEaddress(address value) internal returns (eaddress) {\\n return eaddress.wrap(Impl.trivialEncrypt(uint160(value), Common.euint160_t));\\n }\\n\\n // Convert the given inputHandle and inputProof to an encrypted ebytes256 value.\\n function asEbytes256(einput inputHandle, bytes memory inputProof) internal returns (ebytes256) {\\n return ebytes256.wrap(Impl.verify(einput.unwrap(inputHandle), inputProof, Common.ebytes256_t));\\n }\\n\\n // Return true if the enrypted address is initialized and false otherwise.\\n function isInitialized(eaddress v) internal pure returns (bool) {\\n return eaddress.unwrap(v) != 0;\\n }\\n\\n // Return true if the enrypted value is initialized and false otherwise.\\n function isInitialized(ebytes256 v) internal pure returns (bool) {\\n return ebytes256.unwrap(v) != 0;\\n }\\n\\n // Evaluate eq(a, b) and return the result.\\n function eq(eaddress a, eaddress b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEaddress(address(0));\\n }\\n if (!isInitialized(b)) {\\n b = asEaddress(address(0));\\n }\\n return ebool.wrap(Impl.eq(eaddress.unwrap(a), eaddress.unwrap(b), false));\\n }\\n\\n // Evaluate ne(a, b) and return the result.\\n function ne(eaddress a, eaddress b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEaddress(address(0));\\n }\\n if (!isInitialized(b)) {\\n b = asEaddress(address(0));\\n }\\n return ebool.wrap(Impl.ne(eaddress.unwrap(a), eaddress.unwrap(b), false));\\n }\\n\\n // Evaluate eq(a, b) and return the result.\\n function eq(eaddress a, address b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEaddress(address(0));\\n }\\n uint256 bProc = uint256(uint160(b));\\n return ebool.wrap(Impl.eq(eaddress.unwrap(a), bProc, true));\\n }\\n\\n // Evaluate eq(a, b) and return the result.\\n function eq(address b, eaddress a) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEaddress(address(0));\\n }\\n uint256 bProc = uint256(uint160(b));\\n return ebool.wrap(Impl.eq(eaddress.unwrap(a), bProc, true));\\n }\\n\\n // Evaluate ne(a, b) and return the result.\\n function ne(eaddress a, address b) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEaddress(address(0));\\n }\\n uint256 bProc = uint256(uint160(b));\\n return ebool.wrap(Impl.ne(eaddress.unwrap(a), bProc, true));\\n }\\n\\n // Evaluate ne(a, b) and return the result.\\n function ne(address b, eaddress a) internal returns (ebool) {\\n if (!isInitialized(a)) {\\n a = asEaddress(address(0));\\n }\\n uint256 bProc = uint256(uint160(b));\\n return ebool.wrap(Impl.ne(eaddress.unwrap(a), bProc, true));\\n }\\n\\n // If 'control''s value is 'true', the result has the same value as 'a'.\\n // If 'control''s value is 'false', the result has the same value as 'b'.\\n function select(ebool control, eaddress a, eaddress b) internal returns (eaddress) {\\n return eaddress.wrap(Impl.select(ebool.unwrap(control), eaddress.unwrap(a), eaddress.unwrap(b)));\\n }\\n\\n // Evaluate eq(a, b) and return the result.\\n function eq(ebytes256 a, ebytes256 b) internal returns (ebool) {\\n require(isInitialized(a), \\\"a is uninitialized\\\");\\n require(isInitialized(b), \\\"b is uninitialized\\\");\\n return ebool.wrap(Impl.eq(ebytes256.unwrap(a), ebytes256.unwrap(b), false));\\n }\\n\\n // Evaluate ne(a, b) and return the result.\\n function ne(ebytes256 a, ebytes256 b) internal returns (ebool) {\\n require(isInitialized(a), \\\"a is uninitialized\\\");\\n require(isInitialized(b), \\\"b is uninitialized\\\");\\n return ebool.wrap(Impl.ne(ebytes256.unwrap(a), ebytes256.unwrap(b), false));\\n }\\n\\n // cleans the transient storage of ACL containing all the allowedTransient accounts\\n // to be used for integration with Account Abstraction or when bundling UserOps calling the FHEVMCoprocessor\\n function cleanTransientStorage() internal {\\n return Impl.cleanTransientStorage();\\n }\\n\\n function isAllowed(ebool value, address account) internal view returns (bool) {\\n return Impl.isAllowed(ebool.unwrap(value), account);\\n }\\n function isAllowed(euint4 value, address account) internal view returns (bool) {\\n return Impl.isAllowed(euint4.unwrap(value), account);\\n }\\n function isAllowed(euint8 value, address account) internal view returns (bool) {\\n return Impl.isAllowed(euint8.unwrap(value), account);\\n }\\n function isAllowed(euint16 value, address account) internal view returns (bool) {\\n return Impl.isAllowed(euint16.unwrap(value), account);\\n }\\n function isAllowed(euint32 value, address account) internal view returns (bool) {\\n return Impl.isAllowed(euint32.unwrap(value), account);\\n }\\n function isAllowed(euint64 value, address account) internal view returns (bool) {\\n return Impl.isAllowed(euint64.unwrap(value), account);\\n }\\n function isAllowed(eaddress value, address account) internal view returns (bool) {\\n return Impl.isAllowed(eaddress.unwrap(value), account);\\n }\\n\\n function isAllowed(ebytes256 value, address account) internal view returns (bool) {\\n return Impl.isAllowed(ebytes256.unwrap(value), account);\\n }\\n\\n function isSenderAllowed(ebool value) internal view returns (bool) {\\n return Impl.isAllowed(ebool.unwrap(value), msg.sender);\\n }\\n\\n function isSenderAllowed(euint4 value) internal view returns (bool) {\\n return Impl.isAllowed(euint4.unwrap(value), msg.sender);\\n }\\n\\n function isSenderAllowed(euint8 value) internal view returns (bool) {\\n return Impl.isAllowed(euint8.unwrap(value), msg.sender);\\n }\\n\\n function isSenderAllowed(euint16 value) internal view returns (bool) {\\n return Impl.isAllowed(euint16.unwrap(value), msg.sender);\\n }\\n\\n function isSenderAllowed(euint32 value) internal view returns (bool) {\\n return Impl.isAllowed(euint32.unwrap(value), msg.sender);\\n }\\n\\n function isSenderAllowed(euint64 value) internal view returns (bool) {\\n return Impl.isAllowed(euint64.unwrap(value), msg.sender);\\n }\\n\\n function isSenderAllowed(eaddress value) internal view returns (bool) {\\n return Impl.isAllowed(eaddress.unwrap(value), msg.sender);\\n }\\n\\n function isSenderAllowed(ebytes256 value) internal view returns (bool) {\\n return Impl.isAllowed(ebytes256.unwrap(value), msg.sender);\\n }\\n\\n function allow(ebool value, address account) internal {\\n Impl.allow(ebool.unwrap(value), account);\\n }\\n\\n function allow(euint4 value, address account) internal {\\n Impl.allow(euint4.unwrap(value), account);\\n }\\n\\n function allow(euint8 value, address account) internal {\\n Impl.allow(euint8.unwrap(value), account);\\n }\\n\\n function allow(euint16 value, address account) internal {\\n Impl.allow(euint16.unwrap(value), account);\\n }\\n\\n function allow(euint32 value, address account) internal {\\n Impl.allow(euint32.unwrap(value), account);\\n }\\n\\n function allow(euint64 value, address account) internal {\\n Impl.allow(euint64.unwrap(value), account);\\n }\\n\\n function allow(eaddress value, address account) internal {\\n Impl.allow(eaddress.unwrap(value), account);\\n }\\n\\n function allow(ebytes256 value, address account) internal {\\n Impl.allow(ebytes256.unwrap(value), account);\\n }\\n\\n function allowTransient(ebool value, address account) internal {\\n Impl.allowTransient(ebool.unwrap(value), account);\\n }\\n\\n function allowTransient(euint4 value, address account) internal {\\n Impl.allowTransient(euint4.unwrap(value), account);\\n }\\n\\n function allowTransient(euint8 value, address account) internal {\\n Impl.allowTransient(euint8.unwrap(value), account);\\n }\\n\\n function allowTransient(euint16 value, address account) internal {\\n Impl.allowTransient(euint16.unwrap(value), account);\\n }\\n\\n function allowTransient(euint32 value, address account) internal {\\n Impl.allowTransient(euint32.unwrap(value), account);\\n }\\n\\n function allowTransient(euint64 value, address account) internal {\\n Impl.allowTransient(euint64.unwrap(value), account);\\n }\\n\\n function allowTransient(eaddress value, address account) internal {\\n Impl.allowTransient(eaddress.unwrap(value), account);\\n }\\n\\n function allowTransient(ebytes256 value, address account) internal {\\n Impl.allowTransient(ebytes256.unwrap(value), account);\\n }\\n}\\n\",\"keccak256\":\"0x42d510f3afe2140842d50c5901411770cc71b3a58f2959d2c8b017e9c9199534\",\"license\":\"BSD-3-Clause-Clear\"}},\"version\":1}", + "bytecode": "0x61010060405234801562000011575f80fd5b50604051620048e1380380620048e18339810160408190526200003491620001ef565b6200003f33620000ab565b6001600160a01b038a811660805289811660a05288811660c05287811660e05260088790556009869055600b859055600a849055600c839055600d80546001600160a01b0319169183169190911790556200009a8b620000fa565b5050505050505050505050620002b2565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b620001046200017d565b6001600160a01b0381166200016f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b6200017a81620000ab565b50565b5f546001600160a01b03163314620001d85760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640162000166565b565b6001600160a01b03811681146200017a575f80fd5b5f805f805f805f805f805f6101608c8e0312156200020b575f80fd5b8b516200021881620001da565b60208d0151909b506200022b81620001da565b60408d0151909a506200023e81620001da565b60608d01519099506200025181620001da565b60808d01519098506200026481620001da565b8097505060a08c0151955060c08c0151945060e08c015193506101008c015192506101208c015191506101408c01516200029e81620001da565b809150509295989b509295989b9093969950565b60805160a05160c05160e0516145ca620003175f395f818161039b015261341c01525f81816106f801526134b701525f8181610496015261276701525f81816103ed015281816117b001528181611df30152818161300e01526130b901526145ca5ff3fe608060405234801561000f575f80fd5b5060043610610297575f3560e01c80637b510fe811610161578063ce523ca3116100ca578063ecd618f011610084578063ecd618f014610778578063ed1692b814610798578063eea1d197146107ab578063f2fde38b146107be578063f8a41987146107d1578063fbf15b1f146107e4575f80fd5b8063ce523ca31461071a578063d55f960d1461072d578063d9478d2014610740578063e215ad5914610753578063e279d96414610766578063ecb3dc881461076f575f80fd5b80639b357b5a1161011b5780639b357b5a1461065e5780639f9fb96814610671578063a1a954b714610691578063b02c43d01461069a578063b3fa4c01146106e0578063cce3e038146106f3575f80fd5b80637b510fe81461051557806389de3063146105355780638da5cb5b146105ad5780639021578a146105bd5780639087beff14610638578063985ade151461064b575f80fd5b806342987349116102035780635dd76515116101bd5780635dd76515146104b8578063645006ca146104cb57806366ec8419146104d457806371134762146104e7578063715018a6146104fa57806371a28f6914610502575f80fd5b806342987349146104225780634595bba014610435578063485cc95514610455578063495223e7146104685780635081d9521461047157806353acdbd914610491575f80fd5b8063317dcc9611610254578063317dcc961461035f578063392e53cd146103725780633930a439146103965780633adba28a146103d55780633e413bee146103e85780633f838d0d1461040f575f80fd5b80630f1ef98c1461029b578063133de6cb146102e6578063148172da146102fb57806314ec32fa1461030e578063238c8494146103435780632a80cda31461034c575b5f80fd5b6102d36102a93660046139e2565b6001600160a01b03165f908152600460209081526040808320548352600390915290206001015490565b6040519081526020015b60405180910390f35b6102f96102f43660046139e2565b61082a565b005b6102f96103093660046139fd565b610887565b6102d361031c3660046139e2565b6001600160a01b03165f908152600460209081526040808320548352600390915290205490565b6102d3600c5481565b6102f961035a3660046139fd565b6109b6565b6102f961036d3660046139fd565b610a42565b60025461038690600160a01b900460ff1681565b60405190151581526020016102dd565b6103bd7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016102dd565b6102f96103e3366004613a14565b610a7f565b6103bd7f000000000000000000000000000000000000000000000000000000000000000081565b6102f961041d366004613b51565b610fc8565b6102f96104303660046139fd565b611051565b6104486104433660046139e2565b6110f1565b6040516102dd9190613c05565b6102f9610463366004613c48565b611167565b6102d3600a5481565b61048461047f3660046139e2565b6111fa565b6040516102dd9190613d45565b6103bd7f000000000000000000000000000000000000000000000000000000000000000081565b6102f96104c63660046139fd565b611457565b6102d360085481565b6102f96104e23660046139fd565b6114f6565b6102f96104f5366004613dd1565b61163e565b6102f9611822565b610484610510366004613dd1565b611835565b6105286105233660046139e2565b611a2d565b6040516102dd9190613e72565b61057b6105433660046139fd565b60066020525f9081526040902080546009820154600a830154600b840154600c909401546001600160a01b0390931693919290919085565b604080516001600160a01b0390961686526020860194909452928401919091526060830152608082015260a0016102dd565b5f546001600160a01b03166103bd565b6106056105cb3660046139fd565b60076020525f9081526040902080546001820154600283015460038401546004909401546001600160a01b03938416949390921692909185565b604080516001600160a01b039687168152959094166020860152928401919091526060830152608082015260a0016102dd565b6102f96106463660046139fd565b611ac3565b6102f9610659366004613f34565b611b59565b6102f961066c3660046139fd565b611eac565b61068461067f3660046139fd565b611fb0565b6040516102dd9190613f68565b6102d3600b5481565b61057b6106a83660046139fd565b60056020525f9081526040902080546009820154600a830154600b840154600c909401546001600160a01b0390931693919290919085565b6102f96106ee3660046139e2565b61209a565b6103bd7f000000000000000000000000000000000000000000000000000000000000000081565b6102f9610728366004613f7a565b612152565b6102f961073b3660046139fd565b61220d565b600d546103bd906001600160a01b031681565b6001546103bd906001600160a01b031681565b6102d360095481565b6102d3600e5481565b61078b610786366004613feb565b612346565b6040516102dd919061405a565b6102f96107a63660046139e2565b61249d565b6002546103bd906001600160a01b031681565b6102f96107cc3660046139e2565b6124f3565b6102f96107df3660046140e9565b61256c565b6103866107f236600461418f565b6001600160a01b0382165f90815260046020908152604080832054835260038083528184208585520190915290205460ff1692915050565b610832612846565b600280546001600160a01b0319166001600160a01b0383169081179091556040519081527f6e7665a41605edc0d70f4b991d652755f380754eb092d81ef9ab93664778d59e906020015b60405180910390a150565b335f908152600460205260409020546108bb5760405162461bcd60e51b81526004016108b2906141b9565b60405180910390fd5b335f908152600460209081526040808320548084526003808452828520868652019092529091205460ff16156109335760405162461bcd60e51b815260206004820152601860248201527f5573657220616c7265616479206f6e2064656e796c697374000000000000000060448201526064016108b2565b5f8181526003602081815260408084208685528084018352818520805460ff19166001908117909155938352600201805493840181558452922001839055517f976c693d56f27ba17d902bda80c4fa0416b773fbf268bcb0ee71689234d769ee906109aa9083908590918252602082015260400190565b60405180910390a15050565b6109be612846565b805f03610a0d5760405162461bcd60e51b815260206004820152601e60248201527f4d696e696d756d206465706f7369742063616e6e6f74206265207a65726f000060448201526064016108b2565b60088190556040518181527fbdde72a6d8d8b42770c9899945ccdce09d0c5c794d3326cdb2d2cca61b12a9fc9060200161087c565b610a4a612846565b600a8190556040518181527f88397975d177ce5e18abf3a5fdb8de773e80673d85eeb54f48cfaf688b3d2c3e9060200161087c565b335f90815260046020526040902054610aaa5760405162461bcd60e51b81526004016108b2906141b9565b335f908152600460208181526040808420548785526005835281852080546001600160a01b031686529383528185205480865260038085528387208388520190935293205460ff1615610b3f5760405162461bcd60e51b815260206004820181905260248201527f4f6e72616d706572206f6e206465706f7369746f7227732064656e796c69737460448201526064016108b2565b600a545f848152600360205260409020600101544291610b5e91614204565b1115610bb85760405162461bcd60e51b8152602060048201526024808201527f4f6e2072616d7020636f6f6c20646f776e20706572696f64206e6f7420656c616044820152631c1cd95960e21b60648201526084016108b2565b5f8381526003602052604090205415610c135760405162461bcd60e51b815260206004820152601860248201527f496e74656e74207374696c6c206f75747374616e64696e67000000000000000060448201526064016108b2565b828103610c625760405162461bcd60e51b815260206004820152601e60248201527f53656e6465722063616e6e6f7420626520746865206465706f7369746f72000060448201526064016108b2565b81546001600160a01b0316610cb25760405162461bcd60e51b815260206004820152601660248201527511195c1bdcda5d08191bd95cc81b9bdd08195e1a5cdd60521b60448201526064016108b2565b5f8511610d105760405162461bcd60e51b815260206004820152602660248201527f5369676e616c656420616d6f756e74206d75737420626520677265617465722060448201526507468616e20360d41b60648201526084016108b2565b600954851115610d7f5760405162461bcd60e51b815260206004820152603460248201527f5369676e616c656420616d6f756e74206d757374206265206c657373207468616044820152731b881b585e081bdb8b5c985b5c08185b5bdd5b9d60621b60648201526084016108b2565b6001600160a01b038416610dd55760405162461bcd60e51b815260206004820152601b60248201527f43616e6e6f742073656e6420746f207a65726f2061646472657373000000000060448201526064016108b2565b5f610de0848861289f565b90508583600a01541015610e92575f80610df989612909565b91509150878186600a0154610e0e9190614204565b1015610e535760405162461bcd60e51b81526020600482015260146024820152734e6f7420656e6f756768206c697175696469747960601b60448201526064016108b2565b610e5d8583612aa2565b8085600a015f828254610e709190614204565b925050819055508085600b015f828254610e8a9190614217565b909155505050505b6040805160a0810182523381526001600160a01b0387811660208084019182528385018c8152606085018c815242608087019081525f89815260078552888120975188549088166001600160a01b0319918216178955955160018901805491909816961695909517909555905160028601555160038086019190915592516004909401939093558781529152908120829055600a84018054889290610f38908490614217565b925050819055508583600b015f828254610f529190614204565b9091555050600d830180546001810182555f91825260209182902001829055604080516001600160a01b038816815291820188905242908201528490889083907f1a1292e170a0f000ccf956afba79bee0f9ec1d81f3f901c1d4d11e1f336aae109060600160405180910390a450505050505050565b5f805f610fd787878787612afa565b925092509250610fe78282612dfa565b826060015182600b015f828254610ffe9190614217565b909155505082516001600160a01b03165f9081526004602090815260408083205483526003909152908190204260019091015583015161103e9083612ed1565b6110488184612fb3565b50505050505050565b611059612846565b805f036110bc5760405162461bcd60e51b815260206004820152602b60248201527f4d617820696e74656e742065787069726174696f6e20706572696f642063616e60448201526a6e6f74206265207a65726f60a81b60648201526084016108b2565b600b8190556040518181527f55e3f6b95de9a0ec782f892e93fafe4e56be0696df204ddf8e0a40a9a713a8039060200161087c565b6001600160a01b0381165f908152600460209081526040808320548352600382529182902060020180548351818402810184019094528084526060939283018282801561115b57602002820191905f5260205f20905b815481526020019060010190808311611147575b50505050509050919050565b61116f612846565b600254600160a01b900460ff16156111bf5760405162461bcd60e51b8152602060048201526013602482015272105b1c9958591e481a5b9a5d1a585b1a5e9959606a1b60448201526064016108b2565b600180546001600160a01b039384166001600160a01b0319909116179055600280546001600160a81b0319169190921617600160a01b179055565b6001600160a01b0381165f90815260046020908152604080832060010180548251818502810185019093528083526060949383018282801561125957602002820191905f5260205f20905b815481526020019060010190808311611245575b50505050509050805167ffffffffffffffff81111561127a5761127a613a4a565b6040519080825280602002602001820160405280156112b357816020015b6112a06137ec565b8152602001906001900390816112985790505b5091505f5b8151811015611450575f8282815181106112d4576112d461422a565b6020908102919091018101515f818152600583526040808220815160e08101835281546001600160a01b031681528251610100810190935293955091938301906001830160088282826020028201915b815481526020019060010190808311611324575050505050815260200160098201548152602001600a8201548152602001600b8201548152602001600c8201548152602001600d82018054806020026020016040519081016040528092919081815260200182805480156113b557602002820191905f5260205f20905b8154815260200190600101908083116113a1575b50505050508152505090505f6113ca83612909565b915050604051806080016040528084815260200160045f855f01516001600160a01b03166001600160a01b031681526020019081526020015f205f015481526020018381526020018284606001516114229190614204565b8152508685815181106114375761143761422a565b60200260200101819052505050508060010190506112b8565b5050919050565b61145f612846565b66b1a2bc2ec500008111156114c15760405162461bcd60e51b815260206004820152602260248201527f4665652063616e6e6f742062652067726561746572207468616e206d61782066604482015261656560f01b60648201526084016108b2565b600c8190556040518181527f44f48e1b871e6db1e909a7b253b054b7150a0b4ddf4d59b159c827d82e7256709060200161087c565b5f818152600760209081526040808320815160a08101835281546001600160a01b0390811682526001830154811682860152600283015482850181905260038401546060840152600490930154608083015291855260059093529220815191929091166115755760405162461bcd60e51b81526004016108b29061423e565b80546001600160a01b031633146115ce5760405162461bcd60e51b815260206004820152601c60248201527f43616c6c6572206d75737420626520746865206465706f7369746f720000000060448201526064016108b2565b6115d88184612dfa565b816060015181600b015f8282546115ef9190614217565b909155505081516001600160a01b03165f9081526004602090815260408083205483526003909152908190204260019091015582015161162f9082612ed1565b6116398383612fb3565b505050565b5f805b8251811015611793575f83828151811061165d5761165d61422a565b6020908102919091018101515f818152600590925260409091208054919250906001600160a01b031633146116d45760405162461bcd60e51b815260206004820152601c60248201527f53656e646572206d75737420626520746865206465706f7369746f720000000060448201526064016108b2565b5f806116df84612909565b915091506116ed8383612aa2565b8083600a01546116fd9190614204565b6117079087614204565b95508083600b015f82825461171c9190614217565b90915550508254600a8401546001600160a01b039091169085907fae1f357660ab777dcfd38c0ab6357834684ec26289ecfa07ec65dbf6c3c6431290611763908590614204565b60405190815260200160405180910390a35f600a8401556117848484612ed1565b50505050806001019050611641565b5060405163a9059cbb60e01b8152336004820152602481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063a9059cbb906044016020604051808303815f875af11580156117fe573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611639919061426d565b61182a612846565b6118335f613188565b565b6060815167ffffffffffffffff81111561185157611851613a4a565b60405190808252806020026020018201604052801561188a57816020015b6118776137ec565b81526020019060019003908161186f5790505b5090505f5b8251811015611a27575f8382815181106118ab576118ab61422a565b6020908102919091018101515f818152600583526040808220815160e08101835281546001600160a01b031681528251610100810190935293955091938301906001830160088282826020028201915b8154815260200190600101908083116118fb575050505050815260200160098201548152602001600a8201548152602001600b8201548152602001600c8201548152602001600d820180548060200260200160405190810160405280929190818152602001828054801561198c57602002820191905f5260205f20905b815481526020019060010190808311611978575b50505050508152505090505f6119a183612909565b915050604051806080016040528084815260200160045f855f01516001600160a01b03166001600160a01b031681526020019081526020015f205f015481526020018381526020018284606001516119f99190614204565b815250858581518110611a0e57611a0e61422a565b602002602001018190525050505080600101905061188f565b50919050565b604080518082019091525f8152606060208201526001600160a01b0382165f90815260046020908152604091829020825180840184528154815260018201805485518186028101860190965280865291949293858101939290830182828015611ab357602002820191905f5260205f20905b815481526020019060010190808311611a9f575b5050505050815250509050919050565b611acb612846565b805f03611b245760405162461bcd60e51b815260206004820152602160248201527f4d6178206f6e2072616d7020616d6f756e742063616e6e6f74206265207a65726044820152606f60f81b60648201526084016108b2565b60098190556040518181527fcab6b49ca21dd111cf4a55d507bbe89dd12d69216e28247060d4b2163ca41b399060200161087c565b335f90815260046020526040902054611b845760405162461bcd60e51b81526004016108b2906141b9565b335f90815260046020526040902060010154600511611be55760405162461bcd60e51b815260206004820152601e60248201527f4d6178696d756d206465706f73697420616d6f756e742072656163686564000060448201526064016108b2565b600854821015611c565760405162461bcd60e51b815260206004820152603660248201527f4465706f73697420616d6f756e74206d757374206265206772656174657220746044820152751a185b881b5a5b8819195c1bdcda5d08185b5bdd5b9d60521b60648201526084016108b2565b5f8111611cb35760405162461bcd60e51b815260206004820152602560248201527f5265636569766520616d6f756e74206d75737420626520677265617465722074604482015264068616e20360dc1b60648201526084016108b2565b5f81611cc7670de0b6b3a76400008561428c565b611cd191906142b7565b600e80549192505f919082611ce5836142ca565b90915550335f81815260046020908152604080832060018082018054808301825590865284862001879055825160e0810184529586528584018c81528684018c9052606087018c90526080870186905260a087018a90528351868152808601855260c0880152878652600590945291909320845181546001600160a01b0319166001600160a01b03909116178155915194955091939091611d8b91908301906008613816565b50604082015160098201556060820151600a8201556080820151600b82015560a0820151600c82015560c08201518051611dcf91600d840191602090910190613854565b50506040516323b872dd60e01b8152336004820152306024820152604481018790527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031691506323b872dd906064016020604051808303815f875af1158015611e42573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e66919061426d565b508054604080518781526020810186905284917f36b046df2c296f2a5a78570d5e52a92773cbb616825b1af59a49a4d02df2b109910160405180910390a3505050505050565b335f90815260046020526040902054611ed75760405162461bcd60e51b81526004016108b2906141b9565b335f908152600460209081526040808320548084526003808452828520868652019092529091205460ff16611f455760405162461bcd60e51b8152602060048201526014602482015273155cd95c881b9bdd081bdb8819195b9e5b1a5cdd60621b60448201526064016108b2565b5f8181526003602081815260408084208685528084018352908420805460ff191690559284905252611f7a90600201836131d7565b60408051828152602081018490527f8935205b1b382095d2d95efbb36f81a11a34c548d45af26adc1a02d2f2bb546f91016109aa565b611fb861388c565b5f82815260056020908152604091829020825160e08101845281546001600160a01b03168152835161010081019485905290939192840191600184019060089082845b815481526020019060010190808311611ffb575050505050815260200160098201548152602001600a8201548152602001600b8201548152602001600c8201548152602001600d8201805480602002602001604051908101604052809291908181526020018280548015611ab357602002820191905f5260205f2090815481526020019060010190808311611a9f575050505050815250509050919050565b6120a2612846565b6001600160a01b0381166121045760405162461bcd60e51b8152602060048201526024808201527f46656520726563697069656e742063616e6e6f74206265207a65726f206164646044820152637265737360e01b60648201526084016108b2565b600d80546001600160a01b0319166001600160a01b0383169081179091556040519081527f594ad6ee98bfc0c73e6d15fd4e762502f359e05d26907b7fa1ff82eb5e99f6e49060200161087c565b335f90815260046020526040902054156121bd5760405162461bcd60e51b815260206004820152602660248201527f4163636f756e7420616c7265616479206173736f6369617465642077697468206044820152650d2c890c2e6d60d31b60648201526084016108b2565b5f6121ca858585856132f6565b335f818152600460205260408082208490555192935083927f672144042732f7b1cdbf0772464ae545aedd7f41d38b8487dafd9085496a5d519190a35050505050565b5f818152600760209081526040808320815160a08101835281546001600160a01b039081168252600183015416938101939093526002810154918301919091526003810154606083015260040154608082018190529091036122815760405162461bcd60e51b81526004016108b29061423e565b335f908152600460205260408082205483516001600160a01b03168352912054146122ee5760405162461bcd60e51b815260206004820152601c60248201527f53656e646572206d75737420626520746865206f6e2d72616d7065720000000060448201526064016108b2565b6040808201515f9081526005602052206123088184612dfa565b816060015181600a015f82825461231f9190614204565b90915550506060820151600b820180545f9061233c908490614217565b9091555050505050565b60605f8267ffffffffffffffff81111561236257612362613a4a565b60405190808252806020026020018201604052801561239b57816020015b6123886138d3565b8152602001906001900390816123805790505b5090505f5b83811015612493575f8585838181106123bb576123bb61422a565b602090810292909201355f81815260078452604090819020815160a08101835281546001600160a01b039081168252600183015416958101959095526002810154858301526003810154606080870191909152600490910154608086015281519081019091529093509050808888868181106124395761243961422a565b6020908102929092013583525081810184905283516001600160a01b03165f908152600490915260409081902054910152845185908590811061247e5761247e61422a565b602090810291909101015250506001016123a0565b5090505b92915050565b6124a5612846565b600180546001600160a01b0319166001600160a01b0383169081179091556040519081527f73d3ac111d5926fbfd68ade03832f0b1a4daef0cd0effc1fa0829264bcc57c419060200161087c565b6124fb612846565b6001600160a01b0381166125605760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016108b2565b61256981613188565b50565b335f908152600460205260409020546125975760405162461bcd60e51b81526004016108b2906141b9565b5f6125d78786868080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061339292505050565b90505f6126198787878080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061339292505050565b9050633b9aca005f61262b60016133a6565b600e80549192505f91908261263f836142ca565b9190505590505f60045f336001600160a01b03166001600160a01b031681526020019081526020015f2090508060010182908060018154018082558091505060019003905f5260205f20015f90919091909150556040518060e00160405280336001600160a01b031681526020018e81526020018781526020018781526020016126c85f6133a6565b81526020808201869052604080515f80825281840183529382015285835260068252909120825181546001600160a01b0319166001600160a01b039091161781559082015161271d9060018301906008613816565b50604082015160098201556060820151600a8201556080820151600b82015560a0820151600c82015560c0820151805161276191600d840191602090910190613854565b509050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316639a09435233308f8e8e6040518663ffffffff1660e01b81526004016127b99594939291906142e2565b6020604051808303815f875af11580156127d5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906127f9919061426d565b508054604080518881526020810186905284917f9ec9ac5dfd03d0cd2bccc0fab8292cc7193382480f66a4b462607e781621ae55910160405180910390a350505050505050505050505050565b5f546001600160a01b031633146118335760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108b2565b60408051602081018490529081018290524260608201525f90819060800160408051601f19818403018152919052805160209091012090506129017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000182614334565b949350505050565b5f818152600560209081526040808320600d01805482518185028101850190935280835260609493849392919083018282801561296357602002820191905f5260205f20905b81548152602001906001019080831161294f575b50505050509050805167ffffffffffffffff81111561298457612984613a4a565b6040519080825280602002602001820160405280156129ad578160200160208202803683370190505b5092505f5b8151811015612a9b575f60075f8484815181106129d1576129d161422a565b60209081029190910181015182528181019290925260409081015f20815160a08101835281546001600160a01b03908116825260018301541693810193909352600281015491830191909152600381015460608301526004015460808201819052600b549192504291612a4391614204565b1015612a9257828281518110612a5b57612a5b61422a565b6020026020010151858381518110612a7557612a7561422a565b60209081029190910101526060810151612a8f9085614204565b93505b506001016129b2565b5050915091565b5f5b8151811015611639575f801b828281518110612ac257612ac261422a565b602002602001015114612af257612af283838381518110612ae557612ae561422a565b6020026020010151612dfa565b600101612aa4565b612b026138f9565b600254604080516080810182528781526020810187905280820186905260608101859052905163bf93fde160e01b81525f928392839283928392839283926001600160a01b03169163bf93fde191612b5d9190600401614396565b60a0604051808303815f875af1158015612b79573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612b9d9190614403565b5f818152600760209081526040808320815160a08101835281546001600160a01b03908116825260018301548116828601526002830154828501819052600384015460608401526004909301546080830152918552600590935292208151979c50959a509398509196509450909216612c285760405162461bcd60e51b81526004016108b29061423e565b8582608001511115612c875760405162461bcd60e51b815260206004820152602260248201527f496e74656e7420776173206e6f742063726561746564206265666f72652073656044820152611b9960f21b60648201526084016108b2565b604080516101008101918290528691612cc39190600185019060089082845b815481526020019060010190808311612ca65750505050506133b2565b14612d105760405162461bcd60e51b815260206004820152601b60248201527f4f666672616d70657220696420646f6573206e6f74206d61746368000000000060448201526064016108b2565b81516001600160a01b03165f908152600460205260409020548414612d775760405162461bcd60e51b815260206004820152601a60248201527f4f6e72616d70657220696420646f6573206e6f74206d6174636800000000000060448201526064016108b2565b80600c0154670de0b6b3a76400008360600151612d94919061428c565b612d9e91906142b7565b871015612de65760405162461bcd60e51b81526020600482015260166024820152750a0c2f2dacadce840eec2e640dcdee840cadcdeeaced60531b60448201526064016108b2565b909d909c50909a5098505050505050505050565b5f818152600760208181526040808420815160a08101835281546001600160a01b039081168083526001840180549092168387015260028401805484870152600380860180546060870152600480880180546080890152948c528952878b20548b529088529589208990558989529690955282546001600160a01b031990811690935580549092169091559284905583905591909155612e9d600d8401836131d7565b604080820151905183907fe8a865b4bab023c399cbd1f2cdd0df2199beb6e5012a4bd2d7691cf7e4199d5a905f90a3505050565b5f81600a015482600b0154612ee69190614204565b9050805f036116395781546001600160a01b03165f908152600460205260409020612f149060010184613533565b8154604080518581526001600160a01b0390921660208301527f8ac07cc6e38c6222dd0309c80353c1962354bacf222b825d7401cc80e93ff3cc910160405180910390a15f83815260056020526040812080546001600160a01b031916815590612f816001830182613935565b600982015f9055600a82015f9055600b82015f9055600c82015f9055600d82015f612fac9190613944565b5050505050565b5f600c545f1461307a57670de0b6b3a7640000600c548360600151612fd8919061428c565b612fe291906142b7565b600d5460405163a9059cbb60e01b81526001600160a01b039182166004820152602481018390529192507f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906044016020604051808303815f875af1158015613054573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613078919061426d565b505b5f81836060015161308b9190614217565b602084015160405163a9059cbb60e01b81526001600160a01b039182166004820152602481018390529192507f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906044016020604051808303815f875af11580156130ff573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613123919061426d565b50825160408085015160208087015183516001600160a01b03918216815291820186905292810186905291909216919086907ffa03438194e61c243c6bb5349f1e1dc674431b86f119b5e3b2b327bc43446bce9060600160405180910390a450505050565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f806132308480548060200260200160405190810160405280929190818152602001828054801561322557602002820191905f5260205f20905b815481526020019060010190808311613211575b5050505050846135d5565b91509150806132795760405162461bcd60e51b8152602060048201526015602482015274313cba32b99999103737ba1034b71030b93930bc9760591b60448201526064016108b2565b83545f9061328990600190614217565b90508083146132cb578481815481106132a4576132a461422a565b905f5260205f2001548584815481106132bf576132bf61422a565b5f918252602090912001555b848054806132db576132db61443f565b600190038181905f5260205f20015f90559055505b50505050565b6001546040805160808101825286815260208101869052808201859052606081018490529051630be4767960e11b81525f9283926001600160a01b03909116916317c8ecf29161334891600401614453565b6020604051808303815f875af1158015613364573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061338891906144b6565b9695505050505050565b5f61339f8383600461362b565b9392505050565b5f61249782600461371e565b5f6133bb61395f565b6133c361397d565b5f5b6006811015613404578481600881106133e0576133e061422a565b60200201518382600681106133f7576133f761422a565b60200201526001016133c5565b50604051631eb694f160e31b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063f5b4a788906134519085906004016144cd565b602060405180830381865afa15801561346c573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061349091906144b6565b815260c0840151602082015260e0840151604080830191909152516304b98e1d60e31b81527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906325cc70e8906134f49084906004016144fd565b602060405180830381865afa15801561350f573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061290191906144b6565b5f8061358c8480548060200260200160405190810160405280929190818152602001828054801561358157602002820191905f5260205f20905b81548152602001906001019080831161356d575b5050505050846137a7565b91509150806132795760405162461bcd60e51b81526020600482015260156024820152743ab4b73a191a9b103737ba1034b71030b93930bc9760591b60448201526064016108b2565b81515f908190815b8181101561361a57848682815181106135f8576135f861422a565b602002602001015103613612579250600191506136249050565b6001016135dd565b505f195f92509250505b9250929050565b6040516302e817ff60e41b81525f907305fd9b5efe0a996095f42ed7e77c390810cf660c90632e817ff09061366e9087903390889060f889901b90600401614524565b6020604051808303815f875af115801561368a573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906136ae91906144b6565b6040516346ce4e4960e11b815260048101829052336024820152909150732fb4341027eb1d2ad8b5d9708187df8633cafa9290638d9c9c92906044015f604051808303815f87803b158015613701575f80fd5b505af1158015613713573d5f803e3d5ffd5b505050509392505050565b604051631ce2e8d760e31b8152600481018390526001600160f81b031960f883901b1660248201525f907305fd9b5efe0a996095f42ed7e77c390810cf660c9063e71746b8906044016020604051808303815f875af1158015613783573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061339f91906144b6565b81515f908190815b8181101561361a57848682815181106137ca576137ca61422a565b6020026020010151036137e4579250600191506136249050565b6001016137af565b604080516080810182525f808252602082015290810161380a61388c565b81526020015f81525090565b8260088101928215613844579160200282015b82811115613844578251825591602001919060010190613829565b5061385092915061399b565b5090565b828054828255905f5260205f209081019282156138445791602002820182811115613844578251825591602001919060010190613829565b6040518060e001604052805f6001600160a01b031681526020016138ae6139af565b81526020015f81526020015f81526020015f81526020015f8152602001606081525090565b60408051606081019091525f8152602081016138ed6138f9565b81525f60209091015290565b6040518060a001604052805f6001600160a01b031681526020015f6001600160a01b031681526020015f81526020015f81526020015f81525090565b5061256990600881019061399b565b5080545f8255905f5260205f2090810190612569919061399b565b6040518060c001604052806006906020820280368337509192915050565b60405180606001604052806003906020820280368337509192915050565b5b80821115613850575f815560010161399c565b6040518061010001604052806008906020820280368337509192915050565b6001600160a01b0381168114612569575f80fd5b5f602082840312156139f2575f80fd5b813561339f816139ce565b5f60208284031215613a0d575f80fd5b5035919050565b5f805f60608486031215613a26575f80fd5b83359250602084013591506040840135613a3f816139ce565b809150509250925092565b634e487b7160e01b5f52604160045260245ffd5b6040805190810167ffffffffffffffff81118282101715613a8157613a81613a4a565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715613ab057613ab0613a4a565b604052919050565b5f82601f830112613ac7575f80fd5b613acf613a5e565b806040840185811115613ae0575f80fd5b845b81811015613afa578035845260209384019301613ae2565b509095945050505050565b5f82601f830112613b14575f80fd5b613b1c613a5e565b806080840185811115613b2d575f80fd5b845b81811015613afa57613b418782613ab8565b8452602090930192604001613b2f565b5f805f806102e0808688031215613b66575f80fd5b613b708787613ab8565b9450613b7f8760408801613b05565b9350613b8e8760c08801613ab8565b92508661011f870112613b9f575f80fd5b6040516101e0810181811067ffffffffffffffff82111715613bc357613bc3613a4a565b604052908601908088831115613bd7575f80fd5b61010088015b83811015613bf5578035825260209182019101613bdd565b5050809250505092959194509250565b602080825282518282018190525f9190848201906040850190845b81811015613c3c57835183529284019291840191600101613c20565b50909695505050505050565b5f8060408385031215613c59575f80fd5b8235613c64816139ce565b91506020830135613c74816139ce565b809150509250929050565b5f815180845260208085019450602084015f5b83811015613cae57815187529582019590820190600101613c92565b509495945050505050565b80516001600160a01b031682526020808201515f916101c091818601845b6008811015613cf457825182529183019190830190600101613cd7565b5050505060408301516101208501526060830151610140850152608083015161016085015260a083015161018085015260c0830151816101a0860152613d3c82860182613c7f565b95945050505050565b5f60208083018184528085518083526040925060408601915060408160051b8701018488015f5b83811015613dc357603f1989840301855281516080815185528882015189860152878201518189870152613da282870182613cb9565b60609384015196909301959095525094870194925090860190600101613d6c565b509098975050505050505050565b5f6020808385031215613de2575f80fd5b823567ffffffffffffffff80821115613df9575f80fd5b818501915085601f830112613e0c575f80fd5b813581811115613e1e57613e1e613a4a565b8060051b9150613e2f848301613a87565b8181529183018401918481019088841115613e48575f80fd5b938501935b83851015613e6657843582529385019390850190613e4d565b98975050505050505050565b6020808252825182820152828101516040808401528051606084018190525f9291820190839060808601905b80831015613ebe5783518252928401926001929092019190840190613e9e565b509695505050505050565b5f82601f830112613ed8575f80fd5b60405161010080820182811067ffffffffffffffff82111715613efd57613efd613a4a565b60405283018185821115613f0f575f80fd5b845b82811015613f29578035825260209182019101613f11565b509195945050505050565b5f805f6101408486031215613f47575f80fd5b613f518585613ec9565b956101008501359550610120909401359392505050565b602081525f61339f6020830184613cb9565b5f805f806101a0808688031215613f8f575f80fd5b613f998787613ab8565b9450613fa88760408801613b05565b9350613fb78760c08801613ab8565b92508661011f870112613fc8575f80fd5b60405160a0810181811067ffffffffffffffff82111715613bc357613bc3613a4a565b5f8060208385031215613ffc575f80fd5b823567ffffffffffffffff80821115614013575f80fd5b818501915085601f830112614026575f80fd5b813581811115614034575f80fd5b8660208260051b8501011115614048575f80fd5b60209290920196919550909350505050565b602080825282518282018190525f919060409081850190868401855b828110156140dc578151805185528681015180516001600160a01b039081168988015281890151168787015286810151606080880191909152810151608080880191909152015160a086015285015160c085015260e09093019290850190600101614076565b5091979650505050505050565b5f805f805f805f6101a0888a031215614100575f80fd5b61410a8989613ec9565b96506101008801359550610120880135945061014088013567ffffffffffffffff80821115614137575f80fd5b818a0191508a601f83011261414a575f80fd5b813581811115614158575f80fd5b8b6020828501011115614169575f80fd5b989b979a5095986020919091019796610160820135965061018090910135945092505050565b5f80604083850312156141a0575f80fd5b82356141ab816139ce565b946020939093013593505050565b6020808252601e908201527f43616c6c6572206d757374206265207265676973746572656420757365720000604082015260600190565b634e487b7160e01b5f52601160045260245ffd5b80820180821115612497576124976141f0565b81810381811115612497576124976141f0565b634e487b7160e01b5f52603260045260245ffd5b602080825260159082015274125b9d195b9d08191bd95cc81b9bdd08195e1a5cdd605a1b604082015260600190565b5f6020828403121561427d575f80fd5b8151801515811461339f575f80fd5b8082028115828204841417612497576124976141f0565b634e487b7160e01b5f52601260045260245ffd5b5f826142c5576142c56142a3565b500490565b5f600182016142db576142db6141f0565b5060010190565b6001600160a01b038681168252851660208201526040810184905260806060820181905281018290525f828460a08401375f60a0848401015260a0601f19601f85011683010190509695505050505050565b5f82614342576143426142a3565b500690565b805f5b60028110156132f057815184526020938401939091019060010161434a565b805f5b60028110156132f057614380848351614347565b604093909301926020919091019060010161436c565b5f6102e0820190506143a9828451614347565b6020808401516143bc6040850182614369565b5060408401516143cf60c0850182614347565b50606084015161010084015f5b600f8110156143f9578251825291830191908301906001016143dc565b5050505092915050565b5f805f805f60a08688031215614417575f80fd5b5050835160208501516040860151606087015160809097015192989197509594509092509050565b634e487b7160e01b5f52603160045260245ffd5b5f6101a082019050614466828451614347565b6020808401516144796040850182614369565b50604084015161448c60c0850182614347565b50606084015161010084015f5b60058110156143f957825182529183019190830190600101614499565b5f602082840312156144c6575f80fd5b5051919050565b60c0810181835f5b60068110156144f45781518352602092830192909101906001016144d5565b50505092915050565b6060810181835f5b60038110156144f4578151835260209283019290910190600101614505565b8481525f602060018060a01b03861660208401526080604084015284518060808501525f5b818110156145655786810183015185820160a001528201614549565b505f60a0828601015260a0601f19601f8301168501019250505060ff60f81b831660608301529594505050505056fea2646970667358221220926106a0d46788a089c6e9fb8e309b47b7e48677db255486f6ea7517ec87434364736f6c63430008180033", + "deployedBytecode": "0x608060405234801561000f575f80fd5b5060043610610297575f3560e01c80637b510fe811610161578063ce523ca3116100ca578063ecd618f011610084578063ecd618f014610778578063ed1692b814610798578063eea1d197146107ab578063f2fde38b146107be578063f8a41987146107d1578063fbf15b1f146107e4575f80fd5b8063ce523ca31461071a578063d55f960d1461072d578063d9478d2014610740578063e215ad5914610753578063e279d96414610766578063ecb3dc881461076f575f80fd5b80639b357b5a1161011b5780639b357b5a1461065e5780639f9fb96814610671578063a1a954b714610691578063b02c43d01461069a578063b3fa4c01146106e0578063cce3e038146106f3575f80fd5b80637b510fe81461051557806389de3063146105355780638da5cb5b146105ad5780639021578a146105bd5780639087beff14610638578063985ade151461064b575f80fd5b806342987349116102035780635dd76515116101bd5780635dd76515146104b8578063645006ca146104cb57806366ec8419146104d457806371134762146104e7578063715018a6146104fa57806371a28f6914610502575f80fd5b806342987349146104225780634595bba014610435578063485cc95514610455578063495223e7146104685780635081d9521461047157806353acdbd914610491575f80fd5b8063317dcc9611610254578063317dcc961461035f578063392e53cd146103725780633930a439146103965780633adba28a146103d55780633e413bee146103e85780633f838d0d1461040f575f80fd5b80630f1ef98c1461029b578063133de6cb146102e6578063148172da146102fb57806314ec32fa1461030e578063238c8494146103435780632a80cda31461034c575b5f80fd5b6102d36102a93660046139e2565b6001600160a01b03165f908152600460209081526040808320548352600390915290206001015490565b6040519081526020015b60405180910390f35b6102f96102f43660046139e2565b61082a565b005b6102f96103093660046139fd565b610887565b6102d361031c3660046139e2565b6001600160a01b03165f908152600460209081526040808320548352600390915290205490565b6102d3600c5481565b6102f961035a3660046139fd565b6109b6565b6102f961036d3660046139fd565b610a42565b60025461038690600160a01b900460ff1681565b60405190151581526020016102dd565b6103bd7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016102dd565b6102f96103e3366004613a14565b610a7f565b6103bd7f000000000000000000000000000000000000000000000000000000000000000081565b6102f961041d366004613b51565b610fc8565b6102f96104303660046139fd565b611051565b6104486104433660046139e2565b6110f1565b6040516102dd9190613c05565b6102f9610463366004613c48565b611167565b6102d3600a5481565b61048461047f3660046139e2565b6111fa565b6040516102dd9190613d45565b6103bd7f000000000000000000000000000000000000000000000000000000000000000081565b6102f96104c63660046139fd565b611457565b6102d360085481565b6102f96104e23660046139fd565b6114f6565b6102f96104f5366004613dd1565b61163e565b6102f9611822565b610484610510366004613dd1565b611835565b6105286105233660046139e2565b611a2d565b6040516102dd9190613e72565b61057b6105433660046139fd565b60066020525f9081526040902080546009820154600a830154600b840154600c909401546001600160a01b0390931693919290919085565b604080516001600160a01b0390961686526020860194909452928401919091526060830152608082015260a0016102dd565b5f546001600160a01b03166103bd565b6106056105cb3660046139fd565b60076020525f9081526040902080546001820154600283015460038401546004909401546001600160a01b03938416949390921692909185565b604080516001600160a01b039687168152959094166020860152928401919091526060830152608082015260a0016102dd565b6102f96106463660046139fd565b611ac3565b6102f9610659366004613f34565b611b59565b6102f961066c3660046139fd565b611eac565b61068461067f3660046139fd565b611fb0565b6040516102dd9190613f68565b6102d3600b5481565b61057b6106a83660046139fd565b60056020525f9081526040902080546009820154600a830154600b840154600c909401546001600160a01b0390931693919290919085565b6102f96106ee3660046139e2565b61209a565b6103bd7f000000000000000000000000000000000000000000000000000000000000000081565b6102f9610728366004613f7a565b612152565b6102f961073b3660046139fd565b61220d565b600d546103bd906001600160a01b031681565b6001546103bd906001600160a01b031681565b6102d360095481565b6102d3600e5481565b61078b610786366004613feb565b612346565b6040516102dd919061405a565b6102f96107a63660046139e2565b61249d565b6002546103bd906001600160a01b031681565b6102f96107cc3660046139e2565b6124f3565b6102f96107df3660046140e9565b61256c565b6103866107f236600461418f565b6001600160a01b0382165f90815260046020908152604080832054835260038083528184208585520190915290205460ff1692915050565b610832612846565b600280546001600160a01b0319166001600160a01b0383169081179091556040519081527f6e7665a41605edc0d70f4b991d652755f380754eb092d81ef9ab93664778d59e906020015b60405180910390a150565b335f908152600460205260409020546108bb5760405162461bcd60e51b81526004016108b2906141b9565b60405180910390fd5b335f908152600460209081526040808320548084526003808452828520868652019092529091205460ff16156109335760405162461bcd60e51b815260206004820152601860248201527f5573657220616c7265616479206f6e2064656e796c697374000000000000000060448201526064016108b2565b5f8181526003602081815260408084208685528084018352818520805460ff19166001908117909155938352600201805493840181558452922001839055517f976c693d56f27ba17d902bda80c4fa0416b773fbf268bcb0ee71689234d769ee906109aa9083908590918252602082015260400190565b60405180910390a15050565b6109be612846565b805f03610a0d5760405162461bcd60e51b815260206004820152601e60248201527f4d696e696d756d206465706f7369742063616e6e6f74206265207a65726f000060448201526064016108b2565b60088190556040518181527fbdde72a6d8d8b42770c9899945ccdce09d0c5c794d3326cdb2d2cca61b12a9fc9060200161087c565b610a4a612846565b600a8190556040518181527f88397975d177ce5e18abf3a5fdb8de773e80673d85eeb54f48cfaf688b3d2c3e9060200161087c565b335f90815260046020526040902054610aaa5760405162461bcd60e51b81526004016108b2906141b9565b335f908152600460208181526040808420548785526005835281852080546001600160a01b031686529383528185205480865260038085528387208388520190935293205460ff1615610b3f5760405162461bcd60e51b815260206004820181905260248201527f4f6e72616d706572206f6e206465706f7369746f7227732064656e796c69737460448201526064016108b2565b600a545f848152600360205260409020600101544291610b5e91614204565b1115610bb85760405162461bcd60e51b8152602060048201526024808201527f4f6e2072616d7020636f6f6c20646f776e20706572696f64206e6f7420656c616044820152631c1cd95960e21b60648201526084016108b2565b5f8381526003602052604090205415610c135760405162461bcd60e51b815260206004820152601860248201527f496e74656e74207374696c6c206f75747374616e64696e67000000000000000060448201526064016108b2565b828103610c625760405162461bcd60e51b815260206004820152601e60248201527f53656e6465722063616e6e6f7420626520746865206465706f7369746f72000060448201526064016108b2565b81546001600160a01b0316610cb25760405162461bcd60e51b815260206004820152601660248201527511195c1bdcda5d08191bd95cc81b9bdd08195e1a5cdd60521b60448201526064016108b2565b5f8511610d105760405162461bcd60e51b815260206004820152602660248201527f5369676e616c656420616d6f756e74206d75737420626520677265617465722060448201526507468616e20360d41b60648201526084016108b2565b600954851115610d7f5760405162461bcd60e51b815260206004820152603460248201527f5369676e616c656420616d6f756e74206d757374206265206c657373207468616044820152731b881b585e081bdb8b5c985b5c08185b5bdd5b9d60621b60648201526084016108b2565b6001600160a01b038416610dd55760405162461bcd60e51b815260206004820152601b60248201527f43616e6e6f742073656e6420746f207a65726f2061646472657373000000000060448201526064016108b2565b5f610de0848861289f565b90508583600a01541015610e92575f80610df989612909565b91509150878186600a0154610e0e9190614204565b1015610e535760405162461bcd60e51b81526020600482015260146024820152734e6f7420656e6f756768206c697175696469747960601b60448201526064016108b2565b610e5d8583612aa2565b8085600a015f828254610e709190614204565b925050819055508085600b015f828254610e8a9190614217565b909155505050505b6040805160a0810182523381526001600160a01b0387811660208084019182528385018c8152606085018c815242608087019081525f89815260078552888120975188549088166001600160a01b0319918216178955955160018901805491909816961695909517909555905160028601555160038086019190915592516004909401939093558781529152908120829055600a84018054889290610f38908490614217565b925050819055508583600b015f828254610f529190614204565b9091555050600d830180546001810182555f91825260209182902001829055604080516001600160a01b038816815291820188905242908201528490889083907f1a1292e170a0f000ccf956afba79bee0f9ec1d81f3f901c1d4d11e1f336aae109060600160405180910390a450505050505050565b5f805f610fd787878787612afa565b925092509250610fe78282612dfa565b826060015182600b015f828254610ffe9190614217565b909155505082516001600160a01b03165f9081526004602090815260408083205483526003909152908190204260019091015583015161103e9083612ed1565b6110488184612fb3565b50505050505050565b611059612846565b805f036110bc5760405162461bcd60e51b815260206004820152602b60248201527f4d617820696e74656e742065787069726174696f6e20706572696f642063616e60448201526a6e6f74206265207a65726f60a81b60648201526084016108b2565b600b8190556040518181527f55e3f6b95de9a0ec782f892e93fafe4e56be0696df204ddf8e0a40a9a713a8039060200161087c565b6001600160a01b0381165f908152600460209081526040808320548352600382529182902060020180548351818402810184019094528084526060939283018282801561115b57602002820191905f5260205f20905b815481526020019060010190808311611147575b50505050509050919050565b61116f612846565b600254600160a01b900460ff16156111bf5760405162461bcd60e51b8152602060048201526013602482015272105b1c9958591e481a5b9a5d1a585b1a5e9959606a1b60448201526064016108b2565b600180546001600160a01b039384166001600160a01b0319909116179055600280546001600160a81b0319169190921617600160a01b179055565b6001600160a01b0381165f90815260046020908152604080832060010180548251818502810185019093528083526060949383018282801561125957602002820191905f5260205f20905b815481526020019060010190808311611245575b50505050509050805167ffffffffffffffff81111561127a5761127a613a4a565b6040519080825280602002602001820160405280156112b357816020015b6112a06137ec565b8152602001906001900390816112985790505b5091505f5b8151811015611450575f8282815181106112d4576112d461422a565b6020908102919091018101515f818152600583526040808220815160e08101835281546001600160a01b031681528251610100810190935293955091938301906001830160088282826020028201915b815481526020019060010190808311611324575050505050815260200160098201548152602001600a8201548152602001600b8201548152602001600c8201548152602001600d82018054806020026020016040519081016040528092919081815260200182805480156113b557602002820191905f5260205f20905b8154815260200190600101908083116113a1575b50505050508152505090505f6113ca83612909565b915050604051806080016040528084815260200160045f855f01516001600160a01b03166001600160a01b031681526020019081526020015f205f015481526020018381526020018284606001516114229190614204565b8152508685815181106114375761143761422a565b60200260200101819052505050508060010190506112b8565b5050919050565b61145f612846565b66b1a2bc2ec500008111156114c15760405162461bcd60e51b815260206004820152602260248201527f4665652063616e6e6f742062652067726561746572207468616e206d61782066604482015261656560f01b60648201526084016108b2565b600c8190556040518181527f44f48e1b871e6db1e909a7b253b054b7150a0b4ddf4d59b159c827d82e7256709060200161087c565b5f818152600760209081526040808320815160a08101835281546001600160a01b0390811682526001830154811682860152600283015482850181905260038401546060840152600490930154608083015291855260059093529220815191929091166115755760405162461bcd60e51b81526004016108b29061423e565b80546001600160a01b031633146115ce5760405162461bcd60e51b815260206004820152601c60248201527f43616c6c6572206d75737420626520746865206465706f7369746f720000000060448201526064016108b2565b6115d88184612dfa565b816060015181600b015f8282546115ef9190614217565b909155505081516001600160a01b03165f9081526004602090815260408083205483526003909152908190204260019091015582015161162f9082612ed1565b6116398383612fb3565b505050565b5f805b8251811015611793575f83828151811061165d5761165d61422a565b6020908102919091018101515f818152600590925260409091208054919250906001600160a01b031633146116d45760405162461bcd60e51b815260206004820152601c60248201527f53656e646572206d75737420626520746865206465706f7369746f720000000060448201526064016108b2565b5f806116df84612909565b915091506116ed8383612aa2565b8083600a01546116fd9190614204565b6117079087614204565b95508083600b015f82825461171c9190614217565b90915550508254600a8401546001600160a01b039091169085907fae1f357660ab777dcfd38c0ab6357834684ec26289ecfa07ec65dbf6c3c6431290611763908590614204565b60405190815260200160405180910390a35f600a8401556117848484612ed1565b50505050806001019050611641565b5060405163a9059cbb60e01b8152336004820152602481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063a9059cbb906044016020604051808303815f875af11580156117fe573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611639919061426d565b61182a612846565b6118335f613188565b565b6060815167ffffffffffffffff81111561185157611851613a4a565b60405190808252806020026020018201604052801561188a57816020015b6118776137ec565b81526020019060019003908161186f5790505b5090505f5b8251811015611a27575f8382815181106118ab576118ab61422a565b6020908102919091018101515f818152600583526040808220815160e08101835281546001600160a01b031681528251610100810190935293955091938301906001830160088282826020028201915b8154815260200190600101908083116118fb575050505050815260200160098201548152602001600a8201548152602001600b8201548152602001600c8201548152602001600d820180548060200260200160405190810160405280929190818152602001828054801561198c57602002820191905f5260205f20905b815481526020019060010190808311611978575b50505050508152505090505f6119a183612909565b915050604051806080016040528084815260200160045f855f01516001600160a01b03166001600160a01b031681526020019081526020015f205f015481526020018381526020018284606001516119f99190614204565b815250858581518110611a0e57611a0e61422a565b602002602001018190525050505080600101905061188f565b50919050565b604080518082019091525f8152606060208201526001600160a01b0382165f90815260046020908152604091829020825180840184528154815260018201805485518186028101860190965280865291949293858101939290830182828015611ab357602002820191905f5260205f20905b815481526020019060010190808311611a9f575b5050505050815250509050919050565b611acb612846565b805f03611b245760405162461bcd60e51b815260206004820152602160248201527f4d6178206f6e2072616d7020616d6f756e742063616e6e6f74206265207a65726044820152606f60f81b60648201526084016108b2565b60098190556040518181527fcab6b49ca21dd111cf4a55d507bbe89dd12d69216e28247060d4b2163ca41b399060200161087c565b335f90815260046020526040902054611b845760405162461bcd60e51b81526004016108b2906141b9565b335f90815260046020526040902060010154600511611be55760405162461bcd60e51b815260206004820152601e60248201527f4d6178696d756d206465706f73697420616d6f756e742072656163686564000060448201526064016108b2565b600854821015611c565760405162461bcd60e51b815260206004820152603660248201527f4465706f73697420616d6f756e74206d757374206265206772656174657220746044820152751a185b881b5a5b8819195c1bdcda5d08185b5bdd5b9d60521b60648201526084016108b2565b5f8111611cb35760405162461bcd60e51b815260206004820152602560248201527f5265636569766520616d6f756e74206d75737420626520677265617465722074604482015264068616e20360dc1b60648201526084016108b2565b5f81611cc7670de0b6b3a76400008561428c565b611cd191906142b7565b600e80549192505f919082611ce5836142ca565b90915550335f81815260046020908152604080832060018082018054808301825590865284862001879055825160e0810184529586528584018c81528684018c9052606087018c90526080870186905260a087018a90528351868152808601855260c0880152878652600590945291909320845181546001600160a01b0319166001600160a01b03909116178155915194955091939091611d8b91908301906008613816565b50604082015160098201556060820151600a8201556080820151600b82015560a0820151600c82015560c08201518051611dcf91600d840191602090910190613854565b50506040516323b872dd60e01b8152336004820152306024820152604481018790527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031691506323b872dd906064016020604051808303815f875af1158015611e42573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e66919061426d565b508054604080518781526020810186905284917f36b046df2c296f2a5a78570d5e52a92773cbb616825b1af59a49a4d02df2b109910160405180910390a3505050505050565b335f90815260046020526040902054611ed75760405162461bcd60e51b81526004016108b2906141b9565b335f908152600460209081526040808320548084526003808452828520868652019092529091205460ff16611f455760405162461bcd60e51b8152602060048201526014602482015273155cd95c881b9bdd081bdb8819195b9e5b1a5cdd60621b60448201526064016108b2565b5f8181526003602081815260408084208685528084018352908420805460ff191690559284905252611f7a90600201836131d7565b60408051828152602081018490527f8935205b1b382095d2d95efbb36f81a11a34c548d45af26adc1a02d2f2bb546f91016109aa565b611fb861388c565b5f82815260056020908152604091829020825160e08101845281546001600160a01b03168152835161010081019485905290939192840191600184019060089082845b815481526020019060010190808311611ffb575050505050815260200160098201548152602001600a8201548152602001600b8201548152602001600c8201548152602001600d8201805480602002602001604051908101604052809291908181526020018280548015611ab357602002820191905f5260205f2090815481526020019060010190808311611a9f575050505050815250509050919050565b6120a2612846565b6001600160a01b0381166121045760405162461bcd60e51b8152602060048201526024808201527f46656520726563697069656e742063616e6e6f74206265207a65726f206164646044820152637265737360e01b60648201526084016108b2565b600d80546001600160a01b0319166001600160a01b0383169081179091556040519081527f594ad6ee98bfc0c73e6d15fd4e762502f359e05d26907b7fa1ff82eb5e99f6e49060200161087c565b335f90815260046020526040902054156121bd5760405162461bcd60e51b815260206004820152602660248201527f4163636f756e7420616c7265616479206173736f6369617465642077697468206044820152650d2c890c2e6d60d31b60648201526084016108b2565b5f6121ca858585856132f6565b335f818152600460205260408082208490555192935083927f672144042732f7b1cdbf0772464ae545aedd7f41d38b8487dafd9085496a5d519190a35050505050565b5f818152600760209081526040808320815160a08101835281546001600160a01b039081168252600183015416938101939093526002810154918301919091526003810154606083015260040154608082018190529091036122815760405162461bcd60e51b81526004016108b29061423e565b335f908152600460205260408082205483516001600160a01b03168352912054146122ee5760405162461bcd60e51b815260206004820152601c60248201527f53656e646572206d75737420626520746865206f6e2d72616d7065720000000060448201526064016108b2565b6040808201515f9081526005602052206123088184612dfa565b816060015181600a015f82825461231f9190614204565b90915550506060820151600b820180545f9061233c908490614217565b9091555050505050565b60605f8267ffffffffffffffff81111561236257612362613a4a565b60405190808252806020026020018201604052801561239b57816020015b6123886138d3565b8152602001906001900390816123805790505b5090505f5b83811015612493575f8585838181106123bb576123bb61422a565b602090810292909201355f81815260078452604090819020815160a08101835281546001600160a01b039081168252600183015416958101959095526002810154858301526003810154606080870191909152600490910154608086015281519081019091529093509050808888868181106124395761243961422a565b6020908102929092013583525081810184905283516001600160a01b03165f908152600490915260409081902054910152845185908590811061247e5761247e61422a565b602090810291909101015250506001016123a0565b5090505b92915050565b6124a5612846565b600180546001600160a01b0319166001600160a01b0383169081179091556040519081527f73d3ac111d5926fbfd68ade03832f0b1a4daef0cd0effc1fa0829264bcc57c419060200161087c565b6124fb612846565b6001600160a01b0381166125605760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016108b2565b61256981613188565b50565b335f908152600460205260409020546125975760405162461bcd60e51b81526004016108b2906141b9565b5f6125d78786868080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061339292505050565b90505f6126198787878080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061339292505050565b9050633b9aca005f61262b60016133a6565b600e80549192505f91908261263f836142ca565b9190505590505f60045f336001600160a01b03166001600160a01b031681526020019081526020015f2090508060010182908060018154018082558091505060019003905f5260205f20015f90919091909150556040518060e00160405280336001600160a01b031681526020018e81526020018781526020018781526020016126c85f6133a6565b81526020808201869052604080515f80825281840183529382015285835260068252909120825181546001600160a01b0319166001600160a01b039091161781559082015161271d9060018301906008613816565b50604082015160098201556060820151600a8201556080820151600b82015560a0820151600c82015560c0820151805161276191600d840191602090910190613854565b509050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316639a09435233308f8e8e6040518663ffffffff1660e01b81526004016127b99594939291906142e2565b6020604051808303815f875af11580156127d5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906127f9919061426d565b508054604080518881526020810186905284917f9ec9ac5dfd03d0cd2bccc0fab8292cc7193382480f66a4b462607e781621ae55910160405180910390a350505050505050505050505050565b5f546001600160a01b031633146118335760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108b2565b60408051602081018490529081018290524260608201525f90819060800160408051601f19818403018152919052805160209091012090506129017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000182614334565b949350505050565b5f818152600560209081526040808320600d01805482518185028101850190935280835260609493849392919083018282801561296357602002820191905f5260205f20905b81548152602001906001019080831161294f575b50505050509050805167ffffffffffffffff81111561298457612984613a4a565b6040519080825280602002602001820160405280156129ad578160200160208202803683370190505b5092505f5b8151811015612a9b575f60075f8484815181106129d1576129d161422a565b60209081029190910181015182528181019290925260409081015f20815160a08101835281546001600160a01b03908116825260018301541693810193909352600281015491830191909152600381015460608301526004015460808201819052600b549192504291612a4391614204565b1015612a9257828281518110612a5b57612a5b61422a565b6020026020010151858381518110612a7557612a7561422a565b60209081029190910101526060810151612a8f9085614204565b93505b506001016129b2565b5050915091565b5f5b8151811015611639575f801b828281518110612ac257612ac261422a565b602002602001015114612af257612af283838381518110612ae557612ae561422a565b6020026020010151612dfa565b600101612aa4565b612b026138f9565b600254604080516080810182528781526020810187905280820186905260608101859052905163bf93fde160e01b81525f928392839283928392839283926001600160a01b03169163bf93fde191612b5d9190600401614396565b60a0604051808303815f875af1158015612b79573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612b9d9190614403565b5f818152600760209081526040808320815160a08101835281546001600160a01b03908116825260018301548116828601526002830154828501819052600384015460608401526004909301546080830152918552600590935292208151979c50959a509398509196509450909216612c285760405162461bcd60e51b81526004016108b29061423e565b8582608001511115612c875760405162461bcd60e51b815260206004820152602260248201527f496e74656e7420776173206e6f742063726561746564206265666f72652073656044820152611b9960f21b60648201526084016108b2565b604080516101008101918290528691612cc39190600185019060089082845b815481526020019060010190808311612ca65750505050506133b2565b14612d105760405162461bcd60e51b815260206004820152601b60248201527f4f666672616d70657220696420646f6573206e6f74206d61746368000000000060448201526064016108b2565b81516001600160a01b03165f908152600460205260409020548414612d775760405162461bcd60e51b815260206004820152601a60248201527f4f6e72616d70657220696420646f6573206e6f74206d6174636800000000000060448201526064016108b2565b80600c0154670de0b6b3a76400008360600151612d94919061428c565b612d9e91906142b7565b871015612de65760405162461bcd60e51b81526020600482015260166024820152750a0c2f2dacadce840eec2e640dcdee840cadcdeeaced60531b60448201526064016108b2565b909d909c50909a5098505050505050505050565b5f818152600760208181526040808420815160a08101835281546001600160a01b039081168083526001840180549092168387015260028401805484870152600380860180546060870152600480880180546080890152948c528952878b20548b529088529589208990558989529690955282546001600160a01b031990811690935580549092169091559284905583905591909155612e9d600d8401836131d7565b604080820151905183907fe8a865b4bab023c399cbd1f2cdd0df2199beb6e5012a4bd2d7691cf7e4199d5a905f90a3505050565b5f81600a015482600b0154612ee69190614204565b9050805f036116395781546001600160a01b03165f908152600460205260409020612f149060010184613533565b8154604080518581526001600160a01b0390921660208301527f8ac07cc6e38c6222dd0309c80353c1962354bacf222b825d7401cc80e93ff3cc910160405180910390a15f83815260056020526040812080546001600160a01b031916815590612f816001830182613935565b600982015f9055600a82015f9055600b82015f9055600c82015f9055600d82015f612fac9190613944565b5050505050565b5f600c545f1461307a57670de0b6b3a7640000600c548360600151612fd8919061428c565b612fe291906142b7565b600d5460405163a9059cbb60e01b81526001600160a01b039182166004820152602481018390529192507f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906044016020604051808303815f875af1158015613054573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613078919061426d565b505b5f81836060015161308b9190614217565b602084015160405163a9059cbb60e01b81526001600160a01b039182166004820152602481018390529192507f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906044016020604051808303815f875af11580156130ff573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613123919061426d565b50825160408085015160208087015183516001600160a01b03918216815291820186905292810186905291909216919086907ffa03438194e61c243c6bb5349f1e1dc674431b86f119b5e3b2b327bc43446bce9060600160405180910390a450505050565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f806132308480548060200260200160405190810160405280929190818152602001828054801561322557602002820191905f5260205f20905b815481526020019060010190808311613211575b5050505050846135d5565b91509150806132795760405162461bcd60e51b8152602060048201526015602482015274313cba32b99999103737ba1034b71030b93930bc9760591b60448201526064016108b2565b83545f9061328990600190614217565b90508083146132cb578481815481106132a4576132a461422a565b905f5260205f2001548584815481106132bf576132bf61422a565b5f918252602090912001555b848054806132db576132db61443f565b600190038181905f5260205f20015f90559055505b50505050565b6001546040805160808101825286815260208101869052808201859052606081018490529051630be4767960e11b81525f9283926001600160a01b03909116916317c8ecf29161334891600401614453565b6020604051808303815f875af1158015613364573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061338891906144b6565b9695505050505050565b5f61339f8383600461362b565b9392505050565b5f61249782600461371e565b5f6133bb61395f565b6133c361397d565b5f5b6006811015613404578481600881106133e0576133e061422a565b60200201518382600681106133f7576133f761422a565b60200201526001016133c5565b50604051631eb694f160e31b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063f5b4a788906134519085906004016144cd565b602060405180830381865afa15801561346c573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061349091906144b6565b815260c0840151602082015260e0840151604080830191909152516304b98e1d60e31b81527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906325cc70e8906134f49084906004016144fd565b602060405180830381865afa15801561350f573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061290191906144b6565b5f8061358c8480548060200260200160405190810160405280929190818152602001828054801561358157602002820191905f5260205f20905b81548152602001906001019080831161356d575b5050505050846137a7565b91509150806132795760405162461bcd60e51b81526020600482015260156024820152743ab4b73a191a9b103737ba1034b71030b93930bc9760591b60448201526064016108b2565b81515f908190815b8181101561361a57848682815181106135f8576135f861422a565b602002602001015103613612579250600191506136249050565b6001016135dd565b505f195f92509250505b9250929050565b6040516302e817ff60e41b81525f907305fd9b5efe0a996095f42ed7e77c390810cf660c90632e817ff09061366e9087903390889060f889901b90600401614524565b6020604051808303815f875af115801561368a573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906136ae91906144b6565b6040516346ce4e4960e11b815260048101829052336024820152909150732fb4341027eb1d2ad8b5d9708187df8633cafa9290638d9c9c92906044015f604051808303815f87803b158015613701575f80fd5b505af1158015613713573d5f803e3d5ffd5b505050509392505050565b604051631ce2e8d760e31b8152600481018390526001600160f81b031960f883901b1660248201525f907305fd9b5efe0a996095f42ed7e77c390810cf660c9063e71746b8906044016020604051808303815f875af1158015613783573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061339f91906144b6565b81515f908190815b8181101561361a57848682815181106137ca576137ca61422a565b6020026020010151036137e4579250600191506136249050565b6001016137af565b604080516080810182525f808252602082015290810161380a61388c565b81526020015f81525090565b8260088101928215613844579160200282015b82811115613844578251825591602001919060010190613829565b5061385092915061399b565b5090565b828054828255905f5260205f209081019282156138445791602002820182811115613844578251825591602001919060010190613829565b6040518060e001604052805f6001600160a01b031681526020016138ae6139af565b81526020015f81526020015f81526020015f81526020015f8152602001606081525090565b60408051606081019091525f8152602081016138ed6138f9565b81525f60209091015290565b6040518060a001604052805f6001600160a01b031681526020015f6001600160a01b031681526020015f81526020015f81526020015f81525090565b5061256990600881019061399b565b5080545f8255905f5260205f2090810190612569919061399b565b6040518060c001604052806006906020820280368337509192915050565b60405180606001604052806003906020820280368337509192915050565b5b80821115613850575f815560010161399c565b6040518061010001604052806008906020820280368337509192915050565b6001600160a01b0381168114612569575f80fd5b5f602082840312156139f2575f80fd5b813561339f816139ce565b5f60208284031215613a0d575f80fd5b5035919050565b5f805f60608486031215613a26575f80fd5b83359250602084013591506040840135613a3f816139ce565b809150509250925092565b634e487b7160e01b5f52604160045260245ffd5b6040805190810167ffffffffffffffff81118282101715613a8157613a81613a4a565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715613ab057613ab0613a4a565b604052919050565b5f82601f830112613ac7575f80fd5b613acf613a5e565b806040840185811115613ae0575f80fd5b845b81811015613afa578035845260209384019301613ae2565b509095945050505050565b5f82601f830112613b14575f80fd5b613b1c613a5e565b806080840185811115613b2d575f80fd5b845b81811015613afa57613b418782613ab8565b8452602090930192604001613b2f565b5f805f806102e0808688031215613b66575f80fd5b613b708787613ab8565b9450613b7f8760408801613b05565b9350613b8e8760c08801613ab8565b92508661011f870112613b9f575f80fd5b6040516101e0810181811067ffffffffffffffff82111715613bc357613bc3613a4a565b604052908601908088831115613bd7575f80fd5b61010088015b83811015613bf5578035825260209182019101613bdd565b5050809250505092959194509250565b602080825282518282018190525f9190848201906040850190845b81811015613c3c57835183529284019291840191600101613c20565b50909695505050505050565b5f8060408385031215613c59575f80fd5b8235613c64816139ce565b91506020830135613c74816139ce565b809150509250929050565b5f815180845260208085019450602084015f5b83811015613cae57815187529582019590820190600101613c92565b509495945050505050565b80516001600160a01b031682526020808201515f916101c091818601845b6008811015613cf457825182529183019190830190600101613cd7565b5050505060408301516101208501526060830151610140850152608083015161016085015260a083015161018085015260c0830151816101a0860152613d3c82860182613c7f565b95945050505050565b5f60208083018184528085518083526040925060408601915060408160051b8701018488015f5b83811015613dc357603f1989840301855281516080815185528882015189860152878201518189870152613da282870182613cb9565b60609384015196909301959095525094870194925090860190600101613d6c565b509098975050505050505050565b5f6020808385031215613de2575f80fd5b823567ffffffffffffffff80821115613df9575f80fd5b818501915085601f830112613e0c575f80fd5b813581811115613e1e57613e1e613a4a565b8060051b9150613e2f848301613a87565b8181529183018401918481019088841115613e48575f80fd5b938501935b83851015613e6657843582529385019390850190613e4d565b98975050505050505050565b6020808252825182820152828101516040808401528051606084018190525f9291820190839060808601905b80831015613ebe5783518252928401926001929092019190840190613e9e565b509695505050505050565b5f82601f830112613ed8575f80fd5b60405161010080820182811067ffffffffffffffff82111715613efd57613efd613a4a565b60405283018185821115613f0f575f80fd5b845b82811015613f29578035825260209182019101613f11565b509195945050505050565b5f805f6101408486031215613f47575f80fd5b613f518585613ec9565b956101008501359550610120909401359392505050565b602081525f61339f6020830184613cb9565b5f805f806101a0808688031215613f8f575f80fd5b613f998787613ab8565b9450613fa88760408801613b05565b9350613fb78760c08801613ab8565b92508661011f870112613fc8575f80fd5b60405160a0810181811067ffffffffffffffff82111715613bc357613bc3613a4a565b5f8060208385031215613ffc575f80fd5b823567ffffffffffffffff80821115614013575f80fd5b818501915085601f830112614026575f80fd5b813581811115614034575f80fd5b8660208260051b8501011115614048575f80fd5b60209290920196919550909350505050565b602080825282518282018190525f919060409081850190868401855b828110156140dc578151805185528681015180516001600160a01b039081168988015281890151168787015286810151606080880191909152810151608080880191909152015160a086015285015160c085015260e09093019290850190600101614076565b5091979650505050505050565b5f805f805f805f6101a0888a031215614100575f80fd5b61410a8989613ec9565b96506101008801359550610120880135945061014088013567ffffffffffffffff80821115614137575f80fd5b818a0191508a601f83011261414a575f80fd5b813581811115614158575f80fd5b8b6020828501011115614169575f80fd5b989b979a5095986020919091019796610160820135965061018090910135945092505050565b5f80604083850312156141a0575f80fd5b82356141ab816139ce565b946020939093013593505050565b6020808252601e908201527f43616c6c6572206d757374206265207265676973746572656420757365720000604082015260600190565b634e487b7160e01b5f52601160045260245ffd5b80820180821115612497576124976141f0565b81810381811115612497576124976141f0565b634e487b7160e01b5f52603260045260245ffd5b602080825260159082015274125b9d195b9d08191bd95cc81b9bdd08195e1a5cdd605a1b604082015260600190565b5f6020828403121561427d575f80fd5b8151801515811461339f575f80fd5b8082028115828204841417612497576124976141f0565b634e487b7160e01b5f52601260045260245ffd5b5f826142c5576142c56142a3565b500490565b5f600182016142db576142db6141f0565b5060010190565b6001600160a01b038681168252851660208201526040810184905260806060820181905281018290525f828460a08401375f60a0848401015260a0601f19601f85011683010190509695505050505050565b5f82614342576143426142a3565b500690565b805f5b60028110156132f057815184526020938401939091019060010161434a565b805f5b60028110156132f057614380848351614347565b604093909301926020919091019060010161436c565b5f6102e0820190506143a9828451614347565b6020808401516143bc6040850182614369565b5060408401516143cf60c0850182614347565b50606084015161010084015f5b600f8110156143f9578251825291830191908301906001016143dc565b5050505092915050565b5f805f805f60a08688031215614417575f80fd5b5050835160208501516040860151606087015160809097015192989197509594509092509050565b634e487b7160e01b5f52603160045260245ffd5b5f6101a082019050614466828451614347565b6020808401516144796040850182614369565b50604084015161448c60c0850182614347565b50606084015161010084015f5b60058110156143f957825182529183019190830190600101614499565b5f602082840312156144c6575f80fd5b5051919050565b60c0810181835f5b60068110156144f45781518352602092830192909101906001016144d5565b50505092915050565b6060810181835f5b60038110156144f4578151835260209283019290910190600101614505565b8481525f602060018060a01b03861660208401526080604084015284518060808501525f5b818110156145655786810183015185820160a001528201614549565b505f60a0828601015260a0601f19601f8301168501019250505060ff60f81b831660608301529594505050505056fea2646970667358221220926106a0d46788a089c6e9fb8e309b47b7e48677db255486f6ea7517ec87434364736f6c63430008180033", + "devdoc": { + "kind": "dev", + "methods": { + "addAccountToDenylist(bytes32)": { + "params": { + "_deniedUser": "Poseidon hash of the idHash being banned" + } + }, + "cancelIntent(bytes32)": { + "params": { + "_intentHash": "Hash of intent being cancelled" + } + }, + "initialize(address,address)": { + "params": { + "_registrationProcessor": "Registration processor address", + "_sendProcessor": "Send processor address" + } + }, + "offRamp(uint256[8],uint256,uint256)": { + "params": { + "_depositAmount": "The amount of USDC to off-ramp", + "_receiveAmount": "The amount of USD to receive", + "_upiId": "The packed upi ID of the depositor" + } + }, + "onRamp(uint256[2],uint256[2][2],uint256[2],uint256[15])": { + "params": { + "_a": "Parameter of zk proof", + "_b": "Parameter of zk proof", + "_c": "Parameter of zk proof", + "_signals": "Encoded public signals of the zk proof, contains mailserverHash, fromEmail, timestamp, onRamperIdHash, nullifier, intentHash" + } + }, + "owner()": { + "details": "Returns the address of the current owner." + }, + "register(uint256[2],uint256[2][2],uint256[2],uint256[5])": { + "params": { + "_a": "Parameter of zk proof", + "_b": "Parameter of zk proof", + "_c": "Parameter of zk proof", + "_signals": "Encoded public signals of the zk proof, contains mailserverHash, fromEmail, userIdHash" + } + }, + "releaseFundsToOnramper(bytes32)": { + "params": { + "_intentHash": "Hash of intent to resolve by releasing the funds" + } + }, + "removeAccountFromDenylist(bytes32)": { + "params": { + "_approvedUser": "Poseidon hash of the idHash being approved" + } + }, + "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." + }, + "setIntentExpirationPeriod(uint256)": { + "params": { + "_intentExpirationPeriod": "New intent expiration period" + } + }, + "setMaxOnRampAmount(uint256)": { + "params": { + "_maxOnRampAmount": "The new max on ramp amount" + } + }, + "setMinDepositAmount(uint256)": { + "params": { + "_minDepositAmount": "The new minimum deposit amount" + } + }, + "setOnRampCooldownPeriod(uint256)": { + "params": { + "_onRampCooldownPeriod": "New on-ramp cooldown period" + } + }, + "setRegistrationProcessor(address)": { + "params": { + "_registrationProcessor": "New registration proccesor address" + } + }, + "setSendProcessor(address)": { + "params": { + "_sendProcessor": "New send proccesor address" + } + }, + "setSustainabilityFee(uint256)": { + "params": { + "_fee": "The new sustainability fee in precise units (10**18, ie 10% = 1e17)" + } + }, + "setSustainabilityFeeRecipient(address)": { + "params": { + "_feeRecipient": "The new fee recipient address" + } + }, + "signalIntent(uint256,uint256,address)": { + "params": { + "_amount": "The amount of USDC the user wants to on-ramp", + "_depositId": "The ID of the deposit the on-ramper intends to use for ", + "_to": "Address to forward funds to (can be same as onRamper)" + } + }, + "transferOwnership(address)": { + "details": "Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner." + }, + "withdrawDeposit(uint256[])": { + "params": { + "_depositIds": "Array of depositIds the depositor is attempting to withdraw" + } + } + }, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": { + "addAccountToDenylist(bytes32)": { + "notice": "Adds an idHash to a depositor's deny list. If an address associated with the banned idHash attempts to signal an intent on the user's deposit they will be denied." + }, + "cancelIntent(bytes32)": { + "notice": "Only callable by the originator of the intent. Cancels an outstanding intent thus allowing user to signal a new intent. Deposit state is updated to reflect the cancelled intent." + }, + "initialize(address,address)": { + "notice": "Initialize Ramp with the addresses of the Processors" + }, + "offRamp(uint256[8],uint256,uint256)": { + "notice": "Generates a deposit entry for off-rampers that can then be fulfilled by an on-ramper. This function will not add to previous deposits. Every deposit has it's own unique identifier. User must approve the contract to transfer the deposit amount of USDC." + }, + "onRamp(uint256[2],uint256[2][2],uint256[2],uint256[15])": { + "notice": "Anyone can submit an on-ramp transaction, even if caller isn't on-ramper. Upon submission the proof is validated, intent is removed, and deposit state is updated. USDC is transferred to the on-ramper." + }, + "register(uint256[2],uint256[2][2],uint256[2],uint256[5])": { + "notice": "Registers a new account by pulling the hash of the account id from the proof and assigning the account owner to the sender of the transaction. One HDFC account can be registered to multiple Ethereum addresses." + }, + "releaseFundsToOnramper(bytes32)": { + "notice": "Allows off-ramper to release funds to the on-ramper in case of a failed on-ramp or because of some other arrangement between the two parties. Upon submission we check to make sure the msg.sender is the depositor, the intent is removed, and deposit state is updated. USDC is transferred to the on-ramper." + }, + "removeAccountFromDenylist(bytes32)": { + "notice": "Removes a idHash from a depositor's deny list." + }, + "setIntentExpirationPeriod(uint256)": { + "notice": "GOVERNANCE ONLY: Updates the intent expiration period, after this period elapses an intent can be pruned to prevent locking up a depositor's funds." + }, + "setMaxOnRampAmount(uint256)": { + "notice": "GOVERNANCE ONLY: Updates the max amount allowed to be on-ramped in each transaction. To on-ramp more than this amount a user must make multiple transactions." + }, + "setMinDepositAmount(uint256)": { + "notice": "GOVERNANCE ONLY: Updates the minimum deposit amount a user can specify for off-ramping." + }, + "setOnRampCooldownPeriod(uint256)": { + "notice": "GOVERNANCE ONLY: Updates the on-ramp cooldown period, once an on-ramp transaction is completed the user must wait this amount of time before they can signalIntent to on-ramp again." + }, + "setRegistrationProcessor(address)": { + "notice": "GOVERNANCE ONLY: Updates the registration processor address used for validating and interpreting zk proofs." + }, + "setSendProcessor(address)": { + "notice": "GOVERNANCE ONLY: Updates the send processor address used for validating and interpreting zk proofs." + }, + "setSustainabilityFee(uint256)": { + "notice": "GOVERNANCE ONLY: Updates the sustainability fee. This fee is charged to on-rampers upon a successful on-ramp." + }, + "setSustainabilityFeeRecipient(address)": { + "notice": "GOVERNANCE ONLY: Updates the recepient of sustainability fees." + }, + "signalIntent(uint256,uint256,address)": { + "notice": "Signals intent to pay the depositor defined in the _depositId the _amount * deposit conversionRate off-chain in order to unlock _amount of funds on-chain. Each user can only have one outstanding intent at a time regardless of address (tracked using idHash). Caller must not be on the depositor's deny list. If there are prunable intents then they will be deleted from the deposit to be able to maintain state hygiene." + }, + "withdrawDeposit(uint256[])": { + "notice": "Caller must be the depositor for each depositId in the array, if not whole function fails. Depositor is returned all remaining deposits and any outstanding intents that are expired. If an intent is not expired then those funds will not be returned. Deposit will be deleted as long as there are no more outstanding intents." + } + }, + "version": 1 + }, + "storageLayout": { + "storage": [ + { + "astId": 7, + "contract": "contracts/ramps/hdfc/HDFCRamp.sol:HDFCRamp", + "label": "_owner", + "offset": 0, + "slot": "0", + "type": "t_address" + }, + { + "astId": 10186, + "contract": "contracts/ramps/hdfc/HDFCRamp.sol:HDFCRamp", + "label": "registrationProcessor", + "offset": 0, + "slot": "1", + "type": "t_contract(IRegistrationProcessor)12831" + }, + { + "astId": 10189, + "contract": "contracts/ramps/hdfc/HDFCRamp.sol:HDFCRamp", + "label": "sendProcessor", + "offset": 0, + "slot": "2", + "type": "t_contract(IHDFCSendProcessor)12801" + }, + { + "astId": 10191, + "contract": "contracts/ramps/hdfc/HDFCRamp.sol:HDFCRamp", + "label": "isInitialized", + "offset": 20, + "slot": "2", + "type": "t_bool" + }, + { + "astId": 10196, + "contract": "contracts/ramps/hdfc/HDFCRamp.sol:HDFCRamp", + "label": "globalAccount", + "offset": 0, + "slot": "3", + "type": "t_mapping(t_bytes32,t_struct(GlobalAccountInfo)10141_storage)" + }, + { + "astId": 10201, + "contract": "contracts/ramps/hdfc/HDFCRamp.sol:HDFCRamp", + "label": "accounts", + "offset": 0, + "slot": "4", + "type": "t_mapping(t_address,t_struct(AccountInfo)10056_storage)" + }, + { + "astId": 10206, + "contract": "contracts/ramps/hdfc/HDFCRamp.sol:HDFCRamp", + "label": "deposits", + "offset": 0, + "slot": "5", + "type": "t_mapping(t_uint256,t_struct(Deposit)10074_storage)" + }, + { + "astId": 10211, + "contract": "contracts/ramps/hdfc/HDFCRamp.sol:HDFCRamp", + "label": "encryptedDeposits", + "offset": 0, + "slot": "6", + "type": "t_mapping(t_uint256,t_struct(EncryptedDeposit)10096_storage)" + }, + { + "astId": 10216, + "contract": "contracts/ramps/hdfc/HDFCRamp.sol:HDFCRamp", + "label": "intents", + "offset": 0, + "slot": "7", + "type": "t_mapping(t_bytes32,t_struct(Intent)10117_storage)" + }, + { + "astId": 10218, + "contract": "contracts/ramps/hdfc/HDFCRamp.sol:HDFCRamp", + "label": "minDepositAmount", + "offset": 0, + "slot": "8", + "type": "t_uint256" + }, + { + "astId": 10220, + "contract": "contracts/ramps/hdfc/HDFCRamp.sol:HDFCRamp", + "label": "maxOnRampAmount", + "offset": 0, + "slot": "9", + "type": "t_uint256" + }, + { + "astId": 10222, + "contract": "contracts/ramps/hdfc/HDFCRamp.sol:HDFCRamp", + "label": "onRampCooldownPeriod", + "offset": 0, + "slot": "10", + "type": "t_uint256" + }, + { + "astId": 10224, + "contract": "contracts/ramps/hdfc/HDFCRamp.sol:HDFCRamp", + "label": "intentExpirationPeriod", + "offset": 0, + "slot": "11", + "type": "t_uint256" + }, + { + "astId": 10226, + "contract": "contracts/ramps/hdfc/HDFCRamp.sol:HDFCRamp", + "label": "sustainabilityFee", + "offset": 0, + "slot": "12", + "type": "t_uint256" + }, + { + "astId": 10228, + "contract": "contracts/ramps/hdfc/HDFCRamp.sol:HDFCRamp", + "label": "sustainabilityFeeRecipient", + "offset": 0, + "slot": "13", + "type": "t_address" + }, + { + "astId": 10230, + "contract": "contracts/ramps/hdfc/HDFCRamp.sol:HDFCRamp", + "label": "depositCounter", + "offset": 0, + "slot": "14", + "type": "t_uint256" + } + ], + "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_array(t_uint256)8_storage": { + "base": "t_uint256", + "encoding": "inplace", + "label": "uint256[8]", + "numberOfBytes": "256" + }, + "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_contract(IHDFCSendProcessor)12801": { + "encoding": "inplace", + "label": "contract IHDFCSendProcessor", + "numberOfBytes": "20" + }, + "t_contract(IRegistrationProcessor)12831": { + "encoding": "inplace", + "label": "contract IRegistrationProcessor", + "numberOfBytes": "20" + }, + "t_mapping(t_address,t_struct(AccountInfo)10056_storage)": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => struct HDFCRamp.AccountInfo)", + "numberOfBytes": "32", + "value": "t_struct(AccountInfo)10056_storage" + }, + "t_mapping(t_bytes32,t_bool)": { + "encoding": "mapping", + "key": "t_bytes32", + "label": "mapping(bytes32 => bool)", + "numberOfBytes": "32", + "value": "t_bool" + }, + "t_mapping(t_bytes32,t_struct(GlobalAccountInfo)10141_storage)": { + "encoding": "mapping", + "key": "t_bytes32", + "label": "mapping(bytes32 => struct HDFCRamp.GlobalAccountInfo)", + "numberOfBytes": "32", + "value": "t_struct(GlobalAccountInfo)10141_storage" + }, + "t_mapping(t_bytes32,t_struct(Intent)10117_storage)": { + "encoding": "mapping", + "key": "t_bytes32", + "label": "mapping(bytes32 => struct HDFCRamp.Intent)", + "numberOfBytes": "32", + "value": "t_struct(Intent)10117_storage" + }, + "t_mapping(t_uint256,t_struct(Deposit)10074_storage)": { + "encoding": "mapping", + "key": "t_uint256", + "label": "mapping(uint256 => struct HDFCRamp.Deposit)", + "numberOfBytes": "32", + "value": "t_struct(Deposit)10074_storage" + }, + "t_mapping(t_uint256,t_struct(EncryptedDeposit)10096_storage)": { + "encoding": "mapping", + "key": "t_uint256", + "label": "mapping(uint256 => struct HDFCRamp.EncryptedDeposit)", + "numberOfBytes": "32", + "value": "t_struct(EncryptedDeposit)10096_storage" + }, + "t_struct(AccountInfo)10056_storage": { + "encoding": "inplace", + "label": "struct HDFCRamp.AccountInfo", + "members": [ + { + "astId": 10052, + "contract": "contracts/ramps/hdfc/HDFCRamp.sol:HDFCRamp", + "label": "idHash", + "offset": 0, + "slot": "0", + "type": "t_bytes32" + }, + { + "astId": 10055, + "contract": "contracts/ramps/hdfc/HDFCRamp.sol:HDFCRamp", + "label": "deposits", + "offset": 0, + "slot": "1", + "type": "t_array(t_uint256)dyn_storage" + } + ], + "numberOfBytes": "64" + }, + "t_struct(DenyList)10133_storage": { + "encoding": "inplace", + "label": "struct HDFCRamp.DenyList", + "members": [ + { + "astId": 10128, + "contract": "contracts/ramps/hdfc/HDFCRamp.sol:HDFCRamp", + "label": "deniedUsers", + "offset": 0, + "slot": "0", + "type": "t_array(t_bytes32)dyn_storage" + }, + { + "astId": 10132, + "contract": "contracts/ramps/hdfc/HDFCRamp.sol:HDFCRamp", + "label": "isDenied", + "offset": 0, + "slot": "1", + "type": "t_mapping(t_bytes32,t_bool)" + } + ], + "numberOfBytes": "64" + }, + "t_struct(Deposit)10074_storage": { + "encoding": "inplace", + "label": "struct HDFCRamp.Deposit", + "members": [ + { + "astId": 10058, + "contract": "contracts/ramps/hdfc/HDFCRamp.sol:HDFCRamp", + "label": "depositor", + "offset": 0, + "slot": "0", + "type": "t_address" + }, + { + "astId": 10062, + "contract": "contracts/ramps/hdfc/HDFCRamp.sol:HDFCRamp", + "label": "upiId", + "offset": 0, + "slot": "1", + "type": "t_array(t_uint256)8_storage" + }, + { + "astId": 10064, + "contract": "contracts/ramps/hdfc/HDFCRamp.sol:HDFCRamp", + "label": "depositAmount", + "offset": 0, + "slot": "9", + "type": "t_uint256" + }, + { + "astId": 10066, + "contract": "contracts/ramps/hdfc/HDFCRamp.sol:HDFCRamp", + "label": "remainingDeposits", + "offset": 0, + "slot": "10", + "type": "t_uint256" + }, + { + "astId": 10068, + "contract": "contracts/ramps/hdfc/HDFCRamp.sol:HDFCRamp", + "label": "outstandingIntentAmount", + "offset": 0, + "slot": "11", + "type": "t_uint256" + }, + { + "astId": 10070, + "contract": "contracts/ramps/hdfc/HDFCRamp.sol:HDFCRamp", + "label": "conversionRate", + "offset": 0, + "slot": "12", + "type": "t_uint256" + }, + { + "astId": 10073, + "contract": "contracts/ramps/hdfc/HDFCRamp.sol:HDFCRamp", + "label": "intentHashes", + "offset": 0, + "slot": "13", + "type": "t_array(t_bytes32)dyn_storage" + } + ], + "numberOfBytes": "448" + }, + "t_struct(EncryptedDeposit)10096_storage": { + "encoding": "inplace", + "label": "struct HDFCRamp.EncryptedDeposit", + "members": [ + { + "astId": 10076, + "contract": "contracts/ramps/hdfc/HDFCRamp.sol:HDFCRamp", + "label": "despositor", + "offset": 0, + "slot": "0", + "type": "t_address" + }, + { + "astId": 10080, + "contract": "contracts/ramps/hdfc/HDFCRamp.sol:HDFCRamp", + "label": "upiId", + "offset": 0, + "slot": "1", + "type": "t_array(t_uint256)8_storage" + }, + { + "astId": 10083, + "contract": "contracts/ramps/hdfc/HDFCRamp.sol:HDFCRamp", + "label": "depositAmount", + "offset": 0, + "slot": "9", + "type": "t_userDefinedValueType(euint32)28479" + }, + { + "astId": 10086, + "contract": "contracts/ramps/hdfc/HDFCRamp.sol:HDFCRamp", + "label": "remainingDeposits", + "offset": 0, + "slot": "10", + "type": "t_userDefinedValueType(euint32)28479" + }, + { + "astId": 10089, + "contract": "contracts/ramps/hdfc/HDFCRamp.sol:HDFCRamp", + "label": "outstandingIntentAmount", + "offset": 0, + "slot": "11", + "type": "t_userDefinedValueType(euint32)28479" + }, + { + "astId": 10092, + "contract": "contracts/ramps/hdfc/HDFCRamp.sol:HDFCRamp", + "label": "conversionRate", + "offset": 0, + "slot": "12", + "type": "t_userDefinedValueType(euint32)28479" + }, + { + "astId": 10095, + "contract": "contracts/ramps/hdfc/HDFCRamp.sol:HDFCRamp", + "label": "intentHashes", + "offset": 0, + "slot": "13", + "type": "t_array(t_bytes32)dyn_storage" + } + ], + "numberOfBytes": "448" + }, + "t_struct(GlobalAccountInfo)10141_storage": { + "encoding": "inplace", + "label": "struct HDFCRamp.GlobalAccountInfo", + "members": [ + { + "astId": 10135, + "contract": "contracts/ramps/hdfc/HDFCRamp.sol:HDFCRamp", + "label": "currentIntentHash", + "offset": 0, + "slot": "0", + "type": "t_bytes32" + }, + { + "astId": 10137, + "contract": "contracts/ramps/hdfc/HDFCRamp.sol:HDFCRamp", + "label": "lastOnrampTimestamp", + "offset": 0, + "slot": "1", + "type": "t_uint256" + }, + { + "astId": 10140, + "contract": "contracts/ramps/hdfc/HDFCRamp.sol:HDFCRamp", + "label": "denyList", + "offset": 0, + "slot": "2", + "type": "t_struct(DenyList)10133_storage" + } + ], + "numberOfBytes": "128" + }, + "t_struct(Intent)10117_storage": { + "encoding": "inplace", + "label": "struct HDFCRamp.Intent", + "members": [ + { + "astId": 10108, + "contract": "contracts/ramps/hdfc/HDFCRamp.sol:HDFCRamp", + "label": "onRamper", + "offset": 0, + "slot": "0", + "type": "t_address" + }, + { + "astId": 10110, + "contract": "contracts/ramps/hdfc/HDFCRamp.sol:HDFCRamp", + "label": "to", + "offset": 0, + "slot": "1", + "type": "t_address" + }, + { + "astId": 10112, + "contract": "contracts/ramps/hdfc/HDFCRamp.sol:HDFCRamp", + "label": "deposit", + "offset": 0, + "slot": "2", + "type": "t_uint256" + }, + { + "astId": 10114, + "contract": "contracts/ramps/hdfc/HDFCRamp.sol:HDFCRamp", + "label": "amount", + "offset": 0, + "slot": "3", + "type": "t_uint256" + }, + { + "astId": 10116, + "contract": "contracts/ramps/hdfc/HDFCRamp.sol:HDFCRamp", + "label": "intentTimestamp", + "offset": 0, + "slot": "4", + "type": "t_uint256" + } + ], + "numberOfBytes": "160" + }, + "t_uint256": { + "encoding": "inplace", + "label": "uint256", + "numberOfBytes": "32" + }, + "t_userDefinedValueType(euint32)28479": { + "encoding": "inplace", + "label": "euint32", + "numberOfBytes": "32" + } + } + } +} \ No newline at end of file diff --git a/contracts/deployments/encifher/HDFCRegistrationProcessor.json b/contracts/deployments/encifher/HDFCRegistrationProcessor.json new file mode 100644 index 000000000..1f20ba098 --- /dev/null +++ b/contracts/deployments/encifher/HDFCRegistrationProcessor.json @@ -0,0 +1,463 @@ +{ + "address": "0x90bB87c6258aD0D309D2f3a263d3Bc7B0B9F522D", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_ramp", + "type": "address" + }, + { + "internalType": "contract IKeyHashAdapterV2", + "name": "_hdfcMailserverKeyHashAdapter", + "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": "PACK_SIZE", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "emailFromAddress", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getEmailFromAddress", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_keyHash", + "type": "bytes32" + } + ], + "name": "isMailServerKeyHash", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "mailServerKeyHashAdapter", + "outputs": [ + { + "internalType": "contract IKeyHashAdapterV2", + "name": "", + "type": "address" + } + ], + "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[5]", + "name": "signals", + "type": "uint256[5]" + } + ], + "internalType": "struct IRegistrationProcessor.RegistrationProof", + "name": "_proof", + "type": "tuple" + } + ], + "name": "processProof", + "outputs": [ + { + "internalType": "bytes32", + "name": "userIdHash", + "type": "bytes32" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "ramp", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "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": "contract IKeyHashAdapterV2", + "name": "_mailServerKeyHashAdapter", + "type": "address" + } + ], + "name": "setMailserverKeyHashAdapter", + "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[5]", + "name": "_pubSignals", + "type": "uint256[5]" + } + ], + "name": "verifyProof", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "transactionHash": "0x34f2d568435a197e7e31e7f113ba1497292375121afa05433c300e94dd4edfb1", + "receipt": { + "to": null, + "from": "0xa0Ee7A142d267C1f36714E4a8F75612F20a79720", + "contractAddress": "0x90bB87c6258aD0D309D2f3a263d3Bc7B0B9F522D", + "transactionIndex": 0, + "gasUsed": "1412369", + "logsBloom": "0x00000000000000000000040000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000001000000000000000008000000000000000000020000000000000000000800000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000800000000000004000000020000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0xb80d8dbdf23cfc2b8cbdf9150aa64d53990383f13b4ab645e32dbdfc0bf59fe0", + "transactionHash": "0x34f2d568435a197e7e31e7f113ba1497292375121afa05433c300e94dd4edfb1", + "logs": [ + { + "transactionIndex": 0, + "blockNumber": 61370, + "transactionHash": "0x34f2d568435a197e7e31e7f113ba1497292375121afa05433c300e94dd4edfb1", + "address": "0x90bB87c6258aD0D309D2f3a263d3Bc7B0B9F522D", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x000000000000000000000000a0ee7a142d267c1f36714e4a8f75612f20a79720" + ], + "data": "0x", + "logIndex": 0, + "blockHash": "0xb80d8dbdf23cfc2b8cbdf9150aa64d53990383f13b4ab645e32dbdfc0bf59fe0" + } + ], + "blockNumber": 61370, + "cumulativeGasUsed": "1412369", + "status": 1, + "byzantium": true + }, + "args": [ + "0xb1527802E7800034D6887b0a99a5Ad2683184b95", + "0x4C073a92B1C8Fb55313102Ab412fb7F1704bcBdD", + "0x4d8E02BBfCf205828A8352Af4376b165E123D7b0", + "alerts@hdfcbank.net", + "0" + ], + "numDeployments": 1, + "solcInputHash": "75b8f55da346d7ed99a350632554d2fb", + "metadata": "{\"compiler\":{\"version\":\"0.8.24+commit.e11b9ed9\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_ramp\",\"type\":\"address\"},{\"internalType\":\"contract IKeyHashAdapterV2\",\"name\":\"_hdfcMailserverKeyHashAdapter\",\"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\":\"PACK_SIZE\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"emailFromAddress\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getEmailFromAddress\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_keyHash\",\"type\":\"bytes32\"}],\"name\":\"isMailServerKeyHash\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"mailServerKeyHashAdapter\",\"outputs\":[{\"internalType\":\"contract IKeyHashAdapterV2\",\"name\":\"\",\"type\":\"address\"}],\"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[5]\",\"name\":\"signals\",\"type\":\"uint256[5]\"}],\"internalType\":\"struct IRegistrationProcessor.RegistrationProof\",\"name\":\"_proof\",\"type\":\"tuple\"}],\"name\":\"processProof\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"userIdHash\",\"type\":\"bytes32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ramp\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"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\":\"contract IKeyHashAdapterV2\",\"name\":\"_mailServerKeyHashAdapter\",\"type\":\"address\"}],\"name\":\"setMailserverKeyHashAdapter\",\"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[5]\",\"name\":\"_pubSignals\",\"type\":\"uint256[5]\"}],\"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/ramps/hdfc/HDFCRegistrationProcessor.sol\":\"HDFCRegistrationProcessor\"},\"evmVersion\":\"shanghai\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"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 v4.4.1 (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\",\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"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/processors/BaseProcessorV2.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\n\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\nimport { IKeyHashAdapterV2 } from \\\"./keyHashAdapters/IKeyHashAdapterV2.sol\\\";\\nimport { INullifierRegistry } from \\\"./nullifierRegistries/INullifierRegistry.sol\\\";\\n\\npragma solidity ^0.8.18;\\n\\ncontract BaseProcessorV2 is Ownable {\\n\\n /* ============ Modifiers ============ */\\n modifier onlyRamp() {\\n require(msg.sender == ramp, \\\"Only Ramp can call this function\\\");\\n _;\\n }\\n\\n /* ============ State Variables ============ */\\n address public immutable ramp;\\n IKeyHashAdapterV2 public mailServerKeyHashAdapter;\\n INullifierRegistry public nullifierRegistry;\\n bytes public emailFromAddress;\\n uint256 public timestampBuffer;\\n\\n /* ============ Constructor ============ */\\n constructor(\\n address _ramp,\\n IKeyHashAdapterV2 _mailServerKeyHashAdapter,\\n INullifierRegistry _nullifierRegistry,\\n string memory _emailFromAddress,\\n uint256 _timestampBuffer\\n )\\n Ownable()\\n {\\n ramp = _ramp;\\n mailServerKeyHashAdapter = _mailServerKeyHashAdapter;\\n nullifierRegistry = _nullifierRegistry;\\n emailFromAddress = bytes(_emailFromAddress);\\n timestampBuffer = _timestampBuffer;\\n }\\n\\n /* ============ External Functions ============ */\\n\\n function setMailserverKeyHashAdapter(IKeyHashAdapterV2 _mailServerKeyHashAdapter) external onlyOwner {\\n mailServerKeyHashAdapter = _mailServerKeyHashAdapter;\\n }\\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 function isMailServerKeyHash(bytes32 _keyHash) public view returns (bool) {\\n return IKeyHashAdapterV2(mailServerKeyHashAdapter).isMailServerKeyHash(_keyHash);\\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\":\"0x207174fcbbfa8d2de65a5a5665f05e3f2d668f7df33b682a0f139c967dd3f6be\",\"license\":\"MIT\"},\"contracts/processors/keyHashAdapters/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/processors/nullifierRegistries/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/ramps/hdfc/HDFCRegistrationProcessor.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\n\\nimport { StringUtils } from \\\"@zk-email/contracts/utils/StringUtils.sol\\\";\\n\\nimport { BaseProcessorV2 } from \\\"../../processors/BaseProcessorV2.sol\\\";\\nimport { Groth16Verifier } from \\\"../../verifiers/hdfc_registration_verifier.sol\\\";\\nimport { IKeyHashAdapterV2 } from \\\"../../processors/keyHashAdapters/IKeyHashAdapterV2.sol\\\";\\nimport { INullifierRegistry } from \\\"../../processors/nullifierRegistries/INullifierRegistry.sol\\\";\\nimport { IRegistrationProcessor } from \\\"./interfaces/IRegistrationProcessor.sol\\\";\\n\\npragma solidity ^0.8.18;\\n\\ncontract HDFCRegistrationProcessor is Groth16Verifier, IRegistrationProcessor, BaseProcessorV2 {\\n\\n using StringUtils for uint256[];\\n\\n /* ============ Constants ============ */\\n uint256 constant public PACK_SIZE = 7;\\n \\n /* ============ Constructor ============ */\\n constructor(\\n address _ramp,\\n IKeyHashAdapterV2 _hdfcMailserverKeyHashAdapter,\\n INullifierRegistry _nullifierRegistry,\\n string memory _emailFromAddress,\\n uint256 _timestampBuffer\\n )\\n Groth16Verifier()\\n BaseProcessorV2(\\n _ramp,\\n _hdfcMailserverKeyHashAdapter,\\n _nullifierRegistry,\\n _emailFromAddress,\\n _timestampBuffer\\n )\\n {}\\n\\n /* ============ External Functions ============ */\\n\\n function processProof(\\n IRegistrationProcessor.RegistrationProof calldata _proof\\n )\\n public\\n override\\n onlyRamp\\n returns(bytes32 userIdHash)\\n {\\n require(this.verifyProof(_proof.a, _proof.b, _proof.c, _proof.signals), \\\"Invalid Proof\\\"); // checks effects iteractions, this should come first\\n\\n require(isMailServerKeyHash(bytes32(_proof.signals[0])), \\\"Invalid mailserver key hash\\\");\\n\\n // Signals [1:4] are the packed from email address\\n string memory fromEmail = _parseSignalArray(_proof.signals, 1, 4);\\n require(keccak256(abi.encodePacked(fromEmail)) == keccak256(emailFromAddress), \\\"Invalid email from address\\\");\\n\\n _validateAndAddNullifier(keccak256(abi.encode(_proof)));\\n\\n // Signals [4] is the packed userIdHash\\n userIdHash = bytes32(_proof.signals[4]);\\n }\\n\\n /* ============ Internal Functions ============ */\\n\\n function _parseSignalArray(uint256[5] calldata _signals, uint8 _from, uint8 _to) internal pure returns (string memory) {\\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\":\"0x201e3eb65e17171b5359065b51e78356853be26e598180822ebb4305b0cc3884\",\"license\":\"MIT\"},\"contracts/ramps/hdfc/interfaces/IRegistrationProcessor.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.18;\\n\\ninterface IRegistrationProcessor {\\n\\n struct RegistrationProof {\\n uint256[2] a;\\n uint256[2][2] b;\\n uint256[2] c;\\n uint256[5] signals;\\n }\\n\\n function processProof(\\n RegistrationProof calldata _proof\\n )\\n external\\n returns (bytes32);\\n}\\n\",\"keccak256\":\"0x6a89de57b7dfd51409bd06565af608c976dda3fc267d939df728b37d4c1f5006\",\"license\":\"MIT\"},\"contracts/verifiers/hdfc_registration_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 = 18941993809644597263122344954710203970320565994383305999328476744235410761420;\\n uint256 constant deltax2 = 16269071872410952148518498647090098652233286976541031880547316776610079594158;\\n uint256 constant deltay1 = 1550998249936592441357989923809006764271578090146442710328018508594456802732;\\n uint256 constant deltay2 = 19185606473196777841488599791312660844041715603856581158138067158870364920677;\\n\\n\\n uint256 constant IC0x = 18372946622689748518823039356212228839772233944452095064036571257568061521778;\\n uint256 constant IC0y = 4090510570013847365600433655993260067276592374276000919765717308908464822251;\\n\\n uint256 constant IC1x = 14530896712312421799791723884957588697322730616061235674192507548768166179620;\\n uint256 constant IC1y = 13241452075905838374684838766757247775031921510259565862881370673172146127140;\\n\\n uint256 constant IC2x = 14067991457947420245134633075363919619678925016010769439544345434672907387120;\\n uint256 constant IC2y = 15075242420546569507483308905973479840611557062002193416356995522848676830458;\\n\\n uint256 constant IC3x = 2268679644940985681075191131123258317084928252651134980820814399102444034331;\\n uint256 constant IC3y = 610946500236913130324137013956528865009524976591765517218479867010763423535;\\n\\n uint256 constant IC4x = 13966057128193603356523191212776509611934676597484902071144796821963056393663;\\n uint256 constant IC4y = 10287649621411400155282198379447556062773569989590617756213092986925054733118;\\n\\n uint256 constant IC5x = 16014135780036425835288045946537103382733734245255165282336104564746920453689;\\n uint256 constant IC5y = 5690379499787398426952245667412062460369879600268772354791710800039878218708;\\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[5] calldata _pubSignals) public view returns (bool) {\\n assembly {\\n function checkField(v) {\\n if iszero(lt(v, q)) {\\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\\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\\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\":\"0x2bc6b9f3db91263227b1e3a6b8fa9a965b9aa896bf3d12434766198a8b823e81\",\"license\":\"GPL-3.0\"}},\"version\":1}", + "bytecode": "0x60a060405234801562000010575f80fd5b5060405162001c8838038062001c88833981016040819052620000339162000115565b848484848462000043336200009a565b6001600160a01b03858116608052600180546001600160a01b031990811687841617909155600280549091169185169190911790556003620000868382620002b6565b506004555062000382975050505050505050565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b0381168114620000fe575f80fd5b50565b634e487b7160e01b5f52604160045260245ffd5b5f805f805f60a086880312156200012a575f80fd5b85516200013781620000e9565b809550506020808701516200014c81620000e9565b60408801519095506200015f81620000e9565b60608801519094506001600160401b03808211156200017c575f80fd5b818901915089601f83011262000190575f80fd5b815181811115620001a557620001a562000101565b604051601f8201601f19908116603f01168101908382118183101715620001d057620001d062000101565b816040528281528c86848701011115620001e8575f80fd5b5f93505b828410156200020b5784840186015181850187015292850192620001ec565b5f868483010152809750505050505050608086015190509295509295909350565b600181811c908216806200024157607f821691505b6020821081036200026057634e487b7160e01b5f52602260045260245ffd5b50919050565b601f821115620002b157805f5260205f20601f840160051c810160208510156200028d5750805b601f840160051c820191505b81811015620002ae575f815560010162000299565b50505b505050565b81516001600160401b03811115620002d257620002d262000101565b620002ea81620002e384546200022c565b8462000266565b602080601f83116001811462000320575f8415620003085750858301515b5f19600386901b1c1916600185901b1785556200037a565b5f85815260208120601f198616915b8281101562000350578886015182559484019460019091019084016200032f565b50858210156200036e57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b6080516118e6620003a25f395f8181610104015261026001526118e65ff3fe608060405234801561000f575f80fd5b50600436106100fb575f3560e01c8063b2a3fda411610093578063d0b71f9911610063578063d0b71f9914610212578063dbac582114610225578063f2fde38b1461022e578063f6c7226b14610241575f80fd5b8063b2a3fda4146101cf578063b870676c146101e2578063c0d05fed146101f5578063ced1e9781461020a575f80fd5b80633d0c9cc4116100ce5780633d0c9cc41461019a578063715018a6146101a25780638da5cb5b146101ac578063a8ef333f146101bc575f80fd5b806315d276e1146100ff57806317c8ecf21461014357806319d091521461016457806334baeab914610187575b5f80fd5b6101267f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020015b60405180910390f35b610156610151366004611366565b610254565b60405190815260200161013a565b61017761017236600461137d565b6104b2565b604051901515815260200161013a565b6101776101953660046113a4565b610523565b610156600781565b6101aa610aea565b005b5f546001600160a01b0316610126565b600154610126906001600160a01b031681565b6101aa6101dd36600461137d565b610afd565b600254610126906001600160a01b031681565b6101fd610b0a565b60405161013a9190611427565b6101fd610b96565b6101aa61022036600461146d565b610c26565b61015660045481565b6101aa61023c36600461146d565b610c50565b6101aa61024f3660046114a3565b610cc6565b5f336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146102d25760405162461bcd60e51b815260206004820181905260248201527f4f6e6c792052616d702063616e2063616c6c20746869732066756e6374696f6e60448201526064015b60405180910390fd5b604080516334baeab960e01b815230916334baeab9916103059186919082019060c0830190610100840190600401611577565b602060405180830381865afa158015610320573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061034491906115a8565b6103805760405162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b210283937b7b360991b60448201526064016102c9565b61038e6101008301356104b2565b6103da5760405162461bcd60e51b815260206004820152601b60248201527f496e76616c6964206d61696c736572766572206b65792068617368000000000060448201526064016102c9565b5f6103ec836101000160016004610cde565b905060036040516103fd919061160d565b604051809103902081604051602001610416919061167f565b60405160208183030381529060405280519060200120146104795760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420656d61696c2066726f6d206164647265737300000000000060448201526064016102c9565b6104a88360405160200161048d919061169a565b60405160208183030381529060405280519060200120610dae565b5050610180013590565b600154604051630ce848a960e11b8152600481018390525f916001600160a01b0316906319d0915290602401602060405180830381865afa1580156104f9573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061051d91906115a8565b92915050565b5f610a7b565b7f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd478110610558575f805260205ff35b50565b5f60405183815284602082015285604082015260408160608360076107d05a03fa91508161058b575f805260205ff35b825160408201526020830151606082015260408360808360066107d05a03fa915050806105ba575f805260205ff35b5050505050565b7f289eb82230faad0c62fbd2f540384142221e6b43882036be535e03d4d49f7f7285527f090b259da85021f388985bd3de1665a5d035c5a770be66b75093da97e178d7eb60208601525f608086018661065d87357f1d466572d6fee03f19c311206ca5817e0088ca3817fae4f83ffc87f87c6d81247f202032329a66a39b16ab45b84d1a4c5fb030644957050a46b628de101ffb73248461055b565b6106ad60208801357f215448eb180d4812a749a8eb0085b5cc108dbaea6af4614ea38ca86ddd3adcfa7f1f1a33746fb5bb57c457768bab47b04fe76d00a7290a62f71344a8ed659f80f08461055b565b6106fd60408801357f0159c8912a08d29aa9af11e4daf0adbf26108fe74c45ff2d636ecc69d5437f2f7f050406f4edf6a26e9227eebdac7c9c6ef22a1275fc6bdbd59e3f5072dd62d91b8461055b565b61074d60608801357f16be9a7484c0895cd1cdb9526ccf2d6d1645e53f5cda64cfa00749884c58ab3e7f1ee0821a01e9f589b248ac2c66efa1961e7f82aad907d0d30b1fae4495d4adbf8461055b565b61079d60808801357f0c94a4026750622d8fcbe4f7a710552a26a1fdbddec11103d3eaf25f3e8253d47f2367adfd5521befb39f7482424f3ca32be5f36c7b79096f04cd51e5760b8e6398461055b565b50823581527f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4760208401357f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4703066020820152833560408201526020840135606082015260408401356080820152606084013560a08201527f2d4d9aa7e302d9df41749d5507949d05dbea33fbb16c643b22f599a2be6df2e260c08201527f14bedd503c37ceb061d8ec60209fe345ce89830a19230301f076caff004d192660e08201527f0967032fcbf776d1afc985f88877f182d38480a653f2decaa9794cbc3bf3060c6101008201527f0e187847ad4c798374d0d6732bf501847dd68bc0e071241e0213bc7fc13db7ab6101208201527f304cfbd1e08a704a99f5e847d93f8c3caafddec46b7a0d379da69a4d112346a76101408201527f1739c1b1a457a8c7313123d24d2f9192f896b7c63eea05a9d57f06547ad0cec86101608201525f87015161018082015260205f018701516101a08201527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c26101c08201527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed6101e08201527f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b6102008201527f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa610220820152843561024082015260208501356102608201527f29e0c9df733e35f5a0f4a592c344dfa5669b61230266e156d86ac98bd3dfa6cc6102808201527f23f7f7e68d1d08a306a9752966290057d6167da414f3a75de9e253febc9e56ae6102a08201527f036dd57a7bd3ead51c3d0d5bd18cf6182b104511db118a576c0b7050a7c3b5ac6102c08201527f2a6aab1f59ba4c8b68d1835c9518fb5e30d07e1699f58ceec65b5bd38b461b656102e08201526020816103008360086107d05a03fa9051169695505050505050565b6040516103808101604052610a925f840135610529565b610a9f6020840135610529565b610aac6040840135610529565b610ab96060840135610529565b610ac66080840135610529565b610ad360a0840135610529565b610ae0818486888a6105c1565b9050805f5260205ff35b610af2610ebb565b610afb5f610f14565b565b610b05610ebb565b600455565b60038054610b17906115db565b80601f0160208091040260200160405190810160405280929190818152602001828054610b43906115db565b8015610b8e5780601f10610b6557610100808354040283529160200191610b8e565b820191905f5260205f20905b815481529060010190602001808311610b7157829003601f168201915b505050505081565b606060038054610ba5906115db565b80601f0160208091040260200160405190810160405280929190818152602001828054610bd1906115db565b8015610c1c5780601f10610bf357610100808354040283529160200191610c1c565b820191905f5260205f20905b815481529060010190602001808311610bff57829003601f168201915b5050505050905090565b610c2e610ebb565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b610c58610ebb565b6001600160a01b038116610cbd5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016102c9565b61055881610f14565b610cce610ebb565b6003610cda828261171b565b5050565b60605f610ceb84846117ef565b60ff1667ffffffffffffffff811115610d0657610d0661148f565b604051908082528060200260200182016040528015610d2f578160200160208202803683370190505b50905060ff84165b8360ff16811015610d8a57858160058110610d5457610d546115c7565b602002013582610d6760ff881684611808565b81518110610d7757610d776115c7565b6020908102919091010152600101610d37565b50610da560078251610d9c919061181b565b82906007610f63565b95945050505050565b60025460405163169394bb60e01b8152600481018390526001600160a01b039091169063169394bb90602401602060405180830381865afa158015610df5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e1991906115a8565b15610e665760405162461bcd60e51b815260206004820152601f60248201527f4e756c6c69666965722068617320616c7265616479206265656e20757365640060448201526064016102c9565b600254604051632dea6f9960e11b8152600481018390526001600160a01b0390911690635bd4df32906024015f604051808303815f87803b158015610ea9575f80fd5b505af11580156105ba573d5f803e3d5ffd5b5f546001600160a01b03163314610afb5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016102c9565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60605f80838651610f74919061181b565b67ffffffffffffffff811115610f8c57610f8c61148f565b6040519080825280601f01601f191660200182016040528015610fb6576020820181803683370190505b5090505f805b87518161ffff161015611150575f888261ffff1681518110610fe057610fe06115c7565b602002602001015190505f8767ffffffffffffffff8111156110045761100461148f565b60405190808252806020026020018201604052801561102d578160200160208202803683370190505b5090505f5b888110156110745761104581600861181b565b83901c82828151811061105a5761105a6115c7565b60ff90921660209283029190910190910152600101611032565b505f5b8881101561113a575f828281518110611092576110926115c7565b602002602001015160ff169050805f14611107578060f81b8787815181106110bc576110bc6115c7565b60200101906001600160f81b03191690815f1a905350856110dc81611832565b96506110eb905060028961184a565b60ff165f03611102576110ff600189611877565b97505b61112a565b61111260028961184a565b60ff1660010361112a57611127600189611877565b97505b5060089290921c91600101611077565b505050808061114890611890565b915050610fbc565b5060018360ff1610156111f15760405162461bcd60e51b815260206004820152605760248201527f4e6f207061636b656420627974657320666f756e642120496e76616c6964206660448201527f696e616c207374617465206f66207061636b656420627974657320696e20656d60648201527f61696c3b2076616c7565206973206c696b656c79203021000000000000000000608482015260a4016102c9565b8581111561125f5760405162461bcd60e51b815260206004820152603560248201527f5061636b6564206279746573206d6f7265207468616e20616c6c6f776564206d6044820152746178206e756d626572206f66207369676e616c732160581b60648201526084016102c9565b5f61126983611275565b98975050505050505050565b805160609082905f5b82518110156112be57828181518110611299576112996115c7565b01602001516001600160f81b0319165f036112b6578091506112be565b60010161127e565b505f8167ffffffffffffffff8111156112d9576112d961148f565b6040519080825280601f01601f191660200182016040528015611303576020820181803683370190505b5090505f5b8281101561135d57838181518110611322576113226115c7565b602001015160f81c60f81b82828151811061133f5761133f6115c7565b60200101906001600160f81b03191690815f1a905350600101611308565b50949350505050565b5f6101a08284031215611377575f80fd5b50919050565b5f6020828403121561138d575f80fd5b5035919050565b806040810183101561051d575f80fd5b5f805f806101a08086880312156113b9575f80fd5b6113c38787611394565b945060c08601878111156113d5575f80fd5b6040870194506113e58882611394565b9350508681870111156113f6575f80fd5b50929591945092610100019150565b5f5b8381101561141f578181015183820152602001611407565b50505f910152565b602081525f8251806020840152611445816040850160208701611405565b601f01601f19169190910160400192915050565b6001600160a01b0381168114610558575f80fd5b5f6020828403121561147d575f80fd5b813561148881611459565b9392505050565b634e487b7160e01b5f52604160045260245ffd5b5f602082840312156114b3575f80fd5b813567ffffffffffffffff808211156114ca575f80fd5b818401915084601f8301126114dd575f80fd5b8135818111156114ef576114ef61148f565b604051601f8201601f19908116603f011681019083821181831017156115175761151761148f565b8160405282815287602084870101111561152f575f80fd5b826020860160208301375f928101602001929092525095945050505050565b805f5b600281101561157157604080838637938401939190910190600101611551565b50505050565b6101a08101604086833761158e604083018661154e565b60408460c084013760a08361010084013795945050505050565b5f602082840312156115b8575f80fd5b81518015158114611488575f80fd5b634e487b7160e01b5f52603260045260245ffd5b600181811c908216806115ef57607f821691505b60208210810361137757634e487b7160e01b5f52602260045260245ffd5b5f80835461161a816115db565b60018281168015611632576001811461164757611673565b60ff1984168752821515830287019450611673565b875f526020805f205f5b8581101561166a5781548a820152908401908201611651565b50505082870194505b50929695505050505050565b5f8251611690818460208701611405565b9190910192915050565b6101a0810160408383376116b4604083016040850161154e565b604060c0840160c084013761010060a0818501828501375092915050565b601f82111561171657805f5260205f20601f840160051c810160208510156116f75750805b601f840160051c820191505b818110156105ba575f8155600101611703565b505050565b815167ffffffffffffffff8111156117355761173561148f565b6117498161174384546115db565b846116d2565b602080601f83116001811461177c575f84156117655750858301515b5f19600386901b1c1916600185901b1785556117d3565b5f85815260208120601f198616915b828110156117aa5788860151825594840194600190910190840161178b565b50858210156117c757878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b634e487b7160e01b5f52601160045260245ffd5b60ff828116828216039081111561051d5761051d6117db565b8181038181111561051d5761051d6117db565b808202811582820484141761051d5761051d6117db565b5f60018201611843576118436117db565b5060010190565b5f60ff83168061186857634e487b7160e01b5f52601260045260245ffd5b8060ff84160691505092915050565b60ff818116838216019081111561051d5761051d6117db565b5f61ffff8083168181036118a6576118a66117db565b600101939250505056fea264697066735822122023ab9679a00c4a132211b1ef35a1b0bd1334bd888bab5fa36c163f079878f2d964736f6c63430008180033", + "deployedBytecode": "0x608060405234801561000f575f80fd5b50600436106100fb575f3560e01c8063b2a3fda411610093578063d0b71f9911610063578063d0b71f9914610212578063dbac582114610225578063f2fde38b1461022e578063f6c7226b14610241575f80fd5b8063b2a3fda4146101cf578063b870676c146101e2578063c0d05fed146101f5578063ced1e9781461020a575f80fd5b80633d0c9cc4116100ce5780633d0c9cc41461019a578063715018a6146101a25780638da5cb5b146101ac578063a8ef333f146101bc575f80fd5b806315d276e1146100ff57806317c8ecf21461014357806319d091521461016457806334baeab914610187575b5f80fd5b6101267f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020015b60405180910390f35b610156610151366004611366565b610254565b60405190815260200161013a565b61017761017236600461137d565b6104b2565b604051901515815260200161013a565b6101776101953660046113a4565b610523565b610156600781565b6101aa610aea565b005b5f546001600160a01b0316610126565b600154610126906001600160a01b031681565b6101aa6101dd36600461137d565b610afd565b600254610126906001600160a01b031681565b6101fd610b0a565b60405161013a9190611427565b6101fd610b96565b6101aa61022036600461146d565b610c26565b61015660045481565b6101aa61023c36600461146d565b610c50565b6101aa61024f3660046114a3565b610cc6565b5f336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146102d25760405162461bcd60e51b815260206004820181905260248201527f4f6e6c792052616d702063616e2063616c6c20746869732066756e6374696f6e60448201526064015b60405180910390fd5b604080516334baeab960e01b815230916334baeab9916103059186919082019060c0830190610100840190600401611577565b602060405180830381865afa158015610320573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061034491906115a8565b6103805760405162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b210283937b7b360991b60448201526064016102c9565b61038e6101008301356104b2565b6103da5760405162461bcd60e51b815260206004820152601b60248201527f496e76616c6964206d61696c736572766572206b65792068617368000000000060448201526064016102c9565b5f6103ec836101000160016004610cde565b905060036040516103fd919061160d565b604051809103902081604051602001610416919061167f565b60405160208183030381529060405280519060200120146104795760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420656d61696c2066726f6d206164647265737300000000000060448201526064016102c9565b6104a88360405160200161048d919061169a565b60405160208183030381529060405280519060200120610dae565b5050610180013590565b600154604051630ce848a960e11b8152600481018390525f916001600160a01b0316906319d0915290602401602060405180830381865afa1580156104f9573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061051d91906115a8565b92915050565b5f610a7b565b7f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd478110610558575f805260205ff35b50565b5f60405183815284602082015285604082015260408160608360076107d05a03fa91508161058b575f805260205ff35b825160408201526020830151606082015260408360808360066107d05a03fa915050806105ba575f805260205ff35b5050505050565b7f289eb82230faad0c62fbd2f540384142221e6b43882036be535e03d4d49f7f7285527f090b259da85021f388985bd3de1665a5d035c5a770be66b75093da97e178d7eb60208601525f608086018661065d87357f1d466572d6fee03f19c311206ca5817e0088ca3817fae4f83ffc87f87c6d81247f202032329a66a39b16ab45b84d1a4c5fb030644957050a46b628de101ffb73248461055b565b6106ad60208801357f215448eb180d4812a749a8eb0085b5cc108dbaea6af4614ea38ca86ddd3adcfa7f1f1a33746fb5bb57c457768bab47b04fe76d00a7290a62f71344a8ed659f80f08461055b565b6106fd60408801357f0159c8912a08d29aa9af11e4daf0adbf26108fe74c45ff2d636ecc69d5437f2f7f050406f4edf6a26e9227eebdac7c9c6ef22a1275fc6bdbd59e3f5072dd62d91b8461055b565b61074d60608801357f16be9a7484c0895cd1cdb9526ccf2d6d1645e53f5cda64cfa00749884c58ab3e7f1ee0821a01e9f589b248ac2c66efa1961e7f82aad907d0d30b1fae4495d4adbf8461055b565b61079d60808801357f0c94a4026750622d8fcbe4f7a710552a26a1fdbddec11103d3eaf25f3e8253d47f2367adfd5521befb39f7482424f3ca32be5f36c7b79096f04cd51e5760b8e6398461055b565b50823581527f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4760208401357f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4703066020820152833560408201526020840135606082015260408401356080820152606084013560a08201527f2d4d9aa7e302d9df41749d5507949d05dbea33fbb16c643b22f599a2be6df2e260c08201527f14bedd503c37ceb061d8ec60209fe345ce89830a19230301f076caff004d192660e08201527f0967032fcbf776d1afc985f88877f182d38480a653f2decaa9794cbc3bf3060c6101008201527f0e187847ad4c798374d0d6732bf501847dd68bc0e071241e0213bc7fc13db7ab6101208201527f304cfbd1e08a704a99f5e847d93f8c3caafddec46b7a0d379da69a4d112346a76101408201527f1739c1b1a457a8c7313123d24d2f9192f896b7c63eea05a9d57f06547ad0cec86101608201525f87015161018082015260205f018701516101a08201527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c26101c08201527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed6101e08201527f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b6102008201527f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa610220820152843561024082015260208501356102608201527f29e0c9df733e35f5a0f4a592c344dfa5669b61230266e156d86ac98bd3dfa6cc6102808201527f23f7f7e68d1d08a306a9752966290057d6167da414f3a75de9e253febc9e56ae6102a08201527f036dd57a7bd3ead51c3d0d5bd18cf6182b104511db118a576c0b7050a7c3b5ac6102c08201527f2a6aab1f59ba4c8b68d1835c9518fb5e30d07e1699f58ceec65b5bd38b461b656102e08201526020816103008360086107d05a03fa9051169695505050505050565b6040516103808101604052610a925f840135610529565b610a9f6020840135610529565b610aac6040840135610529565b610ab96060840135610529565b610ac66080840135610529565b610ad360a0840135610529565b610ae0818486888a6105c1565b9050805f5260205ff35b610af2610ebb565b610afb5f610f14565b565b610b05610ebb565b600455565b60038054610b17906115db565b80601f0160208091040260200160405190810160405280929190818152602001828054610b43906115db565b8015610b8e5780601f10610b6557610100808354040283529160200191610b8e565b820191905f5260205f20905b815481529060010190602001808311610b7157829003601f168201915b505050505081565b606060038054610ba5906115db565b80601f0160208091040260200160405190810160405280929190818152602001828054610bd1906115db565b8015610c1c5780601f10610bf357610100808354040283529160200191610c1c565b820191905f5260205f20905b815481529060010190602001808311610bff57829003601f168201915b5050505050905090565b610c2e610ebb565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b610c58610ebb565b6001600160a01b038116610cbd5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016102c9565b61055881610f14565b610cce610ebb565b6003610cda828261171b565b5050565b60605f610ceb84846117ef565b60ff1667ffffffffffffffff811115610d0657610d0661148f565b604051908082528060200260200182016040528015610d2f578160200160208202803683370190505b50905060ff84165b8360ff16811015610d8a57858160058110610d5457610d546115c7565b602002013582610d6760ff881684611808565b81518110610d7757610d776115c7565b6020908102919091010152600101610d37565b50610da560078251610d9c919061181b565b82906007610f63565b95945050505050565b60025460405163169394bb60e01b8152600481018390526001600160a01b039091169063169394bb90602401602060405180830381865afa158015610df5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e1991906115a8565b15610e665760405162461bcd60e51b815260206004820152601f60248201527f4e756c6c69666965722068617320616c7265616479206265656e20757365640060448201526064016102c9565b600254604051632dea6f9960e11b8152600481018390526001600160a01b0390911690635bd4df32906024015f604051808303815f87803b158015610ea9575f80fd5b505af11580156105ba573d5f803e3d5ffd5b5f546001600160a01b03163314610afb5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016102c9565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60605f80838651610f74919061181b565b67ffffffffffffffff811115610f8c57610f8c61148f565b6040519080825280601f01601f191660200182016040528015610fb6576020820181803683370190505b5090505f805b87518161ffff161015611150575f888261ffff1681518110610fe057610fe06115c7565b602002602001015190505f8767ffffffffffffffff8111156110045761100461148f565b60405190808252806020026020018201604052801561102d578160200160208202803683370190505b5090505f5b888110156110745761104581600861181b565b83901c82828151811061105a5761105a6115c7565b60ff90921660209283029190910190910152600101611032565b505f5b8881101561113a575f828281518110611092576110926115c7565b602002602001015160ff169050805f14611107578060f81b8787815181106110bc576110bc6115c7565b60200101906001600160f81b03191690815f1a905350856110dc81611832565b96506110eb905060028961184a565b60ff165f03611102576110ff600189611877565b97505b61112a565b61111260028961184a565b60ff1660010361112a57611127600189611877565b97505b5060089290921c91600101611077565b505050808061114890611890565b915050610fbc565b5060018360ff1610156111f15760405162461bcd60e51b815260206004820152605760248201527f4e6f207061636b656420627974657320666f756e642120496e76616c6964206660448201527f696e616c207374617465206f66207061636b656420627974657320696e20656d60648201527f61696c3b2076616c7565206973206c696b656c79203021000000000000000000608482015260a4016102c9565b8581111561125f5760405162461bcd60e51b815260206004820152603560248201527f5061636b6564206279746573206d6f7265207468616e20616c6c6f776564206d6044820152746178206e756d626572206f66207369676e616c732160581b60648201526084016102c9565b5f61126983611275565b98975050505050505050565b805160609082905f5b82518110156112be57828181518110611299576112996115c7565b01602001516001600160f81b0319165f036112b6578091506112be565b60010161127e565b505f8167ffffffffffffffff8111156112d9576112d961148f565b6040519080825280601f01601f191660200182016040528015611303576020820181803683370190505b5090505f5b8281101561135d57838181518110611322576113226115c7565b602001015160f81c60f81b82828151811061133f5761133f6115c7565b60200101906001600160f81b03191690815f1a905350600101611308565b50949350505050565b5f6101a08284031215611377575f80fd5b50919050565b5f6020828403121561138d575f80fd5b5035919050565b806040810183101561051d575f80fd5b5f805f806101a08086880312156113b9575f80fd5b6113c38787611394565b945060c08601878111156113d5575f80fd5b6040870194506113e58882611394565b9350508681870111156113f6575f80fd5b50929591945092610100019150565b5f5b8381101561141f578181015183820152602001611407565b50505f910152565b602081525f8251806020840152611445816040850160208701611405565b601f01601f19169190910160400192915050565b6001600160a01b0381168114610558575f80fd5b5f6020828403121561147d575f80fd5b813561148881611459565b9392505050565b634e487b7160e01b5f52604160045260245ffd5b5f602082840312156114b3575f80fd5b813567ffffffffffffffff808211156114ca575f80fd5b818401915084601f8301126114dd575f80fd5b8135818111156114ef576114ef61148f565b604051601f8201601f19908116603f011681019083821181831017156115175761151761148f565b8160405282815287602084870101111561152f575f80fd5b826020860160208301375f928101602001929092525095945050505050565b805f5b600281101561157157604080838637938401939190910190600101611551565b50505050565b6101a08101604086833761158e604083018661154e565b60408460c084013760a08361010084013795945050505050565b5f602082840312156115b8575f80fd5b81518015158114611488575f80fd5b634e487b7160e01b5f52603260045260245ffd5b600181811c908216806115ef57607f821691505b60208210810361137757634e487b7160e01b5f52602260045260245ffd5b5f80835461161a816115db565b60018281168015611632576001811461164757611673565b60ff1984168752821515830287019450611673565b875f526020805f205f5b8581101561166a5781548a820152908401908201611651565b50505082870194505b50929695505050505050565b5f8251611690818460208701611405565b9190910192915050565b6101a0810160408383376116b4604083016040850161154e565b604060c0840160c084013761010060a0818501828501375092915050565b601f82111561171657805f5260205f20601f840160051c810160208510156116f75750805b601f840160051c820191505b818110156105ba575f8155600101611703565b505050565b815167ffffffffffffffff8111156117355761173561148f565b6117498161174384546115db565b846116d2565b602080601f83116001811461177c575f84156117655750858301515b5f19600386901b1c1916600185901b1785556117d3565b5f85815260208120601f198616915b828110156117aa5788860151825594840194600190910190840161178b565b50858210156117c757878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b634e487b7160e01b5f52601160045260245ffd5b60ff828116828216039081111561051d5761051d6117db565b8181038181111561051d5761051d6117db565b808202811582820484141761051d5761051d6117db565b5f60018201611843576118436117db565b5060010190565b5f60ff83168061186857634e487b7160e01b5f52601260045260245ffd5b8060ff84160691505092915050565b60ff818116838216019081111561051d5761051d6117db565b5f61ffff8083168181036118a6576118a66117db565b600101939250505056fea264697066735822122023ab9679a00c4a132211b1ef35a1b0bd1334bd888bab5fa36c163f079878f2d964736f6c63430008180033", + "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/ramps/hdfc/HDFCRegistrationProcessor.sol:HDFCRegistrationProcessor", + "label": "_owner", + "offset": 0, + "slot": "0", + "type": "t_address" + }, + { + "astId": 6068, + "contract": "contracts/ramps/hdfc/HDFCRegistrationProcessor.sol:HDFCRegistrationProcessor", + "label": "mailServerKeyHashAdapter", + "offset": 0, + "slot": "1", + "type": "t_contract(IKeyHashAdapterV2)6431" + }, + { + "astId": 6071, + "contract": "contracts/ramps/hdfc/HDFCRegistrationProcessor.sol:HDFCRegistrationProcessor", + "label": "nullifierRegistry", + "offset": 0, + "slot": "2", + "type": "t_contract(INullifierRegistry)6636" + }, + { + "astId": 6073, + "contract": "contracts/ramps/hdfc/HDFCRegistrationProcessor.sol:HDFCRegistrationProcessor", + "label": "emailFromAddress", + "offset": 0, + "slot": "3", + "type": "t_bytes_storage" + }, + { + "astId": 6075, + "contract": "contracts/ramps/hdfc/HDFCRegistrationProcessor.sol:HDFCRegistrationProcessor", + "label": "timestampBuffer", + "offset": 0, + "slot": "4", + "type": "t_uint256" + } + ], + "types": { + "t_address": { + "encoding": "inplace", + "label": "address", + "numberOfBytes": "20" + }, + "t_bytes_storage": { + "encoding": "bytes", + "label": "bytes", + "numberOfBytes": "32" + }, + "t_contract(IKeyHashAdapterV2)6431": { + "encoding": "inplace", + "label": "contract IKeyHashAdapterV2", + "numberOfBytes": "20" + }, + "t_contract(INullifierRegistry)6636": { + "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/deployments/encifher/HDFCSendProcessor.json b/contracts/deployments/encifher/HDFCSendProcessor.json new file mode 100644 index 000000000..aad5634f9 --- /dev/null +++ b/contracts/deployments/encifher/HDFCSendProcessor.json @@ -0,0 +1,470 @@ +{ + "address": "0x38381D63418Ff752Dba93eE018e36a6814388FA7", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_ramp", + "type": "address" + }, + { + "internalType": "contract IKeyHashAdapterV2", + "name": "_hdfcMailserverKeyHashAdapter", + "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": "getEmailFromAddress", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_keyHash", + "type": "bytes32" + } + ], + "name": "isMailServerKeyHash", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "mailServerKeyHashAdapter", + "outputs": [ + { + "internalType": "contract IKeyHashAdapterV2", + "name": "", + "type": "address" + } + ], + "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[15]", + "name": "signals", + "type": "uint256[15]" + } + ], + "internalType": "struct IHDFCSendProcessor.SendProof", + "name": "_proof", + "type": "tuple" + } + ], + "name": "processProof", + "outputs": [ + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "timestamp", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "offRamperIdHash", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "onRamperIdHash", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "intentHash", + "type": "bytes32" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "ramp", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "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": "contract IKeyHashAdapterV2", + "name": "_mailServerKeyHashAdapter", + "type": "address" + } + ], + "name": "setMailserverKeyHashAdapter", + "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[15]", + "name": "_pubSignals", + "type": "uint256[15]" + } + ], + "name": "verifyProof", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "transactionHash": "0xcb1c4c234a724981fb7ff1b96c7c5b6e2c269b33ac6f2be55825cbd79fd3da84", + "receipt": { + "to": null, + "from": "0xa0Ee7A142d267C1f36714E4a8F75612F20a79720", + "contractAddress": "0x38381D63418Ff752Dba93eE018e36a6814388FA7", + "transactionIndex": 0, + "gasUsed": "2294875", + "logsBloom": "0x00000000000000000000040000000000000000000000000000800000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000008000000000000000000020000000000000000000800000000000020000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000020000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0x83d1e2b0709b0e5dab4ce2471ca00e4f222afe5bdf84cf8cb8956f8dd2df2c6e", + "transactionHash": "0xcb1c4c234a724981fb7ff1b96c7c5b6e2c269b33ac6f2be55825cbd79fd3da84", + "logs": [ + { + "transactionIndex": 0, + "blockNumber": 61372, + "transactionHash": "0xcb1c4c234a724981fb7ff1b96c7c5b6e2c269b33ac6f2be55825cbd79fd3da84", + "address": "0x38381D63418Ff752Dba93eE018e36a6814388FA7", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x000000000000000000000000a0ee7a142d267c1f36714e4a8f75612f20a79720" + ], + "data": "0x", + "logIndex": 0, + "blockHash": "0x83d1e2b0709b0e5dab4ce2471ca00e4f222afe5bdf84cf8cb8956f8dd2df2c6e" + } + ], + "blockNumber": 61372, + "cumulativeGasUsed": "2294875", + "status": 1, + "byzantium": true + }, + "args": [ + "0xb1527802E7800034D6887b0a99a5Ad2683184b95", + "0x4C073a92B1C8Fb55313102Ab412fb7F1704bcBdD", + "0x4d8E02BBfCf205828A8352Af4376b165E123D7b0", + "alerts@hdfcbank.net", + "30" + ], + "numDeployments": 1, + "solcInputHash": "75b8f55da346d7ed99a350632554d2fb", + "metadata": "{\"compiler\":{\"version\":\"0.8.24+commit.e11b9ed9\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_ramp\",\"type\":\"address\"},{\"internalType\":\"contract IKeyHashAdapterV2\",\"name\":\"_hdfcMailserverKeyHashAdapter\",\"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\":\"getEmailFromAddress\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_keyHash\",\"type\":\"bytes32\"}],\"name\":\"isMailServerKeyHash\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"mailServerKeyHashAdapter\",\"outputs\":[{\"internalType\":\"contract IKeyHashAdapterV2\",\"name\":\"\",\"type\":\"address\"}],\"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[15]\",\"name\":\"signals\",\"type\":\"uint256[15]\"}],\"internalType\":\"struct IHDFCSendProcessor.SendProof\",\"name\":\"_proof\",\"type\":\"tuple\"}],\"name\":\"processProof\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"offRamperIdHash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"onRamperIdHash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"intentHash\",\"type\":\"bytes32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ramp\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"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\":\"contract IKeyHashAdapterV2\",\"name\":\"_mailServerKeyHashAdapter\",\"type\":\"address\"}],\"name\":\"setMailserverKeyHashAdapter\",\"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[15]\",\"name\":\"_pubSignals\",\"type\":\"uint256[15]\"}],\"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/ramps/hdfc/HDFCSendProcessor.sol\":\"HDFCSendProcessor\"},\"evmVersion\":\"shanghai\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"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 v4.4.1 (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\",\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"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/external/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/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/processors/BaseProcessorV2.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\n\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\nimport { IKeyHashAdapterV2 } from \\\"./keyHashAdapters/IKeyHashAdapterV2.sol\\\";\\nimport { INullifierRegistry } from \\\"./nullifierRegistries/INullifierRegistry.sol\\\";\\n\\npragma solidity ^0.8.18;\\n\\ncontract BaseProcessorV2 is Ownable {\\n\\n /* ============ Modifiers ============ */\\n modifier onlyRamp() {\\n require(msg.sender == ramp, \\\"Only Ramp can call this function\\\");\\n _;\\n }\\n\\n /* ============ State Variables ============ */\\n address public immutable ramp;\\n IKeyHashAdapterV2 public mailServerKeyHashAdapter;\\n INullifierRegistry public nullifierRegistry;\\n bytes public emailFromAddress;\\n uint256 public timestampBuffer;\\n\\n /* ============ Constructor ============ */\\n constructor(\\n address _ramp,\\n IKeyHashAdapterV2 _mailServerKeyHashAdapter,\\n INullifierRegistry _nullifierRegistry,\\n string memory _emailFromAddress,\\n uint256 _timestampBuffer\\n )\\n Ownable()\\n {\\n ramp = _ramp;\\n mailServerKeyHashAdapter = _mailServerKeyHashAdapter;\\n nullifierRegistry = _nullifierRegistry;\\n emailFromAddress = bytes(_emailFromAddress);\\n timestampBuffer = _timestampBuffer;\\n }\\n\\n /* ============ External Functions ============ */\\n\\n function setMailserverKeyHashAdapter(IKeyHashAdapterV2 _mailServerKeyHashAdapter) external onlyOwner {\\n mailServerKeyHashAdapter = _mailServerKeyHashAdapter;\\n }\\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 function isMailServerKeyHash(bytes32 _keyHash) public view returns (bool) {\\n return IKeyHashAdapterV2(mailServerKeyHashAdapter).isMailServerKeyHash(_keyHash);\\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\":\"0x207174fcbbfa8d2de65a5a5665f05e3f2d668f7df33b682a0f139c967dd3f6be\",\"license\":\"MIT\"},\"contracts/processors/keyHashAdapters/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/processors/nullifierRegistries/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/ramps/hdfc/HDFCSendProcessor.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\n\\nimport { StringUtils } from \\\"@zk-email/contracts/utils/StringUtils.sol\\\";\\n\\nimport { BaseProcessorV2 } from \\\"../../processors/BaseProcessorV2.sol\\\";\\nimport { Groth16Verifier } from \\\"../../verifiers/hdfc_send_verifier.sol\\\";\\nimport { HDFCTimestampParsing } from \\\"./lib/HDFCTimestampParsing.sol\\\";\\nimport { IKeyHashAdapterV2 } from \\\"../../processors/keyHashAdapters/IKeyHashAdapterV2.sol\\\";\\nimport { INullifierRegistry } from \\\"../../processors/nullifierRegistries/INullifierRegistry.sol\\\";\\nimport { IHDFCSendProcessor } from \\\"./interfaces/IHDFCSendProcessor.sol\\\";\\nimport { StringConversionUtils } from \\\"../../lib/StringConversionUtils.sol\\\";\\n\\npragma solidity ^0.8.18;\\n\\ncontract HDFCSendProcessor is Groth16Verifier, IHDFCSendProcessor, BaseProcessorV2 {\\n \\n using StringUtils for uint256[];\\n using StringConversionUtils for string;\\n\\n /* ============ Constants ============ */\\n uint256 constant PACK_SIZE = 7;\\n\\n /* ============ Constructor ============ */\\n constructor(\\n address _ramp,\\n IKeyHashAdapterV2 _hdfcMailserverKeyHashAdapter,\\n INullifierRegistry _nullifierRegistry,\\n string memory _emailFromAddress,\\n uint256 _timestampBuffer\\n )\\n Groth16Verifier()\\n BaseProcessorV2(\\n _ramp,\\n _hdfcMailserverKeyHashAdapter,\\n _nullifierRegistry,\\n _emailFromAddress,\\n _timestampBuffer\\n )\\n {}\\n \\n /* ============ External Functions ============ */\\n function processProof(\\n IHDFCSendProcessor.SendProof calldata _proof\\n )\\n public\\n override\\n onlyRamp\\n returns(\\n uint256 amount,\\n uint256 timestamp,\\n bytes32 offRamperIdHash,\\n bytes32 onRamperIdHash,\\n bytes32 intentHash\\n )\\n {\\n require(this.verifyProof(_proof.a, _proof.b, _proof.c, _proof.signals), \\\"Invalid Proof\\\"); // checks effects iteractions, this should come first\\n\\n require(isMailServerKeyHash(bytes32(_proof.signals[0])), \\\"Invalid mailserver key hash\\\");\\n\\n // Signals [1:4] are the packed from email address\\n string memory fromEmail = _parseSignalArray(_proof.signals, 1, 4);\\n require(keccak256(abi.encodePacked(fromEmail)) == keccak256(emailFromAddress), \\\"Invalid email from address\\\");\\n\\n // Signals [4:6] is the packed amount, since this is a USDC amount we want to make sure the returned number is\\n // properly padded to 6 decimals. If the parsed has more than 6 figures to the right of the decimal it will revert\\n amount = _parseSignalArray(_proof.signals, 4, 6).stringToUint(6);\\n\\n // Signals [6:11] are the packed timestamp, the timestamp is returned as a string in the format, that we need to\\n // parse and convert to a unix timestamp\\n string memory rawTimestamp = _parseSignalArray(_proof.signals, 6, 11);\\n // Add the buffer to build in flexibility with L2 timestamps\\n timestamp = HDFCTimestampParsing._dateStringToTimestamp(rawTimestamp) + timestampBuffer;\\n\\n // Signals [11] is the packed onRamperIdHash\\n onRamperIdHash = bytes32(_proof.signals[11]);\\n\\n // Signals [12] is the packed offRamper UPI ID hash\\n offRamperIdHash = bytes32(_proof.signals[12]);\\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[13]));\\n\\n // Signals [14] is intentHash\\n intentHash = bytes32(_proof.signals[14]);\\n }\\n \\n /* ============ Internal Functions ============ */\\n\\n function _parseSignalArray(uint256[15] calldata _signals, uint8 _from, uint8 _to) internal pure returns (string memory) {\\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\":\"0x817fbb9806670719d4e42665dfdf60a3beb3852f3ad8178049e3836732de7034\",\"license\":\"MIT\"},\"contracts/ramps/hdfc/interfaces/IHDFCSendProcessor.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.18;\\n\\ninterface IHDFCSendProcessor {\\n\\n struct SendProof {\\n uint256[2] a;\\n uint256[2][2] b;\\n uint256[2] c;\\n uint256[15] signals;\\n }\\n\\n function processProof(\\n SendProof calldata _proof\\n )\\n external\\n returns(uint256, uint256, bytes32, bytes32, bytes32);\\n}\\n\",\"keccak256\":\"0xe022a0768bd0928ca85ebcfc7541907038fc0b786572701c5a37b97ec6040847\",\"license\":\"MIT\"},\"contracts/ramps/hdfc/lib/HDFCTimestampParsing.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\n\\nimport { DateTime } from \\\"../../../external/DateTime.sol\\\";\\n\\nimport { StringConversionUtils } from \\\"../../../lib/StringConversionUtils.sol\\\";\\n\\npragma solidity ^0.8.18;\\n\\nlibrary HDFCTimestampParsing {\\n\\n using StringConversionUtils for string;\\n\\n /**\\n * @notice Iterates through every character in the date string and splits the string at each space or colon. Function will revert\\n * if there are not 8 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 HDFC, not suitable for use with other date formats.\\n */\\n function _dateStringToTimestamp(string memory _dateString) internal pure returns (uint256) {\\n string[8] memory extractedStrings;\\n uint256 breakCounter;\\n uint256 lastBreak;\\n for (uint256 i = 0; i < bytes(_dateString).length; i++) {\\n if (bytes(_dateString)[i] == 0x20 || bytes(_dateString)[i] == 0x3a) {\\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 8 substrings were found (string is split at 7 different places)\\n require(breakCounter == 7, \\\"Invalid date string\\\");\\n\\n uint256 unOffsetTimestamp = DateTime.timestampFromDateTime(\\n extractedStrings[3].stringToUint(0), // year\\n _parseMonth(extractedStrings[2]), // month\\n extractedStrings[1].stringToUint(0), // day\\n extractedStrings[4].stringToUint(0), // hour\\n extractedStrings[5].stringToUint(0), // minute\\n extractedStrings[6].stringToUint(0) // second\\n );\\n\\n return _calculateTimestampWithOffset(unOffsetTimestamp, extractedStrings[7]);\\n }\\n\\n /**\\n * @notice Adds or subtracts an offset from the calculated unOffset timestamp based on the timezone offset string. The timezone offset\\n * string is of the format \\\"+0530\\\" or \\\"-0530\\\" where the first character is either a \\\"+\\\" or a \\\"-\\\" and the next 4 characters are hhmm. If\\n * the _timeOffsetString is \\\"+0530\\\" then we subtract 5 hours and 30 minutes (19800s) from the unOffset timestamp, to get a GMT timestamp.\\n * We constrain the _timeOffsetString to be 5 characters long to be of the format +/-hhmm.\\n *\\n * @param unOffsetTimestamp The unix timestamp without any timezone offset applied\\n * @param _timeOffsetString The timezone offset string indicating the magnitude and direction of the timezone offset\\n */\\n function _calculateTimestampWithOffset(uint256 unOffsetTimestamp, string memory _timeOffsetString) internal pure returns (uint256) {\\n require(bytes(_timeOffsetString).length == 5, \\\"Invalid timezone offset\\\");\\n uint256 tzHours = _timeOffsetString.substring(1, 3).stringToUint(0);\\n uint256 tzMinutes = _timeOffsetString.substring(3, 5).stringToUint(0);\\n\\n uint256 rawOffset = tzHours * 3600 + tzMinutes * 60;\\n\\n // Check if tz offset is positive or negative relative to GMT, 0x2b is the hex value for \\\"+\\\" meaning the tz is ahead of GMT and must\\n // be subtracted\\n bytes1 _offsetDirection = bytes(_timeOffsetString.substring(0, 1))[0];\\n return _offsetDirection == 0x2b ? unOffsetTimestamp - rawOffset : unOffsetTimestamp + rawOffset;\\n }\\n\\n function _parseMonth(string memory _month) internal pure returns (uint256) {\\n if (keccak256(abi.encodePacked(_month)) == keccak256(\\\"Jan\\\")) {\\n return 1;\\n } else if (keccak256(abi.encodePacked(_month)) == keccak256(\\\"Feb\\\")) {\\n return 2;\\n } else if (keccak256(abi.encodePacked(_month)) == keccak256(\\\"Mar\\\")) {\\n return 3;\\n } else if (keccak256(abi.encodePacked(_month)) == keccak256(\\\"Apr\\\")) {\\n return 4;\\n } else if (keccak256(abi.encodePacked(_month)) == keccak256(\\\"May\\\")) {\\n return 5;\\n } else if (keccak256(abi.encodePacked(_month)) == keccak256(\\\"Jun\\\")) {\\n return 6;\\n } else if (keccak256(abi.encodePacked(_month)) == keccak256(\\\"Jul\\\")) {\\n return 7;\\n } else if (keccak256(abi.encodePacked(_month)) == keccak256(\\\"Aug\\\")) {\\n return 8;\\n } else if (keccak256(abi.encodePacked(_month)) == keccak256(\\\"Sep\\\")) {\\n return 9;\\n } else if (keccak256(abi.encodePacked(_month)) == keccak256(\\\"Oct\\\")) {\\n return 10;\\n } else if (keccak256(abi.encodePacked(_month)) == keccak256(\\\"Nov\\\")) {\\n return 11;\\n } else if (keccak256(abi.encodePacked(_month)) == keccak256(\\\"Dec\\\")) {\\n return 12;\\n } else {\\n revert(\\\"Invalid month\\\");\\n }\\n }\\n}\\n\",\"keccak256\":\"0x74067d5ce3820b0763d3faee918d58f423377b0729af325e8f7670ee4466b713\",\"license\":\"MIT\"},\"contracts/verifiers/hdfc_send_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 = 4702324236483749359376242949045822465319116726958430523945202749659299908356;\\n uint256 constant deltax2 = 3208360273321841799729262863226982899406813453791710733556183670543714948331;\\n uint256 constant deltay1 = 20522417867108599823821076712059869373887669366867675744686285826246555872195;\\n uint256 constant deltay2 = 12670660525148580266180384698238910692596142688879851786303352145688714106072;\\n\\n\\n uint256 constant IC0x = 8030280747517387687084877954234429976549976554414160216395914656104281510226;\\n uint256 constant IC0y = 17104142844454039490663032536549076577086340484025562888729760759694808607073;\\n\\n uint256 constant IC1x = 8772237536144360869027888991210947226074582978952325102593968904821952496262;\\n uint256 constant IC1y = 3122625119048240212134605236752638202088112691321561361183603728052095638860;\\n\\n uint256 constant IC2x = 9866912783934848269401547176895297308112639832209806585476829119584997553683;\\n uint256 constant IC2y = 18902285702690262680512478183614519704432813846276579831365492715033962922088;\\n\\n uint256 constant IC3x = 16438843084767575186842465721500270558254188834133860009416059973276198912687;\\n uint256 constant IC3y = 19637681743089590686621664763467973754245190088097969027495488201226096932201;\\n\\n uint256 constant IC4x = 16244957609429507716576008270804128279750543290646474514068167892102606186532;\\n uint256 constant IC4y = 16583611018934211828874350883177026517224756607611408661470436361325164178493;\\n\\n uint256 constant IC5x = 1880231857260586659536997649990861400508081010769531584628586338531085366147;\\n uint256 constant IC5y = 3722839973812376181715232865179709729667208171660553266886579036419738778905;\\n\\n uint256 constant IC6x = 1270409441163088899313281517456149544998439975345678595006767836844214411555;\\n uint256 constant IC6y = 10860874768269047281776646019661374802388524425936615586287903660208564296932;\\n\\n uint256 constant IC7x = 8434045441105599576935866859120453521448783233787069448109618000861402242607;\\n uint256 constant IC7y = 21026011281811734411736486883798620858743532933669000129465844405873540372296;\\n\\n uint256 constant IC8x = 16444826603046727982676650569240181121009190318002859965831975618430480163200;\\n uint256 constant IC8y = 13330479436133799576954496017456751243468101156567577943444875506883800747485;\\n\\n uint256 constant IC9x = 10555698792423422968534735611731058731769401972428000627056129295681285141769;\\n uint256 constant IC9y = 16920701552148154082888907960678652530790355790484478529127070630322055182590;\\n\\n uint256 constant IC10x = 560745557010411154560455562795570257381559403111495489793631749127360454692;\\n uint256 constant IC10y = 1810559313890482073038275535517759684260573040004038901411592861530654003553;\\n\\n uint256 constant IC11x = 16290647924331362744847363177877456121951933254859466501497770055360811608170;\\n uint256 constant IC11y = 7357664199131242056460365154843603175601302622408068632904637798809388576439;\\n\\n uint256 constant IC12x = 18752167508011332686902609807404507911733917202367475123738963433802316522501;\\n uint256 constant IC12y = 18915834728830385178845869536888475042275783085177607701559012212414153432990;\\n\\n uint256 constant IC13x = 510508922566750460861825255921948971141871467672055616177326398295988211346;\\n uint256 constant IC13y = 897537967901588078181449387398733392563087304136250554173225523551061601615;\\n\\n uint256 constant IC14x = 12705726630718483467144829385938528127462379446304491139120491926133440095304;\\n uint256 constant IC14y = 17721913697683987271820073115272158306375363130125429582329456762454201602835;\\n\\n uint256 constant IC15x = 5311519503957019671658191600270827412585500467097722438446167059198229906675;\\n uint256 constant IC15y = 18882610836190640499297283067779602696308349987082087123526913107849320426311;\\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[15] calldata _pubSignals) public view returns (bool) {\\n assembly {\\n function checkField(v) {\\n if iszero(lt(v, q)) {\\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 g1_mulAccC(_pVk, IC11x, IC11y, calldataload(add(pubSignals, 320)))\\n\\n g1_mulAccC(_pVk, IC12x, IC12y, calldataload(add(pubSignals, 352)))\\n\\n g1_mulAccC(_pVk, IC13x, IC13y, calldataload(add(pubSignals, 384)))\\n\\n g1_mulAccC(_pVk, IC14x, IC14y, calldataload(add(pubSignals, 416)))\\n\\n g1_mulAccC(_pVk, IC15x, IC15y, calldataload(add(pubSignals, 448)))\\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 checkField(calldataload(add(_pubSignals, 352)))\\n\\n checkField(calldataload(add(_pubSignals, 384)))\\n\\n checkField(calldataload(add(_pubSignals, 416)))\\n\\n checkField(calldataload(add(_pubSignals, 448)))\\n\\n checkField(calldataload(add(_pubSignals, 480)))\\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\":\"0x708985be21c0895b2b06ac50102da21cdf2bb14ab8f3f7c0a7be754bcc4207d8\",\"license\":\"GPL-3.0\"}},\"version\":1}", + "bytecode": "0x60a060405234801562000010575f80fd5b5060405162002d0738038062002d07833981016040819052620000339162000115565b848484848462000043336200009a565b6001600160a01b03858116608052600180546001600160a01b031990811687841617909155600280549091169185169190911790556003620000868382620002b6565b506004555062000382975050505050505050565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b0381168114620000fe575f80fd5b50565b634e487b7160e01b5f52604160045260245ffd5b5f805f805f60a086880312156200012a575f80fd5b85516200013781620000e9565b809550506020808701516200014c81620000e9565b60408801519095506200015f81620000e9565b60608801519094506001600160401b03808211156200017c575f80fd5b818901915089601f83011262000190575f80fd5b815181811115620001a557620001a562000101565b604051601f8201601f19908116603f01168101908382118183101715620001d057620001d062000101565b816040528281528c86848701011115620001e8575f80fd5b5f93505b828410156200020b5784840186015181850187015292850192620001ec565b5f868483010152809750505050505050608086015190509295509295909350565b600181811c908216806200024157607f821691505b6020821081036200026057634e487b7160e01b5f52602260045260245ffd5b50919050565b601f821115620002b157805f5260205f20601f840160051c810160208510156200028d5750805b601f840160051c820191505b81811015620002ae575f815560010162000299565b50505b505050565b81516001600160401b03811115620002d257620002d262000101565b620002ea81620002e384546200022c565b8462000266565b602080601f83116001811462000320575f8415620003085750858301515b5f19600386901b1c1916600185901b1785556200037a565b5f85815260208120601f198616915b8281101562000350578886015182559484019460019091019084016200032f565b50858210156200036e57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b608051612966620003a15f395f818160f9015261030a01526129665ff3fe608060405234801561000f575f80fd5b50600436106100f0575f3560e01c8063bf93fde111610093578063dbac582111610063578063dbac582114610219578063f054a9a314610230578063f2fde38b14610243578063f6c7226b14610256575f80fd5b8063bf93fde1146101ae578063c0d05fed146101e9578063ced1e978146101fe578063d0b71f9914610206575f80fd5b80638da5cb5b116100ce5780638da5cb5b14610165578063a8ef333f14610175578063b2a3fda414610188578063b870676c1461019b575f80fd5b806315d276e1146100f457806319d0915214610138578063715018a61461015b575b5f80fd5b61011b7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020015b60405180910390f35b61014b610146366004612285565b610269565b604051901515815260200161012f565b6101636102da565b005b5f546001600160a01b031661011b565b60015461011b906001600160a01b031681565b610163610196366004612285565b6102ed565b60025461011b906001600160a01b031681565b6101c16101bc36600461229c565b6102fa565b604080519586526020860194909452928401919091526060830152608082015260a00161012f565b6101f16105a1565b60405161012f91906122d5565b6101f161062d565b61016361021436600461231b565b6106bd565b61022260045481565b60405190815260200161012f565b61014b61023e366004612346565b6106e7565b61016361025136600461231b565b61105f565b6101636102643660046123bb565b6110d5565b600154604051630ce848a960e11b8152600481018390525f916001600160a01b0316906319d0915290602401602060405180830381865afa1580156102b0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102d49190612466565b92915050565b6102e26110ed565b6102eb5f611146565b565b6102f56110ed565b600455565b5f80808080336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461037c5760405162461bcd60e51b815260206004820181905260248201527f4f6e6c792052616d702063616e2063616c6c20746869732066756e6374696f6e60448201526064015b60405180910390fd5b6040805163f054a9a360e01b8152309163f054a9a3916103af918a919082019060c0830190610100840190600401612485565b602060405180830381865afa1580156103ca573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103ee9190612466565b61042a5760405162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b210283937b7b360991b6044820152606401610373565b610438610100870135610269565b6104845760405162461bcd60e51b815260206004820152601b60248201527f496e76616c6964206d61696c736572766572206b6579206861736800000000006044820152606401610373565b5f610496876101000160016004611195565b905060036040516104a79190612517565b6040518091039020816040516020016104c09190612589565b60405160208183030381529060405280519060200120146105235760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420656d61696c2066726f6d20616464726573730000000000006044820152606401610373565b61053f6006610539896101000160046006611195565b90611265565b95505f61055388610100016006600b611195565b90506004546105618261127c565b61056b91906125b8565b95506102808801359450610260880135935061058b6102a0890135611417565b509496939592945090926102c090920135919050565b600380546105ae906124e5565b80601f01602080910402602001604051908101604052809291908181526020018280546105da906124e5565b80156106255780601f106105fc57610100808354040283529160200191610625565b820191905f5260205f20905b81548152906001019060200180831161060857829003601f168201915b505050505081565b60606003805461063c906124e5565b80601f0160208091040260200160405190810160405280929190818152602001828054610668906124e5565b80156106b35780601f1061068a576101008083540402835291602001916106b3565b820191905f5260205f20905b81548152906001019060200180831161069657829003601f168201915b5050505050905090565b6106c56110ed565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b5f610f66565b7f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47811061071c575f805260205ff35b50565b5f60405183815284602082015285604082015260408160608360076107d05a03fa91508161074f575f805260205ff35b825160408201526020830151606082015260408360808360066107d05a03fa9150508061077e575f805260205ff35b5050505050565b7f11c0fa536785a14ea232244faf4db797ed78290ed4fb27d5038cac6ae9a3915285527f25d09a0e68aa815305c2995cc88de47499c6bf8dd88aebc829db24846944696160208601525f608086018661082187357f06e757dafa88a886ce63a8c2b453fedcc71a0eb31f0131a905a4913207355d4c7f1364e9163e5b15b2805a6aac65afcb4001017d5343017c737564a23b6d0842868461071f565b61087160208801357f29ca5087e79a2d1fb754d59033fec517f164dfd734b75a8cc89c6e2894cec0687f15d07987dd5b551b72857cefaed299e7a1989a2927f859a6d0ad593beba936138461071f565b6108c160408801357f2b6a88b3112d75e15c1fc7f737cf28da3a22df26156e80d1dceb1d792aa6f5697f24580e32cd5353fa5aa622fec5d0cb8834ad9a35a5d7ed3de960648f39fa42af8461071f565b61091160608801357f24a9fdbfeb9e558ea7eb1c0f9d2f59adb3e19fee489181e0649cac9968d92c3d7f23ea51f6d35583a15c0e0f0bb44cdb055ddccb3109365d0feb10559bce3f68248461071f565b61096160808801357f083b0d8149f542f7d51ff78dd5bd947ac228adf4765f13cbb8ae4b0c9de33d197f04282c6bb25a8a05b9d698fa726e427251a636a05ae11f8178ed74ce70c7b3838461071f565b6109b160a08801357f1803098aec4fded4fc5b2bab68cf7fb1f5cdfc173e8b4c2d6f3ad5ae8b7d5ce47f02cf06b9216abdbe0d145ee6ba106240740f6554ba338900ae157bc1d11361238461071f565b610a0160c08801357f2e7c4cf7b58d9b12bb9cee35f053430f80678fe1885b216886c042d0cde497487f12a5802440d5b5d29b299b8818078e7c2165b5d2f49776e55ac4c8da11581e2f8461071f565b610a5160e08801357f1d78c8b32944313d7e911c1c721109f4a04d0879fe1e1802e3ddf943612a4ddd7f245b7127d480d0e750564b78818a037a57e3a17f889b15dbb01e9e243ad421808461071f565b610aa26101008801357f2568c716b634adaf4106a56b42776b724d5ef21e52864a1347088de129b478fe7f17565054db4aa08be111cfc14344b79875bc704e563362d7a9d3992271be35098461071f565b610af36101208801357f0400bd816ec371a36d4594b5466ba7a092139238746fcee0f5e254b7944c51617f013d5ee8b0b9e671e5bde7130e47682c47ca38dd479db7331ca393bf5edfa0248461071f565b610b446101408801357f10444a550566f8186e8fd121fe8a929e92f66e479515b67833a3d4bc07e5eeb77f24042e12cbcf48ac6d7b05da02753790ed095694fe2b3184239ec60500d3a86a8461071f565b610b956101608801357f29d1fba93734715a1dee7b66433894a2fb3304bcc7784a98f5f54b57c5f31f9e7f297559c6982845ac8cbc9d10c68703d05fff58f59bd022718930361da7d624058461071f565b610be66101808801357f01fbfd0d8299e28fe5b7b1e44840e0e49175cd784ea29456a5544d41ec56ed4f7f0120f0145b0c23de99655163334fafda2296421f9ff6d616a4381b731bcf8e928461071f565b610c376101a08801357f272e3f68e4dde921f3fecbf1da3e48be0375066071f79cf60d12a94909b013137f1c172fb9ad177d1f52f6f867020a4fd1d20819d027b26b5306eabd3d6a2da4488461071f565b610c886101c08801357f29bf2dd28bddc6677bfc29ae10bc2fc88614c805470de8f9c3bd943ef5b56b477f0bbe36a822bf94a2563eccdcdf022dce00eb8770630efa37084f7dabe6ec84f38461071f565b50823581527f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4760208401357f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4703066020820152833560408201526020840135606082015260408401356080820152606084013560a08201527f2d4d9aa7e302d9df41749d5507949d05dbea33fbb16c643b22f599a2be6df2e260c08201527f14bedd503c37ceb061d8ec60209fe345ce89830a19230301f076caff004d192660e08201527f0967032fcbf776d1afc985f88877f182d38480a653f2decaa9794cbc3bf3060c6101008201527f0e187847ad4c798374d0d6732bf501847dd68bc0e071241e0213bc7fc13db7ab6101208201527f304cfbd1e08a704a99f5e847d93f8c3caafddec46b7a0d379da69a4d112346a76101408201527f1739c1b1a457a8c7313123d24d2f9192f896b7c63eea05a9d57f06547ad0cec86101608201525f87015161018082015260205f018701516101a08201527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c26101c08201527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed6101e08201527f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b6102008201527f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa610220820152843561024082015260208501356102608201527f0a656bd3ce0f460dfb7f25d7c71d52fecdc0eb363d413b2585775d8283eb0b046102808201527f0717de189821c8fd7338c4b95469c6dd47ee1aad6c8510dc9bcd7983852514eb6102a08201527f2d5f46e1cbebc83f7340eecebc2fff23e5da01cab367c8f7ec52c1bd3f6a2bc36102c08201527f1c0356f78812a13151f9212f9c69e8a7a9b2a7634c2b43617adda632ce9954d86102e08201526020816103008360086107d05a03fa9051169695505050505050565b6040516103808101604052610f7d5f8401356106ed565b610f8a60208401356106ed565b610f9760408401356106ed565b610fa460608401356106ed565b610fb160808401356106ed565b610fbe60a08401356106ed565b610fcb60c08401356106ed565b610fd860e08401356106ed565b610fe66101008401356106ed565b610ff46101208401356106ed565b6110026101408401356106ed565b6110106101608401356106ed565b61101e6101808401356106ed565b61102c6101a08401356106ed565b61103a6101c08401356106ed565b6110486101e08401356106ed565b611055818486888a610785565b9050805f5260205ff35b6110676110ed565b6001600160a01b0381166110cc5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610373565b61071c81611146565b6110dd6110ed565b60036110e98282612614565b5050565b5f546001600160a01b031633146102eb5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610373565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60605f6111a284846126d4565b60ff1667ffffffffffffffff8111156111bd576111bd6123a7565b6040519080825280602002602001820160405280156111e6578160200160208202803683370190505b50905060ff84165b8360ff16811015611241578581600f811061120b5761120b6124d1565b60200201358261121e60ff8816846126ed565b8151811061122e5761122e6124d1565b60209081029190910101526001016111ee565b5061125c600782516112539190612700565b82906007611524565b95945050505050565b5f61127583601760f91b84611836565b9392505050565b5f61128561225d565b5f805f5b8551811015611333578581815181106112a4576112a46124d1565b6020910101516001600160f81b031916600160fd1b14806112e957508581815181106112d2576112d26124d1565b6020910101516001600160f81b031916601d60f91b145b1561132b576112f98683836119fc565b84846008811061130b5761130b6124d1565b602002015261131b8160016125b8565b91508261132781612717565b9350505b600101611289565b50845161134390869083906119fc565b838360088110611355576113556124d1565b6020020152600782146113a05760405162461bcd60e51b8152602060048201526013602482015272496e76616c6964206461746520737472696e6760681b6044820152606401610373565b5f6113fa6113b7828660035b602002015190611265565b60408601516113c590611abd565b6113d15f8860016113ac565b6113dd5f8960046113ac565b6113e95f8a60056113ac565b6113f55f8b60066113ac565b611ef2565b905061140d818560076020020151611f4d565b9695505050505050565b60025460405163169394bb60e01b8152600481018390526001600160a01b039091169063169394bb90602401602060405180830381865afa15801561145e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114829190612466565b156114cf5760405162461bcd60e51b815260206004820152601f60248201527f4e756c6c69666965722068617320616c7265616479206265656e2075736564006044820152606401610373565b600254604051632dea6f9960e11b8152600481018390526001600160a01b0390911690635bd4df32906024015f604051808303815f87803b158015611512575f80fd5b505af115801561077e573d5f803e3d5ffd5b60605f808386516115359190612700565b67ffffffffffffffff81111561154d5761154d6123a7565b6040519080825280601f01601f191660200182016040528015611577576020820181803683370190505b5090505f805b87518161ffff161015611711575f888261ffff16815181106115a1576115a16124d1565b602002602001015190505f8767ffffffffffffffff8111156115c5576115c56123a7565b6040519080825280602002602001820160405280156115ee578160200160208202803683370190505b5090505f5b8881101561163557611606816008612700565b83901c82828151811061161b5761161b6124d1565b60ff909216602092830291909101909101526001016115f3565b505f5b888110156116fb575f828281518110611653576116536124d1565b602002602001015160ff169050805f146116c8578060f81b87878151811061167d5761167d6124d1565b60200101906001600160f81b03191690815f1a9053508561169d81612717565b96506116ac9050600289612743565b60ff165f036116c3576116c0600189612764565b97505b6116eb565b6116d3600289612743565b60ff166001036116eb576116e8600189612764565b97505b5060089290921c91600101611638565b50505080806117099061277d565b91505061157d565b5060018360ff1610156117b25760405162461bcd60e51b815260206004820152605760248201527f4e6f207061636b656420627974657320666f756e642120496e76616c6964206660448201527f696e616c207374617465206f66207061636b656420627974657320696e20656d60648201527f61696c3b2076616c7565206973206c696b656c79203021000000000000000000608482015260a401610373565b858111156118205760405162461bcd60e51b815260206004820152603560248201527f5061636b6564206279746573206d6f7265207468616e20616c6c6f776564206d6044820152746178206e756d626572206f66207369676e616c732160581b6064820152608401610373565b5f61182a8361203e565b98975050505050505050565b5f83818080805b845181101561198157603060f81b85828151811061185d5761185d6124d1565b01602001516001600160f81b0319161080159061189e5750603960f81b85828151811061188c5761188c6124d1565b01602001516001600160f81b03191611155b156118e15760308582815181106118b7576118b76124d1565b01602001516118c9919060f81c6126ed565b6118d485600a612700565b6118de91906125b8565b93505b81156118f557826118f181612717565b9350505b876001600160f81b031916858281518110611912576119126124d1565b01602001516001600160f81b031916036119795781156119745760405162461bcd60e51b815260206004820152601c60248201527f537472696e6720686173206d756c7469706c6520646563696d616c73000000006044820152606401610373565b600191505b60010161183d565b50858211156119dd5760405162461bcd60e51b815260206004820152602260248201527f537472696e672068617320746f6f206d616e7920646563696d616c20706c6163604482015261657360f01b6064820152608401610373565b6119e782876126ed565b6119f290600a61287d565b61182a9084612700565b6060835f611a0a85856126ed565b67ffffffffffffffff811115611a2257611a226123a7565b6040519080825280601f01601f191660200182016040528015611a4c576020820181803683370190505b509050845b84811015611ab357828181518110611a6b57611a6b6124d1565b01602001516001600160f81b03191682611a8588846126ed565b81518110611a9557611a956124d1565b60200101906001600160f81b03191690815f1a905350600101611a51565b5095945050505050565b5f7f4a18c9083b936e0757952a5d9d34b5575d427661506fbe9908c2a1da3f3e80d982604051602001611af09190612589565b6040516020818303038152906040528051906020012003611b1357506001919050565b7f78ec83563b948f0ac242d7eaefd592adf65964e11cc27f11ae41faa99a1e990a82604051602001611b459190612589565b6040516020818303038152906040528051906020012003611b6857506002919050565b7f2bab7d3f253ae0e3722abcc2571faced288946968116996ffc3de31fb7348ec382604051602001611b9a9190612589565b6040516020818303038152906040528051906020012003611bbd57506003919050565b7fc6f33aba2381b69f05afc78835e501547a9daffa08d674623068c378423ac18882604051602001611bef9190612589565b6040516020818303038152906040528051906020012003611c1257506004919050565b7fdb5ee1006003349b29eda5be5fe34f728659f836a948d4ec595114aebbb159d382604051602001611c449190612589565b6040516020818303038152906040528051906020012003611c6757506005919050565b7f44a0046ab54c1458fc3c39dfcadc52509ad809730ec301470d2d747dbe77242d82604051602001611c999190612589565b6040516020818303038152906040528051906020012003611cbc57506006919050565b7f74d9e46f10329e61dc333ff1800274be516163110de31961b4e0c61de3e90c5c82604051602001611cee9190612589565b6040516020818303038152906040528051906020012003611d1157506007919050565b7fed40c08ab6f3d9c5d71155e25b1271d5b9eca8c27bf89e1d2293fcb77c5abf6482604051602001611d439190612589565b6040516020818303038152906040528051906020012003611d6657506008919050565b7f7d801199c77197eb9933a633741db90c2c6f3d7d14aca35f5f80a41b4a8863ac82604051602001611d989190612589565b6040516020818303038152906040528051906020012003611dbb57506009919050565b7fb7841ed82fc96483f061ddc0b19846855df22558c4aea3b3b058ce0d9f1f516482604051602001611ded9190612589565b6040516020818303038152906040528051906020012003611e105750600a919050565b7f487851233e540dddea8f904d6802590aead5463b1c44965d68348bb7def25cf482604051602001611e429190612589565b6040516020818303038152906040528051906020012003611e655750600b919050565b7f3bd971d8758c58fe0c4d635451404450c5edda87d624a89819e0be5a122933dc82604051602001611e979190612589565b6040516020818303038152906040528051906020012003611eba5750600c919050565b60405162461bcd60e51b815260206004820152600d60248201526c092dcecc2d8d2c840dadedce8d609b1b6044820152606401610373565b5f81611eff603c85612700565b611f0b610e1087612700565b62015180611f1a8b8b8b61212f565b611f249190612700565b611f2e91906125b8565b611f3891906125b8565b611f4291906125b8565b979650505050505050565b5f8151600514611f9f5760405162461bcd60e51b815260206004820152601760248201527f496e76616c69642074696d657a6f6e65206f66667365740000000000000000006044820152606401610373565b5f611fb18161053985600160036119fc565b90505f611fc58161053986600360056119fc565b90505f611fd382603c612700565b611fdf84610e10612700565b611fe991906125b8565b90505f611ff8868260016119fc565b5f81518110612009576120096124d1565b01602001516001600160f81b0319169050602b60f81b81146120345761202f82886125b8565b611f42565b611f4282886126ed565b805160609082905f5b825181101561208757828181518110612062576120626124d1565b01602001516001600160f81b0319165f0361207f57809150612087565b600101612047565b505f8167ffffffffffffffff8111156120a2576120a26123a7565b6040519080825280601f01601f1916602001820160405280156120cc576020820181803683370190505b5090505f5b82811015612126578381815181106120eb576120eb6124d1565b602001015160f81c60f81b828281518110612108576121086124d1565b60200101906001600160f81b03191690815f1a9053506001016120d1565b50949350505050565b5f6107b284101561213e575f80fd5b8383835f62253d8c60046064600c612157600e88612888565b61216191906128ae565b61216d886113246128da565b61217791906128da565b61218191906128ae565b61218c906003612901565b61219691906128ae565b600c806121a4600e88612888565b6121ae91906128ae565b6121b990600c612901565b6121c4600288612888565b6121ce9190612888565b6121da9061016f612901565b6121e491906128ae565b6004600c6121f3600e89612888565b6121fd91906128ae565b612209896112c06128da565b61221391906128da565b61221f906105b5612901565b61222991906128ae565b612235617d4b87612888565b61223f91906128da565b61224991906128da565b6122539190612888565b61182a9190612888565b6040518061010001604052806008905b606081526020019060019003908161226d5790505090565b5f60208284031215612295575f80fd5b5035919050565b5f6102e082840312156122ad575f80fd5b50919050565b5f5b838110156122cd5781810151838201526020016122b5565b50505f910152565b602081525f82518060208401526122f38160408501602087016122b3565b601f01601f19169190910160400192915050565b6001600160a01b038116811461071c575f80fd5b5f6020828403121561232b575f80fd5b813561127581612307565b80604081018310156102d4575f80fd5b5f805f806102e080868803121561235b575f80fd5b6123658787612336565b945060c0860187811115612377575f80fd5b6040870194506123878882612336565b935050868187011115612398575f80fd5b50929591945092610100019150565b634e487b7160e01b5f52604160045260245ffd5b5f602082840312156123cb575f80fd5b813567ffffffffffffffff808211156123e2575f80fd5b818401915084601f8301126123f5575f80fd5b813581811115612407576124076123a7565b604051601f8201601f19908116603f0116810190838211818310171561242f5761242f6123a7565b81604052828152876020848701011115612447575f80fd5b826020860160208301375f928101602001929092525095945050505050565b5f60208284031215612476575f80fd5b81518015158114611275575f80fd5b6102e08101604080878437808301865f5b60028110156124b357838284379183019190830190600101612496565b505050808560c0850137506101e08361010084013795945050505050565b634e487b7160e01b5f52603260045260245ffd5b600181811c908216806124f957607f821691505b6020821081036122ad57634e487b7160e01b5f52602260045260245ffd5b5f808354612524816124e5565b6001828116801561253c57600181146125515761257d565b60ff198416875282151583028701945061257d565b875f526020805f205f5b858110156125745781548a82015290840190820161255b565b50505082870194505b50929695505050505050565b5f825161259a8184602087016122b3565b9190910192915050565b634e487b7160e01b5f52601160045260245ffd5b808201808211156102d4576102d46125a4565b601f82111561260f57805f5260205f20601f840160051c810160208510156125f05750805b601f840160051c820191505b8181101561077e575f81556001016125fc565b505050565b815167ffffffffffffffff81111561262e5761262e6123a7565b6126428161263c84546124e5565b846125cb565b602080601f831160018114612675575f841561265e5750858301515b5f19600386901b1c1916600185901b1785556126cc565b5f85815260208120601f198616915b828110156126a357888601518255948401946001909101908401612684565b50858210156126c057878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b60ff82811682821603908111156102d4576102d46125a4565b818103818111156102d4576102d46125a4565b80820281158282048414176102d4576102d46125a4565b5f60018201612728576127286125a4565b5060010190565b634e487b7160e01b5f52601260045260245ffd5b5f60ff8316806127555761275561272f565b8060ff84160691505092915050565b60ff81811683821601908111156102d4576102d46125a4565b5f61ffff808316818103612793576127936125a4565b6001019392505050565b600181815b808511156127d757815f19048211156127bd576127bd6125a4565b808516156127ca57918102915b93841c93908002906127a2565b509250929050565b5f826127ed575060016102d4565b816127f957505f6102d4565b816001811461280f576002811461281957612835565b60019150506102d4565b60ff84111561282a5761282a6125a4565b50506001821b6102d4565b5060208310610133831016604e8410600b8410161715612858575081810a6102d4565b612862838361279d565b805f1904821115612875576128756125a4565b029392505050565b5f61127583836127df565b8181035f8312801583831316838312821617156128a7576128a76125a4565b5092915050565b5f826128bc576128bc61272f565b600160ff1b82145f19841416156128d5576128d56125a4565b500590565b8082018281125f8312801582168215821617156128f9576128f96125a4565b505092915050565b8082025f8212600160ff1b8414161561291c5761291c6125a4565b81810583148215176102d4576102d46125a456fea26469706673582212203ccd4a35386f7e621857328986ffd9e421258a15f9bd4cad5efa73430d11305064736f6c63430008180033", + "deployedBytecode": "0x608060405234801561000f575f80fd5b50600436106100f0575f3560e01c8063bf93fde111610093578063dbac582111610063578063dbac582114610219578063f054a9a314610230578063f2fde38b14610243578063f6c7226b14610256575f80fd5b8063bf93fde1146101ae578063c0d05fed146101e9578063ced1e978146101fe578063d0b71f9914610206575f80fd5b80638da5cb5b116100ce5780638da5cb5b14610165578063a8ef333f14610175578063b2a3fda414610188578063b870676c1461019b575f80fd5b806315d276e1146100f457806319d0915214610138578063715018a61461015b575b5f80fd5b61011b7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020015b60405180910390f35b61014b610146366004612285565b610269565b604051901515815260200161012f565b6101636102da565b005b5f546001600160a01b031661011b565b60015461011b906001600160a01b031681565b610163610196366004612285565b6102ed565b60025461011b906001600160a01b031681565b6101c16101bc36600461229c565b6102fa565b604080519586526020860194909452928401919091526060830152608082015260a00161012f565b6101f16105a1565b60405161012f91906122d5565b6101f161062d565b61016361021436600461231b565b6106bd565b61022260045481565b60405190815260200161012f565b61014b61023e366004612346565b6106e7565b61016361025136600461231b565b61105f565b6101636102643660046123bb565b6110d5565b600154604051630ce848a960e11b8152600481018390525f916001600160a01b0316906319d0915290602401602060405180830381865afa1580156102b0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102d49190612466565b92915050565b6102e26110ed565b6102eb5f611146565b565b6102f56110ed565b600455565b5f80808080336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461037c5760405162461bcd60e51b815260206004820181905260248201527f4f6e6c792052616d702063616e2063616c6c20746869732066756e6374696f6e60448201526064015b60405180910390fd5b6040805163f054a9a360e01b8152309163f054a9a3916103af918a919082019060c0830190610100840190600401612485565b602060405180830381865afa1580156103ca573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103ee9190612466565b61042a5760405162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b210283937b7b360991b6044820152606401610373565b610438610100870135610269565b6104845760405162461bcd60e51b815260206004820152601b60248201527f496e76616c6964206d61696c736572766572206b6579206861736800000000006044820152606401610373565b5f610496876101000160016004611195565b905060036040516104a79190612517565b6040518091039020816040516020016104c09190612589565b60405160208183030381529060405280519060200120146105235760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420656d61696c2066726f6d20616464726573730000000000006044820152606401610373565b61053f6006610539896101000160046006611195565b90611265565b95505f61055388610100016006600b611195565b90506004546105618261127c565b61056b91906125b8565b95506102808801359450610260880135935061058b6102a0890135611417565b509496939592945090926102c090920135919050565b600380546105ae906124e5565b80601f01602080910402602001604051908101604052809291908181526020018280546105da906124e5565b80156106255780601f106105fc57610100808354040283529160200191610625565b820191905f5260205f20905b81548152906001019060200180831161060857829003601f168201915b505050505081565b60606003805461063c906124e5565b80601f0160208091040260200160405190810160405280929190818152602001828054610668906124e5565b80156106b35780601f1061068a576101008083540402835291602001916106b3565b820191905f5260205f20905b81548152906001019060200180831161069657829003601f168201915b5050505050905090565b6106c56110ed565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b5f610f66565b7f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47811061071c575f805260205ff35b50565b5f60405183815284602082015285604082015260408160608360076107d05a03fa91508161074f575f805260205ff35b825160408201526020830151606082015260408360808360066107d05a03fa9150508061077e575f805260205ff35b5050505050565b7f11c0fa536785a14ea232244faf4db797ed78290ed4fb27d5038cac6ae9a3915285527f25d09a0e68aa815305c2995cc88de47499c6bf8dd88aebc829db24846944696160208601525f608086018661082187357f06e757dafa88a886ce63a8c2b453fedcc71a0eb31f0131a905a4913207355d4c7f1364e9163e5b15b2805a6aac65afcb4001017d5343017c737564a23b6d0842868461071f565b61087160208801357f29ca5087e79a2d1fb754d59033fec517f164dfd734b75a8cc89c6e2894cec0687f15d07987dd5b551b72857cefaed299e7a1989a2927f859a6d0ad593beba936138461071f565b6108c160408801357f2b6a88b3112d75e15c1fc7f737cf28da3a22df26156e80d1dceb1d792aa6f5697f24580e32cd5353fa5aa622fec5d0cb8834ad9a35a5d7ed3de960648f39fa42af8461071f565b61091160608801357f24a9fdbfeb9e558ea7eb1c0f9d2f59adb3e19fee489181e0649cac9968d92c3d7f23ea51f6d35583a15c0e0f0bb44cdb055ddccb3109365d0feb10559bce3f68248461071f565b61096160808801357f083b0d8149f542f7d51ff78dd5bd947ac228adf4765f13cbb8ae4b0c9de33d197f04282c6bb25a8a05b9d698fa726e427251a636a05ae11f8178ed74ce70c7b3838461071f565b6109b160a08801357f1803098aec4fded4fc5b2bab68cf7fb1f5cdfc173e8b4c2d6f3ad5ae8b7d5ce47f02cf06b9216abdbe0d145ee6ba106240740f6554ba338900ae157bc1d11361238461071f565b610a0160c08801357f2e7c4cf7b58d9b12bb9cee35f053430f80678fe1885b216886c042d0cde497487f12a5802440d5b5d29b299b8818078e7c2165b5d2f49776e55ac4c8da11581e2f8461071f565b610a5160e08801357f1d78c8b32944313d7e911c1c721109f4a04d0879fe1e1802e3ddf943612a4ddd7f245b7127d480d0e750564b78818a037a57e3a17f889b15dbb01e9e243ad421808461071f565b610aa26101008801357f2568c716b634adaf4106a56b42776b724d5ef21e52864a1347088de129b478fe7f17565054db4aa08be111cfc14344b79875bc704e563362d7a9d3992271be35098461071f565b610af36101208801357f0400bd816ec371a36d4594b5466ba7a092139238746fcee0f5e254b7944c51617f013d5ee8b0b9e671e5bde7130e47682c47ca38dd479db7331ca393bf5edfa0248461071f565b610b446101408801357f10444a550566f8186e8fd121fe8a929e92f66e479515b67833a3d4bc07e5eeb77f24042e12cbcf48ac6d7b05da02753790ed095694fe2b3184239ec60500d3a86a8461071f565b610b956101608801357f29d1fba93734715a1dee7b66433894a2fb3304bcc7784a98f5f54b57c5f31f9e7f297559c6982845ac8cbc9d10c68703d05fff58f59bd022718930361da7d624058461071f565b610be66101808801357f01fbfd0d8299e28fe5b7b1e44840e0e49175cd784ea29456a5544d41ec56ed4f7f0120f0145b0c23de99655163334fafda2296421f9ff6d616a4381b731bcf8e928461071f565b610c376101a08801357f272e3f68e4dde921f3fecbf1da3e48be0375066071f79cf60d12a94909b013137f1c172fb9ad177d1f52f6f867020a4fd1d20819d027b26b5306eabd3d6a2da4488461071f565b610c886101c08801357f29bf2dd28bddc6677bfc29ae10bc2fc88614c805470de8f9c3bd943ef5b56b477f0bbe36a822bf94a2563eccdcdf022dce00eb8770630efa37084f7dabe6ec84f38461071f565b50823581527f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4760208401357f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4703066020820152833560408201526020840135606082015260408401356080820152606084013560a08201527f2d4d9aa7e302d9df41749d5507949d05dbea33fbb16c643b22f599a2be6df2e260c08201527f14bedd503c37ceb061d8ec60209fe345ce89830a19230301f076caff004d192660e08201527f0967032fcbf776d1afc985f88877f182d38480a653f2decaa9794cbc3bf3060c6101008201527f0e187847ad4c798374d0d6732bf501847dd68bc0e071241e0213bc7fc13db7ab6101208201527f304cfbd1e08a704a99f5e847d93f8c3caafddec46b7a0d379da69a4d112346a76101408201527f1739c1b1a457a8c7313123d24d2f9192f896b7c63eea05a9d57f06547ad0cec86101608201525f87015161018082015260205f018701516101a08201527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c26101c08201527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed6101e08201527f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b6102008201527f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa610220820152843561024082015260208501356102608201527f0a656bd3ce0f460dfb7f25d7c71d52fecdc0eb363d413b2585775d8283eb0b046102808201527f0717de189821c8fd7338c4b95469c6dd47ee1aad6c8510dc9bcd7983852514eb6102a08201527f2d5f46e1cbebc83f7340eecebc2fff23e5da01cab367c8f7ec52c1bd3f6a2bc36102c08201527f1c0356f78812a13151f9212f9c69e8a7a9b2a7634c2b43617adda632ce9954d86102e08201526020816103008360086107d05a03fa9051169695505050505050565b6040516103808101604052610f7d5f8401356106ed565b610f8a60208401356106ed565b610f9760408401356106ed565b610fa460608401356106ed565b610fb160808401356106ed565b610fbe60a08401356106ed565b610fcb60c08401356106ed565b610fd860e08401356106ed565b610fe66101008401356106ed565b610ff46101208401356106ed565b6110026101408401356106ed565b6110106101608401356106ed565b61101e6101808401356106ed565b61102c6101a08401356106ed565b61103a6101c08401356106ed565b6110486101e08401356106ed565b611055818486888a610785565b9050805f5260205ff35b6110676110ed565b6001600160a01b0381166110cc5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610373565b61071c81611146565b6110dd6110ed565b60036110e98282612614565b5050565b5f546001600160a01b031633146102eb5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610373565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60605f6111a284846126d4565b60ff1667ffffffffffffffff8111156111bd576111bd6123a7565b6040519080825280602002602001820160405280156111e6578160200160208202803683370190505b50905060ff84165b8360ff16811015611241578581600f811061120b5761120b6124d1565b60200201358261121e60ff8816846126ed565b8151811061122e5761122e6124d1565b60209081029190910101526001016111ee565b5061125c600782516112539190612700565b82906007611524565b95945050505050565b5f61127583601760f91b84611836565b9392505050565b5f61128561225d565b5f805f5b8551811015611333578581815181106112a4576112a46124d1565b6020910101516001600160f81b031916600160fd1b14806112e957508581815181106112d2576112d26124d1565b6020910101516001600160f81b031916601d60f91b145b1561132b576112f98683836119fc565b84846008811061130b5761130b6124d1565b602002015261131b8160016125b8565b91508261132781612717565b9350505b600101611289565b50845161134390869083906119fc565b838360088110611355576113556124d1565b6020020152600782146113a05760405162461bcd60e51b8152602060048201526013602482015272496e76616c6964206461746520737472696e6760681b6044820152606401610373565b5f6113fa6113b7828660035b602002015190611265565b60408601516113c590611abd565b6113d15f8860016113ac565b6113dd5f8960046113ac565b6113e95f8a60056113ac565b6113f55f8b60066113ac565b611ef2565b905061140d818560076020020151611f4d565b9695505050505050565b60025460405163169394bb60e01b8152600481018390526001600160a01b039091169063169394bb90602401602060405180830381865afa15801561145e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114829190612466565b156114cf5760405162461bcd60e51b815260206004820152601f60248201527f4e756c6c69666965722068617320616c7265616479206265656e2075736564006044820152606401610373565b600254604051632dea6f9960e11b8152600481018390526001600160a01b0390911690635bd4df32906024015f604051808303815f87803b158015611512575f80fd5b505af115801561077e573d5f803e3d5ffd5b60605f808386516115359190612700565b67ffffffffffffffff81111561154d5761154d6123a7565b6040519080825280601f01601f191660200182016040528015611577576020820181803683370190505b5090505f805b87518161ffff161015611711575f888261ffff16815181106115a1576115a16124d1565b602002602001015190505f8767ffffffffffffffff8111156115c5576115c56123a7565b6040519080825280602002602001820160405280156115ee578160200160208202803683370190505b5090505f5b8881101561163557611606816008612700565b83901c82828151811061161b5761161b6124d1565b60ff909216602092830291909101909101526001016115f3565b505f5b888110156116fb575f828281518110611653576116536124d1565b602002602001015160ff169050805f146116c8578060f81b87878151811061167d5761167d6124d1565b60200101906001600160f81b03191690815f1a9053508561169d81612717565b96506116ac9050600289612743565b60ff165f036116c3576116c0600189612764565b97505b6116eb565b6116d3600289612743565b60ff166001036116eb576116e8600189612764565b97505b5060089290921c91600101611638565b50505080806117099061277d565b91505061157d565b5060018360ff1610156117b25760405162461bcd60e51b815260206004820152605760248201527f4e6f207061636b656420627974657320666f756e642120496e76616c6964206660448201527f696e616c207374617465206f66207061636b656420627974657320696e20656d60648201527f61696c3b2076616c7565206973206c696b656c79203021000000000000000000608482015260a401610373565b858111156118205760405162461bcd60e51b815260206004820152603560248201527f5061636b6564206279746573206d6f7265207468616e20616c6c6f776564206d6044820152746178206e756d626572206f66207369676e616c732160581b6064820152608401610373565b5f61182a8361203e565b98975050505050505050565b5f83818080805b845181101561198157603060f81b85828151811061185d5761185d6124d1565b01602001516001600160f81b0319161080159061189e5750603960f81b85828151811061188c5761188c6124d1565b01602001516001600160f81b03191611155b156118e15760308582815181106118b7576118b76124d1565b01602001516118c9919060f81c6126ed565b6118d485600a612700565b6118de91906125b8565b93505b81156118f557826118f181612717565b9350505b876001600160f81b031916858281518110611912576119126124d1565b01602001516001600160f81b031916036119795781156119745760405162461bcd60e51b815260206004820152601c60248201527f537472696e6720686173206d756c7469706c6520646563696d616c73000000006044820152606401610373565b600191505b60010161183d565b50858211156119dd5760405162461bcd60e51b815260206004820152602260248201527f537472696e672068617320746f6f206d616e7920646563696d616c20706c6163604482015261657360f01b6064820152608401610373565b6119e782876126ed565b6119f290600a61287d565b61182a9084612700565b6060835f611a0a85856126ed565b67ffffffffffffffff811115611a2257611a226123a7565b6040519080825280601f01601f191660200182016040528015611a4c576020820181803683370190505b509050845b84811015611ab357828181518110611a6b57611a6b6124d1565b01602001516001600160f81b03191682611a8588846126ed565b81518110611a9557611a956124d1565b60200101906001600160f81b03191690815f1a905350600101611a51565b5095945050505050565b5f7f4a18c9083b936e0757952a5d9d34b5575d427661506fbe9908c2a1da3f3e80d982604051602001611af09190612589565b6040516020818303038152906040528051906020012003611b1357506001919050565b7f78ec83563b948f0ac242d7eaefd592adf65964e11cc27f11ae41faa99a1e990a82604051602001611b459190612589565b6040516020818303038152906040528051906020012003611b6857506002919050565b7f2bab7d3f253ae0e3722abcc2571faced288946968116996ffc3de31fb7348ec382604051602001611b9a9190612589565b6040516020818303038152906040528051906020012003611bbd57506003919050565b7fc6f33aba2381b69f05afc78835e501547a9daffa08d674623068c378423ac18882604051602001611bef9190612589565b6040516020818303038152906040528051906020012003611c1257506004919050565b7fdb5ee1006003349b29eda5be5fe34f728659f836a948d4ec595114aebbb159d382604051602001611c449190612589565b6040516020818303038152906040528051906020012003611c6757506005919050565b7f44a0046ab54c1458fc3c39dfcadc52509ad809730ec301470d2d747dbe77242d82604051602001611c999190612589565b6040516020818303038152906040528051906020012003611cbc57506006919050565b7f74d9e46f10329e61dc333ff1800274be516163110de31961b4e0c61de3e90c5c82604051602001611cee9190612589565b6040516020818303038152906040528051906020012003611d1157506007919050565b7fed40c08ab6f3d9c5d71155e25b1271d5b9eca8c27bf89e1d2293fcb77c5abf6482604051602001611d439190612589565b6040516020818303038152906040528051906020012003611d6657506008919050565b7f7d801199c77197eb9933a633741db90c2c6f3d7d14aca35f5f80a41b4a8863ac82604051602001611d989190612589565b6040516020818303038152906040528051906020012003611dbb57506009919050565b7fb7841ed82fc96483f061ddc0b19846855df22558c4aea3b3b058ce0d9f1f516482604051602001611ded9190612589565b6040516020818303038152906040528051906020012003611e105750600a919050565b7f487851233e540dddea8f904d6802590aead5463b1c44965d68348bb7def25cf482604051602001611e429190612589565b6040516020818303038152906040528051906020012003611e655750600b919050565b7f3bd971d8758c58fe0c4d635451404450c5edda87d624a89819e0be5a122933dc82604051602001611e979190612589565b6040516020818303038152906040528051906020012003611eba5750600c919050565b60405162461bcd60e51b815260206004820152600d60248201526c092dcecc2d8d2c840dadedce8d609b1b6044820152606401610373565b5f81611eff603c85612700565b611f0b610e1087612700565b62015180611f1a8b8b8b61212f565b611f249190612700565b611f2e91906125b8565b611f3891906125b8565b611f4291906125b8565b979650505050505050565b5f8151600514611f9f5760405162461bcd60e51b815260206004820152601760248201527f496e76616c69642074696d657a6f6e65206f66667365740000000000000000006044820152606401610373565b5f611fb18161053985600160036119fc565b90505f611fc58161053986600360056119fc565b90505f611fd382603c612700565b611fdf84610e10612700565b611fe991906125b8565b90505f611ff8868260016119fc565b5f81518110612009576120096124d1565b01602001516001600160f81b0319169050602b60f81b81146120345761202f82886125b8565b611f42565b611f4282886126ed565b805160609082905f5b825181101561208757828181518110612062576120626124d1565b01602001516001600160f81b0319165f0361207f57809150612087565b600101612047565b505f8167ffffffffffffffff8111156120a2576120a26123a7565b6040519080825280601f01601f1916602001820160405280156120cc576020820181803683370190505b5090505f5b82811015612126578381815181106120eb576120eb6124d1565b602001015160f81c60f81b828281518110612108576121086124d1565b60200101906001600160f81b03191690815f1a9053506001016120d1565b50949350505050565b5f6107b284101561213e575f80fd5b8383835f62253d8c60046064600c612157600e88612888565b61216191906128ae565b61216d886113246128da565b61217791906128da565b61218191906128ae565b61218c906003612901565b61219691906128ae565b600c806121a4600e88612888565b6121ae91906128ae565b6121b990600c612901565b6121c4600288612888565b6121ce9190612888565b6121da9061016f612901565b6121e491906128ae565b6004600c6121f3600e89612888565b6121fd91906128ae565b612209896112c06128da565b61221391906128da565b61221f906105b5612901565b61222991906128ae565b612235617d4b87612888565b61223f91906128da565b61224991906128da565b6122539190612888565b61182a9190612888565b6040518061010001604052806008905b606081526020019060019003908161226d5790505090565b5f60208284031215612295575f80fd5b5035919050565b5f6102e082840312156122ad575f80fd5b50919050565b5f5b838110156122cd5781810151838201526020016122b5565b50505f910152565b602081525f82518060208401526122f38160408501602087016122b3565b601f01601f19169190910160400192915050565b6001600160a01b038116811461071c575f80fd5b5f6020828403121561232b575f80fd5b813561127581612307565b80604081018310156102d4575f80fd5b5f805f806102e080868803121561235b575f80fd5b6123658787612336565b945060c0860187811115612377575f80fd5b6040870194506123878882612336565b935050868187011115612398575f80fd5b50929591945092610100019150565b634e487b7160e01b5f52604160045260245ffd5b5f602082840312156123cb575f80fd5b813567ffffffffffffffff808211156123e2575f80fd5b818401915084601f8301126123f5575f80fd5b813581811115612407576124076123a7565b604051601f8201601f19908116603f0116810190838211818310171561242f5761242f6123a7565b81604052828152876020848701011115612447575f80fd5b826020860160208301375f928101602001929092525095945050505050565b5f60208284031215612476575f80fd5b81518015158114611275575f80fd5b6102e08101604080878437808301865f5b60028110156124b357838284379183019190830190600101612496565b505050808560c0850137506101e08361010084013795945050505050565b634e487b7160e01b5f52603260045260245ffd5b600181811c908216806124f957607f821691505b6020821081036122ad57634e487b7160e01b5f52602260045260245ffd5b5f808354612524816124e5565b6001828116801561253c57600181146125515761257d565b60ff198416875282151583028701945061257d565b875f526020805f205f5b858110156125745781548a82015290840190820161255b565b50505082870194505b50929695505050505050565b5f825161259a8184602087016122b3565b9190910192915050565b634e487b7160e01b5f52601160045260245ffd5b808201808211156102d4576102d46125a4565b601f82111561260f57805f5260205f20601f840160051c810160208510156125f05750805b601f840160051c820191505b8181101561077e575f81556001016125fc565b505050565b815167ffffffffffffffff81111561262e5761262e6123a7565b6126428161263c84546124e5565b846125cb565b602080601f831160018114612675575f841561265e5750858301515b5f19600386901b1c1916600185901b1785556126cc565b5f85815260208120601f198616915b828110156126a357888601518255948401946001909101908401612684565b50858210156126c057878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b60ff82811682821603908111156102d4576102d46125a4565b818103818111156102d4576102d46125a4565b80820281158282048414176102d4576102d46125a4565b5f60018201612728576127286125a4565b5060010190565b634e487b7160e01b5f52601260045260245ffd5b5f60ff8316806127555761275561272f565b8060ff84160691505092915050565b60ff81811683821601908111156102d4576102d46125a4565b5f61ffff808316818103612793576127936125a4565b6001019392505050565b600181815b808511156127d757815f19048211156127bd576127bd6125a4565b808516156127ca57918102915b93841c93908002906127a2565b509250929050565b5f826127ed575060016102d4565b816127f957505f6102d4565b816001811461280f576002811461281957612835565b60019150506102d4565b60ff84111561282a5761282a6125a4565b50506001821b6102d4565b5060208310610133831016604e8410600b8410161715612858575081810a6102d4565b612862838361279d565b805f1904821115612875576128756125a4565b029392505050565b5f61127583836127df565b8181035f8312801583831316838312821617156128a7576128a76125a4565b5092915050565b5f826128bc576128bc61272f565b600160ff1b82145f19841416156128d5576128d56125a4565b500590565b8082018281125f8312801582168215821617156128f9576128f96125a4565b505092915050565b8082025f8212600160ff1b8414161561291c5761291c6125a4565b81810583148215176102d4576102d46125a456fea26469706673582212203ccd4a35386f7e621857328986ffd9e421258a15f9bd4cad5efa73430d11305064736f6c63430008180033", + "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/ramps/hdfc/HDFCSendProcessor.sol:HDFCSendProcessor", + "label": "_owner", + "offset": 0, + "slot": "0", + "type": "t_address" + }, + { + "astId": 6068, + "contract": "contracts/ramps/hdfc/HDFCSendProcessor.sol:HDFCSendProcessor", + "label": "mailServerKeyHashAdapter", + "offset": 0, + "slot": "1", + "type": "t_contract(IKeyHashAdapterV2)6431" + }, + { + "astId": 6071, + "contract": "contracts/ramps/hdfc/HDFCSendProcessor.sol:HDFCSendProcessor", + "label": "nullifierRegistry", + "offset": 0, + "slot": "2", + "type": "t_contract(INullifierRegistry)6636" + }, + { + "astId": 6073, + "contract": "contracts/ramps/hdfc/HDFCSendProcessor.sol:HDFCSendProcessor", + "label": "emailFromAddress", + "offset": 0, + "slot": "3", + "type": "t_bytes_storage" + }, + { + "astId": 6075, + "contract": "contracts/ramps/hdfc/HDFCSendProcessor.sol:HDFCSendProcessor", + "label": "timestampBuffer", + "offset": 0, + "slot": "4", + "type": "t_uint256" + } + ], + "types": { + "t_address": { + "encoding": "inplace", + "label": "address", + "numberOfBytes": "20" + }, + "t_bytes_storage": { + "encoding": "bytes", + "label": "bytes", + "numberOfBytes": "32" + }, + "t_contract(IKeyHashAdapterV2)6431": { + "encoding": "inplace", + "label": "contract IKeyHashAdapterV2", + "numberOfBytes": "20" + }, + "t_contract(INullifierRegistry)6636": { + "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/deployments/encifher/NullifierRegistry.json b/contracts/deployments/encifher/NullifierRegistry.json new file mode 100644 index 000000000..4c5d54166 --- /dev/null +++ b/contracts/deployments/encifher/NullifierRegistry.json @@ -0,0 +1,371 @@ +{ + "address": "0x4d8E02BBfCf205828A8352Af4376b165E123D7b0", + "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": "0x8240b4f7b9850482e7edc2b34a5d9fe3e62fbb2f0efe49cb35022cdfe922f30e", + "receipt": { + "to": null, + "from": "0xa0Ee7A142d267C1f36714E4a8F75612F20a79720", + "contractAddress": "0x4d8E02BBfCf205828A8352Af4376b165E123D7b0", + "transactionIndex": 0, + "gasUsed": "521761", + "logsBloom": "0x00000000000000000000040000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000001000000000000000008000000000000000000020000000000000000000840000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000020000000000000000000000000000000000000000000000000000000000002000000", + "blockHash": "0x047f8d53093b8d73292c7e1ff08433143fcb8b3c52aabc1c261d76e4f21c8cfb", + "transactionHash": "0x8240b4f7b9850482e7edc2b34a5d9fe3e62fbb2f0efe49cb35022cdfe922f30e", + "logs": [ + { + "transactionIndex": 0, + "blockNumber": 61357, + "transactionHash": "0x8240b4f7b9850482e7edc2b34a5d9fe3e62fbb2f0efe49cb35022cdfe922f30e", + "address": "0x4d8E02BBfCf205828A8352Af4376b165E123D7b0", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x000000000000000000000000a0ee7a142d267c1f36714e4a8f75612f20a79720" + ], + "data": "0x", + "logIndex": 0, + "blockHash": "0x047f8d53093b8d73292c7e1ff08433143fcb8b3c52aabc1c261d76e4f21c8cfb" + } + ], + "blockNumber": 61357, + "cumulativeGasUsed": "521761", + "status": 1, + "byzantium": true + }, + "args": [], + "numDeployments": 1, + "solcInputHash": "75b8f55da346d7ed99a350632554d2fb", + "metadata": "{\"compiler\":{\"version\":\"0.8.24+commit.e11b9ed9\"},\"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/processors/nullifierRegistries/NullifierRegistry.sol\":\"NullifierRegistry\"},\"evmVersion\":\"shanghai\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"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 v4.4.1 (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\",\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"license\":\"MIT\"},\"contracts/external/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/processors/nullifierRegistries/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/processors/nullifierRegistries/NullifierRegistry.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\n\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\nimport { AddressArrayUtils } from \\\"../../external/AddressArrayUtils.sol\\\";\\nimport { INullifierRegistry } from \\\"./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\":\"0x20f773bb8f52b109301fca328369f2d5cebc8d105d2d0cf9588adccab2f9d1c8\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x608060405234801561000f575f80fd5b506100193361001e565b61006d565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6109448061007a5f395ff3fe608060405234801561000f575f80fd5b506004361061009b575f3560e01c8063715018a611610063578063715018a61461014b5780638da5cb5b14610153578063cb01316c14610163578063d6da032614610178578063f2fde38b1461018b575f80fd5b8063169394bb1461009f578063286f9201146100d65780632b29ba23146100eb5780635bd4df321461010d57806366a5267214610120575b5f80fd5b6100c16100ad366004610831565b60016020525f908152604090205460ff1681565b60405190151581526020015b60405180910390f35b6100e96100e4366004610848565b61019e565b005b6100c16100f9366004610848565b60026020525f908152604090205460ff1681565b6100e961011b366004610831565b61027c565b61013361012e366004610831565b6103a1565b6040516001600160a01b0390911681526020016100cd565b6100e96103c9565b5f546001600160a01b0316610133565b61016b6103dc565b6040516100cd9190610875565b6100e9610186366004610848565b61043c565b6100e9610199366004610848565b610541565b6101a66105ba565b6001600160a01b0381165f9081526002602052604090205460ff166102125760405162461bcd60e51b815260206004820152601760248201527f41646472657373206973206e6f7420612077726974657200000000000000000060448201526064015b60405180910390fd5b6001600160a01b0381165f908152600260205260409020805460ff1916905561023c600382610613565b6040516001600160a01b03821681527f86e5bbceda94081c32220d685f37cc4e3ea7bb0be2dfbf0cb703579505a5390e906020015b60405180910390a150565b335f9081526002602052604090205460ff166102f15760405162461bcd60e51b815260206004820152602e60248201527f4f6e6c79206164647265737365732077697468207772697465207065726d697360448201526d1cda5bdb9cc818d85b8818d85b1b60921b6064820152608401610209565b5f8181526001602052604090205460ff161561034f5760405162461bcd60e51b815260206004820152601860248201527f4e756c6c696669657220616c72656164792065786973747300000000000000006044820152606401610209565b5f81815260016020818152604092839020805460ff1916909217909155905182815233917f57d64412939564693aa1e17d56c93933396b3a990f47c84dfc16a201fc2f3f83910160405180910390a250565b600381815481106103b0575f80fd5b5f918252602090912001546001600160a01b0316905081565b6103d16105ba565b6103da5f61077a565b565b6060600380548060200260200160405190810160405280929190818152602001828054801561043257602002820191905f5260205f20905b81546001600160a01b03168152600190910190602001808311610414575b5050505050905090565b6104446105ba565b6001600160a01b0381165f9081526002602052604090205460ff16156104ac5760405162461bcd60e51b815260206004820152601b60248201527f4164647265737320697320616c726561647920612077726974657200000000006044820152606401610209565b6001600160a01b0381165f818152600260209081526040808320805460ff191660019081179091556003805491820181559093527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b90920180546001600160a01b0319168417905590519182527f6ff3aa2ea7b53070f6d9d07a445d338d89e8edef44250ffa8be19f53910d4a2e9101610271565b6105496105ba565b6001600160a01b0381166105ae5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610209565b6105b78161077a565b50565b5f546001600160a01b031633146103da5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610209565b5f806106768480548060200260200160405190810160405280929190818152602001828054801561066b57602002820191905f5260205f20905b81546001600160a01b0316815260019091019060200180831161064d575b5050505050846107c9565b91509150806106bf5760405162461bcd60e51b815260206004820152601560248201527420b2323932b9b9903737ba1034b71030b93930bc9760591b6044820152606401610209565b83545f906106cf906001906108c1565b9050808314610743578481815481106106ea576106ea6108e6565b905f5260205f20015f9054906101000a90046001600160a01b0316858481548110610717576107176108e6565b905f5260205f20015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055505b84805480610753576107536108fa565b5f8281526020902081015f1990810180546001600160a01b03191690550190555050505050565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b81515f908190815b8181101561082057846001600160a01b03168682815181106107f5576107f56108e6565b60200260200101516001600160a01b0316036108185792506001915061082a9050565b6001016107d1565b505f195f92509250505b9250929050565b5f60208284031215610841575f80fd5b5035919050565b5f60208284031215610858575f80fd5b81356001600160a01b038116811461086e575f80fd5b9392505050565b602080825282518282018190525f9190848201906040850190845b818110156108b55783516001600160a01b031683529284019291840191600101610890565b50909695505050505050565b818103818111156108e057634e487b7160e01b5f52601160045260245ffd5b92915050565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52603160045260245ffdfea2646970667358221220cf01549a96d6aae5959c3dd81f96fd58d7783fde4cca15aa1b5257de686971aa64736f6c63430008180033", + "deployedBytecode": "0x608060405234801561000f575f80fd5b506004361061009b575f3560e01c8063715018a611610063578063715018a61461014b5780638da5cb5b14610153578063cb01316c14610163578063d6da032614610178578063f2fde38b1461018b575f80fd5b8063169394bb1461009f578063286f9201146100d65780632b29ba23146100eb5780635bd4df321461010d57806366a5267214610120575b5f80fd5b6100c16100ad366004610831565b60016020525f908152604090205460ff1681565b60405190151581526020015b60405180910390f35b6100e96100e4366004610848565b61019e565b005b6100c16100f9366004610848565b60026020525f908152604090205460ff1681565b6100e961011b366004610831565b61027c565b61013361012e366004610831565b6103a1565b6040516001600160a01b0390911681526020016100cd565b6100e96103c9565b5f546001600160a01b0316610133565b61016b6103dc565b6040516100cd9190610875565b6100e9610186366004610848565b61043c565b6100e9610199366004610848565b610541565b6101a66105ba565b6001600160a01b0381165f9081526002602052604090205460ff166102125760405162461bcd60e51b815260206004820152601760248201527f41646472657373206973206e6f7420612077726974657200000000000000000060448201526064015b60405180910390fd5b6001600160a01b0381165f908152600260205260409020805460ff1916905561023c600382610613565b6040516001600160a01b03821681527f86e5bbceda94081c32220d685f37cc4e3ea7bb0be2dfbf0cb703579505a5390e906020015b60405180910390a150565b335f9081526002602052604090205460ff166102f15760405162461bcd60e51b815260206004820152602e60248201527f4f6e6c79206164647265737365732077697468207772697465207065726d697360448201526d1cda5bdb9cc818d85b8818d85b1b60921b6064820152608401610209565b5f8181526001602052604090205460ff161561034f5760405162461bcd60e51b815260206004820152601860248201527f4e756c6c696669657220616c72656164792065786973747300000000000000006044820152606401610209565b5f81815260016020818152604092839020805460ff1916909217909155905182815233917f57d64412939564693aa1e17d56c93933396b3a990f47c84dfc16a201fc2f3f83910160405180910390a250565b600381815481106103b0575f80fd5b5f918252602090912001546001600160a01b0316905081565b6103d16105ba565b6103da5f61077a565b565b6060600380548060200260200160405190810160405280929190818152602001828054801561043257602002820191905f5260205f20905b81546001600160a01b03168152600190910190602001808311610414575b5050505050905090565b6104446105ba565b6001600160a01b0381165f9081526002602052604090205460ff16156104ac5760405162461bcd60e51b815260206004820152601b60248201527f4164647265737320697320616c726561647920612077726974657200000000006044820152606401610209565b6001600160a01b0381165f818152600260209081526040808320805460ff191660019081179091556003805491820181559093527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b90920180546001600160a01b0319168417905590519182527f6ff3aa2ea7b53070f6d9d07a445d338d89e8edef44250ffa8be19f53910d4a2e9101610271565b6105496105ba565b6001600160a01b0381166105ae5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610209565b6105b78161077a565b50565b5f546001600160a01b031633146103da5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610209565b5f806106768480548060200260200160405190810160405280929190818152602001828054801561066b57602002820191905f5260205f20905b81546001600160a01b0316815260019091019060200180831161064d575b5050505050846107c9565b91509150806106bf5760405162461bcd60e51b815260206004820152601560248201527420b2323932b9b9903737ba1034b71030b93930bc9760591b6044820152606401610209565b83545f906106cf906001906108c1565b9050808314610743578481815481106106ea576106ea6108e6565b905f5260205f20015f9054906101000a90046001600160a01b0316858481548110610717576107176108e6565b905f5260205f20015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055505b84805480610753576107536108fa565b5f8281526020902081015f1990810180546001600160a01b03191690550190555050505050565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b81515f908190815b8181101561082057846001600160a01b03168682815181106107f5576107f56108e6565b60200260200101516001600160a01b0316036108185792506001915061082a9050565b6001016107d1565b505f195f92509250505b9250929050565b5f60208284031215610841575f80fd5b5035919050565b5f60208284031215610858575f80fd5b81356001600160a01b038116811461086e575f80fd5b9392505050565b602080825282518282018190525f9190848201906040850190845b818110156108b55783516001600160a01b031683529284019291840191600101610890565b50909695505050505050565b818103818111156108e057634e487b7160e01b5f52601160045260245ffd5b92915050565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52603160045260245ffdfea2646970667358221220cf01549a96d6aae5959c3dd81f96fd58d7783fde4cca15aa1b5257de686971aa64736f6c63430008180033", + "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/processors/nullifierRegistries/NullifierRegistry.sol:NullifierRegistry", + "label": "_owner", + "offset": 0, + "slot": "0", + "type": "t_address" + }, + { + "astId": 6682, + "contract": "contracts/processors/nullifierRegistries/NullifierRegistry.sol:NullifierRegistry", + "label": "isNullified", + "offset": 0, + "slot": "1", + "type": "t_mapping(t_bytes32,t_bool)" + }, + { + "astId": 6686, + "contract": "contracts/processors/nullifierRegistries/NullifierRegistry.sol:NullifierRegistry", + "label": "isWriter", + "offset": 0, + "slot": "2", + "type": "t_mapping(t_address,t_bool)" + }, + { + "astId": 6689, + "contract": "contracts/processors/nullifierRegistries/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/deployments/encifher/Poseidon3.json b/contracts/deployments/encifher/Poseidon3.json new file mode 100644 index 000000000..b57304b12 --- /dev/null +++ b/contracts/deployments/encifher/Poseidon3.json @@ -0,0 +1,66 @@ +{ + "address": "0xF1078fD568Ad76E49E6F88D1fF485402a086976b", + "abi": [ + { + "constant": true, + "inputs": [ + { + "internalType": "bytes32[3]", + "name": "input", + "type": "bytes32[3]" + } + ], + "name": "poseidon", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "payable": false, + "stateMutability": "pure", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "internalType": "uint256[3]", + "name": "input", + "type": "uint256[3]" + } + ], + "name": "poseidon", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "pure", + "type": "function" + } + ], + "transactionHash": "0x5e2e3b2ca539d1d2268748806235dd4afaecff5c45ee137daac6941842d8ed75", + "receipt": { + "to": null, + "from": "0xa0Ee7A142d267C1f36714E4a8F75612F20a79720", + "contractAddress": "0xF1078fD568Ad76E49E6F88D1fF485402a086976b", + "transactionIndex": 0, + "gasUsed": "2557759", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0x239ab3dc98e8a685d72a6752b4c31f6f262926319c7dcbd8b6f55c0f08f5a714", + "transactionHash": "0x5e2e3b2ca539d1d2268748806235dd4afaecff5c45ee137daac6941842d8ed75", + "logs": [], + "blockNumber": 61352, + "cumulativeGasUsed": "2557759", + "status": 1, + "byzantium": true + }, + "args": [], + "numDeployments": 1, + "bytecode": "0x38600c6000396130af6000f37c010000000000000000000000000000000000000000000000000000000060003504806325cc70e81490635a53025d14176200003757fe5b7f236d13393ef85cc48a351dd786dd7a1de5e39942296127fd87947223ae5108ad6020527f277686494f7644bbc4a9b194e10724eb967f1dc58718e59e3cedc821b2a7ae196040527f023db68784e3f0cc0b85618826a9b3505129c16479973b0a84a4529e66b09c626060527f1d359d245f286c12d50d663bae733f978af08cdbd63017c57b3a75646ff382c16080527f2a75a171563b807db525be259699ab28fe9bc7fb1f70943ff049bc970e841a0c60a0527f083abff5e10051f078e2827d092e1ae808b4dd3e15ccc3706f38ce4157b6770e60c0527f1a5ad71bbbecd8a97dc49cfdbae303ad24d5c4741eab8b7568a9ff8253a1eb6f60e0527f0d745fd00dd167fb86772133640f02ce945004a7bc2c59e8790f725c5d84f0af610100527f2070679e798782ef592a52ca9cef820d497ad2eecbaa7e42f366b3e521c4ed42610120527f2e18c8570d20bf5df800739a53da75d906ece318cd224ab6b3a2be979e2d7eab610140527f0fa86f0f27e4d3dd7f3367ce86f684f1f2e4386d3e5b9f38fa283c6aa723b608610160527f03f3e6fab791f16628168e4b14dbaeb657035ee3da6b2ca83f0c2491e0b403eb610180527f2f545e578202c9732488540e41f783b68ff0613fd79375f8ba8b3d30958e76776101a0527f23810bf82877fc19bff7eefeae3faf4bb8104c32ba4cd701596a15623d01476e6101c0527f014fcd5eb0be6d5beeafc4944034cf321c068ef930f10be2207ed58d2a34cdd66101e0527f00c15fc3a1d5733dd835eae0823e377f8ba4a8b627627cc2bb661c25d20fb52a610200527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016044356024356004356000847f19b849f69450b06848da1d39bd5e4a4302bb86744edc26238b0878e269ed23e582089050847f265ddfe127dd51bd7239347b758f0a1320eb2cc7450acc1dad47f80c8dcf34d683089150847f199750ec472f1809e0f66a545e1e51624108ac845015c2aa3dfc36bab497d8aa84089250847f157ff3fe65ac7208110f06a5f74302b14d743ea25067f0ffd032f787c7f1cdf8850893508481818082800980090990508482818082800980090991508483818082800980090992508484818082800980090993506200038160005262003015565b847f2e49c43c4569dd9c5fd35ac45fca33f10b15c590692f8beefe18f4896ac9490282089050847f0e35fb89981890520d4aef2b6d6506c3cb2f0b6973c24fa82731345ffa2d1f1e83089150847f251ad47cb15c4f1105f109ae5e944f1ba9d9e7806d667ffec6fe723002e0b99684089250847f13da07dc64d428369873e97160234641f8beb56fdd05e5f3563fa39d9c22df4e850893508481818082800980090990508482818082800980090991508483818082800980090992508484818082800980090993506200045660005262003015565b847f0c009b84e650e6d23dc00c7dccef7483a553939689d350cd46e7b89055fd473882089050847f011f16b1c63a854f01992e3956f42d8b04eb650c6d535eb0203dec74befdca0683089150847f0ed69e5e383a688f209d9a561daa79612f3f78d0467ad45485df07093f36754984089250847f04dba94a7b0ce9e221acad41472b6bbe3aec507f5eb3d33f463672264c9f789b850893508481818082800980090990508482818082800980090991508483818082800980090992508484818082800980090993506200052b60005262003015565b847f0a3f2637d840f3a16eb094271c9d237b6036757d4bb50bf7ce732ff1d4fa28e882089050847f259a666f129eea198f8a1c502fdb38fa39b1f075569564b6e54a485d1182323f83089150847f28bf7459c9b2f4c6d8e7d06a4ee3a47f7745d4271038e5157a32fdf7ede0d6a184089250847f0a1ca941f057037526ea200f489be8d4c37c85bbcce6a2aeec91bd6941432447850893508481818082800980090990508482818082800980090991508483818082800980090992508484818082800980090993506200060060005262003015565b847f0c6f8f958be0e93053d7fd4fc54512855535ed1539f051dcb43a26fd926361cf82089050847f123106a93cd17578d426e8128ac9d90aa9e8a00708e296e084dd57e69caaf81183089150847f26e1ba52ad9285d97dd3ab52f8e840085e8fa83ff1e8f1877b074867cd2dee7584089250847f1cb55cad7bd133de18a64c5c47b9c97cbe4d8b7bf9e095864471537e6a4ae2c585089350848181808280098009099050620006b160005262003015565b847f1dcd73e46acd8f8e0e2c7ce04bde7f6d2a53043d5060a41c7143f08e6e9055d082089050847f011003e32f6d9c66f5852f05474a4def0cda294a0eb4e9b9b12b9bb4512e557483089150847f2b1e809ac1d10ab29ad5f20d03a57dfebadfe5903f58bafed7c508dd2287ae8c84089250847f2539de1785b735999fb4dac35ee17ed0ef995d05ab2fc5faeaa69ae87bcec0a5850893508481818082800980090990506200076260005262003015565b847f0c246c5a2ef8ee0126497f222b3e0a0ef4e1c3d41c86d46e43982cb11d77951d82089050847f192089c4974f68e95408148f7c0632edbb09e6a6ad1a1c2f3f0305f5d03b527b83089150847f1eae0ad8ab68b2f06a0ee36eeb0d0c058529097d91096b756d8fdc2fb5a60d8584089250847f179190e5d0e22179e46f8282872abc88db6e2fdc0dee99e69768bd98c5d06bfb850893508481818082800980090990506200081360005262003015565b847f29bb9e2c9076732576e9a81c7ac4b83214528f7db00f31bf6cafe794a9b3cd1c82089050847f225d394e42207599403efd0c2464a90d52652645882aac35b10e590e6e691e0883089150847f064760623c25c8cf753d238055b444532be13557451c087de09efd454b23fd5984089250847f10ba3a0e01df92e87f301c4b716d8a394d67f4bf42a75c10922910a78f6b5b8785089350848181808280098009099050620008c460005262003015565b847f0e070bf53f8451b24f9c6e96b0c2a801cb511bc0c242eb9d361b77693f21471c82089050847f1b94cd61b051b04dd39755ff93821a73ccd6cb11d2491d8aa7f921014de252fb83089150847f1d7cb39bafb8c744e148787a2e70230f9d4e917d5713bb050487b5aa7d74070b84089250847f2ec93189bd1ab4f69117d0fe980c80ff8785c2961829f701bb74ac1f303b17db850893508481818082800980090990506200097560005262003015565b847f2db366bfdd36d277a692bb825b86275beac404a19ae07a9082ea46bd8351792682089050847f062100eb485db06269655cf186a68532985275428450359adc99cec6960711b883089150847f0761d33c66614aaa570e7f1e8244ca1120243f92fa59e4f900c567bf41f5a59b84089250847f20fc411a114d13992c2705aa034e3f315d78608a0f7de4ccf7a72e494855ad0d8508935084818180828009800909905062000a2660005262003015565b847f25b5c004a4bdfcb5add9ec4e9ab219ba102c67e8b3effb5fc3a30f317250bc5a82089050847f23b1822d278ed632a494e58f6df6f5ed038b186d8474155ad87e7dff62b37f4b83089150847f22734b4c5c3f9493606c4ba9012499bf0f14d13bfcfcccaa16102a29cc2f69e084089250847f26c0c8fe09eb30b7e27a74dc33492347e5bdff409aa3610254413d3fad795ce58508935084818180828009800909905062000ad760005262003015565b847f070dd0ccb6bd7bbae88eac03fa1fbb26196be3083a809829bbd626df348ccad982089050847f12b6595bdb329b6fb043ba78bb28c3bec2c0a6de46d8c5ad6067c4ebfd4250da83089150847f248d97d7f76283d63bec30e7a5876c11c06fca9b275c671c5e33d95bb7e8d72984089250847f1a306d439d463b0816fc6fd64cc939318b45eb759ddde4aa106d15d9bd9baaaa8508935084818180828009800909905062000b8860005262003015565b847f28a8f8372e3c38daced7c00421cb4621f4f1b54ddc27821b0d62d3d6ec7c56cf82089050847f0094975717f9a8a8bb35152f24d43294071ce320c829f388bc852183e1e2ce7e83089150847f04d5ee4c3aa78f7d80fde60d716480d3593f74d4f653ae83f4103246db2e8d6584089250847f2a6cf5e9aa03d4336349ad6fb8ed2269c7bef54b8822cc76d08495c12efde1878508935084818180828009800909905062000c3960005262003015565b847f2304d31eaab960ba9274da43e19ddeb7f792180808fd6e43baae48d7efcba3f382089050847f03fd9ac865a4b2a6d5e7009785817249bff08a7e0726fcb4e1c11d39d199f0b083089150847f00b7258ded52bbda2248404d55ee5044798afc3a209193073f7954d4d63b0b6484089250847f159f81ada0771799ec38fca2d4bf65ebb13d3a74f3298db36272c5ca65e92d9a8508935084818180828009800909905062000cea60005262003015565b847f1ef90e67437fbc8550237a75bc28e3bb9000130ea25f0c5471e144cf4264431f82089050847f1e65f838515e5ff0196b49aa41a2d2568df739bc176b08ec95a79ed82932e30d83089150847f2b1b045def3a166cec6ce768d079ba74b18c844e570e1f826575c1068c94c33f84089250847f0832e5753ceb0ff6402543b1109229c165dc2d73bef715e3f1c6e07c168bb1738508935084818180828009800909905062000d9b60005262003015565b847f02f614e9cedfb3dc6b762ae0a37d41bab1b841c2e8b6451bc5a8e3c390b6ad1682089050847f0e2427d38bd46a60dd640b8e362cad967370ebb777bedff40f6a0be27e7ed70583089150847f0493630b7c670b6deb7c84d414e7ce79049f0ec098c3c7c50768bbe29214a53a84089250847f22ead100e8e482674decdab17066c5a26bb1515355d5461a3dc06cc85327cea98508935084818180828009800909905062000e4c60005262003015565b847f25b3e56e655b42cdaae2626ed2554d48583f1ae35626d04de5084e0b6d2a6f1682089050847f1e32752ada8836ef5837a6cde8ff13dbb599c336349e4c584b4fdc0a0cf6f9d083089150847f2fa2a871c15a387cc50f68f6f3c3455b23c00995f05078f672a9864074d412e584089250847f2f569b8a9a4424c9278e1db7311e889f54ccbf10661bab7fcd18e7c7a7d835058508935084818180828009800909905062000efd60005262003015565b847f044cb455110a8fdd531ade530234c518a7df93f7332ffd2144165374b246b43d82089050847f227808de93906d5d420246157f2e42b191fe8c90adfe118178ddc723a531902583089150847f02fcca2934e046bc623adead873579865d03781ae090ad4a8579d2e7a680035584089250847f0ef915f0ac120b876abccceb344a1d36bad3f3c5ab91a8ddcbec2e060d8befac8508935084818180828009800909905062000fae60005262003015565b847f1797130f4b7a3e1777eb757bc6f287f6ab0fb85f6be63b09f3b16ef2b1405d3882089050847f0a76225dc04170ae3306c85abab59e608c7f497c20156d4d36c668555decc6e583089150847f1fffb9ec1992d66ba1e77a7b93209af6f8fa76d48acb664796174b5326a31a5c84089250847f25721c4fc15a3f2853b57c338fa538d85f8fbba6c6b9c6090611889b797b9c5f850893508481818082800980090990506200105f60005262003015565b847f0c817fd42d5f7a41215e3d07ba197216adb4c3790705da95eb63b982bfcaf75a82089050847f13abe3f5239915d39f7e13c2c24970b6df8cf86ce00a22002bc15866e52b5a9683089150847f2106feea546224ea12ef7f39987a46c85c1bc3dc29bdbd7a92cd60acb4d391ce84089250847f21ca859468a746b6aaa79474a37dab49f1ca5a28c748bc7157e1b3345bb0f959850893508481818082800980090990506200111060005262003015565b847f05ccd6255c1e6f0c5cf1f0df934194c62911d14d0321662a8f1a48999e34185b82089050847f0f0e34a64b70a626e464d846674c4c8816c4fb267fe44fe6ea28678cb09490a483089150847f0558531a4e25470c6157794ca36d0e9647dbfcfe350d64838f5b1a8a2de0d4bf84089250847f09d3dca9173ed2faceea125157683d18924cadad3f655a60b72f5864961f145585089350848181808280098009099050620011c160005262003015565b847f0328cbd54e8c0913493f866ed03d218bf23f92d68aaec48617d4c722e5bd433582089050847f2bf07216e2aff0a223a487b1a7094e07e79e7bcc9798c648ee3347dd5329d34b83089150847f1daf345a58006b736499c583cb76c316d6f78ed6a6dffc82111e11a63fe412df84089250847f176563472456aaa746b694c60e1823611ef39039b2edc7ff391e6f2293d2c404850893508481818082800980090990506200127260005262003015565b847f2ef1e0fad9f08e87a3bb5e47d7e33538ca964d2b7d1083d4fb0225035bd3f8db82089050847f226c9b1af95babcf17b2b1f57c7310179c1803dec5ae8f0a1779ed36c817ae2a83089150847f14bce3549cc3db7428126b4c3a15ae0ff8148c89f13fb35d35734eb5d4ad0def84089250847f2debff156e276bb5742c3373f2635b48b8e923d301f372f8e550cfd4034212c7850893508481818082800980090990506200132360005262003015565b847f2d4083cf5a87f5b6fc2395b22e356b6441afe1b6b29c47add7d0432d1d4760c782089050847f0c225b7bcd04bf9c34b911262fdc9c1b91bf79a10c0184d89c317c53d7161c2983089150847f03152169d4f3d06ec33a79bfac91a02c99aa0200db66d5aa7b835265f9c9c8f384089250847f0b61811a9210be78b05974587486d58bddc8f51bfdfebbb87afe8b7aa7d3199c85089350848181808280098009099050620013d460005262003015565b847f203e000cad298daaf7eba6a5c5921878b8ae48acf7048f16046d637a533b6f7882089050847f1a44bf0937c722d1376672b69f6c9655ba7ee386fda1112c0757143d1bfa914683089150847f0376b4fae08cb03d3500afec1a1f56acb8e0fde75a2106d7002f59c5611d4daa84089250847f00780af2ca1cad6465a2171250fdfc32d6fc241d3214177f3d553ef363182185850893508481818082800980090990506200148560005262003015565b847f10774d9ab80c25bdeb808bedfd72a8d9b75dbe18d5221c87e9d857079bdc31d582089050847f10dc6e9c006ea38b04b1e03b4bd9490c0d03f98929ca1d7fb56821fd19d3b6e883089150847f00544b8338791518b2c7645a50392798b21f75bb60e3596170067d00141cac1684089250847f222c01175718386f2e2e82eb122789e352e105a3b8fa852613bc534433ee428c850893508481818082800980090990506200153660005262003015565b847f2840d045e9bc22b259cfb8811b1e0f45b77f7bdb7f7e2b46151a1430f608e3c582089050847f062752f86eebe11a009c937e468c335b04554574c2990196508e01fa5860186b83089150847f06041bdac48205ac87adb87c20a478a71c9950c12a80bc0a55a8e83eaaf0474684089250847f04a533f236c422d1ff900a368949b0022c7a2ae092f308d82b1dcbbf51f5000d85089350848181808280098009099050620015e760005262003015565b847f13e31d7a67232fd811d6a955b3d4f25dfe066d1e7dc33df04bde50a2b2d05b2a82089050847f011c2683ae91eb4dfbc13d6357e8599a9279d1648ff2c95d2f79905bb13920f183089150847f0b0d219346b8574525b1a270e0b4cba5d56c928e3e2c2bd0a1ecaed015aaf6ae84089250847f14abdec8db9c6dc970291ee638690209b65080781ef9fd13d84c7a726b5f1364850893508481818082800980090990506200169860005262003015565b847f1a0b70b4b26fdc28fcd32aa3d266478801eb12202ef47ced988d0376610be10682089050847f278543721f96d1307b6943f9804e7fe56401deb2ef99c4d12704882e7278b60783089150847f16eb59494a9776cf57866214dbd1473f3f0738a325638d8ba36535e011d5825984089250847f2567a658a81ffb444f240088fa5524c69a9e53eeab6b7f8c41c3479dcf8c644a850893508481818082800980090990506200174960005262003015565b847f29aa1d7c151e9ad0a7ab39f1abd9cf77ab78e0215a5715a6b882ade840bb13d882089050847f15c091233e60efe0d4bbfce2b36415006a4f017f9a85388ce206b91f99f2c98483089150847f16bd7d22ff858e5e0882c2c999558d77e7673ad5f1915f9feb679a8115f014cf84089250847f02db50480a07be0eb2c2e13ed6ef4074c0182d9b668b8e08ffe676925004202585089350848181808280098009099050620017fa60005262003015565b847f05e4a220e6a3bc9f7b6806ec9d6cdba186330ef2bf7adb4c13ba866343b7311982089050847f1dda05ebc30170bc98cbf2a5ee3b50e8b5f70bc424d39fa4104d37f1cbcf7a4283089150847f0184bef721888187f645b6fee3667f3c91da214414d89ba5cd301f22b0de899084089250847f1498a307e68900065f5e8276f62aef1c37414b84494e1577ad1a6d64341b78ec85089350848181808280098009099050620018ab60005262003015565b847f25f40f82b31dacc4f4939800b9d2c3eacef737b8fab1f864fe33548ad46bd49d82089050847f09d317cc670251943f6f5862a30d2ea9e83056ce4907bfbbcb1ff31ce5bb965083089150847f2f77d77786d979b23ba4ce4a4c1b3bd0a41132cd467a86ab29b913b6cf3149d084089250847f0f53dafd535a9f4473dc266b6fccc6841bbd336963f254c152f89e785f729bbf850893508481818082800980090990506200195c60005262003015565b847f25c1fd72e223045265c3a099e17526fa0e6976e1c00baf16de96de85deef2fa282089050847f2a902c8980c17faae368d385d52d16be41af95c84eaea3cf893e65d6ce4a8f6283089150847f1ce1580a3452ecf302878c8976b82be96676dd114d1dc8d25527405762f8352984089250847f24a6073f91addc33a49a1fa306df008801c5ec569609034d2fc50f7f0f4d00568508935084818180828009800909905062001a0d60005262003015565b847f25e52dbd6124530d9fc27fe306d71d4583e07ca554b5d1577f256c68b0be2b7482089050847f23dffae3c423fa7a93468dbccfb029855974be4d0a7b29946796e5b6cd70f15d83089150847f06342da370cc0d8c49b77594f6b027c480615d50be36243a99591bc9924ed6f584089250847f2754114281286546b75f09f115fc751b4778303d0405c1b4cc7df0d8e9f639258508935084818180828009800909905062001abe60005262003015565b847f15c19e8534c5c1a8862c2bc1d119eddeabf214153833d7bdb59ee197f8187cf582089050847f265fe062766d08fab4c78d0d9ef3cabe366f3be0a821061679b4b3d2d77d5f3e83089150847f13ccf689d67a3ec9f22cb7cd0ac3a327d377ac5cd0146f048debfd098d3ec7be84089250847f17662f7456789739f81cd3974827a887d92a5e05bdf3fe6b9fbccca4524aaebd8508935084818180828009800909905062001b6f60005262003015565b847f21b29c76329b31c8ef18631e515f7f2f82ca6a5cca70cee4e809fd624be7ad5d82089050847f18137478382aadba441eb97fe27901989c06738165215319939eb17b01fa975c83089150847f2bc07ea2bfad68e8dc724f5fef2b37c2d34f761935ffd3b739ceec4668f37e8884089250847f2ddb2e376f54d64a563840480df993feb4173203c2bd94ad0e602077aef9a03e8508935084818180828009800909905062001c2060005262003015565b847f277eb50f2baa706106b41cb24c602609e8a20f8d72f613708adb25373596c3f782089050847f0d4de47e1aba34269d0c620904f01a56b33fc4b450c0db50bb7f87734c9a1fe583089150847f0b8442bfe9e4a1b4428673b6bd3eea6f9f445697058f134aae908d0279a29f0c84089250847f11fe5b18fbbea1a86e06930cb89f7d4a26e186a65945e96574247fddb720f8f58508935084818180828009800909905062001cd160005262003015565b847f224026f6dfaf71e24d25d8f6d9f90021df5b774dcad4d883170e4ad89c33a0d682089050847f0b2ca6a999fe6887e0704dad58d03465a96bc9e37d1091f61bc9f9c62bbeb82483089150847f221b63d66f0b45f9d40c54053a28a06b1d0a4ce41d364797a1a7e0c96529f42184089250847f30185c48b7b2f1d53d4120801b047d087493bce64d4d24aedce2f4836bb84ad48508935084818180828009800909905062001d8260005262003015565b847f23f5d372a3f0e3cba989e223056227d3533356f0faa48f27f8267318632a61f082089050847f2716683b32c755fd1bf8235ea162b1f388e1e0090d06162e8e6dfbe4328f3e3b83089150847f0977545836866fa204ca1d853ec0909e3d140770c80ac67dc930c69748d5d4bc84089250847f1444e8f592bdbfd8025d91ab4982dd425f51682d31472b05e81c43c0f9434b318508935084818180828009800909905062001e3360005262003015565b847f26e04b65e9ca8270beb74a1c5cb8fee8be3ffbfe583f7012a00f874e7718fbe382089050847f22a5c2fa860d11fe34ee47a5cd9f869800f48f4febe29ad6df69816fb1a914d283089150847f174b54d9907d8f5c6afd672a738f42737ec338f3a0964c629f7474dd44c5c8d784089250847f1db1db8aa45283f31168fa66694cf2808d2189b87c8c8143d56c871907b39b878508935084818180828009800909905062001ee460005262003015565b847f1530bf0f46527e889030b8c7b7dfde126f65faf8cce0ab66387341d813d1bfd182089050847f0b73f613993229f59f01c1cec8760e9936ead9edc8f2814889330a2f2bade45783089150847f29c25a22fe2164604552aaea377f448d587ab977fc8227787bd2dc0f36bcf41e84089250847f2b30d53ed1759bfb8503da66c92cf4077abe82795dc272b377df57d77c8755268508935084818180828009800909905062001f9560005262003015565b847f12f6d703b5702aab7b7b7e69359d53a2756c08c85ede7227cf5f0a2916787cd282089050847f2520e18300afda3f61a40a0b8837293a55ad01071028d4841ffa9ac70636411383089150847f1ec9daea860971ecdda8ed4f346fa967ac9bc59278277393c68f09fa03b8b95f84089250847f0a99b3e178db2e2e432f5cd5bef8fe4483bf5cbf70ed407c08aae24b830ad725850893508481818082800980090990506200204660005262003015565b847f07cda9e63db6e39f086b89b601c2bbe407ee0abac3c817a1317abad7c577849282089050847f08c9c65a4f955e8952d571b191bb0adb49bd8290963203b35d48aab38f8fc3a383089150847f2737f8ce1d5a67b349590ddbfbd709ed9af54a2a3f2719d33801c9c17bdd9c9e84089250847f1049a6c65ff019f0d28770072798e8b7909432bd0c129813a9f179ba627f7d6a85089350848181808280098009099050620020f760005262003015565b847f18b4fe968732c462c0ea5a9beb27cecbde8868944fdf64ee60a5122361daeddb82089050847f2ff2b6fd22df49d2440b2eaeeefa8c02a6f478cfcf11f1b2a4f7473483885d1983089150847f2ec5f2f1928fe932e56c789b8f6bbcb3e8be4057cbd8dbd18a1b352f5cef42ff84089250847f265a5eccd8b92975e33ad9f75bf3426d424a4c6a7794ee3f08c1d100378e545e85089350848181808280098009099050620021a860005262003015565b847f2405eaa4c0bde1129d6242bb5ada0e68778e656cfcb366bf20517da1dfd4279c82089050847f094c97d8c194c42e88018004cbbf2bc5fdb51955d8b2d66b76dd98a2dbf6041783089150847f2c30d5f33bb32c5c22b9979a605bf64d508b705221e6a686330c9625c2afe0b884089250847f01a75666f6241f6825d01cc6dcb1622d4886ea583e87299e6aa2fc716fdb6cf5850893508481818082800980090990506200225960005262003015565b847f0a3290e8398113ea4d12ac091e87be7c6d359ab9a66979fcf47bf2e87d382fcb82089050847f154ade9ca36e268dfeb38461425bb0d8c31219d8fa0dfc75ecd21bf69aa0cc7483089150847f27aa8d3e25380c0b1b172d79c6f22eee99231ef5dc69d8dc13a4b5095d02877284089250847f2cf4051e6cab48301a8b2e3bca6099d756bbdf485afa1f549d395bbcbd806461850893508481818082800980090990506200230a60005262003015565b847f301e70f729f3c94b1d3f517ddff9f2015131feab8afa5eebb0843d7f84b23e7182089050847f298beb64f812d25d8b4d9620347ab02332dc4cef113ae60d17a8d7a4c91f83bc83089150847f1b362e72a5f847f84d03fd291c3c471ed1c14a15b221680acf11a3f02e46aa9584089250847f0dc8a2146110c0b375432902999223d5aa1ef6e78e1e5ebcbc1d9ba41dc1c73785089350848181808280098009099050620023bb60005262003015565b847f0a48663b34ce5e1c05dc93092cb69778cb21729a72ddc03a08afa1eb922ff27982089050847f0a87391fb1cd8cdf6096b64a82f9e95f0fe46f143b702d74545bb314881098ee83089150847f1b5b2946f7c28975f0512ff8e6ca362f8826edd7ea9c29f382ba8a2a0892fd5d84089250847f01001cf512ac241d47ebe2239219bc6a173a8bbcb8a5b987b4eac1f533315b6b850893508481818082800980090990506200246c60005262003015565b847f2fd977c70f645db4f704fa7d7693da727ac093d3fb5f5febc72beb17d8358a3282089050847f23c0039a3fab4ad3c2d7cc688164f39e761d5355c05444d99be763a97793a9c483089150847f19d43ee0c6081c052c9c0df6161eaac1aec356cf435888e79f27f22ff03fa25d84089250847f2d9b10c2f2e7ac1afddccffd94a563028bf29b646d020830919f9d5ca1cefe59850893508481818082800980090990506200251d60005262003015565b847f2457ca6c2f2aa30ec47e4aff5a66f5ce2799283e166fc81cdae2f2b9f83e426782089050847f0abc392fe85eda855820592445094022811ee8676ed6f0c3044dfb54a7c10b3583089150847f19d2cc5ca549d1d40cebcd37f3ea54f31161ac3993acf3101d2c2bc30eac1eb084089250847f0f97ae3033ffa01608aafb26ae13cd393ee0e4ec041ba644a3d3ab546e98c9c885089350848181808280098009099050620025ce60005262003015565b847f16dbc78fd28b7fb8260e404cf1d427a7fa15537ea4e168e88a166496e88cfeca82089050847f240faf28f11499b916f085f73bc4f22eef8344e576f8ad3d1827820366d5e07b83089150847f0a1bb075aa37ff0cfe6c8531e55e1770eaba808c8fdb6dbf46f8cab58d9ef1af84089250847f2e47e15ea4a47ff1a6a853aaf3a644ca38d5b085ac1042fdc4a705a7ce089f4d850893508481818082800980090990506200267f60005262003015565b847f166e5bf073378348860ca4a9c09d39e1673ab059935f4df35fb14528375772b682089050847f18b42d7ffdd2ea4faf235902f057a2740cacccd027233001ed10f96538f0916f83089150847f089cb1b032238f5e4914788e3e3c7ead4fc368020b3ed38221deab1051c3770284089250847f242acd3eb3a2f72baf7c7076dd165adf89f9339c7b971921d9e70863451dd8d1850893508481818082800980090990506200273060005262003015565b847f174fbb104a4ee302bf47f2bd82fce896eac9a068283f326474af860457245c3b82089050847f17340e71d96f466d61f3058ce092c67d2891fb2bb318613f780c275fe1116c6b83089150847f1e8e40ac853b7d42f00f2e383982d024f098b9f8fd455953a2fd380c4df7f6b284089250847f0529898dc0649907e1d4d5e284b8d1075198c55cad66e8a9bf40f92938e2e96185089350848181808280098009099050620027e160005262003015565b847f2162754db0baa030bf7de5bb797364dce8c77aa017ee1d7bf65f21c4d4e5df8f82089050847f12c7553698c4bf6f3ceb250ae00c58c2a9f9291efbde4c8421bef44741752ec683089150847f292643e3ba2026affcb8c5279313bd51a733c93353e9d9c79cb723136526508e84089250847f00ccf13e0cb6f9d81d52951bea990bd5b6c07c5d98e66ff71db6e74d5b87d158850893508481818082800980090990506200289260005262003015565b847f185d1e20e23b0917dd654128cf2f3aaab6723873cb30fc22b0f86c15ab645b4b82089050847f14c61c836d55d3df742bdf11c60efa186778e3de0f024c0f13fe53f8d8764e1f83089150847f0f356841b3f556fce5dbe4680457691c2919e2af53008184d03ee1195d72449e84089250847f1b8fd9ff39714e075df124f887bf40b383143374fd2080ba0c0a6b6e8fa5b3e8850893508481818082800980090990506200294360005262003015565b847f0e86a8c2009c140ca3f873924e2aaa14fc3c8ae04e9df0b3e9103418796f602482089050847f2e6c5e898f5547770e5462ad932fcdd2373fc43820ca2b16b0861421e79155c883089150847f05d797f1ab3647237c14f9d1df032bc9ff9fe1a0ecd377972ce5fd5a0c01460484089250847f29a3110463a5aae76c3d152875981d0c1daf2dcd65519ef5ca8929851da8c00885089350848181808280098009099050620029f460005262003015565b847f2974da7bc074322273c3a4b91c05354cdc71640a8bbd1f864b732f816388331482089050847f1ed0fb06699ba249b2a30621c05eb12ca29cb91aa082c8bfcce9c522889b47dc83089150847f1c793ef0dcc51123654ff26d8d863feeae29e8c572eca912d80c8ae36e40fe9b84089250847f1e6aac1c6d3dd3157956257d3d234ef18c91e82589a78169fbb4a8770977dc2f8508935084818180828009800909905062002aa560005262003015565b847f1a20ada7576234eee6273dd6fa98b25ed037748080a47d948fcda33256fb6bf582089050847f191033d6d85ceaa6fc7a9a23a6fd9996642d772045ece51335d49306728af96c83089150847f006e5979da7e7ef53a825aa6fddc3abfc76f200b3740b8b232ef481f5d06297b84089250847f0b0d7e69c651910bbef3e68d417e9fa0fbd57f596c8f29831eff8c0174cdb06d8508935084818180828009800909905062002b5660005262003015565b847f25caf5b0c1b93bc516435ec084e2ecd44ac46dbbb033c5112c4b20a25c9cdf9d82089050847f12c1ea892cc31e0d9af8b796d9645872f7f77442d62fd4c8085b2f150f72472a83089150847f16af29695157aba9b8bbe3afeb245feee5a929d9f928b9b81de6dadc78c32aae84089250847f0136df457c80588dd687fb2f3be18691705b87ec5a4cfdc168d31084256b67dc8508935084818180828009800909905062002c0760005262003015565b847f1639a28c5b4c81166aea984fba6e71479e07b1efbc74434db95a285060e7b08982089050847f03d62fbf82fd1d4313f8e650f587ec06816c28b700bdc50f7e232bd9b5ca9b7683089150847f11aeeb527dc8ce44b4d14aaddca3cfe2f77a1e40fc6da97c249830de1edfde5484089250847f13f9b9a41274129479c5e6138c6c8ee36a670e6bc68c7a49642b645807bfc8248508935084818180828009800909905062002cb860005262003015565b847f0e4772fa3d75179dc8484cd26c7c1f635ddeeed7a939440c506cae8b7ebcd15b82089050847f1b39a00cbc81e427de4bdec58febe8d8b5971752067a612b39fc46a68c5d4db483089150847f2bedb66e1ad5a1d571e16e2953f48731f66463c2eb54a245444d1c0a3a25707e84089250847f2cf0a09a55ca93af8abd068f06a7287fb08b193b608582a27379ce35da915dec8508935084818180828009800909905084828180828009800909915084838180828009800909925084848180828009800909935062002d8d60005262003015565b847f2d1bd78fa90e77aa88830cabfef2f8d27d1a512050ba7db0753c8fb863efb38782089050847f065610c6f4f92491f423d3071eb83539f7c0d49c1387062e630d7fd283dc339483089150847f2d933ff19217a5545013b12873452bebcc5f9969033f15ec642fb464bd60736884089250847f1aa9d3fe4c644910f76b92b3e13b30d500dae5354e79508c3c49c8aa99e0258b8508935084818180828009800909905084828180828009800909915084838180828009800909925084848180828009800909935062002e6260005262003015565b847f027ef04869e482b1c748638c59111c6b27095fa773e1aca078cea1f1c8450bdd82089050847f2b7d524c5172cbbb15db4e00668a8c449f67a2605d9ec03802e3fa136ad0b8fb83089150847f0c7c382443c6aa787c8718d86747c7f74693ae25b1e55df13f7c3c1dd735db0f84089250847f00b4567186bc3f7c62a7b56acf4f76207a1f43c2d30d0fe4a627dcdd9bd790788508935084818180828009800909905084828180828009800909915084838180828009800909925084848180828009800909935062002f3760005262003015565b847f1e41fc29b825454fe6d61737fe08b47fb07fe739e4c1e61d0337490883db4fd582089050847f12507cd556b7bbcc72ee6dafc616584421e1af872d8c0e89002ae8d3ba0653b683089150847f13d437083553006bcef312e5e6f52a5d97eb36617ef36fe4d77d3e97f71cb5db84089250847f163ec73251f85443687222487dda9a65467d90b22f0b38664686077c6a4486d5850893508481818082800980090990508482818082800980090991508483818082800980090992508484818082800980090993506200300c60005262003015565b60005260206000f35b8460205182098560405184098691088560605185098691088560805186098691088560a05183098660c05185098791088660e05186098791088661010051870987910886610120518409876101405186098891088761016051870988910887610180518809889108876101a0518509886101c0518709899108886101e051880989910888610200518909899108965094509250905060005156" +} \ No newline at end of file diff --git a/contracts/deployments/encifher/Poseidon6.json b/contracts/deployments/encifher/Poseidon6.json new file mode 100644 index 000000000..9e456ac7d --- /dev/null +++ b/contracts/deployments/encifher/Poseidon6.json @@ -0,0 +1,66 @@ +{ + "address": "0x3A1D75769758705caB1385377d4D88b8193A5f37", + "abi": [ + { + "constant": true, + "inputs": [ + { + "internalType": "bytes32[6]", + "name": "input", + "type": "bytes32[6]" + } + ], + "name": "poseidon", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "payable": false, + "stateMutability": "pure", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "internalType": "uint256[6]", + "name": "input", + "type": "uint256[6]" + } + ], + "name": "poseidon", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "pure", + "type": "function" + } + ], + "transactionHash": "0x50e3911763f241df9932994441f4ebd3b414b178c879628e616dd8ff122a0ec1", + "receipt": { + "to": null, + "from": "0xa0Ee7A142d267C1f36714E4a8F75612F20a79720", + "contractAddress": "0x3A1D75769758705caB1385377d4D88b8193A5f37", + "transactionIndex": 0, + "gasUsed": "4840920", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0xe4a6f4009c16002b9e4818c071fbf056d674c1c73e0cd39d7f2a27cdb6073855", + "transactionHash": "0x50e3911763f241df9932994441f4ebd3b414b178c879628e616dd8ff122a0ec1", + "logs": [], + "blockNumber": 61364, + "cumulativeGasUsed": "4840920", + "status": 1, + "byzantium": true + }, + "args": [], + "numDeployments": 1, + "bytecode": "0x38600c600039615c596000f37c0100000000000000000000000000000000000000000000000000000000600035048063f5b4a7881490636afa4b7a14176200003757fe5b7f2abd9e16b7b48289aa19cdfec726fa3fa15cc1625102ae511bca45f39d337e9d6020527f1b4bc5885d1cfc8eb691875300db5a0c7362ae381898acaf8b63cad04ecb36c66040527f08a72fbb55dde3e93c5818571a424a54953695029eedbcf91eaeb012751c7f836060527f0f95359a1f6845d4921892f83e500bbb1b3d3763d8fc762400af039b0abb83f56080527f16f01751ce985328afde34d81619defb43e6c7b5dadf52d0f82472fbce7770d960a0527f1c391626328457fcafa629f3e6d33e2555e8d885e3c07cecc8af1f4d5659641760c0527f00970f671b9ba35e3e3c642d1e0b8032023ed5bac91c2c1056f03965a42c529760e0527f1fe9feb5c7f7c7a426bff032cd6a3158278b6c6b2cc57a871213fcafd6427989610100527f0cc7eabb154aa7955eac47a19f6437a2b8dec0fe9e5686150ff6e88b1a7b4bc4610120527f0393efd96399aa0726ef9af79be8b6c715e429906ca0d15076b5a990fea75ace610140527f0871233835b752ea030cf8a4f43771296eeb33f697d1b0825db47d39ac9e5955610160527f1a02798f047a51baaea34fcfb26ca6afe96a5fad1d2db4270497b6e6504891cb610180527f055665d76df3cd0fcb713c234ea79d06a31d6e3e4c3bcc657dba4c664d5a0da06101a0527f26ee9691a638edc7c91887e302fc55e8e7758286a44845ad88fd7de3bb1052c16101c0527f00cdb2db9e4f9d732d217c5e3114821165d49e5a2d41556bcd53d0c4d433224c6101e0527f012f3bb29c972793182123f5c49306e16a3a787c4bcd9c798a131b70856d1cbe610200527f0bba9006404c5ede82b527677daf444ed43fd1e0dbdc5528dd2cd1f17ad73481610220527f17e4e73bf701f88d219acf1ca6390cc1e17c9f84b1713820837ca070be84a2dc610240527f234b8a077ef52b53a343b8da5b20cc358ad60760dd60276d485015f73d53d207610260527f2dc3fd77394b7b5ac1cbd1b46e6ded5b835d7217a4c50a487ae9a35a7fd45d9d610280527f1668477640fab14c72b1c16ff0192e48cf882f12276bd12f97f82c6ee2e61e486102a0527f09664216ca565c1a44fc2b98347ea8b36904b3877f2159dcc999895adeb4d70b6102c0527f111fd8dfce2bd3b7ba0cfa93e20fb685abf76d77305857b8df30914e4849ecef6102e0527f19f53c0a592b3ea93497a511e56f66753598265b1ab6774da48eec04e4d93426610300527f19b683c39d3b002fc3523b7bee5a60148b1dbdf18dd1c318e6a541e8cf66a174610320527f2547113a818779f13e3448719c7ef100b8036bb3e882dd5e6456c35311c1bd5b610340527f00cf148f8045cdbe7bb1013f72ebd4126a3e35cba9a970441ba8d5bc76943b0b610360527f3008421eed767a093322a09c3733973a038168cb28cd2e1f709076c00b869599610380527f1463f51d4a4cb1eba16dbc115566aa48fe77b43c244c9988a3c658d2f56493d66103a0527f16afd8f4c39038b8006a59d292aea84731c0f83832a61b82250ed90118e8fec26103c0527f2296361f3bf154efbab996921936e9b1dff8352711f958638172055333e075796103e0527f1c3160ebaeb10f809f69843cf8d5bbaca198d1f8e3439be29beb92d909ec891c610400527f094c66bdcff54382cd9213abe43312edb5b4d414c6e09acca24912a7635404c6610420527f2e883bd408c4c826d004ff777d7c0938434ab5bb84f3420e5d94b853b1746f89610440527f228af6d425e91a783dd18fd89a6b38bda053f2f23c094b875f27cb3abba2030b610460527f214e41788bd2b990347c7f2a8f47612d4dfceb1a1e6da38165873df66ce51f59610480527f03fba82d3f783620873da94e9f4e84c8b529d76f54e4b5d7d4805272af9b97756104a0527f066782fe3e869de2cebd7ebbf60fb435785329dfb12ad9bd1b4e46ed362895116104c0527f1c5cd6b23ef336be01efa37a27e6b7aae5d1643fceeb212cdff51588835fb5376104e0527f2f3b4bf0f105f88e27248af094e29feed9ff3fad9a794e15830bd2b311539453610500527f2f4085eaa9f80a69b739fc23f2fe4057f64729b311783fcfab3a0a36fc1ff432610520527f2363603349e94f520fa1f98fe2507f6aae361934078aa59a16214c088185638b610540527f0548541724f64e20128260899abe8fbcdff184a1957a9385fb715923bf0fc79d610560527f21c5e25a6991364e59a205e5b01c811deeb095680a72928369cfd2de71b14f98610580527f11c5cc53f6338c825817aff7792a2efbce8fff171300d41455a2edac37663d026105a0527f27a0949fdc9f10495c4ee7214aa0edd2ad8eef68f577da8b96f9d87a39504bf96105c0527f1c7fc68f3fbde4a23c455ef0d0dbce0ce556a0194e6d552c0455cbb5b0c230e26105e0527f11d0f56fc00e7d85b3a2939fd33991dc8abc1ced0c3f3c530cbfb4500d63de9c610600527f01b2e9d20d9b55deb048cabe1636f0e96363bec886679cbd91f332fb2bade44f610620527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160a4356084356064356044356024356004356000877f2197703fceb4cbf07c6dbf46c4ad93e7d14e554db66d09102ff84824743fe4e782089050877f1322f0fffc7e4854bd8b5fc23e7106b51f59bd5061d8b565aca2fd3efe512f7983089150877f19e414f80380aa2d222133118c337d82a8c5894c2f88861ee46f448fa9d6135984089250877f22241199a4df9cb7d65249d9562cad6c65f16460e79a7939cbfdd6d7b9209d9a85089350877f0301061735384dfcecf9a311c22ade327b51c78b211615f41c77f6d85e8a41b686089450877f229e1d86c1f2810f4a2633b7b4b5bb61b7dc5d19ac95fd8d379548ff2b6850ee87089550877f0e31dcf9c53209a817eeb292e989727c3f56bff65883afe5fdc28ac3dfbea67588089650878181808280098009099050878281808280098009099150878381808280098009099250878481808280098009099350878581808280098009099450878681808280098009099550878781808280098009099650620008e560005262005a78565b877f222c7318ebe96306c9d79ac11237263c6b8eb25272eb88407e8c29a358b40f2a82089050877f0cb416b42c53a829cf4fc823be8f4fedd12593394cd529053ff4e3604974a2c683089150877f0892729d09594a8d8b1adfbf2e2ed75399dee612842b6db3d2d2c2aaddb6c0aa84089250877f18e39e9ae45f14ba97a15bd672711ae124375d9f482a4487a0e334dee2d27c7185089350877f2560c9ff672e6ea69dbb33844d0d22870461d18eaf0f8992d4d7ac649edd661086089450877f21bee2b8ed54b726ef17f77366b1dcfbda7ccf1e487f9916e5f963e814c5731287089550877f300e1b28dabebdc0d4bdbc19be29a3dee4eda8425dd0c7c6e82fec147cb070ba8808965087818180828009800909905087828180828009800909915087838180828009800909925087848180828009800909935087858180828009800909945087868180828009800909955087878180828009800909965062000a5060005262005a78565b877f2c44a5ff45deea69dd2961d67011af4982b9405f9fe38de4a732d2aeae88cc2382089050877f0c8d59fe1b7f55095e6aaad9e3b4e7b1c93d876ba3234dd1ac5ec64108291bfd83089150877f06cf82bc5fd115d348a30b0c45378d90cca1660446ba049759fa53103fcd78b584089250877f2f80ed01a2118d02e2145111c3fe6ca70efdf95d8abeaee8829293347dc9061c85089350877f0bdfe7f6803e4dee7b026e079075908cb8414e3d651dd12fda67df08dded9e4286089450877f06cc48ed882405595b34d39138f50bb5b31a963a0dba66aef17c19ad622e29b187089550877f2a67f3ba6d15949932ac5622cf9e2b493801bf16a50336a4518258bcc6867c958808965087818180828009800909905087828180828009800909915087838180828009800909925087848180828009800909935087858180828009800909945087868180828009800909955087878180828009800909965062000bbb60005262005a78565b877f2572725a67c60718df656934aa78fbeb80c8f395aeb6a20cd833c4b14fef412a82089050877f03bb7f6ca43545b11f19721265b416166579cb753330b1879b79685d1df0bfa783089150877f2412815e863f8f3bc28bfcbb957faa5f393300b25133e9221b8eb3156ed5c12b84089250877f0dbf64d58df212e4307871966de097a5db09a93e5bc305cebdcd0630f433af4585089350877f274c06c01158e047ff4a791e25b7bb3db190529df8f50b6386273f810f15c6ab86089450877f23cf40693f52abf0ed3d842f7bc85d1a2111d0abecfc18acd0fe3991ee5fd33d87089550877f1daaa926528f3368f4e4cf924166b8bd3ff8daefbcf900e6dcc4ee63c40996988808965087818180828009800909905087828180828009800909915087838180828009800909925087848180828009800909935087858180828009800909945087868180828009800909955087878180828009800909965062000d2660005262005a78565b877f10103789dc9471ad718657bebb6781e39bd92fd20ee1a32d0de3ea2817a0155582089050877f0009bc25065080e6c6e9932e34bfde78d1085f19e9ffc8965a4660a4d9b6d60783089150877f1312c727cb5489bb174e1dcb82588edfab31a2999b377dabece466e9dcd6afee84089250877f20294a462c7d0c25aeb5374618e5e77316682ae3d726824f15f00f7cb9a7009f85089350877f25e0c6be89bbb04bd8391c90cf35588f0e9d73fdb06259f47a05513ad7a23e9186089450877f0084a0b87e0b336c9a911069f89d875a38be313efc420d28b9ec287f28810fd387089550877f28a03ee29f612aab268f76241d54d477a1d97f5807ba2e1812f4d350d7c6f7da8808965087818180828009800909905062000e4960005262005a78565b877f0b6794182b723a12e0b35f76bd55a7d106ee6a4035527c4d329a6f33068d7eda82089050877f015b9a698465428fc686b79db4959c8495b92b85122f6a6932940836facea86d83089150877f1bfe52289f811f5c3619f14866138ae9a1279bb76e8cec9a8936fdc36f59df7b84089250877f1cd574fe8d5e4c428b92b23a9717342176e1d309a7e259052c31bdc9af091fa385089350877f212d1bbdfaaf0200735bc5851a156adcbfa4f607f5da122e1f63afaecd38cab786089450877f0b0479e28820e883d903a951f95b13093788e9e1ca64ddf2abb94b13fee9edbc87089550877f0110f5257c21c9379d73b76e9ca95c513c77a15cc8ee0ef726d8460d4fbbdaaa8808965087818180828009800909905062000f6c60005262005a78565b877f08c52e9401a9764f0c2487dfed34e215c186b6c2838e38eb5a50cca4f0bc699482089050877f2e422b4323cb4c0af46f4b0e5052f75744c538abccc7643f339440dc3aaeeca383089150877f2e12482ba160472d45549ff79cd04aebc4a327c4bb9d78c2573b835b05c55fe684089250877f124fa5f9c5a96d6cce92cfc73ea2446202f09100eed203ae4267aa637a032d3685089350877f0bf651f82f83ca1fa037a941d4e2a4b3e08f5e1603f933a1723adf4135796de786089450877f21c674ea7b834741cbad39b21b242ab9a5554c6c9f92e801cb1fe4382b61946387089550877f214f91d6c4aef57e83186b57fd9fa48a193e1caf16d7f6dc1559d144a271b341880896508781818082800980090990506200108f60005262005a78565b877f203e2218389729c26c6f66213f2269c262785ec68c759599c2d8e3f68035055b82089050877f1aa934198713ce17658f51293fad44b1c22fc80391405ce76c92b2349b7eb3a283089150877f1014d4e5ddd9c17b3c2b29684476afdbaf7fc56e8b799616a67bbc6678e4535184089250877f033c13ed45b4762a47e1d2d45d7fc8fbf9d4e24546e20dc596911fb99171035885089350877f09bc1c3274c569e7e5c5d77c51fe69b23b7e435138f4f3217016a2d70ce71d5e86089450877f1803171c9dbc0610e38d8308db101d6a99ca90137f6ab8cdab2a91b36b63322a87089550877f0ba6071aa98afec3fbdeb46a88e4a5d17bd4454c0e7da8c74b15b084488cfdcf88089650878181808280098009099050620011b260005262005a78565b877f179e90ab4b08a4ead281a8709057487e077b710879911f215fbd6e8ebf838e9782089050877f1cbca88b8ab3f0588ff87deea978d00008adbad808e6510897238ea007f491a483089150877f2f50b20b33692bb0f62777de5e3198377d7923ef2fa8ede08831e10f7e9b9f5a84089250877f15ba030e8f1ef6f260566fd6fcfffcd21a1cfc1232f7ec7148ff076d1ba6870785089350877f0dbe053da01aa4b7c0fad83a3cc966f0b8281bb4940f97a5516cfb9dcd543a6f86089450877f222eca5d754afeca8997f31d6fcb94a5d799afb795e68d4d8b0ce6d839f6dd7e87089550877f2abffa43d756ef242db7f584bd62405991112618362f1b29a33ee2131b46a44688089650878181808280098009099050620012d560005262005a78565b877f03c92524ebe67300d0dd0aac464f0e6ecf962d6ad41bf2685f077bfd788eb3fd82089050877f282241758ade4ef8ff3858305288d3b4a52209295d1a4bc89d885b2f5dc3341a83089150877f02635cb973d71bb3d2137bd81680dd3bc607fc5487e898c4c2d83c1dc281768784089250877f13c866aa66e8d506079dc24c2df7b1e691994887d35622f4cfcf014bbea223e985089350877f151f0007ccf42a7ef969f1b6f6315992e6594bb5344d2839fee6620b60e2c02386089450877f1c1c6a5ebccee8caa4dc7ef18e194274f6e198d2b140ddcc97cb15c92ba1409c87089550877f18330c9e67d62f7861a996d7ed69bba904b0dd459f2b254fc7cc53dd28e45a6588089650878181808280098009099050620013f860005262005a78565b877f26b747740c95bf139cb11bdf02fa63a4bdb29a90f158933a1822cdde5387290d82089050877f1475676fb205084246ef9bc7234f312c214f426852dcb2ec7dc3772f579af8b183089150877f1b03ad9080d29b70aaf30bbc3200efffe73ee269dc032d2e32bd190767bc380d84089250877f21c175f937c2f82e99735bc7c201284f89577b27a1f84fa24642eceb552f445585089350877f1192e0269a6b66a8c5887527aa4474c2de91cf8c71ebda835df2cdccdd4a4e4b86089450877f0f3a12c0ee52f0d34f2b4a0dcd13541b48aeb3d5121d311113bba9792a45a58d87089550877f07fb521883bdf78b33689205b45e52269458a061bcb87eeb3b1e183c6d7eb5b7880896508781818082800980090990506200151b60005262005a78565b877f248d0e8051c1a965640c96c6f010c4931fe648b96f95ef6f5b8e474f64cf316982089050877f2ab553db9ead2c82ce91febe180529eff3521875f7e90a9b8b7a3c4de4877cd683089150877f211ee3bda3c95f1954eef22a0a82c2ede8444e42a72a8200bab6a133846d5b5c84089250877f111db3b5184ff7412f79c129904a9cac4ee65a51c2062d66732f54bcdf767be485089350877f1a73843264cf9a3a1bb6fb68ef76037c4fa98337e5c10096c630b449ec4a5f6786089450877f1c2e5a2d9332f65128c85358662d6a7c44353add09c27cd07da02f9144da855e87089550877f0e2b35fe1021b879de5b67a7458fa6188bbdea39e2bf468a1a24e3625cafff98880896508781818082800980090990506200163e60005262005a78565b877f2e568594e5dfbfadf272b8d6e8c99bd785c4fa94ce9e87fa8a9a37e32c7a28de82089050877f07043c7571cb7dc5205bfda42d693527a4bcb58238ed6a6a248e7917ddaf0c3a83089150877f239e18a0c85b845ffd6b85e96343f1a8378f3c691dadfb228da6ff7aa79efe1f84089250877f25e247af250c564c00f5ff1cf1f2bc8606600f173cb65ef0780af9f5a1b676c885089350877f031ba3385664544e3e0801f1698b15033a6049b2504e9cdc2c6e3eb2fd12100d86089450877f2a33777739e2ab0adfb1ca5687db1e059b20370cbeeccad32da5c3609431ff6587089550877f2bfd6f0e9e996ba13749327b9c5cec69903d413b2df29b777d05384b3e7af952880896508781818082800980090990506200176160005262005a78565b877f2d453d93fb36fbf8e36747ee92d90cad9e02e692d0748c07fd43eafc2cc5e82382089050877f187bd8043f8642cda2b6bad82958d115818880eb80f6b730381d974ac5d5037e83089150877f21aca605f92a48ac35708fe5140729fb35c3e48ccec441217713b0864944393084089250877f173fd164f5224ac06c2e99f3e2eaa6379df113de30aa485e8bbcc7f0fd2d1e0385089350877f071c66a6463c3fd4292bf1e5acb6de611142d73cd1db590e89b61b57d44d69bd86089450877f044a40e396855be550d8ccce7b82ee2caaef6675bebe92266c666982ff72bbf887089550877f1176d9f52e12df67f087110a15aaf98d1ded293ffdf99599fedef2e51569e4f6880896508781818082800980090990506200188460005262005a78565b877f06e8eb7dd026d257b15c6624bee2f37d5b67b4a671cfcdfee5797e8457b6391682089050877f0696aa48c1d5fe84ca5cf59009ab0baaefbb612e32c91d5ef306def38dc5673a83089150877f0853c33a9c7a7c3b355c92c75de444365db82d241eef9f3fac417004a3a1accc84089250877f3016c0ba34678e0a67f59cf96ce16e908154f5f9802591717e66e95ba25ab77f85089350877f0af008601dc9552517f303ff9e22c793a682caa93256f2f09a4f746542603b0e86089450877f04cb6d76b5a27a5aae387cb647790318c25fc16f8d7d1855a38765f847f731b087089550877f2ecf70c372d8e5edcad49e58d47875f26933d62614f266e6b4f586177148565f88089650878181808280098009099050620019a760005262005a78565b877f01f393a6ee74dd6c4d52b0e7820a7132f8c4889742313c06caa6ecc55f3dd41382089050877f2e4d4ce3f97bf96ff86b88e969d13e415e14721282769f7cf8c3a73723f094db83089150877f306000ef24a7f5a9c652e3a9367578554ea59bf8efa0bd8bc5776460c18c1add84089250877f26e58d6287678f3db9c225c1d3b93ae7c43a69024ebf249c8bde40617c2b3d4985089350877f09eee09f873d1bf683971df4d7ce56c8f0b8b98ddc05b9612c0a0d317310655a86089450877f0f08879dfd4fa0dc11ded556ef01c6f94cc6f4d18553b08bcb1dd604392ec00c87089550877f11459f7e9f0e3c727777e34d6d93ec28a25bd867171523bad5be0d5a20029eb78808965087818180828009800909905062001aca60005262005a78565b877f04e9cbb6f6e8e805a20fbd801a53b723f78c1f5acd227880f7f37f4e5b0528ad82089050877f2d2ff32eb7a0c0266dd46bd5939c9a9aae88b3e9af5dad01a7304f9868f7c7c683089150877f23b77eb0f27e950200a590447d645a723d9b405fa2538a5cb76fc5fdae16d83984089250877f2cd6d2c5658ec0792daee2067e2f958d6849886318a6c1c27233a469e9998c2f85089350877f0ae1daa420bac90780d0c83026bfcc84af83953e26eca839da76861e739855e786089450877f2b495b854553d02a75b68763bda6dd8ef0e81fe32b5cb072d3f580a914967bf087089550877f056fa5d7ce2c32bc5735351d2d48af5d6c9256a4b72e12a35640b53ea959e2968808965087818180828009800909905062001bed60005262005a78565b877f2ecbe1a06b28ec78ea7d22df11cd224a0e1a0ac7a3476c5cc3c4e50da961a87b82089050877f143053c1c387f9353bd677e5db6e9975792bffeecf02d6aa0fe8f627579fe6cf83089150877f04064b25584499a011ea74ac047a8b37494189bc63342bb1182e234212d42bdb84089250877f100f61f6b81542156760a6d29af5dd8644c82deab5b90e6ac66de8b4a069564a85089350877f18d331b2e8180b7aa7055c029fa77aff4f02b0e2a2078bff67688ed65b51d6dd86089450877f0fcf9b89e19b1a55f9b03255cf80ccb9fb6aafde2b46207d873fac80ccef085c87089550877f254f801f3c89c62436ef63df67d912c1f231bb1f76c6c7b497f7708dbcfdc17b8808965087818180828009800909905062001d1060005262005a78565b877f16d8e85e57819a10a61461bcd8d3d3c963c4f95afba3e4d8fd0d6ec882b9d16182089050877f29c9565aa702088bd443e4620d84bb2bfb93253a8f0f04e5cf408c92820ada8483089150877f294fb68064643d8beb237bd705a557871b5f1408624eda46d47b583a60d29cf984089250877f2c26f3083140c104baf24c3df922317584aa11770451e6a846de7dc79519731385089350877f231811279854707dbaa537cb27241e7021a949a1d9671380a7d6944c838904cb86089450877f1419365adbb91f1f7d1bb0aa8a4b5d11c7ad0570cc6cf3638be9c5a2a275b49587089550877f1674425f2e9fcaa66eb001feca48ddd4b2a29e86d451f00d176ea35b4e02fb848808965087818180828009800909905062001e3360005262005a78565b877f291f956def59b878028000cef03d7b54dcc2fe1dd5a75dc180d6d5bed898cd3082089050877f2f1302894fe6a26b5bc03fbaa69c4d95012394d78de494549c7057b7ef965bcc83089150877f0627d6d6d94d0a19a17db45c0796f7db8de13d278a2b24c99ac5d92d0a1a1ce284089250877f2ee297662bafebcb01df8e62bd5f50f03025515b10465d59f3a294f0bfbb2fc585089350877f118029945df773f52fef5429da766b902eeae7d967062fdd879c60a1bfaba75b86089450877f306042d262f6268ba789eb4323c2169279752ffec6b8536cc68b53bd4df0e85887089550877f0472a13ac7da9ebe1132e05f9ef609135c82a0ebd9278def2b34f8ce709aee4a8808965087818180828009800909905062001f5660005262005a78565b877f2e8f76b27b474180f00c5a6c2d65850bbf96019bf0d76dbb4743a970f42a130f82089050877f1e33984165f47c204a33fee31f613544b7d846a7d5ea45280ede4b362c32aaa483089150877f17f22e27252bdcf91a72b59eb276a666ce4fea7adfbacb2ea9fdf28524b7b43d84089250877f00547e7c70ee4e3fb4a4d386c8baa55d823a0f02bc963b43039b8847cff6e6c985089350877f08ea4ccbf815be325ccd15494f38f3f97153ab09c54a87a852b2a99480724e2586089450877f277cb45f3e632718673ba05d48c712fe7404df9eff5401cebe45d194c67fa8db87089550877f0159ec7ea49aadb3a8b0a23c1dba0023807b0d099d3c40b69df866a92dc87b37880896508781818082800980090990506200207960005262005a78565b877f0c33489297e244956de579c5c112ab40c7fb2d89866a28418f660a86ee18524e82089050877f01bb4fcbae28a2f3399568c6b3849da27d6ddf4fe6adabb591151679ed37d21f83089150877f2a23343d24a9cfa3b8f413f52ee1b233ce4c1d5b9bf34b03dbc6d733d52305c984089250877f0707a6d515b3bad03a9b06d6be048defa850134aacd120f38fa93264016b778685089350877f1837db5401dd6ec30ba6b866184da56e8db439ffd04154ec469b62120ce35cb486089450877f244872a0d2766b8547e6b6a5afeabf198e1409a0f0026de36c101793952f6cfb87089550877f204fb17927ce873c761196395f7da46f679ca331832a59fddd2ae31e84eba1f5880896508781818082800980090990506200219c60005262005a78565b877f056f53037d5d8efc7cf6a6feba18d102bf818bbba70b86dd9b763a12072f4c2e82089050877f1df4bc5d73239f5ec3b89efad53df9cd8ad8fca543be01f5f40fea2952071bd683089150877f1ffb6ccbba001155d46e167d1fad1c13bf2892ac87cd9c347c734ab5ef65836784089250877f08ee36e881496539b0abd647d353e51b63fef91fc944880006f2c26c2ecf2a2485089350877f1c3080c254443332a3e6283d5bab6f7fce8aaa68487b9ee4e372cbc6cc17266586089450877f2dc6040500e7329f75a3cefa4db49f9b47085b1660f8873b3e81b7b1af82af5387089550877f2c8bca9dd293bb67db1f66ff2e82047ae9385ce67d7f33568cd4c216a89994b788089650878181808280098009099050620022bf60005262005a78565b877f2a157b9786f9224cf63648aaec1b9f61c7a7087ed6eb8ab20c6c5469d401b7df82089050877f1e0fb0cdd8a54591c42e7c26b9027b77417e4e6522b472bfe61ff89c39bc40e983089150877f250144d1cea033fd78bd73ee4ea4cfdcd6a42f7c00e2d7ee6794d464207d2b3d84089250877f0b6b3fe9a7a525ca60443c4b78a8e830957aae0403116d22983a2e680eedff6585089350877f2fdf613e67d176569f4743b4963f8c53e52482fa32e705247eb650bc7bd616e986089450877f048f64b14275fb86fc55b3c0469cd89306752827c3c04463be5bea66fbd7b38c87089550877f0f2027b781c2c52490e11ed4b7b494d66cdc16e690b6a4b3c924dc9d6e85483288089650878181808280098009099050620023e260005262005a78565b877f29652785160b261c1c20c741524a26147cc3191f33b74ebf17d44ce2f88b0f9182089050877f1176909e02a5b37bfd47810fcbe73af87fea130470aa44bdf6b058c4d359e17983089150877f180f26c6ce2a3a477baf0da58d069769c2bf0156d636f2255e1bc35c01e9899384089250877f2afeedcc2cec57285ad22e734fb7fe3dd65f62601c1ca4884a86c7a6a05f083d85089350877f0dd21a87ee22626998dbcd73dd751affb49d47a02e995a41bca26399103087d286089450877f1d21baa09d7f50f0159fa8a0b6e0d61446d1c7db5d1566469da6a85aa722496287089550877f2dc59c4c9e275cd8c2506282cc5bb842c014bea4236b1bc27a856351b48af802880896508781818082800980090990506200250560005262005a78565b877f2cf62d08541dff0919ba68a697f44f4791c42d1447a41513ab9d5f755eb1f38a82089050877f2f5b8853e2cd2e47a9fedeea4047e46083c97acd4b687aebd2264e7a0eb354b183089150877f05865328a9b2fd469170c391c5ba8db5c66eef9938e4da5bae33f2703c47073084089250877f29761c9fc3d2c4cc1b126be1dc0470a97b8f2725d327c6d1ca923c2aa8092b1e85089350877f1d3fb1f8dc3c77cb515c37bc810d3a5e3b96552d4bbb57fdb01c2aeeb1d9a04886089450877f05f2fbeb7cae0a35ee2f3a4d2964d241a0ceeb47b3f7c4c87bb3b052c8705d9087089550877f1f445014a0f266082a50257152609cc219062154f4d7c13288746954b97998f8880896508781818082800980090990506200262860005262005a78565b877f2d35917cb1d0ca611ee37cfd9078c924fc84bd1a4bfd7db3ce39e05b38f698b182089050877f05a89a4eb40387b8512f2f398b6526efe76716951c500fc8dabc835775335ced83089150877f04e26aa3f02601174f46ced15594329e4f4e5bd5d7d53d5df6c8633a94dd01de84089250877f204d587d61526c1e047e1dc6b6d403b9eb8730f2e2dfb7bc7350d939bac5b90f85089350877f21c8ca213d2f44446ae90a6bdae5843b7c2cb53ed699f36675ea8280a2a420e586089450877f1303bd921f32fa4c4e73af21457c46b6d69e2e6a2c396716217787b46e822ebf87089550877f0613823c5b6abeef14387465317e713b45ace79c0e4433d7c4d352097e5c8399880896508781818082800980090990506200274b60005262005a78565b877f0f27c5305ee978f4f775e213e3ba12a901f51144ce1ea89bb5046930f5ec55d182089050877f2cad11c693c6a627531950a307e07b30ea8a495115f5a5388827792120c7bdb083089150877f16bb256883c44cf37366618e46c6db4e3da97a9d4ae7d5c585959de3272f82b184089250877f29afe50bd78f72cc763695976410324bfd67157a5ccdb7ae45b00032e1d57a5185089350877f09329902e59e5243a726ae5ca35408a207148609ab3698139725aefe29aeb16786089450877f04b1800e600c90ec4776bc6af1764ccbdc10bf55c3314f42acd0531ad53420fd87089550877f298d0110bb90e4c35e293c7a7dacedef7ee9342a591b4330e27276aa13b67ad1880896508781818082800980090990506200286e60005262005a78565b877f024ea6e68cb1aa6b407e022649aa32d1b7ea4a350e510c07eee43929395e4f8282089050877f22ae3a1a81c4550f5fa0116e135d2df2bd9f6835a0f0d03f4dd934e1320a3d8d83089150877f1f0f5eee9e9abb2a2f4ae04d6fe09311fe0115c1e199c28e22705e681442ed3784089250877f023c86606616f317af022464f350b4bee80c2fca32064bcbf83e8cd35dac06c785089350877f2a89c4e5b074fbe67d04cb03efe18c4bf904bec4759b33dad6b2c86ebfd2b9d586089450877f04b0f48c4f2e05bda4b9cf806075f9c275df2cf60b5fd11470eaa7394a82727e87089550877f0edde5a2c01327ad042a686f443417bd8f107c99eb7c02900c931a7bd8cb349e880896508781818082800980090990506200299160005262005a78565b877f2cacacc9c9d8b0004d8932080f9378b60675a8bd853aad1dc50672f137212cc182089050877f0816f33508621f2d56371156b0a3f7731030e4b218e44c90a88cecaf07170dec83089150877f2ef8e0a455d472b49bffda935c8d3bee1ae9248608e2a52d53f4b76313c9792084089250877f17184a8af9199aba605dd1f2dd18ebc02e3055ce408068eccaaf3ea7c0a334af85089350877f16395e153937a83660db6f78446cb995836436602777d81f0607130b4488144886089450877f0e174088223c38e9440fc77307d6720ac32784c9d2f591e2437eaea9b8f5e2bb87089550877f19e70fa937788f7a2127573d56c8197bd0dd096140f39064865c65c31b47d4028808965087818180828009800909905062002ab460005262005a78565b877f0e434c329d5242adbdab24780495ff97230beb344b918f6f8d6bd7d21b03692e82089050877f2c88a82eb87c81ba42a211bf2ef3c15875ac157c7f3868fff35af9f55a8c22bc83089150877f111dc223e3c9fc7452a9c2de469383915f33adf4cf5b49fd2e01c51d09ccf43684089250877f10647353de3197b9cb48f4539b507e45393b000842e8baa1218af097f871baea85089350877f0e53d64121c0a851c1b3f07423582034abce698525d0a47724354c07152f703b86089450877f2891938acb83ee193754969f4aa5a62a531081dbca4dec226258ea92984b434887089550877f04106f95e4ba3fb74dbe4bc53abc170262ba00c7c63ed8c457c3227532c12ce38808965087818180828009800909905062002bd760005262005a78565b877f2a73e61b8f1babfbb38b186f401eed0d92c5613ba25dd2ff4d099f7dd3c19fe582089050877f18e16b24642f19193b798b923b8dd25f6e4856d6b21b729aed2281ab154f7c5f83089150877f0d5f849b166ab9f6fc1a64467c5557029f359a2d0f194030c4dd875e12ae348584089250877f0e25250c57365a29c63a4f1531b8b0ef523eaa93c1d70acd0aa7cd7844dd044285089350877f0f813d14af0c85bcedfbf480b3d80b9f335853c60188526d80761274074a599a86089450877f0d2356a92dbaae8c24a8cebed6428083ef2f469460f166a6e774377e7805543587089550877f1fb6dceb495bf90fff56c8aad70b40bf773ea1003cdd092fd77a43961e9d7dc78808965087818180828009800909905062002cfa60005262005a78565b877f2c0a70ced79951a75e23c5a323fd706c2ab87c381cfc3c269081627741c2bbe882089050877f13dc6b3bdb05167dceb4b11037064ac5fd22db5e229e4c6ba55e8382321dc5ee83089150877f210fa8b777907ec30bb88dbd7c0e6ca9004eb3425d498025da6c90a47c35025c84089250877f0c5cfa957139b45a72fbbf80a410aab5454a982668baf24b0dd3c04e4d599cd985089350877f1f1f3bc4c21d633400fcf8bdb7be59b7f65cedc06bb2fc93a873b6ef12e0f52b86089450877f188f0ee95a9dfb03cd5e3fb30827057e933711644ee7bd57490374c0d67532e187089550877f0823877ebf8a842b77e8e0f3b44873e9409727101b186cae2b80d0cfa726ec8c8808965087818180828009800909905062002e1d60005262005a78565b877f0fe81603de39ccf148ca6390d6f8bdc9395ca2f3f50878283d98f1f0e61b1aff82089050877f2ef61fe192f52a9d7cebf41c134098f2ccae35cabcaa12963566768ff1b8370683089150877f0db6d076b2dd1b9f4d56d2f66fab4d7bfc6a38fef7f9ae1d4c2f8c44b1510f5184089250877f2a194a4ae8583f28189f9c011d107b82f279e6a0f8ca8bc9cb0aa581831c7d0685089350877f0ae539fa9ca67d4af48fb292f9188c9e72f2eeaae2e500b7e7201718c8da8de986089450877f23f66a894b1df4d26a8baa6d05b1ace511faffd4605b36cfd12bb4c6dc2bb4d787089550877f137cef522af2942aee9a4fb8017bf330e64601f466b56d32245669d9fe5ba7078808965087818180828009800909905062002f4060005262005a78565b877f187aafcb87841b2df9d64c1767789a6b221767e4634f0d550063a0bf92788c3282089050877f23212e75f4b89992a3647036ee36d74938bb9a9851e13d7b6e52daf66c4cbd2583089150877f0f54cbe967770dfa9d068b2fc53abc96489bb7d266212654d326de6b9af16d6384089250877f23d83a60b9887ab4359b8569ff3a219bb81367955fde72a62002d3cd51101fcc85089350877f2ea676fe7f21fc583ab0b0e189020d42cb22f044607ee15bfac7dd66da5ebe7686089450877f16f37f357a0c584821a356ab56a16d41f045029cb515f58ede001f05a807890b87089550877f139093b78fc9603a4288ae5811ed1311be916e4c97d35a5cf18e4b7e47d13b03880896508781818082800980090990506200306360005262005a78565b877f0aaba5fcad1c047030c8bf246f41610b68d60bad285cc15f55900f52778a11ba82089050877f1611827956f3435c1fc67dd3d37954a255eaa0196cddc5d5a6187fa0a2839efb83089150877f23db56362f248912421e5f087ad16e0c9e6d2bb59db30a52818e41964b7d812684089250877f2f215e640207a88b02999c98f1af8fa17331d19ea3de1decfe8f2e478224209c85089350877f2b2a261917c0fecf2bce19021f8506e378e9d3e1afb451e9d162b3d93eed861286089450877f2f662e4cdfef5f822cb956df75b17b46f17b08f930f54bab4324a0363e23384b87089550877f0870eeab2e7bb1e82c426c2ab1d65fda25d426749a538b4ea669eaa31f661a00880896508781818082800980090990506200318660005262005a78565b877f169418dffc99f2ef5dc6b1013717c134409349d846457985725b15ac6a152fac82089050877f021d3cb240d6400339ad5bc535b4fbb40919ce6b90162e51ec6895a7cabb437583089150877f12e45c46c45b660b6addc149e4216eeb6fb19474c8cce4d78e34c3cc18024afb84089250877f0c7c86394b7ad61d8c348d185403dc77152fd310b5d05970375a11b5abd0354885089350877f3024e78b217f85d8efeb60008ff70d33c3e84c238d9c21a04121b498a2fbb13186089450877f235977101b56071ced3163c1ec7187909a3ed7679bb54ad40811ba318e1afc8187089550877f14bf885e66f7c01fd974efdc0bc2d628ed79ad6fc6ba511c5a8ec383e1a73a7088089650878181808280098009099050620032a960005262005a78565b877f223325ae7e73cf093e1d5891aa92ed43f82610f1283f265f56548b38072f38d382089050877f239a5ae138dce6a019f44560ef7c19d2b8025dadf040559226f54870d318a57e83089150877f01dcc35115d9057efaf468d7c8a7d46048e01359c974855bc99738f0b247672e84089250877f1359a40012c5332587a4deb5604a436e269c282ba240cca0a6d77b343e76bbf385089350877f0a9ee39712223d4c0c37c26a96f267c85fc8e31acaee0c07354d3798dc5003e786089450877f11812d1ca3671ae688a9877233eeb5ec29868f7cd7c5e13275391a84167e023187089550877f2435cd699bc94985945d878960770f9298d40c0e28b6b5979069e0590952f0b888089650878181808280098009099050620033cc60005262005a78565b877f2bf020785e4117a1ea5930cd5355303bf9aab2a1ea0d6685391f40eeab2af0a082089050877f2cef6c78577c9e97a76855292ca92e4269ac53e9b7439dffbac2eda5c675802483089150877f09a30e00c9f0f6f260f05f029cdaa7c7afca506a5ce562c877b3b8d54313542984089250877f1fd85928f8c8053c9b264a74f121b90bbf9ae8063e0e89670165b9ba66a3e7cd85089350877f24482279d9efa57862a6cd4524aa289e6950606df8cdf8fbcaed4b674fdade9186089450877f10260a39cfb0d82ad8182a6951f9c780a455fc1de48c417d6ce6b27f3646218587089550877f25207827a76052d489bb2698730d5c3fc97192a4420578d2474a37ae7d7e314888089650878181808280098009099050620034ef60005262005a78565b877f28e36b634ecbdf7b8e4f9e1a347df95d771f15d97f2d5c401edf6a6e375874bd82089050877f073f0dea6f83d443ee3ba27c5b7f0064ab7cc0d34babae859f6bf66d46a1e16583089150877f14c6618569f748ff65514437adbcfa97f87b9b0d169048e84c553ba9888c451e84089250877f0c7675a042ba6cc74fa588a0b26fdc4f2d1f119a0fe6ef111be6a2d45b4bbcad85089350877f03dfad7db3f32c6ed8130c43cff604dbe1c29dbff250c684c955f09e495fb34c86089450877f20114281fbe35c188164fc6d4144200fc1d9ec433efc677480bd2cdcb35b64e687089550877f29e42f5218b1ea3fad06a48e2292c0fe3df08a2c4a823a3be4b998955da8a21d880896508781818082800980090990506200361260005262005a78565b877f13bf4039488d94b1b6a67f256296daeb6c7c80fad2726d6e9be11e17c235281682089050877f1847a4e36b3eace13de58fa4662a9f88c9c17a464e6dbd2083c2938c227ee3fa83089150877f0a7a2056c7b79384af9fe3c6826830145f51f6f8ca5d1a344e295ca7663ada2784089250877f181278caa15bdfb5940cff2bc3216ff06a45962d4979dfc0d6c94993bb7de86d85089350877f0a8a6f4fbba2ee09a36d390fbb1485fb789cf3f9f641dae011520c8f10e57a4386089450877f08f6b4c0d7bd5e4c87fbc6874520e3329c067b6841fc833aa37514435e987cea87089550877f2206b2c18f3292e7a9a91039683a55d813dd914b0c7d523210424ff0f2817df7880896508781818082800980090990506200373560005262005a78565b877f0186cef5c04b3a6c32da26405a16cdd359df57be8e93291acbeba3f487329cfc82089050877f075aff67570ea17c7c79c9114c7a10d533c6080b6d15a5bebd1204fdcde772f083089150877f2b06d8389ba9621c3869d2e8b25ac15e2c97389caaf7f97a35700be66c1655a884089250877f04fc6d0a6b67744428161cb5228a94e7c0e95dede804b2b47a18055acd737aeb85089350877f25e4a295b4e7a2dc71394d41ec2a8f4b124e58c234448a028a2c3bc6ad25e69b86089450877f0094c24ab01c6db594fda907b639a7b3a54301439340e889b6ca9cb6cba067b087089550877f2751821a6e3b2206cd6bc3cd5d98cbae8850745ec6cbbea413e7254d2a514549880896508781818082800980090990506200385860005262005a78565b877f145aaecc24e3878db9a8d77149b2419ed5b42df025ecbd1a8e97d8b817904bb982089050877f0d2aa00cc6e5167d845ee1877b7aa059b5e5151c57e4c163da3403f9a95755f283089150877f24233b69861c70c449ebd36e4420ddfc3c242b69ff6e3d4c6090c2bd08a764c284089250877f2c55fe1a75147c9c826f762f836d5645ac4184ba1927dd56a76dc056a989566785089350877f19779b1cb16a9c79654016674978b8b6ee1a78b64579de93ed2d67b9e49f098e86089450877f1807721ba60fbae476ff60120c1f47ec0bce692cfc00102ae50bd9376c5a22a187089550877f1c0208f5aba12750802fbdc3bf12eac9e00ada708f167d4b167bd7d4b03d76f1880896508781818082800980090990506200397b60005262005a78565b877f090b6e28ff541cc38869abe2f5dbfb9fbe888d21021f29d2bddb9127d3c273be82089050877f193d6c7e76ad94eb59a20010a799c7bf96a8dda8c90887d65214c8665ecda01b83089150877f09ddd5bc0b1f8d4c4f1a7a102c1ba12ec7e7540cda285a564ea7c4753af8a8d184089250877f300a1dd5fda15d1a9cfe2a287801817168721da2f970139549e16811f555be1f85089350877f1520908df2eefba075bb41cfe0740e1e5a1ee181ce492016e152706e493cf47086089450877f0b3f215d52e85ec3c682698ebcb6228233ae9518f9450f480689e7cf3013784687089550877f050996a07af6765c56a8ee2f736650deb4972bfcddb194a0efeb1954daa8a4d78808965087818180828009800909905062003a9e60005262005a78565b877f23a59326daf5f94f3b5192c18ed06cc58cd9608e44138686399dc4f1ee807add82089050877f1d220b9add0592866898ce834b1bdc2003976e815c0cf7d3f6b8bf967ad5649683089150877f19b49c4da3d9e3a26d36566738658923477c504e76a38a82b1b1247104f681e184089250877f139decc567b06b495bd6f3cf006c05b7e1f25d5b7ac554445c37dd285beaae7a85089350877f1a5a7d8bca8d4f07d4cd6e9bcd00c009e3099e99af3080debbb21f90f8e5b42586089450877f0621e3811d3dcb9584d0a8be41e431d588c93274c8549e625f98fd15983a809e87089550877f02a41c2d2bcf14664a0130a021daa6efd4a3b0c3aded38635bff97e3785ed6bd8808965087818180828009800909905062003bc160005262005a78565b877f21cfb54ba72fc06794947cc3bda33d815355416e2aae19084d84471eedca399d82089050877f05115093894089a202a4cf8d0aea329d83cbe0ece741160f9975cf01b7c85dc683089150877f2e40541caca7653212827129559ab422a1c06a6f48c974291470c65fc070dfb684089250877f07eeadd730284f5ab60778900b60300d27970001aa63e46ebb7f9cda1157600e85089350877f0cf33e4964d350adf2051f8e2e8448d3324d24d3f4858407f4fd60d3333bd98d86089450877f287c60483e2db313f1a2bda92c1e1c28b65ef0b99df4acfb75709edf6a3bfcb987089550877f289440f4b7fdb8b2b22661d0742e9695139c1a1ecef53c3febde0b5f6d9bb4a58808965087818180828009800909905062003ce460005262005a78565b877f291bda2c37fac962a24555a7abeb36d8e8b9eb25222f97f4817ef2e5b0bc720882089050877f0e105449589412404cda7b82f14d527594ff99d04cea894d6ecc315119f42b7383089150877f0e6097f0ad418ac7123ae7eba6cd4522b7ffa8dc8cf60a1f836be23e41ec25e584089250877f22fdb676724017afa8a8069c62d307aa4ff52c1445ad41b94c3e406e33e0def185089350877f0204d594ad7855ad0f6950742b19e60c2c5338817aab7ee7bf631c3aa92160f186089450877f0b6a643dad3f953877110517f7b336518c8fc11d868bc72e76cd76c3b2f7dc1b87089550877f04189ea6c2bd4b00fa6349adde17027eb7d76353a10bd07d0942639447cb43d38808965087818180828009800909905062003e0760005262005a78565b877f23bc8449d898a7524b2dfde263036cac2e14935134f8c3baf7f1e13ea2deec3c82089050877f0017efa608d9941bc64d39e0b2593b742576dba257fab323d4c99c7a42107a1683089150877f02f061475e9d8888b3877f9308e7758a16f91e3a34a5856f15ad0b9f2f92e2b484089250877f1f257d4d6f3277674a061330d73d6ba135da7cb0cba318686872fe1ef6d52e2585089350877f195340f6c1f7b5f6158884bd237715149cea488edbfd80fc9b9cc61c384853ab86089450877f273e200179c5c45d860b26a20b2c0853c1008f942459d5cdbed633ede031aa1d87089550877f24bd0ecea1e1df97af0f296c0e792d676e2c8e02e808a158bdbe01431c5e4a488808965087818180828009800909905062003f2a60005262005a78565b877f0c6e6f0f7c20811f404599d458af5c6cb41ab671599d6350df38e82104bc683582089050877f1dee1352470235cd8e129b5611fa953706bc08d58f6a3ef3d80370d8d19683a283089150877f1be0cc30343a168fda7c757ac0c7e5e16afddbfb7265878080725a12fa12ad4c84089250877f1a449abf644f68a64c217c6a042a231107ca8d9c619208580eb76bbd9215d98485089350877f080117dde58f228a459f59d90e64babe2daf476a9a2ca018faa3c5fecaac178986089450877f24ab9a167b61855e0f2c60bff098d5eb7d15166fab51f2b62c809de318d6d17687089550877f2b56aca9d595460503363292bccdc80e823201f71b54bda684c93eb0893784f6880896508781818082800980090990506200404d60005262005a78565b877f057361ec23c87b30080ff1cdf3467d57c95a12afbfc48ab5e1e4de0162a41b5a82089050877f1baed177177a25ecbbfaf4f204d9921eade3689ba1378cd9362cc14145089f9583089150877f00ccdb6d5f4913d7656889c312975fdbe0e0309a841849fd808d75f593a7148184089250877f2c52f5e1ef57de5dde528471cc1f0ee7839929df98ee743d9eff96251556191085089350877f0234a4a32f767f2e1ca48dad3a2fdd3ff54b2ca3d53ce13fc9052414ad7f755586089450877f182b4c0c551ab0ce1990b472278f794ba9cc62abcc90a89efdd80776558e343387089550877f001ab2bbdbd043d2d7d1a4eb76db4de71fddf19edf10d7cdb9550e1846e53fd5880896508781818082800980090990506200417060005262005a78565b877f206e6cd1e3154c113a762a628e24940907b41e90e7c2d43aa256ea524997835882089050877f27816cab4bec18577bd335bdaf8298798a261bb175137177d46ba95dd03dc8bb83089150877f1680b632a04be3eb1ed64ef589440b3f9526b2ad82cf0b8839d3e7b0f585bc8c84089250877f196b2cc0e6e07628df8234f58c027c190c75b0342511efea4c3724c4fedd6e7585089350877f29ab0b6065ebbefc684608acc6bf3b5fc693770c38bf91b4be38fe6f7264748686089450877f224ce814d39c382da2d65eccd9deb48056ede18c5efcb8e25515b727e540a85987089550877f195e1cb28f38a9cb57b2c719b504f5fdd1d42559b6a368264fd0fbfefa66559f880896508781818082800980090990506200429360005262005a78565b877f0e9e5eb70f4490ba6dbd1c0ee1d6724ccdd58acdf138785ce98ee3848ffb784082089050877f1995c9c8e520014e4412ec653839d781548cf71f46fbeb51919582226cbd5b2183089150877f0886095cc376c87fa653000283a6eae11008982f27104afee198fc377f26e32484089250877f13761e206b3e89b23de2342bfca860f9b0d9a36d486aa115565f9f52369c124d85089350877f22a8c6cfc0e38a500a47515c519ad6a72506ec0d508de25942c10f51f0dfab8186089450877f18985e9c7ea6f1a16962e4e27cf1aa4aa3086938b13f8ee9465a5ec7bebdee0387089550877f215b523ce3f055c92eb148c00027d1ad406a2abd64081043e0d15492845b31a488089650878181808280098009099050620043b660005262005a78565b877f0102f78c7513b093b885726b7df2e70298801b3e4019cdd42239d76448588c3182089050877f0bce88602fd3a0f0ab8885891ad44045058f9ace11fdabd24e8dfa1b0a4ae72783089150877f0745f760f8d466fc21043e2292e6cbb20b6227517f5200251129c5481f52fa4b84089250877f0406de3807445c6d3cbdf7b174c410a998a1530fcca991535a2a262de4e2ee5685089350877f26779e7346349068dbba66f784f87e243cc27cab59e887f7ed7a0117887d1acd86089450877f25150652a08af8ca574c7c5c77ffd98b17259a1d914a6ea41db75014267949d887089550877f00bb8d13438040f674a79ed42202c5bf6e67de6fc3f6b65ca837ceab795fcc6f88089650878181808280098009099050620044d960005262005a78565b877f0c1ebf40eeaac3d4a192dd50ee25c0067f66eff6229d045d5a801067639ccf2c82089050877f1a39731eb32fdb51dd793754f76103b5cab86947aad12d490d4951932ff2072783089150877f2baad3d41b18ae10c463af1662ecb28c6988524edded36943672a0e857b960f884089250877f2e778da1518b6a4fad2e833e41466fb2fe82f4f8df1b5c218cdd3b7e49af67e185089350877f156dc717930d6490167743911e9bf4d4634ae049b53adab281698645f8b16dc686089450877f117f2ef1712692ab9dbdc51db4968b45f5e0104f9e5281329349d908b23e231c87089550877f0b281b5d9dd2ca1a92e2d83b5087b6a08d6ab08330f47512aa047b2f88ba68cc88089650878181808280098009099050620045fc60005262005a78565b877f1c2803766dd9096567a3366061764f8c916f2a2dd640b6eec0942ccb75d4076782089050877f120174d53ba57d1a141bf40e4c705683668bd55800000aab6f34766b7b6575a283089150877f0c37b25020f8c76ea5536de54c722e47d01795d31b5ed73466e7d8b8ad376d4684089250877f0a508f345cc9a8b0c30ba27651ba1c3ad8398025a4000a5c2500228c44fa91b885089350877f12afa49ff4d8b4c6c372f7e065840783cb9497eeacc847a340f61f1823cb2a8d86089450877f29fc37eb5ec7cd004809516b7aa3c716f4f7f6e7772f443e0730b01dd5071a5587089550877f2048fb9c1fdaced0fdc5159490db2977e57dbcbff7514ad1e52a271bf84dd1a8880896508781818082800980090990506200471f60005262005a78565b877f00a6c4223aabe583e899bbcd0314a4743181f1d5e03dbc11c8a4d02550fab64f82089050877f15f462ab5b21c31557e25d9c22d8dc6a0cca93c8ed68a35655cff745686764d083089150877f27bc1c9af68edf8e3730197124be559f1472e7e3bba0d35e079b2d1b9e4271ef84089250877f1a2ec148f900eeae38c0d3d6efda64e146929c71eb82da3139a3a85968ec6ebc85089350877f04ff41cb553ca616d0616545922f2030b71b2354bcd1c55d7eabcaea8904c22e86089450877f2f2c4e7b18a845fcd6add67009fc237b14a984619260a7b3d38712e03a0849b787089550877f22925c606a1f091c1d5c7122f8e1a8ffea6a140031106826ac53a9c69d84c0ab880896508781818082800980090990506200484260005262005a78565b877f10e2a8c7b12bf70266c257573ca2594d8811633f77822d7c232b329c5b4e727982089050877f1712319595ae464992524bf8e488b783fa45b3548cd3f162d586bce31ec7184c83089150877f2e9616987d3333388ea5a1cb56b4c161f279ff19454a64ade43daed4dcda5c0b84089250877f2c68210d75660df5d9a8392a2805ea1612fc6137cf5b35a68fc1f03acfbfe4ca85089350877f053cf3707283df8730b6e1f637d23c67b0b3533061a35bcb0cb0f9bbe4e8adc286089450877f07577491483d03d7769dacc79607b9897081c0095decdce3d227c059ddeddb6687089550877f05639b2324c0b0af81c5b256ca6b2d46b95eaf855fc26cedbf90411312de4a12880896508781818082800980090990506200496560005262005a78565b877f0ec90944eb8fc36c52f3fd13763714f41cea1ff487ea39d70bd94e9b7f8f16d582089050877f1e96cd3ac345bb2e5bd3e755922f84afaf303d6fb227fc68f703b93665f5ea9683089150877f0408425405c66baa7d49858e6d5871e5b42ffebb0df885a824942da1e2e36d5884089250877f284d77566b42f3913d41ebb0528b899426e0805aadb9957a534b022b081aa97785089350877f0b044e5984887cda337f58c7ca50a78126deb5624f644516239427948d7d06bc86089450877f0486972179ee3496795bded1c2fc9674c0c3f71b58150c9c525063a6f2b340d887089550877f25b7568316c4b2fef9b72543b6033b317a7bfe406623e47cb68e5c79296e6bee8808965087818180828009800909905062004a8860005262005a78565b877f0cec9e74c344198703ceff28a4d11275f6c5c15738aa5a54a19269261ec6a8a882089050877f2bcc34a99345174c97a65e8978194486a9957c9d736f0ca39b98130801d1a11483089150877f2ddb2ebc0ac98f6498c0f2be2d73e86a786940a1e8c558d8dbed8d6f44b0255184089250877f2642b4a208e503e3480718d4d205351f43da183ed284ed7a385ef7cdca80bea885089350877f23fabdb09b481bc764102ae85ccf1e6ff71c7762f8bad04a2de3f7a025cb508786089450877f0ae4ed0ea6adb74b9d327fbcd01dbf37f5f6c467480c8aa5f495124cf70b823e87089550877f09034e1a646d6674bef041afa774e3634faf8adcc7c71bc2ed6e03b0b44920168808965087818180828009800909905062004bab60005262005a78565b877f2817ea20b471a4bf138dec79d84f9f6c0015e0ca147b650683df4b3372b55ef282089050877f2dfb7f81425c2def6bfa4e833e51e912298397de78fd2aa17f6d1dd2f1379ca983089150877f137b5bdb746523c051d680be08daa6b0d54c9ff7099f2bf5ce894c24a8ef1f3784089250877f03900ec7adc8e28af7046833dbad3fa1024e382aebe02bcb535243ddca21aa8585089350877f2b285b6c23b25c52f2079863c759e6a10c33df8f191551ead53ea508511cb55586089450877f1242067be2202d1b2c32b79c464e2d6c977e6fd12d8b35281e84c375864613d887089550877f1e8690f5b0a8729b9536ef2920abe7e6f3eee805237b158d997db63b17525eef8808965087818180828009800909905062004cce60005262005a78565b877f047f5113e1287b5572c82edb369fb0f717a91f261ef9d81764a5b279ad9c13ba82089050877f2d8800f21cd6774d5a6aa58ae2cd32593593d173b687122a4d61c4474390210583089150877f274ba1521d5bc5c580647f10d1a4c4cadeef088685d1976979bad813756f84b084089250877f17895b7c10d6a475310d34a0737efaedddca8f1eee9d8d56e7fe4934c8b5644185089350877f06eed11ae9f70df5ced09b1a6db258978cf5becad2f66d15761bf61e7dc1344086089450877f3036b521c631ce5d3599e37f6a5daf928842cefcbcd2c6bf84e2db5ded748f0987089550877f1f52d6e9ac28976c5a6fbf168c818478645c90d72e367609d7d7805a6367482d8808965087818180828009800909905062004df160005262005a78565b877f2a0e60356875d6ace1055932b3dd9ef39c3dd871091e96a323c1596cedb35e6b82089050877f02089633a6194f3ed38eeec2c8f54d0c7f434938fdebb9c0e1830dbe5311c38f83089150877f178c73d2769765d85383283fdb0d769457cfef0612baa963336bac1240b604c284089250877f2fc20bcaba9e3d96ebcdd710e3b341837d5d0db849e789f28c4be5004afa19a085089350877f151a423bee67fb14d5ad279f425213db7e0f21494982df872354c01f0f4a722c86089450877f25d61619e135690c4e10e4afeb4f5578ad0f8e25c20735366895b31eebcdf47e87089550877f15dd579bbd075429301d7295d3e685d832bf9f36c51277d09f2c3a664b045cd78808965087818180828009800909905062004f1460005262005a78565b877f236fa29b81678c8a109fd361c1ca90adf4423c13cf5b8cc1032b7283bcc959b182089050877f2a80cbac9b884e20368691bf1567cb7320537a977da10e53c5baea3446c01d1d83089150877f11d4cb8957937b3628a3b3f4d27f276cc0c179b0c22b2c13fffbde85fd91237884089250877f1289bf8ec507bf752a07c9b71efc0f800a52fbeb1637c5010fa54eadab40294685089350877f26f842b1a99394297d25799f2f03dc9e4903e77d2ddc03ec2fb155466da6f30386089450877f15944b9954b6182314e878fa2f9e091dcc40eadc48d37d39bdd5f09905c3a36987089550877f0742166dcd8ebd8576a6bfe0f1fed13793928f84442c7465a0012f584426fadf880896508781818082800980090990506200503760005262005a78565b877f08603d5a0e937b5353b56b05768fd50bde792e72fd61c06344cbd735707b68ff82089050877f0caa1711c66e9301b6f25e21a31683d80bf58d86032d03bfd25b9777edb74a7583089150877f2d6506da695d2087dff87b5f636ee676fab00c32ae45c75b3db345f3fe74a31184089250877f0d9244b07af9b6eaeff6f84049cb2e01d75dc4cb68533606e976b8b300758c8485089350877f243abc3c3382faa5dde3f1c3b432042d3f030ef6a1f5401aa37acd15cb1c8c4686089450877f168416e0a6d275d30eda3989242e0723024727d3b0791b06f8e1bfe8efe4019887089550877f1bcdeef03693d1ad0ea80c65688654affe634aa14cb11ae3a491681d9c5f8eeb880896508781818082800980090990506200515a60005262005a78565b877f02f66bfda3d2a1bdedb0ab8bf7eb1c4e551bef58d94fad7f7c231107e565390982089050877f019f6802171ab82a5922f023fdecc097eb8ac1fd0a1ed349afe9a7b94298975a83089150877f195a1c738398feed8c760468a0556c232645a1dd862d87c1f508c949ad52c3ae84089250877f0a36a3a46e6ec16567dfae1f853f360e6f24924810e838cb24ed1b0fce37f1e385089350877f002123c29ea87f7ea7b35c25f9e8dd3e81bbc3974c3c17c607cd840c09f374ae86089450877f02a717499cb6c31f71f0f0352b0f5bfef3005b80e93a520b6e42b3985789e2d387089550877f0fc053584b0a4607a2293e18baa309c52fdc933e9ba90fd327aaa8c8cfc4daa1880896508781818082800980090990506200527d60005262005a78565b877f1310d1942129737b32e87a86f4573032b1b99ae3c6d71bafef7b49479485554182089050877f1bfadae53fc82900f5761c558fee5e1218e6b2a6657e74b540969eeb49e0b8de83089150877f28c08a69e5f3641460ff2c60b7579395650c5b6afb392da142d32de8677556ea84089250877f223222ee42b6ca997f44d643ed6a3f2b040f47fe8cd922163d9d9d8b2622d90985089350877f064dad4752e708ff29bb0842d2c452a71448b43949345690031cb125588876a086089450877f2d5ddc21797043996b22dcabb9a1ba6c82b71e9a1bc5919db8befd35411056a587089550877f26315fcd9b5e1a266ec8e9f6600f5a6e0bcdb22f926d61591e83fa21069c0e0b88089650878181808280098009099050620053a060005262005a78565b877f0759273a4177fcdeab23da38b478faf2d4f22e82f346aa754b0a1331bc8371ee82089050877f09e13300eade70568fa0a840ea9729896ddd84c364d6279d34a0b9d1478fcf2a83089150877f13e97ed3c16fad6cb5b7bb954f278f2434b22f8cc054463a145cbe0240d4f8bc84089250877f05cd3486dca58f4eb221bc2cbedb8aa3027cde5765971bb1f61c272c5aa51ad085089350877f005ce523f6bc21daf1df468b12fd3e8665e1c1697816a9a671a3b2b6149c7de486089450877f2103066cc5df55e67cd7914028145fb71f089d671c83c5b537abea482b2d8cbb87089550877f039f8077bd9b71f91ca0502eaccc1672c539f72329317aaf8173d2edd763692888089650878181808280098009099050620054c360005262005a78565b877f2247bc0cc4373705b89672a2205346e6af3a6422e81b4f4885dc3af7cadcc5c582089050877f27bcc768bd31b9d00687a7e53c3ce53c426762706188790ea20b2e819638df8083089150877f0d91cef51a76f7a62c51c73a2809732d79ac350159814ea536487368cfdfd70884089250877f20a9ecdc649a26388dc68dc02343a0f167bad46d6aa1cd008537f627ba14073085089350877f23134149a0d4567c6dfc911d5cb80c1a1016220d39e0c230325dae2941f528bb86089450877f2a07507e9f030a42c6f29ccf1c9cc4f3e5a5b0dbf05874d5edadc03fe74b947487089550877f1bdf66bb1d57fd788e54ef29f06f35fdb2729b718ce81152cf3aafc64966110b880896508781818082800980090990508782818082800980090991508783818082800980090992508784818082800980090993508785818082800980090994508786818082800980090995508787818082800980090996506200562e60005262005a78565b877f275c33d07f9e7338ddf50783bf158d51be619bf77a12020cf5630b78e7e0d0b982089050877f16411554e55fe604a1ff1b3b5b7afb6a2bfd0f32c4070b55bf1ad234e8b2811683089150877f073e6ac7e6af227557249ca1a5c55222a36c641bc2851a0dfcfb60831f6759a884089250877f10a6fde88c5f621d748543c76a218f95c202bbc3baca06838f31331b0556e12f85089350877f29c5865a26588ca8a88128a072c8434cc97a1bcec23e136f038d29dcf96b0eb686089450877f233e0ef6ad132ed211b1911cdd569576fea8c17ca64e4d5dd516fcca07212c1a87089550877f096f9b92b9cf2c7d664408a29860365f5b6adc238d878a476bded3e4d2e0b840880896508781818082800980090990508782818082800980090991508783818082800980090992508784818082800980090993508785818082800980090994508786818082800980090995508787818082800980090996506200579960005262005a78565b877f2fc788fe8aad4c28b943bb57cb90edf6d7b1f1e835de1fbf3192e395db78555482089050877f1bac0ed609233148503795fc5e114076ef7c9d722bc648dd0338d9689f6e023a83089150877f001c35268aa030d6cd148e106e3fc23094e561573d8c72a69fc383643e2adc8284089250877f2bb1f8fe5d998d0b8b92837ffb27bfe7a39ce39ff94fc167ddcc95a7202e34b285089350877f1a98576450a43e5e705b9af68cd0c145422da23945630b10b8e821dd61f9a2b286089450877f2714d37ee506efbc2ba9941043fb23f16af966f123d653f38388bcbdd50e603787089550877f175d0480ba14abf0bcb8075a03f4a2a01ff7ed75413917b53e50ea00cc2a4ad0880896508781818082800980090990508782818082800980090991508783818082800980090992508784818082800980090993508785818082800980090994508786818082800980090995508787818082800980090996506200590460005262005a78565b877f203de45a037b75ef63761750dce08da2be7709701ec8158c17fc026fd084d54182089050877f265aabfc78b70ca985c329080d6329a12560f76b01cc3d431a7283022193abf883089150877f135468dfbeb70e8c2edaffac8658a6c22b2ad1520ac0819c127af2ea5f3a87a884089250877f216a41e24329deda65a8a82001c84ce8286c61758447ff1bfa9d9293b6711fdd85089350877f2887ed49797bd6652bed8bb99ae345ad70d1a27cdb21b9460bb6fd0d4fe482e686089450877f03e2bf82690c804bb6ee3c79dabd1892ea53a9811e2424a19fae446b8ae49cad87089550877f0e6dce1bbe6e9e465cbe14dcc615611867414676dd8a8ce9946649b1c4e811168808965087818180828009800909905087828180828009800909915087838180828009800909925087848180828009800909935087858180828009800909945087868180828009800909955087878180828009800909965062005a6f60005262005a78565b60005260206000f35b8760205182098860405184098991088860605185098991088860805186098991088860a05187098991088860c05188098991088860e051890989910888610100518309896101205185098a9108896101405186098a9108896101605187098a9108896101805188098a9108896101a05189098a9108896101c0518a098a9108896101e05184098a6102005186098b91088a6102205187098b91088a6102405188098b91088a6102605189098b91088a610280518a098b91088a6102a0518b098b91088a6102c05185098b6102e05187098c91088b6103005188098c91088b6103205189098c91088b610340518a098c91088b610360518b098c91088b610380518c098c91088b6103a05186098c6103c05188098d91088c6103e05189098d91088c610400518a098d91088c610420518b098d91088c610440518c098d91088c610460518d098d91088c6104805187098d6104a05189098e91088d6104c0518a098e91088d6104e0518b098e91088d610500518c098e91088d610520518d098e91088d610540518e098e91088d6105605188098e610580518a098f91088e6105a0518b098f91088e6105c0518c098f91088e6105e0518d098f91088e610600518e098f91088e610620518f098f91089c509a509850965094509250905060005156" +} \ No newline at end of file diff --git a/contracts/deployments/encifher/Ramp.json b/contracts/deployments/encifher/Ramp.json new file mode 100644 index 000000000..259ddbdaf --- /dev/null +++ b/contracts/deployments/encifher/Ramp.json @@ -0,0 +1,1956 @@ +{ + "address": "0xe8F76a822B57b973c7a89006092364fFF8f69040", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "internalType": "contract IERC20", + "name": "_usdc", + "type": "address" + }, + { + "internalType": "contract IPoseidon", + "name": "_poseidon", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_minDepositAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_maxOnRampAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_intentExpirationPeriod", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_onRampCooldownPeriod", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_sustainabilityFee", + "type": "uint256" + }, + { + "internalType": "address", + "name": "_sustainabilityFeeRecipient", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "accountOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "venmoIdHash", + "type": "bytes32" + } + ], + "name": "AccountRegistered", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "depositId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "address", + "name": "depositor", + "type": "address" + } + ], + "name": "DepositClosed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "depositId", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "venmoId", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "conversionRate", + "type": "uint256" + } + ], + "name": "DepositReceived", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "depositId", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "address", + "name": "depositor", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "DepositWithdrawn", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "intentExpirationPeriod", + "type": "uint256" + } + ], + "name": "IntentExpirationPeriodSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "intentHash", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "depositId", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "address", + "name": "onRamper", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "feeAmount", + "type": "uint256" + } + ], + "name": "IntentFulfilled", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "intentHash", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "depositId", + "type": "uint256" + } + ], + "name": "IntentPruned", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "intentHash", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "depositId", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "venmoId", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "timestamp", + "type": "uint256" + } + ], + "name": "IntentSignaled", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "maxOnRampAmount", + "type": "uint256" + } + ], + "name": "MaxOnRampAmountSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "minDepositAmount", + "type": "uint256" + } + ], + "name": "MinDepositAmountSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "receiveProcessor", + "type": "address" + } + ], + "name": "NewReceiveProcessorSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "registrationProcessor", + "type": "address" + } + ], + "name": "NewRegistrationProcessorSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "sendProcessor", + "type": "address" + } + ], + "name": "NewSendProcessorSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "onRampCooldownPeriod", + "type": "uint256" + } + ], + "name": "OnRampCooldownPeriodSet", + "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": "feeRecipient", + "type": "address" + } + ], + "name": "SustainabilityFeeRecipientUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "fee", + "type": "uint256" + } + ], + "name": "SustainabilityFeeUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bytes32", + "name": "listOwner", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "deniedUser", + "type": "bytes32" + } + ], + "name": "UserAddedToDenylist", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bytes32", + "name": "listOwner", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "approvedUser", + "type": "bytes32" + } + ], + "name": "UserRemovedFromDenylist", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_deniedUser", + "type": "bytes32" + } + ], + "name": "addAccountToDenylist", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_intentHash", + "type": "bytes32" + } + ], + "name": "cancelIntent", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "depositCounter", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "deposits", + "outputs": [ + { + "internalType": "address", + "name": "depositor", + "type": "address" + }, + { + "internalType": "uint256", + "name": "depositAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "remainingDeposits", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "outstandingIntentAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "conversionRate", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_account", + "type": "address" + } + ], + "name": "getAccountDeposits", + "outputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "depositId", + "type": "uint256" + }, + { + "components": [ + { + "internalType": "address", + "name": "depositor", + "type": "address" + }, + { + "internalType": "uint256[3]", + "name": "packedVenmoId", + "type": "uint256[3]" + }, + { + "internalType": "uint256", + "name": "depositAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "remainingDeposits", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "outstandingIntentAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "conversionRate", + "type": "uint256" + }, + { + "internalType": "bytes32[]", + "name": "intentHashes", + "type": "bytes32[]" + } + ], + "internalType": "struct Ramp.Deposit", + "name": "deposit", + "type": "tuple" + }, + { + "internalType": "uint256", + "name": "availableLiquidity", + "type": "uint256" + } + ], + "internalType": "struct Ramp.DepositWithAvailableLiquidity[]", + "name": "accountDeposits", + "type": "tuple[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_account", + "type": "address" + } + ], + "name": "getAccountInfo", + "outputs": [ + { + "components": [ + { + "internalType": "bytes32", + "name": "venmoIdHash", + "type": "bytes32" + }, + { + "internalType": "uint256[]", + "name": "deposits", + "type": "uint256[]" + } + ], + "internalType": "struct Ramp.AccountInfo", + "name": "", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_account", + "type": "address" + } + ], + "name": "getDeniedUsers", + "outputs": [ + { + "internalType": "bytes32[]", + "name": "", + "type": "bytes32[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_depositId", + "type": "uint256" + } + ], + "name": "getDeposit", + "outputs": [ + { + "components": [ + { + "internalType": "address", + "name": "depositor", + "type": "address" + }, + { + "internalType": "uint256[3]", + "name": "packedVenmoId", + "type": "uint256[3]" + }, + { + "internalType": "uint256", + "name": "depositAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "remainingDeposits", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "outstandingIntentAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "conversionRate", + "type": "uint256" + }, + { + "internalType": "bytes32[]", + "name": "intentHashes", + "type": "bytes32[]" + } + ], + "internalType": "struct Ramp.Deposit", + "name": "", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256[]", + "name": "_depositIds", + "type": "uint256[]" + } + ], + "name": "getDepositFromIds", + "outputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "depositId", + "type": "uint256" + }, + { + "components": [ + { + "internalType": "address", + "name": "depositor", + "type": "address" + }, + { + "internalType": "uint256[3]", + "name": "packedVenmoId", + "type": "uint256[3]" + }, + { + "internalType": "uint256", + "name": "depositAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "remainingDeposits", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "outstandingIntentAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "conversionRate", + "type": "uint256" + }, + { + "internalType": "bytes32[]", + "name": "intentHashes", + "type": "bytes32[]" + } + ], + "internalType": "struct Ramp.Deposit", + "name": "deposit", + "type": "tuple" + }, + { + "internalType": "uint256", + "name": "availableLiquidity", + "type": "uint256" + } + ], + "internalType": "struct Ramp.DepositWithAvailableLiquidity[]", + "name": "depositArray", + "type": "tuple[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32[]", + "name": "_intentHashes", + "type": "bytes32[]" + } + ], + "name": "getIntentsWithOnRamperId", + "outputs": [ + { + "components": [ + { + "components": [ + { + "internalType": "address", + "name": "onRamper", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "deposit", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "intentTimestamp", + "type": "uint256" + } + ], + "internalType": "struct Ramp.Intent", + "name": "intent", + "type": "tuple" + }, + { + "internalType": "bytes32", + "name": "onRamperIdHash", + "type": "bytes32" + } + ], + "internalType": "struct Ramp.IntentWithOnRamperId[]", + "name": "", + "type": "tuple[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_account", + "type": "address" + } + ], + "name": "getLastOnRampTimestamp", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_account", + "type": "address" + } + ], + "name": "getVenmoIdCurrentIntentHash", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IRegistrationProcessor", + "name": "_registrationProcessor", + "type": "address" + }, + { + "internalType": "contract ISendProcessor", + "name": "_sendProcessor", + "type": "address" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "intentExpirationPeriod", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "name": "intents", + "outputs": [ + { + "internalType": "address", + "name": "onRamper", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "deposit", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "intentTimestamp", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_account", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "_deniedUser", + "type": "bytes32" + } + ], + "name": "isDeniedUser", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "maxOnRampAmount", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "minDepositAmount", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256[3]", + "name": "_packedVenmoId", + "type": "uint256[3]" + }, + { + "internalType": "uint256", + "name": "_depositAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_receiveAmount", + "type": "uint256" + } + ], + "name": "offRamp", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "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[12]", + "name": "_signals", + "type": "uint256[12]" + } + ], + "name": "onRamp", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "onRampCooldownPeriod", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "poseidon", + "outputs": [ + { + "internalType": "contract IPoseidon", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "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[5]", + "name": "_signals", + "type": "uint256[5]" + } + ], + "name": "register", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "registrationProcessor", + "outputs": [ + { + "internalType": "contract IRegistrationProcessor", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_approvedUser", + "type": "bytes32" + } + ], + "name": "removeAccountFromDenylist", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "sendProcessor", + "outputs": [ + { + "internalType": "contract ISendProcessor", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_intentExpirationPeriod", + "type": "uint256" + } + ], + "name": "setIntentExpirationPeriod", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_maxOnRampAmount", + "type": "uint256" + } + ], + "name": "setMaxOnRampAmount", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_minDepositAmount", + "type": "uint256" + } + ], + "name": "setMinDepositAmount", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_onRampCooldownPeriod", + "type": "uint256" + } + ], + "name": "setOnRampCooldownPeriod", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IRegistrationProcessor", + "name": "_registrationProcessor", + "type": "address" + } + ], + "name": "setRegistrationProcessor", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract ISendProcessor", + "name": "_sendProcessor", + "type": "address" + } + ], + "name": "setSendProcessor", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_fee", + "type": "uint256" + } + ], + "name": "setSustainabilityFee", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_feeRecipient", + "type": "address" + } + ], + "name": "setSustainabilityFeeRecipient", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_depositId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + }, + { + "internalType": "address", + "name": "_to", + "type": "address" + } + ], + "name": "signalIntent", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "sustainabilityFee", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "sustainabilityFeeRecipient", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "usdc", + "outputs": [ + { + "internalType": "contract IERC20", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256[]", + "name": "_depositIds", + "type": "uint256[]" + } + ], + "name": "withdrawDeposit", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "transactionHash": "0x15a22fbbf21826e51c919cb40ce4f6aff464ccc09f9d7847bfca41c5aa381259", + "receipt": { + "to": null, + "from": "0xa0Ee7A142d267C1f36714E4a8F75612F20a79720", + "contractAddress": "0xe8F76a822B57b973c7a89006092364fFF8f69040", + "transactionIndex": 0, + "gasUsed": "3291151", + "logsBloom": "0x00000000000000000000040000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000001000000000000000008000000000000000000020000000000000000000800000000000000000000000000000000400000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000004000000020000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0x8e980427d083da055761ba7dc1d2848403b4c5a3ac5b9f3b48428c869306650a", + "transactionHash": "0x15a22fbbf21826e51c919cb40ce4f6aff464ccc09f9d7847bfca41c5aa381259", + "logs": [ + { + "transactionIndex": 0, + "blockNumber": 61353, + "transactionHash": "0x15a22fbbf21826e51c919cb40ce4f6aff464ccc09f9d7847bfca41c5aa381259", + "address": "0xe8F76a822B57b973c7a89006092364fFF8f69040", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x000000000000000000000000a0ee7a142d267c1f36714e4a8f75612f20a79720" + ], + "data": "0x", + "logIndex": 0, + "blockHash": "0x8e980427d083da055761ba7dc1d2848403b4c5a3ac5b9f3b48428c869306650a" + }, + { + "transactionIndex": 0, + "blockNumber": 61353, + "transactionHash": "0x15a22fbbf21826e51c919cb40ce4f6aff464ccc09f9d7847bfca41c5aa381259", + "address": "0xe8F76a822B57b973c7a89006092364fFF8f69040", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x000000000000000000000000a0ee7a142d267c1f36714e4a8f75612f20a79720", + "0x000000000000000000000000a0ee7a142d267c1f36714e4a8f75612f20a79720" + ], + "data": "0x", + "logIndex": 1, + "blockHash": "0x8e980427d083da055761ba7dc1d2848403b4c5a3ac5b9f3b48428c869306650a" + } + ], + "blockNumber": 61353, + "cumulativeGasUsed": "3291151", + "status": 1, + "byzantium": true + }, + "args": [ + "0xa0Ee7A142d267C1f36714E4a8F75612F20a79720", + "0x04fc820176617A99AE134904935Bc854b2e51628", + "0xF1078fD568Ad76E49E6F88D1fF485402a086976b", + "10000000", + "999000000", + "180", + "180", + "1000000000000000", + "0xa0Ee7A142d267C1f36714E4a8F75612F20a79720" + ], + "numDeployments": 1, + "solcInputHash": "75b8f55da346d7ed99a350632554d2fb", + "metadata": "{\"compiler\":{\"version\":\"0.8.24+commit.e11b9ed9\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"},{\"internalType\":\"contract IERC20\",\"name\":\"_usdc\",\"type\":\"address\"},{\"internalType\":\"contract IPoseidon\",\"name\":\"_poseidon\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_minDepositAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_maxOnRampAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_intentExpirationPeriod\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_onRampCooldownPeriod\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_sustainabilityFee\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_sustainabilityFeeRecipient\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"accountOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"venmoIdHash\",\"type\":\"bytes32\"}],\"name\":\"AccountRegistered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"depositId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"depositor\",\"type\":\"address\"}],\"name\":\"DepositClosed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"depositId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"venmoId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"conversionRate\",\"type\":\"uint256\"}],\"name\":\"DepositReceived\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"depositId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"depositor\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"DepositWithdrawn\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"intentExpirationPeriod\",\"type\":\"uint256\"}],\"name\":\"IntentExpirationPeriodSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"intentHash\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"depositId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"onRamper\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"feeAmount\",\"type\":\"uint256\"}],\"name\":\"IntentFulfilled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"intentHash\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"depositId\",\"type\":\"uint256\"}],\"name\":\"IntentPruned\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"intentHash\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"depositId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"venmoId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"}],\"name\":\"IntentSignaled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"maxOnRampAmount\",\"type\":\"uint256\"}],\"name\":\"MaxOnRampAmountSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"minDepositAmount\",\"type\":\"uint256\"}],\"name\":\"MinDepositAmountSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"receiveProcessor\",\"type\":\"address\"}],\"name\":\"NewReceiveProcessorSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"registrationProcessor\",\"type\":\"address\"}],\"name\":\"NewRegistrationProcessorSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"sendProcessor\",\"type\":\"address\"}],\"name\":\"NewSendProcessorSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"onRampCooldownPeriod\",\"type\":\"uint256\"}],\"name\":\"OnRampCooldownPeriodSet\",\"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\":\"feeRecipient\",\"type\":\"address\"}],\"name\":\"SustainabilityFeeRecipientUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"fee\",\"type\":\"uint256\"}],\"name\":\"SustainabilityFeeUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"listOwner\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"deniedUser\",\"type\":\"bytes32\"}],\"name\":\"UserAddedToDenylist\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"listOwner\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"approvedUser\",\"type\":\"bytes32\"}],\"name\":\"UserRemovedFromDenylist\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_deniedUser\",\"type\":\"bytes32\"}],\"name\":\"addAccountToDenylist\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_intentHash\",\"type\":\"bytes32\"}],\"name\":\"cancelIntent\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"depositCounter\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"deposits\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"depositor\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"depositAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"remainingDeposits\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"outstandingIntentAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"conversionRate\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_account\",\"type\":\"address\"}],\"name\":\"getAccountDeposits\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"depositId\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"depositor\",\"type\":\"address\"},{\"internalType\":\"uint256[3]\",\"name\":\"packedVenmoId\",\"type\":\"uint256[3]\"},{\"internalType\":\"uint256\",\"name\":\"depositAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"remainingDeposits\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"outstandingIntentAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"conversionRate\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[]\",\"name\":\"intentHashes\",\"type\":\"bytes32[]\"}],\"internalType\":\"struct Ramp.Deposit\",\"name\":\"deposit\",\"type\":\"tuple\"},{\"internalType\":\"uint256\",\"name\":\"availableLiquidity\",\"type\":\"uint256\"}],\"internalType\":\"struct Ramp.DepositWithAvailableLiquidity[]\",\"name\":\"accountDeposits\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_account\",\"type\":\"address\"}],\"name\":\"getAccountInfo\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"venmoIdHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint256[]\",\"name\":\"deposits\",\"type\":\"uint256[]\"}],\"internalType\":\"struct Ramp.AccountInfo\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_account\",\"type\":\"address\"}],\"name\":\"getDeniedUsers\",\"outputs\":[{\"internalType\":\"bytes32[]\",\"name\":\"\",\"type\":\"bytes32[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_depositId\",\"type\":\"uint256\"}],\"name\":\"getDeposit\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"depositor\",\"type\":\"address\"},{\"internalType\":\"uint256[3]\",\"name\":\"packedVenmoId\",\"type\":\"uint256[3]\"},{\"internalType\":\"uint256\",\"name\":\"depositAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"remainingDeposits\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"outstandingIntentAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"conversionRate\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[]\",\"name\":\"intentHashes\",\"type\":\"bytes32[]\"}],\"internalType\":\"struct Ramp.Deposit\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256[]\",\"name\":\"_depositIds\",\"type\":\"uint256[]\"}],\"name\":\"getDepositFromIds\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"depositId\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"depositor\",\"type\":\"address\"},{\"internalType\":\"uint256[3]\",\"name\":\"packedVenmoId\",\"type\":\"uint256[3]\"},{\"internalType\":\"uint256\",\"name\":\"depositAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"remainingDeposits\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"outstandingIntentAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"conversionRate\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[]\",\"name\":\"intentHashes\",\"type\":\"bytes32[]\"}],\"internalType\":\"struct Ramp.Deposit\",\"name\":\"deposit\",\"type\":\"tuple\"},{\"internalType\":\"uint256\",\"name\":\"availableLiquidity\",\"type\":\"uint256\"}],\"internalType\":\"struct Ramp.DepositWithAvailableLiquidity[]\",\"name\":\"depositArray\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[]\",\"name\":\"_intentHashes\",\"type\":\"bytes32[]\"}],\"name\":\"getIntentsWithOnRamperId\",\"outputs\":[{\"components\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"onRamper\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"deposit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"intentTimestamp\",\"type\":\"uint256\"}],\"internalType\":\"struct Ramp.Intent\",\"name\":\"intent\",\"type\":\"tuple\"},{\"internalType\":\"bytes32\",\"name\":\"onRamperIdHash\",\"type\":\"bytes32\"}],\"internalType\":\"struct Ramp.IntentWithOnRamperId[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_account\",\"type\":\"address\"}],\"name\":\"getLastOnRampTimestamp\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_account\",\"type\":\"address\"}],\"name\":\"getVenmoIdCurrentIntentHash\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IRegistrationProcessor\",\"name\":\"_registrationProcessor\",\"type\":\"address\"},{\"internalType\":\"contract ISendProcessor\",\"name\":\"_sendProcessor\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"intentExpirationPeriod\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"intents\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"onRamper\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"deposit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"intentTimestamp\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_account\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"_deniedUser\",\"type\":\"bytes32\"}],\"name\":\"isDeniedUser\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"maxOnRampAmount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"minDepositAmount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256[3]\",\"name\":\"_packedVenmoId\",\"type\":\"uint256[3]\"},{\"internalType\":\"uint256\",\"name\":\"_depositAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_receiveAmount\",\"type\":\"uint256\"}],\"name\":\"offRamp\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"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[12]\",\"name\":\"_signals\",\"type\":\"uint256[12]\"}],\"name\":\"onRamp\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"onRampCooldownPeriod\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"poseidon\",\"outputs\":[{\"internalType\":\"contract IPoseidon\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"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[5]\",\"name\":\"_signals\",\"type\":\"uint256[5]\"}],\"name\":\"register\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"registrationProcessor\",\"outputs\":[{\"internalType\":\"contract IRegistrationProcessor\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_approvedUser\",\"type\":\"bytes32\"}],\"name\":\"removeAccountFromDenylist\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"sendProcessor\",\"outputs\":[{\"internalType\":\"contract ISendProcessor\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_intentExpirationPeriod\",\"type\":\"uint256\"}],\"name\":\"setIntentExpirationPeriod\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_maxOnRampAmount\",\"type\":\"uint256\"}],\"name\":\"setMaxOnRampAmount\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_minDepositAmount\",\"type\":\"uint256\"}],\"name\":\"setMinDepositAmount\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_onRampCooldownPeriod\",\"type\":\"uint256\"}],\"name\":\"setOnRampCooldownPeriod\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IRegistrationProcessor\",\"name\":\"_registrationProcessor\",\"type\":\"address\"}],\"name\":\"setRegistrationProcessor\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract ISendProcessor\",\"name\":\"_sendProcessor\",\"type\":\"address\"}],\"name\":\"setSendProcessor\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_fee\",\"type\":\"uint256\"}],\"name\":\"setSustainabilityFee\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_feeRecipient\",\"type\":\"address\"}],\"name\":\"setSustainabilityFeeRecipient\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_depositId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"}],\"name\":\"signalIntent\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"sustainabilityFee\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"sustainabilityFeeRecipient\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"usdc\",\"outputs\":[{\"internalType\":\"contract IERC20\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256[]\",\"name\":\"_depositIds\",\"type\":\"uint256[]\"}],\"name\":\"withdrawDeposit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"addAccountToDenylist(bytes32)\":{\"params\":{\"_deniedUser\":\"Poseidon hash of the venmoId being banned\"}},\"cancelIntent(bytes32)\":{\"params\":{\"_intentHash\":\"Hash of intent being cancelled\"}},\"initialize(address,address)\":{\"params\":{\"_registrationProcessor\":\"Registration processor address\",\"_sendProcessor\":\"Send processor address\"}},\"offRamp(uint256[3],uint256,uint256)\":{\"params\":{\"_depositAmount\":\"The amount of USDC to off-ramp\",\"_packedVenmoId\":\"The packed venmo id of the account owner (we pack for easy use with poseidon)\",\"_receiveAmount\":\"The amount of USD to receive\"}},\"onRamp(uint256[2],uint256[2][2],uint256[2],uint256[12])\":{\"params\":{\"_a\":\"Parameter of zk proof\",\"_b\":\"Parameter of zk proof\",\"_c\":\"Parameter of zk proof\",\"_signals\":\"Encoded public signals of the zk proof, contains mailserverHash, fromEmail, timestamp, onRamperIdHash, nullifier, intentHash\"}},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"register(uint256[2],uint256[2][2],uint256[2],uint256[5])\":{\"params\":{\"_a\":\"Parameter of zk proof\",\"_b\":\"Parameter of zk proof\",\"_c\":\"Parameter of zk proof\",\"_signals\":\"Encoded public signals of the zk proof, contains mailserverHash, fromEmail, userIdHash\"}},\"removeAccountFromDenylist(bytes32)\":{\"params\":{\"_approvedUser\":\"Poseidon hash of the venmoId being approved\"}},\"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.\"},\"setIntentExpirationPeriod(uint256)\":{\"params\":{\"_intentExpirationPeriod\":\"New intent expiration period\"}},\"setMaxOnRampAmount(uint256)\":{\"params\":{\"_maxOnRampAmount\":\"The new max on ramp amount\"}},\"setMinDepositAmount(uint256)\":{\"params\":{\"_minDepositAmount\":\"The new minimum deposit amount\"}},\"setOnRampCooldownPeriod(uint256)\":{\"params\":{\"_onRampCooldownPeriod\":\"New on-ramp cooldown period\"}},\"setRegistrationProcessor(address)\":{\"params\":{\"_registrationProcessor\":\"New registration proccesor address\"}},\"setSendProcessor(address)\":{\"params\":{\"_sendProcessor\":\"New send proccesor address\"}},\"setSustainabilityFee(uint256)\":{\"params\":{\"_fee\":\"The new sustainability fee in precise units (10**18, ie 10% = 1e17)\"}},\"setSustainabilityFeeRecipient(address)\":{\"params\":{\"_feeRecipient\":\"The new fee recipient address\"}},\"signalIntent(uint256,uint256,address)\":{\"params\":{\"_amount\":\"The amount of USDC the user wants to on-ramp\",\"_depositId\":\"The ID of the deposit the on-ramper intends to use for \",\"_to\":\"Address to forward funds to (can be same as onRamper)\"}},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"},\"withdrawDeposit(uint256[])\":{\"params\":{\"_depositIds\":\"Array of depositIds the depositor is attempting to withdraw\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"addAccountToDenylist(bytes32)\":{\"notice\":\"Adds a venmoId to a depositor's deny list. If an address associated with the banned venmoId attempts to signal an intent on the user's deposit they will be denied.\"},\"cancelIntent(bytes32)\":{\"notice\":\"Only callable by the originator of the intent. Cancels an outstanding intent thus allowing user to signal a new intent. Deposit state is updated to reflect the cancelled intent.\"},\"initialize(address,address)\":{\"notice\":\"Initialize Ramp with the addresses of the Processors\"},\"offRamp(uint256[3],uint256,uint256)\":{\"notice\":\"Generates a deposit entry for off-rampers that can then be fulfilled by an on-ramper. This function will not add to previous deposits. Every deposit has it's own unique identifier. User must approve the contract to transfer the deposit amount of USDC.\"},\"onRamp(uint256[2],uint256[2][2],uint256[2],uint256[12])\":{\"notice\":\"Anyone can submit an on-ramp transaction, even if caller isn't on-ramper. Upon submission the proof is validated, intent is removed, and deposit state is updated. USDC is transferred to the on-ramper.\"},\"register(uint256[2],uint256[2][2],uint256[2],uint256[5])\":{\"notice\":\"Registers a new account by pulling the hash of the account id from the proof and assigning the account owner to the sender of the transaction. One venmo account can be registered to multiple Ethereum addresses.\"},\"removeAccountFromDenylist(bytes32)\":{\"notice\":\"Removes a venmoId from a depositor's deny list.\"},\"setIntentExpirationPeriod(uint256)\":{\"notice\":\"GOVERNANCE ONLY: Updates the intent expiration period, after this period elapses an intent can be pruned to prevent locking up a depositor's funds.\"},\"setMaxOnRampAmount(uint256)\":{\"notice\":\"GOVERNANCE ONLY: Updates the max amount allowed to be on-ramped in each transaction. To on-ramp more than this amount a user must make multiple transactions.\"},\"setMinDepositAmount(uint256)\":{\"notice\":\"GOVERNANCE ONLY: Updates the minimum deposit amount a user can specify for off-ramping.\"},\"setOnRampCooldownPeriod(uint256)\":{\"notice\":\"GOVERNANCE ONLY: Updates the on-ramp cooldown period, once an on-ramp transaction is completed the user must wait this amount of time before they can signalIntent to on-ramp again.\"},\"setRegistrationProcessor(address)\":{\"notice\":\"GOVERNANCE ONLY: Updates the registration processor address used for validating and interpreting zk proofs.\"},\"setSendProcessor(address)\":{\"notice\":\"GOVERNANCE ONLY: Updates the send processor address used for validating and interpreting zk proofs.\"},\"setSustainabilityFee(uint256)\":{\"notice\":\"GOVERNANCE ONLY: Updates the sustainability fee. This fee is charged to on-rampers upon a successful on-ramp.\"},\"setSustainabilityFeeRecipient(address)\":{\"notice\":\"GOVERNANCE ONLY: Updates the recepient of sustainability fees.\"},\"signalIntent(uint256,uint256,address)\":{\"notice\":\"Signals intent to pay the depositor defined in the _depositId the _amount * deposit conversionRate off-chain in order to unlock _amount of funds on-chain. Each user can only have one outstanding intent at a time regardless of address (tracked using venmoId). Caller must not be on the depositor's deny list. If there are prunable intents then they will be deleted from the deposit to be able to maintain state hygiene.\"},\"withdrawDeposit(uint256[])\":{\"notice\":\"Caller must be the depositor for each depositId in the array, if not whole function fails. Depositor is returned all remaining deposits and any outstanding intents that are expired. If an intent is not expired then those funds will not be returned. Deposit will be deleted as long as there are no more outstanding intents.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/ramps/venmo-v1/Ramp.sol\":\"Ramp\"},\"evmVersion\":\"shanghai\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"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/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/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (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\",\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"license\":\"MIT\"},\"contracts/external/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/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 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\":\"0x102021415f8444ff563fc6d0082f39296f47c09ce73fb4cd642e700ac489eefe\",\"license\":\"Apache-2.0\"},\"contracts/interfaces/IPoseidon.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.18;\\n\\ninterface IPoseidon {\\n function poseidon(uint256[3] memory _a) external pure returns(uint256);\\n}\\n\",\"keccak256\":\"0x9ba8b00cf908c8eb9e0ef5a3b116341f6c50f7745399fc7805a148bf500991b5\",\"license\":\"MIT\"},\"contracts/ramps/venmo-v1/Ramp.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\n\\nimport { IERC20 } from \\\"@openzeppelin/contracts/token/ERC20/IERC20.sol\\\";\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\nimport { Bytes32ArrayUtils } from \\\"../../external/Bytes32ArrayUtils.sol\\\";\\nimport { Uint256ArrayUtils } from \\\"../../external/Uint256ArrayUtils.sol\\\";\\n\\nimport { IPoseidon } from \\\"../../interfaces/IPoseidon.sol\\\";\\nimport { IRegistrationProcessor } from \\\"./interfaces/IRegistrationProcessor.sol\\\";\\nimport { ISendProcessor } from \\\"./interfaces/ISendProcessor.sol\\\";\\n\\npragma solidity ^0.8.18;\\n\\ncontract Ramp is Ownable {\\n\\n using Bytes32ArrayUtils for bytes32[];\\n using Uint256ArrayUtils for uint256[];\\n\\n /* ============ Events ============ */\\n event AccountRegistered(address indexed accountOwner, bytes32 indexed venmoIdHash);\\n event DepositReceived(\\n uint256 indexed depositId,\\n bytes32 indexed venmoId,\\n uint256 amount,\\n uint256 conversionRate\\n );\\n event IntentSignaled(\\n bytes32 indexed intentHash,\\n uint256 indexed depositId,\\n bytes32 indexed venmoId,\\n address to,\\n uint256 amount,\\n uint256 timestamp\\n );\\n\\n event IntentPruned(\\n bytes32 indexed intentHash,\\n uint256 indexed depositId\\n );\\n // Do we want to emit the onRamper or the venmoId\\n event IntentFulfilled(\\n bytes32 indexed intentHash,\\n uint256 indexed depositId,\\n address indexed onRamper,\\n address to,\\n uint256 amount,\\n uint256 feeAmount\\n );\\n // Do we want to emit the depositor or the venmoId\\n event DepositWithdrawn(\\n uint256 indexed depositId,\\n address indexed depositor,\\n uint256 amount\\n );\\n\\n event DepositClosed(uint256 depositId, address depositor);\\n event UserAddedToDenylist(bytes32 listOwner, bytes32 deniedUser);\\n event UserRemovedFromDenylist(bytes32 listOwner, bytes32 approvedUser);\\n event MinDepositAmountSet(uint256 minDepositAmount);\\n event MaxOnRampAmountSet(uint256 maxOnRampAmount);\\n event IntentExpirationPeriodSet(uint256 intentExpirationPeriod);\\n event OnRampCooldownPeriodSet(uint256 onRampCooldownPeriod);\\n event SustainabilityFeeUpdated(uint256 fee);\\n event SustainabilityFeeRecipientUpdated(address feeRecipient);\\n event NewSendProcessorSet(address sendProcessor);\\n event NewRegistrationProcessorSet(address registrationProcessor);\\n event NewReceiveProcessorSet(address receiveProcessor);\\n\\n /* ============ Structs ============ */\\n\\n // Each Account is tied to a GlobalAccount via its associated venmoIdHash. Each account is represented by an Ethereum address\\n // and is allowed to have at most 5 deposits associated with it.\\n struct AccountInfo {\\n bytes32 venmoIdHash; // Poseidon hash of account's venmoId\\n uint256[] deposits; // Array of open account deposits\\n }\\n\\n struct Deposit {\\n address depositor;\\n uint256[3] packedVenmoId;\\n uint256 depositAmount; // Amount of USDC deposited\\n uint256 remainingDeposits; // Amount of remaining deposited liquidity\\n uint256 outstandingIntentAmount; // Amount of outstanding intents (may include expired intents)\\n uint256 conversionRate; // Conversion required by off-ramper between USDC/USD\\n bytes32[] intentHashes; // Array of hashes of all open intents (may include some expired if not pruned)\\n }\\n\\n struct DepositWithAvailableLiquidity {\\n uint256 depositId; // ID of the deposit\\n Deposit deposit; // Deposit struct\\n uint256 availableLiquidity; // Amount of liquidity available to signal intents (net of expired intents)\\n }\\n\\n struct Intent {\\n address onRamper; // On-ramper's address\\n address to; // Address to forward funds to (can be same as onRamper)\\n uint256 deposit; // ID of the deposit the intent is signaling on\\n uint256 amount; // Amount of USDC the on-ramper signals intent for on-chain\\n uint256 intentTimestamp; // Timestamp of when the intent was signaled\\n }\\n\\n struct IntentWithOnRamperId {\\n Intent intent; // Intent struct\\n bytes32 onRamperIdHash; // Poseidon hash of the on-ramper's venmoId\\n }\\n\\n struct DenyList {\\n bytes32[] deniedUsers; // Array of venmoIdHashes that are denied from taking depositors liquidity\\n mapping(bytes32 => bool) isDenied; // Mapping of venmoIdHash to boolean indicating if the user is denied\\n }\\n\\n // A Global Account is defined as an account represented by one venmoIdHash. This is used to enforce limitations on actions across\\n // all Ethereum addresses that are associated with that venmoId. In this case we use it to enforce a cooldown period between on ramps,\\n // restrict each venmo account to one outstanding intent at a time, and to enforce deny lists.\\n struct GlobalAccountInfo {\\n bytes32 currentIntentHash; // Hash of the current open intent (if exists)\\n uint256 lastOnrampTimestamp; // Timestamp of the last on-ramp transaction used to check if cooldown period elapsed\\n DenyList denyList; // Deny list of the account\\n }\\n\\n /* ============ Modifiers ============ */\\n modifier onlyRegisteredUser() {\\n require(accounts[msg.sender].venmoIdHash != bytes32(0), \\\"Caller must be registered user\\\");\\n _;\\n }\\n\\n /* ============ Constants ============ */\\n uint256 internal constant PRECISE_UNIT = 1e18;\\n uint256 internal constant MAX_DEPOSITS = 5; // An account can only have max 5 different deposit parameterizations to prevent locking funds\\n uint256 constant CIRCOM_PRIME_FIELD = 21888242871839275222246405745257275088548364400416034343698204186575808495617;\\n uint256 constant MAX_SUSTAINABILITY_FEE = 5e16; // 5% max sustainability fee\\n \\n /* ============ State Variables ============ */\\n IERC20 public immutable usdc; // USDC token contract\\n IPoseidon public immutable poseidon; // Poseidon hashing contract\\n IRegistrationProcessor public registrationProcessor; // Address of registration processor contract, verifies registration e-mails\\n ISendProcessor public sendProcessor; // Address of send processor contract, verifies onRamp emails\\n\\n bool internal isInitialized; // Indicates if contract has been initialized\\n\\n mapping(bytes32 => GlobalAccountInfo) internal globalAccount; // Mapping of venmoIdHash to information used to enforce actions across Ethereum accounts\\n mapping(address => AccountInfo) internal accounts; // Mapping of Ethereum accounts to their account information (venmoIdHash and deposits)\\n mapping(uint256 => Deposit) public deposits; // Mapping of depositIds to deposit structs\\n mapping(bytes32 => Intent) public intents; // Mapping of intentHashes to intent structs\\n\\n uint256 public minDepositAmount; // Minimum amount of USDC that can be deposited\\n uint256 public maxOnRampAmount; // Maximum amount of USDC that can be on-ramped in a single transaction\\n uint256 public onRampCooldownPeriod; // Time period that must elapse between completing an on-ramp and signaling a new intent\\n uint256 public intentExpirationPeriod; // Time period after which an intent can be pruned from the system\\n uint256 public sustainabilityFee; // Fee charged to on-rampers in preciseUnits (1e16 = 1%)\\n address public sustainabilityFeeRecipient; // Address that receives the sustainability fee\\n\\n uint256 public depositCounter; // Counter for depositIds\\n\\n /* ============ Constructor ============ */\\n constructor(\\n address _owner,\\n IERC20 _usdc,\\n IPoseidon _poseidon,\\n uint256 _minDepositAmount,\\n uint256 _maxOnRampAmount,\\n uint256 _intentExpirationPeriod,\\n uint256 _onRampCooldownPeriod,\\n uint256 _sustainabilityFee,\\n address _sustainabilityFeeRecipient\\n )\\n Ownable()\\n {\\n usdc = _usdc;\\n poseidon = _poseidon;\\n minDepositAmount = _minDepositAmount;\\n maxOnRampAmount = _maxOnRampAmount;\\n intentExpirationPeriod = _intentExpirationPeriod;\\n onRampCooldownPeriod = _onRampCooldownPeriod;\\n sustainabilityFee = _sustainabilityFee;\\n sustainabilityFeeRecipient = _sustainabilityFeeRecipient;\\n\\n transferOwnership(_owner);\\n }\\n\\n /* ============ External Functions ============ */\\n\\n /**\\n * @notice Initialize Ramp with the addresses of the Processors\\n *\\n * @param _registrationProcessor Registration processor address\\n * @param _sendProcessor Send processor address\\n */\\n function initialize(\\n IRegistrationProcessor _registrationProcessor,\\n ISendProcessor _sendProcessor\\n )\\n external\\n onlyOwner\\n {\\n require(!isInitialized, \\\"Already initialized\\\");\\n\\n registrationProcessor = _registrationProcessor;\\n sendProcessor = _sendProcessor;\\n\\n isInitialized = true;\\n }\\n\\n /**\\n * @notice Registers a new account by pulling the hash of the account id from the proof and assigning the account owner to the\\n * sender of the transaction. One venmo account can be registered to multiple Ethereum addresses.\\n *\\n * @param _a Parameter of zk proof\\n * @param _b Parameter of zk proof\\n * @param _c Parameter of zk proof\\n * @param _signals Encoded public signals of the zk proof, contains mailserverHash, fromEmail, userIdHash\\n */\\n function register(\\n uint[2] memory _a,\\n uint[2][2] memory _b,\\n uint[2] memory _c,\\n uint[5] memory _signals\\n )\\n external\\n {\\n require(accounts[msg.sender].venmoIdHash == bytes32(0), \\\"Account already associated with venmoId\\\");\\n bytes32 venmoIdHash = _verifyRegistrationProof(_a, _b, _c, _signals);\\n\\n accounts[msg.sender].venmoIdHash = venmoIdHash;\\n\\n emit AccountRegistered(msg.sender, venmoIdHash);\\n }\\n\\n /**\\n * @notice Generates a deposit entry for off-rampers that can then be fulfilled by an on-ramper. This function will not add to\\n * previous deposits. Every deposit has it's own unique identifier. User must approve the contract to transfer the deposit amount\\n * of USDC.\\n *\\n * @param _packedVenmoId The packed venmo id of the account owner (we pack for easy use with poseidon)\\n * @param _depositAmount The amount of USDC to off-ramp\\n * @param _receiveAmount The amount of USD to receive\\n */\\n function offRamp(\\n uint256[3] memory _packedVenmoId,\\n uint256 _depositAmount,\\n uint256 _receiveAmount\\n )\\n external\\n onlyRegisteredUser\\n {\\n bytes32 venmoIdHash = bytes32(poseidon.poseidon(_packedVenmoId));\\n\\n require(accounts[msg.sender].venmoIdHash == venmoIdHash, \\\"Sender must be the account owner\\\");\\n require(accounts[msg.sender].deposits.length < MAX_DEPOSITS, \\\"Maximum deposit amount reached\\\");\\n require(_depositAmount >= minDepositAmount, \\\"Deposit amount must be greater than min deposit amount\\\");\\n require(_receiveAmount > 0, \\\"Receive amount must be greater than 0\\\");\\n\\n uint256 conversionRate = (_depositAmount * PRECISE_UNIT) / _receiveAmount;\\n uint256 depositId = depositCounter++;\\n\\n accounts[msg.sender].deposits.push(depositId);\\n\\n deposits[depositId] = Deposit({\\n depositor: msg.sender,\\n packedVenmoId: _packedVenmoId,\\n depositAmount: _depositAmount,\\n remainingDeposits: _depositAmount,\\n outstandingIntentAmount: 0,\\n conversionRate: conversionRate,\\n intentHashes: new bytes32[](0)\\n });\\n\\n usdc.transferFrom(msg.sender, address(this), _depositAmount);\\n\\n emit DepositReceived(depositId, venmoIdHash, _depositAmount, conversionRate);\\n }\\n\\n /**\\n * @notice Signals intent to pay the depositor defined in the _depositId the _amount * deposit conversionRate off-chain\\n * in order to unlock _amount of funds on-chain. Each user can only have one outstanding intent at a time regardless of\\n * address (tracked using venmoId). Caller must not be on the depositor's deny list. If there are prunable intents then\\n * they will be deleted from the deposit to be able to maintain state hygiene.\\n *\\n * @param _depositId The ID of the deposit the on-ramper intends to use for \\n * @param _amount The amount of USDC the user wants to on-ramp\\n * @param _to Address to forward funds to (can be same as onRamper)\\n */\\n function signalIntent(uint256 _depositId, uint256 _amount, address _to) external onlyRegisteredUser {\\n bytes32 venmoIdHash = accounts[msg.sender].venmoIdHash;\\n Deposit storage deposit = deposits[_depositId];\\n bytes32 depositorVenmoIdHash = accounts[deposit.depositor].venmoIdHash;\\n\\n // Caller validity checks\\n require(!globalAccount[depositorVenmoIdHash].denyList.isDenied[venmoIdHash], \\\"Onramper on depositor's denylist\\\");\\n require(\\n globalAccount[venmoIdHash].lastOnrampTimestamp + onRampCooldownPeriod <= block.timestamp,\\n \\\"On ramp cool down period not elapsed\\\"\\n );\\n require(globalAccount[venmoIdHash].currentIntentHash == bytes32(0), \\\"Intent still outstanding\\\");\\n require(depositorVenmoIdHash != venmoIdHash, \\\"Sender cannot be the depositor\\\");\\n\\n // Intent information checks\\n require(deposit.depositor != address(0), \\\"Deposit does not exist\\\");\\n require(_amount > 0, \\\"Signaled amount must be greater than 0\\\");\\n require(_amount <= maxOnRampAmount, \\\"Signaled amount must be less than max on-ramp amount\\\");\\n require(_to != address(0), \\\"Cannot send to zero address\\\");\\n\\n bytes32 intentHash = _calculateIntentHash(venmoIdHash, _depositId);\\n\\n if (deposit.remainingDeposits < _amount) {\\n (\\n bytes32[] memory prunableIntents,\\n uint256 reclaimableAmount\\n ) = _getPrunableIntents(_depositId);\\n\\n require(deposit.remainingDeposits + reclaimableAmount >= _amount, \\\"Not enough liquidity\\\");\\n\\n _pruneIntents(deposit, prunableIntents);\\n deposit.remainingDeposits += reclaimableAmount;\\n deposit.outstandingIntentAmount -= reclaimableAmount;\\n }\\n\\n intents[intentHash] = Intent({\\n onRamper: msg.sender,\\n to: _to,\\n deposit: _depositId,\\n amount: _amount,\\n intentTimestamp: block.timestamp\\n });\\n\\n globalAccount[venmoIdHash].currentIntentHash = intentHash;\\n\\n deposit.remainingDeposits -= _amount;\\n deposit.outstandingIntentAmount += _amount;\\n deposit.intentHashes.push(intentHash);\\n\\n emit IntentSignaled(intentHash, _depositId, venmoIdHash, _to, _amount, block.timestamp);\\n }\\n\\n /**\\n * @notice Only callable by the originator of the intent. Cancels an outstanding intent thus allowing user to signal a new\\n * intent. Deposit state is updated to reflect the cancelled intent.\\n *\\n * @param _intentHash Hash of intent being cancelled\\n */\\n function cancelIntent(bytes32 _intentHash) external {\\n Intent memory intent = intents[_intentHash];\\n \\n require(intent.intentTimestamp != 0, \\\"Intent does not exist\\\");\\n require(intent.onRamper == msg.sender, \\\"Sender must be the on-ramper\\\");\\n\\n Deposit storage deposit = deposits[intent.deposit];\\n\\n _pruneIntent(deposit, _intentHash);\\n\\n deposit.remainingDeposits += intent.amount;\\n deposit.outstandingIntentAmount -= intent.amount;\\n }\\n\\n /**\\n * @notice Anyone can submit an on-ramp transaction, even if caller isn't on-ramper. Upon submission the proof is validated,\\n * intent is removed, and deposit state is updated. USDC is transferred to the on-ramper.\\n *\\n * @param _a Parameter of zk proof\\n * @param _b Parameter of zk proof\\n * @param _c Parameter of zk proof\\n * @param _signals Encoded public signals of the zk proof, contains mailserverHash, fromEmail, timestamp, onRamperIdHash,\\n * nullifier, intentHash\\n */\\n function onRamp(\\n uint256[2] memory _a,\\n uint256[2][2] memory _b,\\n uint256[2] memory _c,\\n uint256[12] memory _signals\\n )\\n external\\n {\\n (\\n Intent memory intent,\\n Deposit storage deposit,\\n bytes32 intentHash\\n ) = _verifyOnRampProof(_a, _b, _c, _signals);\\n\\n _pruneIntent(deposit, intentHash);\\n\\n deposit.outstandingIntentAmount -= intent.amount;\\n globalAccount[accounts[intent.onRamper].venmoIdHash].lastOnrampTimestamp = block.timestamp;\\n _closeDepositIfNecessary(intent.deposit, deposit);\\n\\n _transferFunds(intentHash, intent);\\n }\\n\\n /**\\n * @notice Caller must be the depositor for each depositId in the array, if not whole function fails. Depositor is returned all\\n * remaining deposits and any outstanding intents that are expired. If an intent is not expired then those funds will not be\\n * returned. Deposit will be deleted as long as there are no more outstanding intents.\\n *\\n * @param _depositIds Array of depositIds the depositor is attempting to withdraw\\n */\\n function withdrawDeposit(uint256[] memory _depositIds) external {\\n uint256 returnAmount;\\n\\n for (uint256 i = 0; i < _depositIds.length; ++i) {\\n uint256 depositId = _depositIds[i];\\n Deposit storage deposit = deposits[depositId];\\n\\n require(deposit.depositor == msg.sender, \\\"Sender must be the depositor\\\");\\n\\n (\\n bytes32[] memory prunableIntents,\\n uint256 reclaimableAmount\\n ) = _getPrunableIntents(depositId);\\n\\n _pruneIntents(deposit, prunableIntents);\\n\\n returnAmount += deposit.remainingDeposits + reclaimableAmount;\\n \\n deposit.outstandingIntentAmount -= reclaimableAmount;\\n\\n emit DepositWithdrawn(depositId, deposit.depositor, deposit.remainingDeposits + reclaimableAmount);\\n \\n delete deposit.remainingDeposits;\\n _closeDepositIfNecessary(depositId, deposit);\\n }\\n\\n usdc.transfer(msg.sender, returnAmount);\\n }\\n\\n /**\\n * @notice Adds a venmoId to a depositor's deny list. If an address associated with the banned venmoId attempts to\\n * signal an intent on the user's deposit they will be denied.\\n *\\n * @param _deniedUser Poseidon hash of the venmoId being banned\\n */\\n function addAccountToDenylist(bytes32 _deniedUser) external onlyRegisteredUser {\\n bytes32 denyingUser = accounts[msg.sender].venmoIdHash;\\n\\n require(!globalAccount[denyingUser].denyList.isDenied[_deniedUser], \\\"User already on denylist\\\");\\n\\n globalAccount[denyingUser].denyList.isDenied[_deniedUser] = true;\\n globalAccount[denyingUser].denyList.deniedUsers.push(_deniedUser);\\n\\n emit UserAddedToDenylist(denyingUser, _deniedUser);\\n }\\n\\n /**\\n * @notice Removes a venmoId from a depositor's deny list.\\n *\\n * @param _approvedUser Poseidon hash of the venmoId being approved\\n */\\n function removeAccountFromDenylist(bytes32 _approvedUser) external onlyRegisteredUser {\\n bytes32 approvingUser = accounts[msg.sender].venmoIdHash;\\n\\n require(globalAccount[approvingUser].denyList.isDenied[_approvedUser], \\\"User not on denylist\\\");\\n\\n globalAccount[approvingUser].denyList.isDenied[_approvedUser] = false;\\n globalAccount[approvingUser].denyList.deniedUsers.removeStorage(_approvedUser);\\n\\n emit UserRemovedFromDenylist(approvingUser, _approvedUser);\\n }\\n\\n /* ============ Governance Functions ============ */\\n\\n /**\\n * @notice GOVERNANCE ONLY: Updates the send processor address used for validating and interpreting zk proofs.\\n *\\n * @param _sendProcessor New send proccesor address\\n */\\n function setSendProcessor(ISendProcessor _sendProcessor) external onlyOwner {\\n sendProcessor = _sendProcessor;\\n emit NewSendProcessorSet(address(_sendProcessor));\\n }\\n\\n /**\\n * @notice GOVERNANCE ONLY: Updates the registration processor address used for validating and interpreting zk proofs.\\n *\\n * @param _registrationProcessor New registration proccesor address\\n */\\n function setRegistrationProcessor(IRegistrationProcessor _registrationProcessor) external onlyOwner {\\n registrationProcessor = _registrationProcessor;\\n emit NewRegistrationProcessorSet(address(_registrationProcessor));\\n }\\n\\n /**\\n * @notice GOVERNANCE ONLY: Updates the minimum deposit amount a user can specify for off-ramping.\\n *\\n * @param _minDepositAmount The new minimum deposit amount\\n */\\n function setMinDepositAmount(uint256 _minDepositAmount) external onlyOwner {\\n require(_minDepositAmount != 0, \\\"Minimum deposit cannot be zero\\\");\\n\\n minDepositAmount = _minDepositAmount;\\n emit MinDepositAmountSet(_minDepositAmount);\\n }\\n\\n /**\\n * @notice GOVERNANCE ONLY: Updates the sustainability fee. This fee is charged to on-rampers upon a successful on-ramp.\\n *\\n * @param _fee The new sustainability fee in precise units (10**18, ie 10% = 1e17)\\n */\\n function setSustainabilityFee(uint256 _fee) external onlyOwner {\\n require(_fee <= MAX_SUSTAINABILITY_FEE, \\\"Fee cannot be greater than max fee\\\");\\n\\n sustainabilityFee = _fee;\\n emit SustainabilityFeeUpdated(_fee);\\n }\\n\\n /**\\n * @notice GOVERNANCE ONLY: Updates the recepient of sustainability fees.\\n *\\n * @param _feeRecipient The new fee recipient address\\n */\\n function setSustainabilityFeeRecipient(address _feeRecipient) external onlyOwner {\\n require(_feeRecipient != address(0), \\\"Fee recipient cannot be zero address\\\");\\n\\n sustainabilityFeeRecipient = _feeRecipient;\\n emit SustainabilityFeeRecipientUpdated(_feeRecipient);\\n }\\n\\n /**\\n * @notice GOVERNANCE ONLY: Updates the max amount allowed to be on-ramped in each transaction. To on-ramp more than\\n * this amount a user must make multiple transactions.\\n *\\n * @param _maxOnRampAmount The new max on ramp amount\\n */\\n function setMaxOnRampAmount(uint256 _maxOnRampAmount) external onlyOwner {\\n require(_maxOnRampAmount != 0, \\\"Max on ramp amount cannot be zero\\\");\\n\\n maxOnRampAmount = _maxOnRampAmount;\\n emit MaxOnRampAmountSet(_maxOnRampAmount);\\n }\\n\\n /**\\n * @notice GOVERNANCE ONLY: Updates the on-ramp cooldown period, once an on-ramp transaction is completed the user must wait this\\n * amount of time before they can signalIntent to on-ramp again.\\n *\\n * @param _onRampCooldownPeriod New on-ramp cooldown period\\n */\\n function setOnRampCooldownPeriod(uint256 _onRampCooldownPeriod) external onlyOwner {\\n onRampCooldownPeriod = _onRampCooldownPeriod;\\n emit OnRampCooldownPeriodSet(_onRampCooldownPeriod);\\n }\\n\\n /**\\n * @notice GOVERNANCE ONLY: Updates the intent expiration period, after this period elapses an intent can be pruned to prevent\\n * locking up a depositor's funds.\\n *\\n * @param _intentExpirationPeriod New intent expiration period\\n */\\n function setIntentExpirationPeriod(uint256 _intentExpirationPeriod) external onlyOwner {\\n require(_intentExpirationPeriod != 0, \\\"Max intent expiration period cannot be zero\\\");\\n\\n intentExpirationPeriod = _intentExpirationPeriod;\\n emit IntentExpirationPeriodSet(_intentExpirationPeriod);\\n }\\n\\n\\n /* ============ External View Functions ============ */\\n\\n function getDeposit(uint256 _depositId) external view returns (Deposit memory) {\\n return deposits[_depositId];\\n }\\n\\n function getAccountInfo(address _account) external view returns (AccountInfo memory) {\\n return accounts[_account];\\n }\\n\\n function getVenmoIdCurrentIntentHash(address _account) external view returns (bytes32) {\\n return globalAccount[accounts[_account].venmoIdHash].currentIntentHash;\\n }\\n\\n function getLastOnRampTimestamp(address _account) external view returns (uint256) {\\n return globalAccount[accounts[_account].venmoIdHash].lastOnrampTimestamp;\\n }\\n\\n function getDeniedUsers(address _account) external view returns (bytes32[] memory) {\\n return globalAccount[accounts[_account].venmoIdHash].denyList.deniedUsers;\\n }\\n\\n function isDeniedUser(address _account, bytes32 _deniedUser) external view returns (bool) {\\n return globalAccount[accounts[_account].venmoIdHash].denyList.isDenied[_deniedUser];\\n }\\n\\n function getIntentsWithOnRamperId(bytes32[] calldata _intentHashes) external view returns (IntentWithOnRamperId[] memory) {\\n IntentWithOnRamperId[] memory intentsWithOnRamperId = new IntentWithOnRamperId[](_intentHashes.length);\\n\\n for (uint256 i = 0; i < _intentHashes.length; ++i) {\\n Intent memory intent = intents[_intentHashes[i]];\\n intentsWithOnRamperId[i] = IntentWithOnRamperId({\\n intent: intent,\\n onRamperIdHash: accounts[intent.onRamper].venmoIdHash\\n });\\n }\\n\\n return intentsWithOnRamperId;\\n }\\n\\n function getAccountDeposits(address _account) external view returns (DepositWithAvailableLiquidity[] memory accountDeposits) {\\n uint256[] memory accountDepositIds = accounts[_account].deposits;\\n accountDeposits = new DepositWithAvailableLiquidity[](accountDepositIds.length);\\n \\n for (uint256 i = 0; i < accountDepositIds.length; ++i) {\\n uint256 depositId = accountDepositIds[i];\\n Deposit memory deposit = deposits[depositId];\\n ( , uint256 reclaimableAmount) = _getPrunableIntents(depositId);\\n\\n accountDeposits[i] = DepositWithAvailableLiquidity({\\n depositId: depositId,\\n deposit: deposit,\\n availableLiquidity: deposit.remainingDeposits + reclaimableAmount\\n });\\n }\\n }\\n\\n function getDepositFromIds(uint256[] memory _depositIds) external view returns (DepositWithAvailableLiquidity[] memory depositArray) {\\n depositArray = new DepositWithAvailableLiquidity[](_depositIds.length);\\n\\n for (uint256 i = 0; i < _depositIds.length; ++i) {\\n uint256 depositId = _depositIds[i];\\n Deposit memory deposit = deposits[depositId];\\n ( , uint256 reclaimableAmount) = _getPrunableIntents(depositId);\\n\\n depositArray[i] = DepositWithAvailableLiquidity({\\n depositId: depositId,\\n deposit: deposit,\\n availableLiquidity: deposit.remainingDeposits + reclaimableAmount\\n });\\n }\\n\\n return depositArray;\\n }\\n\\n /* ============ Internal Functions ============ */\\n\\n /**\\n * @notice Calculates the intentHash of new intent\\n */\\n function _calculateIntentHash(\\n bytes32 _venmoId,\\n uint256 _depositId\\n )\\n internal\\n view\\n virtual\\n returns (bytes32 intentHash)\\n {\\n // Mod with circom prime field to make sure it fits in a 254-bit field\\n uint256 intermediateHash = uint256(keccak256(abi.encodePacked(_venmoId, _depositId, block.timestamp)));\\n intentHash = bytes32(intermediateHash % CIRCOM_PRIME_FIELD);\\n }\\n\\n /**\\n * @notice Cycles through all intents currently open on a deposit and sees if any have expired. If they have expired\\n * the outstanding amounts are summed and returned alongside the intentHashes\\n */\\n function _getPrunableIntents(\\n uint256 _depositId\\n )\\n internal\\n view\\n returns(bytes32[] memory prunableIntents, uint256 reclaimedAmount)\\n {\\n bytes32[] memory intentHashes = deposits[_depositId].intentHashes;\\n prunableIntents = new bytes32[](intentHashes.length);\\n\\n for (uint256 i = 0; i < intentHashes.length; ++i) {\\n Intent memory intent = intents[intentHashes[i]];\\n if (intent.intentTimestamp + intentExpirationPeriod < block.timestamp) {\\n prunableIntents[i] = intentHashes[i];\\n reclaimedAmount += intent.amount;\\n }\\n }\\n }\\n\\n function _pruneIntents(Deposit storage _deposit, bytes32[] memory _intents) internal {\\n for (uint256 i = 0; i < _intents.length; ++i) {\\n if (_intents[i] != bytes32(0)) {\\n _pruneIntent(_deposit, _intents[i]);\\n }\\n }\\n }\\n\\n /**\\n * @notice Pruning an intent involves deleting its state from the intents mapping, zeroing out the intendee's currentIntentHash in\\n * their global account mapping, and deleting the intentHash from the deposit's intentHashes array.\\n */\\n function _pruneIntent(Deposit storage _deposit, bytes32 _intentHash) internal {\\n Intent memory intent = intents[_intentHash];\\n\\n delete globalAccount[accounts[intent.onRamper].venmoIdHash].currentIntentHash;\\n delete intents[_intentHash];\\n _deposit.intentHashes.removeStorage(_intentHash);\\n\\n emit IntentPruned(_intentHash, intent.deposit);\\n }\\n\\n /**\\n * @notice Removes a deposit if no outstanding intents AND no remaining deposits. Deleting a deposit deletes it from the\\n * deposits mapping and removes tracking it in the user's accounts mapping.\\n */\\n function _closeDepositIfNecessary(uint256 _depositId, Deposit storage _deposit) internal {\\n uint256 openDepositAmount = _deposit.outstandingIntentAmount + _deposit.remainingDeposits;\\n if (openDepositAmount == 0) {\\n accounts[_deposit.depositor].deposits.removeStorage(_depositId);\\n emit DepositClosed(_depositId, _deposit.depositor);\\n delete deposits[_depositId];\\n }\\n }\\n\\n /**\\n * @notice Checks if sustainability fee has been defined, if so sends fee to the fee recipient and intent amount minus fee\\n * to the on-ramper. If sustainability fee is undefined then full intent amount is transferred to on-ramper.\\n */\\n function _transferFunds(bytes32 _intentHash, Intent memory _intent) internal {\\n uint256 fee;\\n if (sustainabilityFee != 0) {\\n fee = (_intent.amount * sustainabilityFee) / PRECISE_UNIT;\\n usdc.transfer(sustainabilityFeeRecipient, fee);\\n }\\n\\n uint256 onRampAmount = _intent.amount - fee;\\n usdc.transfer(_intent.to, onRampAmount);\\n\\n emit IntentFulfilled(_intentHash, _intent.deposit, _intent.onRamper, _intent.to, onRampAmount, fee);\\n }\\n\\n /**\\n * @notice Validate venmo send payment email and check that it hasn't already been used (done on SendProcessor).\\n * Additionally, we validate that the offRamperIdHash matches the one from the specified intent and that enough\\n * was paid off-chain inclusive of the conversionRate.\\n */\\n function _verifyOnRampProof(\\n uint256[2] memory _a,\\n uint256[2][2] memory _b,\\n uint256[2] memory _c,\\n uint256[12] memory _signals\\n )\\n internal\\n returns(Intent memory, Deposit storage, bytes32)\\n {\\n (\\n uint256 amount,\\n uint256 timestamp,\\n bytes32 offRamperIdHash,\\n bytes32 onRamperIdHash,\\n bytes32 intentHash\\n ) = sendProcessor.processProof(\\n ISendProcessor.SendProof({\\n a: _a,\\n b: _b,\\n c: _c,\\n signals: _signals\\n })\\n );\\n\\n Intent memory intent = intents[intentHash];\\n Deposit storage deposit = deposits[intent.deposit];\\n\\n require(intent.onRamper != address(0), \\\"Intent does not exist\\\");\\n require(intent.intentTimestamp <= timestamp, \\\"Intent was not created before send\\\");\\n require(accounts[deposit.depositor].venmoIdHash == offRamperIdHash, \\\"Offramper id does not match\\\");\\n require(accounts[intent.onRamper].venmoIdHash == onRamperIdHash, \\\"Onramper id does not match\\\");\\n require(amount >= (intent.amount * PRECISE_UNIT) / deposit.conversionRate, \\\"Payment was not enough\\\");\\n\\n return (intent, deposit, intentHash);\\n }\\n\\n /**\\n * @notice Validate the user has a venmo account, we do not nullify this email since it can be reused to register under\\n * different addresses.\\n */\\n function _verifyRegistrationProof(\\n uint256[2] memory _a,\\n uint256[2][2] memory _b,\\n uint256[2] memory _c,\\n uint256[5] memory _signals\\n )\\n internal\\n view\\n returns(bytes32)\\n {\\n bytes32 venmoIdHash = registrationProcessor.processProof(\\n IRegistrationProcessor.RegistrationProof({\\n a: _a,\\n b: _b,\\n c: _c,\\n signals: _signals\\n })\\n );\\n\\n return venmoIdHash;\\n }\\n}\\n\",\"keccak256\":\"0x55cb1c9701d9b03ff4e445f03993659c7d3b6922ad280d3b2a88edfad8af9fed\",\"license\":\"MIT\"},\"contracts/ramps/venmo-v1/interfaces/IRegistrationProcessor.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.18;\\n\\ninterface IRegistrationProcessor {\\n\\n struct RegistrationProof {\\n uint256[2] a;\\n uint256[2][2] b;\\n uint256[2] c;\\n uint256[5] signals;\\n }\\n\\n function processProof(\\n RegistrationProof calldata _proof\\n )\\n external\\n view\\n returns (bytes32);\\n}\\n\",\"keccak256\":\"0xc80e1b5561af1a8631547c72e6c6dcdf4e66c06b3eb34b1a8db1bb0f6d3ea90f\",\"license\":\"MIT\"},\"contracts/ramps/venmo-v1/interfaces/ISendProcessor.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.18;\\n\\ninterface ISendProcessor {\\n\\n struct SendProof {\\n uint256[2] a;\\n uint256[2][2] b;\\n uint256[2] c;\\n uint256[12] signals;\\n }\\n\\n function processProof(\\n SendProof calldata _proof\\n )\\n external\\n returns(uint256, uint256, bytes32, bytes32, bytes32);\\n}\\n\",\"keccak256\":\"0x16811e82d90b1e15eafd8f3de30b6a05a48c906c96e65d263c557c66e9fcedb7\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x60c060405234801562000010575f80fd5b5060405162003e5538038062003e558339810160408190526200003391620001e0565b6200003e336200009c565b6001600160a01b0388811660805287811660a05260078790556008869055600a8590556009849055600b839055600c80546001600160a01b0319169183169190911790556200008d89620000eb565b50505050505050505062000276565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b620000f56200016e565b6001600160a01b038116620001605760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b6200016b816200009c565b50565b5f546001600160a01b03163314620001c95760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640162000157565b565b6001600160a01b03811681146200016b575f80fd5b5f805f805f805f805f6101208a8c031215620001fa575f80fd5b89516200020781620001cb565b60208b01519099506200021a81620001cb565b60408b01519098506200022d81620001cb565b8097505060608a0151955060808a0151945060a08a0151935060c08a0151925060e08a015191506101008a01516200026581620001cb565b809150509295985092959850929598565b60805160a051613b9a620002bb5f395f81816105d801526110a501525f8181610348015281816113e3015281816118db01528181612d690152612e140152613b9a5ff3fe608060405234801561000f575f80fd5b5060043610610255575f3560e01c80638da5cb5b11610140578063d55f960d116100bf578063ecb3dc8811610084578063ecb3dc8814610662578063ecd618f01461066b578063ed1692b81461068b578063eea1d1971461069e578063f2fde38b146106b1578063fbf15b1f146106c4575f80fd5b8063d55f960d1461060d578063d9478d2014610620578063da26c18914610633578063e215ad5914610646578063e279d96414610659575f80fd5b8063a1a954b711610105578063a1a954b71461053f578063b02c43d014610548578063b3fa4c01146105c0578063c62b919e146105d3578063ce523ca3146105fa575f80fd5b80638da5cb5b1461046e5780639021578a1461047e5780639087beff146104f95780639b357b5a1461050c5780639f9fb9681461051f575f80fd5b80634595bba0116101d75780635dd765151161019c5780635dd7651514610404578063645006ca146104175780637113476214610420578063715018a61461043357806371a28f691461043b5780637b510fe81461044e575f80fd5b80634595bba014610395578063485cc955146103b55780634877b7b6146103c8578063495223e7146103db5780635081d952146103e4575f80fd5b80632a80cda31161021d5780632a80cda31461030a578063317dcc961461031d5780633adba28a146103305780633e413bee146103435780634298734914610382575f80fd5b80630f1ef98c14610259578063123a11e4146102a4578063133de6cb146102d9578063148172da146102ee578063238c849414610301575b5f80fd5b6102916102673660046131be565b6001600160a01b03165f908152600460209081526040808320548352600390915290206001015490565b6040519081526020015b60405180910390f35b6102916102b23660046131be565b6001600160a01b03165f908152600460209081526040808320548352600390915290205490565b6102ec6102e73660046131be565b61071a565b005b6102ec6102fc3660046131e0565b610777565b610291600b5481565b6102ec6103183660046131e0565b6108a6565b6102ec61032b3660046131e0565b610932565b6102ec61033e3660046131f7565b61096f565b61036a7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161029b565b6102ec6103903660046131e0565b610eb8565b6103a86103a33660046131be565b610f58565b60405161029b919061322d565b6102ec6103c3366004613270565b610fce565b6102ec6103d6366004613315565b611061565b61029160095481565b6103f76103f23660046131be565b61149c565b60405161029b919061345e565b6102ec6104123660046131e0565b6116ca565b61029160075481565b6102ec61042e3660046134df565b611769565b6102ec611952565b6103f76104493660046134df565b611965565b61046161045c3660046131be565b611b2e565b60405161029b9190613580565b5f546001600160a01b031661036a565b6104c661048c3660046131e0565b60066020525f9081526040902080546001820154600283015460038401546004909401546001600160a01b03938416949390921692909185565b604080516001600160a01b039687168152959094166020860152928401919091526060830152608082015260a00161029b565b6102ec6105073660046131e0565b611bc4565b6102ec61051a3660046131e0565b611c5a565b61053261052d3660046131e0565b611d5e565b60405161029b91906135d7565b610291600a5481565b61058e6105563660046131e0565b600560208190525f9182526040909120805460048201549282015460068301546007909301546001600160a01b039092169392909185565b604080516001600160a01b0390961686526020860194909452928401919091526060830152608082015260a00161029b565b6102ec6105ce3660046131be565b611e47565b61036a7f000000000000000000000000000000000000000000000000000000000000000081565b6102ec610608366004613682565b611eff565b6102ec61061b3660046131e0565b611fbb565b600c5461036a906001600160a01b031681565b6102ec610641366004613735565b612108565b60015461036a906001600160a01b031681565b61029160085481565b610291600d5481565b61067e6106793660046137a7565b612191565b60405161029b9190613816565b6102ec6106993660046131be565b6122bb565b60025461036a906001600160a01b031681565b6102ec6106bf3660046131be565b612311565b61070a6106d2366004613899565b6001600160a01b0382165f90815260046020908152604080832054835260038083528184208585520190915290205460ff1692915050565b604051901515815260200161029b565b61072261238a565b600280546001600160a01b0319166001600160a01b0383169081179091556040519081527f6e7665a41605edc0d70f4b991d652755f380754eb092d81ef9ab93664778d59e906020015b60405180910390a150565b335f908152600460205260409020546107ab5760405162461bcd60e51b81526004016107a2906138c3565b60405180910390fd5b335f908152600460209081526040808320548084526003808452828520868652019092529091205460ff16156108235760405162461bcd60e51b815260206004820152601860248201527f5573657220616c7265616479206f6e2064656e796c697374000000000000000060448201526064016107a2565b5f8181526003602081815260408084208685528084018352818520805460ff19166001908117909155938352600201805493840181558452922001839055517f976c693d56f27ba17d902bda80c4fa0416b773fbf268bcb0ee71689234d769ee9061089a9083908590918252602082015260400190565b60405180910390a15050565b6108ae61238a565b805f036108fd5760405162461bcd60e51b815260206004820152601e60248201527f4d696e696d756d206465706f7369742063616e6e6f74206265207a65726f000060448201526064016107a2565b60078190556040518181527fbdde72a6d8d8b42770c9899945ccdce09d0c5c794d3326cdb2d2cca61b12a9fc9060200161076c565b61093a61238a565b60098190556040518181527f88397975d177ce5e18abf3a5fdb8de773e80673d85eeb54f48cfaf688b3d2c3e9060200161076c565b335f9081526004602052604090205461099a5760405162461bcd60e51b81526004016107a2906138c3565b335f908152600460208181526040808420548785526005835281852080546001600160a01b031686529383528185205480865260038085528387208388520190935293205460ff1615610a2f5760405162461bcd60e51b815260206004820181905260248201527f4f6e72616d706572206f6e206465706f7369746f7227732064656e796c69737460448201526064016107a2565b6009545f848152600360205260409020600101544291610a4e9161390e565b1115610aa85760405162461bcd60e51b8152602060048201526024808201527f4f6e2072616d7020636f6f6c20646f776e20706572696f64206e6f7420656c616044820152631c1cd95960e21b60648201526084016107a2565b5f8381526003602052604090205415610b035760405162461bcd60e51b815260206004820152601860248201527f496e74656e74207374696c6c206f75747374616e64696e67000000000000000060448201526064016107a2565b828103610b525760405162461bcd60e51b815260206004820152601e60248201527f53656e6465722063616e6e6f7420626520746865206465706f7369746f72000060448201526064016107a2565b81546001600160a01b0316610ba25760405162461bcd60e51b815260206004820152601660248201527511195c1bdcda5d08191bd95cc81b9bdd08195e1a5cdd60521b60448201526064016107a2565b5f8511610c005760405162461bcd60e51b815260206004820152602660248201527f5369676e616c656420616d6f756e74206d75737420626520677265617465722060448201526507468616e20360d41b60648201526084016107a2565b600854851115610c6f5760405162461bcd60e51b815260206004820152603460248201527f5369676e616c656420616d6f756e74206d757374206265206c657373207468616044820152731b881b585e081bdb8b5c985b5c08185b5bdd5b9d60621b60648201526084016107a2565b6001600160a01b038416610cc55760405162461bcd60e51b815260206004820152601b60248201527f43616e6e6f742073656e6420746f207a65726f2061646472657373000000000060448201526064016107a2565b5f610cd084886123e3565b90508583600501541015610d82575f80610ce98961244d565b9150915087818660050154610cfe919061390e565b1015610d435760405162461bcd60e51b81526020600482015260146024820152734e6f7420656e6f756768206c697175696469747960601b60448201526064016107a2565b610d4d85836125e6565b80856005015f828254610d60919061390e565b9250508190555080856006015f828254610d7a9190613921565b909155505050505b6040805160a0810182523381526001600160a01b0387811660208084019182528385018c8152606085018c815242608087019081525f89815260068552888120975188549088166001600160a01b0319918216178955955160018901805491909816961695909517909555905160028601555160038086019190915592516004909401939093558781529152908120829055600584018054889290610e28908490613921565b9250508190555085836006015f828254610e42919061390e565b90915550506008830180546001810182555f91825260209182902001829055604080516001600160a01b038816815291820188905242908201528490889083907f1a1292e170a0f000ccf956afba79bee0f9ec1d81f3f901c1d4d11e1f336aae109060600160405180910390a450505050505050565b610ec061238a565b805f03610f235760405162461bcd60e51b815260206004820152602b60248201527f4d617820696e74656e742065787069726174696f6e20706572696f642063616e60448201526a6e6f74206265207a65726f60a81b60648201526084016107a2565b600a8190556040518181527f55e3f6b95de9a0ec782f892e93fafe4e56be0696df204ddf8e0a40a9a713a8039060200161076c565b6001600160a01b0381165f9081526004602090815260408083205483526003825291829020600201805483518184028101840190945280845260609392830182828015610fc257602002820191905f5260205f20905b815481526020019060010190808311610fae575b50505050509050919050565b610fd661238a565b600254600160a01b900460ff16156110265760405162461bcd60e51b8152602060048201526013602482015272105b1c9958591e481a5b9a5d1a585b1a5e9959606a1b60448201526064016107a2565b600180546001600160a01b039384166001600160a01b0319909116179055600280546001600160a81b0319169190921617600160a01b179055565b335f9081526004602052604090205461108c5760405162461bcd60e51b81526004016107a2906138c3565b6040516304b98e1d60e31b81525f906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906325cc70e8906110da908790600401613934565b602060405180830381865afa1580156110f5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111199190613942565b335f9081526004602052604090205490915081146111795760405162461bcd60e51b815260206004820181905260248201527f53656e646572206d75737420626520746865206163636f756e74206f776e657260448201526064016107a2565b335f908152600460205260409020600101546005116111da5760405162461bcd60e51b815260206004820152601e60248201527f4d6178696d756d206465706f73697420616d6f756e742072656163686564000060448201526064016107a2565b60075483101561124b5760405162461bcd60e51b815260206004820152603660248201527f4465706f73697420616d6f756e74206d757374206265206772656174657220746044820152751a185b881b5a5b8819195c1bdcda5d08185b5bdd5b9d60521b60648201526084016107a2565b5f82116112a85760405162461bcd60e51b815260206004820152602560248201527f5265636569766520616d6f756e74206d75737420626520677265617465722074604482015264068616e20360dc1b60648201526084016107a2565b5f826112bc670de0b6b3a764000086613959565b6112c69190613984565b600d80549192505f9190826112da83613997565b90915550335f81815260046020908152604080832060019081018054808301825590855283852001869055815160e0810183529485528483018c81528583018c9052606086018c90526080860185905260a086018990528251858152808501845260c087015286855260059093529220835181546001600160a01b0319166001600160a01b039091161781559051939450919261137b918301906003613020565b5060408201516004820155606082015160058201556080820151600682015560a0820151600782015560c082015180516113bf91600884019160209091019061305e565b50506040516323b872dd60e01b8152336004820152306024820152604481018790527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031691506323b872dd906064016020604051808303815f875af1158015611432573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061145691906139af565b506040805186815260208101849052849183917f36b046df2c296f2a5a78570d5e52a92773cbb616825b1af59a49a4d02df2b109910160405180910390a3505050505050565b6001600160a01b0381165f9081526004602090815260408083206001018054825181850281018501909352808352606094938301828280156114fb57602002820191905f5260205f20905b8154815260200190600101908083116114e7575b50505050509050805167ffffffffffffffff81111561151c5761151c6132a7565b60405190808252806020026020018201604052801561155557816020015b611542613096565b81526020019060019003908161153a5790505b5091505f5b81518110156116c3575f828281518110611576576115766139ce565b6020908102919091018101515f818152600583526040808220815160e08101835281546001600160a01b0316815282516060810190935293955091938301906001830160038282826020028201915b8154815260200190600101908083116115c55750505050508152602001600482015481526020016005820154815260200160068201548152602001600782015481526020016008820180548060200260200160405190810160405280929190818152602001828054801561165657602002820191905f5260205f20905b815481526020019060010190808311611642575b50505050508152505090505f61166b8361244d565b9150506040518060600160405280848152602001838152602001828460600151611695919061390e565b8152508685815181106116aa576116aa6139ce565b602002602001018190525050505080600101905061155a565b5050919050565b6116d261238a565b66b1a2bc2ec500008111156117345760405162461bcd60e51b815260206004820152602260248201527f4665652063616e6e6f742062652067726561746572207468616e206d61782066604482015261656560f01b60648201526084016107a2565b600b8190556040518181527f44f48e1b871e6db1e909a7b253b054b7150a0b4ddf4d59b159c827d82e7256709060200161076c565b5f805b82518110156118be575f838281518110611788576117886139ce565b6020908102919091018101515f818152600590925260409091208054919250906001600160a01b031633146117ff5760405162461bcd60e51b815260206004820152601c60248201527f53656e646572206d75737420626520746865206465706f7369746f720000000060448201526064016107a2565b5f8061180a8461244d565b9150915061181883836125e6565b808360050154611828919061390e565b611832908761390e565b955080836006015f8282546118479190613921565b9091555050825460058401546001600160a01b039091169085907fae1f357660ab777dcfd38c0ab6357834684ec26289ecfa07ec65dbf6c3c643129061188e90859061390e565b60405190815260200160405180910390a35f60058401556118af848461263e565b5050505080600101905061176c565b5060405163a9059cbb60e01b8152336004820152602481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063a9059cbb906044016020604051808303815f875af1158015611929573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061194d91906139af565b505050565b61195a61238a565b6119635f612728565b565b6060815167ffffffffffffffff811115611981576119816132a7565b6040519080825280602002602001820160405280156119ba57816020015b6119a7613096565b81526020019060019003908161199f5790505b5090505f5b8251811015611b28575f8382815181106119db576119db6139ce565b6020908102919091018101515f818152600583526040808220815160e08101835281546001600160a01b0316815282516060810190935293955091938301906001830160038282826020028201915b815481526020019060010190808311611a2a57505050505081526020016004820154815260200160058201548152602001600682015481526020016007820154815260200160088201805480602002602001604051908101604052809291908181526020018280548015611abb57602002820191905f5260205f20905b815481526020019060010190808311611aa7575b50505050508152505090505f611ad08361244d565b9150506040518060600160405280848152602001838152602001828460600151611afa919061390e565b815250858581518110611b0f57611b0f6139ce565b60200260200101819052505050508060010190506119bf565b50919050565b604080518082019091525f8152606060208201526001600160a01b0382165f90815260046020908152604091829020825180840184528154815260018201805485518186028101860190965280865291949293858101939290830182828015611bb457602002820191905f5260205f20905b815481526020019060010190808311611ba0575b5050505050815250509050919050565b611bcc61238a565b805f03611c255760405162461bcd60e51b815260206004820152602160248201527f4d6178206f6e2072616d7020616d6f756e742063616e6e6f74206265207a65726044820152606f60f81b60648201526084016107a2565b60088190556040518181527fcab6b49ca21dd111cf4a55d507bbe89dd12d69216e28247060d4b2163ca41b399060200161076c565b335f90815260046020526040902054611c855760405162461bcd60e51b81526004016107a2906138c3565b335f908152600460209081526040808320548084526003808452828520868652019092529091205460ff16611cf35760405162461bcd60e51b8152602060048201526014602482015273155cd95c881b9bdd081bdb8819195b9e5b1a5cdd60621b60448201526064016107a2565b5f8181526003602081815260408084208685528084018352908420805460ff191690559284905252611d289060020183612777565b60408051828152602081018490527f8935205b1b382095d2d95efbb36f81a11a34c548d45af26adc1a02d2f2bb546f910161089a565b611d666130bb565b5f82815260056020908152604091829020825160e08101845281546001600160a01b031681528351606081019485905290939192840191600184019060039082845b815481526020019060010190808311611da857505050505081526020016004820154815260200160058201548152602001600682015481526020016007820154815260200160088201805480602002602001604051908101604052809291908181526020018280548015611bb457602002820191905f5260205f2090815481526020019060010190808311611ba0575050505050815250509050919050565b611e4f61238a565b6001600160a01b038116611eb15760405162461bcd60e51b8152602060048201526024808201527f46656520726563697069656e742063616e6e6f74206265207a65726f206164646044820152637265737360e01b60648201526084016107a2565b600c80546001600160a01b0319166001600160a01b0383169081179091556040519081527f594ad6ee98bfc0c73e6d15fd4e762502f359e05d26907b7fa1ff82eb5e99f6e49060200161076c565b335f9081526004602052604090205415611f6b5760405162461bcd60e51b815260206004820152602760248201527f4163636f756e7420616c7265616479206173736f6369617465642077697468206044820152661d995b9b5bd25960ca1b60648201526084016107a2565b5f611f7885858585612896565b335f818152600460205260408082208490555192935083927f672144042732f7b1cdbf0772464ae545aedd7f41d38b8487dafd9085496a5d519190a35050505050565b5f818152600660209081526040808320815160a08101835281546001600160a01b039081168252600183015416938101939093526002810154918301919091526003810154606083015260040154608082018190529091036120575760405162461bcd60e51b8152602060048201526015602482015274125b9d195b9d08191bd95cc81b9bdd08195e1a5cdd605a1b60448201526064016107a2565b80516001600160a01b031633146120b05760405162461bcd60e51b815260206004820152601c60248201527f53656e646572206d75737420626520746865206f6e2d72616d7065720000000060448201526064016107a2565b6040808201515f9081526005602052206120ca8184612931565b8160600151816005015f8282546120e1919061390e565b909155505060608201516006820180545f906120fe908490613921565b9091555050505050565b5f805f61211787878787612a08565b9250925092506121278282612931565b8260600151826006015f82825461213e9190613921565b909155505082516001600160a01b03165f9081526004602090815260408083205483526003909152908190204260019091015583015161217e908361263e565b6121888184612d0e565b50505050505050565b60605f8267ffffffffffffffff8111156121ad576121ad6132a7565b6040519080825280602002602001820160405280156121e657816020015b6121d3613102565b8152602001906001900390816121cb5790505b5090505f5b838110156122b1575f60065f878785818110612209576122096139ce565b602090810292909201358352508181019290925260409081015f908120825160a08101845281546001600160a01b03908116825260018301548116828701526002830154828601526003830154606083015260049283015460808301528451808601865282815282519091168452918552929091205492810192909252845190925084908490811061229d5761229d6139ce565b6020908102919091010152506001016121eb565b5090505b92915050565b6122c361238a565b600180546001600160a01b0319166001600160a01b0383169081179091556040519081527f73d3ac111d5926fbfd68ade03832f0b1a4daef0cd0effc1fa0829264bcc57c419060200161076c565b61231961238a565b6001600160a01b03811661237e5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016107a2565b61238781612728565b50565b5f546001600160a01b031633146119635760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107a2565b60408051602081018490529081018290524260608201525f90819060800160408051601f19818403018152919052805160209091012090506124457f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001826139e2565b949350505050565b5f81815260056020908152604080832060080180548251818502810185019093528083526060949384939291908301828280156124a757602002820191905f5260205f20905b815481526020019060010190808311612493575b50505050509050805167ffffffffffffffff8111156124c8576124c86132a7565b6040519080825280602002602001820160405280156124f1578160200160208202803683370190505b5092505f5b81518110156125df575f60065f848481518110612515576125156139ce565b60209081029190910181015182528181019290925260409081015f20815160a08101835281546001600160a01b03908116825260018301541693810193909352600281015491830191909152600381015460608301526004015460808201819052600a5491925042916125879161390e565b10156125d65782828151811061259f5761259f6139ce565b60200260200101518583815181106125b9576125b96139ce565b602090810291909101015260608101516125d3908561390e565b93505b506001016124f6565b5050915091565b5f5b815181101561194d575f801b828281518110612606576126066139ce565b6020026020010151146126365761263683838381518110612629576126296139ce565b6020026020010151612931565b6001016125e8565b5f81600501548260060154612653919061390e565b9050805f0361194d5781546001600160a01b03165f9081526004602052604090206126819060010184612ee3565b8154604080518581526001600160a01b0390921660208301527f8ac07cc6e38c6222dd0309c80353c1962354bacf222b825d7401cc80e93ff3cc910160405180910390a15f83815260056020526040812080546001600160a01b031916815560018101829055600281018290556003810182905590600482015f9055600582015f9055600682015f9055600782015f9055600882015f6127219190613121565b5050505050565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f806127d0848054806020026020016040519081016040528092919081815260200182805480156127c557602002820191905f5260205f20905b8154815260200190600101908083116127b1575b505050505084612f85565b91509150806128195760405162461bcd60e51b8152602060048201526015602482015274313cba32b99999103737ba1034b71030b93930bc9760591b60448201526064016107a2565b83545f9061282990600190613921565b905080831461286b57848181548110612844576128446139ce565b905f5260205f20015485848154811061285f5761285f6139ce565b5f918252602090912001555b8480548061287b5761287b6139f5565b600190038181905f5260205f20015f90559055505b50505050565b6001546040805160808101825286815260208101869052808201859052606081018490529051630be4767960e11b81525f9283926001600160a01b03909116916317c8ecf2916128e891600401613a58565b602060405180830381865afa158015612903573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906129279190613942565b9695505050505050565b5f818152600660208181526040808420815160a08101835281546001600160a01b039081168083526001840180549092168387015260028401805484870152600380860180546060870152600480880180546080890152948c528952878b20548b529088529589208990558989529690955282546001600160a01b0319908116909355805490921690915592849055839055919091556129d46008840183612777565b604080820151905183907fe8a865b4bab023c399cbd1f2cdd0df2199beb6e5012a4bd2d7691cf7e4199d5a905f90a3505050565b612a1061313c565b60025460408051608081018252878152602081018790528082018690526060810185905290516347f055c760e11b81525f928392839283928392839283926001600160a01b031691638fe0ab8e91612a6b9190600401613ac5565b60a0604051808303815f875af1158015612a87573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612aab9190613b28565b5f818152600660209081526040808320815160a08101835281546001600160a01b03908116825260018301548116828601526002830154828501819052600384015460608401526004909301546080830152918552600590935292208151979c50959a509398509196509450909216612b5e5760405162461bcd60e51b8152602060048201526015602482015274125b9d195b9d08191bd95cc81b9bdd08195e1a5cdd605a1b60448201526064016107a2565b8582608001511115612bbd5760405162461bcd60e51b815260206004820152602260248201527f496e74656e7420776173206e6f742063726561746564206265666f72652073656044820152611b9960f21b60648201526084016107a2565b80546001600160a01b03165f908152600460205260409020548514612c245760405162461bcd60e51b815260206004820152601b60248201527f4f666672616d70657220696420646f6573206e6f74206d61746368000000000060448201526064016107a2565b81516001600160a01b03165f908152600460205260409020548414612c8b5760405162461bcd60e51b815260206004820152601a60248201527f4f6e72616d70657220696420646f6573206e6f74206d6174636800000000000060448201526064016107a2565b8060070154670de0b6b3a76400008360600151612ca89190613959565b612cb29190613984565b871015612cfa5760405162461bcd60e51b81526020600482015260166024820152750a0c2f2dacadce840eec2e640dcdee840cadcdeeaced60531b60448201526064016107a2565b909d909c50909a5098505050505050505050565b5f600b545f14612dd557670de0b6b3a7640000600b548360600151612d339190613959565b612d3d9190613984565b600c5460405163a9059cbb60e01b81526001600160a01b039182166004820152602481018390529192507f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906044016020604051808303815f875af1158015612daf573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612dd391906139af565b505b5f818360600151612de69190613921565b602084015160405163a9059cbb60e01b81526001600160a01b039182166004820152602481018390529192507f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906044016020604051808303815f875af1158015612e5a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612e7e91906139af565b50825160408085015160208087015183516001600160a01b03918216815291820186905292810186905291909216919086907ffa03438194e61c243c6bb5349f1e1dc674431b86f119b5e3b2b327bc43446bce9060600160405180910390a450505050565b5f80612f3c84805480602002602001604051908101604052809291908181526020018280548015612f3157602002820191905f5260205f20905b815481526020019060010190808311612f1d575b505050505084612fdb565b91509150806128195760405162461bcd60e51b81526020600482015260156024820152743ab4b73a191a9b103737ba1034b71030b93930bc9760591b60448201526064016107a2565b81515f908190815b81811015612fca5784868281518110612fa857612fa86139ce565b602002602001015103612fc257925060019150612fd49050565b600101612f8d565b505f195f92509250505b9250929050565b81515f908190815b81811015612fca5784868281518110612ffe57612ffe6139ce565b60200260200101510361301857925060019150612fd49050565b600101612fe3565b826003810192821561304e579160200282015b8281111561304e578251825591602001919060010190613033565b5061305a929150613178565b5090565b828054828255905f5260205f2090810192821561304e579160200282018281111561304e578251825591602001919060010190613033565b60405180606001604052805f81526020016130af6130bb565b81526020015f81525090565b6040518060e001604052805f6001600160a01b031681526020016130dd61318c565b81526020015f81526020015f81526020015f81526020015f8152602001606081525090565b604051806040016040528061311561313c565b81525f60209091015290565b5080545f8255905f5260205f20908101906123879190613178565b6040518060a001604052805f6001600160a01b031681526020015f6001600160a01b031681526020015f81526020015f81526020015f81525090565b5b8082111561305a575f8155600101613179565b60405180606001604052806003906020820280368337509192915050565b6001600160a01b0381168114612387575f80fd5b5f602082840312156131ce575f80fd5b81356131d9816131aa565b9392505050565b5f602082840312156131f0575f80fd5b5035919050565b5f805f60608486031215613209575f80fd5b83359250602084013591506040840135613222816131aa565b809150509250925092565b602080825282518282018190525f9190848201906040850190845b8181101561326457835183529284019291840191600101613248565b50909695505050505050565b5f8060408385031215613281575f80fd5b823561328c816131aa565b9150602083013561329c816131aa565b809150509250929050565b634e487b7160e01b5f52604160045260245ffd5b6040805190810167ffffffffffffffff811182821017156132de576132de6132a7565b60405290565b604051601f8201601f1916810167ffffffffffffffff8111828210171561330d5761330d6132a7565b604052919050565b5f805f60a08486031215613327575f80fd5b84601f850112613335575f80fd5b6040516060810181811067ffffffffffffffff82111715613358576133586132a7565b60405280606086018781111561336c575f80fd5b865b8181101561338657803583526020928301920161336e565b5091979135965050608094909401359392505050565b805f5b600381101561289057815184526020938401939091019060010161339f565b5f61012080840160018060a01b0384511685526020808501516133e4602088018261339c565b5060408501516080870152606085015160a0870152608085015160c087015260a085015160e087015260c0850151836101008801528293508051808452610140880194506020820193505f91505b808210156134525783518552938201939282019260019190910190613432565b50929695505050505050565b5f60208083018184528085518083526040925060408601915060408160051b8701018488015f5b838110156134d157603f19898403018552815160608151855288820151818a8701526134b3828701826133be565b92890151958901959095525094870194925090860190600101613485565b509098975050505050505050565b5f60208083850312156134f0575f80fd5b823567ffffffffffffffff80821115613507575f80fd5b818501915085601f83011261351a575f80fd5b81358181111561352c5761352c6132a7565b8060051b915061353d8483016132e4565b8181529183018401918481019088841115613556575f80fd5b938501935b838510156135745784358252938501939085019061355b565b98975050505050505050565b6020808252825182820152828101516040808401528051606084018190525f9291820190839060808601905b808310156135cc57835182529284019260019290920191908401906135ac565b509695505050505050565b602081525f6131d960208301846133be565b5f82601f8301126135f8575f80fd5b6136006132bb565b806040840185811115613611575f80fd5b845b8181101561362b578035845260209384019301613613565b509095945050505050565b5f82601f830112613645575f80fd5b61364d6132bb565b80608084018581111561365e575f80fd5b845b8181101561362b5761367287826135e9565b8452602090930192604001613660565b5f805f806101a0808688031215613697575f80fd5b6136a187876135e9565b94506136b08760408801613636565b93506136bf8760c088016135e9565b92508661011f8701126136d0575f80fd5b60405160a0810181811067ffffffffffffffff821117156136f3576136f36132a7565b604052908601908088831115613707575f80fd5b61010088015b8381101561372557803582526020918201910161370d565b5050809250505092959194509250565b5f805f8061028080868803121561374a575f80fd5b61375487876135e9565b94506137638760408801613636565b93506137728760c088016135e9565b92508661011f870112613783575f80fd5b604051610180810181811067ffffffffffffffff821117156136f3576136f36132a7565b5f80602083850312156137b8575f80fd5b823567ffffffffffffffff808211156137cf575f80fd5b818501915085601f8301126137e2575f80fd5b8135818111156137f0575f80fd5b8660208260051b8501011115613804575f80fd5b60209290920196919550909350505050565b602080825282518282018190525f919060409081850190868401855b8281101561388c578151805180516001600160a01b0390811687528882015116888701528681015187870152606080820151908701526080908101519086015286015160a085015260c09093019290850190600101613832565b5091979650505050505050565b5f80604083850312156138aa575f80fd5b82356138b5816131aa565b946020939093013593505050565b6020808252601e908201527f43616c6c6572206d757374206265207265676973746572656420757365720000604082015260600190565b634e487b7160e01b5f52601160045260245ffd5b808201808211156122b5576122b56138fa565b818103818111156122b5576122b56138fa565b606081016122b5828461339c565b5f60208284031215613952575f80fd5b5051919050565b80820281158282048414176122b5576122b56138fa565b634e487b7160e01b5f52601260045260245ffd5b5f8261399257613992613970565b500490565b5f600182016139a8576139a86138fa565b5060010190565b5f602082840312156139bf575f80fd5b815180151581146131d9575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f826139f0576139f0613970565b500690565b634e487b7160e01b5f52603160045260245ffd5b805f5b6002811015612890578151845260209384019390910190600101613a0c565b805f5b600281101561289057613a42848351613a09565b6040939093019260209190910190600101613a2e565b5f6101a082019050613a6b828451613a09565b602080840151613a7e6040850182613a2b565b506040840151613a9160c0850182613a09565b50606084015161010084015f5b6005811015613abb57825182529183019190830190600101613a9e565b5050505092915050565b5f61028082019050613ad8828451613a09565b602080840151613aeb6040850182613a2b565b506040840151613afe60c0850182613a09565b50606084015161010084015f5b600c811015613abb57825182529183019190830190600101613b0b565b5f805f805f60a08688031215613b3c575f80fd5b505083516020850151604086015160608701516080909701519298919750959450909250905056fea2646970667358221220815393abb3a4eb1674544182ab9554bb2f00aea3631e73303e65e6cdb62c2c3764736f6c63430008180033", + "deployedBytecode": "0x608060405234801561000f575f80fd5b5060043610610255575f3560e01c80638da5cb5b11610140578063d55f960d116100bf578063ecb3dc8811610084578063ecb3dc8814610662578063ecd618f01461066b578063ed1692b81461068b578063eea1d1971461069e578063f2fde38b146106b1578063fbf15b1f146106c4575f80fd5b8063d55f960d1461060d578063d9478d2014610620578063da26c18914610633578063e215ad5914610646578063e279d96414610659575f80fd5b8063a1a954b711610105578063a1a954b71461053f578063b02c43d014610548578063b3fa4c01146105c0578063c62b919e146105d3578063ce523ca3146105fa575f80fd5b80638da5cb5b1461046e5780639021578a1461047e5780639087beff146104f95780639b357b5a1461050c5780639f9fb9681461051f575f80fd5b80634595bba0116101d75780635dd765151161019c5780635dd7651514610404578063645006ca146104175780637113476214610420578063715018a61461043357806371a28f691461043b5780637b510fe81461044e575f80fd5b80634595bba014610395578063485cc955146103b55780634877b7b6146103c8578063495223e7146103db5780635081d952146103e4575f80fd5b80632a80cda31161021d5780632a80cda31461030a578063317dcc961461031d5780633adba28a146103305780633e413bee146103435780634298734914610382575f80fd5b80630f1ef98c14610259578063123a11e4146102a4578063133de6cb146102d9578063148172da146102ee578063238c849414610301575b5f80fd5b6102916102673660046131be565b6001600160a01b03165f908152600460209081526040808320548352600390915290206001015490565b6040519081526020015b60405180910390f35b6102916102b23660046131be565b6001600160a01b03165f908152600460209081526040808320548352600390915290205490565b6102ec6102e73660046131be565b61071a565b005b6102ec6102fc3660046131e0565b610777565b610291600b5481565b6102ec6103183660046131e0565b6108a6565b6102ec61032b3660046131e0565b610932565b6102ec61033e3660046131f7565b61096f565b61036a7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161029b565b6102ec6103903660046131e0565b610eb8565b6103a86103a33660046131be565b610f58565b60405161029b919061322d565b6102ec6103c3366004613270565b610fce565b6102ec6103d6366004613315565b611061565b61029160095481565b6103f76103f23660046131be565b61149c565b60405161029b919061345e565b6102ec6104123660046131e0565b6116ca565b61029160075481565b6102ec61042e3660046134df565b611769565b6102ec611952565b6103f76104493660046134df565b611965565b61046161045c3660046131be565b611b2e565b60405161029b9190613580565b5f546001600160a01b031661036a565b6104c661048c3660046131e0565b60066020525f9081526040902080546001820154600283015460038401546004909401546001600160a01b03938416949390921692909185565b604080516001600160a01b039687168152959094166020860152928401919091526060830152608082015260a00161029b565b6102ec6105073660046131e0565b611bc4565b6102ec61051a3660046131e0565b611c5a565b61053261052d3660046131e0565b611d5e565b60405161029b91906135d7565b610291600a5481565b61058e6105563660046131e0565b600560208190525f9182526040909120805460048201549282015460068301546007909301546001600160a01b039092169392909185565b604080516001600160a01b0390961686526020860194909452928401919091526060830152608082015260a00161029b565b6102ec6105ce3660046131be565b611e47565b61036a7f000000000000000000000000000000000000000000000000000000000000000081565b6102ec610608366004613682565b611eff565b6102ec61061b3660046131e0565b611fbb565b600c5461036a906001600160a01b031681565b6102ec610641366004613735565b612108565b60015461036a906001600160a01b031681565b61029160085481565b610291600d5481565b61067e6106793660046137a7565b612191565b60405161029b9190613816565b6102ec6106993660046131be565b6122bb565b60025461036a906001600160a01b031681565b6102ec6106bf3660046131be565b612311565b61070a6106d2366004613899565b6001600160a01b0382165f90815260046020908152604080832054835260038083528184208585520190915290205460ff1692915050565b604051901515815260200161029b565b61072261238a565b600280546001600160a01b0319166001600160a01b0383169081179091556040519081527f6e7665a41605edc0d70f4b991d652755f380754eb092d81ef9ab93664778d59e906020015b60405180910390a150565b335f908152600460205260409020546107ab5760405162461bcd60e51b81526004016107a2906138c3565b60405180910390fd5b335f908152600460209081526040808320548084526003808452828520868652019092529091205460ff16156108235760405162461bcd60e51b815260206004820152601860248201527f5573657220616c7265616479206f6e2064656e796c697374000000000000000060448201526064016107a2565b5f8181526003602081815260408084208685528084018352818520805460ff19166001908117909155938352600201805493840181558452922001839055517f976c693d56f27ba17d902bda80c4fa0416b773fbf268bcb0ee71689234d769ee9061089a9083908590918252602082015260400190565b60405180910390a15050565b6108ae61238a565b805f036108fd5760405162461bcd60e51b815260206004820152601e60248201527f4d696e696d756d206465706f7369742063616e6e6f74206265207a65726f000060448201526064016107a2565b60078190556040518181527fbdde72a6d8d8b42770c9899945ccdce09d0c5c794d3326cdb2d2cca61b12a9fc9060200161076c565b61093a61238a565b60098190556040518181527f88397975d177ce5e18abf3a5fdb8de773e80673d85eeb54f48cfaf688b3d2c3e9060200161076c565b335f9081526004602052604090205461099a5760405162461bcd60e51b81526004016107a2906138c3565b335f908152600460208181526040808420548785526005835281852080546001600160a01b031686529383528185205480865260038085528387208388520190935293205460ff1615610a2f5760405162461bcd60e51b815260206004820181905260248201527f4f6e72616d706572206f6e206465706f7369746f7227732064656e796c69737460448201526064016107a2565b6009545f848152600360205260409020600101544291610a4e9161390e565b1115610aa85760405162461bcd60e51b8152602060048201526024808201527f4f6e2072616d7020636f6f6c20646f776e20706572696f64206e6f7420656c616044820152631c1cd95960e21b60648201526084016107a2565b5f8381526003602052604090205415610b035760405162461bcd60e51b815260206004820152601860248201527f496e74656e74207374696c6c206f75747374616e64696e67000000000000000060448201526064016107a2565b828103610b525760405162461bcd60e51b815260206004820152601e60248201527f53656e6465722063616e6e6f7420626520746865206465706f7369746f72000060448201526064016107a2565b81546001600160a01b0316610ba25760405162461bcd60e51b815260206004820152601660248201527511195c1bdcda5d08191bd95cc81b9bdd08195e1a5cdd60521b60448201526064016107a2565b5f8511610c005760405162461bcd60e51b815260206004820152602660248201527f5369676e616c656420616d6f756e74206d75737420626520677265617465722060448201526507468616e20360d41b60648201526084016107a2565b600854851115610c6f5760405162461bcd60e51b815260206004820152603460248201527f5369676e616c656420616d6f756e74206d757374206265206c657373207468616044820152731b881b585e081bdb8b5c985b5c08185b5bdd5b9d60621b60648201526084016107a2565b6001600160a01b038416610cc55760405162461bcd60e51b815260206004820152601b60248201527f43616e6e6f742073656e6420746f207a65726f2061646472657373000000000060448201526064016107a2565b5f610cd084886123e3565b90508583600501541015610d82575f80610ce98961244d565b9150915087818660050154610cfe919061390e565b1015610d435760405162461bcd60e51b81526020600482015260146024820152734e6f7420656e6f756768206c697175696469747960601b60448201526064016107a2565b610d4d85836125e6565b80856005015f828254610d60919061390e565b9250508190555080856006015f828254610d7a9190613921565b909155505050505b6040805160a0810182523381526001600160a01b0387811660208084019182528385018c8152606085018c815242608087019081525f89815260068552888120975188549088166001600160a01b0319918216178955955160018901805491909816961695909517909555905160028601555160038086019190915592516004909401939093558781529152908120829055600584018054889290610e28908490613921565b9250508190555085836006015f828254610e42919061390e565b90915550506008830180546001810182555f91825260209182902001829055604080516001600160a01b038816815291820188905242908201528490889083907f1a1292e170a0f000ccf956afba79bee0f9ec1d81f3f901c1d4d11e1f336aae109060600160405180910390a450505050505050565b610ec061238a565b805f03610f235760405162461bcd60e51b815260206004820152602b60248201527f4d617820696e74656e742065787069726174696f6e20706572696f642063616e60448201526a6e6f74206265207a65726f60a81b60648201526084016107a2565b600a8190556040518181527f55e3f6b95de9a0ec782f892e93fafe4e56be0696df204ddf8e0a40a9a713a8039060200161076c565b6001600160a01b0381165f9081526004602090815260408083205483526003825291829020600201805483518184028101840190945280845260609392830182828015610fc257602002820191905f5260205f20905b815481526020019060010190808311610fae575b50505050509050919050565b610fd661238a565b600254600160a01b900460ff16156110265760405162461bcd60e51b8152602060048201526013602482015272105b1c9958591e481a5b9a5d1a585b1a5e9959606a1b60448201526064016107a2565b600180546001600160a01b039384166001600160a01b0319909116179055600280546001600160a81b0319169190921617600160a01b179055565b335f9081526004602052604090205461108c5760405162461bcd60e51b81526004016107a2906138c3565b6040516304b98e1d60e31b81525f906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906325cc70e8906110da908790600401613934565b602060405180830381865afa1580156110f5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111199190613942565b335f9081526004602052604090205490915081146111795760405162461bcd60e51b815260206004820181905260248201527f53656e646572206d75737420626520746865206163636f756e74206f776e657260448201526064016107a2565b335f908152600460205260409020600101546005116111da5760405162461bcd60e51b815260206004820152601e60248201527f4d6178696d756d206465706f73697420616d6f756e742072656163686564000060448201526064016107a2565b60075483101561124b5760405162461bcd60e51b815260206004820152603660248201527f4465706f73697420616d6f756e74206d757374206265206772656174657220746044820152751a185b881b5a5b8819195c1bdcda5d08185b5bdd5b9d60521b60648201526084016107a2565b5f82116112a85760405162461bcd60e51b815260206004820152602560248201527f5265636569766520616d6f756e74206d75737420626520677265617465722074604482015264068616e20360dc1b60648201526084016107a2565b5f826112bc670de0b6b3a764000086613959565b6112c69190613984565b600d80549192505f9190826112da83613997565b90915550335f81815260046020908152604080832060019081018054808301825590855283852001869055815160e0810183529485528483018c81528583018c9052606086018c90526080860185905260a086018990528251858152808501845260c087015286855260059093529220835181546001600160a01b0319166001600160a01b039091161781559051939450919261137b918301906003613020565b5060408201516004820155606082015160058201556080820151600682015560a0820151600782015560c082015180516113bf91600884019160209091019061305e565b50506040516323b872dd60e01b8152336004820152306024820152604481018790527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031691506323b872dd906064016020604051808303815f875af1158015611432573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061145691906139af565b506040805186815260208101849052849183917f36b046df2c296f2a5a78570d5e52a92773cbb616825b1af59a49a4d02df2b109910160405180910390a3505050505050565b6001600160a01b0381165f9081526004602090815260408083206001018054825181850281018501909352808352606094938301828280156114fb57602002820191905f5260205f20905b8154815260200190600101908083116114e7575b50505050509050805167ffffffffffffffff81111561151c5761151c6132a7565b60405190808252806020026020018201604052801561155557816020015b611542613096565b81526020019060019003908161153a5790505b5091505f5b81518110156116c3575f828281518110611576576115766139ce565b6020908102919091018101515f818152600583526040808220815160e08101835281546001600160a01b0316815282516060810190935293955091938301906001830160038282826020028201915b8154815260200190600101908083116115c55750505050508152602001600482015481526020016005820154815260200160068201548152602001600782015481526020016008820180548060200260200160405190810160405280929190818152602001828054801561165657602002820191905f5260205f20905b815481526020019060010190808311611642575b50505050508152505090505f61166b8361244d565b9150506040518060600160405280848152602001838152602001828460600151611695919061390e565b8152508685815181106116aa576116aa6139ce565b602002602001018190525050505080600101905061155a565b5050919050565b6116d261238a565b66b1a2bc2ec500008111156117345760405162461bcd60e51b815260206004820152602260248201527f4665652063616e6e6f742062652067726561746572207468616e206d61782066604482015261656560f01b60648201526084016107a2565b600b8190556040518181527f44f48e1b871e6db1e909a7b253b054b7150a0b4ddf4d59b159c827d82e7256709060200161076c565b5f805b82518110156118be575f838281518110611788576117886139ce565b6020908102919091018101515f818152600590925260409091208054919250906001600160a01b031633146117ff5760405162461bcd60e51b815260206004820152601c60248201527f53656e646572206d75737420626520746865206465706f7369746f720000000060448201526064016107a2565b5f8061180a8461244d565b9150915061181883836125e6565b808360050154611828919061390e565b611832908761390e565b955080836006015f8282546118479190613921565b9091555050825460058401546001600160a01b039091169085907fae1f357660ab777dcfd38c0ab6357834684ec26289ecfa07ec65dbf6c3c643129061188e90859061390e565b60405190815260200160405180910390a35f60058401556118af848461263e565b5050505080600101905061176c565b5060405163a9059cbb60e01b8152336004820152602481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063a9059cbb906044016020604051808303815f875af1158015611929573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061194d91906139af565b505050565b61195a61238a565b6119635f612728565b565b6060815167ffffffffffffffff811115611981576119816132a7565b6040519080825280602002602001820160405280156119ba57816020015b6119a7613096565b81526020019060019003908161199f5790505b5090505f5b8251811015611b28575f8382815181106119db576119db6139ce565b6020908102919091018101515f818152600583526040808220815160e08101835281546001600160a01b0316815282516060810190935293955091938301906001830160038282826020028201915b815481526020019060010190808311611a2a57505050505081526020016004820154815260200160058201548152602001600682015481526020016007820154815260200160088201805480602002602001604051908101604052809291908181526020018280548015611abb57602002820191905f5260205f20905b815481526020019060010190808311611aa7575b50505050508152505090505f611ad08361244d565b9150506040518060600160405280848152602001838152602001828460600151611afa919061390e565b815250858581518110611b0f57611b0f6139ce565b60200260200101819052505050508060010190506119bf565b50919050565b604080518082019091525f8152606060208201526001600160a01b0382165f90815260046020908152604091829020825180840184528154815260018201805485518186028101860190965280865291949293858101939290830182828015611bb457602002820191905f5260205f20905b815481526020019060010190808311611ba0575b5050505050815250509050919050565b611bcc61238a565b805f03611c255760405162461bcd60e51b815260206004820152602160248201527f4d6178206f6e2072616d7020616d6f756e742063616e6e6f74206265207a65726044820152606f60f81b60648201526084016107a2565b60088190556040518181527fcab6b49ca21dd111cf4a55d507bbe89dd12d69216e28247060d4b2163ca41b399060200161076c565b335f90815260046020526040902054611c855760405162461bcd60e51b81526004016107a2906138c3565b335f908152600460209081526040808320548084526003808452828520868652019092529091205460ff16611cf35760405162461bcd60e51b8152602060048201526014602482015273155cd95c881b9bdd081bdb8819195b9e5b1a5cdd60621b60448201526064016107a2565b5f8181526003602081815260408084208685528084018352908420805460ff191690559284905252611d289060020183612777565b60408051828152602081018490527f8935205b1b382095d2d95efbb36f81a11a34c548d45af26adc1a02d2f2bb546f910161089a565b611d666130bb565b5f82815260056020908152604091829020825160e08101845281546001600160a01b031681528351606081019485905290939192840191600184019060039082845b815481526020019060010190808311611da857505050505081526020016004820154815260200160058201548152602001600682015481526020016007820154815260200160088201805480602002602001604051908101604052809291908181526020018280548015611bb457602002820191905f5260205f2090815481526020019060010190808311611ba0575050505050815250509050919050565b611e4f61238a565b6001600160a01b038116611eb15760405162461bcd60e51b8152602060048201526024808201527f46656520726563697069656e742063616e6e6f74206265207a65726f206164646044820152637265737360e01b60648201526084016107a2565b600c80546001600160a01b0319166001600160a01b0383169081179091556040519081527f594ad6ee98bfc0c73e6d15fd4e762502f359e05d26907b7fa1ff82eb5e99f6e49060200161076c565b335f9081526004602052604090205415611f6b5760405162461bcd60e51b815260206004820152602760248201527f4163636f756e7420616c7265616479206173736f6369617465642077697468206044820152661d995b9b5bd25960ca1b60648201526084016107a2565b5f611f7885858585612896565b335f818152600460205260408082208490555192935083927f672144042732f7b1cdbf0772464ae545aedd7f41d38b8487dafd9085496a5d519190a35050505050565b5f818152600660209081526040808320815160a08101835281546001600160a01b039081168252600183015416938101939093526002810154918301919091526003810154606083015260040154608082018190529091036120575760405162461bcd60e51b8152602060048201526015602482015274125b9d195b9d08191bd95cc81b9bdd08195e1a5cdd605a1b60448201526064016107a2565b80516001600160a01b031633146120b05760405162461bcd60e51b815260206004820152601c60248201527f53656e646572206d75737420626520746865206f6e2d72616d7065720000000060448201526064016107a2565b6040808201515f9081526005602052206120ca8184612931565b8160600151816005015f8282546120e1919061390e565b909155505060608201516006820180545f906120fe908490613921565b9091555050505050565b5f805f61211787878787612a08565b9250925092506121278282612931565b8260600151826006015f82825461213e9190613921565b909155505082516001600160a01b03165f9081526004602090815260408083205483526003909152908190204260019091015583015161217e908361263e565b6121888184612d0e565b50505050505050565b60605f8267ffffffffffffffff8111156121ad576121ad6132a7565b6040519080825280602002602001820160405280156121e657816020015b6121d3613102565b8152602001906001900390816121cb5790505b5090505f5b838110156122b1575f60065f878785818110612209576122096139ce565b602090810292909201358352508181019290925260409081015f908120825160a08101845281546001600160a01b03908116825260018301548116828701526002830154828601526003830154606083015260049283015460808301528451808601865282815282519091168452918552929091205492810192909252845190925084908490811061229d5761229d6139ce565b6020908102919091010152506001016121eb565b5090505b92915050565b6122c361238a565b600180546001600160a01b0319166001600160a01b0383169081179091556040519081527f73d3ac111d5926fbfd68ade03832f0b1a4daef0cd0effc1fa0829264bcc57c419060200161076c565b61231961238a565b6001600160a01b03811661237e5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016107a2565b61238781612728565b50565b5f546001600160a01b031633146119635760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107a2565b60408051602081018490529081018290524260608201525f90819060800160408051601f19818403018152919052805160209091012090506124457f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001826139e2565b949350505050565b5f81815260056020908152604080832060080180548251818502810185019093528083526060949384939291908301828280156124a757602002820191905f5260205f20905b815481526020019060010190808311612493575b50505050509050805167ffffffffffffffff8111156124c8576124c86132a7565b6040519080825280602002602001820160405280156124f1578160200160208202803683370190505b5092505f5b81518110156125df575f60065f848481518110612515576125156139ce565b60209081029190910181015182528181019290925260409081015f20815160a08101835281546001600160a01b03908116825260018301541693810193909352600281015491830191909152600381015460608301526004015460808201819052600a5491925042916125879161390e565b10156125d65782828151811061259f5761259f6139ce565b60200260200101518583815181106125b9576125b96139ce565b602090810291909101015260608101516125d3908561390e565b93505b506001016124f6565b5050915091565b5f5b815181101561194d575f801b828281518110612606576126066139ce565b6020026020010151146126365761263683838381518110612629576126296139ce565b6020026020010151612931565b6001016125e8565b5f81600501548260060154612653919061390e565b9050805f0361194d5781546001600160a01b03165f9081526004602052604090206126819060010184612ee3565b8154604080518581526001600160a01b0390921660208301527f8ac07cc6e38c6222dd0309c80353c1962354bacf222b825d7401cc80e93ff3cc910160405180910390a15f83815260056020526040812080546001600160a01b031916815560018101829055600281018290556003810182905590600482015f9055600582015f9055600682015f9055600782015f9055600882015f6127219190613121565b5050505050565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f806127d0848054806020026020016040519081016040528092919081815260200182805480156127c557602002820191905f5260205f20905b8154815260200190600101908083116127b1575b505050505084612f85565b91509150806128195760405162461bcd60e51b8152602060048201526015602482015274313cba32b99999103737ba1034b71030b93930bc9760591b60448201526064016107a2565b83545f9061282990600190613921565b905080831461286b57848181548110612844576128446139ce565b905f5260205f20015485848154811061285f5761285f6139ce565b5f918252602090912001555b8480548061287b5761287b6139f5565b600190038181905f5260205f20015f90559055505b50505050565b6001546040805160808101825286815260208101869052808201859052606081018490529051630be4767960e11b81525f9283926001600160a01b03909116916317c8ecf2916128e891600401613a58565b602060405180830381865afa158015612903573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906129279190613942565b9695505050505050565b5f818152600660208181526040808420815160a08101835281546001600160a01b039081168083526001840180549092168387015260028401805484870152600380860180546060870152600480880180546080890152948c528952878b20548b529088529589208990558989529690955282546001600160a01b0319908116909355805490921690915592849055839055919091556129d46008840183612777565b604080820151905183907fe8a865b4bab023c399cbd1f2cdd0df2199beb6e5012a4bd2d7691cf7e4199d5a905f90a3505050565b612a1061313c565b60025460408051608081018252878152602081018790528082018690526060810185905290516347f055c760e11b81525f928392839283928392839283926001600160a01b031691638fe0ab8e91612a6b9190600401613ac5565b60a0604051808303815f875af1158015612a87573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612aab9190613b28565b5f818152600660209081526040808320815160a08101835281546001600160a01b03908116825260018301548116828601526002830154828501819052600384015460608401526004909301546080830152918552600590935292208151979c50959a509398509196509450909216612b5e5760405162461bcd60e51b8152602060048201526015602482015274125b9d195b9d08191bd95cc81b9bdd08195e1a5cdd605a1b60448201526064016107a2565b8582608001511115612bbd5760405162461bcd60e51b815260206004820152602260248201527f496e74656e7420776173206e6f742063726561746564206265666f72652073656044820152611b9960f21b60648201526084016107a2565b80546001600160a01b03165f908152600460205260409020548514612c245760405162461bcd60e51b815260206004820152601b60248201527f4f666672616d70657220696420646f6573206e6f74206d61746368000000000060448201526064016107a2565b81516001600160a01b03165f908152600460205260409020548414612c8b5760405162461bcd60e51b815260206004820152601a60248201527f4f6e72616d70657220696420646f6573206e6f74206d6174636800000000000060448201526064016107a2565b8060070154670de0b6b3a76400008360600151612ca89190613959565b612cb29190613984565b871015612cfa5760405162461bcd60e51b81526020600482015260166024820152750a0c2f2dacadce840eec2e640dcdee840cadcdeeaced60531b60448201526064016107a2565b909d909c50909a5098505050505050505050565b5f600b545f14612dd557670de0b6b3a7640000600b548360600151612d339190613959565b612d3d9190613984565b600c5460405163a9059cbb60e01b81526001600160a01b039182166004820152602481018390529192507f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906044016020604051808303815f875af1158015612daf573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612dd391906139af565b505b5f818360600151612de69190613921565b602084015160405163a9059cbb60e01b81526001600160a01b039182166004820152602481018390529192507f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906044016020604051808303815f875af1158015612e5a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612e7e91906139af565b50825160408085015160208087015183516001600160a01b03918216815291820186905292810186905291909216919086907ffa03438194e61c243c6bb5349f1e1dc674431b86f119b5e3b2b327bc43446bce9060600160405180910390a450505050565b5f80612f3c84805480602002602001604051908101604052809291908181526020018280548015612f3157602002820191905f5260205f20905b815481526020019060010190808311612f1d575b505050505084612fdb565b91509150806128195760405162461bcd60e51b81526020600482015260156024820152743ab4b73a191a9b103737ba1034b71030b93930bc9760591b60448201526064016107a2565b81515f908190815b81811015612fca5784868281518110612fa857612fa86139ce565b602002602001015103612fc257925060019150612fd49050565b600101612f8d565b505f195f92509250505b9250929050565b81515f908190815b81811015612fca5784868281518110612ffe57612ffe6139ce565b60200260200101510361301857925060019150612fd49050565b600101612fe3565b826003810192821561304e579160200282015b8281111561304e578251825591602001919060010190613033565b5061305a929150613178565b5090565b828054828255905f5260205f2090810192821561304e579160200282018281111561304e578251825591602001919060010190613033565b60405180606001604052805f81526020016130af6130bb565b81526020015f81525090565b6040518060e001604052805f6001600160a01b031681526020016130dd61318c565b81526020015f81526020015f81526020015f81526020015f8152602001606081525090565b604051806040016040528061311561313c565b81525f60209091015290565b5080545f8255905f5260205f20908101906123879190613178565b6040518060a001604052805f6001600160a01b031681526020015f6001600160a01b031681526020015f81526020015f81526020015f81525090565b5b8082111561305a575f8155600101613179565b60405180606001604052806003906020820280368337509192915050565b6001600160a01b0381168114612387575f80fd5b5f602082840312156131ce575f80fd5b81356131d9816131aa565b9392505050565b5f602082840312156131f0575f80fd5b5035919050565b5f805f60608486031215613209575f80fd5b83359250602084013591506040840135613222816131aa565b809150509250925092565b602080825282518282018190525f9190848201906040850190845b8181101561326457835183529284019291840191600101613248565b50909695505050505050565b5f8060408385031215613281575f80fd5b823561328c816131aa565b9150602083013561329c816131aa565b809150509250929050565b634e487b7160e01b5f52604160045260245ffd5b6040805190810167ffffffffffffffff811182821017156132de576132de6132a7565b60405290565b604051601f8201601f1916810167ffffffffffffffff8111828210171561330d5761330d6132a7565b604052919050565b5f805f60a08486031215613327575f80fd5b84601f850112613335575f80fd5b6040516060810181811067ffffffffffffffff82111715613358576133586132a7565b60405280606086018781111561336c575f80fd5b865b8181101561338657803583526020928301920161336e565b5091979135965050608094909401359392505050565b805f5b600381101561289057815184526020938401939091019060010161339f565b5f61012080840160018060a01b0384511685526020808501516133e4602088018261339c565b5060408501516080870152606085015160a0870152608085015160c087015260a085015160e087015260c0850151836101008801528293508051808452610140880194506020820193505f91505b808210156134525783518552938201939282019260019190910190613432565b50929695505050505050565b5f60208083018184528085518083526040925060408601915060408160051b8701018488015f5b838110156134d157603f19898403018552815160608151855288820151818a8701526134b3828701826133be565b92890151958901959095525094870194925090860190600101613485565b509098975050505050505050565b5f60208083850312156134f0575f80fd5b823567ffffffffffffffff80821115613507575f80fd5b818501915085601f83011261351a575f80fd5b81358181111561352c5761352c6132a7565b8060051b915061353d8483016132e4565b8181529183018401918481019088841115613556575f80fd5b938501935b838510156135745784358252938501939085019061355b565b98975050505050505050565b6020808252825182820152828101516040808401528051606084018190525f9291820190839060808601905b808310156135cc57835182529284019260019290920191908401906135ac565b509695505050505050565b602081525f6131d960208301846133be565b5f82601f8301126135f8575f80fd5b6136006132bb565b806040840185811115613611575f80fd5b845b8181101561362b578035845260209384019301613613565b509095945050505050565b5f82601f830112613645575f80fd5b61364d6132bb565b80608084018581111561365e575f80fd5b845b8181101561362b5761367287826135e9565b8452602090930192604001613660565b5f805f806101a0808688031215613697575f80fd5b6136a187876135e9565b94506136b08760408801613636565b93506136bf8760c088016135e9565b92508661011f8701126136d0575f80fd5b60405160a0810181811067ffffffffffffffff821117156136f3576136f36132a7565b604052908601908088831115613707575f80fd5b61010088015b8381101561372557803582526020918201910161370d565b5050809250505092959194509250565b5f805f8061028080868803121561374a575f80fd5b61375487876135e9565b94506137638760408801613636565b93506137728760c088016135e9565b92508661011f870112613783575f80fd5b604051610180810181811067ffffffffffffffff821117156136f3576136f36132a7565b5f80602083850312156137b8575f80fd5b823567ffffffffffffffff808211156137cf575f80fd5b818501915085601f8301126137e2575f80fd5b8135818111156137f0575f80fd5b8660208260051b8501011115613804575f80fd5b60209290920196919550909350505050565b602080825282518282018190525f919060409081850190868401855b8281101561388c578151805180516001600160a01b0390811687528882015116888701528681015187870152606080820151908701526080908101519086015286015160a085015260c09093019290850190600101613832565b5091979650505050505050565b5f80604083850312156138aa575f80fd5b82356138b5816131aa565b946020939093013593505050565b6020808252601e908201527f43616c6c6572206d757374206265207265676973746572656420757365720000604082015260600190565b634e487b7160e01b5f52601160045260245ffd5b808201808211156122b5576122b56138fa565b818103818111156122b5576122b56138fa565b606081016122b5828461339c565b5f60208284031215613952575f80fd5b5051919050565b80820281158282048414176122b5576122b56138fa565b634e487b7160e01b5f52601260045260245ffd5b5f8261399257613992613970565b500490565b5f600182016139a8576139a86138fa565b5060010190565b5f602082840312156139bf575f80fd5b815180151581146131d9575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f826139f0576139f0613970565b500690565b634e487b7160e01b5f52603160045260245ffd5b805f5b6002811015612890578151845260209384019390910190600101613a0c565b805f5b600281101561289057613a42848351613a09565b6040939093019260209190910190600101613a2e565b5f6101a082019050613a6b828451613a09565b602080840151613a7e6040850182613a2b565b506040840151613a9160c0850182613a09565b50606084015161010084015f5b6005811015613abb57825182529183019190830190600101613a9e565b5050505092915050565b5f61028082019050613ad8828451613a09565b602080840151613aeb6040850182613a2b565b506040840151613afe60c0850182613a09565b50606084015161010084015f5b600c811015613abb57825182529183019190830190600101613b0b565b5f805f805f60a08688031215613b3c575f80fd5b505083516020850151604086015160608701516080909701519298919750959450909250905056fea2646970667358221220815393abb3a4eb1674544182ab9554bb2f00aea3631e73303e65e6cdb62c2c3764736f6c63430008180033", + "devdoc": { + "kind": "dev", + "methods": { + "addAccountToDenylist(bytes32)": { + "params": { + "_deniedUser": "Poseidon hash of the venmoId being banned" + } + }, + "cancelIntent(bytes32)": { + "params": { + "_intentHash": "Hash of intent being cancelled" + } + }, + "initialize(address,address)": { + "params": { + "_registrationProcessor": "Registration processor address", + "_sendProcessor": "Send processor address" + } + }, + "offRamp(uint256[3],uint256,uint256)": { + "params": { + "_depositAmount": "The amount of USDC to off-ramp", + "_packedVenmoId": "The packed venmo id of the account owner (we pack for easy use with poseidon)", + "_receiveAmount": "The amount of USD to receive" + } + }, + "onRamp(uint256[2],uint256[2][2],uint256[2],uint256[12])": { + "params": { + "_a": "Parameter of zk proof", + "_b": "Parameter of zk proof", + "_c": "Parameter of zk proof", + "_signals": "Encoded public signals of the zk proof, contains mailserverHash, fromEmail, timestamp, onRamperIdHash, nullifier, intentHash" + } + }, + "owner()": { + "details": "Returns the address of the current owner." + }, + "register(uint256[2],uint256[2][2],uint256[2],uint256[5])": { + "params": { + "_a": "Parameter of zk proof", + "_b": "Parameter of zk proof", + "_c": "Parameter of zk proof", + "_signals": "Encoded public signals of the zk proof, contains mailserverHash, fromEmail, userIdHash" + } + }, + "removeAccountFromDenylist(bytes32)": { + "params": { + "_approvedUser": "Poseidon hash of the venmoId being approved" + } + }, + "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." + }, + "setIntentExpirationPeriod(uint256)": { + "params": { + "_intentExpirationPeriod": "New intent expiration period" + } + }, + "setMaxOnRampAmount(uint256)": { + "params": { + "_maxOnRampAmount": "The new max on ramp amount" + } + }, + "setMinDepositAmount(uint256)": { + "params": { + "_minDepositAmount": "The new minimum deposit amount" + } + }, + "setOnRampCooldownPeriod(uint256)": { + "params": { + "_onRampCooldownPeriod": "New on-ramp cooldown period" + } + }, + "setRegistrationProcessor(address)": { + "params": { + "_registrationProcessor": "New registration proccesor address" + } + }, + "setSendProcessor(address)": { + "params": { + "_sendProcessor": "New send proccesor address" + } + }, + "setSustainabilityFee(uint256)": { + "params": { + "_fee": "The new sustainability fee in precise units (10**18, ie 10% = 1e17)" + } + }, + "setSustainabilityFeeRecipient(address)": { + "params": { + "_feeRecipient": "The new fee recipient address" + } + }, + "signalIntent(uint256,uint256,address)": { + "params": { + "_amount": "The amount of USDC the user wants to on-ramp", + "_depositId": "The ID of the deposit the on-ramper intends to use for ", + "_to": "Address to forward funds to (can be same as onRamper)" + } + }, + "transferOwnership(address)": { + "details": "Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner." + }, + "withdrawDeposit(uint256[])": { + "params": { + "_depositIds": "Array of depositIds the depositor is attempting to withdraw" + } + } + }, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": { + "addAccountToDenylist(bytes32)": { + "notice": "Adds a venmoId to a depositor's deny list. If an address associated with the banned venmoId attempts to signal an intent on the user's deposit they will be denied." + }, + "cancelIntent(bytes32)": { + "notice": "Only callable by the originator of the intent. Cancels an outstanding intent thus allowing user to signal a new intent. Deposit state is updated to reflect the cancelled intent." + }, + "initialize(address,address)": { + "notice": "Initialize Ramp with the addresses of the Processors" + }, + "offRamp(uint256[3],uint256,uint256)": { + "notice": "Generates a deposit entry for off-rampers that can then be fulfilled by an on-ramper. This function will not add to previous deposits. Every deposit has it's own unique identifier. User must approve the contract to transfer the deposit amount of USDC." + }, + "onRamp(uint256[2],uint256[2][2],uint256[2],uint256[12])": { + "notice": "Anyone can submit an on-ramp transaction, even if caller isn't on-ramper. Upon submission the proof is validated, intent is removed, and deposit state is updated. USDC is transferred to the on-ramper." + }, + "register(uint256[2],uint256[2][2],uint256[2],uint256[5])": { + "notice": "Registers a new account by pulling the hash of the account id from the proof and assigning the account owner to the sender of the transaction. One venmo account can be registered to multiple Ethereum addresses." + }, + "removeAccountFromDenylist(bytes32)": { + "notice": "Removes a venmoId from a depositor's deny list." + }, + "setIntentExpirationPeriod(uint256)": { + "notice": "GOVERNANCE ONLY: Updates the intent expiration period, after this period elapses an intent can be pruned to prevent locking up a depositor's funds." + }, + "setMaxOnRampAmount(uint256)": { + "notice": "GOVERNANCE ONLY: Updates the max amount allowed to be on-ramped in each transaction. To on-ramp more than this amount a user must make multiple transactions." + }, + "setMinDepositAmount(uint256)": { + "notice": "GOVERNANCE ONLY: Updates the minimum deposit amount a user can specify for off-ramping." + }, + "setOnRampCooldownPeriod(uint256)": { + "notice": "GOVERNANCE ONLY: Updates the on-ramp cooldown period, once an on-ramp transaction is completed the user must wait this amount of time before they can signalIntent to on-ramp again." + }, + "setRegistrationProcessor(address)": { + "notice": "GOVERNANCE ONLY: Updates the registration processor address used for validating and interpreting zk proofs." + }, + "setSendProcessor(address)": { + "notice": "GOVERNANCE ONLY: Updates the send processor address used for validating and interpreting zk proofs." + }, + "setSustainabilityFee(uint256)": { + "notice": "GOVERNANCE ONLY: Updates the sustainability fee. This fee is charged to on-rampers upon a successful on-ramp." + }, + "setSustainabilityFeeRecipient(address)": { + "notice": "GOVERNANCE ONLY: Updates the recepient of sustainability fees." + }, + "signalIntent(uint256,uint256,address)": { + "notice": "Signals intent to pay the depositor defined in the _depositId the _amount * deposit conversionRate off-chain in order to unlock _amount of funds on-chain. Each user can only have one outstanding intent at a time regardless of address (tracked using venmoId). Caller must not be on the depositor's deny list. If there are prunable intents then they will be deleted from the deposit to be able to maintain state hygiene." + }, + "withdrawDeposit(uint256[])": { + "notice": "Caller must be the depositor for each depositId in the array, if not whole function fails. Depositor is returned all remaining deposits and any outstanding intents that are expired. If an intent is not expired then those funds will not be returned. Deposit will be deleted as long as there are no more outstanding intents." + } + }, + "version": 1 + }, + "storageLayout": { + "storage": [ + { + "astId": 7, + "contract": "contracts/ramps/venmo-v1/Ramp.sol:Ramp", + "label": "_owner", + "offset": 0, + "slot": "0", + "type": "t_address" + }, + { + "astId": 16796, + "contract": "contracts/ramps/venmo-v1/Ramp.sol:Ramp", + "label": "registrationProcessor", + "offset": 0, + "slot": "1", + "type": "t_contract(IRegistrationProcessor)19080" + }, + { + "astId": 16799, + "contract": "contracts/ramps/venmo-v1/Ramp.sol:Ramp", + "label": "sendProcessor", + "offset": 0, + "slot": "2", + "type": "t_contract(ISendProcessor)19118" + }, + { + "astId": 16801, + "contract": "contracts/ramps/venmo-v1/Ramp.sol:Ramp", + "label": "isInitialized", + "offset": 20, + "slot": "2", + "type": "t_bool" + }, + { + "astId": 16806, + "contract": "contracts/ramps/venmo-v1/Ramp.sol:Ramp", + "label": "globalAccount", + "offset": 0, + "slot": "3", + "type": "t_mapping(t_bytes32,t_struct(GlobalAccountInfo)16757_storage)" + }, + { + "astId": 16811, + "contract": "contracts/ramps/venmo-v1/Ramp.sol:Ramp", + "label": "accounts", + "offset": 0, + "slot": "4", + "type": "t_mapping(t_address,t_struct(AccountInfo)16698_storage)" + }, + { + "astId": 16816, + "contract": "contracts/ramps/venmo-v1/Ramp.sol:Ramp", + "label": "deposits", + "offset": 0, + "slot": "5", + "type": "t_mapping(t_uint256,t_struct(Deposit)16716_storage)" + }, + { + "astId": 16821, + "contract": "contracts/ramps/venmo-v1/Ramp.sol:Ramp", + "label": "intents", + "offset": 0, + "slot": "6", + "type": "t_mapping(t_bytes32,t_struct(Intent)16735_storage)" + }, + { + "astId": 16823, + "contract": "contracts/ramps/venmo-v1/Ramp.sol:Ramp", + "label": "minDepositAmount", + "offset": 0, + "slot": "7", + "type": "t_uint256" + }, + { + "astId": 16825, + "contract": "contracts/ramps/venmo-v1/Ramp.sol:Ramp", + "label": "maxOnRampAmount", + "offset": 0, + "slot": "8", + "type": "t_uint256" + }, + { + "astId": 16827, + "contract": "contracts/ramps/venmo-v1/Ramp.sol:Ramp", + "label": "onRampCooldownPeriod", + "offset": 0, + "slot": "9", + "type": "t_uint256" + }, + { + "astId": 16829, + "contract": "contracts/ramps/venmo-v1/Ramp.sol:Ramp", + "label": "intentExpirationPeriod", + "offset": 0, + "slot": "10", + "type": "t_uint256" + }, + { + "astId": 16831, + "contract": "contracts/ramps/venmo-v1/Ramp.sol:Ramp", + "label": "sustainabilityFee", + "offset": 0, + "slot": "11", + "type": "t_uint256" + }, + { + "astId": 16833, + "contract": "contracts/ramps/venmo-v1/Ramp.sol:Ramp", + "label": "sustainabilityFeeRecipient", + "offset": 0, + "slot": "12", + "type": "t_address" + }, + { + "astId": 16835, + "contract": "contracts/ramps/venmo-v1/Ramp.sol:Ramp", + "label": "depositCounter", + "offset": 0, + "slot": "13", + "type": "t_uint256" + } + ], + "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_array(t_uint256)3_storage": { + "base": "t_uint256", + "encoding": "inplace", + "label": "uint256[3]", + "numberOfBytes": "96" + }, + "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_contract(IRegistrationProcessor)19080": { + "encoding": "inplace", + "label": "contract IRegistrationProcessor", + "numberOfBytes": "20" + }, + "t_contract(ISendProcessor)19118": { + "encoding": "inplace", + "label": "contract ISendProcessor", + "numberOfBytes": "20" + }, + "t_mapping(t_address,t_struct(AccountInfo)16698_storage)": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => struct Ramp.AccountInfo)", + "numberOfBytes": "32", + "value": "t_struct(AccountInfo)16698_storage" + }, + "t_mapping(t_bytes32,t_bool)": { + "encoding": "mapping", + "key": "t_bytes32", + "label": "mapping(bytes32 => bool)", + "numberOfBytes": "32", + "value": "t_bool" + }, + "t_mapping(t_bytes32,t_struct(GlobalAccountInfo)16757_storage)": { + "encoding": "mapping", + "key": "t_bytes32", + "label": "mapping(bytes32 => struct Ramp.GlobalAccountInfo)", + "numberOfBytes": "32", + "value": "t_struct(GlobalAccountInfo)16757_storage" + }, + "t_mapping(t_bytes32,t_struct(Intent)16735_storage)": { + "encoding": "mapping", + "key": "t_bytes32", + "label": "mapping(bytes32 => struct Ramp.Intent)", + "numberOfBytes": "32", + "value": "t_struct(Intent)16735_storage" + }, + "t_mapping(t_uint256,t_struct(Deposit)16716_storage)": { + "encoding": "mapping", + "key": "t_uint256", + "label": "mapping(uint256 => struct Ramp.Deposit)", + "numberOfBytes": "32", + "value": "t_struct(Deposit)16716_storage" + }, + "t_struct(AccountInfo)16698_storage": { + "encoding": "inplace", + "label": "struct Ramp.AccountInfo", + "members": [ + { + "astId": 16694, + "contract": "contracts/ramps/venmo-v1/Ramp.sol:Ramp", + "label": "venmoIdHash", + "offset": 0, + "slot": "0", + "type": "t_bytes32" + }, + { + "astId": 16697, + "contract": "contracts/ramps/venmo-v1/Ramp.sol:Ramp", + "label": "deposits", + "offset": 0, + "slot": "1", + "type": "t_array(t_uint256)dyn_storage" + } + ], + "numberOfBytes": "64" + }, + "t_struct(DenyList)16749_storage": { + "encoding": "inplace", + "label": "struct Ramp.DenyList", + "members": [ + { + "astId": 16744, + "contract": "contracts/ramps/venmo-v1/Ramp.sol:Ramp", + "label": "deniedUsers", + "offset": 0, + "slot": "0", + "type": "t_array(t_bytes32)dyn_storage" + }, + { + "astId": 16748, + "contract": "contracts/ramps/venmo-v1/Ramp.sol:Ramp", + "label": "isDenied", + "offset": 0, + "slot": "1", + "type": "t_mapping(t_bytes32,t_bool)" + } + ], + "numberOfBytes": "64" + }, + "t_struct(Deposit)16716_storage": { + "encoding": "inplace", + "label": "struct Ramp.Deposit", + "members": [ + { + "astId": 16700, + "contract": "contracts/ramps/venmo-v1/Ramp.sol:Ramp", + "label": "depositor", + "offset": 0, + "slot": "0", + "type": "t_address" + }, + { + "astId": 16704, + "contract": "contracts/ramps/venmo-v1/Ramp.sol:Ramp", + "label": "packedVenmoId", + "offset": 0, + "slot": "1", + "type": "t_array(t_uint256)3_storage" + }, + { + "astId": 16706, + "contract": "contracts/ramps/venmo-v1/Ramp.sol:Ramp", + "label": "depositAmount", + "offset": 0, + "slot": "4", + "type": "t_uint256" + }, + { + "astId": 16708, + "contract": "contracts/ramps/venmo-v1/Ramp.sol:Ramp", + "label": "remainingDeposits", + "offset": 0, + "slot": "5", + "type": "t_uint256" + }, + { + "astId": 16710, + "contract": "contracts/ramps/venmo-v1/Ramp.sol:Ramp", + "label": "outstandingIntentAmount", + "offset": 0, + "slot": "6", + "type": "t_uint256" + }, + { + "astId": 16712, + "contract": "contracts/ramps/venmo-v1/Ramp.sol:Ramp", + "label": "conversionRate", + "offset": 0, + "slot": "7", + "type": "t_uint256" + }, + { + "astId": 16715, + "contract": "contracts/ramps/venmo-v1/Ramp.sol:Ramp", + "label": "intentHashes", + "offset": 0, + "slot": "8", + "type": "t_array(t_bytes32)dyn_storage" + } + ], + "numberOfBytes": "288" + }, + "t_struct(GlobalAccountInfo)16757_storage": { + "encoding": "inplace", + "label": "struct Ramp.GlobalAccountInfo", + "members": [ + { + "astId": 16751, + "contract": "contracts/ramps/venmo-v1/Ramp.sol:Ramp", + "label": "currentIntentHash", + "offset": 0, + "slot": "0", + "type": "t_bytes32" + }, + { + "astId": 16753, + "contract": "contracts/ramps/venmo-v1/Ramp.sol:Ramp", + "label": "lastOnrampTimestamp", + "offset": 0, + "slot": "1", + "type": "t_uint256" + }, + { + "astId": 16756, + "contract": "contracts/ramps/venmo-v1/Ramp.sol:Ramp", + "label": "denyList", + "offset": 0, + "slot": "2", + "type": "t_struct(DenyList)16749_storage" + } + ], + "numberOfBytes": "128" + }, + "t_struct(Intent)16735_storage": { + "encoding": "inplace", + "label": "struct Ramp.Intent", + "members": [ + { + "astId": 16726, + "contract": "contracts/ramps/venmo-v1/Ramp.sol:Ramp", + "label": "onRamper", + "offset": 0, + "slot": "0", + "type": "t_address" + }, + { + "astId": 16728, + "contract": "contracts/ramps/venmo-v1/Ramp.sol:Ramp", + "label": "to", + "offset": 0, + "slot": "1", + "type": "t_address" + }, + { + "astId": 16730, + "contract": "contracts/ramps/venmo-v1/Ramp.sol:Ramp", + "label": "deposit", + "offset": 0, + "slot": "2", + "type": "t_uint256" + }, + { + "astId": 16732, + "contract": "contracts/ramps/venmo-v1/Ramp.sol:Ramp", + "label": "amount", + "offset": 0, + "slot": "3", + "type": "t_uint256" + }, + { + "astId": 16734, + "contract": "contracts/ramps/venmo-v1/Ramp.sol:Ramp", + "label": "intentTimestamp", + "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/deployments/encifher/RevolutAccountRegistrationProcessor.json b/contracts/deployments/encifher/RevolutAccountRegistrationProcessor.json new file mode 100644 index 000000000..cbb76ea0c --- /dev/null +++ b/contracts/deployments/encifher/RevolutAccountRegistrationProcessor.json @@ -0,0 +1,498 @@ +{ + "address": "0x5E388db7c3aef7deA9585FbE3c077f0c98857d0d", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_ramp", + "type": "address" + }, + { + "internalType": "address", + "name": "_verifierSigningKey", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "_notaryKeyHash", + "type": "bytes32" + }, + { + "internalType": "contract INullifierRegistry", + "name": "_nullifierRegistry", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_timestampBuffer", + "type": "uint256" + }, + { + "internalType": "string", + "name": "_endpoint", + "type": "string" + }, + { + "internalType": "string", + "name": "_host", + "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": "address", + "name": "_verifierSigningKey", + "type": "address" + } + ], + "name": "VerifierSigningKeySet", + "type": "event" + }, + { + "inputs": [], + "name": "endpoint", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "host", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "notaryKeyHash", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "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": [ + { + "components": [ + { + "internalType": "string", + "name": "endpoint", + "type": "string" + }, + { + "internalType": "string", + "name": "host", + "type": "string" + }, + { + "internalType": "string", + "name": "profileId", + "type": "string" + }, + { + "internalType": "address", + "name": "userAddress", + "type": "address" + }, + { + "internalType": "uint256", + "name": "notaryKeyHash", + "type": "uint256" + } + ], + "internalType": "struct IRevolutAccountRegistrationProcessor.RegistrationData", + "name": "public_values", + "type": "tuple" + }, + { + "internalType": "bytes", + "name": "proof", + "type": "bytes" + } + ], + "internalType": "struct IRevolutAccountRegistrationProcessor.RegistrationProof", + "name": "_proof", + "type": "tuple" + } + ], + "name": "processProof", + "outputs": [ + { + "internalType": "bytes32", + "name": "onRampId", + "type": "bytes32" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "ramp", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_timestampBuffer", + "type": "uint256" + } + ], + "name": "setTimestampBuffer", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_verifierSigningKey", + "type": "address" + } + ], + "name": "setVerifierSigningKey", + "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": [], + "name": "verifierSigningKey", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "string", + "name": "endpoint", + "type": "string" + }, + { + "internalType": "string", + "name": "host", + "type": "string" + }, + { + "internalType": "string", + "name": "profileId", + "type": "string" + }, + { + "internalType": "address", + "name": "userAddress", + "type": "address" + }, + { + "internalType": "uint256", + "name": "notaryKeyHash", + "type": "uint256" + } + ], + "internalType": "struct IRevolutAccountRegistrationProcessor.RegistrationData", + "name": "_publicValues", + "type": "tuple" + }, + { + "internalType": "bytes", + "name": "_proof", + "type": "bytes" + } + ], + "name": "verifyProof", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "transactionHash": "0x79c9050bfddec7f84a964f61fc708370a3f913944bcb99390dfff8583856c0d9", + "receipt": { + "to": null, + "from": "0xa0Ee7A142d267C1f36714E4a8F75612F20a79720", + "contractAddress": "0x5E388db7c3aef7deA9585FbE3c077f0c98857d0d", + "transactionIndex": 0, + "gasUsed": "1327888", + "logsBloom": "0x00000000000000000000040000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001008000000000000008000000000000000000020000000000000000000800000000000000000000000000000000400000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000020000000000000000000000000000000000000000000000000000400000000000000", + "blockHash": "0x4d460b6db70c4d964aedcf1b70d455b72d4b1906b6550a7629bf08c0dc9f1787", + "transactionHash": "0x79c9050bfddec7f84a964f61fc708370a3f913944bcb99390dfff8583856c0d9", + "logs": [ + { + "transactionIndex": 0, + "blockNumber": 61404, + "transactionHash": "0x79c9050bfddec7f84a964f61fc708370a3f913944bcb99390dfff8583856c0d9", + "address": "0x5E388db7c3aef7deA9585FbE3c077f0c98857d0d", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x000000000000000000000000a0ee7a142d267c1f36714e4a8f75612f20a79720" + ], + "data": "0x", + "logIndex": 0, + "blockHash": "0x4d460b6db70c4d964aedcf1b70d455b72d4b1906b6550a7629bf08c0dc9f1787" + } + ], + "blockNumber": 61404, + "cumulativeGasUsed": "1327888", + "status": 1, + "byzantium": true + }, + "args": [ + "0x2fb5e98f1eFE95aE50F9BecAfCE660701aD8D9be", + "0x166338393593e85bfde8B65358Ec5801A3445D12", + "0xfa15be4a0fff051ec52e2738d0d62f7e8c0e951705885ed7290a6daff1ed7aee", + "0x4d8E02BBfCf205828A8352Af4376b165E123D7b0", + "0", + "GET https://app.revolut.com/api/retail/user/current", + "app.revolut.com" + ], + "numDeployments": 1, + "solcInputHash": "75b8f55da346d7ed99a350632554d2fb", + "metadata": "{\"compiler\":{\"version\":\"0.8.24+commit.e11b9ed9\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_ramp\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_verifierSigningKey\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"_notaryKeyHash\",\"type\":\"bytes32\"},{\"internalType\":\"contract INullifierRegistry\",\"name\":\"_nullifierRegistry\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_timestampBuffer\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"_endpoint\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_host\",\"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\":\"address\",\"name\":\"_verifierSigningKey\",\"type\":\"address\"}],\"name\":\"VerifierSigningKeySet\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"endpoint\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"host\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"notaryKeyHash\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"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\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"endpoint\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"host\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"profileId\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"userAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"notaryKeyHash\",\"type\":\"uint256\"}],\"internalType\":\"struct IRevolutAccountRegistrationProcessor.RegistrationData\",\"name\":\"public_values\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"proof\",\"type\":\"bytes\"}],\"internalType\":\"struct IRevolutAccountRegistrationProcessor.RegistrationProof\",\"name\":\"_proof\",\"type\":\"tuple\"}],\"name\":\"processProof\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"onRampId\",\"type\":\"bytes32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ramp\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_timestampBuffer\",\"type\":\"uint256\"}],\"name\":\"setTimestampBuffer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_verifierSigningKey\",\"type\":\"address\"}],\"name\":\"setVerifierSigningKey\",\"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\":[],\"name\":\"verifierSigningKey\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"endpoint\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"host\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"profileId\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"userAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"notaryKeyHash\",\"type\":\"uint256\"}],\"internalType\":\"struct IRevolutAccountRegistrationProcessor.RegistrationData\",\"name\":\"_publicValues\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"_proof\",\"type\":\"bytes\"}],\"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.\"},\"setTimestampBuffer(uint256)\":{\"params\":{\"_timestampBuffer\":\"The timestamp buffer for validated TLS calls\"}},\"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\":{\"setTimestampBuffer(uint256)\":{\"notice\":\"ONLY OWNER: Sets the timestamp buffer for validated TLS calls. 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/ramps/revolut/RevolutAccountRegistrationProcessor.sol\":\"RevolutAccountRegistrationProcessor\"},\"evmVersion\":\"shanghai\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"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/interfaces/IERC1271.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (interfaces/IERC1271.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC1271 standard signature validation method for\\n * contracts as defined in https://eips.ethereum.org/EIPS/eip-1271[ERC-1271].\\n *\\n * _Available since v4.1._\\n */\\ninterface IERC1271 {\\n /**\\n * @dev Should return whether the signature provided is valid for the provided data\\n * @param hash Hash of the data to be signed\\n * @param signature Signature byte array associated with _data\\n */\\n function isValidSignature(bytes32 hash, bytes memory signature) external view returns (bytes4 magicValue);\\n}\\n\",\"keccak256\":\"0x0705a4b1b86d7b0bd8432118f226ba139c44b9dcaba0a6eafba2dd7d0639c544\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (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\",\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"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/cryptography/SignatureChecker.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/cryptography/SignatureChecker.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./ECDSA.sol\\\";\\nimport \\\"../../interfaces/IERC1271.sol\\\";\\n\\n/**\\n * @dev Signature verification helper that can be used instead of `ECDSA.recover` to seamlessly support both ECDSA\\n * signatures from externally owned accounts (EOAs) as well as ERC1271 signatures from smart contract wallets like\\n * Argent and Gnosis Safe.\\n *\\n * _Available since v4.1._\\n */\\nlibrary SignatureChecker {\\n /**\\n * @dev Checks if a signature is valid for a given signer and data hash. If the signer is a smart contract, the\\n * signature is validated against that smart contract using ERC1271, otherwise it's validated using `ECDSA.recover`.\\n *\\n * NOTE: Unlike ECDSA signatures, contract signatures are revocable, and the outcome of this function can thus\\n * change through time. It could return true at block N and false at block N+1 (or the opposite).\\n */\\n function isValidSignatureNow(address signer, bytes32 hash, bytes memory signature) internal view returns (bool) {\\n (address recovered, ECDSA.RecoverError error) = ECDSA.tryRecover(hash, signature);\\n return\\n (error == ECDSA.RecoverError.NoError && recovered == signer) ||\\n isValidERC1271SignatureNow(signer, hash, signature);\\n }\\n\\n /**\\n * @dev Checks if a signature is valid for a given signer and data hash. The signature is validated\\n * against the signer smart contract using ERC1271.\\n *\\n * NOTE: Unlike ECDSA signatures, contract signatures are revocable, and the outcome of this function can thus\\n * change through time. It could return true at block N and false at block N+1 (or the opposite).\\n */\\n function isValidERC1271SignatureNow(\\n address signer,\\n bytes32 hash,\\n bytes memory signature\\n ) internal view returns (bool) {\\n (bool success, bytes memory result) = signer.staticcall(\\n abi.encodeWithSelector(IERC1271.isValidSignature.selector, hash, signature)\\n );\\n return (success &&\\n result.length >= 32 &&\\n abi.decode(result, (bytes32)) == bytes32(IERC1271.isValidSignature.selector));\\n }\\n}\\n\",\"keccak256\":\"0x3af3ca86df39aac39a0514c84459d691434a108d2151c8ce9d69f32e315cab80\",\"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\"},\"contracts/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/processors/TLSBaseProcessor.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\n\\nimport { ECDSA } from \\\"@openzeppelin/contracts/utils/cryptography/ECDSA.sol\\\";\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\nimport { SignatureChecker } from \\\"@openzeppelin/contracts/utils/cryptography/SignatureChecker.sol\\\";\\n\\nimport { INullifierRegistry } from \\\"./nullifierRegistries/INullifierRegistry.sol\\\";\\n\\npragma solidity ^0.8.18;\\n\\ncontract TLSBaseProcessor is Ownable {\\n\\n using SignatureChecker for address;\\n using ECDSA for bytes32;\\n\\n /* ============ Modifiers ============ */\\n modifier onlyRamp() {\\n require(msg.sender == ramp, \\\"Only Ramp can call this function\\\");\\n _;\\n }\\n\\n /* ============ State Variables ============ */\\n address public immutable ramp;\\n string public endpoint;\\n string public host;\\n\\n INullifierRegistry public nullifierRegistry;\\n uint256 public timestampBuffer;\\n\\n /* ============ Constructor ============ */\\n constructor(\\n address _ramp,\\n INullifierRegistry _nullifierRegistry,\\n uint256 _timestampBuffer,\\n string memory _endpoint,\\n string memory _host\\n )\\n Ownable()\\n {\\n ramp = _ramp;\\n endpoint = _endpoint;\\n host = _host;\\n\\n nullifierRegistry = _nullifierRegistry;\\n timestampBuffer = _timestampBuffer;\\n }\\n\\n /* ============ External Functions ============ */\\n\\n /**\\n * @notice ONLY OWNER: Sets the timestamp buffer for validated TLS calls. 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 TLS calls\\n */\\n function setTimestampBuffer(uint256 _timestampBuffer) external onlyOwner {\\n timestampBuffer = _timestampBuffer;\\n }\\n\\n /* ============ Internal Functions ============ */\\n\\n function _validateTLSEndpoint(\\n string memory _expectedEndpoint,\\n string memory _passedEndpoint\\n )\\n internal\\n pure\\n {\\n require(\\n keccak256(abi.encode(_expectedEndpoint)) == keccak256(abi.encode(_passedEndpoint)),\\n \\\"Endpoint does not match expected\\\"\\n );\\n }\\n\\n function _validateTLSHost(\\n string memory _expectedHost,\\n string memory _passedHost\\n )\\n internal\\n pure\\n {\\n require(\\n keccak256(abi.encode(_expectedHost)) == keccak256(abi.encode(_passedHost)),\\n \\\"Host does not match expected\\\"\\n );\\n }\\n\\n function _validateAndAddNullifier(bytes32 _nullifier) internal {\\n require(!nullifierRegistry.isNullified(_nullifier), \\\"Nullifier has already been used\\\");\\n nullifierRegistry.addNullifier(_nullifier);\\n }\\n\\n function _isValidSignature(\\n bytes memory _message,\\n bytes memory _signature,\\n address _signer\\n )\\n internal\\n view\\n returns(bool)\\n {\\n bytes32 verifierPayload = keccak256(_message).toEthSignedMessageHash();\\n\\n return _signer.isValidSignatureNow(verifierPayload, _signature);\\n }\\n}\\n\",\"keccak256\":\"0x366ab1cc4ebfdb4ba68fdb43b902676e67e7760ae1987e4252e5839e8370a6c2\",\"license\":\"MIT\"},\"contracts/processors/nullifierRegistries/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/ramps/revolut/RevolutAccountRegistrationProcessor.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\n\\nimport { ECDSA } from \\\"@openzeppelin/contracts/utils/cryptography/ECDSA.sol\\\";\\nimport { SignatureChecker } from \\\"@openzeppelin/contracts/utils/cryptography/SignatureChecker.sol\\\";\\n\\nimport { INullifierRegistry } from \\\"../../processors/nullifierRegistries/INullifierRegistry.sol\\\";\\nimport { IRevolutAccountRegistrationProcessor } from \\\"./interfaces/IRevolutAccountRegistrationProcessor.sol\\\";\\nimport { StringConversionUtils } from \\\"../../lib/StringConversionUtils.sol\\\";\\nimport { TLSBaseProcessor } from \\\"../../processors/TLSBaseProcessor.sol\\\";\\n\\npragma solidity ^0.8.18;\\n\\ncontract RevolutAccountRegistrationProcessor is IRevolutAccountRegistrationProcessor, TLSBaseProcessor {\\n\\n using ECDSA for bytes32;\\n using SignatureChecker for address;\\n using StringConversionUtils for string;\\n \\n /* ============ Events ============ */\\n event VerifierSigningKeySet(address _verifierSigningKey);\\n \\n /* ============ Public Variables ============ */\\n address public verifierSigningKey;\\n bytes32 public notaryKeyHash;\\n \\n /* ============ Constructor ============ */\\n constructor(\\n address _ramp,\\n address _verifierSigningKey,\\n bytes32 _notaryKeyHash,\\n INullifierRegistry _nullifierRegistry,\\n uint256 _timestampBuffer,\\n string memory _endpoint,\\n string memory _host\\n )\\n TLSBaseProcessor(\\n _ramp,\\n _nullifierRegistry,\\n _timestampBuffer,\\n _endpoint,\\n _host\\n )\\n {\\n verifierSigningKey = _verifierSigningKey;\\n notaryKeyHash = _notaryKeyHash;\\n }\\n\\n /* ============ External Functions ============ */\\n\\n function processProof(\\n IRevolutAccountRegistrationProcessor.RegistrationProof calldata _proof\\n )\\n public\\n override\\n onlyRamp\\n returns(bytes32 onRampId)\\n {\\n _validateProof(_proof.public_values, _proof.proof);\\n\\n _validateTLSEndpoint(endpoint, _proof.public_values.endpoint);\\n _validateTLSHost(host, _proof.public_values.host);\\n\\n _validateAndAddNullifier(keccak256(abi.encode(_proof.public_values.userAddress, _proof.public_values.profileId)));\\n\\n onRampId = bytes32(_proof.public_values.profileId.stringToUint(0));\\n }\\n\\n /* ============ External Admin Functions ============ */\\n\\n function setVerifierSigningKey(address _verifierSigningKey) external onlyOwner {\\n verifierSigningKey = _verifierSigningKey;\\n\\n emit VerifierSigningKeySet(_verifierSigningKey);\\n }\\n\\n /* ============ View Functions ============ */\\n\\n function verifyProof(\\n IRevolutAccountRegistrationProcessor.RegistrationData memory _publicValues,\\n bytes memory _proof\\n )\\n public\\n view\\n returns(bool)\\n {\\n bytes memory encodedMessage = abi.encode(\\n _publicValues.endpoint,\\n _publicValues.host,\\n _publicValues.profileId,\\n _publicValues.userAddress,\\n _publicValues.notaryKeyHash\\n );\\n\\n require(bytes32(_publicValues.notaryKeyHash) == notaryKeyHash, \\\"Invalid notary key hash\\\");\\n\\n return _isValidSignature(encodedMessage, _proof, verifierSigningKey);\\n }\\n \\n /* ============ Internal Functions ============ */\\n\\n function _validateProof(\\n IRevolutAccountRegistrationProcessor.RegistrationData memory _publicValues, \\n bytes memory _proof\\n )\\n internal\\n view\\n { \\n require(\\n verifyProof(_publicValues, _proof),\\n \\\"Invalid proof\\\"\\n );\\n }\\n}\\n\",\"keccak256\":\"0x2e0d697451ba4cc026f7299f269f90bbba6f4efdda1be1f9a9575ba4af1b5cc2\",\"license\":\"MIT\"},\"contracts/ramps/revolut/interfaces/IRevolutAccountRegistrationProcessor.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.18;\\n\\ninterface IRevolutAccountRegistrationProcessor {\\n\\n struct RegistrationData {\\n string endpoint;\\n string host;\\n string profileId;\\n address userAddress;\\n uint256 notaryKeyHash;\\n }\\n\\n struct RegistrationProof {\\n RegistrationData public_values;\\n bytes proof;\\n }\\n\\n function processProof(\\n RegistrationProof calldata _proof\\n )\\n external\\n returns (bytes32);\\n}\\n\",\"keccak256\":\"0xb3e358861c8fb5d7c81c48e3eac4e0f4ce3c03ddfe4136aada9759b61e5e465a\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x60a060405234801562000010575f80fd5b506040516200199b3803806200199b8339810160408190526200003391620001e1565b86848484846200004333620000b9565b6001600160a01b03851660805260016200005e838262000322565b5060026200006d828262000322565b5050600380546001600160a01b039485166001600160a01b03199182161790915560049290925550600580549990921698169790971790965550505060069190915550620003ee915050565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b03811681146200011d575f80fd5b50565b634e487b7160e01b5f52604160045260245ffd5b5f82601f83011262000144575f80fd5b81516001600160401b038082111562000161576200016162000120565b604051601f8301601f19908116603f011681019082821181831017156200018c576200018c62000120565b8160405283815260209250866020858801011115620001a9575f80fd5b5f91505b83821015620001cc5785820183015181830184015290820190620001ad565b5f602085830101528094505050505092915050565b5f805f805f805f60e0888a031215620001f8575f80fd5b8751620002058162000108565b6020890151909750620002188162000108565b604089015160608a01519197509550620002328162000108565b608089015160a08a015191955093506001600160401b038082111562000256575f80fd5b620002648b838c0162000134565b935060c08a01519150808211156200027a575f80fd5b50620002898a828b0162000134565b91505092959891949750929550565b600181811c90821680620002ad57607f821691505b602082108103620002cc57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f8211156200031d57805f5260205f20601f840160051c81016020851015620002f95750805b601f840160051c820191505b818110156200031a575f815560010162000305565b50505b505050565b81516001600160401b038111156200033e576200033e62000120565b62000356816200034f845462000298565b84620002d2565b602080601f8311600181146200038c575f8415620003745750858301515b5f19600386901b1c1916600185901b178555620003e6565b5f85815260208120601f198616915b82811015620003bc578886015182559484019460019091019084016200039b565b5085821015620003da57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b60805161158d6200040e5f395f818161011e01526103eb015261158d5ff3fe608060405234801561000f575f80fd5b50600436106100e5575f3560e01c8063b870676c11610088578063dec965d311610063578063dec965d3146101e2578063f193eda6146101f5578063f2fde38b146101fe578063f437bc5914610211575f80fd5b8063b870676c14610195578063beb15c21146101a8578063dbac5821146101cb575f80fd5b80635e280f11116100c35780635e280f1114610155578063715018a61461016a5780638da5cb5b14610172578063b2a3fda414610182575f80fd5b80630fa4ed4d146100e957806315d276e1146101195780634e06a32b14610140575b5f80fd5b6005546100fc906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6100fc7f000000000000000000000000000000000000000000000000000000000000000081565b61015361014e366004610f8a565b610219565b005b61015d610275565b6040516101109190610ff0565b610153610301565b5f546001600160a01b03166100fc565b610153610190366004611002565b610314565b6003546100fc906001600160a01b031681565b6101bb6101b6366004611191565b610321565b6040519015158152602001610110565b6101d460045481565b604051908152602001610110565b6101d46101f0366004611204565b6103df565b6101d460065481565b61015361020c366004610f8a565b61072d565b61015d6107a6565b6102216107b3565b600580546001600160a01b0319166001600160a01b0383169081179091556040519081527fb8603ceabf8ee4633f1fd8c0ae9e0e64f2fc2fea5cb79a96c18efd007aab6f969060200160405180910390a150565b600180546102829061123b565b80601f01602080910402602001604051908101604052809291908181526020018280546102ae9061123b565b80156102f95780601f106102d0576101008083540402835291602001916102f9565b820191905f5260205f20905b8154815290600101906020018083116102dc57829003601f168201915b505050505081565b6103096107b3565b6103125f61080c565b565b61031c6107b3565b600455565b5f80835f0151846020015185604001518660600151876080015160405160200161034f959493929190611273565b604051602081830303815290604052905060065484608001515f1b146103bc5760405162461bcd60e51b815260206004820152601760248201527f496e76616c6964206e6f74617279206b6579206861736800000000000000000060448201526064015b60405180910390fd5b6005546103d590829085906001600160a01b031661085b565b9150505b92915050565b5f336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146104585760405162461bcd60e51b815260206004820181905260248201527f4f6e6c792052616d702063616e2063616c6c20746869732066756e6374696f6e60448201526064016103b3565b6104b461046583806112c9565b61046e906112e7565b61047b60208501856112f2565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152506108ae92505050565b610591600180546104c49061123b565b80601f01602080910402602001604051908101604052809291908181526020018280546104f09061123b565b801561053b5780601f106105125761010080835404028352916020019161053b565b820191905f5260205f20905b81548152906001019060200180831161051e57829003601f168201915b5061054e93508792508291506112c99050565b61055890806112f2565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152506108f892505050565b610672600280546105a19061123b565b80601f01602080910402602001604051908101604052809291908181526020018280546105cd9061123b565b80156106185780601f106105ef57610100808354040283529160200191610618565b820191905f5260205f20905b8154815290600101906020018083116105fb57829003601f168201915b5061062b93508792508291506112c99050565b6106399060208101906112f2565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061099392505050565b6106d561067f83806112c9565b610690906080810190606001610f8a565b61069a84806112c9565b6106a89060408101906112f2565b6040516020016106ba93929190611335565b60405160208183030381529060405280519060200120610a2e565b6103d95f6106e384806112c9565b6106f19060408101906112f2565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152509293925050610b429050565b6107356107b3565b6001600160a01b03811661079a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016103b3565b6107a38161080c565b50565b600280546102829061123b565b5f546001600160a01b031633146103125760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016103b3565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b825160208401207f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f908152601c91909152603c81206108a56001600160a01b0384168286610b59565b95945050505050565b6108b88282610321565b6108f45760405162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b210383937b7b360991b60448201526064016103b3565b5050565b806040516020016109099190610ff0565b60405160208183030381529060405280519060200120826040516020016109309190610ff0565b60405160208183030381529060405280519060200120146108f45760405162461bcd60e51b815260206004820181905260248201527f456e64706f696e7420646f6573206e6f74206d6174636820657870656374656460448201526064016103b3565b806040516020016109a49190610ff0565b60405160208183030381529060405280519060200120826040516020016109cb9190610ff0565b60405160208183030381529060405280519060200120146108f45760405162461bcd60e51b815260206004820152601c60248201527f486f737420646f6573206e6f74206d617463682065787065637465640000000060448201526064016103b3565b60035460405163169394bb60e01b8152600481018390526001600160a01b039091169063169394bb90602401602060405180830381865afa158015610a75573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a999190611374565b15610ae65760405162461bcd60e51b815260206004820152601f60248201527f4e756c6c69666965722068617320616c7265616479206265656e20757365640060448201526064016103b3565b600354604051632dea6f9960e11b8152600481018390526001600160a01b0390911690635bd4df32906024015f604051808303815f87803b158015610b29575f80fd5b505af1158015610b3b573d5f803e3d5ffd5b5050505050565b5f610b5283601760f91b84610bb7565b9392505050565b5f805f610b668585610d89565b90925090505f816004811115610b7e57610b7e611393565b148015610b9c5750856001600160a01b0316826001600160a01b0316145b80610bad5750610bad868686610dcb565b9695505050505050565b5f83818080805b8451811015610d0257603060f81b858281518110610bde57610bde6113a7565b01602001516001600160f81b03191610801590610c1f5750603960f81b858281518110610c0d57610c0d6113a7565b01602001516001600160f81b03191611155b15610c62576030858281518110610c3857610c386113a7565b0160200151610c4a919060f81c6113cf565b610c5585600a6113e2565b610c5f91906113f9565b93505b8115610c765782610c728161140c565b9350505b876001600160f81b031916858281518110610c9357610c936113a7565b01602001516001600160f81b03191603610cfa578115610cf55760405162461bcd60e51b815260206004820152601c60248201527f537472696e6720686173206d756c7469706c6520646563696d616c730000000060448201526064016103b3565b600191505b600101610bbe565b5085821115610d5e5760405162461bcd60e51b815260206004820152602260248201527f537472696e672068617320746f6f206d616e7920646563696d616c20706c6163604482015261657360f01b60648201526084016103b3565b610d6882876113cf565b610d7390600a611504565b610d7d90846113e2565b98975050505050505050565b5f808251604103610dbd576020830151604084015160608501515f1a610db187828585610eb2565b94509450505050610dc4565b505f905060025b9250929050565b5f805f856001600160a01b0316631626ba7e60e01b8686604051602401610df392919061150f565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b0319909416939093179092529051610e31919061152f565b5f60405180830381855afa9150503d805f8114610e69576040519150601f19603f3d011682016040523d82523d5f602084013e610e6e565b606091505b5091509150818015610e8257506020815110155b8015610bad57508051630b135d3f60e11b90610ea79083016020908101908401611540565b149695505050505050565b5f807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115610ee757505f90506003610f66565b604080515f8082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015610f38573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b038116610f60575f60019250925050610f66565b91505f90505b94509492505050565b80356001600160a01b0381168114610f85575f80fd5b919050565b5f60208284031215610f9a575f80fd5b610b5282610f6f565b5f5b83811015610fbd578181015183820152602001610fa5565b50505f910152565b5f8151808452610fdc816020860160208601610fa3565b601f01601f19169290920160200192915050565b602081525f610b526020830184610fc5565b5f60208284031215611012575f80fd5b5035919050565b634e487b7160e01b5f52604160045260245ffd5b60405160a0810167ffffffffffffffff8111828210171561105057611050611019565b60405290565b5f67ffffffffffffffff8084111561107057611070611019565b604051601f8501601f19908116603f0116810190828211818310171561109857611098611019565b816040528093508581528686860111156110b0575f80fd5b858560208301375f602087830101525050509392505050565b5f82601f8301126110d8575f80fd5b610b5283833560208501611056565b5f60a082840312156110f7575f80fd5b6110ff61102d565b9050813567ffffffffffffffff80821115611118575f80fd5b611124858386016110c9565b83526020840135915080821115611139575f80fd5b611145858386016110c9565b6020840152604084013591508082111561115d575f80fd5b5061116a848285016110c9565b60408301525061117c60608301610f6f565b60608201526080820135608082015292915050565b5f80604083850312156111a2575f80fd5b823567ffffffffffffffff808211156111b9575f80fd5b6111c5868387016110e7565b935060208501359150808211156111da575f80fd5b508301601f810185136111eb575f80fd5b6111fa85823560208401611056565b9150509250929050565b5f60208284031215611214575f80fd5b813567ffffffffffffffff81111561122a575f80fd5b820160408185031215610b52575f80fd5b600181811c9082168061124f57607f821691505b60208210810361126d57634e487b7160e01b5f52602260045260245ffd5b50919050565b60a081525f61128560a0830188610fc5565b82810360208401526112978188610fc5565b905082810360408401526112ab8187610fc5565b6001600160a01b039590951660608401525050608001529392505050565b5f8235609e198336030181126112dd575f80fd5b9190910192915050565b5f6103d936836110e7565b5f808335601e19843603018112611307575f80fd5b83018035915067ffffffffffffffff821115611321575f80fd5b602001915036819003821315610dc4575f80fd5b6001600160a01b03841681526040602082018190528101829052818360608301375f818301606090810191909152601f909201601f1916010192915050565b5f60208284031215611384575f80fd5b81518015158114610b52575f80fd5b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b818103818111156103d9576103d96113bb565b80820281158282048414176103d9576103d96113bb565b808201808211156103d9576103d96113bb565b5f6001820161141d5761141d6113bb565b5060010190565b600181815b8085111561145e57815f1904821115611444576114446113bb565b8085161561145157918102915b93841c9390800290611429565b509250929050565b5f82611474575060016103d9565b8161148057505f6103d9565b816001811461149657600281146114a0576114bc565b60019150506103d9565b60ff8411156114b1576114b16113bb565b50506001821b6103d9565b5060208310610133831016604e8410600b84101617156114df575081810a6103d9565b6114e98383611424565b805f19048211156114fc576114fc6113bb565b029392505050565b5f610b528383611466565b828152604060208201525f6115276040830184610fc5565b949350505050565b5f82516112dd818460208701610fa3565b5f60208284031215611550575f80fd5b505191905056fea2646970667358221220a045468bb004118b07af797018e984a7241e9f281c0d78c81df5377b5a08748264736f6c63430008180033", + "deployedBytecode": "0x608060405234801561000f575f80fd5b50600436106100e5575f3560e01c8063b870676c11610088578063dec965d311610063578063dec965d3146101e2578063f193eda6146101f5578063f2fde38b146101fe578063f437bc5914610211575f80fd5b8063b870676c14610195578063beb15c21146101a8578063dbac5821146101cb575f80fd5b80635e280f11116100c35780635e280f1114610155578063715018a61461016a5780638da5cb5b14610172578063b2a3fda414610182575f80fd5b80630fa4ed4d146100e957806315d276e1146101195780634e06a32b14610140575b5f80fd5b6005546100fc906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6100fc7f000000000000000000000000000000000000000000000000000000000000000081565b61015361014e366004610f8a565b610219565b005b61015d610275565b6040516101109190610ff0565b610153610301565b5f546001600160a01b03166100fc565b610153610190366004611002565b610314565b6003546100fc906001600160a01b031681565b6101bb6101b6366004611191565b610321565b6040519015158152602001610110565b6101d460045481565b604051908152602001610110565b6101d46101f0366004611204565b6103df565b6101d460065481565b61015361020c366004610f8a565b61072d565b61015d6107a6565b6102216107b3565b600580546001600160a01b0319166001600160a01b0383169081179091556040519081527fb8603ceabf8ee4633f1fd8c0ae9e0e64f2fc2fea5cb79a96c18efd007aab6f969060200160405180910390a150565b600180546102829061123b565b80601f01602080910402602001604051908101604052809291908181526020018280546102ae9061123b565b80156102f95780601f106102d0576101008083540402835291602001916102f9565b820191905f5260205f20905b8154815290600101906020018083116102dc57829003601f168201915b505050505081565b6103096107b3565b6103125f61080c565b565b61031c6107b3565b600455565b5f80835f0151846020015185604001518660600151876080015160405160200161034f959493929190611273565b604051602081830303815290604052905060065484608001515f1b146103bc5760405162461bcd60e51b815260206004820152601760248201527f496e76616c6964206e6f74617279206b6579206861736800000000000000000060448201526064015b60405180910390fd5b6005546103d590829085906001600160a01b031661085b565b9150505b92915050565b5f336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146104585760405162461bcd60e51b815260206004820181905260248201527f4f6e6c792052616d702063616e2063616c6c20746869732066756e6374696f6e60448201526064016103b3565b6104b461046583806112c9565b61046e906112e7565b61047b60208501856112f2565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152506108ae92505050565b610591600180546104c49061123b565b80601f01602080910402602001604051908101604052809291908181526020018280546104f09061123b565b801561053b5780601f106105125761010080835404028352916020019161053b565b820191905f5260205f20905b81548152906001019060200180831161051e57829003601f168201915b5061054e93508792508291506112c99050565b61055890806112f2565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152506108f892505050565b610672600280546105a19061123b565b80601f01602080910402602001604051908101604052809291908181526020018280546105cd9061123b565b80156106185780601f106105ef57610100808354040283529160200191610618565b820191905f5260205f20905b8154815290600101906020018083116105fb57829003601f168201915b5061062b93508792508291506112c99050565b6106399060208101906112f2565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061099392505050565b6106d561067f83806112c9565b610690906080810190606001610f8a565b61069a84806112c9565b6106a89060408101906112f2565b6040516020016106ba93929190611335565b60405160208183030381529060405280519060200120610a2e565b6103d95f6106e384806112c9565b6106f19060408101906112f2565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152509293925050610b429050565b6107356107b3565b6001600160a01b03811661079a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016103b3565b6107a38161080c565b50565b600280546102829061123b565b5f546001600160a01b031633146103125760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016103b3565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b825160208401207f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f908152601c91909152603c81206108a56001600160a01b0384168286610b59565b95945050505050565b6108b88282610321565b6108f45760405162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b210383937b7b360991b60448201526064016103b3565b5050565b806040516020016109099190610ff0565b60405160208183030381529060405280519060200120826040516020016109309190610ff0565b60405160208183030381529060405280519060200120146108f45760405162461bcd60e51b815260206004820181905260248201527f456e64706f696e7420646f6573206e6f74206d6174636820657870656374656460448201526064016103b3565b806040516020016109a49190610ff0565b60405160208183030381529060405280519060200120826040516020016109cb9190610ff0565b60405160208183030381529060405280519060200120146108f45760405162461bcd60e51b815260206004820152601c60248201527f486f737420646f6573206e6f74206d617463682065787065637465640000000060448201526064016103b3565b60035460405163169394bb60e01b8152600481018390526001600160a01b039091169063169394bb90602401602060405180830381865afa158015610a75573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a999190611374565b15610ae65760405162461bcd60e51b815260206004820152601f60248201527f4e756c6c69666965722068617320616c7265616479206265656e20757365640060448201526064016103b3565b600354604051632dea6f9960e11b8152600481018390526001600160a01b0390911690635bd4df32906024015f604051808303815f87803b158015610b29575f80fd5b505af1158015610b3b573d5f803e3d5ffd5b5050505050565b5f610b5283601760f91b84610bb7565b9392505050565b5f805f610b668585610d89565b90925090505f816004811115610b7e57610b7e611393565b148015610b9c5750856001600160a01b0316826001600160a01b0316145b80610bad5750610bad868686610dcb565b9695505050505050565b5f83818080805b8451811015610d0257603060f81b858281518110610bde57610bde6113a7565b01602001516001600160f81b03191610801590610c1f5750603960f81b858281518110610c0d57610c0d6113a7565b01602001516001600160f81b03191611155b15610c62576030858281518110610c3857610c386113a7565b0160200151610c4a919060f81c6113cf565b610c5585600a6113e2565b610c5f91906113f9565b93505b8115610c765782610c728161140c565b9350505b876001600160f81b031916858281518110610c9357610c936113a7565b01602001516001600160f81b03191603610cfa578115610cf55760405162461bcd60e51b815260206004820152601c60248201527f537472696e6720686173206d756c7469706c6520646563696d616c730000000060448201526064016103b3565b600191505b600101610bbe565b5085821115610d5e5760405162461bcd60e51b815260206004820152602260248201527f537472696e672068617320746f6f206d616e7920646563696d616c20706c6163604482015261657360f01b60648201526084016103b3565b610d6882876113cf565b610d7390600a611504565b610d7d90846113e2565b98975050505050505050565b5f808251604103610dbd576020830151604084015160608501515f1a610db187828585610eb2565b94509450505050610dc4565b505f905060025b9250929050565b5f805f856001600160a01b0316631626ba7e60e01b8686604051602401610df392919061150f565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b0319909416939093179092529051610e31919061152f565b5f60405180830381855afa9150503d805f8114610e69576040519150601f19603f3d011682016040523d82523d5f602084013e610e6e565b606091505b5091509150818015610e8257506020815110155b8015610bad57508051630b135d3f60e11b90610ea79083016020908101908401611540565b149695505050505050565b5f807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115610ee757505f90506003610f66565b604080515f8082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015610f38573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b038116610f60575f60019250925050610f66565b91505f90505b94509492505050565b80356001600160a01b0381168114610f85575f80fd5b919050565b5f60208284031215610f9a575f80fd5b610b5282610f6f565b5f5b83811015610fbd578181015183820152602001610fa5565b50505f910152565b5f8151808452610fdc816020860160208601610fa3565b601f01601f19169290920160200192915050565b602081525f610b526020830184610fc5565b5f60208284031215611012575f80fd5b5035919050565b634e487b7160e01b5f52604160045260245ffd5b60405160a0810167ffffffffffffffff8111828210171561105057611050611019565b60405290565b5f67ffffffffffffffff8084111561107057611070611019565b604051601f8501601f19908116603f0116810190828211818310171561109857611098611019565b816040528093508581528686860111156110b0575f80fd5b858560208301375f602087830101525050509392505050565b5f82601f8301126110d8575f80fd5b610b5283833560208501611056565b5f60a082840312156110f7575f80fd5b6110ff61102d565b9050813567ffffffffffffffff80821115611118575f80fd5b611124858386016110c9565b83526020840135915080821115611139575f80fd5b611145858386016110c9565b6020840152604084013591508082111561115d575f80fd5b5061116a848285016110c9565b60408301525061117c60608301610f6f565b60608201526080820135608082015292915050565b5f80604083850312156111a2575f80fd5b823567ffffffffffffffff808211156111b9575f80fd5b6111c5868387016110e7565b935060208501359150808211156111da575f80fd5b508301601f810185136111eb575f80fd5b6111fa85823560208401611056565b9150509250929050565b5f60208284031215611214575f80fd5b813567ffffffffffffffff81111561122a575f80fd5b820160408185031215610b52575f80fd5b600181811c9082168061124f57607f821691505b60208210810361126d57634e487b7160e01b5f52602260045260245ffd5b50919050565b60a081525f61128560a0830188610fc5565b82810360208401526112978188610fc5565b905082810360408401526112ab8187610fc5565b6001600160a01b039590951660608401525050608001529392505050565b5f8235609e198336030181126112dd575f80fd5b9190910192915050565b5f6103d936836110e7565b5f808335601e19843603018112611307575f80fd5b83018035915067ffffffffffffffff821115611321575f80fd5b602001915036819003821315610dc4575f80fd5b6001600160a01b03841681526040602082018190528101829052818360608301375f818301606090810191909152601f909201601f1916010192915050565b5f60208284031215611384575f80fd5b81518015158114610b52575f80fd5b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b818103818111156103d9576103d96113bb565b80820281158282048414176103d9576103d96113bb565b808201808211156103d9576103d96113bb565b5f6001820161141d5761141d6113bb565b5060010190565b600181815b8085111561145e57815f1904821115611444576114446113bb565b8085161561145157918102915b93841c9390800290611429565b509250929050565b5f82611474575060016103d9565b8161148057505f6103d9565b816001811461149657600281146114a0576114bc565b60019150506103d9565b60ff8411156114b1576114b16113bb565b50506001821b6103d9565b5060208310610133831016604e8410600b84101617156114df575081810a6103d9565b6114e98383611424565b805f19048211156114fc576114fc6113bb565b029392505050565b5f610b528383611466565b828152604060208201525f6115276040830184610fc5565b949350505050565b5f82516112dd818460208701610fa3565b5f60208284031215611550575f80fd5b505191905056fea2646970667358221220a045468bb004118b07af797018e984a7241e9f281c0d78c81df5377b5a08748264736f6c63430008180033", + "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." + }, + "setTimestampBuffer(uint256)": { + "params": { + "_timestampBuffer": "The timestamp buffer for validated TLS calls" + } + }, + "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": { + "setTimestampBuffer(uint256)": { + "notice": "ONLY OWNER: Sets the timestamp buffer for validated TLS calls. 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/ramps/revolut/RevolutAccountRegistrationProcessor.sol:RevolutAccountRegistrationProcessor", + "label": "_owner", + "offset": 0, + "slot": "0", + "type": "t_address" + }, + { + "astId": 6237, + "contract": "contracts/ramps/revolut/RevolutAccountRegistrationProcessor.sol:RevolutAccountRegistrationProcessor", + "label": "endpoint", + "offset": 0, + "slot": "1", + "type": "t_string_storage" + }, + { + "astId": 6239, + "contract": "contracts/ramps/revolut/RevolutAccountRegistrationProcessor.sol:RevolutAccountRegistrationProcessor", + "label": "host", + "offset": 0, + "slot": "2", + "type": "t_string_storage" + }, + { + "astId": 6242, + "contract": "contracts/ramps/revolut/RevolutAccountRegistrationProcessor.sol:RevolutAccountRegistrationProcessor", + "label": "nullifierRegistry", + "offset": 0, + "slot": "3", + "type": "t_contract(INullifierRegistry)6636" + }, + { + "astId": 6244, + "contract": "contracts/ramps/revolut/RevolutAccountRegistrationProcessor.sol:RevolutAccountRegistrationProcessor", + "label": "timestampBuffer", + "offset": 0, + "slot": "4", + "type": "t_uint256" + }, + { + "astId": 13417, + "contract": "contracts/ramps/revolut/RevolutAccountRegistrationProcessor.sol:RevolutAccountRegistrationProcessor", + "label": "verifierSigningKey", + "offset": 0, + "slot": "5", + "type": "t_address" + }, + { + "astId": 13419, + "contract": "contracts/ramps/revolut/RevolutAccountRegistrationProcessor.sol:RevolutAccountRegistrationProcessor", + "label": "notaryKeyHash", + "offset": 0, + "slot": "6", + "type": "t_bytes32" + } + ], + "types": { + "t_address": { + "encoding": "inplace", + "label": "address", + "numberOfBytes": "20" + }, + "t_bytes32": { + "encoding": "inplace", + "label": "bytes32", + "numberOfBytes": "32" + }, + "t_contract(INullifierRegistry)6636": { + "encoding": "inplace", + "label": "contract INullifierRegistry", + "numberOfBytes": "20" + }, + "t_string_storage": { + "encoding": "bytes", + "label": "string", + "numberOfBytes": "32" + }, + "t_uint256": { + "encoding": "inplace", + "label": "uint256", + "numberOfBytes": "32" + } + } + } +} \ No newline at end of file diff --git a/contracts/deployments/encifher/RevolutAccountRegistry.json b/contracts/deployments/encifher/RevolutAccountRegistry.json new file mode 100644 index 000000000..c893243bb --- /dev/null +++ b/contracts/deployments/encifher/RevolutAccountRegistry.json @@ -0,0 +1,790 @@ +{ + "address": "0x2fb5e98f1eFE95aE50F9BecAfCE660701aD8D9be", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_owner", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "accountOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "accountId", + "type": "bytes32" + } + ], + "name": "AccountRegistered", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bytes32", + "name": "listOwner", + "type": "bytes32" + } + ], + "name": "AllowlistEnabled", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "registrationProcessor", + "type": "address" + } + ], + "name": "NewAccountRegistrationProcessorSet", + "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": "bytes32", + "name": "listOwner", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "allowedUser", + "type": "bytes32" + } + ], + "name": "UserAddedToAllowlist", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bytes32", + "name": "listOwner", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "deniedUser", + "type": "bytes32" + } + ], + "name": "UserAddedToDenylist", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "listOwner", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "allowedUser", + "type": "bytes32" + } + ], + "name": "UserRemovedFromAllowlist", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bytes32", + "name": "listOwner", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "approvedUser", + "type": "bytes32" + } + ], + "name": "UserRemovedFromDenylist", + "type": "event" + }, + { + "inputs": [], + "name": "accountRegistrationProcessor", + "outputs": [ + { + "internalType": "contract IRevolutAccountRegistrationProcessor", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_deniedUser", + "type": "bytes32" + } + ], + "name": "addAccountToDenylist", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32[]", + "name": "_allowedUsers", + "type": "bytes32[]" + } + ], + "name": "addAccountsToAllowlist", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "enableAllowlist", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_account", + "type": "address" + } + ], + "name": "getAccountId", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_account", + "type": "address" + } + ], + "name": "getAllowedUsers", + "outputs": [ + { + "internalType": "bytes32[]", + "name": "", + "type": "bytes32[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_account", + "type": "address" + } + ], + "name": "getDeniedUsers", + "outputs": [ + { + "internalType": "bytes32[]", + "name": "", + "type": "bytes32[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IRevolutAccountRegistrationProcessor", + "name": "_accountRegistrationProcessor", + "type": "address" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_account", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "_allowedUser", + "type": "bytes32" + } + ], + "name": "isAllowedUser", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_account", + "type": "address" + } + ], + "name": "isAllowlistEnabled", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_account", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "_deniedUser", + "type": "bytes32" + } + ], + "name": "isDeniedUser", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "isInitialized", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_account", + "type": "address" + } + ], + "name": "isRegisteredUser", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "components": [ + { + "internalType": "string", + "name": "endpoint", + "type": "string" + }, + { + "internalType": "string", + "name": "host", + "type": "string" + }, + { + "internalType": "string", + "name": "profileId", + "type": "string" + }, + { + "internalType": "address", + "name": "userAddress", + "type": "address" + }, + { + "internalType": "uint256", + "name": "notaryKeyHash", + "type": "uint256" + } + ], + "internalType": "struct IRevolutAccountRegistrationProcessor.RegistrationData", + "name": "public_values", + "type": "tuple" + }, + { + "internalType": "bytes", + "name": "proof", + "type": "bytes" + } + ], + "internalType": "struct IRevolutAccountRegistrationProcessor.RegistrationProof", + "name": "_proof", + "type": "tuple" + } + ], + "name": "register", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_approvedUser", + "type": "bytes32" + } + ], + "name": "removeAccountFromDenylist", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32[]", + "name": "_disallowedUsers", + "type": "bytes32[]" + } + ], + "name": "removeAccountsFromAllowlist", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IRevolutAccountRegistrationProcessor", + "name": "_registrationProcessor", + "type": "address" + } + ], + "name": "setAccountRegistrationProcessor", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "transactionHash": "0x608cd749e22cb43ba8a54c882bdabfcf9cd3f22d4440116671a93ad96860925c", + "receipt": { + "to": null, + "from": "0xa0Ee7A142d267C1f36714E4a8F75612F20a79720", + "contractAddress": "0x2fb5e98f1eFE95aE50F9BecAfCE660701aD8D9be", + "transactionIndex": 0, + "gasUsed": "1061416", + "logsBloom": "0x00000000000000000000040000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000008000000000000000000020000000000000000002800000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000004000000020000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0xd0dfa2b28cae36c355cee75053dd6c778b90421f31bcfc748dc9cf9252edea96", + "transactionHash": "0x608cd749e22cb43ba8a54c882bdabfcf9cd3f22d4440116671a93ad96860925c", + "logs": [ + { + "transactionIndex": 0, + "blockNumber": 61403, + "transactionHash": "0x608cd749e22cb43ba8a54c882bdabfcf9cd3f22d4440116671a93ad96860925c", + "address": "0x2fb5e98f1eFE95aE50F9BecAfCE660701aD8D9be", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x000000000000000000000000a0ee7a142d267c1f36714e4a8f75612f20a79720" + ], + "data": "0x", + "logIndex": 0, + "blockHash": "0xd0dfa2b28cae36c355cee75053dd6c778b90421f31bcfc748dc9cf9252edea96" + }, + { + "transactionIndex": 0, + "blockNumber": 61403, + "transactionHash": "0x608cd749e22cb43ba8a54c882bdabfcf9cd3f22d4440116671a93ad96860925c", + "address": "0x2fb5e98f1eFE95aE50F9BecAfCE660701aD8D9be", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x000000000000000000000000a0ee7a142d267c1f36714e4a8f75612f20a79720", + "0x000000000000000000000000a0ee7a142d267c1f36714e4a8f75612f20a79720" + ], + "data": "0x", + "logIndex": 1, + "blockHash": "0xd0dfa2b28cae36c355cee75053dd6c778b90421f31bcfc748dc9cf9252edea96" + } + ], + "blockNumber": 61403, + "cumulativeGasUsed": "1061416", + "status": 1, + "byzantium": true + }, + "args": [ + "0xa0Ee7A142d267C1f36714E4a8F75612F20a79720" + ], + "numDeployments": 1, + "solcInputHash": "75b8f55da346d7ed99a350632554d2fb", + "metadata": "{\"compiler\":{\"version\":\"0.8.24+commit.e11b9ed9\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"accountOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"accountId\",\"type\":\"bytes32\"}],\"name\":\"AccountRegistered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"listOwner\",\"type\":\"bytes32\"}],\"name\":\"AllowlistEnabled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"registrationProcessor\",\"type\":\"address\"}],\"name\":\"NewAccountRegistrationProcessorSet\",\"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\":\"bytes32\",\"name\":\"listOwner\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"allowedUser\",\"type\":\"bytes32\"}],\"name\":\"UserAddedToAllowlist\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"listOwner\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"deniedUser\",\"type\":\"bytes32\"}],\"name\":\"UserAddedToDenylist\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"listOwner\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"allowedUser\",\"type\":\"bytes32\"}],\"name\":\"UserRemovedFromAllowlist\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"listOwner\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"approvedUser\",\"type\":\"bytes32\"}],\"name\":\"UserRemovedFromDenylist\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"accountRegistrationProcessor\",\"outputs\":[{\"internalType\":\"contract IRevolutAccountRegistrationProcessor\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_deniedUser\",\"type\":\"bytes32\"}],\"name\":\"addAccountToDenylist\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[]\",\"name\":\"_allowedUsers\",\"type\":\"bytes32[]\"}],\"name\":\"addAccountsToAllowlist\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"enableAllowlist\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_account\",\"type\":\"address\"}],\"name\":\"getAccountId\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_account\",\"type\":\"address\"}],\"name\":\"getAllowedUsers\",\"outputs\":[{\"internalType\":\"bytes32[]\",\"name\":\"\",\"type\":\"bytes32[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_account\",\"type\":\"address\"}],\"name\":\"getDeniedUsers\",\"outputs\":[{\"internalType\":\"bytes32[]\",\"name\":\"\",\"type\":\"bytes32[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IRevolutAccountRegistrationProcessor\",\"name\":\"_accountRegistrationProcessor\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_account\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"_allowedUser\",\"type\":\"bytes32\"}],\"name\":\"isAllowedUser\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_account\",\"type\":\"address\"}],\"name\":\"isAllowlistEnabled\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_account\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"_deniedUser\",\"type\":\"bytes32\"}],\"name\":\"isDeniedUser\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isInitialized\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_account\",\"type\":\"address\"}],\"name\":\"isRegisteredUser\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"endpoint\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"host\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"profileId\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"userAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"notaryKeyHash\",\"type\":\"uint256\"}],\"internalType\":\"struct IRevolutAccountRegistrationProcessor.RegistrationData\",\"name\":\"public_values\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"proof\",\"type\":\"bytes\"}],\"internalType\":\"struct IRevolutAccountRegistrationProcessor.RegistrationProof\",\"name\":\"_proof\",\"type\":\"tuple\"}],\"name\":\"register\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_approvedUser\",\"type\":\"bytes32\"}],\"name\":\"removeAccountFromDenylist\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[]\",\"name\":\"_disallowedUsers\",\"type\":\"bytes32[]\"}],\"name\":\"removeAccountsFromAllowlist\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IRevolutAccountRegistrationProcessor\",\"name\":\"_registrationProcessor\",\"type\":\"address\"}],\"name\":\"setAccountRegistrationProcessor\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"addAccountToDenylist(bytes32)\":{\"params\":{\"_deniedUser\":\"accountId being banned\"}},\"addAccountsToAllowlist(bytes32[])\":{\"params\":{\"_allowedUsers\":\"List of accountIds allowed to signal intents on the user's deposit\"}},\"initialize(address)\":{\"params\":{\"_accountRegistrationProcessor\":\"Account Registration processor address\"}},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"register(((string,string,string,address,uint256),bytes))\":{\"params\":{\"_proof\":\"Registration proof consisting of unredacted data being notarized and a signature\"}},\"removeAccountFromDenylist(bytes32)\":{\"params\":{\"_approvedUser\":\"accountId being approved\"}},\"removeAccountsFromAllowlist(bytes32[])\":{\"params\":{\"_disallowedUsers\":\"List of accountIds being approved\"}},\"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.\"},\"setAccountRegistrationProcessor(address)\":{\"params\":{\"_registrationProcessor\":\"New registration proccesor address\"}},\"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\":{\"addAccountToDenylist(bytes32)\":{\"notice\":\"Adds an accountId to a depositor's deny list. If an address associated with the banned accountId attempts to signal an intent on the user's deposit they will be denied.\"},\"addAccountsToAllowlist(bytes32[])\":{\"notice\":\"Adds passed accountIds to a depositor's allow list. All addresses associated with the allowed accountIds will be able to signal intents on the user's deposit.\"},\"enableAllowlist()\":{\"notice\":\"Enables allow list for user, only users on the allow list will be able to signal intents on the user's deposit.\"},\"initialize(address)\":{\"notice\":\"Initialize Ramp with the addresses of the Processors\"},\"register(((string,string,string,address,uint256),bytes))\":{\"notice\":\"Registers a new account by pulling the profileId from the proof and assigning the account owner to the sender of the transaction.\"},\"removeAccountFromDenylist(bytes32)\":{\"notice\":\"Removes an accountId from a depositor's deny list.\"},\"removeAccountsFromAllowlist(bytes32[])\":{\"notice\":\"Removes an passed accountId's from allow list. If allow list is enabled only users on the allow list will be able to signal intents on the user's deposit.\"},\"setAccountRegistrationProcessor(address)\":{\"notice\":\"GOVERNANCE ONLY: Updates the account registration processor address used for validating and interpreting tls proofs.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/ramps/revolut/RevolutAccountRegistry.sol\":\"RevolutAccountRegistry\"},\"evmVersion\":\"shanghai\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"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 v4.4.1 (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\",\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"license\":\"MIT\"},\"contracts/external/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/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 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\":\"0x102021415f8444ff563fc6d0082f39296f47c09ce73fb4cd642e700ac489eefe\",\"license\":\"Apache-2.0\"},\"contracts/ramps/revolut/RevolutAccountRegistry.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\n\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\nimport { Bytes32ArrayUtils } from \\\"../../external/Bytes32ArrayUtils.sol\\\";\\nimport { Uint256ArrayUtils } from \\\"../../external/Uint256ArrayUtils.sol\\\";\\n\\nimport { IRevolutAccountRegistrationProcessor } from \\\"./interfaces/IRevolutAccountRegistrationProcessor.sol\\\";\\nimport { IRevolutAccountRegistry } from \\\"./interfaces/IRevolutAccountRegistry.sol\\\";\\n\\npragma solidity ^0.8.18;\\n\\ncontract RevolutAccountRegistry is IRevolutAccountRegistry, Ownable {\\n using Bytes32ArrayUtils for bytes32[];\\n using Uint256ArrayUtils for uint256[];\\n\\n /* ============ Events ============ */\\n event AccountRegistered(address indexed accountOwner, bytes32 indexed accountId);\\n\\n event UserAddedToDenylist(bytes32 listOwner, bytes32 deniedUser);\\n event UserRemovedFromDenylist(bytes32 listOwner, bytes32 approvedUser);\\n\\n event AllowlistEnabled(bytes32 listOwner);\\n event UserAddedToAllowlist(bytes32 indexed listOwner, bytes32 allowedUser);\\n event UserRemovedFromAllowlist(bytes32 indexed listOwner, bytes32 allowedUser);\\n\\n event NewAccountRegistrationProcessorSet(address registrationProcessor);\\n\\n /* ============ Structs ============ */\\n\\n struct DenyList {\\n bytes32[] deniedUsers; // Array of accountIds that are denied from taking depositors liquidity\\n mapping(bytes32 => bool) isDenied; // Mapping of accountId to boolean indicating if the user is denied\\n }\\n\\n struct AllowList {\\n bool isEnabled; // Boolean indicating if the allowlist is enabled\\n bytes32[] allowedUsers; // Array of accountIds that are allowed from taking depositors liquidity\\n mapping(bytes32 => bool) isAllowed; // Mapping of accountId to boolean indicating if the user is allowed\\n }\\n\\n /* ============ Modifiers ============ */\\n modifier onlyRegisteredUser() {\\n require(isRegisteredUser(msg.sender), \\\"Caller must be registered user\\\");\\n _;\\n }\\n\\n /* ============ State Variables ============ */\\n IRevolutAccountRegistrationProcessor public accountRegistrationProcessor; // Address of Account registration processor contract\\n\\n bool public isInitialized; // Indicates if contract has been initialized\\n\\n mapping(address => bytes32) internal accounts; // Mapping of Ethereum accounts to hash of original Rev Tag\\n // resulting hash is the accountId for our system\\n mapping(bytes32 => DenyList) internal denyList; // Mapping of accountId to denylist\\n mapping(bytes32 => AllowList) internal allowList; // Mapping of accountId to allow list\\n\\n /* ============ Constructor ============ */\\n constructor(\\n address _owner\\n )\\n Ownable()\\n {\\n transferOwnership(_owner);\\n }\\n\\n /* ============ External Functions ============ */\\n\\n /**\\n * @notice Initialize Ramp with the addresses of the Processors\\n *\\n * @param _accountRegistrationProcessor Account Registration processor address\\n */\\n function initialize(\\n IRevolutAccountRegistrationProcessor _accountRegistrationProcessor\\n )\\n external\\n onlyOwner\\n {\\n require(!isInitialized, \\\"Already initialized\\\");\\n\\n accountRegistrationProcessor = _accountRegistrationProcessor;\\n\\n isInitialized = true;\\n }\\n\\n /**\\n * @notice Registers a new account by pulling the profileId from the proof and assigning the account owner to the\\n * sender of the transaction.\\n *\\n * @param _proof Registration proof consisting of unredacted data being notarized and a signature\\n */\\n function register(\\n IRevolutAccountRegistrationProcessor.RegistrationProof calldata _proof\\n )\\n external\\n {\\n require(msg.sender == _proof.public_values.userAddress, \\\"Caller must be address specified in proof\\\");\\n require(accounts[msg.sender] == bytes32(0), \\\"Account already associated with accountId\\\");\\n bytes32 accountId = _verifyRegistrationProof(_proof);\\n\\n accounts[msg.sender] = accountId;\\n\\n emit AccountRegistered(msg.sender, accountId);\\n }\\n\\n /**\\n * @notice Adds an accountId to a depositor's deny list. If an address associated with the banned accountId attempts to\\n * signal an intent on the user's deposit they will be denied.\\n *\\n * @param _deniedUser accountId being banned\\n */\\n function addAccountToDenylist(bytes32 _deniedUser) external onlyRegisteredUser {\\n bytes32 denyingUser = accounts[msg.sender];\\n\\n require(!denyList[denyingUser].isDenied[_deniedUser], \\\"User already on denylist\\\");\\n\\n denyList[denyingUser].isDenied[_deniedUser] = true;\\n denyList[denyingUser].deniedUsers.push(_deniedUser);\\n\\n emit UserAddedToDenylist(denyingUser, _deniedUser);\\n }\\n\\n /**\\n * @notice Removes an accountId from a depositor's deny list.\\n *\\n * @param _approvedUser accountId being approved\\n */\\n function removeAccountFromDenylist(bytes32 _approvedUser) external onlyRegisteredUser {\\n bytes32 approvingUser = accounts[msg.sender];\\n\\n require(denyList[approvingUser].isDenied[_approvedUser], \\\"User not on denylist\\\");\\n\\n denyList[approvingUser].isDenied[_approvedUser] = false;\\n denyList[approvingUser].deniedUsers.removeStorage(_approvedUser);\\n\\n emit UserRemovedFromDenylist(approvingUser, _approvedUser);\\n }\\n\\n /**\\n * @notice Enables allow list for user, only users on the allow list will be able to signal intents on the user's deposit.\\n */\\n function enableAllowlist() external onlyRegisteredUser {\\n bytes32 allowingUser = accounts[msg.sender];\\n\\n require(!allowList[allowingUser].isEnabled, \\\"Allow list already enabled\\\");\\n\\n allowList[allowingUser].isEnabled = true;\\n\\n emit AllowlistEnabled(allowingUser);\\n }\\n\\n /**\\n * @notice Adds passed accountIds to a depositor's allow list. All addresses associated with the allowed accountIds will\\n * be able to signal intents on the user's deposit.\\n *\\n * @param _allowedUsers List of accountIds allowed to signal intents on the user's deposit\\n */\\n function addAccountsToAllowlist(bytes32[] memory _allowedUsers) external onlyRegisteredUser {\\n bytes32 allowingUser = accounts[msg.sender];\\n\\n for(uint256 i = 0; i < _allowedUsers.length; i++) {\\n bytes32 allowedUser = _allowedUsers[i];\\n\\n require(!allowList[allowingUser].isAllowed[allowedUser], \\\"User already on allowlist\\\");\\n\\n allowList[allowingUser].isAllowed[allowedUser] = true;\\n allowList[allowingUser].allowedUsers.push(allowedUser);\\n\\n emit UserAddedToAllowlist(allowingUser, allowedUser);\\n }\\n }\\n\\n /**\\n * @notice Removes an passed accountId's from allow list. If allow list is enabled only users on the allow list will be\\n * able to signal intents on the user's deposit.\\n *\\n * @param _disallowedUsers List of accountIds being approved\\n */\\n function removeAccountsFromAllowlist(bytes32[] memory _disallowedUsers) external onlyRegisteredUser {\\n bytes32 disallowingUser = accounts[msg.sender];\\n\\n for(uint256 i = 0; i < _disallowedUsers.length; i++) {\\n bytes32 disallowedUser = _disallowedUsers[i];\\n\\n require(allowList[disallowingUser].isAllowed[disallowedUser], \\\"User not on allowlist\\\");\\n\\n allowList[disallowingUser].isAllowed[disallowedUser] = false;\\n allowList[disallowingUser].allowedUsers.removeStorage(disallowedUser);\\n\\n emit UserRemovedFromAllowlist(disallowingUser, disallowedUser);\\n }\\n }\\n\\n /* ============ Governance Functions ============ */\\n\\n /**\\n * @notice GOVERNANCE ONLY: Updates the account registration processor address used for validating and interpreting tls proofs.\\n *\\n * @param _registrationProcessor New registration proccesor address\\n */\\n function setAccountRegistrationProcessor(IRevolutAccountRegistrationProcessor _registrationProcessor) external onlyOwner {\\n accountRegistrationProcessor = _registrationProcessor;\\n emit NewAccountRegistrationProcessorSet(address(_registrationProcessor));\\n }\\n\\n /* ============ External View Functions ============ */\\n\\n function getAccountId(address _account) public view returns (bytes32) {\\n return accounts[_account];\\n }\\n\\n function isRegisteredUser(address _account) public view returns (bool) {\\n return getAccountId(_account) != bytes32(0);\\n }\\n\\n function getDeniedUsers(address _account) external view returns (bytes32[] memory) {\\n return denyList[getAccountId(_account)].deniedUsers;\\n }\\n\\n function isDeniedUser(address _account, bytes32 _deniedUser) external view returns (bool) {\\n return denyList[getAccountId(_account)].isDenied[_deniedUser];\\n }\\n\\n function isAllowlistEnabled(address _account) external view returns (bool) {\\n return allowList[getAccountId(_account)].isEnabled;\\n }\\n\\n function getAllowedUsers(address _account) external view returns (bytes32[] memory) {\\n return allowList[getAccountId(_account)].allowedUsers;\\n }\\n\\n function isAllowedUser(address _account, bytes32 _allowedUser) external view returns (bool) {\\n bytes32 allowingUser = getAccountId(_account);\\n\\n // Deny list overrides, if user on deny list then they are not allowed\\n if(denyList[allowingUser].isDenied[_allowedUser]) { return false; }\\n\\n // Check if allow list is enabled, if so return status of user, else return true\\n return allowList[allowingUser].isEnabled ? allowList[allowingUser].isAllowed[_allowedUser] : true;\\n }\\n \\n /* ============ Internal Functions ============ */\\n\\n /**\\n * @notice Validate the user has an Revolut account. We nullify this accountId along with the calling address so that\\n * it can't be used again.\\n */\\n function _verifyRegistrationProof(\\n IRevolutAccountRegistrationProcessor.RegistrationProof calldata _proof\\n )\\n internal\\n returns (bytes32 accountId)\\n {\\n accountId = accountRegistrationProcessor.processProof(_proof);\\n }\\n}\\n\",\"keccak256\":\"0x686d9b6ae09e5786bb2e18735d5e8a515657f99ca2850e261058fc4ffce3d64c\",\"license\":\"MIT\"},\"contracts/ramps/revolut/interfaces/IRevolutAccountRegistrationProcessor.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.18;\\n\\ninterface IRevolutAccountRegistrationProcessor {\\n\\n struct RegistrationData {\\n string endpoint;\\n string host;\\n string profileId;\\n address userAddress;\\n uint256 notaryKeyHash;\\n }\\n\\n struct RegistrationProof {\\n RegistrationData public_values;\\n bytes proof;\\n }\\n\\n function processProof(\\n RegistrationProof calldata _proof\\n )\\n external\\n returns (bytes32);\\n}\\n\",\"keccak256\":\"0xb3e358861c8fb5d7c81c48e3eac4e0f4ce3c03ddfe4136aada9759b61e5e465a\",\"license\":\"MIT\"},\"contracts/ramps/revolut/interfaces/IRevolutAccountRegistry.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.18;\\n\\ninterface IRevolutAccountRegistry {\\n function getAccountId(address _account) external view returns (bytes32);\\n function isRegisteredUser(address _account) external view returns (bool);\\n function isAllowedUser(address _account, bytes32 _deniedUser) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x5c58e8996f2d06f3d8bad7b3cef912c6370eecb2f3523ff8c1e15ec05dfb8e74\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x608060405234801562000010575f80fd5b50604051620015413803806200154183398101604081905262000033916200017f565b6200003e3362000050565b62000049816200009f565b50620001ae565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b620000a962000122565b6001600160a01b038116620001145760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b6200011f8162000050565b50565b5f546001600160a01b031633146200017d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016200010b565b565b5f6020828403121562000190575f80fd5b81516001600160a01b0381168114620001a7575f80fd5b9392505050565b61138580620001bc5f395ff3fe608060405234801561000f575f80fd5b5060043610610127575f3560e01c8063715018a6116100a9578063d88452451161006e578063d88452451461026c578063e0b490f71461027f578063e39ca3b4146102a0578063f2fde38b146102b3578063fbf15b1f146102c6575f80fd5b8063715018a6146102265780638da5cb5b1461022e5780639b357b5a1461023e578063c4d66de814610251578063c6a2aac814610264575f80fd5b80631f5bdf5d116100ef5780631f5bdf5d146101b95780633056eb28146101cc57806338e4bef6146101df578063392e53cd146101f25780634595bba014610206575f80fd5b8063066a82fe1461012b5780630876dda314610140578063148172da146101705780631acd84d8146101835780631e48fe6b146101a6575b5f80fd5b61013e610139366004610f88565b6102d9565b005b600154610153906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b61013e61017e366004610fc6565b610423565b610196610191366004610ff1565b61053f565b6040519015158152602001610167565b61013e6101b436600461102f565b6105c0565b6101966101c73660046110e8565b610701565b61013e6101da3660046110e8565b610714565b6101966101ed3660046110e8565b610771565b60015461019690600160a01b900460ff1681565b6102196102143660046110e8565b610797565b6040516101679190611103565b61013e610808565b5f546001600160a01b0316610153565b61013e61024c366004610fc6565b61081b565b61013e61025f3660046110e8565b610918565b61013e610997565b61013e61027a36600461102f565b610a74565b61029261028d3660046110e8565b610bc1565b604051908152602001610167565b6102196102ae3660046110e8565b610bdb565b61013e6102c13660046110e8565b610c4b565b6101966102d4366004610ff1565b610cc4565b6102e38180611146565b6102f49060808101906060016110e8565b6001600160a01b0316336001600160a01b03161461036b5760405162461bcd60e51b815260206004820152602960248201527f43616c6c6572206d7573742062652061646472657373207370656369666965646044820152681034b710383937b7b360b91b60648201526084015b60405180910390fd5b335f90815260026020526040902054156103d95760405162461bcd60e51b815260206004820152602960248201527f4163636f756e7420616c7265616479206173736f6369617465642077697468206044820152681858d8dbdd5b9d125960ba1b6064820152608401610362565b5f6103e382610cfc565b335f818152600260205260408082208490555192935083927f672144042732f7b1cdbf0772464ae545aedd7f41d38b8487dafd9085496a5d519190a35050565b61042c33610701565b6104485760405162461bcd60e51b815260040161036290611164565b335f90815260026020908152604080832054808452600383528184208585526001019092529091205460ff16156104c15760405162461bcd60e51b815260206004820152601860248201527f5573657220616c7265616479206f6e2064656e796c69737400000000000000006044820152606401610362565b5f81815260036020818152604080842086855260018181018452828620805460ff191682179055938352805493840181558452922001839055517f976c693d56f27ba17d902bda80c4fa0416b773fbf268bcb0ee71689234d769ee906105339083908590918252602082015260400190565b60405180910390a15050565b5f8061054a84610bc1565b5f81815260036020908152604080832087845260010190915290205490915060ff161561057a575f9150506105ba565b5f8181526004602052604090205460ff166105965760016105b6565b5f81815260046020908152604080832086845260020190915290205460ff165b9150505b92915050565b6105c933610701565b6105e55760405162461bcd60e51b815260040161036290611164565b335f90815260026020526040812054905b82518110156106fc575f8382815181106106125761061261119b565b6020908102919091018101515f858152600483526040808220838352600201909352919091205490915060ff166106835760405162461bcd60e51b8152602060048201526015602482015274155cd95c881b9bdd081bdb88185b1b1bdddb1a5cdd605a1b6044820152606401610362565b5f838152600460208181526040808420858552600281018352908420805460ff1916905592869052526106b99060010182610d6c565b827fe87ba7050133e8b4c8b879f99b3276368eaca3b81f4ea415d9528843a15d8c63826040516106eb91815260200190565b60405180910390a2506001016105f6565b505050565b5f8061070c83610bc1565b141592915050565b61071c610e8a565b600180546001600160a01b0319166001600160a01b0383169081179091556040519081527ffd4e734c9a89ace3649766f5233487313285fe97ca577c2602beda889ef46dd3906020015b60405180910390a150565b5f60045f61077e84610bc1565b815260208101919091526040015f205460ff1692915050565b606060035f6107a584610bc1565b81526020019081526020015f205f018054806020026020016040519081016040528092919081815260200182805480156107fc57602002820191905f5260205f20905b8154815260200190600101908083116107e8575b50505050509050919050565b610810610e8a565b6108195f610ee3565b565b61082433610701565b6108405760405162461bcd60e51b815260040161036290611164565b335f90815260026020908152604080832054808452600383528184208585526001019092529091205460ff166108af5760405162461bcd60e51b8152602060048201526014602482015273155cd95c881b9bdd081bdb8819195b9e5b1a5cdd60621b6044820152606401610362565b5f818152600360208181526040808420868552600181018352908420805460ff1916905592849052526108e29083610d6c565b60408051828152602081018490527f8935205b1b382095d2d95efbb36f81a11a34c548d45af26adc1a02d2f2bb546f9101610533565b610920610e8a565b600154600160a01b900460ff16156109705760405162461bcd60e51b8152602060048201526013602482015272105b1c9958591e481a5b9a5d1a585b1a5e9959606a1b6044820152606401610362565b600180546001600160a81b0319166001600160a01b0390921691909117600160a01b179055565b6109a033610701565b6109bc5760405162461bcd60e51b815260040161036290611164565b335f9081526002602090815260408083205480845260049092529091205460ff1615610a2a5760405162461bcd60e51b815260206004820152601a60248201527f416c6c6f77206c69737420616c726561647920656e61626c65640000000000006044820152606401610362565b5f8181526004602052604090819020805460ff19166001179055517f08df0a71ea3e5565a2138936ed06eaba47996a3ccfde2dae1f3edd1164e299d7906107669083815260200190565b610a7d33610701565b610a995760405162461bcd60e51b815260040161036290611164565b335f90815260026020526040812054905b82518110156106fc575f838281518110610ac657610ac661119b565b6020908102919091018101515f858152600483526040808220838352600201909352919091205490915060ff1615610b405760405162461bcd60e51b815260206004820152601960248201527f5573657220616c7265616479206f6e20616c6c6f776c697374000000000000006044820152606401610362565b5f838152600460208181526040808420858552600281018352818520805460ff1916600190811790915593835283018054938401815584529220018290555183907f857ce673abc5a303fa8303102f12b42079aa85b97bca15b56428764dd1dec4d290610bb09084815260200190565b60405180910390a250600101610aaa565b6001600160a01b03165f9081526002602052604090205490565b606060045f610be984610bc1565b81526020019081526020015f206001018054806020026020016040519081016040528092919081815260200182805480156107fc57602002820191905f5260205f20908154815260200190600101908083116107e85750505050509050919050565b610c53610e8a565b6001600160a01b038116610cb85760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610362565b610cc181610ee3565b50565b5f60035f610cd185610bc1565b815260208082019290925260409081015f90812085825260010190925290205460ff16905092915050565b60015460405163dec965d360e01b81525f916001600160a01b03169063dec965d390610d2c908590600401611219565b6020604051808303815f875af1158015610d48573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105ba9190611305565b5f80610dc584805480602002602001604051908101604052809291908181526020018280548015610dba57602002820191905f5260205f20905b815481526020019060010190808311610da6575b505050505084610f32565b9150915080610e0e5760405162461bcd60e51b8152602060048201526015602482015274313cba32b99999103737ba1034b71030b93930bc9760591b6044820152606401610362565b83545f90610e1e9060019061131c565b9050808314610e6057848181548110610e3957610e3961119b565b905f5260205f200154858481548110610e5457610e5461119b565b5f918252602090912001555b84805480610e7057610e7061133b565b600190038181905f5260205f20015f905590555050505050565b5f546001600160a01b031633146108195760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610362565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b81515f908190815b81811015610f775784868281518110610f5557610f5561119b565b602002602001015103610f6f57925060019150610f819050565b600101610f3a565b505f195f92509250505b9250929050565b5f60208284031215610f98575f80fd5b813567ffffffffffffffff811115610fae575f80fd5b820160408185031215610fbf575f80fd5b9392505050565b5f60208284031215610fd6575f80fd5b5035919050565b6001600160a01b0381168114610cc1575f80fd5b5f8060408385031215611002575f80fd5b823561100d81610fdd565b946020939093013593505050565b634e487b7160e01b5f52604160045260245ffd5b5f6020808385031215611040575f80fd5b823567ffffffffffffffff80821115611057575f80fd5b818501915085601f83011261106a575f80fd5b81358181111561107c5761107c61101b565b8060051b604051601f19603f830116810181811085821117156110a1576110a161101b565b6040529182528482019250838101850191888311156110be575f80fd5b938501935b828510156110dc578435845293850193928501926110c3565b98975050505050505050565b5f602082840312156110f8575f80fd5b8135610fbf81610fdd565b602080825282518282018190525f9190848201906040850190845b8181101561113a5783518352928401929184019160010161111e565b50909695505050505050565b5f8235609e1983360301811261115a575f80fd5b9190910192915050565b6020808252601e908201527f43616c6c6572206d757374206265207265676973746572656420757365720000604082015260600190565b634e487b7160e01b5f52603260045260245ffd5b5f808335601e198436030181126111c4575f80fd5b830160208101925035905067ffffffffffffffff8111156111e3575f80fd5b803603821315610f81575f80fd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b602081525f8235609e19843603018112611231575f80fd5b60406020840152830161124481806111af565b60a0606086015261125a610100860182846111f1565b91505061126a60208301836111af565b605f19808785030160808801526112828483856111f1565b935061129160408601866111af565b93509150808785030160a0880152506112ab8383836111f1565b9250505060608201356112bd81610fdd565b6001600160a01b031660c0850152608082013560e08501526112e260208601866111af565b858303601f1901604087015292506112fb8284836111f1565b9695505050505050565b5f60208284031215611315575f80fd5b5051919050565b818103818111156105ba57634e487b7160e01b5f52601160045260245ffd5b634e487b7160e01b5f52603160045260245ffdfea26469706673582212205e8d3d36078036c76c986c6ec883a2f97ccd001e7f05c724822d9de75d1e878664736f6c63430008180033", + "deployedBytecode": "0x608060405234801561000f575f80fd5b5060043610610127575f3560e01c8063715018a6116100a9578063d88452451161006e578063d88452451461026c578063e0b490f71461027f578063e39ca3b4146102a0578063f2fde38b146102b3578063fbf15b1f146102c6575f80fd5b8063715018a6146102265780638da5cb5b1461022e5780639b357b5a1461023e578063c4d66de814610251578063c6a2aac814610264575f80fd5b80631f5bdf5d116100ef5780631f5bdf5d146101b95780633056eb28146101cc57806338e4bef6146101df578063392e53cd146101f25780634595bba014610206575f80fd5b8063066a82fe1461012b5780630876dda314610140578063148172da146101705780631acd84d8146101835780631e48fe6b146101a6575b5f80fd5b61013e610139366004610f88565b6102d9565b005b600154610153906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b61013e61017e366004610fc6565b610423565b610196610191366004610ff1565b61053f565b6040519015158152602001610167565b61013e6101b436600461102f565b6105c0565b6101966101c73660046110e8565b610701565b61013e6101da3660046110e8565b610714565b6101966101ed3660046110e8565b610771565b60015461019690600160a01b900460ff1681565b6102196102143660046110e8565b610797565b6040516101679190611103565b61013e610808565b5f546001600160a01b0316610153565b61013e61024c366004610fc6565b61081b565b61013e61025f3660046110e8565b610918565b61013e610997565b61013e61027a36600461102f565b610a74565b61029261028d3660046110e8565b610bc1565b604051908152602001610167565b6102196102ae3660046110e8565b610bdb565b61013e6102c13660046110e8565b610c4b565b6101966102d4366004610ff1565b610cc4565b6102e38180611146565b6102f49060808101906060016110e8565b6001600160a01b0316336001600160a01b03161461036b5760405162461bcd60e51b815260206004820152602960248201527f43616c6c6572206d7573742062652061646472657373207370656369666965646044820152681034b710383937b7b360b91b60648201526084015b60405180910390fd5b335f90815260026020526040902054156103d95760405162461bcd60e51b815260206004820152602960248201527f4163636f756e7420616c7265616479206173736f6369617465642077697468206044820152681858d8dbdd5b9d125960ba1b6064820152608401610362565b5f6103e382610cfc565b335f818152600260205260408082208490555192935083927f672144042732f7b1cdbf0772464ae545aedd7f41d38b8487dafd9085496a5d519190a35050565b61042c33610701565b6104485760405162461bcd60e51b815260040161036290611164565b335f90815260026020908152604080832054808452600383528184208585526001019092529091205460ff16156104c15760405162461bcd60e51b815260206004820152601860248201527f5573657220616c7265616479206f6e2064656e796c69737400000000000000006044820152606401610362565b5f81815260036020818152604080842086855260018181018452828620805460ff191682179055938352805493840181558452922001839055517f976c693d56f27ba17d902bda80c4fa0416b773fbf268bcb0ee71689234d769ee906105339083908590918252602082015260400190565b60405180910390a15050565b5f8061054a84610bc1565b5f81815260036020908152604080832087845260010190915290205490915060ff161561057a575f9150506105ba565b5f8181526004602052604090205460ff166105965760016105b6565b5f81815260046020908152604080832086845260020190915290205460ff165b9150505b92915050565b6105c933610701565b6105e55760405162461bcd60e51b815260040161036290611164565b335f90815260026020526040812054905b82518110156106fc575f8382815181106106125761061261119b565b6020908102919091018101515f858152600483526040808220838352600201909352919091205490915060ff166106835760405162461bcd60e51b8152602060048201526015602482015274155cd95c881b9bdd081bdb88185b1b1bdddb1a5cdd605a1b6044820152606401610362565b5f838152600460208181526040808420858552600281018352908420805460ff1916905592869052526106b99060010182610d6c565b827fe87ba7050133e8b4c8b879f99b3276368eaca3b81f4ea415d9528843a15d8c63826040516106eb91815260200190565b60405180910390a2506001016105f6565b505050565b5f8061070c83610bc1565b141592915050565b61071c610e8a565b600180546001600160a01b0319166001600160a01b0383169081179091556040519081527ffd4e734c9a89ace3649766f5233487313285fe97ca577c2602beda889ef46dd3906020015b60405180910390a150565b5f60045f61077e84610bc1565b815260208101919091526040015f205460ff1692915050565b606060035f6107a584610bc1565b81526020019081526020015f205f018054806020026020016040519081016040528092919081815260200182805480156107fc57602002820191905f5260205f20905b8154815260200190600101908083116107e8575b50505050509050919050565b610810610e8a565b6108195f610ee3565b565b61082433610701565b6108405760405162461bcd60e51b815260040161036290611164565b335f90815260026020908152604080832054808452600383528184208585526001019092529091205460ff166108af5760405162461bcd60e51b8152602060048201526014602482015273155cd95c881b9bdd081bdb8819195b9e5b1a5cdd60621b6044820152606401610362565b5f818152600360208181526040808420868552600181018352908420805460ff1916905592849052526108e29083610d6c565b60408051828152602081018490527f8935205b1b382095d2d95efbb36f81a11a34c548d45af26adc1a02d2f2bb546f9101610533565b610920610e8a565b600154600160a01b900460ff16156109705760405162461bcd60e51b8152602060048201526013602482015272105b1c9958591e481a5b9a5d1a585b1a5e9959606a1b6044820152606401610362565b600180546001600160a81b0319166001600160a01b0390921691909117600160a01b179055565b6109a033610701565b6109bc5760405162461bcd60e51b815260040161036290611164565b335f9081526002602090815260408083205480845260049092529091205460ff1615610a2a5760405162461bcd60e51b815260206004820152601a60248201527f416c6c6f77206c69737420616c726561647920656e61626c65640000000000006044820152606401610362565b5f8181526004602052604090819020805460ff19166001179055517f08df0a71ea3e5565a2138936ed06eaba47996a3ccfde2dae1f3edd1164e299d7906107669083815260200190565b610a7d33610701565b610a995760405162461bcd60e51b815260040161036290611164565b335f90815260026020526040812054905b82518110156106fc575f838281518110610ac657610ac661119b565b6020908102919091018101515f858152600483526040808220838352600201909352919091205490915060ff1615610b405760405162461bcd60e51b815260206004820152601960248201527f5573657220616c7265616479206f6e20616c6c6f776c697374000000000000006044820152606401610362565b5f838152600460208181526040808420858552600281018352818520805460ff1916600190811790915593835283018054938401815584529220018290555183907f857ce673abc5a303fa8303102f12b42079aa85b97bca15b56428764dd1dec4d290610bb09084815260200190565b60405180910390a250600101610aaa565b6001600160a01b03165f9081526002602052604090205490565b606060045f610be984610bc1565b81526020019081526020015f206001018054806020026020016040519081016040528092919081815260200182805480156107fc57602002820191905f5260205f20908154815260200190600101908083116107e85750505050509050919050565b610c53610e8a565b6001600160a01b038116610cb85760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610362565b610cc181610ee3565b50565b5f60035f610cd185610bc1565b815260208082019290925260409081015f90812085825260010190925290205460ff16905092915050565b60015460405163dec965d360e01b81525f916001600160a01b03169063dec965d390610d2c908590600401611219565b6020604051808303815f875af1158015610d48573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105ba9190611305565b5f80610dc584805480602002602001604051908101604052809291908181526020018280548015610dba57602002820191905f5260205f20905b815481526020019060010190808311610da6575b505050505084610f32565b9150915080610e0e5760405162461bcd60e51b8152602060048201526015602482015274313cba32b99999103737ba1034b71030b93930bc9760591b6044820152606401610362565b83545f90610e1e9060019061131c565b9050808314610e6057848181548110610e3957610e3961119b565b905f5260205f200154858481548110610e5457610e5461119b565b5f918252602090912001555b84805480610e7057610e7061133b565b600190038181905f5260205f20015f905590555050505050565b5f546001600160a01b031633146108195760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610362565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b81515f908190815b81811015610f775784868281518110610f5557610f5561119b565b602002602001015103610f6f57925060019150610f819050565b600101610f3a565b505f195f92509250505b9250929050565b5f60208284031215610f98575f80fd5b813567ffffffffffffffff811115610fae575f80fd5b820160408185031215610fbf575f80fd5b9392505050565b5f60208284031215610fd6575f80fd5b5035919050565b6001600160a01b0381168114610cc1575f80fd5b5f8060408385031215611002575f80fd5b823561100d81610fdd565b946020939093013593505050565b634e487b7160e01b5f52604160045260245ffd5b5f6020808385031215611040575f80fd5b823567ffffffffffffffff80821115611057575f80fd5b818501915085601f83011261106a575f80fd5b81358181111561107c5761107c61101b565b8060051b604051601f19603f830116810181811085821117156110a1576110a161101b565b6040529182528482019250838101850191888311156110be575f80fd5b938501935b828510156110dc578435845293850193928501926110c3565b98975050505050505050565b5f602082840312156110f8575f80fd5b8135610fbf81610fdd565b602080825282518282018190525f9190848201906040850190845b8181101561113a5783518352928401929184019160010161111e565b50909695505050505050565b5f8235609e1983360301811261115a575f80fd5b9190910192915050565b6020808252601e908201527f43616c6c6572206d757374206265207265676973746572656420757365720000604082015260600190565b634e487b7160e01b5f52603260045260245ffd5b5f808335601e198436030181126111c4575f80fd5b830160208101925035905067ffffffffffffffff8111156111e3575f80fd5b803603821315610f81575f80fd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b602081525f8235609e19843603018112611231575f80fd5b60406020840152830161124481806111af565b60a0606086015261125a610100860182846111f1565b91505061126a60208301836111af565b605f19808785030160808801526112828483856111f1565b935061129160408601866111af565b93509150808785030160a0880152506112ab8383836111f1565b9250505060608201356112bd81610fdd565b6001600160a01b031660c0850152608082013560e08501526112e260208601866111af565b858303601f1901604087015292506112fb8284836111f1565b9695505050505050565b5f60208284031215611315575f80fd5b5051919050565b818103818111156105ba57634e487b7160e01b5f52601160045260245ffd5b634e487b7160e01b5f52603160045260245ffdfea26469706673582212205e8d3d36078036c76c986c6ec883a2f97ccd001e7f05c724822d9de75d1e878664736f6c63430008180033", + "devdoc": { + "kind": "dev", + "methods": { + "addAccountToDenylist(bytes32)": { + "params": { + "_deniedUser": "accountId being banned" + } + }, + "addAccountsToAllowlist(bytes32[])": { + "params": { + "_allowedUsers": "List of accountIds allowed to signal intents on the user's deposit" + } + }, + "initialize(address)": { + "params": { + "_accountRegistrationProcessor": "Account Registration processor address" + } + }, + "owner()": { + "details": "Returns the address of the current owner." + }, + "register(((string,string,string,address,uint256),bytes))": { + "params": { + "_proof": "Registration proof consisting of unredacted data being notarized and a signature" + } + }, + "removeAccountFromDenylist(bytes32)": { + "params": { + "_approvedUser": "accountId being approved" + } + }, + "removeAccountsFromAllowlist(bytes32[])": { + "params": { + "_disallowedUsers": "List of accountIds being approved" + } + }, + "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." + }, + "setAccountRegistrationProcessor(address)": { + "params": { + "_registrationProcessor": "New registration proccesor address" + } + }, + "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": { + "addAccountToDenylist(bytes32)": { + "notice": "Adds an accountId to a depositor's deny list. If an address associated with the banned accountId attempts to signal an intent on the user's deposit they will be denied." + }, + "addAccountsToAllowlist(bytes32[])": { + "notice": "Adds passed accountIds to a depositor's allow list. All addresses associated with the allowed accountIds will be able to signal intents on the user's deposit." + }, + "enableAllowlist()": { + "notice": "Enables allow list for user, only users on the allow list will be able to signal intents on the user's deposit." + }, + "initialize(address)": { + "notice": "Initialize Ramp with the addresses of the Processors" + }, + "register(((string,string,string,address,uint256),bytes))": { + "notice": "Registers a new account by pulling the profileId from the proof and assigning the account owner to the sender of the transaction." + }, + "removeAccountFromDenylist(bytes32)": { + "notice": "Removes an accountId from a depositor's deny list." + }, + "removeAccountsFromAllowlist(bytes32[])": { + "notice": "Removes an passed accountId's from allow list. If allow list is enabled only users on the allow list will be able to signal intents on the user's deposit." + }, + "setAccountRegistrationProcessor(address)": { + "notice": "GOVERNANCE ONLY: Updates the account registration processor address used for validating and interpreting tls proofs." + } + }, + "version": 1 + }, + "storageLayout": { + "storage": [ + { + "astId": 7, + "contract": "contracts/ramps/revolut/RevolutAccountRegistry.sol:RevolutAccountRegistry", + "label": "_owner", + "offset": 0, + "slot": "0", + "type": "t_address" + }, + { + "astId": 13685, + "contract": "contracts/ramps/revolut/RevolutAccountRegistry.sol:RevolutAccountRegistry", + "label": "accountRegistrationProcessor", + "offset": 0, + "slot": "1", + "type": "t_contract(IRevolutAccountRegistrationProcessor)16372" + }, + { + "astId": 13687, + "contract": "contracts/ramps/revolut/RevolutAccountRegistry.sol:RevolutAccountRegistry", + "label": "isInitialized", + "offset": 20, + "slot": "1", + "type": "t_bool" + }, + { + "astId": 13691, + "contract": "contracts/ramps/revolut/RevolutAccountRegistry.sol:RevolutAccountRegistry", + "label": "accounts", + "offset": 0, + "slot": "2", + "type": "t_mapping(t_address,t_bytes32)" + }, + { + "astId": 13696, + "contract": "contracts/ramps/revolut/RevolutAccountRegistry.sol:RevolutAccountRegistry", + "label": "denyList", + "offset": 0, + "slot": "3", + "type": "t_mapping(t_bytes32,t_struct(DenyList)13660_storage)" + }, + { + "astId": 13701, + "contract": "contracts/ramps/revolut/RevolutAccountRegistry.sol:RevolutAccountRegistry", + "label": "allowList", + "offset": 0, + "slot": "4", + "type": "t_mapping(t_bytes32,t_struct(AllowList)13670_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_contract(IRevolutAccountRegistrationProcessor)16372": { + "encoding": "inplace", + "label": "contract IRevolutAccountRegistrationProcessor", + "numberOfBytes": "20" + }, + "t_mapping(t_address,t_bytes32)": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => bytes32)", + "numberOfBytes": "32", + "value": "t_bytes32" + }, + "t_mapping(t_bytes32,t_bool)": { + "encoding": "mapping", + "key": "t_bytes32", + "label": "mapping(bytes32 => bool)", + "numberOfBytes": "32", + "value": "t_bool" + }, + "t_mapping(t_bytes32,t_struct(AllowList)13670_storage)": { + "encoding": "mapping", + "key": "t_bytes32", + "label": "mapping(bytes32 => struct RevolutAccountRegistry.AllowList)", + "numberOfBytes": "32", + "value": "t_struct(AllowList)13670_storage" + }, + "t_mapping(t_bytes32,t_struct(DenyList)13660_storage)": { + "encoding": "mapping", + "key": "t_bytes32", + "label": "mapping(bytes32 => struct RevolutAccountRegistry.DenyList)", + "numberOfBytes": "32", + "value": "t_struct(DenyList)13660_storage" + }, + "t_struct(AllowList)13670_storage": { + "encoding": "inplace", + "label": "struct RevolutAccountRegistry.AllowList", + "members": [ + { + "astId": 13662, + "contract": "contracts/ramps/revolut/RevolutAccountRegistry.sol:RevolutAccountRegistry", + "label": "isEnabled", + "offset": 0, + "slot": "0", + "type": "t_bool" + }, + { + "astId": 13665, + "contract": "contracts/ramps/revolut/RevolutAccountRegistry.sol:RevolutAccountRegistry", + "label": "allowedUsers", + "offset": 0, + "slot": "1", + "type": "t_array(t_bytes32)dyn_storage" + }, + { + "astId": 13669, + "contract": "contracts/ramps/revolut/RevolutAccountRegistry.sol:RevolutAccountRegistry", + "label": "isAllowed", + "offset": 0, + "slot": "2", + "type": "t_mapping(t_bytes32,t_bool)" + } + ], + "numberOfBytes": "96" + }, + "t_struct(DenyList)13660_storage": { + "encoding": "inplace", + "label": "struct RevolutAccountRegistry.DenyList", + "members": [ + { + "astId": 13655, + "contract": "contracts/ramps/revolut/RevolutAccountRegistry.sol:RevolutAccountRegistry", + "label": "deniedUsers", + "offset": 0, + "slot": "0", + "type": "t_array(t_bytes32)dyn_storage" + }, + { + "astId": 13659, + "contract": "contracts/ramps/revolut/RevolutAccountRegistry.sol:RevolutAccountRegistry", + "label": "isDenied", + "offset": 0, + "slot": "1", + "type": "t_mapping(t_bytes32,t_bool)" + } + ], + "numberOfBytes": "64" + } + } + } +} \ No newline at end of file diff --git a/contracts/deployments/encifher/RevolutRamp.json b/contracts/deployments/encifher/RevolutRamp.json new file mode 100644 index 000000000..c4eeabde2 --- /dev/null +++ b/contracts/deployments/encifher/RevolutRamp.json @@ -0,0 +1,1830 @@ +{ + "address": "0x49EA5126fD67f877b62dDC0144DBeb42591DF7bb", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "internalType": "contract IERC20", + "name": "_usdc", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_minDepositAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_maxOnRampAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_intentExpirationPeriod", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_onRampCooldownPeriod", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_sustainabilityFee", + "type": "uint256" + }, + { + "internalType": "address", + "name": "_sustainabilityFeeRecipient", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "depositId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "address", + "name": "depositor", + "type": "address" + } + ], + "name": "DepositClosed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "depositId", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "offRampId", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "currencyId", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "conversionRate", + "type": "uint256" + } + ], + "name": "DepositReceived", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "depositId", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "address", + "name": "depositor", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "DepositWithdrawn", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "intentExpirationPeriod", + "type": "uint256" + } + ], + "name": "IntentExpirationPeriodSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "intentHash", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "depositId", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "address", + "name": "onRamper", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "feeAmount", + "type": "uint256" + } + ], + "name": "IntentFulfilled", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "intentHash", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "depositId", + "type": "uint256" + } + ], + "name": "IntentPruned", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "intentHash", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "depositId", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "accountId", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "timestamp", + "type": "uint256" + } + ], + "name": "IntentSignaled", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "maxOnRampAmount", + "type": "uint256" + } + ], + "name": "MaxOnRampAmountSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "minDepositAmount", + "type": "uint256" + } + ], + "name": "MinDepositAmountSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "sendProcessor", + "type": "address" + } + ], + "name": "NewSendProcessorSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "onRampCooldownPeriod", + "type": "uint256" + } + ], + "name": "OnRampCooldownPeriodSet", + "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": "feeRecipient", + "type": "address" + } + ], + "name": "SustainabilityFeeRecipientUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "fee", + "type": "uint256" + } + ], + "name": "SustainabilityFeeUpdated", + "type": "event" + }, + { + "inputs": [], + "name": "accountRegistry", + "outputs": [ + { + "internalType": "contract IRevolutAccountRegistry", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_intentHash", + "type": "bytes32" + } + ], + "name": "cancelIntent", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "depositCounter", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "deposits", + "outputs": [ + { + "internalType": "address", + "name": "depositor", + "type": "address" + }, + { + "internalType": "string", + "name": "revolutTag", + "type": "string" + }, + { + "internalType": "address", + "name": "verifierSigningKey", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "notaryKeyHash", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "depositAmount", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "receiveCurrencyId", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "remainingDeposits", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "outstandingIntentAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "conversionRate", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_account", + "type": "address" + } + ], + "name": "getAccountDeposits", + "outputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "depositId", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "depositorId", + "type": "bytes32" + }, + { + "components": [ + { + "internalType": "address", + "name": "depositor", + "type": "address" + }, + { + "internalType": "string", + "name": "revolutTag", + "type": "string" + }, + { + "internalType": "address", + "name": "verifierSigningKey", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "notaryKeyHash", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "depositAmount", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "receiveCurrencyId", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "remainingDeposits", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "outstandingIntentAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "conversionRate", + "type": "uint256" + }, + { + "internalType": "bytes32[]", + "name": "intentHashes", + "type": "bytes32[]" + } + ], + "internalType": "struct RevolutRamp.Deposit", + "name": "deposit", + "type": "tuple" + }, + { + "internalType": "uint256", + "name": "availableLiquidity", + "type": "uint256" + } + ], + "internalType": "struct RevolutRamp.DepositWithAvailableLiquidity[]", + "name": "accountDeposits", + "type": "tuple[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_depositId", + "type": "uint256" + } + ], + "name": "getDeposit", + "outputs": [ + { + "components": [ + { + "internalType": "address", + "name": "depositor", + "type": "address" + }, + { + "internalType": "string", + "name": "revolutTag", + "type": "string" + }, + { + "internalType": "address", + "name": "verifierSigningKey", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "notaryKeyHash", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "depositAmount", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "receiveCurrencyId", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "remainingDeposits", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "outstandingIntentAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "conversionRate", + "type": "uint256" + }, + { + "internalType": "bytes32[]", + "name": "intentHashes", + "type": "bytes32[]" + } + ], + "internalType": "struct RevolutRamp.Deposit", + "name": "", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256[]", + "name": "_depositIds", + "type": "uint256[]" + } + ], + "name": "getDepositFromIds", + "outputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "depositId", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "depositorId", + "type": "bytes32" + }, + { + "components": [ + { + "internalType": "address", + "name": "depositor", + "type": "address" + }, + { + "internalType": "string", + "name": "revolutTag", + "type": "string" + }, + { + "internalType": "address", + "name": "verifierSigningKey", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "notaryKeyHash", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "depositAmount", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "receiveCurrencyId", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "remainingDeposits", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "outstandingIntentAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "conversionRate", + "type": "uint256" + }, + { + "internalType": "bytes32[]", + "name": "intentHashes", + "type": "bytes32[]" + } + ], + "internalType": "struct RevolutRamp.Deposit", + "name": "deposit", + "type": "tuple" + }, + { + "internalType": "uint256", + "name": "availableLiquidity", + "type": "uint256" + } + ], + "internalType": "struct RevolutRamp.DepositWithAvailableLiquidity[]", + "name": "depositArray", + "type": "tuple[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_account", + "type": "address" + } + ], + "name": "getIdCurrentIntentHash", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_account", + "type": "address" + } + ], + "name": "getIdCurrentIntentHashAsUint", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32[]", + "name": "_intentHashes", + "type": "bytes32[]" + } + ], + "name": "getIntentsWithOnRamperId", + "outputs": [ + { + "components": [ + { + "internalType": "bytes32", + "name": "intentHash", + "type": "bytes32" + }, + { + "components": [ + { + "internalType": "address", + "name": "onRamper", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "deposit", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "intentTimestamp", + "type": "uint256" + } + ], + "internalType": "struct RevolutRamp.Intent", + "name": "intent", + "type": "tuple" + }, + { + "internalType": "bytes32", + "name": "onRamperId", + "type": "bytes32" + } + ], + "internalType": "struct RevolutRamp.IntentWithOnRamperId[]", + "name": "", + "type": "tuple[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_account", + "type": "address" + } + ], + "name": "getLastOnRampTimestamp", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IRevolutAccountRegistry", + "name": "_accountRegistry", + "type": "address" + }, + { + "internalType": "contract IRevolutSendProcessor", + "name": "_sendProcessor", + "type": "address" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "intentExpirationPeriod", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "name": "intents", + "outputs": [ + { + "internalType": "address", + "name": "onRamper", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "deposit", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "intentTimestamp", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "isInitialized", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "maxOnRampAmount", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "minDepositAmount", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "_revolutTag", + "type": "string" + }, + { + "internalType": "bytes32", + "name": "_receiveCurrencyId", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "_depositAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_receiveAmount", + "type": "uint256" + }, + { + "internalType": "address", + "name": "_verifierSigningKey", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "_notaryKeyHash", + "type": "bytes32" + } + ], + "name": "offRamp", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "string", + "name": "endpoint", + "type": "string" + }, + { + "internalType": "string", + "name": "host", + "type": "string" + }, + { + "internalType": "string", + "name": "transferId", + "type": "string" + }, + { + "internalType": "string", + "name": "recipientId", + "type": "string" + }, + { + "internalType": "string", + "name": "amount", + "type": "string" + }, + { + "internalType": "string", + "name": "currencyId", + "type": "string" + }, + { + "internalType": "string", + "name": "status", + "type": "string" + }, + { + "internalType": "string", + "name": "timestamp", + "type": "string" + }, + { + "internalType": "uint256", + "name": "intentHash", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "notaryKeyHash", + "type": "uint256" + } + ], + "internalType": "struct IRevolutSendProcessor.SendData", + "name": "_sendData", + "type": "tuple" + }, + { + "internalType": "bytes", + "name": "_verifierSignature", + "type": "bytes" + } + ], + "name": "onRamp", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "onRampCooldownPeriod", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_intentHash", + "type": "bytes32" + } + ], + "name": "releaseFundsToOnramper", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "sendProcessor", + "outputs": [ + { + "internalType": "contract IRevolutSendProcessor", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_intentExpirationPeriod", + "type": "uint256" + } + ], + "name": "setIntentExpirationPeriod", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_maxOnRampAmount", + "type": "uint256" + } + ], + "name": "setMaxOnRampAmount", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_minDepositAmount", + "type": "uint256" + } + ], + "name": "setMinDepositAmount", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_onRampCooldownPeriod", + "type": "uint256" + } + ], + "name": "setOnRampCooldownPeriod", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IRevolutSendProcessor", + "name": "_sendProcessor", + "type": "address" + } + ], + "name": "setSendProcessor", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_fee", + "type": "uint256" + } + ], + "name": "setSustainabilityFee", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_feeRecipient", + "type": "address" + } + ], + "name": "setSustainabilityFeeRecipient", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_depositId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + }, + { + "internalType": "address", + "name": "_to", + "type": "address" + } + ], + "name": "signalIntent", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "sustainabilityFee", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "sustainabilityFeeRecipient", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "usdc", + "outputs": [ + { + "internalType": "contract IERC20", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256[]", + "name": "_depositIds", + "type": "uint256[]" + } + ], + "name": "withdrawDeposit", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "transactionHash": "0x2afa124b01c6507db67119457732caa2a23de05be4576c2efbc4a16bf72f50a8", + "receipt": { + "to": null, + "from": "0xa0Ee7A142d267C1f36714E4a8F75612F20a79720", + "contractAddress": "0x49EA5126fD67f877b62dDC0144DBeb42591DF7bb", + "transactionIndex": 0, + "gasUsed": "3753143", + "logsBloom": "0x00000000000000000000040000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000001000000000000010008000000000000000000020000000000000000000800000000000000000000000000000000400000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000020000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0x1fda24a3af3fb9db35ec77ec3baad09ce156cd7880f42a2ba08a46c77e8d2f3e", + "transactionHash": "0x2afa124b01c6507db67119457732caa2a23de05be4576c2efbc4a16bf72f50a8", + "logs": [ + { + "transactionIndex": 0, + "blockNumber": 61401, + "transactionHash": "0x2afa124b01c6507db67119457732caa2a23de05be4576c2efbc4a16bf72f50a8", + "address": "0x49EA5126fD67f877b62dDC0144DBeb42591DF7bb", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x000000000000000000000000a0ee7a142d267c1f36714e4a8f75612f20a79720" + ], + "data": "0x", + "logIndex": 0, + "blockHash": "0x1fda24a3af3fb9db35ec77ec3baad09ce156cd7880f42a2ba08a46c77e8d2f3e" + }, + { + "transactionIndex": 0, + "blockNumber": 61401, + "transactionHash": "0x2afa124b01c6507db67119457732caa2a23de05be4576c2efbc4a16bf72f50a8", + "address": "0x49EA5126fD67f877b62dDC0144DBeb42591DF7bb", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x000000000000000000000000a0ee7a142d267c1f36714e4a8f75612f20a79720", + "0x000000000000000000000000a0ee7a142d267c1f36714e4a8f75612f20a79720" + ], + "data": "0x", + "logIndex": 1, + "blockHash": "0x1fda24a3af3fb9db35ec77ec3baad09ce156cd7880f42a2ba08a46c77e8d2f3e" + } + ], + "blockNumber": 61401, + "cumulativeGasUsed": "3753143", + "status": 1, + "byzantium": true + }, + "args": [ + "0xa0Ee7A142d267C1f36714E4a8F75612F20a79720", + "0x04fc820176617A99AE134904935Bc854b2e51628", + "10000000", + "999000000", + "180", + "180", + "1000000000000000", + "0xa0Ee7A142d267C1f36714E4a8F75612F20a79720" + ], + "numDeployments": 1, + "solcInputHash": "75b8f55da346d7ed99a350632554d2fb", + "metadata": "{\"compiler\":{\"version\":\"0.8.24+commit.e11b9ed9\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"},{\"internalType\":\"contract IERC20\",\"name\":\"_usdc\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_minDepositAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_maxOnRampAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_intentExpirationPeriod\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_onRampCooldownPeriod\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_sustainabilityFee\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_sustainabilityFeeRecipient\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"depositId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"depositor\",\"type\":\"address\"}],\"name\":\"DepositClosed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"depositId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"offRampId\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"currencyId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"conversionRate\",\"type\":\"uint256\"}],\"name\":\"DepositReceived\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"depositId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"depositor\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"DepositWithdrawn\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"intentExpirationPeriod\",\"type\":\"uint256\"}],\"name\":\"IntentExpirationPeriodSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"intentHash\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"depositId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"onRamper\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"feeAmount\",\"type\":\"uint256\"}],\"name\":\"IntentFulfilled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"intentHash\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"depositId\",\"type\":\"uint256\"}],\"name\":\"IntentPruned\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"intentHash\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"depositId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"accountId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"}],\"name\":\"IntentSignaled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"maxOnRampAmount\",\"type\":\"uint256\"}],\"name\":\"MaxOnRampAmountSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"minDepositAmount\",\"type\":\"uint256\"}],\"name\":\"MinDepositAmountSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"sendProcessor\",\"type\":\"address\"}],\"name\":\"NewSendProcessorSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"onRampCooldownPeriod\",\"type\":\"uint256\"}],\"name\":\"OnRampCooldownPeriodSet\",\"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\":\"feeRecipient\",\"type\":\"address\"}],\"name\":\"SustainabilityFeeRecipientUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"fee\",\"type\":\"uint256\"}],\"name\":\"SustainabilityFeeUpdated\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"accountRegistry\",\"outputs\":[{\"internalType\":\"contract IRevolutAccountRegistry\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_intentHash\",\"type\":\"bytes32\"}],\"name\":\"cancelIntent\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"depositCounter\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"deposits\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"depositor\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"revolutTag\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"verifierSigningKey\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"notaryKeyHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"depositAmount\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"receiveCurrencyId\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"remainingDeposits\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"outstandingIntentAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"conversionRate\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_account\",\"type\":\"address\"}],\"name\":\"getAccountDeposits\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"depositId\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"depositorId\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"depositor\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"revolutTag\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"verifierSigningKey\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"notaryKeyHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"depositAmount\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"receiveCurrencyId\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"remainingDeposits\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"outstandingIntentAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"conversionRate\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[]\",\"name\":\"intentHashes\",\"type\":\"bytes32[]\"}],\"internalType\":\"struct RevolutRamp.Deposit\",\"name\":\"deposit\",\"type\":\"tuple\"},{\"internalType\":\"uint256\",\"name\":\"availableLiquidity\",\"type\":\"uint256\"}],\"internalType\":\"struct RevolutRamp.DepositWithAvailableLiquidity[]\",\"name\":\"accountDeposits\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_depositId\",\"type\":\"uint256\"}],\"name\":\"getDeposit\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"depositor\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"revolutTag\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"verifierSigningKey\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"notaryKeyHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"depositAmount\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"receiveCurrencyId\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"remainingDeposits\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"outstandingIntentAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"conversionRate\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[]\",\"name\":\"intentHashes\",\"type\":\"bytes32[]\"}],\"internalType\":\"struct RevolutRamp.Deposit\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256[]\",\"name\":\"_depositIds\",\"type\":\"uint256[]\"}],\"name\":\"getDepositFromIds\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"depositId\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"depositorId\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"depositor\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"revolutTag\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"verifierSigningKey\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"notaryKeyHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"depositAmount\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"receiveCurrencyId\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"remainingDeposits\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"outstandingIntentAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"conversionRate\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[]\",\"name\":\"intentHashes\",\"type\":\"bytes32[]\"}],\"internalType\":\"struct RevolutRamp.Deposit\",\"name\":\"deposit\",\"type\":\"tuple\"},{\"internalType\":\"uint256\",\"name\":\"availableLiquidity\",\"type\":\"uint256\"}],\"internalType\":\"struct RevolutRamp.DepositWithAvailableLiquidity[]\",\"name\":\"depositArray\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_account\",\"type\":\"address\"}],\"name\":\"getIdCurrentIntentHash\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_account\",\"type\":\"address\"}],\"name\":\"getIdCurrentIntentHashAsUint\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[]\",\"name\":\"_intentHashes\",\"type\":\"bytes32[]\"}],\"name\":\"getIntentsWithOnRamperId\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"intentHash\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"onRamper\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"deposit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"intentTimestamp\",\"type\":\"uint256\"}],\"internalType\":\"struct RevolutRamp.Intent\",\"name\":\"intent\",\"type\":\"tuple\"},{\"internalType\":\"bytes32\",\"name\":\"onRamperId\",\"type\":\"bytes32\"}],\"internalType\":\"struct RevolutRamp.IntentWithOnRamperId[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_account\",\"type\":\"address\"}],\"name\":\"getLastOnRampTimestamp\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IRevolutAccountRegistry\",\"name\":\"_accountRegistry\",\"type\":\"address\"},{\"internalType\":\"contract IRevolutSendProcessor\",\"name\":\"_sendProcessor\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"intentExpirationPeriod\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"intents\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"onRamper\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"deposit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"intentTimestamp\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isInitialized\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"maxOnRampAmount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"minDepositAmount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_revolutTag\",\"type\":\"string\"},{\"internalType\":\"bytes32\",\"name\":\"_receiveCurrencyId\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"_depositAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_receiveAmount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_verifierSigningKey\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"_notaryKeyHash\",\"type\":\"bytes32\"}],\"name\":\"offRamp\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"endpoint\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"host\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"transferId\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"recipientId\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"amount\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"currencyId\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"status\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"timestamp\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"intentHash\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"notaryKeyHash\",\"type\":\"uint256\"}],\"internalType\":\"struct IRevolutSendProcessor.SendData\",\"name\":\"_sendData\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"_verifierSignature\",\"type\":\"bytes\"}],\"name\":\"onRamp\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"onRampCooldownPeriod\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_intentHash\",\"type\":\"bytes32\"}],\"name\":\"releaseFundsToOnramper\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"sendProcessor\",\"outputs\":[{\"internalType\":\"contract IRevolutSendProcessor\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_intentExpirationPeriod\",\"type\":\"uint256\"}],\"name\":\"setIntentExpirationPeriod\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_maxOnRampAmount\",\"type\":\"uint256\"}],\"name\":\"setMaxOnRampAmount\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_minDepositAmount\",\"type\":\"uint256\"}],\"name\":\"setMinDepositAmount\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_onRampCooldownPeriod\",\"type\":\"uint256\"}],\"name\":\"setOnRampCooldownPeriod\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IRevolutSendProcessor\",\"name\":\"_sendProcessor\",\"type\":\"address\"}],\"name\":\"setSendProcessor\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_fee\",\"type\":\"uint256\"}],\"name\":\"setSustainabilityFee\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_feeRecipient\",\"type\":\"address\"}],\"name\":\"setSustainabilityFeeRecipient\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_depositId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"}],\"name\":\"signalIntent\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"sustainabilityFee\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"sustainabilityFeeRecipient\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"usdc\",\"outputs\":[{\"internalType\":\"contract IERC20\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256[]\",\"name\":\"_depositIds\",\"type\":\"uint256[]\"}],\"name\":\"withdrawDeposit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"cancelIntent(bytes32)\":{\"params\":{\"_intentHash\":\"Hash of intent being cancelled\"}},\"initialize(address,address)\":{\"params\":{\"_accountRegistry\":\"Account Registry contract for Revolut\",\"_sendProcessor\":\"Send processor address\"}},\"offRamp(string,bytes32,uint256,uint256,address,bytes32)\":{\"params\":{\"_depositAmount\":\"The amount of USDC to off-ramp\",\"_notaryKeyHash\":\"Hash of the notary public key that is required to do notarization\",\"_receiveAmount\":\"The amount of USD to receive\",\"_receiveCurrencyId\":\"Id of the currency to be received off-chain\",\"_revolutTag\":\"Depositor's Revolut tag to receive payments\",\"_verifierSigningKey\":\"Public key of the verifier depositor wants to sign the TLS proof\"}},\"onRamp((string,string,string,string,string,string,string,string,uint256,uint256),bytes)\":{\"params\":{\"_sendData\":\"Struct containing unredacted data from API call to Revolut\",\"_verifierSignature\":\"Signature by verifier of the unredacted data\"}},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"releaseFundsToOnramper(bytes32)\":{\"params\":{\"_intentHash\":\"Hash of intent to resolve by releasing the funds\"}},\"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.\"},\"setIntentExpirationPeriod(uint256)\":{\"params\":{\"_intentExpirationPeriod\":\"New intent expiration period\"}},\"setMaxOnRampAmount(uint256)\":{\"params\":{\"_maxOnRampAmount\":\"The new max on ramp amount\"}},\"setMinDepositAmount(uint256)\":{\"params\":{\"_minDepositAmount\":\"The new minimum deposit amount\"}},\"setOnRampCooldownPeriod(uint256)\":{\"params\":{\"_onRampCooldownPeriod\":\"New on-ramp cooldown period\"}},\"setSendProcessor(address)\":{\"params\":{\"_sendProcessor\":\"New send proccesor address\"}},\"setSustainabilityFee(uint256)\":{\"params\":{\"_fee\":\"The new sustainability fee in precise units (10**18, ie 10% = 1e17)\"}},\"setSustainabilityFeeRecipient(address)\":{\"params\":{\"_feeRecipient\":\"The new fee recipient address\"}},\"signalIntent(uint256,uint256,address)\":{\"params\":{\"_amount\":\"The amount of USDC the user wants to on-ramp\",\"_depositId\":\"The ID of the deposit the on-ramper intends to use for \",\"_to\":\"Address to forward funds to (can be same as onRamper)\"}},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"},\"withdrawDeposit(uint256[])\":{\"params\":{\"_depositIds\":\"Array of depositIds the depositor is attempting to withdraw\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"cancelIntent(bytes32)\":{\"notice\":\"Only callable by the originator of the intent. Cancels an outstanding intent thus allowing user to signal a new intent. Deposit state is updated to reflect the cancelled intent.\"},\"initialize(address,address)\":{\"notice\":\"Initialize Ramp with the addresses of the Processors\"},\"offRamp(string,bytes32,uint256,uint256,address,bytes32)\":{\"notice\":\"Generates a deposit entry for off-rampers that can then be fulfilled by an on-ramper. This function will not add to previous deposits. Every deposit has it's own unique identifier. User must approve the contract to transfer the deposit amount of USDC.\"},\"onRamp((string,string,string,string,string,string,string,string,uint256,uint256),bytes)\":{\"notice\":\"Anyone can submit an on-ramp transaction, even if caller isn't on-ramper. Upon submission the proof is validated, intent is removed, and deposit state is updated. USDC is transferred to the on-ramper.\"},\"releaseFundsToOnramper(bytes32)\":{\"notice\":\"Allows off-ramper to release funds to the on-ramper in case of a failed on-ramp or because of some other arrangement between the two parties. Upon submission we check to make sure the msg.sender is the depositor, the intent is removed, and deposit state is updated. USDC is transferred to the on-ramper.\"},\"setIntentExpirationPeriod(uint256)\":{\"notice\":\"GOVERNANCE ONLY: Updates the intent expiration period, after this period elapses an intent can be pruned to prevent locking up a depositor's funds.\"},\"setMaxOnRampAmount(uint256)\":{\"notice\":\"GOVERNANCE ONLY: Updates the max amount allowed to be on-ramped in each transaction. To on-ramp more than this amount a user must make multiple transactions.\"},\"setMinDepositAmount(uint256)\":{\"notice\":\"GOVERNANCE ONLY: Updates the minimum deposit amount a user can specify for off-ramping.\"},\"setOnRampCooldownPeriod(uint256)\":{\"notice\":\"GOVERNANCE ONLY: Updates the on-ramp cooldown period, once an on-ramp transaction is completed the user must wait this amount of time before they can signalIntent to on-ramp again.\"},\"setSendProcessor(address)\":{\"notice\":\"GOVERNANCE ONLY: Updates the send processor address used for validating and interpreting zk proofs.\"},\"setSustainabilityFee(uint256)\":{\"notice\":\"GOVERNANCE ONLY: Updates the sustainability fee. This fee is charged to on-rampers upon a successful on-ramp.\"},\"setSustainabilityFeeRecipient(address)\":{\"notice\":\"GOVERNANCE ONLY: Updates the recepient of sustainability fees.\"},\"signalIntent(uint256,uint256,address)\":{\"notice\":\"Signals intent to pay the depositor defined in the _depositId the _amount * deposit conversionRate off-chain in order to unlock _amount of funds on-chain. Each user can only have one outstanding intent at a time regardless of address (tracked using accountId). Caller must not be on the depositor's deny list. If there are prunable intents then they will be deleted from the deposit to be able to maintain state hygiene.\"},\"withdrawDeposit(uint256[])\":{\"notice\":\"Caller must be the depositor for each depositId in the array, if not whole function fails. Depositor is returned all remaining deposits and any outstanding intents that are expired. If an intent is not expired then those funds will not be returned. Deposit will be deleted as long as there are no more outstanding intents.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/ramps/revolut/RevolutRamp.sol\":\"RevolutRamp\"},\"evmVersion\":\"shanghai\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"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/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/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (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\",\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"license\":\"MIT\"},\"contracts/external/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/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 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\":\"0x102021415f8444ff563fc6d0082f39296f47c09ce73fb4cd642e700ac489eefe\",\"license\":\"Apache-2.0\"},\"contracts/ramps/revolut/RevolutRamp.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\n\\nimport { IERC20 } from \\\"@openzeppelin/contracts/token/ERC20/IERC20.sol\\\";\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\nimport { Bytes32ArrayUtils } from \\\"../../external/Bytes32ArrayUtils.sol\\\";\\nimport { Uint256ArrayUtils } from \\\"../../external/Uint256ArrayUtils.sol\\\";\\n\\nimport { IRevolutAccountRegistry } from \\\"./interfaces/IRevolutAccountRegistry.sol\\\";\\nimport { IRevolutSendProcessor } from \\\"./interfaces/IRevolutSendProcessor.sol\\\";\\n\\npragma solidity ^0.8.18;\\n\\ncontract RevolutRamp is Ownable {\\n\\n using Bytes32ArrayUtils for bytes32[];\\n using Uint256ArrayUtils for uint256[];\\n\\n /* ============ Events ============ */\\n event DepositReceived(\\n uint256 indexed depositId,\\n bytes32 indexed offRampId,\\n bytes32 indexed currencyId,\\n uint256 amount,\\n uint256 conversionRate\\n );\\n event IntentSignaled(\\n bytes32 indexed intentHash,\\n uint256 indexed depositId,\\n bytes32 indexed accountId,\\n address to,\\n uint256 amount,\\n uint256 timestamp\\n );\\n\\n event IntentPruned(\\n bytes32 indexed intentHash,\\n uint256 indexed depositId\\n );\\n event IntentFulfilled(\\n bytes32 indexed intentHash,\\n uint256 indexed depositId,\\n address indexed onRamper,\\n address to,\\n uint256 amount,\\n uint256 feeAmount\\n );\\n event DepositWithdrawn(\\n uint256 indexed depositId,\\n address indexed depositor,\\n uint256 amount\\n );\\n\\n event DepositClosed(uint256 depositId, address depositor);\\n event MinDepositAmountSet(uint256 minDepositAmount);\\n event MaxOnRampAmountSet(uint256 maxOnRampAmount);\\n event IntentExpirationPeriodSet(uint256 intentExpirationPeriod);\\n event OnRampCooldownPeriodSet(uint256 onRampCooldownPeriod);\\n event SustainabilityFeeUpdated(uint256 fee);\\n event SustainabilityFeeRecipientUpdated(address feeRecipient);\\n event NewSendProcessorSet(address sendProcessor);\\n\\n /* ============ Structs ============ */\\n\\n struct Deposit {\\n address depositor;\\n string revolutTag;\\n address verifierSigningKey; // Public key of the verifier depositor wants to sign the TLS proof\\n bytes32 notaryKeyHash; // Hash of notary's public key\\n uint256 depositAmount; // Amount of USDC deposited\\n bytes32 receiveCurrencyId; // Id of the currency to be received off-chain (bytes32(Revolut currency code))\\n uint256 remainingDeposits; // Amount of remaining deposited liquidity\\n uint256 outstandingIntentAmount; // Amount of outstanding intents (may include expired intents)\\n uint256 conversionRate; // Conversion required by off-ramper between USDC/USD\\n bytes32[] intentHashes; // Array of hashes of all open intents (may include some expired if not pruned)\\n }\\n\\n struct DepositWithAvailableLiquidity {\\n uint256 depositId; // ID of the deposit\\n bytes32 depositorId; // Depositor's accountId, this ID is a hash of the user's original Rev Tag \\n Deposit deposit; // Deposit struct\\n uint256 availableLiquidity; // Amount of liquidity available to signal intents (net of expired intents)\\n }\\n\\n struct Intent {\\n address onRamper; // On-ramper's address\\n address to; // Address to forward funds to (can be same as onRamper)\\n uint256 deposit; // ID of the deposit the intent is signaling on\\n uint256 amount; // Amount of USDC the on-ramper signals intent for on-chain\\n uint256 intentTimestamp; // Timestamp of when the intent was signaled\\n }\\n\\n struct IntentWithOnRamperId {\\n bytes32 intentHash; // Intent hash\\n Intent intent; // Intent struct\\n bytes32 onRamperId; // onRamper's onRamperId, this ID is a hash of the user's original Rev Tag\\n }\\n\\n // A Global Account is defined as an account represented by one accountId. This is used to enforce limitations on actions across\\n // all Ethereum addresses that are associated with that accountId. In this case we use it to enforce a cooldown period between on ramps,\\n // restrict each Revolut account to one outstanding intent at a time, and to enforce deny lists.\\n struct GlobalAccountInfo {\\n bytes32 currentIntentHash; // Hash of the current open intent (if exists)\\n uint256 lastOnrampTimestamp; // Timestamp of the last on-ramp transaction used to check if cooldown period elapsed\\n uint256[] deposits; // Array of open account deposits\\n }\\n\\n /* ============ Modifiers ============ */\\n modifier onlyRegisteredUser() {\\n require(accountRegistry.isRegisteredUser(msg.sender), \\\"Caller must be registered user\\\");\\n _;\\n }\\n\\n /* ============ Constants ============ */\\n uint256 internal constant PRECISE_UNIT = 1e18;\\n uint256 internal constant MAX_DEPOSITS = 5; // An account can only have max 5 different deposit parameterizations to prevent locking funds\\n uint256 constant CIRCOM_PRIME_FIELD = 21888242871839275222246405745257275088548364400416034343698204186575808495617;\\n uint256 constant MAX_SUSTAINABILITY_FEE = 5e16; // 5% max sustainability fee\\n \\n /* ============ State Variables ============ */\\n IERC20 public immutable usdc; // USDC token contract\\n IRevolutAccountRegistry public accountRegistry; // Account Registry contract for Revolut\\n IRevolutSendProcessor public sendProcessor; // Address of send processor contract\\n\\n bool public isInitialized; // Indicates if contract has been initialized\\n\\n mapping(bytes32 => GlobalAccountInfo) internal globalAccount; // Mapping of onRamp ID to information used to enforce actions across Ethereum accounts\\n mapping(uint256 => Deposit) public deposits; // Mapping of depositIds to deposit structs\\n mapping(bytes32 => Intent) public intents; // Mapping of intentHashes to intent structs\\n\\n uint256 public minDepositAmount; // Minimum amount of USDC that can be deposited\\n uint256 public maxOnRampAmount; // Maximum amount of USDC that can be on-ramped in a single transaction\\n uint256 public onRampCooldownPeriod; // Time period that must elapse between completing an on-ramp and signaling a new intent\\n uint256 public intentExpirationPeriod; // Time period after which an intent can be pruned from the system\\n uint256 public sustainabilityFee; // Fee charged to on-rampers in preciseUnits (1e16 = 1%)\\n address public sustainabilityFeeRecipient; // Address that receives the sustainability fee\\n\\n uint256 public depositCounter; // Counter for depositIds\\n\\n /* ============ Constructor ============ */\\n constructor(\\n address _owner,\\n IERC20 _usdc,\\n uint256 _minDepositAmount,\\n uint256 _maxOnRampAmount,\\n uint256 _intentExpirationPeriod,\\n uint256 _onRampCooldownPeriod,\\n uint256 _sustainabilityFee,\\n address _sustainabilityFeeRecipient\\n )\\n Ownable()\\n {\\n usdc = _usdc;\\n minDepositAmount = _minDepositAmount;\\n maxOnRampAmount = _maxOnRampAmount;\\n intentExpirationPeriod = _intentExpirationPeriod;\\n onRampCooldownPeriod = _onRampCooldownPeriod;\\n sustainabilityFee = _sustainabilityFee;\\n sustainabilityFeeRecipient = _sustainabilityFeeRecipient;\\n\\n transferOwnership(_owner);\\n }\\n\\n /* ============ External Functions ============ */\\n\\n /**\\n * @notice Initialize Ramp with the addresses of the Processors\\n *\\n * @param _accountRegistry Account Registry contract for Revolut\\n * @param _sendProcessor Send processor address\\n */\\n function initialize(\\n IRevolutAccountRegistry _accountRegistry,\\n IRevolutSendProcessor _sendProcessor\\n )\\n external\\n onlyOwner\\n {\\n require(!isInitialized, \\\"Already initialized\\\");\\n\\n accountRegistry = _accountRegistry;\\n sendProcessor = _sendProcessor;\\n\\n isInitialized = true;\\n }\\n\\n /**\\n * @notice Generates a deposit entry for off-rampers that can then be fulfilled by an on-ramper. This function will not add to\\n * previous deposits. Every deposit has it's own unique identifier. User must approve the contract to transfer the deposit amount\\n * of USDC.\\n *\\n * @param _revolutTag Depositor's Revolut tag to receive payments\\n * @param _receiveCurrencyId Id of the currency to be received off-chain\\n * @param _depositAmount The amount of USDC to off-ramp\\n * @param _receiveAmount The amount of USD to receive\\n * @param _verifierSigningKey Public key of the verifier depositor wants to sign the TLS proof\\n * @param _notaryKeyHash Hash of the notary public key that is required to do notarization\\n */\\n function offRamp(\\n string calldata _revolutTag,\\n bytes32 _receiveCurrencyId,\\n uint256 _depositAmount,\\n uint256 _receiveAmount,\\n address _verifierSigningKey,\\n bytes32 _notaryKeyHash\\n )\\n external\\n onlyRegisteredUser\\n {\\n bytes32 offRamperId = accountRegistry.getAccountId(msg.sender);\\n GlobalAccountInfo storage globalAccountInfo = globalAccount[offRamperId];\\n\\n require(keccak256(abi.encode(_revolutTag)) == offRamperId, \\\"Revolut tag must match id\\\");\\n require(globalAccountInfo.deposits.length < MAX_DEPOSITS, \\\"Maximum deposit amount reached\\\");\\n require(_depositAmount >= minDepositAmount, \\\"Deposit amount must be greater than min deposit amount\\\");\\n require(_receiveAmount > 0, \\\"Receive amount must be greater than 0\\\");\\n\\n uint256 conversionRate = (_depositAmount * PRECISE_UNIT) / _receiveAmount;\\n uint256 depositId = depositCounter++;\\n\\n globalAccountInfo.deposits.push(depositId);\\n\\n deposits[depositId] = Deposit({\\n depositor: msg.sender,\\n revolutTag: _revolutTag,\\n receiveCurrencyId: _receiveCurrencyId,\\n depositAmount: _depositAmount,\\n remainingDeposits: _depositAmount,\\n outstandingIntentAmount: 0,\\n conversionRate: conversionRate,\\n intentHashes: new bytes32[](0),\\n verifierSigningKey: _verifierSigningKey,\\n notaryKeyHash: _notaryKeyHash\\n });\\n\\n usdc.transferFrom(msg.sender, address(this), _depositAmount);\\n\\n emit DepositReceived(depositId, offRamperId, _receiveCurrencyId, _depositAmount, conversionRate);\\n }\\n\\n /**\\n * @notice Signals intent to pay the depositor defined in the _depositId the _amount * deposit conversionRate off-chain\\n * in order to unlock _amount of funds on-chain. Each user can only have one outstanding intent at a time regardless of\\n * address (tracked using accountId). Caller must not be on the depositor's deny list. If there are prunable intents then\\n * they will be deleted from the deposit to be able to maintain state hygiene.\\n *\\n * @param _depositId The ID of the deposit the on-ramper intends to use for \\n * @param _amount The amount of USDC the user wants to on-ramp\\n * @param _to Address to forward funds to (can be same as onRamper)\\n */\\n function signalIntent(uint256 _depositId, uint256 _amount, address _to) external onlyRegisteredUser {\\n bytes32 onRamperId = accountRegistry.getAccountId(msg.sender);\\n Deposit storage deposit = deposits[_depositId];\\n\\n // Caller validity checks\\n require(accountRegistry.isAllowedUser(deposit.depositor, onRamperId), \\\"Onramper on depositor's denylist\\\");\\n require(\\n globalAccount[onRamperId].lastOnrampTimestamp + onRampCooldownPeriod <= block.timestamp,\\n \\\"On ramp cool down period not elapsed\\\"\\n );\\n require(globalAccount[onRamperId].currentIntentHash == bytes32(0), \\\"Intent still outstanding\\\");\\n require(accountRegistry.getAccountId(deposit.depositor) != onRamperId, \\\"Sender cannot be the depositor\\\");\\n\\n // Intent information checks\\n require(deposit.depositor != address(0), \\\"Deposit does not exist\\\");\\n require(_amount > 0, \\\"Signaled amount must be greater than 0\\\");\\n require(_amount <= maxOnRampAmount, \\\"Signaled amount must be less than max on-ramp amount\\\");\\n require(_to != address(0), \\\"Cannot send to zero address\\\");\\n\\n bytes32 intentHash = _calculateIntentHash(onRamperId, _depositId);\\n\\n if (deposit.remainingDeposits < _amount) {\\n (\\n bytes32[] memory prunableIntents,\\n uint256 reclaimableAmount\\n ) = _getPrunableIntents(_depositId);\\n\\n require(deposit.remainingDeposits + reclaimableAmount >= _amount, \\\"Not enough liquidity\\\");\\n\\n _pruneIntents(deposit, prunableIntents);\\n deposit.remainingDeposits += reclaimableAmount;\\n deposit.outstandingIntentAmount -= reclaimableAmount;\\n }\\n\\n intents[intentHash] = Intent({\\n onRamper: msg.sender,\\n to: _to,\\n deposit: _depositId,\\n amount: _amount,\\n intentTimestamp: block.timestamp\\n });\\n\\n globalAccount[onRamperId].currentIntentHash = intentHash;\\n\\n deposit.remainingDeposits -= _amount;\\n deposit.outstandingIntentAmount += _amount;\\n deposit.intentHashes.push(intentHash);\\n\\n emit IntentSignaled(intentHash, _depositId, onRamperId, _to, _amount, block.timestamp);\\n }\\n\\n /**\\n * @notice Only callable by the originator of the intent. Cancels an outstanding intent thus allowing user to signal a new\\n * intent. Deposit state is updated to reflect the cancelled intent.\\n *\\n * @param _intentHash Hash of intent being cancelled\\n */\\n function cancelIntent(bytes32 _intentHash) external {\\n Intent memory intent = intents[_intentHash];\\n \\n require(intent.intentTimestamp != 0, \\\"Intent does not exist\\\");\\n require(\\n accountRegistry.getAccountId(intent.onRamper) == accountRegistry.getAccountId(msg.sender),\\n \\\"Sender must be the on-ramper\\\"\\n );\\n\\n Deposit storage deposit = deposits[intent.deposit];\\n\\n _pruneIntent(deposit, _intentHash);\\n\\n deposit.remainingDeposits += intent.amount;\\n deposit.outstandingIntentAmount -= intent.amount;\\n }\\n\\n /**\\n * @notice Anyone can submit an on-ramp transaction, even if caller isn't on-ramper. Upon submission the proof is validated,\\n * intent is removed, and deposit state is updated. USDC is transferred to the on-ramper.\\n *\\n * @param _sendData Struct containing unredacted data from API call to Revolut\\n * @param _verifierSignature Signature by verifier of the unredacted data\\n */\\n function onRamp(\\n IRevolutSendProcessor.SendData calldata _sendData,\\n bytes calldata _verifierSignature\\n )\\n external\\n {\\n (\\n Intent memory intent,\\n Deposit storage deposit,\\n bytes32 intentHash\\n ) = _verifyOnRampProof(_sendData, _verifierSignature);\\n\\n _pruneIntent(deposit, intentHash);\\n\\n deposit.outstandingIntentAmount -= intent.amount;\\n globalAccount[accountRegistry.getAccountId(intent.onRamper)].lastOnrampTimestamp = block.timestamp;\\n _closeDepositIfNecessary(intent.deposit, deposit);\\n\\n _transferFunds(intentHash, intent);\\n }\\n\\n /**\\n * @notice Allows off-ramper to release funds to the on-ramper in case of a failed on-ramp or because of some other arrangement\\n * between the two parties. Upon submission we check to make sure the msg.sender is the depositor, the intent is removed, and \\n * deposit state is updated. USDC is transferred to the on-ramper.\\n *\\n * @param _intentHash Hash of intent to resolve by releasing the funds\\n */\\n function releaseFundsToOnramper(bytes32 _intentHash) external {\\n Intent memory intent = intents[_intentHash];\\n Deposit storage deposit = deposits[intent.deposit];\\n\\n require(intent.onRamper != address(0), \\\"Intent does not exist\\\");\\n require(deposit.depositor == msg.sender, \\\"Caller must be the depositor\\\");\\n\\n _pruneIntent(deposit, _intentHash);\\n\\n deposit.outstandingIntentAmount -= intent.amount;\\n globalAccount[accountRegistry.getAccountId(intent.onRamper)].lastOnrampTimestamp = block.timestamp;\\n _closeDepositIfNecessary(intent.deposit, deposit);\\n\\n _transferFunds(_intentHash, intent);\\n }\\n\\n /**\\n * @notice Caller must be the depositor for each depositId in the array, if not whole function fails. Depositor is returned all\\n * remaining deposits and any outstanding intents that are expired. If an intent is not expired then those funds will not be\\n * returned. Deposit will be deleted as long as there are no more outstanding intents.\\n *\\n * @param _depositIds Array of depositIds the depositor is attempting to withdraw\\n */\\n function withdrawDeposit(uint256[] memory _depositIds) external {\\n uint256 returnAmount;\\n\\n for (uint256 i = 0; i < _depositIds.length; ++i) {\\n uint256 depositId = _depositIds[i];\\n Deposit storage deposit = deposits[depositId];\\n\\n require(deposit.depositor == msg.sender, \\\"Sender must be the depositor\\\");\\n\\n (\\n bytes32[] memory prunableIntents,\\n uint256 reclaimableAmount\\n ) = _getPrunableIntents(depositId);\\n\\n _pruneIntents(deposit, prunableIntents);\\n\\n returnAmount += deposit.remainingDeposits + reclaimableAmount;\\n \\n deposit.outstandingIntentAmount -= reclaimableAmount;\\n\\n emit DepositWithdrawn(depositId, deposit.depositor, deposit.remainingDeposits + reclaimableAmount);\\n \\n delete deposit.remainingDeposits;\\n _closeDepositIfNecessary(depositId, deposit);\\n }\\n\\n usdc.transfer(msg.sender, returnAmount);\\n }\\n\\n /* ============ Governance Functions ============ */\\n\\n /**\\n * @notice GOVERNANCE ONLY: Updates the send processor address used for validating and interpreting zk proofs.\\n *\\n * @param _sendProcessor New send proccesor address\\n */\\n function setSendProcessor(IRevolutSendProcessor _sendProcessor) external onlyOwner {\\n sendProcessor = _sendProcessor;\\n emit NewSendProcessorSet(address(_sendProcessor));\\n }\\n\\n\\n /**\\n * @notice GOVERNANCE ONLY: Updates the minimum deposit amount a user can specify for off-ramping.\\n *\\n * @param _minDepositAmount The new minimum deposit amount\\n */\\n function setMinDepositAmount(uint256 _minDepositAmount) external onlyOwner {\\n require(_minDepositAmount != 0, \\\"Minimum deposit cannot be zero\\\");\\n\\n minDepositAmount = _minDepositAmount;\\n emit MinDepositAmountSet(_minDepositAmount);\\n }\\n\\n /**\\n * @notice GOVERNANCE ONLY: Updates the sustainability fee. This fee is charged to on-rampers upon a successful on-ramp.\\n *\\n * @param _fee The new sustainability fee in precise units (10**18, ie 10% = 1e17)\\n */\\n function setSustainabilityFee(uint256 _fee) external onlyOwner {\\n require(_fee <= MAX_SUSTAINABILITY_FEE, \\\"Fee cannot be greater than max fee\\\");\\n\\n sustainabilityFee = _fee;\\n emit SustainabilityFeeUpdated(_fee);\\n }\\n\\n /**\\n * @notice GOVERNANCE ONLY: Updates the recepient of sustainability fees.\\n *\\n * @param _feeRecipient The new fee recipient address\\n */\\n function setSustainabilityFeeRecipient(address _feeRecipient) external onlyOwner {\\n require(_feeRecipient != address(0), \\\"Fee recipient cannot be zero address\\\");\\n\\n sustainabilityFeeRecipient = _feeRecipient;\\n emit SustainabilityFeeRecipientUpdated(_feeRecipient);\\n }\\n\\n /**\\n * @notice GOVERNANCE ONLY: Updates the max amount allowed to be on-ramped in each transaction. To on-ramp more than\\n * this amount a user must make multiple transactions.\\n *\\n * @param _maxOnRampAmount The new max on ramp amount\\n */\\n function setMaxOnRampAmount(uint256 _maxOnRampAmount) external onlyOwner {\\n require(_maxOnRampAmount != 0, \\\"Max on ramp amount cannot be zero\\\");\\n\\n maxOnRampAmount = _maxOnRampAmount;\\n emit MaxOnRampAmountSet(_maxOnRampAmount);\\n }\\n\\n /**\\n * @notice GOVERNANCE ONLY: Updates the on-ramp cooldown period, once an on-ramp transaction is completed the user must wait this\\n * amount of time before they can signalIntent to on-ramp again.\\n *\\n * @param _onRampCooldownPeriod New on-ramp cooldown period\\n */\\n function setOnRampCooldownPeriod(uint256 _onRampCooldownPeriod) external onlyOwner {\\n onRampCooldownPeriod = _onRampCooldownPeriod;\\n emit OnRampCooldownPeriodSet(_onRampCooldownPeriod);\\n }\\n\\n /**\\n * @notice GOVERNANCE ONLY: Updates the intent expiration period, after this period elapses an intent can be pruned to prevent\\n * locking up a depositor's funds.\\n *\\n * @param _intentExpirationPeriod New intent expiration period\\n */\\n function setIntentExpirationPeriod(uint256 _intentExpirationPeriod) external onlyOwner {\\n require(_intentExpirationPeriod != 0, \\\"Max intent expiration period cannot be zero\\\");\\n\\n intentExpirationPeriod = _intentExpirationPeriod;\\n emit IntentExpirationPeriodSet(_intentExpirationPeriod);\\n }\\n\\n\\n /* ============ External View Functions ============ */\\n\\n function getDeposit(uint256 _depositId) external view returns (Deposit memory) {\\n return deposits[_depositId];\\n }\\n\\n function getIdCurrentIntentHash(address _account) public view returns (bytes32) {\\n return globalAccount[accountRegistry.getAccountId(_account)].currentIntentHash;\\n }\\n\\n function getIdCurrentIntentHashAsUint(address _account) external view returns (uint256) {\\n return uint256(getIdCurrentIntentHash(_account));\\n }\\n\\n function getLastOnRampTimestamp(address _account) external view returns (uint256) {\\n return globalAccount[accountRegistry.getAccountId(_account)].lastOnrampTimestamp;\\n }\\n\\n function getIntentsWithOnRamperId(bytes32[] calldata _intentHashes) external view returns (IntentWithOnRamperId[] memory) {\\n IntentWithOnRamperId[] memory intentsWithOnRamperId = new IntentWithOnRamperId[](_intentHashes.length);\\n\\n for (uint256 i = 0; i < _intentHashes.length; ++i) {\\n bytes32 intentHash = _intentHashes[i];\\n Intent memory intent = intents[intentHash];\\n intentsWithOnRamperId[i] = IntentWithOnRamperId({\\n intentHash: _intentHashes[i],\\n intent: intent,\\n onRamperId: accountRegistry.getAccountId(intent.onRamper)\\n });\\n }\\n\\n return intentsWithOnRamperId;\\n }\\n\\n function getAccountDeposits(address _account) external view returns (DepositWithAvailableLiquidity[] memory accountDeposits) {\\n uint256[] memory accountDepositIds = globalAccount[accountRegistry.getAccountId(_account)].deposits;\\n accountDeposits = new DepositWithAvailableLiquidity[](accountDepositIds.length);\\n \\n for (uint256 i = 0; i < accountDepositIds.length; ++i) {\\n uint256 depositId = accountDepositIds[i];\\n Deposit memory deposit = deposits[depositId];\\n ( , uint256 reclaimableAmount) = _getPrunableIntents(depositId);\\n\\n accountDeposits[i] = DepositWithAvailableLiquidity({\\n depositId: depositId,\\n depositorId: accountRegistry.getAccountId(deposit.depositor),\\n deposit: deposit,\\n availableLiquidity: deposit.remainingDeposits + reclaimableAmount\\n });\\n }\\n }\\n\\n function getDepositFromIds(uint256[] memory _depositIds) external view returns (DepositWithAvailableLiquidity[] memory depositArray) {\\n depositArray = new DepositWithAvailableLiquidity[](_depositIds.length);\\n\\n for (uint256 i = 0; i < _depositIds.length; ++i) {\\n uint256 depositId = _depositIds[i];\\n Deposit memory deposit = deposits[depositId];\\n ( , uint256 reclaimableAmount) = _getPrunableIntents(depositId);\\n\\n depositArray[i] = DepositWithAvailableLiquidity({\\n depositId: depositId,\\n depositorId: accountRegistry.getAccountId(deposit.depositor),\\n deposit: deposit,\\n availableLiquidity: deposit.remainingDeposits + reclaimableAmount\\n });\\n }\\n\\n return depositArray;\\n }\\n\\n /* ============ Internal Functions ============ */\\n\\n /**\\n * @notice Calculates the intentHash of new intent\\n */\\n function _calculateIntentHash(\\n bytes32 _accountId,\\n uint256 _depositId\\n )\\n internal\\n view\\n virtual\\n returns (bytes32 intentHash)\\n {\\n // Mod with circom prime field to make sure it fits in a 254-bit field\\n uint256 intermediateHash = uint256(keccak256(abi.encodePacked(_accountId, _depositId, block.timestamp)));\\n intentHash = bytes32(intermediateHash % CIRCOM_PRIME_FIELD);\\n }\\n\\n /**\\n * @notice Cycles through all intents currently open on a deposit and sees if any have expired. If they have expired\\n * the outstanding amounts are summed and returned alongside the intentHashes\\n */\\n function _getPrunableIntents(\\n uint256 _depositId\\n )\\n internal\\n view\\n returns(bytes32[] memory prunableIntents, uint256 reclaimedAmount)\\n {\\n bytes32[] memory intentHashes = deposits[_depositId].intentHashes;\\n prunableIntents = new bytes32[](intentHashes.length);\\n\\n for (uint256 i = 0; i < intentHashes.length; ++i) {\\n Intent memory intent = intents[intentHashes[i]];\\n if (intent.intentTimestamp + intentExpirationPeriod < block.timestamp) {\\n prunableIntents[i] = intentHashes[i];\\n reclaimedAmount += intent.amount;\\n }\\n }\\n }\\n\\n function _pruneIntents(Deposit storage _deposit, bytes32[] memory _intents) internal {\\n for (uint256 i = 0; i < _intents.length; ++i) {\\n if (_intents[i] != bytes32(0)) {\\n _pruneIntent(_deposit, _intents[i]);\\n }\\n }\\n }\\n\\n /**\\n * @notice Pruning an intent involves deleting its state from the intents mapping, zeroing out the intendee's currentIntentHash in\\n * their global account mapping, and deleting the intentHash from the deposit's intentHashes array.\\n */\\n function _pruneIntent(Deposit storage _deposit, bytes32 _intentHash) internal {\\n Intent memory intent = intents[_intentHash];\\n\\n delete globalAccount[accountRegistry.getAccountId(intent.onRamper)].currentIntentHash;\\n delete intents[_intentHash];\\n _deposit.intentHashes.removeStorage(_intentHash);\\n\\n emit IntentPruned(_intentHash, intent.deposit);\\n }\\n\\n /**\\n * @notice Removes a deposit if no outstanding intents AND no remaining deposits. Deleting a deposit deletes it from the\\n * deposits mapping and removes tracking it in the user's accounts mapping.\\n */\\n function _closeDepositIfNecessary(uint256 _depositId, Deposit storage _deposit) internal {\\n uint256 openDepositAmount = _deposit.outstandingIntentAmount + _deposit.remainingDeposits;\\n if (openDepositAmount == 0) {\\n globalAccount[accountRegistry.getAccountId(_deposit.depositor)].deposits.removeStorage(_depositId);\\n emit DepositClosed(_depositId, _deposit.depositor);\\n delete deposits[_depositId];\\n }\\n }\\n\\n /**\\n * @notice Checks if sustainability fee has been defined, if so sends fee to the fee recipient and intent amount minus fee\\n * to the on-ramper. If sustainability fee is undefined then full intent amount is transferred to on-ramper.\\n */\\n function _transferFunds(bytes32 _intentHash, Intent memory _intent) internal {\\n uint256 fee;\\n if (sustainabilityFee != 0) {\\n fee = (_intent.amount * sustainabilityFee) / PRECISE_UNIT;\\n usdc.transfer(sustainabilityFeeRecipient, fee);\\n }\\n\\n uint256 onRampAmount = _intent.amount - fee;\\n usdc.transfer(_intent.to, onRampAmount);\\n\\n emit IntentFulfilled(_intentHash, _intent.deposit, _intent.onRamper, _intent.to, onRampAmount, fee);\\n }\\n\\n /**\\n * @notice Validate send payment email and check that it hasn't already been used (done on SendProcessor).\\n * Additionally, we validate that the offRamperId matches the one from the specified intent and that enough\\n * was paid off-chain inclusive of the conversionRate.\\n */\\n function _verifyOnRampProof(\\n IRevolutSendProcessor.SendData calldata _data,\\n bytes calldata _verifierSignature\\n )\\n internal\\n returns(Intent storage intent, Deposit storage deposit, bytes32 intentHash)\\n {\\n intentHash = bytes32(_data.intentHash);\\n intent = intents[intentHash];\\n require(intent.onRamper == msg.sender, \\\"Caller must be the on-ramper\\\");\\n\\n deposit = deposits[intent.deposit];\\n\\n (\\n uint256 amount,\\n uint256 timestamp,\\n bytes32 offRamperId,\\n bytes32 currencyId,\\n bytes32 notaryKeyHash\\n ) = sendProcessor.processProof(\\n IRevolutSendProcessor.SendProof({\\n public_values: _data,\\n proof: _verifierSignature\\n }),\\n deposit.verifierSigningKey\\n );\\n\\n require(notaryKeyHash == deposit.notaryKeyHash, \\\"Incorrect notary used for notarization\\\");\\n require(currencyId == deposit.receiveCurrencyId, \\\"Wrong currency sent\\\");\\n require(intent.intentTimestamp <= timestamp, \\\"Intent was not created before send\\\");\\n require(keccak256(abi.encodePacked(deposit.revolutTag)) == offRamperId, \\\"Offramper id does not match\\\");\\n require(amount >= (intent.amount * PRECISE_UNIT) / deposit.conversionRate, \\\"Payment was not enough\\\");\\n }\\n}\\n\",\"keccak256\":\"0x576f519d82b98521832a1ac34c2ec806e438a73ed562e67718920effcf9f9b2b\",\"license\":\"MIT\"},\"contracts/ramps/revolut/interfaces/IRevolutAccountRegistry.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.18;\\n\\ninterface IRevolutAccountRegistry {\\n function getAccountId(address _account) external view returns (bytes32);\\n function isRegisteredUser(address _account) external view returns (bool);\\n function isAllowedUser(address _account, bytes32 _deniedUser) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x5c58e8996f2d06f3d8bad7b3cef912c6370eecb2f3523ff8c1e15ec05dfb8e74\",\"license\":\"MIT\"},\"contracts/ramps/revolut/interfaces/IRevolutSendProcessor.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.18;\\n\\ninterface IRevolutSendProcessor {\\n\\n struct SendData {\\n string endpoint;\\n string host;\\n string transferId;\\n string recipientId;\\n string amount;\\n string currencyId;\\n string status;\\n string timestamp;\\n uint256 intentHash;\\n uint256 notaryKeyHash;\\n }\\n\\n struct SendProof {\\n SendData public_values;\\n bytes proof;\\n }\\n\\n function processProof(\\n SendProof calldata _proof,\\n address _verifierSigningKey\\n )\\n external\\n returns(uint256, uint256, bytes32, bytes32, bytes32);\\n}\\n\",\"keccak256\":\"0x6bb42393fe8c5f9ac83fa56e126413638b4a0c110602eecaa70d2b41cf77f1a3\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x60a060405234801562000010575f80fd5b5060405162004700380380620047008339810160408190526200003391620001d9565b6200003e3362000095565b6001600160a01b038781166080526006879055600786905560098590556008849055600a839055600b80546001600160a01b0319169183169190911790556200008788620000e4565b50505050505050506200025a565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b620000ee62000167565b6001600160a01b038116620001595760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b620001648162000095565b50565b5f546001600160a01b03163314620001c25760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640162000150565b565b6001600160a01b038116811462000164575f80fd5b5f805f805f805f80610100898b031215620001f2575f80fd5b8851620001ff81620001c4565b60208a01519098506200021281620001c4565b8097505060408901519550606089015194506080890151935060a0890151925060c0890151915060e08901516200024981620001c4565b809150509295985092959890939650565b6080516144716200028f5f395f81816102db0152818161196301528181611e03015281816132db015261338601526144715ff3fe608060405234801561000f575f80fd5b506004361061021e575f3560e01c8063711347621161012a578063b3c0cfa4116100b4578063e279d96411610079578063e279d96414610535578063ecb3dc881461053e578063ecd618f014610547578063eea1d19714610567578063f2fde38b1461057a575f80fd5b8063b3c0cfa4146104d6578063b3fa4c01146104e9578063d089e11a146104fc578063d55f960d1461050f578063d9478d2014610522575f80fd5b80639021578a116100fa5780639021578a146103f75780639087beff146104725780639f9fb96814610485578063a1a954b7146104a5578063b02c43d0146104ae575f80fd5b806371134762146103b9578063715018a6146103cc57806371a28f69146103d45780638da5cb5b146103e7575f80fd5b80633e85fc25116101ab5780635081d9521161017b5780635081d952146103575780635d108a22146103775780635dd765151461038a578063645006ca1461039d57806366ec8419146103a6575f80fd5b80633e85fc25146103155780634298734914610328578063485cc9551461033b578063495223e71461034e575f80fd5b80632a80cda3116101f15780632a80cda314610279578063317dcc961461028c578063392e53cd1461029f5780633adba28a146102c35780633e413bee146102d6575f80fd5b80630f1ef98c14610222578063133de6cb1461024857806314ec32fa1461025d578063238c849414610270575b5f80fd5b61023561023036600461383a565b61058d565b6040519081526020015b60405180910390f35b61025b61025636600461383a565b610618565b005b61023561026b36600461383a565b610675565b610235600a5481565b61025b61028736600461385c565b6106fe565b61025b61029a36600461385c565b61078f565b6002546102b390600160a01b900460ff1681565b604051901515815260200161023f565b61025b6102d1366004613873565b6107cc565b6102fd7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161023f565b61025b6103233660046138e6565b610ebb565b61025b61033636600461385c565b610fe3565b61025b610349366004613951565b611083565b61023560085481565b61036a61036536600461383a565b611116565b60405161023f9190613aab565b61025b610385366004613b37565b6114c9565b61025b61039836600461385c565b611a29565b61023560065481565b61025b6103b436600461385c565b611ac8565b61025b6103c7366004613c1b565b611c91565b61025b611e75565b61036a6103e2366004613c1b565b611e88565b5f546001600160a01b03166102fd565b61043f61040536600461385c565b60056020525f9081526040902080546001820154600283015460038401546004909401546001600160a01b03938416949390921692909185565b604080516001600160a01b039687168152959094166020860152928401919091526060830152608082015260a00161023f565b61025b61048036600461385c565b612169565b61049861049336600461385c565b6121ff565b60405161023f9190613cbb565b61023560095481565b6104c16104bc36600461385c565b61238a565b60405161023f99989796959493929190613ccd565b6102356104e436600461383a565b61246c565b61025b6104f736600461383a565b61247c565b6001546102fd906001600160a01b031681565b61025b61051d36600461385c565b612534565b600b546102fd906001600160a01b031681565b61023560075481565b610235600c5481565b61055a610555366004613d2a565b61274c565b60405161023f9190613d98565b6002546102fd906001600160a01b031681565b61025b61058836600461383a565b612932565b60015460405163e0b490f760e01b81526001600160a01b0383811660048301525f9260039284929091169063e0b490f790602401602060405180830381865afa1580156105dc573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106009190613e27565b81526020019081526020015f20600101549050919050565b6106206129ab565b600280546001600160a01b0319166001600160a01b0383169081179091556040519081527f6e7665a41605edc0d70f4b991d652755f380754eb092d81ef9ab93664778d59e906020015b60405180910390a150565b60015460405163e0b490f760e01b81526001600160a01b0383811660048301525f9260039284929091169063e0b490f790602401602060405180830381865afa1580156106c4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106e89190613e27565b815260208101919091526040015f205492915050565b6107066129ab565b805f0361075a5760405162461bcd60e51b815260206004820152601e60248201527f4d696e696d756d206465706f7369742063616e6e6f74206265207a65726f000060448201526064015b60405180910390fd5b60068190556040518181527fbdde72a6d8d8b42770c9899945ccdce09d0c5c794d3326cdb2d2cca61b12a9fc9060200161066a565b6107976129ab565b60088190556040518181527f88397975d177ce5e18abf3a5fdb8de773e80673d85eeb54f48cfaf688b3d2c3e9060200161066a565b600154604051631f5bdf5d60e01b81523360048201526001600160a01b0390911690631f5bdf5d90602401602060405180830381865afa158015610812573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108369190613e3e565b6108825760405162461bcd60e51b815260206004820152601e60248201527f43616c6c6572206d7573742062652072656769737465726564207573657200006044820152606401610751565b60015460405163e0b490f760e01b81523360048201525f916001600160a01b03169063e0b490f790602401602060405180830381865afa1580156108c8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108ec9190613e27565b5f8581526004602081905260409182902060015481549351630359b09b60e31b81526001600160a01b039485169381019390935260248301859052939450929190911690631acd84d890604401602060405180830381865afa158015610954573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109789190613e3e565b6109c45760405162461bcd60e51b815260206004820181905260248201527f4f6e72616d706572206f6e206465706f7369746f7227732064656e796c6973746044820152606401610751565b6008545f8381526003602052604090206001015442916109e391613e71565b1115610a3d5760405162461bcd60e51b8152602060048201526024808201527f4f6e2072616d7020636f6f6c20646f776e20706572696f64206e6f7420656c616044820152631c1cd95960e21b6064820152608401610751565b5f8281526003602052604090205415610a985760405162461bcd60e51b815260206004820152601860248201527f496e74656e74207374696c6c206f75747374616e64696e6700000000000000006044820152606401610751565b600154815460405163e0b490f760e01b81526001600160a01b0391821660048201528492919091169063e0b490f790602401602060405180830381865afa158015610ae5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b099190613e27565b03610b565760405162461bcd60e51b815260206004820152601e60248201527f53656e6465722063616e6e6f7420626520746865206465706f7369746f7200006044820152606401610751565b80546001600160a01b0316610ba65760405162461bcd60e51b815260206004820152601660248201527511195c1bdcda5d08191bd95cc81b9bdd08195e1a5cdd60521b6044820152606401610751565b5f8411610c045760405162461bcd60e51b815260206004820152602660248201527f5369676e616c656420616d6f756e74206d75737420626520677265617465722060448201526507468616e20360d41b6064820152608401610751565b600754841115610c735760405162461bcd60e51b815260206004820152603460248201527f5369676e616c656420616d6f756e74206d757374206265206c657373207468616044820152731b881b585e081bdb8b5c985b5c08185b5bdd5b9d60621b6064820152608401610751565b6001600160a01b038316610cc95760405162461bcd60e51b815260206004820152601b60248201527f43616e6e6f742073656e6420746f207a65726f206164647265737300000000006044820152606401610751565b5f610cd48387612a04565b90508482600601541015610d86575f80610ced88612a6e565b9150915086818560060154610d029190613e71565b1015610d475760405162461bcd60e51b81526020600482015260146024820152734e6f7420656e6f756768206c697175696469747960601b6044820152606401610751565b610d518483612c06565b80846006015f828254610d649190613e71565b9250508190555080846007015f828254610d7e9190613e84565b909155505050505b6040805160a0810182523381526001600160a01b0386811660208084019182528385018b8152606085018b815242608087019081525f89815260058552888120975188549088166001600160a01b0319918216178955955160018901805491909816961695909517909555905160028601555160038086019190915592516004909401939093558681529152908120829055600683018054879290610e2c908490613e84565b9250508190555084826007015f828254610e469190613e71565b90915550506009820180546001810182555f91825260209182902001829055604080516001600160a01b038716815291820187905242908201528390879083907f1a1292e170a0f000ccf956afba79bee0f9ec1d81f3f901c1d4d11e1f336aae109060600160405180910390a4505050505050565b5f805f610ec9868686612c5e565b6040805160a08101825284546001600160a01b039081168252600186015416602082015260028501549181019190915260038401546060820152600490930154608084015291945092509050610f1f8282612fc7565b8260600151826007015f828254610f369190613e84565b9091555050600154835160405163e0b490f760e01b81526001600160a01b03918216600482015242926003925f9291169063e0b490f790602401602060405180830381865afa158015610f8b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610faf9190613e27565b81526020019081526020015f2060010181905550610fd183604001518361310b565b610fdb8184613280565b505050505050565b610feb6129ab565b805f0361104e5760405162461bcd60e51b815260206004820152602b60248201527f4d617820696e74656e742065787069726174696f6e20706572696f642063616e60448201526a6e6f74206265207a65726f60a81b6064820152608401610751565b60098190556040518181527f55e3f6b95de9a0ec782f892e93fafe4e56be0696df204ddf8e0a40a9a713a8039060200161066a565b61108b6129ab565b600254600160a01b900460ff16156110db5760405162461bcd60e51b8152602060048201526013602482015272105b1c9958591e481a5b9a5d1a585b1a5e9959606a1b6044820152606401610751565b600180546001600160a01b039384166001600160a01b0319909116179055600280546001600160a81b0319169190921617600160a01b179055565b60015460405163e0b490f760e01b81526001600160a01b0383811660048301526060925f926003928492169063e0b490f790602401602060405180830381865afa158015611166573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061118a9190613e27565b81526020019081526020015f206002018054806020026020016040519081016040528092919081815260200182805480156111e257602002820191905f5260205f20905b8154815260200190600101908083116111ce575b5050505050905080516001600160401b0381111561120257611202613bae565b60405190808252806020026020018201604052801561123b57816020015b6112286136ff565b8152602001906001900390816112205790505b5091505f5b81518110156114c2575f82828151811061125c5761125c613e97565b6020908102919091018101515f8181526004835260408082208151610140810190925280546001600160a01b0316825260018101805494965092949193909291840191906112a990613eab565b80601f01602080910402602001604051908101604052809291908181526020018280546112d590613eab565b80156113205780601f106112f757610100808354040283529160200191611320565b820191905f5260205f20905b81548152906001019060200180831161130357829003601f168201915b50505050508152602001600282015f9054906101000a90046001600160a01b03166001600160a01b03166001600160a01b03168152602001600382015481526020016004820154815260200160058201548152602001600682015481526020016007820154815260200160088201548152602001600982018054806020026020016040519081016040528092919081815260200182805480156113e057602002820191905f5260205f20905b8154815260200190600101908083116113cc575b50505050508152505090505f6113f583612a6e565b604080516080810182528681526001548651925163e0b490f760e01b81526001600160a01b039384166004820152939550909350602084019291169063e0b490f790602401602060405180830381865afa158015611455573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114799190613e27565b8152602001838152602001828460c001516114949190613e71565b8152508685815181106114a9576114a9613e97565b6020026020010181905250505050806001019050611240565b5050919050565b600154604051631f5bdf5d60e01b81523360048201526001600160a01b0390911690631f5bdf5d90602401602060405180830381865afa15801561150f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115339190613e3e565b61157f5760405162461bcd60e51b815260206004820152601e60248201527f43616c6c6572206d7573742062652072656769737465726564207573657200006044820152606401610751565b60015460405163e0b490f760e01b81523360048201525f916001600160a01b03169063e0b490f790602401602060405180830381865afa1580156115c5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115e99190613e27565b90505f60035f8381526020019081526020015f209050818989604051602001611613929190613edd565b60405160208183030381529060405280519060200120146116765760405162461bcd60e51b815260206004820152601960248201527f5265766f6c757420746167206d757374206d61746368206964000000000000006044820152606401610751565b60028101546005116116ca5760405162461bcd60e51b815260206004820152601e60248201527f4d6178696d756d206465706f73697420616d6f756e74207265616368656400006044820152606401610751565b60065486101561173b5760405162461bcd60e51b815260206004820152603660248201527f4465706f73697420616d6f756e74206d757374206265206772656174657220746044820152751a185b881b5a5b8819195c1bdcda5d08185b5bdd5b9d60521b6064820152608401610751565b5f85116117985760405162461bcd60e51b815260206004820152602560248201527f5265636569766520616d6f756e74206d75737420626520677265617465722074604482015264068616e20360dc1b6064820152608401610751565b5f856117ac670de0b6b3a764000089613f0b565b6117b69190613f36565b600c80549192505f9190826117ca83613f49565b909155506002840180546001810182555f9182526020918290200182905560408051610140810182523381528151601f8f018490048402810184019092528d8252929350828201918e908e90819084018382808284375f9201829052509385525050506001600160a01b03891660208084019190915260408084018a9052606084018d9052608084018e905260a084018d905260c0840183905260e084018790528051838152918201905261010090920191905090525f828152600460209081526040909120825181546001600160a01b0319166001600160a01b039091161781559082015160018201906118bf9082613fa5565b5060408201516002820180546001600160a01b0319166001600160a01b03909216919091179055606082015160038201556080820151600482015560a0820151600582015560c0820151600682015560e082015160078201556101008201516008820155610120820151805161193f916009840191602090910190613729565b50506040516323b872dd60e01b8152336004820152306024820152604481018a90527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031691506323b872dd906064016020604051808303815f875af11580156119b2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119d69190613e3e565b508884827f94c4b6f8843ea372709c89bc4a9ed85ef74ab10a68713ffdddc31716a76a6c958b86604051611a14929190918252602082015260400190565b60405180910390a45050505050505050505050565b611a316129ab565b66b1a2bc2ec50000811115611a935760405162461bcd60e51b815260206004820152602260248201527f4665652063616e6e6f742062652067726561746572207468616e206d61782066604482015261656560f01b6064820152608401610751565b600a8190556040518181527f44f48e1b871e6db1e909a7b253b054b7150a0b4ddf4d59b159c827d82e7256709060200161066a565b5f818152600560209081526040808320815160a08101835281546001600160a01b03908116825260018301548116828601526002830154828501819052600384015460608401526004938401546080840152865291909352922081519192909116611b6d5760405162461bcd60e51b8152602060048201526015602482015274125b9d195b9d08191bd95cc81b9bdd08195e1a5cdd605a1b6044820152606401610751565b80546001600160a01b03163314611bc65760405162461bcd60e51b815260206004820152601c60248201527f43616c6c6572206d75737420626520746865206465706f7369746f72000000006044820152606401610751565b611bd08184612fc7565b8160600151816007015f828254611be79190613e84565b9091555050600154825160405163e0b490f760e01b81526001600160a01b03918216600482015242926003925f9291169063e0b490f790602401602060405180830381865afa158015611c3c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c609190613e27565b81526020019081526020015f2060010181905550611c8282604001518261310b565b611c8c8383613280565b505050565b5f805b8251811015611de6575f838281518110611cb057611cb0613e97565b6020908102919091018101515f818152600490925260409091208054919250906001600160a01b03163314611d275760405162461bcd60e51b815260206004820152601c60248201527f53656e646572206d75737420626520746865206465706f7369746f72000000006044820152606401610751565b5f80611d3284612a6e565b91509150611d408383612c06565b808360060154611d509190613e71565b611d5a9087613e71565b955080836007015f828254611d6f9190613e84565b9091555050825460068401546001600160a01b039091169085907fae1f357660ab777dcfd38c0ab6357834684ec26289ecfa07ec65dbf6c3c6431290611db6908590613e71565b60405190815260200160405180910390a35f6006840155611dd7848461310b565b50505050806001019050611c94565b5060405163a9059cbb60e01b8152336004820152602481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063a9059cbb906044016020604051808303815f875af1158015611e51573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c8c9190613e3e565b611e7d6129ab565b611e865f613455565b565b606081516001600160401b03811115611ea357611ea3613bae565b604051908082528060200260200182016040528015611edc57816020015b611ec96136ff565b815260200190600190039081611ec15790505b5090505f5b8251811015612163575f838281518110611efd57611efd613e97565b6020908102919091018101515f8181526004835260408082208151610140810190925280546001600160a01b031682526001810180549496509294919390929184019190611f4a90613eab565b80601f0160208091040260200160405190810160405280929190818152602001828054611f7690613eab565b8015611fc15780601f10611f9857610100808354040283529160200191611fc1565b820191905f5260205f20905b815481529060010190602001808311611fa457829003601f168201915b50505050508152602001600282015f9054906101000a90046001600160a01b03166001600160a01b03166001600160a01b031681526020016003820154815260200160048201548152602001600582015481526020016006820154815260200160078201548152602001600882015481526020016009820180548060200260200160405190810160405280929190818152602001828054801561208157602002820191905f5260205f20905b81548152602001906001019080831161206d575b50505050508152505090505f61209683612a6e565b604080516080810182528681526001548651925163e0b490f760e01b81526001600160a01b039384166004820152939550909350602084019291169063e0b490f790602401602060405180830381865afa1580156120f6573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061211a9190613e27565b8152602001838152602001828460c001516121359190613e71565b81525085858151811061214a5761214a613e97565b6020026020010181905250505050806001019050611ee1565b50919050565b6121716129ab565b805f036121ca5760405162461bcd60e51b815260206004820152602160248201527f4d6178206f6e2072616d7020616d6f756e742063616e6e6f74206265207a65726044820152606f60f81b6064820152608401610751565b60078190556040518181527fcab6b49ca21dd111cf4a55d507bbe89dd12d69216e28247060d4b2163ca41b399060200161066a565b612207613772565b5f828152600460209081526040918290208251610140810190935280546001600160a01b03168352600181018054919284019161224390613eab565b80601f016020809104026020016040519081016040528092919081815260200182805461226f90613eab565b80156122ba5780601f10612291576101008083540402835291602001916122ba565b820191905f5260205f20905b81548152906001019060200180831161229d57829003601f168201915b50505050508152602001600282015f9054906101000a90046001600160a01b03166001600160a01b03166001600160a01b031681526020016003820154815260200160048201548152602001600582015481526020016006820154815260200160078201548152602001600882015481526020016009820180548060200260200160405190810160405280929190818152602001828054801561237a57602002820191905f5260205f20905b815481526020019060010190808311612366575b5050505050815250509050919050565b60046020525f9081526040902080546001820180546001600160a01b0390921692916123b590613eab565b80601f01602080910402602001604051908101604052809291908181526020018280546123e190613eab565b801561242c5780601f106124035761010080835404028352916020019161242c565b820191905f5260205f20905b81548152906001019060200180831161240f57829003601f168201915b5050505060028301546003840154600485015460058601546006870154600788015460089098015496976001600160a01b03909516969395509193909289565b5f61247682610675565b92915050565b6124846129ab565b6001600160a01b0381166124e65760405162461bcd60e51b8152602060048201526024808201527f46656520726563697069656e742063616e6e6f74206265207a65726f206164646044820152637265737360e01b6064820152608401610751565b600b80546001600160a01b0319166001600160a01b0383169081179091556040519081527f594ad6ee98bfc0c73e6d15fd4e762502f359e05d26907b7fa1ff82eb5e99f6e49060200161066a565b5f818152600560209081526040808320815160a08101835281546001600160a01b039081168252600183015416938101939093526002810154918301919091526003810154606083015260040154608082018190529091036125d05760405162461bcd60e51b8152602060048201526015602482015274125b9d195b9d08191bd95cc81b9bdd08195e1a5cdd605a1b6044820152606401610751565b60015460405163e0b490f760e01b81523360048201526001600160a01b039091169063e0b490f790602401602060405180830381865afa158015612616573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061263a9190613e27565b600154825160405163e0b490f760e01b81526001600160a01b03918216600482015291169063e0b490f790602401602060405180830381865afa158015612683573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126a79190613e27565b146126f45760405162461bcd60e51b815260206004820152601c60248201527f53656e646572206d75737420626520746865206f6e2d72616d706572000000006044820152606401610751565b6040808201515f90815260046020522061270e8184612fc7565b8160600151816006015f8282546127259190613e71565b909155505060608201516007820180545f90612742908490613e84565b9091555050505050565b60605f826001600160401b0381111561276757612767613bae565b6040519080825280602002602001820160405280156127df57816020015b6127cc60408051606080820183525f808352835160a08101855281815260208181018390529481018290529182018190526080820152909182019081525f60209091015290565b8152602001906001900390816127855790505b5090505f5b8381101561292a575f8585838181106127ff576127ff613e97565b602090810292909201355f81815260058452604090819020815160a08101835281546001600160a01b0390811682526001830154169581019590955260028101548583015260038101546060808701919091526004909101546080860152815190810190915290935090508088888681811061287d5761287d613e97565b60209081029290920135835250810183905260015483516040805163e0b490f760e01b81526001600160a01b03928316600482015293019291169063e0b490f790602401602060405180830381865afa1580156128dc573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906129009190613e27565b81525084848151811061291557612915613e97565b602090810291909101015250506001016127e4565b509392505050565b61293a6129ab565b6001600160a01b03811661299f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610751565b6129a881613455565b50565b5f546001600160a01b03163314611e865760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610751565b60408051602081018490529081018290524260608201525f90819060800160408051601f1981840301815291905280516020909101209050612a667f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000182614060565b949350505050565b5f8181526004602090815260408083206009018054825181850281018501909352808352606094938493929190830182828015612ac857602002820191905f5260205f20905b815481526020019060010190808311612ab4575b5050505050905080516001600160401b03811115612ae857612ae8613bae565b604051908082528060200260200182016040528015612b11578160200160208202803683370190505b5092505f5b8151811015612bff575f60055f848481518110612b3557612b35613e97565b60209081029190910181015182528181019290925260409081015f20815160a08101835281546001600160a01b039081168252600183015416938101939093526002810154918301919091526003810154606083015260040154608082018190526009549192504291612ba791613e71565b1015612bf657828281518110612bbf57612bbf613e97565b6020026020010151858381518110612bd957612bd9613e97565b60209081029190910101526060810151612bf39085613e71565b93505b50600101612b16565b5050915091565b5f5b8151811015611c8c575f801b828281518110612c2657612c26613e97565b602002602001015114612c5657612c5683838381518110612c4957612c49613e97565b6020026020010151612fc7565b600101612c08565b6101008301355f81815260056020526040812080549092906001600160a01b03163314612ccd5760405162461bcd60e51b815260206004820152601c60248201527f43616c6c6572206d75737420626520746865206f6e2d72616d706572000000006044820152606401610751565b6002808401545f9081526004602052604080822092548151808301909252929450909182918291829182916001600160a01b031690630f2d076d9080612d128f6140de565b81526020018d8d8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505091525060028a01546040516001600160e01b031960e085901b168152612d7e92916001600160a01b031690600401614236565b60a0604051808303815f875af1158015612d9a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612dbe9190614379565b9450945094509450945086600301548114612e2a5760405162461bcd60e51b815260206004820152602660248201527f496e636f7272656374206e6f74617279207573656420666f72206e6f746172696044820152653d30ba34b7b760d11b6064820152608401610751565b86600501548214612e735760405162461bcd60e51b815260206004820152601360248201527215dc9bdb99c818dd5c9c995b98de481cd95b9d606a1b6044820152606401610751565b8388600401541115612ed25760405162461bcd60e51b815260206004820152602260248201527f496e74656e7420776173206e6f742063726561746564206265666f72652073656044820152611b9960f21b6064820152608401610751565b8287600101604051602001612ee791906143b5565b6040516020818303038152906040528051906020012014612f4a5760405162461bcd60e51b815260206004820152601b60248201527f4f666672616d70657220696420646f6573206e6f74206d6174636800000000006044820152606401610751565b8660080154670de0b6b3a76400008960030154612f679190613f0b565b612f719190613f36565b851015612fb95760405162461bcd60e51b81526020600482015260166024820152750a0c2f2dacadce840eec2e640dcdee840cadcdeeaced60531b6044820152606401610751565b505050505093509350939050565b5f818152600560209081526040808320815160a08101835281546001600160a01b03908116808352600180850154831696840196909652600284015483860152600380850154606085015260049485015460808501529554945163e0b490f760e01b815293840152909492169063e0b490f790602401602060405180830381865afa158015613058573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061307c9190613e27565b815260208082019290925260409081015f9081208190558481526005909252812080546001600160a01b0319908116825560018201805490911690556002810182905560038101829055600401556130d760098401836134a4565b604080820151905183907fe8a865b4bab023c399cbd1f2cdd0df2199beb6e5012a4bd2d7691cf7e4199d5a905f90a3505050565b5f816006015482600701546131209190613e71565b9050805f03611c8c57600154825460405163e0b490f760e01b81526001600160a01b0391821660048201526131c19286926003925f92919091169063e0b490f790602401602060405180830381865afa15801561317f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906131a39190613e27565b81526020019081526020015f206002016135c290919063ffffffff16565b8154604080518581526001600160a01b0390921660208301527f8ac07cc6e38c6222dd0309c80353c1962354bacf222b825d7401cc80e93ff3cc910160405180910390a15f83815260046020526040812080546001600160a01b03191681559061322e60018301826137c4565b6002820180546001600160a01b03191690555f6003830181905560048301819055600583018190556006830181905560078301819055600883018190556132799060098401906137fb565b5050505050565b5f600a545f1461334757670de0b6b3a7640000600a5483606001516132a59190613f0b565b6132af9190613f36565b600b5460405163a9059cbb60e01b81526001600160a01b039182166004820152602481018390529192507f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906044016020604051808303815f875af1158015613321573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906133459190613e3e565b505b5f8183606001516133589190613e84565b602084015160405163a9059cbb60e01b81526001600160a01b039182166004820152602481018390529192507f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906044016020604051808303815f875af11580156133cc573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906133f09190613e3e565b50825160408085015160208087015183516001600160a01b03918216815291820186905292810186905291909216919086907ffa03438194e61c243c6bb5349f1e1dc674431b86f119b5e3b2b327bc43446bce9060600160405180910390a450505050565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f806134fd848054806020026020016040519081016040528092919081815260200182805480156134f257602002820191905f5260205f20905b8154815260200190600101908083116134de575b505050505084613664565b91509150806135465760405162461bcd60e51b8152602060048201526015602482015274313cba32b99999103737ba1034b71030b93930bc9760591b6044820152606401610751565b83545f9061355690600190613e84565b90508083146135985784818154811061357157613571613e97565b905f5260205f20015485848154811061358c5761358c613e97565b5f918252602090912001555b848054806135a8576135a8614427565b600190038181905f5260205f20015f905590555050505050565b5f8061361b8480548060200260200160405190810160405280929190818152602001828054801561361057602002820191905f5260205f20905b8154815260200190600101908083116135fc575b5050505050846136ba565b91509150806135465760405162461bcd60e51b81526020600482015260156024820152743ab4b73a191a9b103737ba1034b71030b93930bc9760591b6044820152606401610751565b81515f908190815b818110156136a9578486828151811061368757613687613e97565b6020026020010151036136a1579250600191506136b39050565b60010161366c565b505f195f92509250505b9250929050565b81515f908190815b818110156136a957848682815181106136dd576136dd613e97565b6020026020010151036136f7579250600191506136b39050565b6001016136c2565b604080516080810182525f808252602082015290810161371d613772565b81526020015f81525090565b828054828255905f5260205f20908101928215613762579160200282015b82811115613762578251825591602001919060010190613747565b5061376e929150613812565b5090565b60408051610140810182525f8082526060602083018190529282018190528282018190526080820181905260a0820181905260c0820181905260e0820181905261010082015261012081019190915290565b5080546137d090613eab565b5f825580601f106137df575050565b601f0160209004905f5260205f20908101906129a89190613812565b5080545f8255905f5260205f20908101906129a891905b5b8082111561376e575f8155600101613813565b6001600160a01b03811681146129a8575f80fd5b5f6020828403121561384a575f80fd5b813561385581613826565b9392505050565b5f6020828403121561386c575f80fd5b5035919050565b5f805f60608486031215613885575f80fd5b8335925060208401359150604084013561389e81613826565b809150509250925092565b5f8083601f8401126138b9575f80fd5b5081356001600160401b038111156138cf575f80fd5b6020830191508360208285010111156136b3575f80fd5b5f805f604084860312156138f8575f80fd5b83356001600160401b038082111561390e575f80fd5b908501906101408288031215613922575f80fd5b90935060208501359080821115613937575f80fd5b50613944868287016138a9565b9497909650939450505050565b5f8060408385031215613962575f80fd5b823561396d81613826565b9150602083013561397d81613826565b809150509250929050565b5f81518084525f5b818110156139ac57602081850181015186830182015201613990565b505f602082860101526020601f19601f83011685010191505092915050565b5f815180845260208085019450602084015f5b838110156139fa578151875295820195908201906001016139de565b509495945050505050565b80516001600160a01b031682525f6101406020830151816020860152613a2d82860182613988565b9150506040830151613a4a60408601826001600160a01b03169052565b50606083015160608501526080830151608085015260a083015160a085015260c083015160c085015260e083015160e08501526101008084015181860152506101208084015185830382870152613aa183826139cb565b9695505050505050565b5f60208083018184528085518083526040925060408601915060408160051b8701018488015f5b83811015613b2957603f1989840301855281516080815185528882015189860152878201518189870152613b0882870182613a05565b60609384015196909301959095525094870194925090860190600101613ad2565b509098975050505050505050565b5f805f805f805f60c0888a031215613b4d575f80fd5b87356001600160401b03811115613b62575f80fd5b613b6e8a828b016138a9565b9098509650506020880135945060408801359350606088013592506080880135613b9781613826565b8092505060a0880135905092959891949750929550565b634e487b7160e01b5f52604160045260245ffd5b60405161014081016001600160401b0381118282101715613be557613be5613bae565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613c1357613c13613bae565b604052919050565b5f6020808385031215613c2c575f80fd5b82356001600160401b0380821115613c42575f80fd5b818501915085601f830112613c55575f80fd5b813581811115613c6757613c67613bae565b8060051b9150613c78848301613beb565b8181529183018401918481019088841115613c91575f80fd5b938501935b83851015613caf57843582529385019390850190613c96565b98975050505050505050565b602081525f6138556020830184613a05565b6001600160a01b038a81168252610120602083018190525f91613cf28483018d613988565b9a16604084015250506060810196909652608086019490945260a085019290925260c084015260e08301526101009091015292915050565b5f8060208385031215613d3b575f80fd5b82356001600160401b0380821115613d51575f80fd5b818501915085601f830112613d64575f80fd5b813581811115613d72575f80fd5b8660208260051b8501011115613d86575f80fd5b60209290920196919550909350505050565b602080825282518282018190525f919060409081850190868401855b82811015613e1a578151805185528681015180516001600160a01b039081168988015281890151168787015286810151606080880191909152810151608080880191909152015160a086015285015160c085015260e09093019290850190600101613db4565b5091979650505050505050565b5f60208284031215613e37575f80fd5b5051919050565b5f60208284031215613e4e575f80fd5b81518015158114613855575f80fd5b634e487b7160e01b5f52601160045260245ffd5b8082018082111561247657612476613e5d565b8181038181111561247657612476613e5d565b634e487b7160e01b5f52603260045260245ffd5b600181811c90821680613ebf57607f821691505b60208210810361216357634e487b7160e01b5f52602260045260245ffd5b60208152816020820152818360408301375f818301604090810191909152601f909201601f19160101919050565b808202811582820484141761247657612476613e5d565b634e487b7160e01b5f52601260045260245ffd5b5f82613f4457613f44613f22565b500490565b5f60018201613f5a57613f5a613e5d565b5060010190565b601f821115611c8c57805f5260205f20601f840160051c81016020851015613f865750805b601f840160051c820191505b81811015613279575f8155600101613f92565b81516001600160401b03811115613fbe57613fbe613bae565b613fd281613fcc8454613eab565b84613f61565b602080601f831160018114614005575f8415613fee5750858301515b5f19600386901b1c1916600185901b178555610fdb565b5f85815260208120601f198616915b8281101561403357888601518255948401946001909101908401614014565b508582101561405057878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f8261406e5761406e613f22565b500690565b5f82601f830112614082575f80fd5b81356001600160401b0381111561409b5761409b613bae565b6140ae601f8201601f1916602001613beb565b8181528460208386010111156140c2575f80fd5b816020850160208301375f918101602001919091529392505050565b5f61014082360312156140ef575f80fd5b6140f7613bc2565b82356001600160401b038082111561410d575f80fd5b61411936838701614073565b8352602085013591508082111561412e575f80fd5b61413a36838701614073565b60208401526040850135915080821115614152575f80fd5b61415e36838701614073565b60408401526060850135915080821115614176575f80fd5b61418236838701614073565b6060840152608085013591508082111561419a575f80fd5b6141a636838701614073565b608084015260a08501359150808211156141be575f80fd5b6141ca36838701614073565b60a084015260c08501359150808211156141e2575f80fd5b6141ee36838701614073565b60c084015260e0850135915080821115614206575f80fd5b5061421336828601614073565b60e083015250610100838101359082015261012092830135928101929092525090565b604081525f8351604080840152805161014080608086015261425c6101c0860183613988565b91506020830151607f19808785030160a088015261427a8483613988565b935060408501519150808785030160c08801526142978483613988565b935060608501519150808785030160e08801526142b48483613988565b9350608085015191506101008188860301818901526142d38584613988565b945060a086015192506101208289870301818a01526142f28685613988565b955060c087015193508289870301858a015261430e8685613988565b955060e0870151945082898703016101608a015261432c8686613988565b918701516101808a0152909501516101a0880152505050506020850151838203603f19016060850152906143608183613988565b9250505061385560208301846001600160a01b03169052565b5f805f805f60a0868803121561438d575f80fd5b5050835160208501516040860151606087015160809097015192989197509594509092509050565b5f8083546143c281613eab565b600182811680156143da57600181146143ef5761441b565b60ff198416875282151583028701945061441b565b875f526020805f205f5b858110156144125781548a8201529084019082016143f9565b50505082870194505b50929695505050505050565b634e487b7160e01b5f52603160045260245ffdfea26469706673582212203b4618ffb55f9c3d047e17866b0c48ac613e07ed4eb162c19d74f773ce21207764736f6c63430008180033", + "deployedBytecode": "0x608060405234801561000f575f80fd5b506004361061021e575f3560e01c8063711347621161012a578063b3c0cfa4116100b4578063e279d96411610079578063e279d96414610535578063ecb3dc881461053e578063ecd618f014610547578063eea1d19714610567578063f2fde38b1461057a575f80fd5b8063b3c0cfa4146104d6578063b3fa4c01146104e9578063d089e11a146104fc578063d55f960d1461050f578063d9478d2014610522575f80fd5b80639021578a116100fa5780639021578a146103f75780639087beff146104725780639f9fb96814610485578063a1a954b7146104a5578063b02c43d0146104ae575f80fd5b806371134762146103b9578063715018a6146103cc57806371a28f69146103d45780638da5cb5b146103e7575f80fd5b80633e85fc25116101ab5780635081d9521161017b5780635081d952146103575780635d108a22146103775780635dd765151461038a578063645006ca1461039d57806366ec8419146103a6575f80fd5b80633e85fc25146103155780634298734914610328578063485cc9551461033b578063495223e71461034e575f80fd5b80632a80cda3116101f15780632a80cda314610279578063317dcc961461028c578063392e53cd1461029f5780633adba28a146102c35780633e413bee146102d6575f80fd5b80630f1ef98c14610222578063133de6cb1461024857806314ec32fa1461025d578063238c849414610270575b5f80fd5b61023561023036600461383a565b61058d565b6040519081526020015b60405180910390f35b61025b61025636600461383a565b610618565b005b61023561026b36600461383a565b610675565b610235600a5481565b61025b61028736600461385c565b6106fe565b61025b61029a36600461385c565b61078f565b6002546102b390600160a01b900460ff1681565b604051901515815260200161023f565b61025b6102d1366004613873565b6107cc565b6102fd7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161023f565b61025b6103233660046138e6565b610ebb565b61025b61033636600461385c565b610fe3565b61025b610349366004613951565b611083565b61023560085481565b61036a61036536600461383a565b611116565b60405161023f9190613aab565b61025b610385366004613b37565b6114c9565b61025b61039836600461385c565b611a29565b61023560065481565b61025b6103b436600461385c565b611ac8565b61025b6103c7366004613c1b565b611c91565b61025b611e75565b61036a6103e2366004613c1b565b611e88565b5f546001600160a01b03166102fd565b61043f61040536600461385c565b60056020525f9081526040902080546001820154600283015460038401546004909401546001600160a01b03938416949390921692909185565b604080516001600160a01b039687168152959094166020860152928401919091526060830152608082015260a00161023f565b61025b61048036600461385c565b612169565b61049861049336600461385c565b6121ff565b60405161023f9190613cbb565b61023560095481565b6104c16104bc36600461385c565b61238a565b60405161023f99989796959493929190613ccd565b6102356104e436600461383a565b61246c565b61025b6104f736600461383a565b61247c565b6001546102fd906001600160a01b031681565b61025b61051d36600461385c565b612534565b600b546102fd906001600160a01b031681565b61023560075481565b610235600c5481565b61055a610555366004613d2a565b61274c565b60405161023f9190613d98565b6002546102fd906001600160a01b031681565b61025b61058836600461383a565b612932565b60015460405163e0b490f760e01b81526001600160a01b0383811660048301525f9260039284929091169063e0b490f790602401602060405180830381865afa1580156105dc573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106009190613e27565b81526020019081526020015f20600101549050919050565b6106206129ab565b600280546001600160a01b0319166001600160a01b0383169081179091556040519081527f6e7665a41605edc0d70f4b991d652755f380754eb092d81ef9ab93664778d59e906020015b60405180910390a150565b60015460405163e0b490f760e01b81526001600160a01b0383811660048301525f9260039284929091169063e0b490f790602401602060405180830381865afa1580156106c4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106e89190613e27565b815260208101919091526040015f205492915050565b6107066129ab565b805f0361075a5760405162461bcd60e51b815260206004820152601e60248201527f4d696e696d756d206465706f7369742063616e6e6f74206265207a65726f000060448201526064015b60405180910390fd5b60068190556040518181527fbdde72a6d8d8b42770c9899945ccdce09d0c5c794d3326cdb2d2cca61b12a9fc9060200161066a565b6107976129ab565b60088190556040518181527f88397975d177ce5e18abf3a5fdb8de773e80673d85eeb54f48cfaf688b3d2c3e9060200161066a565b600154604051631f5bdf5d60e01b81523360048201526001600160a01b0390911690631f5bdf5d90602401602060405180830381865afa158015610812573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108369190613e3e565b6108825760405162461bcd60e51b815260206004820152601e60248201527f43616c6c6572206d7573742062652072656769737465726564207573657200006044820152606401610751565b60015460405163e0b490f760e01b81523360048201525f916001600160a01b03169063e0b490f790602401602060405180830381865afa1580156108c8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108ec9190613e27565b5f8581526004602081905260409182902060015481549351630359b09b60e31b81526001600160a01b039485169381019390935260248301859052939450929190911690631acd84d890604401602060405180830381865afa158015610954573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109789190613e3e565b6109c45760405162461bcd60e51b815260206004820181905260248201527f4f6e72616d706572206f6e206465706f7369746f7227732064656e796c6973746044820152606401610751565b6008545f8381526003602052604090206001015442916109e391613e71565b1115610a3d5760405162461bcd60e51b8152602060048201526024808201527f4f6e2072616d7020636f6f6c20646f776e20706572696f64206e6f7420656c616044820152631c1cd95960e21b6064820152608401610751565b5f8281526003602052604090205415610a985760405162461bcd60e51b815260206004820152601860248201527f496e74656e74207374696c6c206f75747374616e64696e6700000000000000006044820152606401610751565b600154815460405163e0b490f760e01b81526001600160a01b0391821660048201528492919091169063e0b490f790602401602060405180830381865afa158015610ae5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b099190613e27565b03610b565760405162461bcd60e51b815260206004820152601e60248201527f53656e6465722063616e6e6f7420626520746865206465706f7369746f7200006044820152606401610751565b80546001600160a01b0316610ba65760405162461bcd60e51b815260206004820152601660248201527511195c1bdcda5d08191bd95cc81b9bdd08195e1a5cdd60521b6044820152606401610751565b5f8411610c045760405162461bcd60e51b815260206004820152602660248201527f5369676e616c656420616d6f756e74206d75737420626520677265617465722060448201526507468616e20360d41b6064820152608401610751565b600754841115610c735760405162461bcd60e51b815260206004820152603460248201527f5369676e616c656420616d6f756e74206d757374206265206c657373207468616044820152731b881b585e081bdb8b5c985b5c08185b5bdd5b9d60621b6064820152608401610751565b6001600160a01b038316610cc95760405162461bcd60e51b815260206004820152601b60248201527f43616e6e6f742073656e6420746f207a65726f206164647265737300000000006044820152606401610751565b5f610cd48387612a04565b90508482600601541015610d86575f80610ced88612a6e565b9150915086818560060154610d029190613e71565b1015610d475760405162461bcd60e51b81526020600482015260146024820152734e6f7420656e6f756768206c697175696469747960601b6044820152606401610751565b610d518483612c06565b80846006015f828254610d649190613e71565b9250508190555080846007015f828254610d7e9190613e84565b909155505050505b6040805160a0810182523381526001600160a01b0386811660208084019182528385018b8152606085018b815242608087019081525f89815260058552888120975188549088166001600160a01b0319918216178955955160018901805491909816961695909517909555905160028601555160038086019190915592516004909401939093558681529152908120829055600683018054879290610e2c908490613e84565b9250508190555084826007015f828254610e469190613e71565b90915550506009820180546001810182555f91825260209182902001829055604080516001600160a01b038716815291820187905242908201528390879083907f1a1292e170a0f000ccf956afba79bee0f9ec1d81f3f901c1d4d11e1f336aae109060600160405180910390a4505050505050565b5f805f610ec9868686612c5e565b6040805160a08101825284546001600160a01b039081168252600186015416602082015260028501549181019190915260038401546060820152600490930154608084015291945092509050610f1f8282612fc7565b8260600151826007015f828254610f369190613e84565b9091555050600154835160405163e0b490f760e01b81526001600160a01b03918216600482015242926003925f9291169063e0b490f790602401602060405180830381865afa158015610f8b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610faf9190613e27565b81526020019081526020015f2060010181905550610fd183604001518361310b565b610fdb8184613280565b505050505050565b610feb6129ab565b805f0361104e5760405162461bcd60e51b815260206004820152602b60248201527f4d617820696e74656e742065787069726174696f6e20706572696f642063616e60448201526a6e6f74206265207a65726f60a81b6064820152608401610751565b60098190556040518181527f55e3f6b95de9a0ec782f892e93fafe4e56be0696df204ddf8e0a40a9a713a8039060200161066a565b61108b6129ab565b600254600160a01b900460ff16156110db5760405162461bcd60e51b8152602060048201526013602482015272105b1c9958591e481a5b9a5d1a585b1a5e9959606a1b6044820152606401610751565b600180546001600160a01b039384166001600160a01b0319909116179055600280546001600160a81b0319169190921617600160a01b179055565b60015460405163e0b490f760e01b81526001600160a01b0383811660048301526060925f926003928492169063e0b490f790602401602060405180830381865afa158015611166573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061118a9190613e27565b81526020019081526020015f206002018054806020026020016040519081016040528092919081815260200182805480156111e257602002820191905f5260205f20905b8154815260200190600101908083116111ce575b5050505050905080516001600160401b0381111561120257611202613bae565b60405190808252806020026020018201604052801561123b57816020015b6112286136ff565b8152602001906001900390816112205790505b5091505f5b81518110156114c2575f82828151811061125c5761125c613e97565b6020908102919091018101515f8181526004835260408082208151610140810190925280546001600160a01b0316825260018101805494965092949193909291840191906112a990613eab565b80601f01602080910402602001604051908101604052809291908181526020018280546112d590613eab565b80156113205780601f106112f757610100808354040283529160200191611320565b820191905f5260205f20905b81548152906001019060200180831161130357829003601f168201915b50505050508152602001600282015f9054906101000a90046001600160a01b03166001600160a01b03166001600160a01b03168152602001600382015481526020016004820154815260200160058201548152602001600682015481526020016007820154815260200160088201548152602001600982018054806020026020016040519081016040528092919081815260200182805480156113e057602002820191905f5260205f20905b8154815260200190600101908083116113cc575b50505050508152505090505f6113f583612a6e565b604080516080810182528681526001548651925163e0b490f760e01b81526001600160a01b039384166004820152939550909350602084019291169063e0b490f790602401602060405180830381865afa158015611455573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114799190613e27565b8152602001838152602001828460c001516114949190613e71565b8152508685815181106114a9576114a9613e97565b6020026020010181905250505050806001019050611240565b5050919050565b600154604051631f5bdf5d60e01b81523360048201526001600160a01b0390911690631f5bdf5d90602401602060405180830381865afa15801561150f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115339190613e3e565b61157f5760405162461bcd60e51b815260206004820152601e60248201527f43616c6c6572206d7573742062652072656769737465726564207573657200006044820152606401610751565b60015460405163e0b490f760e01b81523360048201525f916001600160a01b03169063e0b490f790602401602060405180830381865afa1580156115c5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115e99190613e27565b90505f60035f8381526020019081526020015f209050818989604051602001611613929190613edd565b60405160208183030381529060405280519060200120146116765760405162461bcd60e51b815260206004820152601960248201527f5265766f6c757420746167206d757374206d61746368206964000000000000006044820152606401610751565b60028101546005116116ca5760405162461bcd60e51b815260206004820152601e60248201527f4d6178696d756d206465706f73697420616d6f756e74207265616368656400006044820152606401610751565b60065486101561173b5760405162461bcd60e51b815260206004820152603660248201527f4465706f73697420616d6f756e74206d757374206265206772656174657220746044820152751a185b881b5a5b8819195c1bdcda5d08185b5bdd5b9d60521b6064820152608401610751565b5f85116117985760405162461bcd60e51b815260206004820152602560248201527f5265636569766520616d6f756e74206d75737420626520677265617465722074604482015264068616e20360dc1b6064820152608401610751565b5f856117ac670de0b6b3a764000089613f0b565b6117b69190613f36565b600c80549192505f9190826117ca83613f49565b909155506002840180546001810182555f9182526020918290200182905560408051610140810182523381528151601f8f018490048402810184019092528d8252929350828201918e908e90819084018382808284375f9201829052509385525050506001600160a01b03891660208084019190915260408084018a9052606084018d9052608084018e905260a084018d905260c0840183905260e084018790528051838152918201905261010090920191905090525f828152600460209081526040909120825181546001600160a01b0319166001600160a01b039091161781559082015160018201906118bf9082613fa5565b5060408201516002820180546001600160a01b0319166001600160a01b03909216919091179055606082015160038201556080820151600482015560a0820151600582015560c0820151600682015560e082015160078201556101008201516008820155610120820151805161193f916009840191602090910190613729565b50506040516323b872dd60e01b8152336004820152306024820152604481018a90527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031691506323b872dd906064016020604051808303815f875af11580156119b2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119d69190613e3e565b508884827f94c4b6f8843ea372709c89bc4a9ed85ef74ab10a68713ffdddc31716a76a6c958b86604051611a14929190918252602082015260400190565b60405180910390a45050505050505050505050565b611a316129ab565b66b1a2bc2ec50000811115611a935760405162461bcd60e51b815260206004820152602260248201527f4665652063616e6e6f742062652067726561746572207468616e206d61782066604482015261656560f01b6064820152608401610751565b600a8190556040518181527f44f48e1b871e6db1e909a7b253b054b7150a0b4ddf4d59b159c827d82e7256709060200161066a565b5f818152600560209081526040808320815160a08101835281546001600160a01b03908116825260018301548116828601526002830154828501819052600384015460608401526004938401546080840152865291909352922081519192909116611b6d5760405162461bcd60e51b8152602060048201526015602482015274125b9d195b9d08191bd95cc81b9bdd08195e1a5cdd605a1b6044820152606401610751565b80546001600160a01b03163314611bc65760405162461bcd60e51b815260206004820152601c60248201527f43616c6c6572206d75737420626520746865206465706f7369746f72000000006044820152606401610751565b611bd08184612fc7565b8160600151816007015f828254611be79190613e84565b9091555050600154825160405163e0b490f760e01b81526001600160a01b03918216600482015242926003925f9291169063e0b490f790602401602060405180830381865afa158015611c3c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c609190613e27565b81526020019081526020015f2060010181905550611c8282604001518261310b565b611c8c8383613280565b505050565b5f805b8251811015611de6575f838281518110611cb057611cb0613e97565b6020908102919091018101515f818152600490925260409091208054919250906001600160a01b03163314611d275760405162461bcd60e51b815260206004820152601c60248201527f53656e646572206d75737420626520746865206465706f7369746f72000000006044820152606401610751565b5f80611d3284612a6e565b91509150611d408383612c06565b808360060154611d509190613e71565b611d5a9087613e71565b955080836007015f828254611d6f9190613e84565b9091555050825460068401546001600160a01b039091169085907fae1f357660ab777dcfd38c0ab6357834684ec26289ecfa07ec65dbf6c3c6431290611db6908590613e71565b60405190815260200160405180910390a35f6006840155611dd7848461310b565b50505050806001019050611c94565b5060405163a9059cbb60e01b8152336004820152602481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063a9059cbb906044016020604051808303815f875af1158015611e51573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c8c9190613e3e565b611e7d6129ab565b611e865f613455565b565b606081516001600160401b03811115611ea357611ea3613bae565b604051908082528060200260200182016040528015611edc57816020015b611ec96136ff565b815260200190600190039081611ec15790505b5090505f5b8251811015612163575f838281518110611efd57611efd613e97565b6020908102919091018101515f8181526004835260408082208151610140810190925280546001600160a01b031682526001810180549496509294919390929184019190611f4a90613eab565b80601f0160208091040260200160405190810160405280929190818152602001828054611f7690613eab565b8015611fc15780601f10611f9857610100808354040283529160200191611fc1565b820191905f5260205f20905b815481529060010190602001808311611fa457829003601f168201915b50505050508152602001600282015f9054906101000a90046001600160a01b03166001600160a01b03166001600160a01b031681526020016003820154815260200160048201548152602001600582015481526020016006820154815260200160078201548152602001600882015481526020016009820180548060200260200160405190810160405280929190818152602001828054801561208157602002820191905f5260205f20905b81548152602001906001019080831161206d575b50505050508152505090505f61209683612a6e565b604080516080810182528681526001548651925163e0b490f760e01b81526001600160a01b039384166004820152939550909350602084019291169063e0b490f790602401602060405180830381865afa1580156120f6573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061211a9190613e27565b8152602001838152602001828460c001516121359190613e71565b81525085858151811061214a5761214a613e97565b6020026020010181905250505050806001019050611ee1565b50919050565b6121716129ab565b805f036121ca5760405162461bcd60e51b815260206004820152602160248201527f4d6178206f6e2072616d7020616d6f756e742063616e6e6f74206265207a65726044820152606f60f81b6064820152608401610751565b60078190556040518181527fcab6b49ca21dd111cf4a55d507bbe89dd12d69216e28247060d4b2163ca41b399060200161066a565b612207613772565b5f828152600460209081526040918290208251610140810190935280546001600160a01b03168352600181018054919284019161224390613eab565b80601f016020809104026020016040519081016040528092919081815260200182805461226f90613eab565b80156122ba5780601f10612291576101008083540402835291602001916122ba565b820191905f5260205f20905b81548152906001019060200180831161229d57829003601f168201915b50505050508152602001600282015f9054906101000a90046001600160a01b03166001600160a01b03166001600160a01b031681526020016003820154815260200160048201548152602001600582015481526020016006820154815260200160078201548152602001600882015481526020016009820180548060200260200160405190810160405280929190818152602001828054801561237a57602002820191905f5260205f20905b815481526020019060010190808311612366575b5050505050815250509050919050565b60046020525f9081526040902080546001820180546001600160a01b0390921692916123b590613eab565b80601f01602080910402602001604051908101604052809291908181526020018280546123e190613eab565b801561242c5780601f106124035761010080835404028352916020019161242c565b820191905f5260205f20905b81548152906001019060200180831161240f57829003601f168201915b5050505060028301546003840154600485015460058601546006870154600788015460089098015496976001600160a01b03909516969395509193909289565b5f61247682610675565b92915050565b6124846129ab565b6001600160a01b0381166124e65760405162461bcd60e51b8152602060048201526024808201527f46656520726563697069656e742063616e6e6f74206265207a65726f206164646044820152637265737360e01b6064820152608401610751565b600b80546001600160a01b0319166001600160a01b0383169081179091556040519081527f594ad6ee98bfc0c73e6d15fd4e762502f359e05d26907b7fa1ff82eb5e99f6e49060200161066a565b5f818152600560209081526040808320815160a08101835281546001600160a01b039081168252600183015416938101939093526002810154918301919091526003810154606083015260040154608082018190529091036125d05760405162461bcd60e51b8152602060048201526015602482015274125b9d195b9d08191bd95cc81b9bdd08195e1a5cdd605a1b6044820152606401610751565b60015460405163e0b490f760e01b81523360048201526001600160a01b039091169063e0b490f790602401602060405180830381865afa158015612616573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061263a9190613e27565b600154825160405163e0b490f760e01b81526001600160a01b03918216600482015291169063e0b490f790602401602060405180830381865afa158015612683573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126a79190613e27565b146126f45760405162461bcd60e51b815260206004820152601c60248201527f53656e646572206d75737420626520746865206f6e2d72616d706572000000006044820152606401610751565b6040808201515f90815260046020522061270e8184612fc7565b8160600151816006015f8282546127259190613e71565b909155505060608201516007820180545f90612742908490613e84565b9091555050505050565b60605f826001600160401b0381111561276757612767613bae565b6040519080825280602002602001820160405280156127df57816020015b6127cc60408051606080820183525f808352835160a08101855281815260208181018390529481018290529182018190526080820152909182019081525f60209091015290565b8152602001906001900390816127855790505b5090505f5b8381101561292a575f8585838181106127ff576127ff613e97565b602090810292909201355f81815260058452604090819020815160a08101835281546001600160a01b0390811682526001830154169581019590955260028101548583015260038101546060808701919091526004909101546080860152815190810190915290935090508088888681811061287d5761287d613e97565b60209081029290920135835250810183905260015483516040805163e0b490f760e01b81526001600160a01b03928316600482015293019291169063e0b490f790602401602060405180830381865afa1580156128dc573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906129009190613e27565b81525084848151811061291557612915613e97565b602090810291909101015250506001016127e4565b509392505050565b61293a6129ab565b6001600160a01b03811661299f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610751565b6129a881613455565b50565b5f546001600160a01b03163314611e865760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610751565b60408051602081018490529081018290524260608201525f90819060800160408051601f1981840301815291905280516020909101209050612a667f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000182614060565b949350505050565b5f8181526004602090815260408083206009018054825181850281018501909352808352606094938493929190830182828015612ac857602002820191905f5260205f20905b815481526020019060010190808311612ab4575b5050505050905080516001600160401b03811115612ae857612ae8613bae565b604051908082528060200260200182016040528015612b11578160200160208202803683370190505b5092505f5b8151811015612bff575f60055f848481518110612b3557612b35613e97565b60209081029190910181015182528181019290925260409081015f20815160a08101835281546001600160a01b039081168252600183015416938101939093526002810154918301919091526003810154606083015260040154608082018190526009549192504291612ba791613e71565b1015612bf657828281518110612bbf57612bbf613e97565b6020026020010151858381518110612bd957612bd9613e97565b60209081029190910101526060810151612bf39085613e71565b93505b50600101612b16565b5050915091565b5f5b8151811015611c8c575f801b828281518110612c2657612c26613e97565b602002602001015114612c5657612c5683838381518110612c4957612c49613e97565b6020026020010151612fc7565b600101612c08565b6101008301355f81815260056020526040812080549092906001600160a01b03163314612ccd5760405162461bcd60e51b815260206004820152601c60248201527f43616c6c6572206d75737420626520746865206f6e2d72616d706572000000006044820152606401610751565b6002808401545f9081526004602052604080822092548151808301909252929450909182918291829182916001600160a01b031690630f2d076d9080612d128f6140de565b81526020018d8d8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505091525060028a01546040516001600160e01b031960e085901b168152612d7e92916001600160a01b031690600401614236565b60a0604051808303815f875af1158015612d9a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612dbe9190614379565b9450945094509450945086600301548114612e2a5760405162461bcd60e51b815260206004820152602660248201527f496e636f7272656374206e6f74617279207573656420666f72206e6f746172696044820152653d30ba34b7b760d11b6064820152608401610751565b86600501548214612e735760405162461bcd60e51b815260206004820152601360248201527215dc9bdb99c818dd5c9c995b98de481cd95b9d606a1b6044820152606401610751565b8388600401541115612ed25760405162461bcd60e51b815260206004820152602260248201527f496e74656e7420776173206e6f742063726561746564206265666f72652073656044820152611b9960f21b6064820152608401610751565b8287600101604051602001612ee791906143b5565b6040516020818303038152906040528051906020012014612f4a5760405162461bcd60e51b815260206004820152601b60248201527f4f666672616d70657220696420646f6573206e6f74206d6174636800000000006044820152606401610751565b8660080154670de0b6b3a76400008960030154612f679190613f0b565b612f719190613f36565b851015612fb95760405162461bcd60e51b81526020600482015260166024820152750a0c2f2dacadce840eec2e640dcdee840cadcdeeaced60531b6044820152606401610751565b505050505093509350939050565b5f818152600560209081526040808320815160a08101835281546001600160a01b03908116808352600180850154831696840196909652600284015483860152600380850154606085015260049485015460808501529554945163e0b490f760e01b815293840152909492169063e0b490f790602401602060405180830381865afa158015613058573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061307c9190613e27565b815260208082019290925260409081015f9081208190558481526005909252812080546001600160a01b0319908116825560018201805490911690556002810182905560038101829055600401556130d760098401836134a4565b604080820151905183907fe8a865b4bab023c399cbd1f2cdd0df2199beb6e5012a4bd2d7691cf7e4199d5a905f90a3505050565b5f816006015482600701546131209190613e71565b9050805f03611c8c57600154825460405163e0b490f760e01b81526001600160a01b0391821660048201526131c19286926003925f92919091169063e0b490f790602401602060405180830381865afa15801561317f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906131a39190613e27565b81526020019081526020015f206002016135c290919063ffffffff16565b8154604080518581526001600160a01b0390921660208301527f8ac07cc6e38c6222dd0309c80353c1962354bacf222b825d7401cc80e93ff3cc910160405180910390a15f83815260046020526040812080546001600160a01b03191681559061322e60018301826137c4565b6002820180546001600160a01b03191690555f6003830181905560048301819055600583018190556006830181905560078301819055600883018190556132799060098401906137fb565b5050505050565b5f600a545f1461334757670de0b6b3a7640000600a5483606001516132a59190613f0b565b6132af9190613f36565b600b5460405163a9059cbb60e01b81526001600160a01b039182166004820152602481018390529192507f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906044016020604051808303815f875af1158015613321573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906133459190613e3e565b505b5f8183606001516133589190613e84565b602084015160405163a9059cbb60e01b81526001600160a01b039182166004820152602481018390529192507f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906044016020604051808303815f875af11580156133cc573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906133f09190613e3e565b50825160408085015160208087015183516001600160a01b03918216815291820186905292810186905291909216919086907ffa03438194e61c243c6bb5349f1e1dc674431b86f119b5e3b2b327bc43446bce9060600160405180910390a450505050565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f806134fd848054806020026020016040519081016040528092919081815260200182805480156134f257602002820191905f5260205f20905b8154815260200190600101908083116134de575b505050505084613664565b91509150806135465760405162461bcd60e51b8152602060048201526015602482015274313cba32b99999103737ba1034b71030b93930bc9760591b6044820152606401610751565b83545f9061355690600190613e84565b90508083146135985784818154811061357157613571613e97565b905f5260205f20015485848154811061358c5761358c613e97565b5f918252602090912001555b848054806135a8576135a8614427565b600190038181905f5260205f20015f905590555050505050565b5f8061361b8480548060200260200160405190810160405280929190818152602001828054801561361057602002820191905f5260205f20905b8154815260200190600101908083116135fc575b5050505050846136ba565b91509150806135465760405162461bcd60e51b81526020600482015260156024820152743ab4b73a191a9b103737ba1034b71030b93930bc9760591b6044820152606401610751565b81515f908190815b818110156136a9578486828151811061368757613687613e97565b6020026020010151036136a1579250600191506136b39050565b60010161366c565b505f195f92509250505b9250929050565b81515f908190815b818110156136a957848682815181106136dd576136dd613e97565b6020026020010151036136f7579250600191506136b39050565b6001016136c2565b604080516080810182525f808252602082015290810161371d613772565b81526020015f81525090565b828054828255905f5260205f20908101928215613762579160200282015b82811115613762578251825591602001919060010190613747565b5061376e929150613812565b5090565b60408051610140810182525f8082526060602083018190529282018190528282018190526080820181905260a0820181905260c0820181905260e0820181905261010082015261012081019190915290565b5080546137d090613eab565b5f825580601f106137df575050565b601f0160209004905f5260205f20908101906129a89190613812565b5080545f8255905f5260205f20908101906129a891905b5b8082111561376e575f8155600101613813565b6001600160a01b03811681146129a8575f80fd5b5f6020828403121561384a575f80fd5b813561385581613826565b9392505050565b5f6020828403121561386c575f80fd5b5035919050565b5f805f60608486031215613885575f80fd5b8335925060208401359150604084013561389e81613826565b809150509250925092565b5f8083601f8401126138b9575f80fd5b5081356001600160401b038111156138cf575f80fd5b6020830191508360208285010111156136b3575f80fd5b5f805f604084860312156138f8575f80fd5b83356001600160401b038082111561390e575f80fd5b908501906101408288031215613922575f80fd5b90935060208501359080821115613937575f80fd5b50613944868287016138a9565b9497909650939450505050565b5f8060408385031215613962575f80fd5b823561396d81613826565b9150602083013561397d81613826565b809150509250929050565b5f81518084525f5b818110156139ac57602081850181015186830182015201613990565b505f602082860101526020601f19601f83011685010191505092915050565b5f815180845260208085019450602084015f5b838110156139fa578151875295820195908201906001016139de565b509495945050505050565b80516001600160a01b031682525f6101406020830151816020860152613a2d82860182613988565b9150506040830151613a4a60408601826001600160a01b03169052565b50606083015160608501526080830151608085015260a083015160a085015260c083015160c085015260e083015160e08501526101008084015181860152506101208084015185830382870152613aa183826139cb565b9695505050505050565b5f60208083018184528085518083526040925060408601915060408160051b8701018488015f5b83811015613b2957603f1989840301855281516080815185528882015189860152878201518189870152613b0882870182613a05565b60609384015196909301959095525094870194925090860190600101613ad2565b509098975050505050505050565b5f805f805f805f60c0888a031215613b4d575f80fd5b87356001600160401b03811115613b62575f80fd5b613b6e8a828b016138a9565b9098509650506020880135945060408801359350606088013592506080880135613b9781613826565b8092505060a0880135905092959891949750929550565b634e487b7160e01b5f52604160045260245ffd5b60405161014081016001600160401b0381118282101715613be557613be5613bae565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613c1357613c13613bae565b604052919050565b5f6020808385031215613c2c575f80fd5b82356001600160401b0380821115613c42575f80fd5b818501915085601f830112613c55575f80fd5b813581811115613c6757613c67613bae565b8060051b9150613c78848301613beb565b8181529183018401918481019088841115613c91575f80fd5b938501935b83851015613caf57843582529385019390850190613c96565b98975050505050505050565b602081525f6138556020830184613a05565b6001600160a01b038a81168252610120602083018190525f91613cf28483018d613988565b9a16604084015250506060810196909652608086019490945260a085019290925260c084015260e08301526101009091015292915050565b5f8060208385031215613d3b575f80fd5b82356001600160401b0380821115613d51575f80fd5b818501915085601f830112613d64575f80fd5b813581811115613d72575f80fd5b8660208260051b8501011115613d86575f80fd5b60209290920196919550909350505050565b602080825282518282018190525f919060409081850190868401855b82811015613e1a578151805185528681015180516001600160a01b039081168988015281890151168787015286810151606080880191909152810151608080880191909152015160a086015285015160c085015260e09093019290850190600101613db4565b5091979650505050505050565b5f60208284031215613e37575f80fd5b5051919050565b5f60208284031215613e4e575f80fd5b81518015158114613855575f80fd5b634e487b7160e01b5f52601160045260245ffd5b8082018082111561247657612476613e5d565b8181038181111561247657612476613e5d565b634e487b7160e01b5f52603260045260245ffd5b600181811c90821680613ebf57607f821691505b60208210810361216357634e487b7160e01b5f52602260045260245ffd5b60208152816020820152818360408301375f818301604090810191909152601f909201601f19160101919050565b808202811582820484141761247657612476613e5d565b634e487b7160e01b5f52601260045260245ffd5b5f82613f4457613f44613f22565b500490565b5f60018201613f5a57613f5a613e5d565b5060010190565b601f821115611c8c57805f5260205f20601f840160051c81016020851015613f865750805b601f840160051c820191505b81811015613279575f8155600101613f92565b81516001600160401b03811115613fbe57613fbe613bae565b613fd281613fcc8454613eab565b84613f61565b602080601f831160018114614005575f8415613fee5750858301515b5f19600386901b1c1916600185901b178555610fdb565b5f85815260208120601f198616915b8281101561403357888601518255948401946001909101908401614014565b508582101561405057878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f8261406e5761406e613f22565b500690565b5f82601f830112614082575f80fd5b81356001600160401b0381111561409b5761409b613bae565b6140ae601f8201601f1916602001613beb565b8181528460208386010111156140c2575f80fd5b816020850160208301375f918101602001919091529392505050565b5f61014082360312156140ef575f80fd5b6140f7613bc2565b82356001600160401b038082111561410d575f80fd5b61411936838701614073565b8352602085013591508082111561412e575f80fd5b61413a36838701614073565b60208401526040850135915080821115614152575f80fd5b61415e36838701614073565b60408401526060850135915080821115614176575f80fd5b61418236838701614073565b6060840152608085013591508082111561419a575f80fd5b6141a636838701614073565b608084015260a08501359150808211156141be575f80fd5b6141ca36838701614073565b60a084015260c08501359150808211156141e2575f80fd5b6141ee36838701614073565b60c084015260e0850135915080821115614206575f80fd5b5061421336828601614073565b60e083015250610100838101359082015261012092830135928101929092525090565b604081525f8351604080840152805161014080608086015261425c6101c0860183613988565b91506020830151607f19808785030160a088015261427a8483613988565b935060408501519150808785030160c08801526142978483613988565b935060608501519150808785030160e08801526142b48483613988565b9350608085015191506101008188860301818901526142d38584613988565b945060a086015192506101208289870301818a01526142f28685613988565b955060c087015193508289870301858a015261430e8685613988565b955060e0870151945082898703016101608a015261432c8686613988565b918701516101808a0152909501516101a0880152505050506020850151838203603f19016060850152906143608183613988565b9250505061385560208301846001600160a01b03169052565b5f805f805f60a0868803121561438d575f80fd5b5050835160208501516040860151606087015160809097015192989197509594509092509050565b5f8083546143c281613eab565b600182811680156143da57600181146143ef5761441b565b60ff198416875282151583028701945061441b565b875f526020805f205f5b858110156144125781548a8201529084019082016143f9565b50505082870194505b50929695505050505050565b634e487b7160e01b5f52603160045260245ffdfea26469706673582212203b4618ffb55f9c3d047e17866b0c48ac613e07ed4eb162c19d74f773ce21207764736f6c63430008180033", + "devdoc": { + "kind": "dev", + "methods": { + "cancelIntent(bytes32)": { + "params": { + "_intentHash": "Hash of intent being cancelled" + } + }, + "initialize(address,address)": { + "params": { + "_accountRegistry": "Account Registry contract for Revolut", + "_sendProcessor": "Send processor address" + } + }, + "offRamp(string,bytes32,uint256,uint256,address,bytes32)": { + "params": { + "_depositAmount": "The amount of USDC to off-ramp", + "_notaryKeyHash": "Hash of the notary public key that is required to do notarization", + "_receiveAmount": "The amount of USD to receive", + "_receiveCurrencyId": "Id of the currency to be received off-chain", + "_revolutTag": "Depositor's Revolut tag to receive payments", + "_verifierSigningKey": "Public key of the verifier depositor wants to sign the TLS proof" + } + }, + "onRamp((string,string,string,string,string,string,string,string,uint256,uint256),bytes)": { + "params": { + "_sendData": "Struct containing unredacted data from API call to Revolut", + "_verifierSignature": "Signature by verifier of the unredacted data" + } + }, + "owner()": { + "details": "Returns the address of the current owner." + }, + "releaseFundsToOnramper(bytes32)": { + "params": { + "_intentHash": "Hash of intent to resolve by releasing the funds" + } + }, + "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." + }, + "setIntentExpirationPeriod(uint256)": { + "params": { + "_intentExpirationPeriod": "New intent expiration period" + } + }, + "setMaxOnRampAmount(uint256)": { + "params": { + "_maxOnRampAmount": "The new max on ramp amount" + } + }, + "setMinDepositAmount(uint256)": { + "params": { + "_minDepositAmount": "The new minimum deposit amount" + } + }, + "setOnRampCooldownPeriod(uint256)": { + "params": { + "_onRampCooldownPeriod": "New on-ramp cooldown period" + } + }, + "setSendProcessor(address)": { + "params": { + "_sendProcessor": "New send proccesor address" + } + }, + "setSustainabilityFee(uint256)": { + "params": { + "_fee": "The new sustainability fee in precise units (10**18, ie 10% = 1e17)" + } + }, + "setSustainabilityFeeRecipient(address)": { + "params": { + "_feeRecipient": "The new fee recipient address" + } + }, + "signalIntent(uint256,uint256,address)": { + "params": { + "_amount": "The amount of USDC the user wants to on-ramp", + "_depositId": "The ID of the deposit the on-ramper intends to use for ", + "_to": "Address to forward funds to (can be same as onRamper)" + } + }, + "transferOwnership(address)": { + "details": "Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner." + }, + "withdrawDeposit(uint256[])": { + "params": { + "_depositIds": "Array of depositIds the depositor is attempting to withdraw" + } + } + }, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": { + "cancelIntent(bytes32)": { + "notice": "Only callable by the originator of the intent. Cancels an outstanding intent thus allowing user to signal a new intent. Deposit state is updated to reflect the cancelled intent." + }, + "initialize(address,address)": { + "notice": "Initialize Ramp with the addresses of the Processors" + }, + "offRamp(string,bytes32,uint256,uint256,address,bytes32)": { + "notice": "Generates a deposit entry for off-rampers that can then be fulfilled by an on-ramper. This function will not add to previous deposits. Every deposit has it's own unique identifier. User must approve the contract to transfer the deposit amount of USDC." + }, + "onRamp((string,string,string,string,string,string,string,string,uint256,uint256),bytes)": { + "notice": "Anyone can submit an on-ramp transaction, even if caller isn't on-ramper. Upon submission the proof is validated, intent is removed, and deposit state is updated. USDC is transferred to the on-ramper." + }, + "releaseFundsToOnramper(bytes32)": { + "notice": "Allows off-ramper to release funds to the on-ramper in case of a failed on-ramp or because of some other arrangement between the two parties. Upon submission we check to make sure the msg.sender is the depositor, the intent is removed, and deposit state is updated. USDC is transferred to the on-ramper." + }, + "setIntentExpirationPeriod(uint256)": { + "notice": "GOVERNANCE ONLY: Updates the intent expiration period, after this period elapses an intent can be pruned to prevent locking up a depositor's funds." + }, + "setMaxOnRampAmount(uint256)": { + "notice": "GOVERNANCE ONLY: Updates the max amount allowed to be on-ramped in each transaction. To on-ramp more than this amount a user must make multiple transactions." + }, + "setMinDepositAmount(uint256)": { + "notice": "GOVERNANCE ONLY: Updates the minimum deposit amount a user can specify for off-ramping." + }, + "setOnRampCooldownPeriod(uint256)": { + "notice": "GOVERNANCE ONLY: Updates the on-ramp cooldown period, once an on-ramp transaction is completed the user must wait this amount of time before they can signalIntent to on-ramp again." + }, + "setSendProcessor(address)": { + "notice": "GOVERNANCE ONLY: Updates the send processor address used for validating and interpreting zk proofs." + }, + "setSustainabilityFee(uint256)": { + "notice": "GOVERNANCE ONLY: Updates the sustainability fee. This fee is charged to on-rampers upon a successful on-ramp." + }, + "setSustainabilityFeeRecipient(address)": { + "notice": "GOVERNANCE ONLY: Updates the recepient of sustainability fees." + }, + "signalIntent(uint256,uint256,address)": { + "notice": "Signals intent to pay the depositor defined in the _depositId the _amount * deposit conversionRate off-chain in order to unlock _amount of funds on-chain. Each user can only have one outstanding intent at a time regardless of address (tracked using accountId). Caller must not be on the depositor's deny list. If there are prunable intents then they will be deleted from the deposit to be able to maintain state hygiene." + }, + "withdrawDeposit(uint256[])": { + "notice": "Caller must be the depositor for each depositId in the array, if not whole function fails. Depositor is returned all remaining deposits and any outstanding intents that are expired. If an intent is not expired then those funds will not be returned. Deposit will be deleted as long as there are no more outstanding intents." + } + }, + "version": 1 + }, + "storageLayout": { + "storage": [ + { + "astId": 7, + "contract": "contracts/ramps/revolut/RevolutRamp.sol:RevolutRamp", + "label": "_owner", + "offset": 0, + "slot": "0", + "type": "t_address" + }, + { + "astId": 14430, + "contract": "contracts/ramps/revolut/RevolutRamp.sol:RevolutRamp", + "label": "accountRegistry", + "offset": 0, + "slot": "1", + "type": "t_contract(IRevolutAccountRegistry)16398" + }, + { + "astId": 14433, + "contract": "contracts/ramps/revolut/RevolutRamp.sol:RevolutRamp", + "label": "sendProcessor", + "offset": 0, + "slot": "2", + "type": "t_contract(IRevolutSendProcessor)16446" + }, + { + "astId": 14435, + "contract": "contracts/ramps/revolut/RevolutRamp.sol:RevolutRamp", + "label": "isInitialized", + "offset": 20, + "slot": "2", + "type": "t_bool" + }, + { + "astId": 14440, + "contract": "contracts/ramps/revolut/RevolutRamp.sol:RevolutRamp", + "label": "globalAccount", + "offset": 0, + "slot": "3", + "type": "t_mapping(t_bytes32,t_struct(GlobalAccountInfo)14399_storage)" + }, + { + "astId": 14445, + "contract": "contracts/ramps/revolut/RevolutRamp.sol:RevolutRamp", + "label": "deposits", + "offset": 0, + "slot": "4", + "type": "t_mapping(t_uint256,t_struct(Deposit)14362_storage)" + }, + { + "astId": 14450, + "contract": "contracts/ramps/revolut/RevolutRamp.sol:RevolutRamp", + "label": "intents", + "offset": 0, + "slot": "5", + "type": "t_mapping(t_bytes32,t_struct(Intent)14383_storage)" + }, + { + "astId": 14452, + "contract": "contracts/ramps/revolut/RevolutRamp.sol:RevolutRamp", + "label": "minDepositAmount", + "offset": 0, + "slot": "6", + "type": "t_uint256" + }, + { + "astId": 14454, + "contract": "contracts/ramps/revolut/RevolutRamp.sol:RevolutRamp", + "label": "maxOnRampAmount", + "offset": 0, + "slot": "7", + "type": "t_uint256" + }, + { + "astId": 14456, + "contract": "contracts/ramps/revolut/RevolutRamp.sol:RevolutRamp", + "label": "onRampCooldownPeriod", + "offset": 0, + "slot": "8", + "type": "t_uint256" + }, + { + "astId": 14458, + "contract": "contracts/ramps/revolut/RevolutRamp.sol:RevolutRamp", + "label": "intentExpirationPeriod", + "offset": 0, + "slot": "9", + "type": "t_uint256" + }, + { + "astId": 14460, + "contract": "contracts/ramps/revolut/RevolutRamp.sol:RevolutRamp", + "label": "sustainabilityFee", + "offset": 0, + "slot": "10", + "type": "t_uint256" + }, + { + "astId": 14462, + "contract": "contracts/ramps/revolut/RevolutRamp.sol:RevolutRamp", + "label": "sustainabilityFeeRecipient", + "offset": 0, + "slot": "11", + "type": "t_address" + }, + { + "astId": 14464, + "contract": "contracts/ramps/revolut/RevolutRamp.sol:RevolutRamp", + "label": "depositCounter", + "offset": 0, + "slot": "12", + "type": "t_uint256" + } + ], + "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_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_contract(IRevolutAccountRegistry)16398": { + "encoding": "inplace", + "label": "contract IRevolutAccountRegistry", + "numberOfBytes": "20" + }, + "t_contract(IRevolutSendProcessor)16446": { + "encoding": "inplace", + "label": "contract IRevolutSendProcessor", + "numberOfBytes": "20" + }, + "t_mapping(t_bytes32,t_struct(GlobalAccountInfo)14399_storage)": { + "encoding": "mapping", + "key": "t_bytes32", + "label": "mapping(bytes32 => struct RevolutRamp.GlobalAccountInfo)", + "numberOfBytes": "32", + "value": "t_struct(GlobalAccountInfo)14399_storage" + }, + "t_mapping(t_bytes32,t_struct(Intent)14383_storage)": { + "encoding": "mapping", + "key": "t_bytes32", + "label": "mapping(bytes32 => struct RevolutRamp.Intent)", + "numberOfBytes": "32", + "value": "t_struct(Intent)14383_storage" + }, + "t_mapping(t_uint256,t_struct(Deposit)14362_storage)": { + "encoding": "mapping", + "key": "t_uint256", + "label": "mapping(uint256 => struct RevolutRamp.Deposit)", + "numberOfBytes": "32", + "value": "t_struct(Deposit)14362_storage" + }, + "t_string_storage": { + "encoding": "bytes", + "label": "string", + "numberOfBytes": "32" + }, + "t_struct(Deposit)14362_storage": { + "encoding": "inplace", + "label": "struct RevolutRamp.Deposit", + "members": [ + { + "astId": 14342, + "contract": "contracts/ramps/revolut/RevolutRamp.sol:RevolutRamp", + "label": "depositor", + "offset": 0, + "slot": "0", + "type": "t_address" + }, + { + "astId": 14344, + "contract": "contracts/ramps/revolut/RevolutRamp.sol:RevolutRamp", + "label": "revolutTag", + "offset": 0, + "slot": "1", + "type": "t_string_storage" + }, + { + "astId": 14346, + "contract": "contracts/ramps/revolut/RevolutRamp.sol:RevolutRamp", + "label": "verifierSigningKey", + "offset": 0, + "slot": "2", + "type": "t_address" + }, + { + "astId": 14348, + "contract": "contracts/ramps/revolut/RevolutRamp.sol:RevolutRamp", + "label": "notaryKeyHash", + "offset": 0, + "slot": "3", + "type": "t_bytes32" + }, + { + "astId": 14350, + "contract": "contracts/ramps/revolut/RevolutRamp.sol:RevolutRamp", + "label": "depositAmount", + "offset": 0, + "slot": "4", + "type": "t_uint256" + }, + { + "astId": 14352, + "contract": "contracts/ramps/revolut/RevolutRamp.sol:RevolutRamp", + "label": "receiveCurrencyId", + "offset": 0, + "slot": "5", + "type": "t_bytes32" + }, + { + "astId": 14354, + "contract": "contracts/ramps/revolut/RevolutRamp.sol:RevolutRamp", + "label": "remainingDeposits", + "offset": 0, + "slot": "6", + "type": "t_uint256" + }, + { + "astId": 14356, + "contract": "contracts/ramps/revolut/RevolutRamp.sol:RevolutRamp", + "label": "outstandingIntentAmount", + "offset": 0, + "slot": "7", + "type": "t_uint256" + }, + { + "astId": 14358, + "contract": "contracts/ramps/revolut/RevolutRamp.sol:RevolutRamp", + "label": "conversionRate", + "offset": 0, + "slot": "8", + "type": "t_uint256" + }, + { + "astId": 14361, + "contract": "contracts/ramps/revolut/RevolutRamp.sol:RevolutRamp", + "label": "intentHashes", + "offset": 0, + "slot": "9", + "type": "t_array(t_bytes32)dyn_storage" + } + ], + "numberOfBytes": "320" + }, + "t_struct(GlobalAccountInfo)14399_storage": { + "encoding": "inplace", + "label": "struct RevolutRamp.GlobalAccountInfo", + "members": [ + { + "astId": 14393, + "contract": "contracts/ramps/revolut/RevolutRamp.sol:RevolutRamp", + "label": "currentIntentHash", + "offset": 0, + "slot": "0", + "type": "t_bytes32" + }, + { + "astId": 14395, + "contract": "contracts/ramps/revolut/RevolutRamp.sol:RevolutRamp", + "label": "lastOnrampTimestamp", + "offset": 0, + "slot": "1", + "type": "t_uint256" + }, + { + "astId": 14398, + "contract": "contracts/ramps/revolut/RevolutRamp.sol:RevolutRamp", + "label": "deposits", + "offset": 0, + "slot": "2", + "type": "t_array(t_uint256)dyn_storage" + } + ], + "numberOfBytes": "96" + }, + "t_struct(Intent)14383_storage": { + "encoding": "inplace", + "label": "struct RevolutRamp.Intent", + "members": [ + { + "astId": 14374, + "contract": "contracts/ramps/revolut/RevolutRamp.sol:RevolutRamp", + "label": "onRamper", + "offset": 0, + "slot": "0", + "type": "t_address" + }, + { + "astId": 14376, + "contract": "contracts/ramps/revolut/RevolutRamp.sol:RevolutRamp", + "label": "to", + "offset": 0, + "slot": "1", + "type": "t_address" + }, + { + "astId": 14378, + "contract": "contracts/ramps/revolut/RevolutRamp.sol:RevolutRamp", + "label": "deposit", + "offset": 0, + "slot": "2", + "type": "t_uint256" + }, + { + "astId": 14380, + "contract": "contracts/ramps/revolut/RevolutRamp.sol:RevolutRamp", + "label": "amount", + "offset": 0, + "slot": "3", + "type": "t_uint256" + }, + { + "astId": 14382, + "contract": "contracts/ramps/revolut/RevolutRamp.sol:RevolutRamp", + "label": "intentTimestamp", + "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/deployments/encifher/RevolutSendProcessor.json b/contracts/deployments/encifher/RevolutSendProcessor.json new file mode 100644 index 000000000..0b236012b --- /dev/null +++ b/contracts/deployments/encifher/RevolutSendProcessor.json @@ -0,0 +1,425 @@ +{ + "address": "0x270fBc6A0f1007eB41863237Eefb773795fd1F9C", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_ramp", + "type": "address" + }, + { + "internalType": "contract INullifierRegistry", + "name": "_nullifierRegistry", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_timestampBuffer", + "type": "uint256" + }, + { + "internalType": "string", + "name": "_endpoint", + "type": "string" + }, + { + "internalType": "string", + "name": "_host", + "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" + }, + { + "inputs": [], + "name": "PAYMENT_STATUS", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "endpoint", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "host", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "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": [ + { + "components": [ + { + "internalType": "string", + "name": "endpoint", + "type": "string" + }, + { + "internalType": "string", + "name": "host", + "type": "string" + }, + { + "internalType": "string", + "name": "transferId", + "type": "string" + }, + { + "internalType": "string", + "name": "recipientId", + "type": "string" + }, + { + "internalType": "string", + "name": "amount", + "type": "string" + }, + { + "internalType": "string", + "name": "currencyId", + "type": "string" + }, + { + "internalType": "string", + "name": "status", + "type": "string" + }, + { + "internalType": "string", + "name": "timestamp", + "type": "string" + }, + { + "internalType": "uint256", + "name": "intentHash", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "notaryKeyHash", + "type": "uint256" + } + ], + "internalType": "struct IRevolutSendProcessor.SendData", + "name": "public_values", + "type": "tuple" + }, + { + "internalType": "bytes", + "name": "proof", + "type": "bytes" + } + ], + "internalType": "struct IRevolutSendProcessor.SendProof", + "name": "_proof", + "type": "tuple" + }, + { + "internalType": "address", + "name": "_verifierSigningKey", + "type": "address" + } + ], + "name": "processProof", + "outputs": [ + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "timestamp", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "offRamperId", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "currencyId", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "notaryKeyHash", + "type": "bytes32" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "ramp", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "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" + } + ], + "transactionHash": "0x354f7670b1d5e73f0b8b475b1e37472591c395c02949e5fc5fcc467905d027f5", + "receipt": { + "to": null, + "from": "0xa0Ee7A142d267C1f36714E4a8F75612F20a79720", + "contractAddress": "0x270fBc6A0f1007eB41863237Eefb773795fd1F9C", + "transactionIndex": 0, + "gasUsed": "1557858", + "logsBloom": "0x00000000000000000000040000000000000000000000000000800000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000008000000000000000000020000000000000000000800000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000004000002020000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0xdc68d487fc0c75e13ac01d13a9caf80431e493a1ea70500960b84523716af4bb", + "transactionHash": "0x354f7670b1d5e73f0b8b475b1e37472591c395c02949e5fc5fcc467905d027f5", + "logs": [ + { + "transactionIndex": 0, + "blockNumber": 61405, + "transactionHash": "0x354f7670b1d5e73f0b8b475b1e37472591c395c02949e5fc5fcc467905d027f5", + "address": "0x270fBc6A0f1007eB41863237Eefb773795fd1F9C", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x000000000000000000000000a0ee7a142d267c1f36714e4a8f75612f20a79720" + ], + "data": "0x", + "logIndex": 0, + "blockHash": "0xdc68d487fc0c75e13ac01d13a9caf80431e493a1ea70500960b84523716af4bb" + } + ], + "blockNumber": 61405, + "cumulativeGasUsed": "1557858", + "status": 1, + "byzantium": true + }, + "args": [ + "0x49EA5126fD67f877b62dDC0144DBeb42591DF7bb", + "0x4d8E02BBfCf205828A8352Af4376b165E123D7b0", + "30", + "GET https://app.revolut.com/api/retail/transaction/*", + "app.revolut.com" + ], + "numDeployments": 1, + "solcInputHash": "75b8f55da346d7ed99a350632554d2fb", + "metadata": "{\"compiler\":{\"version\":\"0.8.24+commit.e11b9ed9\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_ramp\",\"type\":\"address\"},{\"internalType\":\"contract INullifierRegistry\",\"name\":\"_nullifierRegistry\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_timestampBuffer\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"_endpoint\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_host\",\"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\"},{\"inputs\":[],\"name\":\"PAYMENT_STATUS\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"endpoint\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"host\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"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\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"endpoint\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"host\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"transferId\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"recipientId\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"amount\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"currencyId\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"status\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"timestamp\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"intentHash\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"notaryKeyHash\",\"type\":\"uint256\"}],\"internalType\":\"struct IRevolutSendProcessor.SendData\",\"name\":\"public_values\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"proof\",\"type\":\"bytes\"}],\"internalType\":\"struct IRevolutSendProcessor.SendProof\",\"name\":\"_proof\",\"type\":\"tuple\"},{\"internalType\":\"address\",\"name\":\"_verifierSigningKey\",\"type\":\"address\"}],\"name\":\"processProof\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"offRamperId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"currencyId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"notaryKeyHash\",\"type\":\"bytes32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ramp\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"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\"}],\"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.\"},\"setTimestampBuffer(uint256)\":{\"params\":{\"_timestampBuffer\":\"The timestamp buffer for validated TLS calls\"}},\"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\":{\"setTimestampBuffer(uint256)\":{\"notice\":\"ONLY OWNER: Sets the timestamp buffer for validated TLS calls. 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/ramps/revolut/RevolutSendProcessor.sol\":\"RevolutSendProcessor\"},\"evmVersion\":\"shanghai\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"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/interfaces/IERC1271.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (interfaces/IERC1271.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC1271 standard signature validation method for\\n * contracts as defined in https://eips.ethereum.org/EIPS/eip-1271[ERC-1271].\\n *\\n * _Available since v4.1._\\n */\\ninterface IERC1271 {\\n /**\\n * @dev Should return whether the signature provided is valid for the provided data\\n * @param hash Hash of the data to be signed\\n * @param signature Signature byte array associated with _data\\n */\\n function isValidSignature(bytes32 hash, bytes memory signature) external view returns (bytes4 magicValue);\\n}\\n\",\"keccak256\":\"0x0705a4b1b86d7b0bd8432118f226ba139c44b9dcaba0a6eafba2dd7d0639c544\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (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\",\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"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/cryptography/SignatureChecker.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/cryptography/SignatureChecker.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./ECDSA.sol\\\";\\nimport \\\"../../interfaces/IERC1271.sol\\\";\\n\\n/**\\n * @dev Signature verification helper that can be used instead of `ECDSA.recover` to seamlessly support both ECDSA\\n * signatures from externally owned accounts (EOAs) as well as ERC1271 signatures from smart contract wallets like\\n * Argent and Gnosis Safe.\\n *\\n * _Available since v4.1._\\n */\\nlibrary SignatureChecker {\\n /**\\n * @dev Checks if a signature is valid for a given signer and data hash. If the signer is a smart contract, the\\n * signature is validated against that smart contract using ERC1271, otherwise it's validated using `ECDSA.recover`.\\n *\\n * NOTE: Unlike ECDSA signatures, contract signatures are revocable, and the outcome of this function can thus\\n * change through time. It could return true at block N and false at block N+1 (or the opposite).\\n */\\n function isValidSignatureNow(address signer, bytes32 hash, bytes memory signature) internal view returns (bool) {\\n (address recovered, ECDSA.RecoverError error) = ECDSA.tryRecover(hash, signature);\\n return\\n (error == ECDSA.RecoverError.NoError && recovered == signer) ||\\n isValidERC1271SignatureNow(signer, hash, signature);\\n }\\n\\n /**\\n * @dev Checks if a signature is valid for a given signer and data hash. The signature is validated\\n * against the signer smart contract using ERC1271.\\n *\\n * NOTE: Unlike ECDSA signatures, contract signatures are revocable, and the outcome of this function can thus\\n * change through time. It could return true at block N and false at block N+1 (or the opposite).\\n */\\n function isValidERC1271SignatureNow(\\n address signer,\\n bytes32 hash,\\n bytes memory signature\\n ) internal view returns (bool) {\\n (bool success, bytes memory result) = signer.staticcall(\\n abi.encodeWithSelector(IERC1271.isValidSignature.selector, hash, signature)\\n );\\n return (success &&\\n result.length >= 32 &&\\n abi.decode(result, (bytes32)) == bytes32(IERC1271.isValidSignature.selector));\\n }\\n}\\n\",\"keccak256\":\"0x3af3ca86df39aac39a0514c84459d691434a108d2151c8ce9d69f32e315cab80\",\"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\"},\"contracts/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/processors/TLSBaseProcessor.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\n\\nimport { ECDSA } from \\\"@openzeppelin/contracts/utils/cryptography/ECDSA.sol\\\";\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\nimport { SignatureChecker } from \\\"@openzeppelin/contracts/utils/cryptography/SignatureChecker.sol\\\";\\n\\nimport { INullifierRegistry } from \\\"./nullifierRegistries/INullifierRegistry.sol\\\";\\n\\npragma solidity ^0.8.18;\\n\\ncontract TLSBaseProcessor is Ownable {\\n\\n using SignatureChecker for address;\\n using ECDSA for bytes32;\\n\\n /* ============ Modifiers ============ */\\n modifier onlyRamp() {\\n require(msg.sender == ramp, \\\"Only Ramp can call this function\\\");\\n _;\\n }\\n\\n /* ============ State Variables ============ */\\n address public immutable ramp;\\n string public endpoint;\\n string public host;\\n\\n INullifierRegistry public nullifierRegistry;\\n uint256 public timestampBuffer;\\n\\n /* ============ Constructor ============ */\\n constructor(\\n address _ramp,\\n INullifierRegistry _nullifierRegistry,\\n uint256 _timestampBuffer,\\n string memory _endpoint,\\n string memory _host\\n )\\n Ownable()\\n {\\n ramp = _ramp;\\n endpoint = _endpoint;\\n host = _host;\\n\\n nullifierRegistry = _nullifierRegistry;\\n timestampBuffer = _timestampBuffer;\\n }\\n\\n /* ============ External Functions ============ */\\n\\n /**\\n * @notice ONLY OWNER: Sets the timestamp buffer for validated TLS calls. 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 TLS calls\\n */\\n function setTimestampBuffer(uint256 _timestampBuffer) external onlyOwner {\\n timestampBuffer = _timestampBuffer;\\n }\\n\\n /* ============ Internal Functions ============ */\\n\\n function _validateTLSEndpoint(\\n string memory _expectedEndpoint,\\n string memory _passedEndpoint\\n )\\n internal\\n pure\\n {\\n require(\\n keccak256(abi.encode(_expectedEndpoint)) == keccak256(abi.encode(_passedEndpoint)),\\n \\\"Endpoint does not match expected\\\"\\n );\\n }\\n\\n function _validateTLSHost(\\n string memory _expectedHost,\\n string memory _passedHost\\n )\\n internal\\n pure\\n {\\n require(\\n keccak256(abi.encode(_expectedHost)) == keccak256(abi.encode(_passedHost)),\\n \\\"Host does not match expected\\\"\\n );\\n }\\n\\n function _validateAndAddNullifier(bytes32 _nullifier) internal {\\n require(!nullifierRegistry.isNullified(_nullifier), \\\"Nullifier has already been used\\\");\\n nullifierRegistry.addNullifier(_nullifier);\\n }\\n\\n function _isValidSignature(\\n bytes memory _message,\\n bytes memory _signature,\\n address _signer\\n )\\n internal\\n view\\n returns(bool)\\n {\\n bytes32 verifierPayload = keccak256(_message).toEthSignedMessageHash();\\n\\n return _signer.isValidSignatureNow(verifierPayload, _signature);\\n }\\n}\\n\",\"keccak256\":\"0x366ab1cc4ebfdb4ba68fdb43b902676e67e7760ae1987e4252e5839e8370a6c2\",\"license\":\"MIT\"},\"contracts/processors/keyHashAdapters/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/processors/nullifierRegistries/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/ramps/revolut/RevolutSendProcessor.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\n\\nimport { ECDSA } from \\\"@openzeppelin/contracts/utils/cryptography/ECDSA.sol\\\";\\nimport { SignatureChecker } from \\\"@openzeppelin/contracts/utils/cryptography/SignatureChecker.sol\\\";\\n\\nimport { IKeyHashAdapterV2 } from \\\"../../processors/keyHashAdapters/IKeyHashAdapterV2.sol\\\";\\nimport { INullifierRegistry } from \\\"../../processors/nullifierRegistries/INullifierRegistry.sol\\\";\\nimport { IRevolutSendProcessor } from \\\"./interfaces/IRevolutSendProcessor.sol\\\";\\nimport { StringConversionUtils } from \\\"../../lib/StringConversionUtils.sol\\\";\\nimport { TLSBaseProcessor } from \\\"../../processors/TLSBaseProcessor.sol\\\";\\n\\npragma solidity ^0.8.18;\\n\\ncontract RevolutSendProcessor is IRevolutSendProcessor, TLSBaseProcessor {\\n\\n using ECDSA for bytes32;\\n using SignatureChecker for address;\\n using StringConversionUtils for string;\\n\\n /* ============ Constants ============ */\\n bytes32 public constant PAYMENT_STATUS = keccak256(abi.encodePacked(\\\"COMPLETED\\\"));\\n\\n /* ============ Constructor ============ */\\n constructor(\\n address _ramp,\\n INullifierRegistry _nullifierRegistry,\\n uint256 _timestampBuffer,\\n string memory _endpoint,\\n string memory _host\\n )\\n TLSBaseProcessor(\\n _ramp,\\n _nullifierRegistry,\\n _timestampBuffer,\\n _endpoint,\\n _host\\n )\\n {}\\n \\n /* ============ External Functions ============ */\\n function processProof(\\n IRevolutSendProcessor.SendProof calldata _proof,\\n address _verifierSigningKey\\n )\\n public\\n override\\n onlyRamp\\n returns(\\n uint256 amount,\\n uint256 timestamp,\\n bytes32 offRamperId,\\n bytes32 currencyId,\\n bytes32 notaryKeyHash\\n )\\n {\\n _validateProof(_verifierSigningKey, _proof.public_values, _proof.proof);\\n\\n _validateTLSEndpoint(\\n endpoint.replaceString(\\\"*\\\", _proof.public_values.transferId),\\n _proof.public_values.endpoint\\n );\\n _validateTLSHost(host, _proof.public_values.host);\\n \\n // Validate status\\n require(\\n keccak256(abi.encodePacked(_proof.public_values.status)) == PAYMENT_STATUS,\\n \\\"Payment status not confirmed as sent\\\"\\n );\\n _validateAndAddNullifier(keccak256(abi.encodePacked(\\\"Revolut\\\", _proof.public_values.transferId)));\\n\\n amount = _parseAmount(_proof.public_values.amount);\\n\\n // Add the buffer to build in flexibility with L2 timestamps\\n timestamp = _proof.public_values.timestamp.stringToUint(0) / 1000 + timestampBuffer;\\n\\n offRamperId = keccak256(abi.encodePacked(_proof.public_values.recipientId));\\n currencyId = keccak256(abi.encodePacked(_proof.public_values.currencyId));\\n notaryKeyHash = bytes32(_proof.public_values.notaryKeyHash);\\n }\\n\\n /* ============ View Functions ============ */\\n\\n function verifyProof(\\n address _verifierSigningKey,\\n IRevolutSendProcessor.SendData memory _publicValues, \\n bytes memory _proof\\n )\\n internal\\n view\\n returns(bool)\\n { \\n bytes memory encodedMessage = abi.encode(\\n _publicValues.endpoint,\\n _publicValues.host,\\n _publicValues.transferId,\\n _publicValues.recipientId,\\n _publicValues.amount,\\n _publicValues.currencyId,\\n _publicValues.status,\\n _publicValues.timestamp,\\n _publicValues.intentHash,\\n _publicValues.notaryKeyHash\\n );\\n return _isValidSignature(encodedMessage, _proof, _verifierSigningKey);\\n }\\n\\n /* ============ Internal Functions ============ */\\n\\n function _validateProof(\\n address _verifierSigningKey,\\n IRevolutSendProcessor.SendData memory _publicValues, \\n bytes memory _proof\\n )\\n internal\\n view\\n { \\n require(\\n verifyProof(_verifierSigningKey, _publicValues, _proof),\\n \\\"Invalid proof\\\"\\n );\\n }\\n\\n function _parseAmount(string memory amount) internal pure returns(uint256) {\\n // For send transactions, the amount is prefixed with a '-' character, if the character doesn't exist then\\n // it would be a receive transaction\\n require(bytes(amount)[0] == 0x2D, \\\"Not a send transaction\\\"); \\n return amount.stringToUint(6);\\n }\\n}\\n\",\"keccak256\":\"0x12ec921517e7364323e67c11d38da7e712b63c65a7cfb91f68b24a9725bf3e95\",\"license\":\"MIT\"},\"contracts/ramps/revolut/interfaces/IRevolutSendProcessor.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.18;\\n\\ninterface IRevolutSendProcessor {\\n\\n struct SendData {\\n string endpoint;\\n string host;\\n string transferId;\\n string recipientId;\\n string amount;\\n string currencyId;\\n string status;\\n string timestamp;\\n uint256 intentHash;\\n uint256 notaryKeyHash;\\n }\\n\\n struct SendProof {\\n SendData public_values;\\n bytes proof;\\n }\\n\\n function processProof(\\n SendProof calldata _proof,\\n address _verifierSigningKey\\n )\\n external\\n returns(uint256, uint256, bytes32, bytes32, bytes32);\\n}\\n\",\"keccak256\":\"0x6bb42393fe8c5f9ac83fa56e126413638b4a0c110602eecaa70d2b41cf77f1a3\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x60a060405234801562000010575f80fd5b5060405162001e4438038062001e448339810160408190526200003391620001c9565b84848484846200004333620000a1565b6001600160a01b03851660805260016200005e8382620002ec565b5060026200006d8282620002ec565b5050600380546001600160a01b0319166001600160a01b03949094169390931790925560045550620003b895505050505050565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b038116811462000105575f80fd5b50565b634e487b7160e01b5f52604160045260245ffd5b5f82601f8301126200012c575f80fd5b81516001600160401b038082111562000149576200014962000108565b604051601f8301601f19908116603f0116810190828211818310171562000174576200017462000108565b816040528381526020925086602085880101111562000191575f80fd5b5f91505b83821015620001b4578582018301518183018401529082019062000195565b5f602085830101528094505050505092915050565b5f805f805f60a08688031215620001de575f80fd5b8551620001eb81620000f0565b6020870151909550620001fe81620000f0565b6040870151606088015191955093506001600160401b038082111562000222575f80fd5b6200023089838a016200011c565b9350608088015191508082111562000246575f80fd5b5062000255888289016200011c565b9150509295509295909350565b600181811c908216806200027757607f821691505b6020821081036200029657634e487b7160e01b5f52602260045260245ffd5b50919050565b601f821115620002e757805f5260205f20601f840160051c81016020851015620002c35750805b601f840160051c820191505b81811015620002e4575f8155600101620002cf565b50505b505050565b81516001600160401b0381111562000308576200030862000108565b620003208162000319845462000262565b846200029c565b602080601f83116001811462000356575f84156200033e5750858301515b5f19600386901b1c1916600185901b178555620003b0565b5f85815260208120601f198616915b82811015620003865788860151825594840194600190910190840162000365565b5085821015620003a457878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b608051611a6d620003d75f395f818160ef01526101f40152611a6d5ff3fe608060405234801561000f575f80fd5b50600436106100a6575f3560e01c8063b2a3fda41161006e578063b2a3fda414610158578063b870676c1461016b578063dbac58211461017e578063f2fde38b14610195578063f437bc59146101a8578063faec91e0146101b0575f80fd5b80630f2d076d146100aa57806315d276e1146100ea5780635e280f1114610129578063715018a61461013e5780638da5cb5b14610148575b5f80fd5b6100bd6100b836600461136f565b6101e4565b604080519586526020860194909452928401919091526060830152608082015260a0015b60405180910390f35b6101117f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016100e1565b610131610773565b6040516100e1919061140b565b6101466107ff565b005b5f546001600160a01b0316610111565b61014661016636600461141d565b610812565b600354610111906001600160a01b031681565b61018760045481565b6040519081526020016100e1565b6101466101a3366004611434565b61081f565b610131610898565b6101876040516810d3d354131155115160ba1b60208201526029016040516020818303038152906040528051906020012081565b5f80808080336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146102665760405162461bcd60e51b815260206004820181905260248201527f4f6e6c792052616d702063616e2063616c6c20746869732066756e6374696f6e60448201526064015b60405180910390fd5b6102c386610274898061144d565b61027d90611533565b61028a60208b018b61168c565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152506108a592505050565b6040805180820190915260018152601560f91b6020820152610415906103c8906102ed8a8061144d565b6102fb90604081019061168c565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250506001805490925061033d91506116cf565b80601f0160208091040260200160405190810160405280929190818152602001828054610369906116cf565b80156103b45780601f1061038b576101008083540402835291602001916103b4565b820191905f5260205f20905b81548152906001019060200180831161039757829003601f168201915b50505050506108f19092919063ffffffff16565b6103d2898061144d565b6103dc908061168c565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061097192505050565b6104f660028054610425906116cf565b80601f0160208091040260200160405190810160405280929190818152602001828054610451906116cf565b801561049c5780601f106104735761010080835404028352916020019161049c565b820191905f5260205f20905b81548152906001019060200180831161047f57829003601f168201915b506104af93508c925082915061144d9050565b6104bd90602081019061168c565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250610a1092505050565b6040516810d3d354131155115160ba1b602082015260290160408051601f198184030181529190528051602090910120610530888061144d565b61053e9060c081019061168c565b60405160200161054f929190611707565b60405160208183030381529060405280519060200120146105be5760405162461bcd60e51b8152602060048201526024808201527f5061796d656e7420737461747573206e6f7420636f6e6669726d6564206173206044820152631cd95b9d60e21b606482015260840161025d565b6106056105cb888061144d565b6105d990604081019061168c565b6040516020016105ea929190611716565b60405160208183030381529060405280519060200120610aab565b610659610612888061144d565b61062090608081019061168c565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250610bbf92505050565b6004549095506103e86106ba5f6106708b8061144d565b61067e9060e081019061168c565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152509293925050610c3e9050565b6106c4919061174c565b6106ce919061176b565b93506106da878061144d565b6106e890606081019061168c565b6040516020016106f9929190611707565b60408051601f198184030181529190528051602090910120925061071d878061144d565b61072b9060a081019061168c565b60405160200161073c929190611707565b60408051601f1981840301815291905280516020909101209150610760878061144d565b61012001355f1b90509295509295909350565b60018054610780906116cf565b80601f01602080910402602001604051908101604052809291908181526020018280546107ac906116cf565b80156107f75780601f106107ce576101008083540402835291602001916107f7565b820191905f5260205f20905b8154815290600101906020018083116107da57829003601f168201915b505050505081565b610807610c4e565b6108105f610ca7565b565b61081a610c4e565b600455565b610827610c4e565b6001600160a01b03811661088c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161025d565b61089581610ca7565b50565b60028054610780906116cf565b6108b0838383610cf6565b6108ec5760405162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b210383937b7b360991b604482015260640161025d565b505050565b606083835f6109008383610d69565b90505f1981036109155786935050505061096a565b5f610921885f84610e38565b90505f61093c89855185610935919061176b565b8751610e38565b90508187826040516020016109539392919061177e565b604051602081830303815290604052955050505050505b9392505050565b80604051602001610982919061140b565b60405160208183030381529060405280519060200120826040516020016109a9919061140b565b6040516020818303038152906040528051906020012014610a0c5760405162461bcd60e51b815260206004820181905260248201527f456e64706f696e7420646f6573206e6f74206d61746368206578706563746564604482015260640161025d565b5050565b80604051602001610a21919061140b565b6040516020818303038152906040528051906020012082604051602001610a48919061140b565b6040516020818303038152906040528051906020012014610a0c5760405162461bcd60e51b815260206004820152601c60248201527f486f737420646f6573206e6f74206d6174636820657870656374656400000000604482015260640161025d565b60035460405163169394bb60e01b8152600481018390526001600160a01b039091169063169394bb90602401602060405180830381865afa158015610af2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b1691906117c0565b15610b635760405162461bcd60e51b815260206004820152601f60248201527f4e756c6c69666965722068617320616c7265616479206265656e207573656400604482015260640161025d565b600354604051632dea6f9960e11b8152600481018390526001600160a01b0390911690635bd4df32906024015f604051808303815f87803b158015610ba6575f80fd5b505af1158015610bb8573d5f803e3d5ffd5b5050505050565b5f815f81518110610bd257610bd26117df565b6020910101516001600160f81b031916602d60f81b14610c2d5760405162461bcd60e51b81526020600482015260166024820152752737ba10309039b2b732103a3930b739b0b1ba34b7b760511b604482015260640161025d565b610c38826006610c3e565b92915050565b5f61096a83601760f91b84610ef9565b5f546001600160a01b031633146108105760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161025d565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f80835f015184602001518560400151866060015187608001518860a001518960c001518a60e001518b61010001518c6101200151604051602001610d449a999897969594939291906117f3565b6040516020818303038152906040529050610d608184876110cb565b95945050505050565b805182515f91849184911115610d84575f1992505050610c38565b5f5b81518351610d9491906118ae565b8111610e2c5760015f5b8351811015610e0757838181518110610db957610db96117df565b01602001516001600160f81b03191685610dd3838661176b565b81518110610de357610de36117df565b01602001516001600160f81b03191614610dff575f9150610e07565b600101610d9e565b508015610e1957509250610c38915050565b5080610e24816118c1565b915050610d86565b505f1995945050505050565b6060835f610e4685856118ae565b67ffffffffffffffff811115610e5e57610e5e61146c565b6040519080825280601f01601f191660200182016040528015610e88576020820181803683370190505b509050845b84811015610eef57828181518110610ea757610ea76117df565b01602001516001600160f81b03191682610ec188846118ae565b81518110610ed157610ed16117df565b60200101906001600160f81b03191690815f1a905350600101610e8d565b5095945050505050565b5f83818080805b845181101561104457603060f81b858281518110610f2057610f206117df565b01602001516001600160f81b03191610801590610f615750603960f81b858281518110610f4f57610f4f6117df565b01602001516001600160f81b03191611155b15610fa4576030858281518110610f7a57610f7a6117df565b0160200151610f8c919060f81c6118ae565b610f9785600a6118d9565b610fa1919061176b565b93505b8115610fb85782610fb4816118c1565b9350505b876001600160f81b031916858281518110610fd557610fd56117df565b01602001516001600160f81b0319160361103c5781156110375760405162461bcd60e51b815260206004820152601c60248201527f537472696e6720686173206d756c7469706c6520646563696d616c7300000000604482015260640161025d565b600191505b600101610f00565b50858211156110a05760405162461bcd60e51b815260206004820152602260248201527f537472696e672068617320746f6f206d616e7920646563696d616c20706c6163604482015261657360f01b606482015260840161025d565b6110aa82876118ae565b6110b590600a6119d0565b6110bf90846118d9565b98975050505050505050565b825160208401207f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f908152601c91909152603c8120610d606001600160a01b03841682865f805f61111d858561116e565b90925090505f816004811115611135576111356119db565b1480156111535750856001600160a01b0316826001600160a01b0316145b8061116457506111648686866111b0565b9695505050505050565b5f8082516041036111a2576020830151604084015160608501515f1a61119687828585611297565b945094505050506111a9565b505f905060025b9250929050565b5f805f856001600160a01b0316631626ba7e60e01b86866040516024016111d89291906119ef565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b03199094169390931790925290516112169190611a0f565b5f60405180830381855afa9150503d805f811461124e576040519150601f19603f3d011682016040523d82523d5f602084013e611253565b606091505b509150915081801561126757506020815110155b801561116457508051630b135d3f60e11b9061128c9083016020908101908401611a20565b149695505050505050565b5f807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156112cc57505f9050600361134b565b604080515f8082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa15801561131d573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b038116611345575f6001925092505061134b565b91505f90505b94509492505050565b80356001600160a01b038116811461136a575f80fd5b919050565b5f8060408385031215611380575f80fd5b823567ffffffffffffffff811115611396575f80fd5b8301604081860312156113a7575f80fd5b91506113b560208401611354565b90509250929050565b5f5b838110156113d85781810151838201526020016113c0565b50505f910152565b5f81518084526113f78160208601602086016113be565b601f01601f19169290920160200192915050565b602081525f61096a60208301846113e0565b5f6020828403121561142d575f80fd5b5035919050565b5f60208284031215611444575f80fd5b61096a82611354565b5f823561013e19833603018112611462575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051610140810167ffffffffffffffff811182821017156114a4576114a461146c565b60405290565b5f82601f8301126114b9575f80fd5b813567ffffffffffffffff808211156114d4576114d461146c565b604051601f8301601f19908116603f011681019082821181831017156114fc576114fc61146c565b81604052838152866020858801011115611514575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f6101408236031215611544575f80fd5b61154c611480565b823567ffffffffffffffff80821115611563575f80fd5b61156f368387016114aa565b83526020850135915080821115611584575f80fd5b611590368387016114aa565b602084015260408501359150808211156115a8575f80fd5b6115b4368387016114aa565b604084015260608501359150808211156115cc575f80fd5b6115d8368387016114aa565b606084015260808501359150808211156115f0575f80fd5b6115fc368387016114aa565b608084015260a0850135915080821115611614575f80fd5b611620368387016114aa565b60a084015260c0850135915080821115611638575f80fd5b611644368387016114aa565b60c084015260e085013591508082111561165c575f80fd5b50611669368286016114aa565b60e083015250610100838101359082015261012092830135928101929092525090565b5f808335601e198436030181126116a1575f80fd5b83018035915067ffffffffffffffff8211156116bb575f80fd5b6020019150368190038213156111a9575f80fd5b600181811c908216806116e357607f821691505b60208210810361170157634e487b7160e01b5f52602260045260245ffd5b50919050565b818382375f9101908152919050565b6614995d9bdb1d5d60ca1b8152818360078301375f9101600701908152919050565b634e487b7160e01b5f52601160045260245ffd5b5f8261176657634e487b7160e01b5f52601260045260245ffd5b500490565b80820180821115610c3857610c38611738565b5f845161178f8184602089016113be565b8451908301906117a38183602089016113be565b84519101906117b68183602088016113be565b0195945050505050565b5f602082840312156117d0575f80fd5b8151801515811461096a575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f6101408083526118068184018e6113e0565b9050828103602084015261181a818d6113e0565b9050828103604084015261182e818c6113e0565b90508281036060840152611842818b6113e0565b90508281036080840152611856818a6113e0565b905082810360a084015261186a81896113e0565b905082810360c084015261187e81886113e0565b905082810360e084015261189281876113e0565b6101008401959095525050610120015298975050505050505050565b81810381811115610c3857610c38611738565b5f600182016118d2576118d2611738565b5060010190565b8082028115828204841417610c3857610c38611738565b600181815b8085111561192a57815f190482111561191057611910611738565b8085161561191d57918102915b93841c93908002906118f5565b509250929050565b5f8261194057506001610c38565b8161194c57505f610c38565b8160018114611962576002811461196c57611988565b6001915050610c38565b60ff84111561197d5761197d611738565b50506001821b610c38565b5060208310610133831016604e8410600b84101617156119ab575081810a610c38565b6119b583836118f0565b805f19048211156119c8576119c8611738565b029392505050565b5f61096a8383611932565b634e487b7160e01b5f52602160045260245ffd5b828152604060208201525f611a0760408301846113e0565b949350505050565b5f82516114628184602087016113be565b5f60208284031215611a30575f80fd5b505191905056fea264697066735822122007d18c37d8aec99eeec6d2ab9121c3793bac7a3af5fe95ec5a8994ee995b906964736f6c63430008180033", + "deployedBytecode": "0x608060405234801561000f575f80fd5b50600436106100a6575f3560e01c8063b2a3fda41161006e578063b2a3fda414610158578063b870676c1461016b578063dbac58211461017e578063f2fde38b14610195578063f437bc59146101a8578063faec91e0146101b0575f80fd5b80630f2d076d146100aa57806315d276e1146100ea5780635e280f1114610129578063715018a61461013e5780638da5cb5b14610148575b5f80fd5b6100bd6100b836600461136f565b6101e4565b604080519586526020860194909452928401919091526060830152608082015260a0015b60405180910390f35b6101117f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016100e1565b610131610773565b6040516100e1919061140b565b6101466107ff565b005b5f546001600160a01b0316610111565b61014661016636600461141d565b610812565b600354610111906001600160a01b031681565b61018760045481565b6040519081526020016100e1565b6101466101a3366004611434565b61081f565b610131610898565b6101876040516810d3d354131155115160ba1b60208201526029016040516020818303038152906040528051906020012081565b5f80808080336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146102665760405162461bcd60e51b815260206004820181905260248201527f4f6e6c792052616d702063616e2063616c6c20746869732066756e6374696f6e60448201526064015b60405180910390fd5b6102c386610274898061144d565b61027d90611533565b61028a60208b018b61168c565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152506108a592505050565b6040805180820190915260018152601560f91b6020820152610415906103c8906102ed8a8061144d565b6102fb90604081019061168c565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250506001805490925061033d91506116cf565b80601f0160208091040260200160405190810160405280929190818152602001828054610369906116cf565b80156103b45780601f1061038b576101008083540402835291602001916103b4565b820191905f5260205f20905b81548152906001019060200180831161039757829003601f168201915b50505050506108f19092919063ffffffff16565b6103d2898061144d565b6103dc908061168c565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061097192505050565b6104f660028054610425906116cf565b80601f0160208091040260200160405190810160405280929190818152602001828054610451906116cf565b801561049c5780601f106104735761010080835404028352916020019161049c565b820191905f5260205f20905b81548152906001019060200180831161047f57829003601f168201915b506104af93508c925082915061144d9050565b6104bd90602081019061168c565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250610a1092505050565b6040516810d3d354131155115160ba1b602082015260290160408051601f198184030181529190528051602090910120610530888061144d565b61053e9060c081019061168c565b60405160200161054f929190611707565b60405160208183030381529060405280519060200120146105be5760405162461bcd60e51b8152602060048201526024808201527f5061796d656e7420737461747573206e6f7420636f6e6669726d6564206173206044820152631cd95b9d60e21b606482015260840161025d565b6106056105cb888061144d565b6105d990604081019061168c565b6040516020016105ea929190611716565b60405160208183030381529060405280519060200120610aab565b610659610612888061144d565b61062090608081019061168c565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250610bbf92505050565b6004549095506103e86106ba5f6106708b8061144d565b61067e9060e081019061168c565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152509293925050610c3e9050565b6106c4919061174c565b6106ce919061176b565b93506106da878061144d565b6106e890606081019061168c565b6040516020016106f9929190611707565b60408051601f198184030181529190528051602090910120925061071d878061144d565b61072b9060a081019061168c565b60405160200161073c929190611707565b60408051601f1981840301815291905280516020909101209150610760878061144d565b61012001355f1b90509295509295909350565b60018054610780906116cf565b80601f01602080910402602001604051908101604052809291908181526020018280546107ac906116cf565b80156107f75780601f106107ce576101008083540402835291602001916107f7565b820191905f5260205f20905b8154815290600101906020018083116107da57829003601f168201915b505050505081565b610807610c4e565b6108105f610ca7565b565b61081a610c4e565b600455565b610827610c4e565b6001600160a01b03811661088c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161025d565b61089581610ca7565b50565b60028054610780906116cf565b6108b0838383610cf6565b6108ec5760405162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b210383937b7b360991b604482015260640161025d565b505050565b606083835f6109008383610d69565b90505f1981036109155786935050505061096a565b5f610921885f84610e38565b90505f61093c89855185610935919061176b565b8751610e38565b90508187826040516020016109539392919061177e565b604051602081830303815290604052955050505050505b9392505050565b80604051602001610982919061140b565b60405160208183030381529060405280519060200120826040516020016109a9919061140b565b6040516020818303038152906040528051906020012014610a0c5760405162461bcd60e51b815260206004820181905260248201527f456e64706f696e7420646f6573206e6f74206d61746368206578706563746564604482015260640161025d565b5050565b80604051602001610a21919061140b565b6040516020818303038152906040528051906020012082604051602001610a48919061140b565b6040516020818303038152906040528051906020012014610a0c5760405162461bcd60e51b815260206004820152601c60248201527f486f737420646f6573206e6f74206d6174636820657870656374656400000000604482015260640161025d565b60035460405163169394bb60e01b8152600481018390526001600160a01b039091169063169394bb90602401602060405180830381865afa158015610af2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b1691906117c0565b15610b635760405162461bcd60e51b815260206004820152601f60248201527f4e756c6c69666965722068617320616c7265616479206265656e207573656400604482015260640161025d565b600354604051632dea6f9960e11b8152600481018390526001600160a01b0390911690635bd4df32906024015f604051808303815f87803b158015610ba6575f80fd5b505af1158015610bb8573d5f803e3d5ffd5b5050505050565b5f815f81518110610bd257610bd26117df565b6020910101516001600160f81b031916602d60f81b14610c2d5760405162461bcd60e51b81526020600482015260166024820152752737ba10309039b2b732103a3930b739b0b1ba34b7b760511b604482015260640161025d565b610c38826006610c3e565b92915050565b5f61096a83601760f91b84610ef9565b5f546001600160a01b031633146108105760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161025d565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f80835f015184602001518560400151866060015187608001518860a001518960c001518a60e001518b61010001518c6101200151604051602001610d449a999897969594939291906117f3565b6040516020818303038152906040529050610d608184876110cb565b95945050505050565b805182515f91849184911115610d84575f1992505050610c38565b5f5b81518351610d9491906118ae565b8111610e2c5760015f5b8351811015610e0757838181518110610db957610db96117df565b01602001516001600160f81b03191685610dd3838661176b565b81518110610de357610de36117df565b01602001516001600160f81b03191614610dff575f9150610e07565b600101610d9e565b508015610e1957509250610c38915050565b5080610e24816118c1565b915050610d86565b505f1995945050505050565b6060835f610e4685856118ae565b67ffffffffffffffff811115610e5e57610e5e61146c565b6040519080825280601f01601f191660200182016040528015610e88576020820181803683370190505b509050845b84811015610eef57828181518110610ea757610ea76117df565b01602001516001600160f81b03191682610ec188846118ae565b81518110610ed157610ed16117df565b60200101906001600160f81b03191690815f1a905350600101610e8d565b5095945050505050565b5f83818080805b845181101561104457603060f81b858281518110610f2057610f206117df565b01602001516001600160f81b03191610801590610f615750603960f81b858281518110610f4f57610f4f6117df565b01602001516001600160f81b03191611155b15610fa4576030858281518110610f7a57610f7a6117df565b0160200151610f8c919060f81c6118ae565b610f9785600a6118d9565b610fa1919061176b565b93505b8115610fb85782610fb4816118c1565b9350505b876001600160f81b031916858281518110610fd557610fd56117df565b01602001516001600160f81b0319160361103c5781156110375760405162461bcd60e51b815260206004820152601c60248201527f537472696e6720686173206d756c7469706c6520646563696d616c7300000000604482015260640161025d565b600191505b600101610f00565b50858211156110a05760405162461bcd60e51b815260206004820152602260248201527f537472696e672068617320746f6f206d616e7920646563696d616c20706c6163604482015261657360f01b606482015260840161025d565b6110aa82876118ae565b6110b590600a6119d0565b6110bf90846118d9565b98975050505050505050565b825160208401207f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f908152601c91909152603c8120610d606001600160a01b03841682865f805f61111d858561116e565b90925090505f816004811115611135576111356119db565b1480156111535750856001600160a01b0316826001600160a01b0316145b8061116457506111648686866111b0565b9695505050505050565b5f8082516041036111a2576020830151604084015160608501515f1a61119687828585611297565b945094505050506111a9565b505f905060025b9250929050565b5f805f856001600160a01b0316631626ba7e60e01b86866040516024016111d89291906119ef565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b03199094169390931790925290516112169190611a0f565b5f60405180830381855afa9150503d805f811461124e576040519150601f19603f3d011682016040523d82523d5f602084013e611253565b606091505b509150915081801561126757506020815110155b801561116457508051630b135d3f60e11b9061128c9083016020908101908401611a20565b149695505050505050565b5f807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156112cc57505f9050600361134b565b604080515f8082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa15801561131d573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b038116611345575f6001925092505061134b565b91505f90505b94509492505050565b80356001600160a01b038116811461136a575f80fd5b919050565b5f8060408385031215611380575f80fd5b823567ffffffffffffffff811115611396575f80fd5b8301604081860312156113a7575f80fd5b91506113b560208401611354565b90509250929050565b5f5b838110156113d85781810151838201526020016113c0565b50505f910152565b5f81518084526113f78160208601602086016113be565b601f01601f19169290920160200192915050565b602081525f61096a60208301846113e0565b5f6020828403121561142d575f80fd5b5035919050565b5f60208284031215611444575f80fd5b61096a82611354565b5f823561013e19833603018112611462575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051610140810167ffffffffffffffff811182821017156114a4576114a461146c565b60405290565b5f82601f8301126114b9575f80fd5b813567ffffffffffffffff808211156114d4576114d461146c565b604051601f8301601f19908116603f011681019082821181831017156114fc576114fc61146c565b81604052838152866020858801011115611514575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f6101408236031215611544575f80fd5b61154c611480565b823567ffffffffffffffff80821115611563575f80fd5b61156f368387016114aa565b83526020850135915080821115611584575f80fd5b611590368387016114aa565b602084015260408501359150808211156115a8575f80fd5b6115b4368387016114aa565b604084015260608501359150808211156115cc575f80fd5b6115d8368387016114aa565b606084015260808501359150808211156115f0575f80fd5b6115fc368387016114aa565b608084015260a0850135915080821115611614575f80fd5b611620368387016114aa565b60a084015260c0850135915080821115611638575f80fd5b611644368387016114aa565b60c084015260e085013591508082111561165c575f80fd5b50611669368286016114aa565b60e083015250610100838101359082015261012092830135928101929092525090565b5f808335601e198436030181126116a1575f80fd5b83018035915067ffffffffffffffff8211156116bb575f80fd5b6020019150368190038213156111a9575f80fd5b600181811c908216806116e357607f821691505b60208210810361170157634e487b7160e01b5f52602260045260245ffd5b50919050565b818382375f9101908152919050565b6614995d9bdb1d5d60ca1b8152818360078301375f9101600701908152919050565b634e487b7160e01b5f52601160045260245ffd5b5f8261176657634e487b7160e01b5f52601260045260245ffd5b500490565b80820180821115610c3857610c38611738565b5f845161178f8184602089016113be565b8451908301906117a38183602089016113be565b84519101906117b68183602088016113be565b0195945050505050565b5f602082840312156117d0575f80fd5b8151801515811461096a575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f6101408083526118068184018e6113e0565b9050828103602084015261181a818d6113e0565b9050828103604084015261182e818c6113e0565b90508281036060840152611842818b6113e0565b90508281036080840152611856818a6113e0565b905082810360a084015261186a81896113e0565b905082810360c084015261187e81886113e0565b905082810360e084015261189281876113e0565b6101008401959095525050610120015298975050505050505050565b81810381811115610c3857610c38611738565b5f600182016118d2576118d2611738565b5060010190565b8082028115828204841417610c3857610c38611738565b600181815b8085111561192a57815f190482111561191057611910611738565b8085161561191d57918102915b93841c93908002906118f5565b509250929050565b5f8261194057506001610c38565b8161194c57505f610c38565b8160018114611962576002811461196c57611988565b6001915050610c38565b60ff84111561197d5761197d611738565b50506001821b610c38565b5060208310610133831016604e8410600b84101617156119ab575081810a610c38565b6119b583836118f0565b805f19048211156119c8576119c8611738565b029392505050565b5f61096a8383611932565b634e487b7160e01b5f52602160045260245ffd5b828152604060208201525f611a0760408301846113e0565b949350505050565b5f82516114628184602087016113be565b5f60208284031215611a30575f80fd5b505191905056fea264697066735822122007d18c37d8aec99eeec6d2ab9121c3793bac7a3af5fe95ec5a8994ee995b906964736f6c63430008180033", + "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." + }, + "setTimestampBuffer(uint256)": { + "params": { + "_timestampBuffer": "The timestamp buffer for validated TLS calls" + } + }, + "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": { + "setTimestampBuffer(uint256)": { + "notice": "ONLY OWNER: Sets the timestamp buffer for validated TLS calls. 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/ramps/revolut/RevolutSendProcessor.sol:RevolutSendProcessor", + "label": "_owner", + "offset": 0, + "slot": "0", + "type": "t_address" + }, + { + "astId": 6237, + "contract": "contracts/ramps/revolut/RevolutSendProcessor.sol:RevolutSendProcessor", + "label": "endpoint", + "offset": 0, + "slot": "1", + "type": "t_string_storage" + }, + { + "astId": 6239, + "contract": "contracts/ramps/revolut/RevolutSendProcessor.sol:RevolutSendProcessor", + "label": "host", + "offset": 0, + "slot": "2", + "type": "t_string_storage" + }, + { + "astId": 6242, + "contract": "contracts/ramps/revolut/RevolutSendProcessor.sol:RevolutSendProcessor", + "label": "nullifierRegistry", + "offset": 0, + "slot": "3", + "type": "t_contract(INullifierRegistry)6636" + }, + { + "astId": 6244, + "contract": "contracts/ramps/revolut/RevolutSendProcessor.sol:RevolutSendProcessor", + "label": "timestampBuffer", + "offset": 0, + "slot": "4", + "type": "t_uint256" + } + ], + "types": { + "t_address": { + "encoding": "inplace", + "label": "address", + "numberOfBytes": "20" + }, + "t_contract(INullifierRegistry)6636": { + "encoding": "inplace", + "label": "contract INullifierRegistry", + "numberOfBytes": "20" + }, + "t_string_storage": { + "encoding": "bytes", + "label": "string", + "numberOfBytes": "32" + }, + "t_uint256": { + "encoding": "inplace", + "label": "uint256", + "numberOfBytes": "32" + } + } + } +} \ No newline at end of file diff --git a/contracts/deployments/encifher/USDCMock.json b/contracts/deployments/encifher/USDCMock.json new file mode 100644 index 000000000..2d38b891b --- /dev/null +++ b/contracts/deployments/encifher/USDCMock.json @@ -0,0 +1,464 @@ +{ + "address": "0x04fc820176617A99AE134904935Bc854b2e51628", + "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" + } + ], + "transactionHash": "0x876ba60e6c1490d10a054c7fae0aa290dffa432a851deb4d1487b50ca5a53fd3", + "receipt": { + "to": null, + "from": "0xa0Ee7A142d267C1f36714E4a8F75612F20a79720", + "contractAddress": "0x04fc820176617A99AE134904935Bc854b2e51628", + "transactionIndex": 0, + "gasUsed": "537801", + "logsBloom": "0x00000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000008000000000000000000020000000000000000002800000000000000000000000010000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000004000000020000000000000000000000000004000000000000000000000000000000000000000", + "blockHash": "0xa6261d0b004480258fcf7d8be36726434fc0abd3b9789b2a7295bbba08dcc9de", + "transactionHash": "0x876ba60e6c1490d10a054c7fae0aa290dffa432a851deb4d1487b50ca5a53fd3", + "logs": [ + { + "transactionIndex": 0, + "blockNumber": 61351, + "transactionHash": "0x876ba60e6c1490d10a054c7fae0aa290dffa432a851deb4d1487b50ca5a53fd3", + "address": "0x04fc820176617A99AE134904935Bc854b2e51628", + "topics": [ + "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x000000000000000000000000a0ee7a142d267c1f36714e4a8f75612f20a79720" + ], + "data": "0x000000000000000000000000000000000000000000000000000000e8d4a51000", + "logIndex": 0, + "blockHash": "0xa6261d0b004480258fcf7d8be36726434fc0abd3b9789b2a7295bbba08dcc9de" + } + ], + "blockNumber": 61351, + "cumulativeGasUsed": "537801", + "status": 1, + "byzantium": true + }, + "args": [ + "1000000000000", + "USDC", + "USDC" + ], + "numDeployments": 1, + "solcInputHash": "75b8f55da346d7ed99a350632554d2fb", + "metadata": "{\"compiler\":{\"version\":\"0.8.24+commit.e11b9ed9\"},\"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\":\"shanghai\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"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 v4.4.1 (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\",\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"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": "0x608060405234801562000010575f80fd5b5060405162000c2238038062000c228339810160408190526200003391620001fa565b81816003620000438382620002f2565b506004620000528282620002f2565b5050506200006733846200007060201b60201c565b505050620003e4565b6001600160a01b038216620000cb5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640160405180910390fd5b8060025f828254620000de9190620003be565b90915550506001600160a01b0382165f81815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b505050565b634e487b7160e01b5f52604160045260245ffd5b5f82601f8301126200015d575f80fd5b81516001600160401b03808211156200017a576200017a62000139565b604051601f8301601f19908116603f01168101908282118183101715620001a557620001a562000139565b8160405283815260209250866020858801011115620001c2575f80fd5b5f91505b83821015620001e55785820183015181830184015290820190620001c6565b5f602085830101528094505050505092915050565b5f805f606084860312156200020d575f80fd5b835160208501519093506001600160401b03808211156200022c575f80fd5b6200023a878388016200014d565b9350604086015191508082111562000250575f80fd5b506200025f868287016200014d565b9150509250925092565b600181811c908216806200027e57607f821691505b6020821081036200029d57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f8211156200013457805f5260205f20601f840160051c81016020851015620002ca5750805b601f840160051c820191505b81811015620002eb575f8155600101620002d6565b5050505050565b81516001600160401b038111156200030e576200030e62000139565b62000326816200031f845462000269565b84620002a3565b602080601f8311600181146200035c575f8415620003445750858301515b5f19600386901b1c1916600185901b178555620003b6565b5f85815260208120601f198616915b828110156200038c578886015182559484019460019091019084016200036b565b5085821015620003aa57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b80820180821115620003de57634e487b7160e01b5f52601160045260245ffd5b92915050565b61083080620003f25f395ff3fe608060405234801561000f575f80fd5b50600436106100a6575f3560e01c8063395093511161006e578063395093511461011f57806370a082311461013257806395d89b411461015a578063a457c2d714610162578063a9059cbb14610175578063dd62ed3e14610188575f80fd5b806306fdde03146100aa578063095ea7b3146100c857806318160ddd146100eb57806323b872dd146100fd578063313ce56714610110575b5f80fd5b6100b261019b565b6040516100bf919061068a565b60405180910390f35b6100db6100d63660046106f1565b61022b565b60405190151581526020016100bf565b6002545b6040519081526020016100bf565b6100db61010b366004610719565b610244565b604051600681526020016100bf565b6100db61012d3660046106f1565b610267565b6100ef610140366004610752565b6001600160a01b03165f9081526020819052604090205490565b6100b2610288565b6100db6101703660046106f1565b610297565b6100db6101833660046106f1565b610316565b6100ef610196366004610772565b610323565b6060600380546101aa906107a3565b80601f01602080910402602001604051908101604052809291908181526020018280546101d6906107a3565b80156102215780601f106101f857610100808354040283529160200191610221565b820191905f5260205f20905b81548152906001019060200180831161020457829003601f168201915b5050505050905090565b5f3361023881858561034d565b60019150505b92915050565b5f33610251858285610470565b61025c8585856104e8565b506001949350505050565b5f336102388185856102798383610323565b61028391906107db565b61034d565b6060600480546101aa906107a3565b5f33816102a48286610323565b9050838110156103095760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084015b60405180910390fd5b61025c828686840361034d565b5f336102388185856104e8565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b6001600160a01b0383166103af5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610300565b6001600160a01b0382166104105760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610300565b6001600160a01b038381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b5f61047b8484610323565b90505f1981146104e257818110156104d55760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610300565b6104e2848484840361034d565b50505050565b6001600160a01b03831661054c5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610300565b6001600160a01b0382166105ae5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610300565b6001600160a01b0383165f90815260208190526040902054818110156106255760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610300565b6001600160a01b038481165f81815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a36104e2565b5f602080835283518060208501525f5b818110156106b65785810183015185820160400152820161069a565b505f604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b03811681146106ec575f80fd5b919050565b5f8060408385031215610702575f80fd5b61070b836106d6565b946020939093013593505050565b5f805f6060848603121561072b575f80fd5b610734846106d6565b9250610742602085016106d6565b9150604084013590509250925092565b5f60208284031215610762575f80fd5b61076b826106d6565b9392505050565b5f8060408385031215610783575f80fd5b61078c836106d6565b915061079a602084016106d6565b90509250929050565b600181811c908216806107b757607f821691505b6020821081036107d557634e487b7160e01b5f52602260045260245ffd5b50919050565b8082018082111561023e57634e487b7160e01b5f52601160045260245ffdfea26469706673582212207b6c52913f5c1603957955e3faa91b6917405ac458e3eebd53c39827b844c73464736f6c63430008180033", + "deployedBytecode": "0x608060405234801561000f575f80fd5b50600436106100a6575f3560e01c8063395093511161006e578063395093511461011f57806370a082311461013257806395d89b411461015a578063a457c2d714610162578063a9059cbb14610175578063dd62ed3e14610188575f80fd5b806306fdde03146100aa578063095ea7b3146100c857806318160ddd146100eb57806323b872dd146100fd578063313ce56714610110575b5f80fd5b6100b261019b565b6040516100bf919061068a565b60405180910390f35b6100db6100d63660046106f1565b61022b565b60405190151581526020016100bf565b6002545b6040519081526020016100bf565b6100db61010b366004610719565b610244565b604051600681526020016100bf565b6100db61012d3660046106f1565b610267565b6100ef610140366004610752565b6001600160a01b03165f9081526020819052604090205490565b6100b2610288565b6100db6101703660046106f1565b610297565b6100db6101833660046106f1565b610316565b6100ef610196366004610772565b610323565b6060600380546101aa906107a3565b80601f01602080910402602001604051908101604052809291908181526020018280546101d6906107a3565b80156102215780601f106101f857610100808354040283529160200191610221565b820191905f5260205f20905b81548152906001019060200180831161020457829003601f168201915b5050505050905090565b5f3361023881858561034d565b60019150505b92915050565b5f33610251858285610470565b61025c8585856104e8565b506001949350505050565b5f336102388185856102798383610323565b61028391906107db565b61034d565b6060600480546101aa906107a3565b5f33816102a48286610323565b9050838110156103095760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084015b60405180910390fd5b61025c828686840361034d565b5f336102388185856104e8565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b6001600160a01b0383166103af5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610300565b6001600160a01b0382166104105760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610300565b6001600160a01b038381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b5f61047b8484610323565b90505f1981146104e257818110156104d55760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610300565b6104e2848484840361034d565b50505050565b6001600160a01b03831661054c5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610300565b6001600160a01b0382166105ae5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610300565b6001600160a01b0383165f90815260208190526040902054818110156106255760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610300565b6001600160a01b038481165f81815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a36104e2565b5f602080835283518060208501525f5b818110156106b65785810183015185820160400152820161069a565b505f604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b03811681146106ec575f80fd5b919050565b5f8060408385031215610702575f80fd5b61070b836106d6565b946020939093013593505050565b5f805f6060848603121561072b575f80fd5b610734846106d6565b9250610742602085016106d6565b9150604084013590509250925092565b5f60208284031215610762575f80fd5b61076b826106d6565b9392505050565b5f8060408385031215610783575f80fd5b61078c836106d6565b915061079a602084016106d6565b90509250929050565b600181811c908216806107b757607f821691505b6020821081036107d557634e487b7160e01b5f52602260045260245ffd5b50919050565b8082018082111561023e57634e487b7160e01b5f52601160045260245ffdfea26469706673582212207b6c52913f5c1603957955e3faa91b6917405ac458e3eebd53c39827b844c73464736f6c63430008180033", + "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 + }, + "storageLayout": { + "storage": [ + { + "astId": 225, + "contract": "contracts/mocks/USDCMock.sol:USDCMock", + "label": "_balances", + "offset": 0, + "slot": "0", + "type": "t_mapping(t_address,t_uint256)" + }, + { + "astId": 231, + "contract": "contracts/mocks/USDCMock.sol:USDCMock", + "label": "_allowances", + "offset": 0, + "slot": "1", + "type": "t_mapping(t_address,t_mapping(t_address,t_uint256))" + }, + { + "astId": 233, + "contract": "contracts/mocks/USDCMock.sol:USDCMock", + "label": "_totalSupply", + "offset": 0, + "slot": "2", + "type": "t_uint256" + }, + { + "astId": 235, + "contract": "contracts/mocks/USDCMock.sol:USDCMock", + "label": "_name", + "offset": 0, + "slot": "3", + "type": "t_string_storage" + }, + { + "astId": 237, + "contract": "contracts/mocks/USDCMock.sol:USDCMock", + "label": "_symbol", + "offset": 0, + "slot": "4", + "type": "t_string_storage" + } + ], + "types": { + "t_address": { + "encoding": "inplace", + "label": "address", + "numberOfBytes": "20" + }, + "t_mapping(t_address,t_mapping(t_address,t_uint256))": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => mapping(address => uint256))", + "numberOfBytes": "32", + "value": "t_mapping(t_address,t_uint256)" + }, + "t_mapping(t_address,t_uint256)": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => uint256)", + "numberOfBytes": "32", + "value": "t_uint256" + }, + "t_string_storage": { + "encoding": "bytes", + "label": "string", + "numberOfBytes": "32" + }, + "t_uint256": { + "encoding": "inplace", + "label": "uint256", + "numberOfBytes": "32" + } + } + } +} \ No newline at end of file diff --git a/contracts/deployments/encifher/VenmoManagedKeyHashAdapter.json b/contracts/deployments/encifher/VenmoManagedKeyHashAdapter.json new file mode 100644 index 000000000..c07cd2ecf --- /dev/null +++ b/contracts/deployments/encifher/VenmoManagedKeyHashAdapter.json @@ -0,0 +1,185 @@ +{ + "address": "0x4e85DC48a70DA1298489d5B6FC2492767d98f384", + "abi": [ + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_mailserverKeyHash", + "type": "bytes32" + } + ], + "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": "mailserverKeyHash", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_mailserverKeyHash", + "type": "bytes32" + } + ], + "name": "setMailserverKeyHash", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "transactionHash": "0x7dc4913ba74d23f7607b2c0e271cd6a97770ce2c0222ed02305045081ef4c2b6", + "receipt": { + "to": null, + "from": "0xa0Ee7A142d267C1f36714E4a8F75612F20a79720", + "contractAddress": "0x4e85DC48a70DA1298489d5B6FC2492767d98f384", + "transactionIndex": 0, + "gasUsed": "190490", + "logsBloom": "0x00000000000000000000040000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000008000010000000080000020000000000000000000800000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000004000000020000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0x9e34da38a229b88af0f6d78023ff77c1c9a8ccd7353e46d2ea2cf2167f2fb1f9", + "transactionHash": "0x7dc4913ba74d23f7607b2c0e271cd6a97770ce2c0222ed02305045081ef4c2b6", + "logs": [ + { + "transactionIndex": 0, + "blockNumber": 61355, + "transactionHash": "0x7dc4913ba74d23f7607b2c0e271cd6a97770ce2c0222ed02305045081ef4c2b6", + "address": "0x4e85DC48a70DA1298489d5B6FC2492767d98f384", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x000000000000000000000000a0ee7a142d267c1f36714e4a8f75612f20a79720" + ], + "data": "0x", + "logIndex": 0, + "blockHash": "0x9e34da38a229b88af0f6d78023ff77c1c9a8ccd7353e46d2ea2cf2167f2fb1f9" + } + ], + "blockNumber": 61355, + "cumulativeGasUsed": "190490", + "status": 1, + "byzantium": true + }, + "args": [ + "0x2ea3f223adbee4865e0cbfa3a6e748b1505a0094fd92c53d3d0dd2d4b0cd19d3" + ], + "numDeployments": 1, + "solcInputHash": "75b8f55da346d7ed99a350632554d2fb", + "metadata": "{\"compiler\":{\"version\":\"0.8.24+commit.e11b9ed9\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_mailserverKeyHash\",\"type\":\"bytes32\"}],\"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\":\"mailserverKeyHash\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_mailserverKeyHash\",\"type\":\"bytes32\"}],\"name\":\"setMailserverKeyHash\",\"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/processors/keyHashAdapters/ManagedKeyHashAdapter.sol\":\"ManagedKeyHashAdapter\"},\"evmVersion\":\"shanghai\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"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 v4.4.1 (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\",\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"license\":\"MIT\"},\"contracts/processors/keyHashAdapters/IKeyHashAdapter.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.18;\\n\\ninterface IKeyHashAdapter {\\n function setMailserverKeyHash(bytes32 _mailserverKeyHash) external;\\n function mailserverKeyHash() external view returns (bytes32);\\n}\\n\",\"keccak256\":\"0xb009a89c52a6e84972852d8c9e60758ca45aca9ac301268fb738459a91090873\",\"license\":\"MIT\"},\"contracts/processors/keyHashAdapters/ManagedKeyHashAdapter.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\n\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\nimport { IKeyHashAdapter } from \\\"./IKeyHashAdapter.sol\\\";\\n\\npragma solidity ^0.8.18;\\n\\ncontract ManagedKeyHashAdapter is Ownable, IKeyHashAdapter {\\n \\n /* ============ State Variables ============ */\\n\\n bytes32 public mailserverKeyHash;\\n\\n /* ============ Constructor ============ */\\n\\n constructor(\\n bytes32 _mailserverKeyHash\\n )\\n Ownable()\\n {\\n mailserverKeyHash = _mailserverKeyHash;\\n }\\n\\n /* ============ External Functions ============ */\\n\\n function setMailserverKeyHash(bytes32 _mailserverKeyHash) external onlyOwner {\\n mailserverKeyHash = _mailserverKeyHash;\\n }\\n}\\n\",\"keccak256\":\"0x348720e86ab8fd55374953f267d674884f0cbfd3a612859dae5988363bd71c5c\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x608060405234801561000f575f80fd5b5060405161033138038061033183398101604081905261002e9161008e565b6100373361003f565b6001556100a5565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f6020828403121561009e575f80fd5b5051919050565b61027f806100b25f395ff3fe608060405234801561000f575f80fd5b5060043610610055575f3560e01c806336406e6414610059578063715018a6146100755780638da5cb5b1461007f5780638f06c5df14610099578063f2fde38b146100ac575b5f80fd5b61006260015481565b6040519081526020015b60405180910390f35b61007d6100bf565b005b5f546040516001600160a01b03909116815260200161006c565b61007d6100a7366004610205565b6100d2565b61007d6100ba36600461021c565b6100df565b6100c761015d565b6100d05f6101b6565b565b6100da61015d565b600155565b6100e761015d565b6001600160a01b0381166101515760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b61015a816101b6565b50565b5f546001600160a01b031633146100d05760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610148565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f60208284031215610215575f80fd5b5035919050565b5f6020828403121561022c575f80fd5b81356001600160a01b0381168114610242575f80fd5b939250505056fea26469706673582212200be6ba4c84754329576d13be98c31a501ecd675dcf7b4f2a3dde48171bb33f0264736f6c63430008180033", + "deployedBytecode": "0x608060405234801561000f575f80fd5b5060043610610055575f3560e01c806336406e6414610059578063715018a6146100755780638da5cb5b1461007f5780638f06c5df14610099578063f2fde38b146100ac575b5f80fd5b61006260015481565b6040519081526020015b60405180910390f35b61007d6100bf565b005b5f546040516001600160a01b03909116815260200161006c565b61007d6100a7366004610205565b6100d2565b61007d6100ba36600461021c565b6100df565b6100c761015d565b6100d05f6101b6565b565b6100da61015d565b600155565b6100e761015d565b6001600160a01b0381166101515760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b61015a816101b6565b50565b5f546001600160a01b031633146100d05760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610148565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f60208284031215610215575f80fd5b5035919050565b5f6020828403121561022c575f80fd5b81356001600160a01b0381168114610242575f80fd5b939250505056fea26469706673582212200be6ba4c84754329576d13be98c31a501ecd675dcf7b4f2a3dde48171bb33f0264736f6c63430008180033", + "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/processors/keyHashAdapters/ManagedKeyHashAdapter.sol:ManagedKeyHashAdapter", + "label": "_owner", + "offset": 0, + "slot": "0", + "type": "t_address" + }, + { + "astId": 6443, + "contract": "contracts/processors/keyHashAdapters/ManagedKeyHashAdapter.sol:ManagedKeyHashAdapter", + "label": "mailserverKeyHash", + "offset": 0, + "slot": "1", + "type": "t_bytes32" + } + ], + "types": { + "t_address": { + "encoding": "inplace", + "label": "address", + "numberOfBytes": "20" + }, + "t_bytes32": { + "encoding": "inplace", + "label": "bytes32", + "numberOfBytes": "32" + } + } + } +} \ No newline at end of file diff --git a/contracts/deployments/encifher/VenmoManagedKeyHashAdapterV2.json b/contracts/deployments/encifher/VenmoManagedKeyHashAdapterV2.json new file mode 100644 index 000000000..f50abc208 --- /dev/null +++ b/contracts/deployments/encifher/VenmoManagedKeyHashAdapterV2.json @@ -0,0 +1,290 @@ +{ + "address": "0xa7B987f505366630109De019862c183E690a040B", + "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": "0x73c966e53dcf155102a6f6ce0edd4d735cf49278750cc239b81886d3babe4adc", + "receipt": { + "to": null, + "from": "0xa0Ee7A142d267C1f36714E4a8F75612F20a79720", + "contractAddress": "0xa7B987f505366630109De019862c183E690a040B", + "transactionIndex": 0, + "gasUsed": "475657", + "logsBloom": "0x00000000000000000000040000000000000000000000000000800000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000800000000000000000001000000000000000008000000000000000000020000000000000000000800000000000000000000000000000000400000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000020000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0x500bd40a678951067b604126dcb0d4a0a36f9e18cb05a6eb32cfc5dd62a297af", + "transactionHash": "0x73c966e53dcf155102a6f6ce0edd4d735cf49278750cc239b81886d3babe4adc", + "logs": [ + { + "transactionIndex": 0, + "blockNumber": 61380, + "transactionHash": "0x73c966e53dcf155102a6f6ce0edd4d735cf49278750cc239b81886d3babe4adc", + "address": "0xa7B987f505366630109De019862c183E690a040B", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x000000000000000000000000a0ee7a142d267c1f36714e4a8f75612f20a79720" + ], + "data": "0x", + "logIndex": 0, + "blockHash": "0x500bd40a678951067b604126dcb0d4a0a36f9e18cb05a6eb32cfc5dd62a297af" + } + ], + "blockNumber": 61380, + "cumulativeGasUsed": "475657", + "status": 1, + "byzantium": true + }, + "args": [ + [ + "0x2ea3f223adbee4865e0cbfa3a6e748b1505a0094fd92c53d3d0dd2d4b0cd19d3" + ] + ], + "numDeployments": 1, + "solcInputHash": "75b8f55da346d7ed99a350632554d2fb", + "metadata": "{\"compiler\":{\"version\":\"0.8.24+commit.e11b9ed9\"},\"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/processors/keyHashAdapters/ManagedKeyHashAdapterV2.sol\":\"ManagedKeyHashAdapterV2\"},\"evmVersion\":\"shanghai\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"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 v4.4.1 (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\",\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"license\":\"MIT\"},\"contracts/external/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/processors/keyHashAdapters/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/processors/keyHashAdapters/ManagedKeyHashAdapterV2.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\n\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\nimport { IKeyHashAdapterV2 } from \\\"./IKeyHashAdapterV2.sol\\\";\\nimport { Bytes32ArrayUtils } from \\\"../../external/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\":\"0xb508d88dca3849e44c40adf29466772b5e6368e0b2eabad5652961344c72f58c\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x608060405234801561000f575f80fd5b5060405161096a38038061096a83398101604081905261002e91610183565b61003733610120565b5f5b8151811015610119575f8282815181106100555761005561023b565b6020908102919091018101515f818152600190925260409091205490915060ff16156100c75760405162461bcd60e51b815260206004820152601660248201527f4b6579206861736820616c726561647920616464656400000000000000000000604482015260640160405180910390fd5b5f8181526001602081905260408220805460ff19168217905560028054808301825592527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace9091019190915501610039565b505061024f565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b634e487b7160e01b5f52604160045260245ffd5b5f6020808385031215610194575f80fd5b82516001600160401b03808211156101aa575f80fd5b818501915085601f8301126101bd575f80fd5b8151818111156101cf576101cf61016f565b8060051b604051601f19603f830116810181811085821117156101f4576101f461016f565b604052918252848201925083810185019188831115610211575f80fd5b938501935b8285101561022f57845184529385019392850192610216565b98975050505050505050565b634e487b7160e01b5f52603260045260245ffd5b61070e8061025c5f395ff3fe608060405234801561000f575f80fd5b5060043610610085575f3560e01c80638da5cb5b116100585780638da5cb5b146100f2578063a26c04ee1461010c578063b86e2d721461011f578063f2fde38b14610140575f80fd5b806319d091521461008957806361ba662a146100c0578063687bc0ab146100d5578063715018a6146100ea575b5f80fd5b6100ab610097366004610604565b60016020525f908152604090205460ff1681565b60405190151581526020015b60405180910390f35b6100d36100ce366004610604565b610153565b005b6100dd61023d565b6040516100b7919061061b565b6100d3610293565b5f546040516001600160a01b0390911681526020016100b7565b6100d361011a366004610604565b6102a6565b61013261012d366004610604565b610350565b6040519081526020016100b7565b6100d361014e36600461065e565b61036f565b61015b6103e8565b5f8181526001602052604090205460ff16156101b75760405162461bcd60e51b815260206004820152601660248201527512d95e481a185cda08185b1c9958591e48185919195960521b60448201526064015b60405180910390fd5b5f818152600160208190526040808320805460ff1916831790556002805492830181559092527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace01829055517fc1674d5f4b3c1397f7aad948ab8fb7adfb24a8f170f8c07349d880c342da030b906102329083815260200190565b60405180910390a150565b6060600280548060200260200160405190810160405280929190818152602001828054801561028957602002820191905f5260205f20905b815481526020019060010190808311610275575b5050505050905090565b61029b6103e8565b6102a45f610441565b565b6102ae6103e8565b5f8181526001602052604090205460ff166103005760405162461bcd60e51b815260206004820152601260248201527112d95e481a185cda081b9bdd08185919195960721b60448201526064016101ae565b5f818152600160205260409020805460ff19169055610320600282610490565b6040518181527f57f03401c03965ea5770efca656f696bdaa598efbaa2c899de9c70749634fabd90602001610232565b6002818154811061035f575f80fd5b5f91825260209091200154905081565b6103776103e8565b6001600160a01b0381166103dc5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016101ae565b6103e581610441565b50565b5f546001600160a01b031633146102a45760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016101ae565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f806104e9848054806020026020016040519081016040528092919081815260200182805480156104de57602002820191905f5260205f20905b8154815260200190600101908083116104ca575b5050505050846105ae565b91509150806105325760405162461bcd60e51b8152602060048201526015602482015274313cba32b99999103737ba1034b71030b93930bc9760591b60448201526064016101ae565b83545f906105429060019061068b565b90508083146105845784818154811061055d5761055d6106b0565b905f5260205f200154858481548110610578576105786106b0565b5f918252602090912001555b84805480610594576105946106c4565b600190038181905f5260205f20015f905590555050505050565b81515f908190815b818110156105f357848682815181106105d1576105d16106b0565b6020026020010151036105eb579250600191506105fd9050565b6001016105b6565b505f195f92509250505b9250929050565b5f60208284031215610614575f80fd5b5035919050565b602080825282518282018190525f9190848201906040850190845b8181101561065257835183529284019291840191600101610636565b50909695505050505050565b5f6020828403121561066e575f80fd5b81356001600160a01b0381168114610684575f80fd5b9392505050565b818103818111156106aa57634e487b7160e01b5f52601160045260245ffd5b92915050565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52603160045260245ffdfea2646970667358221220ab41a7f4861f5df1c1f6a360281ac8bbfe83cb487622b9bc8e87526525d04f8764736f6c63430008180033", + "deployedBytecode": "0x608060405234801561000f575f80fd5b5060043610610085575f3560e01c80638da5cb5b116100585780638da5cb5b146100f2578063a26c04ee1461010c578063b86e2d721461011f578063f2fde38b14610140575f80fd5b806319d091521461008957806361ba662a146100c0578063687bc0ab146100d5578063715018a6146100ea575b5f80fd5b6100ab610097366004610604565b60016020525f908152604090205460ff1681565b60405190151581526020015b60405180910390f35b6100d36100ce366004610604565b610153565b005b6100dd61023d565b6040516100b7919061061b565b6100d3610293565b5f546040516001600160a01b0390911681526020016100b7565b6100d361011a366004610604565b6102a6565b61013261012d366004610604565b610350565b6040519081526020016100b7565b6100d361014e36600461065e565b61036f565b61015b6103e8565b5f8181526001602052604090205460ff16156101b75760405162461bcd60e51b815260206004820152601660248201527512d95e481a185cda08185b1c9958591e48185919195960521b60448201526064015b60405180910390fd5b5f818152600160208190526040808320805460ff1916831790556002805492830181559092527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace01829055517fc1674d5f4b3c1397f7aad948ab8fb7adfb24a8f170f8c07349d880c342da030b906102329083815260200190565b60405180910390a150565b6060600280548060200260200160405190810160405280929190818152602001828054801561028957602002820191905f5260205f20905b815481526020019060010190808311610275575b5050505050905090565b61029b6103e8565b6102a45f610441565b565b6102ae6103e8565b5f8181526001602052604090205460ff166103005760405162461bcd60e51b815260206004820152601260248201527112d95e481a185cda081b9bdd08185919195960721b60448201526064016101ae565b5f818152600160205260409020805460ff19169055610320600282610490565b6040518181527f57f03401c03965ea5770efca656f696bdaa598efbaa2c899de9c70749634fabd90602001610232565b6002818154811061035f575f80fd5b5f91825260209091200154905081565b6103776103e8565b6001600160a01b0381166103dc5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016101ae565b6103e581610441565b50565b5f546001600160a01b031633146102a45760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016101ae565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f806104e9848054806020026020016040519081016040528092919081815260200182805480156104de57602002820191905f5260205f20905b8154815260200190600101908083116104ca575b5050505050846105ae565b91509150806105325760405162461bcd60e51b8152602060048201526015602482015274313cba32b99999103737ba1034b71030b93930bc9760591b60448201526064016101ae565b83545f906105429060019061068b565b90508083146105845784818154811061055d5761055d6106b0565b905f5260205f200154858481548110610578576105786106b0565b5f918252602090912001555b84805480610594576105946106c4565b600190038181905f5260205f20015f905590555050505050565b81515f908190815b818110156105f357848682815181106105d1576105d16106b0565b6020026020010151036105eb579250600191506105fd9050565b6001016105b6565b505f195f92509250505b9250929050565b5f60208284031215610614575f80fd5b5035919050565b602080825282518282018190525f9190848201906040850190845b8181101561065257835183529284019291840191600101610636565b50909695505050505050565b5f6020828403121561066e575f80fd5b81356001600160a01b0381168114610684575f80fd5b9392505050565b818103818111156106aa57634e487b7160e01b5f52601160045260245ffd5b92915050565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52603160045260245ffdfea2646970667358221220ab41a7f4861f5df1c1f6a360281ac8bbfe83cb487622b9bc8e87526525d04f8764736f6c63430008180033", + "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/processors/keyHashAdapters/ManagedKeyHashAdapterV2.sol:ManagedKeyHashAdapterV2", + "label": "_owner", + "offset": 0, + "slot": "0", + "type": "t_address" + }, + { + "astId": 6496, + "contract": "contracts/processors/keyHashAdapters/ManagedKeyHashAdapterV2.sol:ManagedKeyHashAdapterV2", + "label": "isMailServerKeyHash", + "offset": 0, + "slot": "1", + "type": "t_mapping(t_bytes32,t_bool)" + }, + { + "astId": 6499, + "contract": "contracts/processors/keyHashAdapters/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/deployments/encifher/VenmoRampV2.json b/contracts/deployments/encifher/VenmoRampV2.json new file mode 100644 index 000000000..974329765 --- /dev/null +++ b/contracts/deployments/encifher/VenmoRampV2.json @@ -0,0 +1,2043 @@ +{ + "address": "0x67f65B834aaAc92C15c2EBa9FF7E81f2d33a1cFD", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "internalType": "contract IRamp", + "name": "_ramp", + "type": "address" + }, + { + "internalType": "contract IERC20", + "name": "_usdc", + "type": "address" + }, + { + "internalType": "contract IPoseidon", + "name": "_poseidon", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_minDepositAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_maxOnRampAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_intentExpirationPeriod", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_onRampCooldownPeriod", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_sustainabilityFee", + "type": "uint256" + }, + { + "internalType": "address", + "name": "_sustainabilityFeeRecipient", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "accountOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "venmoIdHash", + "type": "bytes32" + } + ], + "name": "AccountRegistered", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "depositId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "address", + "name": "depositor", + "type": "address" + } + ], + "name": "DepositClosed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "depositId", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "venmoId", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "conversionRate", + "type": "uint256" + } + ], + "name": "DepositReceived", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "depositId", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "address", + "name": "depositor", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "DepositWithdrawn", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "intentExpirationPeriod", + "type": "uint256" + } + ], + "name": "IntentExpirationPeriodSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "intentHash", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "depositId", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "address", + "name": "onRamper", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "feeAmount", + "type": "uint256" + } + ], + "name": "IntentFulfilled", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "intentHash", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "depositId", + "type": "uint256" + } + ], + "name": "IntentPruned", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "intentHash", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "depositId", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "venmoId", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "timestamp", + "type": "uint256" + } + ], + "name": "IntentSignaled", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "maxOnRampAmount", + "type": "uint256" + } + ], + "name": "MaxOnRampAmountSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "minDepositAmount", + "type": "uint256" + } + ], + "name": "MinDepositAmountSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "receiveProcessor", + "type": "address" + } + ], + "name": "NewReceiveProcessorSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "registrationProcessor", + "type": "address" + } + ], + "name": "NewRegistrationProcessorSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "sendProcessor", + "type": "address" + } + ], + "name": "NewSendProcessorSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "onRampCooldownPeriod", + "type": "uint256" + } + ], + "name": "OnRampCooldownPeriodSet", + "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": "feeRecipient", + "type": "address" + } + ], + "name": "SustainabilityFeeRecipientUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "fee", + "type": "uint256" + } + ], + "name": "SustainabilityFeeUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bytes32", + "name": "listOwner", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "deniedUser", + "type": "bytes32" + } + ], + "name": "UserAddedToDenylist", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bytes32", + "name": "listOwner", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "approvedUser", + "type": "bytes32" + } + ], + "name": "UserRemovedFromDenylist", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_deniedUser", + "type": "bytes32" + } + ], + "name": "addAccountToDenylist", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_intentHash", + "type": "bytes32" + } + ], + "name": "cancelIntent", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "depositCounter", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "deposits", + "outputs": [ + { + "internalType": "address", + "name": "depositor", + "type": "address" + }, + { + "internalType": "uint256", + "name": "depositAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "remainingDeposits", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "outstandingIntentAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "conversionRate", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_account", + "type": "address" + } + ], + "name": "getAccountDeposits", + "outputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "depositId", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "depositorIdHash", + "type": "bytes32" + }, + { + "components": [ + { + "internalType": "address", + "name": "depositor", + "type": "address" + }, + { + "internalType": "uint256[3]", + "name": "packedVenmoId", + "type": "uint256[3]" + }, + { + "internalType": "uint256", + "name": "depositAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "remainingDeposits", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "outstandingIntentAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "conversionRate", + "type": "uint256" + }, + { + "internalType": "bytes32[]", + "name": "intentHashes", + "type": "bytes32[]" + } + ], + "internalType": "struct VenmoRampV2.Deposit", + "name": "deposit", + "type": "tuple" + }, + { + "internalType": "uint256", + "name": "availableLiquidity", + "type": "uint256" + } + ], + "internalType": "struct VenmoRampV2.DepositWithAvailableLiquidity[]", + "name": "accountDeposits", + "type": "tuple[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_account", + "type": "address" + } + ], + "name": "getAccountInfo", + "outputs": [ + { + "components": [ + { + "internalType": "bytes32", + "name": "venmoIdHash", + "type": "bytes32" + }, + { + "internalType": "uint256[]", + "name": "deposits", + "type": "uint256[]" + } + ], + "internalType": "struct VenmoRampV2.AccountInfo", + "name": "", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_account", + "type": "address" + } + ], + "name": "getAccountVenmoIdHash", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_account", + "type": "address" + } + ], + "name": "getDeniedUsers", + "outputs": [ + { + "internalType": "bytes32[]", + "name": "", + "type": "bytes32[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_depositId", + "type": "uint256" + } + ], + "name": "getDeposit", + "outputs": [ + { + "components": [ + { + "internalType": "address", + "name": "depositor", + "type": "address" + }, + { + "internalType": "uint256[3]", + "name": "packedVenmoId", + "type": "uint256[3]" + }, + { + "internalType": "uint256", + "name": "depositAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "remainingDeposits", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "outstandingIntentAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "conversionRate", + "type": "uint256" + }, + { + "internalType": "bytes32[]", + "name": "intentHashes", + "type": "bytes32[]" + } + ], + "internalType": "struct VenmoRampV2.Deposit", + "name": "", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256[]", + "name": "_depositIds", + "type": "uint256[]" + } + ], + "name": "getDepositFromIds", + "outputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "depositId", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "depositorIdHash", + "type": "bytes32" + }, + { + "components": [ + { + "internalType": "address", + "name": "depositor", + "type": "address" + }, + { + "internalType": "uint256[3]", + "name": "packedVenmoId", + "type": "uint256[3]" + }, + { + "internalType": "uint256", + "name": "depositAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "remainingDeposits", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "outstandingIntentAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "conversionRate", + "type": "uint256" + }, + { + "internalType": "bytes32[]", + "name": "intentHashes", + "type": "bytes32[]" + } + ], + "internalType": "struct VenmoRampV2.Deposit", + "name": "deposit", + "type": "tuple" + }, + { + "internalType": "uint256", + "name": "availableLiquidity", + "type": "uint256" + } + ], + "internalType": "struct VenmoRampV2.DepositWithAvailableLiquidity[]", + "name": "depositArray", + "type": "tuple[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32[]", + "name": "_intentHashes", + "type": "bytes32[]" + } + ], + "name": "getIntentsWithOnRamperId", + "outputs": [ + { + "components": [ + { + "internalType": "bytes32", + "name": "intentHash", + "type": "bytes32" + }, + { + "components": [ + { + "internalType": "address", + "name": "onRamper", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "deposit", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "intentTimestamp", + "type": "uint256" + } + ], + "internalType": "struct VenmoRampV2.Intent", + "name": "intent", + "type": "tuple" + }, + { + "internalType": "bytes32", + "name": "onRamperIdHash", + "type": "bytes32" + } + ], + "internalType": "struct VenmoRampV2.IntentWithOnRamperId[]", + "name": "", + "type": "tuple[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_account", + "type": "address" + } + ], + "name": "getLastOnRampTimestamp", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_account", + "type": "address" + } + ], + "name": "getVenmoIdCurrentIntentHash", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IRegistrationProcessorV2", + "name": "_registrationProcessor", + "type": "address" + }, + { + "internalType": "contract ISendProcessor", + "name": "_sendProcessor", + "type": "address" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "intentExpirationPeriod", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "name": "intents", + "outputs": [ + { + "internalType": "address", + "name": "onRamper", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "deposit", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "intentTimestamp", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_account", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "_deniedUser", + "type": "bytes32" + } + ], + "name": "isDeniedUser", + "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": "maxOnRampAmount", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "minDepositAmount", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256[3]", + "name": "_packedVenmoId", + "type": "uint256[3]" + }, + { + "internalType": "uint256", + "name": "_depositAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_receiveAmount", + "type": "uint256" + } + ], + "name": "offRamp", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "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[12]", + "name": "_signals", + "type": "uint256[12]" + } + ], + "name": "onRamp", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "onRampCooldownPeriod", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "poseidon", + "outputs": [ + { + "internalType": "contract IPoseidon", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "ramp", + "outputs": [ + { + "internalType": "contract IRamp", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "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[5]", + "name": "_signals", + "type": "uint256[5]" + } + ], + "name": "register", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "registrationProcessor", + "outputs": [ + { + "internalType": "contract IRegistrationProcessorV2", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_intentHash", + "type": "bytes32" + } + ], + "name": "releaseFundsToOnramper", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_approvedUser", + "type": "bytes32" + } + ], + "name": "removeAccountFromDenylist", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "sendProcessor", + "outputs": [ + { + "internalType": "contract ISendProcessor", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_intentExpirationPeriod", + "type": "uint256" + } + ], + "name": "setIntentExpirationPeriod", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_maxOnRampAmount", + "type": "uint256" + } + ], + "name": "setMaxOnRampAmount", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_minDepositAmount", + "type": "uint256" + } + ], + "name": "setMinDepositAmount", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_onRampCooldownPeriod", + "type": "uint256" + } + ], + "name": "setOnRampCooldownPeriod", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IRegistrationProcessorV2", + "name": "_registrationProcessor", + "type": "address" + } + ], + "name": "setRegistrationProcessor", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract ISendProcessor", + "name": "_sendProcessor", + "type": "address" + } + ], + "name": "setSendProcessor", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_fee", + "type": "uint256" + } + ], + "name": "setSustainabilityFee", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_feeRecipient", + "type": "address" + } + ], + "name": "setSustainabilityFeeRecipient", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_depositId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + }, + { + "internalType": "address", + "name": "_to", + "type": "address" + } + ], + "name": "signalIntent", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "sustainabilityFee", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "sustainabilityFeeRecipient", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "usdc", + "outputs": [ + { + "internalType": "contract IERC20", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256[]", + "name": "_depositIds", + "type": "uint256[]" + } + ], + "name": "withdrawDeposit", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "transactionHash": "0x1f4e966f71b2b2236e9195430db8fc0aa79b49a49e34cf53a470b24ee23387e6", + "receipt": { + "to": null, + "from": "0xa0Ee7A142d267C1f36714E4a8F75612F20a79720", + "contractAddress": "0x67f65B834aaAc92C15c2EBa9FF7E81f2d33a1cFD", + "transactionIndex": 0, + "gasUsed": "3482156", + "logsBloom": "0x00000008000000000000040000000000000000000000000000800000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000800000001000000000000000008000000000000000000020000000000000000000800000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000020000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0x7ffb8c1e3aad62e8b9b41ffb8b7fe5402cd3c9995ea3708f633d4ed9acfe1965", + "transactionHash": "0x1f4e966f71b2b2236e9195430db8fc0aa79b49a49e34cf53a470b24ee23387e6", + "logs": [ + { + "transactionIndex": 0, + "blockNumber": 61379, + "transactionHash": "0x1f4e966f71b2b2236e9195430db8fc0aa79b49a49e34cf53a470b24ee23387e6", + "address": "0x67f65B834aaAc92C15c2EBa9FF7E81f2d33a1cFD", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x000000000000000000000000a0ee7a142d267c1f36714e4a8f75612f20a79720" + ], + "data": "0x", + "logIndex": 0, + "blockHash": "0x7ffb8c1e3aad62e8b9b41ffb8b7fe5402cd3c9995ea3708f633d4ed9acfe1965" + }, + { + "transactionIndex": 0, + "blockNumber": 61379, + "transactionHash": "0x1f4e966f71b2b2236e9195430db8fc0aa79b49a49e34cf53a470b24ee23387e6", + "address": "0x67f65B834aaAc92C15c2EBa9FF7E81f2d33a1cFD", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x000000000000000000000000a0ee7a142d267c1f36714e4a8f75612f20a79720", + "0x000000000000000000000000a0ee7a142d267c1f36714e4a8f75612f20a79720" + ], + "data": "0x", + "logIndex": 1, + "blockHash": "0x7ffb8c1e3aad62e8b9b41ffb8b7fe5402cd3c9995ea3708f633d4ed9acfe1965" + } + ], + "blockNumber": 61379, + "cumulativeGasUsed": "3482156", + "status": 1, + "byzantium": true + }, + "args": [ + "0xa0Ee7A142d267C1f36714E4a8F75612F20a79720", + "0xe8F76a822B57b973c7a89006092364fFF8f69040", + "0x04fc820176617A99AE134904935Bc854b2e51628", + "0xF1078fD568Ad76E49E6F88D1fF485402a086976b", + "10000000", + "999000000", + "180", + "180", + "1000000000000000", + "0xa0Ee7A142d267C1f36714E4a8F75612F20a79720" + ], + "numDeployments": 1, + "solcInputHash": "75b8f55da346d7ed99a350632554d2fb", + "metadata": "{\"compiler\":{\"version\":\"0.8.24+commit.e11b9ed9\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"},{\"internalType\":\"contract IRamp\",\"name\":\"_ramp\",\"type\":\"address\"},{\"internalType\":\"contract IERC20\",\"name\":\"_usdc\",\"type\":\"address\"},{\"internalType\":\"contract IPoseidon\",\"name\":\"_poseidon\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_minDepositAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_maxOnRampAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_intentExpirationPeriod\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_onRampCooldownPeriod\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_sustainabilityFee\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_sustainabilityFeeRecipient\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"accountOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"venmoIdHash\",\"type\":\"bytes32\"}],\"name\":\"AccountRegistered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"depositId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"depositor\",\"type\":\"address\"}],\"name\":\"DepositClosed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"depositId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"venmoId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"conversionRate\",\"type\":\"uint256\"}],\"name\":\"DepositReceived\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"depositId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"depositor\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"DepositWithdrawn\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"intentExpirationPeriod\",\"type\":\"uint256\"}],\"name\":\"IntentExpirationPeriodSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"intentHash\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"depositId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"onRamper\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"feeAmount\",\"type\":\"uint256\"}],\"name\":\"IntentFulfilled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"intentHash\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"depositId\",\"type\":\"uint256\"}],\"name\":\"IntentPruned\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"intentHash\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"depositId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"venmoId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"}],\"name\":\"IntentSignaled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"maxOnRampAmount\",\"type\":\"uint256\"}],\"name\":\"MaxOnRampAmountSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"minDepositAmount\",\"type\":\"uint256\"}],\"name\":\"MinDepositAmountSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"receiveProcessor\",\"type\":\"address\"}],\"name\":\"NewReceiveProcessorSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"registrationProcessor\",\"type\":\"address\"}],\"name\":\"NewRegistrationProcessorSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"sendProcessor\",\"type\":\"address\"}],\"name\":\"NewSendProcessorSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"onRampCooldownPeriod\",\"type\":\"uint256\"}],\"name\":\"OnRampCooldownPeriodSet\",\"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\":\"feeRecipient\",\"type\":\"address\"}],\"name\":\"SustainabilityFeeRecipientUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"fee\",\"type\":\"uint256\"}],\"name\":\"SustainabilityFeeUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"listOwner\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"deniedUser\",\"type\":\"bytes32\"}],\"name\":\"UserAddedToDenylist\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"listOwner\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"approvedUser\",\"type\":\"bytes32\"}],\"name\":\"UserRemovedFromDenylist\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_deniedUser\",\"type\":\"bytes32\"}],\"name\":\"addAccountToDenylist\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_intentHash\",\"type\":\"bytes32\"}],\"name\":\"cancelIntent\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"depositCounter\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"deposits\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"depositor\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"depositAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"remainingDeposits\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"outstandingIntentAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"conversionRate\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_account\",\"type\":\"address\"}],\"name\":\"getAccountDeposits\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"depositId\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"depositorIdHash\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"depositor\",\"type\":\"address\"},{\"internalType\":\"uint256[3]\",\"name\":\"packedVenmoId\",\"type\":\"uint256[3]\"},{\"internalType\":\"uint256\",\"name\":\"depositAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"remainingDeposits\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"outstandingIntentAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"conversionRate\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[]\",\"name\":\"intentHashes\",\"type\":\"bytes32[]\"}],\"internalType\":\"struct VenmoRampV2.Deposit\",\"name\":\"deposit\",\"type\":\"tuple\"},{\"internalType\":\"uint256\",\"name\":\"availableLiquidity\",\"type\":\"uint256\"}],\"internalType\":\"struct VenmoRampV2.DepositWithAvailableLiquidity[]\",\"name\":\"accountDeposits\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_account\",\"type\":\"address\"}],\"name\":\"getAccountInfo\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"venmoIdHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint256[]\",\"name\":\"deposits\",\"type\":\"uint256[]\"}],\"internalType\":\"struct VenmoRampV2.AccountInfo\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_account\",\"type\":\"address\"}],\"name\":\"getAccountVenmoIdHash\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_account\",\"type\":\"address\"}],\"name\":\"getDeniedUsers\",\"outputs\":[{\"internalType\":\"bytes32[]\",\"name\":\"\",\"type\":\"bytes32[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_depositId\",\"type\":\"uint256\"}],\"name\":\"getDeposit\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"depositor\",\"type\":\"address\"},{\"internalType\":\"uint256[3]\",\"name\":\"packedVenmoId\",\"type\":\"uint256[3]\"},{\"internalType\":\"uint256\",\"name\":\"depositAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"remainingDeposits\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"outstandingIntentAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"conversionRate\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[]\",\"name\":\"intentHashes\",\"type\":\"bytes32[]\"}],\"internalType\":\"struct VenmoRampV2.Deposit\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256[]\",\"name\":\"_depositIds\",\"type\":\"uint256[]\"}],\"name\":\"getDepositFromIds\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"depositId\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"depositorIdHash\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"depositor\",\"type\":\"address\"},{\"internalType\":\"uint256[3]\",\"name\":\"packedVenmoId\",\"type\":\"uint256[3]\"},{\"internalType\":\"uint256\",\"name\":\"depositAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"remainingDeposits\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"outstandingIntentAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"conversionRate\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[]\",\"name\":\"intentHashes\",\"type\":\"bytes32[]\"}],\"internalType\":\"struct VenmoRampV2.Deposit\",\"name\":\"deposit\",\"type\":\"tuple\"},{\"internalType\":\"uint256\",\"name\":\"availableLiquidity\",\"type\":\"uint256\"}],\"internalType\":\"struct VenmoRampV2.DepositWithAvailableLiquidity[]\",\"name\":\"depositArray\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[]\",\"name\":\"_intentHashes\",\"type\":\"bytes32[]\"}],\"name\":\"getIntentsWithOnRamperId\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"intentHash\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"onRamper\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"deposit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"intentTimestamp\",\"type\":\"uint256\"}],\"internalType\":\"struct VenmoRampV2.Intent\",\"name\":\"intent\",\"type\":\"tuple\"},{\"internalType\":\"bytes32\",\"name\":\"onRamperIdHash\",\"type\":\"bytes32\"}],\"internalType\":\"struct VenmoRampV2.IntentWithOnRamperId[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_account\",\"type\":\"address\"}],\"name\":\"getLastOnRampTimestamp\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_account\",\"type\":\"address\"}],\"name\":\"getVenmoIdCurrentIntentHash\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IRegistrationProcessorV2\",\"name\":\"_registrationProcessor\",\"type\":\"address\"},{\"internalType\":\"contract ISendProcessor\",\"name\":\"_sendProcessor\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"intentExpirationPeriod\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"intents\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"onRamper\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"deposit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"intentTimestamp\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_account\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"_deniedUser\",\"type\":\"bytes32\"}],\"name\":\"isDeniedUser\",\"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\":\"maxOnRampAmount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"minDepositAmount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256[3]\",\"name\":\"_packedVenmoId\",\"type\":\"uint256[3]\"},{\"internalType\":\"uint256\",\"name\":\"_depositAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_receiveAmount\",\"type\":\"uint256\"}],\"name\":\"offRamp\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"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[12]\",\"name\":\"_signals\",\"type\":\"uint256[12]\"}],\"name\":\"onRamp\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"onRampCooldownPeriod\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"poseidon\",\"outputs\":[{\"internalType\":\"contract IPoseidon\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ramp\",\"outputs\":[{\"internalType\":\"contract IRamp\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"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[5]\",\"name\":\"_signals\",\"type\":\"uint256[5]\"}],\"name\":\"register\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"registrationProcessor\",\"outputs\":[{\"internalType\":\"contract IRegistrationProcessorV2\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_intentHash\",\"type\":\"bytes32\"}],\"name\":\"releaseFundsToOnramper\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_approvedUser\",\"type\":\"bytes32\"}],\"name\":\"removeAccountFromDenylist\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"sendProcessor\",\"outputs\":[{\"internalType\":\"contract ISendProcessor\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_intentExpirationPeriod\",\"type\":\"uint256\"}],\"name\":\"setIntentExpirationPeriod\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_maxOnRampAmount\",\"type\":\"uint256\"}],\"name\":\"setMaxOnRampAmount\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_minDepositAmount\",\"type\":\"uint256\"}],\"name\":\"setMinDepositAmount\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_onRampCooldownPeriod\",\"type\":\"uint256\"}],\"name\":\"setOnRampCooldownPeriod\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IRegistrationProcessorV2\",\"name\":\"_registrationProcessor\",\"type\":\"address\"}],\"name\":\"setRegistrationProcessor\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract ISendProcessor\",\"name\":\"_sendProcessor\",\"type\":\"address\"}],\"name\":\"setSendProcessor\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_fee\",\"type\":\"uint256\"}],\"name\":\"setSustainabilityFee\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_feeRecipient\",\"type\":\"address\"}],\"name\":\"setSustainabilityFeeRecipient\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_depositId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"}],\"name\":\"signalIntent\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"sustainabilityFee\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"sustainabilityFeeRecipient\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"usdc\",\"outputs\":[{\"internalType\":\"contract IERC20\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256[]\",\"name\":\"_depositIds\",\"type\":\"uint256[]\"}],\"name\":\"withdrawDeposit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"addAccountToDenylist(bytes32)\":{\"params\":{\"_deniedUser\":\"Poseidon hash of the venmoId being banned\"}},\"cancelIntent(bytes32)\":{\"params\":{\"_intentHash\":\"Hash of intent being cancelled\"}},\"initialize(address,address)\":{\"params\":{\"_registrationProcessor\":\"Registration processor address\",\"_sendProcessor\":\"Send processor address\"}},\"offRamp(uint256[3],uint256,uint256)\":{\"params\":{\"_depositAmount\":\"The amount of USDC to off-ramp\",\"_packedVenmoId\":\"The packed venmo id of the account owner (we pack for easy use with poseidon)\",\"_receiveAmount\":\"The amount of USD to receive\"}},\"onRamp(uint256[2],uint256[2][2],uint256[2],uint256[12])\":{\"params\":{\"_a\":\"Parameter of zk proof\",\"_b\":\"Parameter of zk proof\",\"_c\":\"Parameter of zk proof\",\"_signals\":\"Encoded public signals of the zk proof, contains mailserverHash, fromEmail, timestamp, onRamperIdHash, nullifier, intentHash\"}},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"register(uint256[2],uint256[2][2],uint256[2],uint256[5])\":{\"params\":{\"_a\":\"Parameter of zk proof\",\"_b\":\"Parameter of zk proof\",\"_c\":\"Parameter of zk proof\",\"_signals\":\"Encoded public signals of the zk proof, contains mailserverHash, fromEmail, userIdHash\"}},\"releaseFundsToOnramper(bytes32)\":{\"params\":{\"_intentHash\":\"Hash of intent to resolve by releasing the funds\"}},\"removeAccountFromDenylist(bytes32)\":{\"params\":{\"_approvedUser\":\"Poseidon hash of the venmoId being approved\"}},\"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.\"},\"setIntentExpirationPeriod(uint256)\":{\"params\":{\"_intentExpirationPeriod\":\"New intent expiration period\"}},\"setMaxOnRampAmount(uint256)\":{\"params\":{\"_maxOnRampAmount\":\"The new max on ramp amount\"}},\"setMinDepositAmount(uint256)\":{\"params\":{\"_minDepositAmount\":\"The new minimum deposit amount\"}},\"setOnRampCooldownPeriod(uint256)\":{\"params\":{\"_onRampCooldownPeriod\":\"New on-ramp cooldown period\"}},\"setRegistrationProcessor(address)\":{\"params\":{\"_registrationProcessor\":\"New registration proccesor address\"}},\"setSendProcessor(address)\":{\"params\":{\"_sendProcessor\":\"New send proccesor address\"}},\"setSustainabilityFee(uint256)\":{\"params\":{\"_fee\":\"The new sustainability fee in precise units (10**18, ie 10% = 1e17)\"}},\"setSustainabilityFeeRecipient(address)\":{\"params\":{\"_feeRecipient\":\"The new fee recipient address\"}},\"signalIntent(uint256,uint256,address)\":{\"params\":{\"_amount\":\"The amount of USDC the user wants to on-ramp\",\"_depositId\":\"The ID of the deposit the on-ramper intends to use for \",\"_to\":\"Address to forward funds to (can be same as onRamper)\"}},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"},\"withdrawDeposit(uint256[])\":{\"params\":{\"_depositIds\":\"Array of depositIds the depositor is attempting to withdraw\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"addAccountToDenylist(bytes32)\":{\"notice\":\"Adds a venmoId to a depositor's deny list. If an address associated with the banned venmoId attempts to signal an intent on the user's deposit they will be denied.\"},\"cancelIntent(bytes32)\":{\"notice\":\"Only callable by the originator of the intent. Cancels an outstanding intent thus allowing user to signal a new intent. Deposit state is updated to reflect the cancelled intent.\"},\"initialize(address,address)\":{\"notice\":\"Initialize Ramp with the addresses of the Processors\"},\"offRamp(uint256[3],uint256,uint256)\":{\"notice\":\"Generates a deposit entry for off-rampers that can then be fulfilled by an on-ramper. This function will not add to previous deposits. Every deposit has it's own unique identifier. User must approve the contract to transfer the deposit amount of USDC.\"},\"onRamp(uint256[2],uint256[2][2],uint256[2],uint256[12])\":{\"notice\":\"Anyone can submit an on-ramp transaction, even if caller isn't on-ramper. Upon submission the proof is validated, intent is removed, and deposit state is updated. USDC is transferred to the on-ramper.\"},\"register(uint256[2],uint256[2][2],uint256[2],uint256[5])\":{\"notice\":\"Registers a new account by pulling the hash of the account id from the proof and assigning the account owner to the sender of the transaction. One venmo account can be registered to multiple Ethereum addresses.\"},\"releaseFundsToOnramper(bytes32)\":{\"notice\":\"Allows off-ramper to release funds to the on-ramper in case of a failed on-ramp or because of some other arrangement between the two parties. Upon submission we check to make sure the msg.sender is the depositor, the intent is removed, and deposit state is updated. USDC is transferred to the on-ramper.\"},\"removeAccountFromDenylist(bytes32)\":{\"notice\":\"Removes a venmoId from a depositor's deny list.\"},\"setIntentExpirationPeriod(uint256)\":{\"notice\":\"GOVERNANCE ONLY: Updates the intent expiration period, after this period elapses an intent can be pruned to prevent locking up a depositor's funds.\"},\"setMaxOnRampAmount(uint256)\":{\"notice\":\"GOVERNANCE ONLY: Updates the max amount allowed to be on-ramped in each transaction. To on-ramp more than this amount a user must make multiple transactions.\"},\"setMinDepositAmount(uint256)\":{\"notice\":\"GOVERNANCE ONLY: Updates the minimum deposit amount a user can specify for off-ramping.\"},\"setOnRampCooldownPeriod(uint256)\":{\"notice\":\"GOVERNANCE ONLY: Updates the on-ramp cooldown period, once an on-ramp transaction is completed the user must wait this amount of time before they can signalIntent to on-ramp again.\"},\"setRegistrationProcessor(address)\":{\"notice\":\"GOVERNANCE ONLY: Updates the registration processor address used for validating and interpreting zk proofs.\"},\"setSendProcessor(address)\":{\"notice\":\"GOVERNANCE ONLY: Updates the send processor address used for validating and interpreting zk proofs.\"},\"setSustainabilityFee(uint256)\":{\"notice\":\"GOVERNANCE ONLY: Updates the sustainability fee. This fee is charged to on-rampers upon a successful on-ramp.\"},\"setSustainabilityFeeRecipient(address)\":{\"notice\":\"GOVERNANCE ONLY: Updates the recepient of sustainability fees.\"},\"signalIntent(uint256,uint256,address)\":{\"notice\":\"Signals intent to pay the depositor defined in the _depositId the _amount * deposit conversionRate off-chain in order to unlock _amount of funds on-chain. Each user can only have one outstanding intent at a time regardless of address (tracked using venmoId). Caller must not be on the depositor's deny list. If there are prunable intents then they will be deleted from the deposit to be able to maintain state hygiene.\"},\"withdrawDeposit(uint256[])\":{\"notice\":\"Caller must be the depositor for each depositId in the array, if not whole function fails. Depositor is returned all remaining deposits and any outstanding intents that are expired. If an intent is not expired then those funds will not be returned. Deposit will be deleted as long as there are no more outstanding intents.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/ramps/venmo-v2/VenmoRampV2.sol\":\"VenmoRampV2\"},\"evmVersion\":\"shanghai\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"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/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/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (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\",\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"license\":\"MIT\"},\"contracts/external/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/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 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\":\"0x102021415f8444ff563fc6d0082f39296f47c09ce73fb4cd642e700ac489eefe\",\"license\":\"Apache-2.0\"},\"contracts/interfaces/IPoseidon.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.18;\\n\\ninterface IPoseidon {\\n function poseidon(uint256[3] memory _a) external pure returns(uint256);\\n}\\n\",\"keccak256\":\"0x9ba8b00cf908c8eb9e0ef5a3b116341f6c50f7745399fc7805a148bf500991b5\",\"license\":\"MIT\"},\"contracts/ramps/venmo-v1/Ramp.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\n\\nimport { IERC20 } from \\\"@openzeppelin/contracts/token/ERC20/IERC20.sol\\\";\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\nimport { Bytes32ArrayUtils } from \\\"../../external/Bytes32ArrayUtils.sol\\\";\\nimport { Uint256ArrayUtils } from \\\"../../external/Uint256ArrayUtils.sol\\\";\\n\\nimport { IPoseidon } from \\\"../../interfaces/IPoseidon.sol\\\";\\nimport { IRegistrationProcessor } from \\\"./interfaces/IRegistrationProcessor.sol\\\";\\nimport { ISendProcessor } from \\\"./interfaces/ISendProcessor.sol\\\";\\n\\npragma solidity ^0.8.18;\\n\\ncontract Ramp is Ownable {\\n\\n using Bytes32ArrayUtils for bytes32[];\\n using Uint256ArrayUtils for uint256[];\\n\\n /* ============ Events ============ */\\n event AccountRegistered(address indexed accountOwner, bytes32 indexed venmoIdHash);\\n event DepositReceived(\\n uint256 indexed depositId,\\n bytes32 indexed venmoId,\\n uint256 amount,\\n uint256 conversionRate\\n );\\n event IntentSignaled(\\n bytes32 indexed intentHash,\\n uint256 indexed depositId,\\n bytes32 indexed venmoId,\\n address to,\\n uint256 amount,\\n uint256 timestamp\\n );\\n\\n event IntentPruned(\\n bytes32 indexed intentHash,\\n uint256 indexed depositId\\n );\\n // Do we want to emit the onRamper or the venmoId\\n event IntentFulfilled(\\n bytes32 indexed intentHash,\\n uint256 indexed depositId,\\n address indexed onRamper,\\n address to,\\n uint256 amount,\\n uint256 feeAmount\\n );\\n // Do we want to emit the depositor or the venmoId\\n event DepositWithdrawn(\\n uint256 indexed depositId,\\n address indexed depositor,\\n uint256 amount\\n );\\n\\n event DepositClosed(uint256 depositId, address depositor);\\n event UserAddedToDenylist(bytes32 listOwner, bytes32 deniedUser);\\n event UserRemovedFromDenylist(bytes32 listOwner, bytes32 approvedUser);\\n event MinDepositAmountSet(uint256 minDepositAmount);\\n event MaxOnRampAmountSet(uint256 maxOnRampAmount);\\n event IntentExpirationPeriodSet(uint256 intentExpirationPeriod);\\n event OnRampCooldownPeriodSet(uint256 onRampCooldownPeriod);\\n event SustainabilityFeeUpdated(uint256 fee);\\n event SustainabilityFeeRecipientUpdated(address feeRecipient);\\n event NewSendProcessorSet(address sendProcessor);\\n event NewRegistrationProcessorSet(address registrationProcessor);\\n event NewReceiveProcessorSet(address receiveProcessor);\\n\\n /* ============ Structs ============ */\\n\\n // Each Account is tied to a GlobalAccount via its associated venmoIdHash. Each account is represented by an Ethereum address\\n // and is allowed to have at most 5 deposits associated with it.\\n struct AccountInfo {\\n bytes32 venmoIdHash; // Poseidon hash of account's venmoId\\n uint256[] deposits; // Array of open account deposits\\n }\\n\\n struct Deposit {\\n address depositor;\\n uint256[3] packedVenmoId;\\n uint256 depositAmount; // Amount of USDC deposited\\n uint256 remainingDeposits; // Amount of remaining deposited liquidity\\n uint256 outstandingIntentAmount; // Amount of outstanding intents (may include expired intents)\\n uint256 conversionRate; // Conversion required by off-ramper between USDC/USD\\n bytes32[] intentHashes; // Array of hashes of all open intents (may include some expired if not pruned)\\n }\\n\\n struct DepositWithAvailableLiquidity {\\n uint256 depositId; // ID of the deposit\\n Deposit deposit; // Deposit struct\\n uint256 availableLiquidity; // Amount of liquidity available to signal intents (net of expired intents)\\n }\\n\\n struct Intent {\\n address onRamper; // On-ramper's address\\n address to; // Address to forward funds to (can be same as onRamper)\\n uint256 deposit; // ID of the deposit the intent is signaling on\\n uint256 amount; // Amount of USDC the on-ramper signals intent for on-chain\\n uint256 intentTimestamp; // Timestamp of when the intent was signaled\\n }\\n\\n struct IntentWithOnRamperId {\\n Intent intent; // Intent struct\\n bytes32 onRamperIdHash; // Poseidon hash of the on-ramper's venmoId\\n }\\n\\n struct DenyList {\\n bytes32[] deniedUsers; // Array of venmoIdHashes that are denied from taking depositors liquidity\\n mapping(bytes32 => bool) isDenied; // Mapping of venmoIdHash to boolean indicating if the user is denied\\n }\\n\\n // A Global Account is defined as an account represented by one venmoIdHash. This is used to enforce limitations on actions across\\n // all Ethereum addresses that are associated with that venmoId. In this case we use it to enforce a cooldown period between on ramps,\\n // restrict each venmo account to one outstanding intent at a time, and to enforce deny lists.\\n struct GlobalAccountInfo {\\n bytes32 currentIntentHash; // Hash of the current open intent (if exists)\\n uint256 lastOnrampTimestamp; // Timestamp of the last on-ramp transaction used to check if cooldown period elapsed\\n DenyList denyList; // Deny list of the account\\n }\\n\\n /* ============ Modifiers ============ */\\n modifier onlyRegisteredUser() {\\n require(accounts[msg.sender].venmoIdHash != bytes32(0), \\\"Caller must be registered user\\\");\\n _;\\n }\\n\\n /* ============ Constants ============ */\\n uint256 internal constant PRECISE_UNIT = 1e18;\\n uint256 internal constant MAX_DEPOSITS = 5; // An account can only have max 5 different deposit parameterizations to prevent locking funds\\n uint256 constant CIRCOM_PRIME_FIELD = 21888242871839275222246405745257275088548364400416034343698204186575808495617;\\n uint256 constant MAX_SUSTAINABILITY_FEE = 5e16; // 5% max sustainability fee\\n \\n /* ============ State Variables ============ */\\n IERC20 public immutable usdc; // USDC token contract\\n IPoseidon public immutable poseidon; // Poseidon hashing contract\\n IRegistrationProcessor public registrationProcessor; // Address of registration processor contract, verifies registration e-mails\\n ISendProcessor public sendProcessor; // Address of send processor contract, verifies onRamp emails\\n\\n bool internal isInitialized; // Indicates if contract has been initialized\\n\\n mapping(bytes32 => GlobalAccountInfo) internal globalAccount; // Mapping of venmoIdHash to information used to enforce actions across Ethereum accounts\\n mapping(address => AccountInfo) internal accounts; // Mapping of Ethereum accounts to their account information (venmoIdHash and deposits)\\n mapping(uint256 => Deposit) public deposits; // Mapping of depositIds to deposit structs\\n mapping(bytes32 => Intent) public intents; // Mapping of intentHashes to intent structs\\n\\n uint256 public minDepositAmount; // Minimum amount of USDC that can be deposited\\n uint256 public maxOnRampAmount; // Maximum amount of USDC that can be on-ramped in a single transaction\\n uint256 public onRampCooldownPeriod; // Time period that must elapse between completing an on-ramp and signaling a new intent\\n uint256 public intentExpirationPeriod; // Time period after which an intent can be pruned from the system\\n uint256 public sustainabilityFee; // Fee charged to on-rampers in preciseUnits (1e16 = 1%)\\n address public sustainabilityFeeRecipient; // Address that receives the sustainability fee\\n\\n uint256 public depositCounter; // Counter for depositIds\\n\\n /* ============ Constructor ============ */\\n constructor(\\n address _owner,\\n IERC20 _usdc,\\n IPoseidon _poseidon,\\n uint256 _minDepositAmount,\\n uint256 _maxOnRampAmount,\\n uint256 _intentExpirationPeriod,\\n uint256 _onRampCooldownPeriod,\\n uint256 _sustainabilityFee,\\n address _sustainabilityFeeRecipient\\n )\\n Ownable()\\n {\\n usdc = _usdc;\\n poseidon = _poseidon;\\n minDepositAmount = _minDepositAmount;\\n maxOnRampAmount = _maxOnRampAmount;\\n intentExpirationPeriod = _intentExpirationPeriod;\\n onRampCooldownPeriod = _onRampCooldownPeriod;\\n sustainabilityFee = _sustainabilityFee;\\n sustainabilityFeeRecipient = _sustainabilityFeeRecipient;\\n\\n transferOwnership(_owner);\\n }\\n\\n /* ============ External Functions ============ */\\n\\n /**\\n * @notice Initialize Ramp with the addresses of the Processors\\n *\\n * @param _registrationProcessor Registration processor address\\n * @param _sendProcessor Send processor address\\n */\\n function initialize(\\n IRegistrationProcessor _registrationProcessor,\\n ISendProcessor _sendProcessor\\n )\\n external\\n onlyOwner\\n {\\n require(!isInitialized, \\\"Already initialized\\\");\\n\\n registrationProcessor = _registrationProcessor;\\n sendProcessor = _sendProcessor;\\n\\n isInitialized = true;\\n }\\n\\n /**\\n * @notice Registers a new account by pulling the hash of the account id from the proof and assigning the account owner to the\\n * sender of the transaction. One venmo account can be registered to multiple Ethereum addresses.\\n *\\n * @param _a Parameter of zk proof\\n * @param _b Parameter of zk proof\\n * @param _c Parameter of zk proof\\n * @param _signals Encoded public signals of the zk proof, contains mailserverHash, fromEmail, userIdHash\\n */\\n function register(\\n uint[2] memory _a,\\n uint[2][2] memory _b,\\n uint[2] memory _c,\\n uint[5] memory _signals\\n )\\n external\\n {\\n require(accounts[msg.sender].venmoIdHash == bytes32(0), \\\"Account already associated with venmoId\\\");\\n bytes32 venmoIdHash = _verifyRegistrationProof(_a, _b, _c, _signals);\\n\\n accounts[msg.sender].venmoIdHash = venmoIdHash;\\n\\n emit AccountRegistered(msg.sender, venmoIdHash);\\n }\\n\\n /**\\n * @notice Generates a deposit entry for off-rampers that can then be fulfilled by an on-ramper. This function will not add to\\n * previous deposits. Every deposit has it's own unique identifier. User must approve the contract to transfer the deposit amount\\n * of USDC.\\n *\\n * @param _packedVenmoId The packed venmo id of the account owner (we pack for easy use with poseidon)\\n * @param _depositAmount The amount of USDC to off-ramp\\n * @param _receiveAmount The amount of USD to receive\\n */\\n function offRamp(\\n uint256[3] memory _packedVenmoId,\\n uint256 _depositAmount,\\n uint256 _receiveAmount\\n )\\n external\\n onlyRegisteredUser\\n {\\n bytes32 venmoIdHash = bytes32(poseidon.poseidon(_packedVenmoId));\\n\\n require(accounts[msg.sender].venmoIdHash == venmoIdHash, \\\"Sender must be the account owner\\\");\\n require(accounts[msg.sender].deposits.length < MAX_DEPOSITS, \\\"Maximum deposit amount reached\\\");\\n require(_depositAmount >= minDepositAmount, \\\"Deposit amount must be greater than min deposit amount\\\");\\n require(_receiveAmount > 0, \\\"Receive amount must be greater than 0\\\");\\n\\n uint256 conversionRate = (_depositAmount * PRECISE_UNIT) / _receiveAmount;\\n uint256 depositId = depositCounter++;\\n\\n accounts[msg.sender].deposits.push(depositId);\\n\\n deposits[depositId] = Deposit({\\n depositor: msg.sender,\\n packedVenmoId: _packedVenmoId,\\n depositAmount: _depositAmount,\\n remainingDeposits: _depositAmount,\\n outstandingIntentAmount: 0,\\n conversionRate: conversionRate,\\n intentHashes: new bytes32[](0)\\n });\\n\\n usdc.transferFrom(msg.sender, address(this), _depositAmount);\\n\\n emit DepositReceived(depositId, venmoIdHash, _depositAmount, conversionRate);\\n }\\n\\n /**\\n * @notice Signals intent to pay the depositor defined in the _depositId the _amount * deposit conversionRate off-chain\\n * in order to unlock _amount of funds on-chain. Each user can only have one outstanding intent at a time regardless of\\n * address (tracked using venmoId). Caller must not be on the depositor's deny list. If there are prunable intents then\\n * they will be deleted from the deposit to be able to maintain state hygiene.\\n *\\n * @param _depositId The ID of the deposit the on-ramper intends to use for \\n * @param _amount The amount of USDC the user wants to on-ramp\\n * @param _to Address to forward funds to (can be same as onRamper)\\n */\\n function signalIntent(uint256 _depositId, uint256 _amount, address _to) external onlyRegisteredUser {\\n bytes32 venmoIdHash = accounts[msg.sender].venmoIdHash;\\n Deposit storage deposit = deposits[_depositId];\\n bytes32 depositorVenmoIdHash = accounts[deposit.depositor].venmoIdHash;\\n\\n // Caller validity checks\\n require(!globalAccount[depositorVenmoIdHash].denyList.isDenied[venmoIdHash], \\\"Onramper on depositor's denylist\\\");\\n require(\\n globalAccount[venmoIdHash].lastOnrampTimestamp + onRampCooldownPeriod <= block.timestamp,\\n \\\"On ramp cool down period not elapsed\\\"\\n );\\n require(globalAccount[venmoIdHash].currentIntentHash == bytes32(0), \\\"Intent still outstanding\\\");\\n require(depositorVenmoIdHash != venmoIdHash, \\\"Sender cannot be the depositor\\\");\\n\\n // Intent information checks\\n require(deposit.depositor != address(0), \\\"Deposit does not exist\\\");\\n require(_amount > 0, \\\"Signaled amount must be greater than 0\\\");\\n require(_amount <= maxOnRampAmount, \\\"Signaled amount must be less than max on-ramp amount\\\");\\n require(_to != address(0), \\\"Cannot send to zero address\\\");\\n\\n bytes32 intentHash = _calculateIntentHash(venmoIdHash, _depositId);\\n\\n if (deposit.remainingDeposits < _amount) {\\n (\\n bytes32[] memory prunableIntents,\\n uint256 reclaimableAmount\\n ) = _getPrunableIntents(_depositId);\\n\\n require(deposit.remainingDeposits + reclaimableAmount >= _amount, \\\"Not enough liquidity\\\");\\n\\n _pruneIntents(deposit, prunableIntents);\\n deposit.remainingDeposits += reclaimableAmount;\\n deposit.outstandingIntentAmount -= reclaimableAmount;\\n }\\n\\n intents[intentHash] = Intent({\\n onRamper: msg.sender,\\n to: _to,\\n deposit: _depositId,\\n amount: _amount,\\n intentTimestamp: block.timestamp\\n });\\n\\n globalAccount[venmoIdHash].currentIntentHash = intentHash;\\n\\n deposit.remainingDeposits -= _amount;\\n deposit.outstandingIntentAmount += _amount;\\n deposit.intentHashes.push(intentHash);\\n\\n emit IntentSignaled(intentHash, _depositId, venmoIdHash, _to, _amount, block.timestamp);\\n }\\n\\n /**\\n * @notice Only callable by the originator of the intent. Cancels an outstanding intent thus allowing user to signal a new\\n * intent. Deposit state is updated to reflect the cancelled intent.\\n *\\n * @param _intentHash Hash of intent being cancelled\\n */\\n function cancelIntent(bytes32 _intentHash) external {\\n Intent memory intent = intents[_intentHash];\\n \\n require(intent.intentTimestamp != 0, \\\"Intent does not exist\\\");\\n require(intent.onRamper == msg.sender, \\\"Sender must be the on-ramper\\\");\\n\\n Deposit storage deposit = deposits[intent.deposit];\\n\\n _pruneIntent(deposit, _intentHash);\\n\\n deposit.remainingDeposits += intent.amount;\\n deposit.outstandingIntentAmount -= intent.amount;\\n }\\n\\n /**\\n * @notice Anyone can submit an on-ramp transaction, even if caller isn't on-ramper. Upon submission the proof is validated,\\n * intent is removed, and deposit state is updated. USDC is transferred to the on-ramper.\\n *\\n * @param _a Parameter of zk proof\\n * @param _b Parameter of zk proof\\n * @param _c Parameter of zk proof\\n * @param _signals Encoded public signals of the zk proof, contains mailserverHash, fromEmail, timestamp, onRamperIdHash,\\n * nullifier, intentHash\\n */\\n function onRamp(\\n uint256[2] memory _a,\\n uint256[2][2] memory _b,\\n uint256[2] memory _c,\\n uint256[12] memory _signals\\n )\\n external\\n {\\n (\\n Intent memory intent,\\n Deposit storage deposit,\\n bytes32 intentHash\\n ) = _verifyOnRampProof(_a, _b, _c, _signals);\\n\\n _pruneIntent(deposit, intentHash);\\n\\n deposit.outstandingIntentAmount -= intent.amount;\\n globalAccount[accounts[intent.onRamper].venmoIdHash].lastOnrampTimestamp = block.timestamp;\\n _closeDepositIfNecessary(intent.deposit, deposit);\\n\\n _transferFunds(intentHash, intent);\\n }\\n\\n /**\\n * @notice Caller must be the depositor for each depositId in the array, if not whole function fails. Depositor is returned all\\n * remaining deposits and any outstanding intents that are expired. If an intent is not expired then those funds will not be\\n * returned. Deposit will be deleted as long as there are no more outstanding intents.\\n *\\n * @param _depositIds Array of depositIds the depositor is attempting to withdraw\\n */\\n function withdrawDeposit(uint256[] memory _depositIds) external {\\n uint256 returnAmount;\\n\\n for (uint256 i = 0; i < _depositIds.length; ++i) {\\n uint256 depositId = _depositIds[i];\\n Deposit storage deposit = deposits[depositId];\\n\\n require(deposit.depositor == msg.sender, \\\"Sender must be the depositor\\\");\\n\\n (\\n bytes32[] memory prunableIntents,\\n uint256 reclaimableAmount\\n ) = _getPrunableIntents(depositId);\\n\\n _pruneIntents(deposit, prunableIntents);\\n\\n returnAmount += deposit.remainingDeposits + reclaimableAmount;\\n \\n deposit.outstandingIntentAmount -= reclaimableAmount;\\n\\n emit DepositWithdrawn(depositId, deposit.depositor, deposit.remainingDeposits + reclaimableAmount);\\n \\n delete deposit.remainingDeposits;\\n _closeDepositIfNecessary(depositId, deposit);\\n }\\n\\n usdc.transfer(msg.sender, returnAmount);\\n }\\n\\n /**\\n * @notice Adds a venmoId to a depositor's deny list. If an address associated with the banned venmoId attempts to\\n * signal an intent on the user's deposit they will be denied.\\n *\\n * @param _deniedUser Poseidon hash of the venmoId being banned\\n */\\n function addAccountToDenylist(bytes32 _deniedUser) external onlyRegisteredUser {\\n bytes32 denyingUser = accounts[msg.sender].venmoIdHash;\\n\\n require(!globalAccount[denyingUser].denyList.isDenied[_deniedUser], \\\"User already on denylist\\\");\\n\\n globalAccount[denyingUser].denyList.isDenied[_deniedUser] = true;\\n globalAccount[denyingUser].denyList.deniedUsers.push(_deniedUser);\\n\\n emit UserAddedToDenylist(denyingUser, _deniedUser);\\n }\\n\\n /**\\n * @notice Removes a venmoId from a depositor's deny list.\\n *\\n * @param _approvedUser Poseidon hash of the venmoId being approved\\n */\\n function removeAccountFromDenylist(bytes32 _approvedUser) external onlyRegisteredUser {\\n bytes32 approvingUser = accounts[msg.sender].venmoIdHash;\\n\\n require(globalAccount[approvingUser].denyList.isDenied[_approvedUser], \\\"User not on denylist\\\");\\n\\n globalAccount[approvingUser].denyList.isDenied[_approvedUser] = false;\\n globalAccount[approvingUser].denyList.deniedUsers.removeStorage(_approvedUser);\\n\\n emit UserRemovedFromDenylist(approvingUser, _approvedUser);\\n }\\n\\n /* ============ Governance Functions ============ */\\n\\n /**\\n * @notice GOVERNANCE ONLY: Updates the send processor address used for validating and interpreting zk proofs.\\n *\\n * @param _sendProcessor New send proccesor address\\n */\\n function setSendProcessor(ISendProcessor _sendProcessor) external onlyOwner {\\n sendProcessor = _sendProcessor;\\n emit NewSendProcessorSet(address(_sendProcessor));\\n }\\n\\n /**\\n * @notice GOVERNANCE ONLY: Updates the registration processor address used for validating and interpreting zk proofs.\\n *\\n * @param _registrationProcessor New registration proccesor address\\n */\\n function setRegistrationProcessor(IRegistrationProcessor _registrationProcessor) external onlyOwner {\\n registrationProcessor = _registrationProcessor;\\n emit NewRegistrationProcessorSet(address(_registrationProcessor));\\n }\\n\\n /**\\n * @notice GOVERNANCE ONLY: Updates the minimum deposit amount a user can specify for off-ramping.\\n *\\n * @param _minDepositAmount The new minimum deposit amount\\n */\\n function setMinDepositAmount(uint256 _minDepositAmount) external onlyOwner {\\n require(_minDepositAmount != 0, \\\"Minimum deposit cannot be zero\\\");\\n\\n minDepositAmount = _minDepositAmount;\\n emit MinDepositAmountSet(_minDepositAmount);\\n }\\n\\n /**\\n * @notice GOVERNANCE ONLY: Updates the sustainability fee. This fee is charged to on-rampers upon a successful on-ramp.\\n *\\n * @param _fee The new sustainability fee in precise units (10**18, ie 10% = 1e17)\\n */\\n function setSustainabilityFee(uint256 _fee) external onlyOwner {\\n require(_fee <= MAX_SUSTAINABILITY_FEE, \\\"Fee cannot be greater than max fee\\\");\\n\\n sustainabilityFee = _fee;\\n emit SustainabilityFeeUpdated(_fee);\\n }\\n\\n /**\\n * @notice GOVERNANCE ONLY: Updates the recepient of sustainability fees.\\n *\\n * @param _feeRecipient The new fee recipient address\\n */\\n function setSustainabilityFeeRecipient(address _feeRecipient) external onlyOwner {\\n require(_feeRecipient != address(0), \\\"Fee recipient cannot be zero address\\\");\\n\\n sustainabilityFeeRecipient = _feeRecipient;\\n emit SustainabilityFeeRecipientUpdated(_feeRecipient);\\n }\\n\\n /**\\n * @notice GOVERNANCE ONLY: Updates the max amount allowed to be on-ramped in each transaction. To on-ramp more than\\n * this amount a user must make multiple transactions.\\n *\\n * @param _maxOnRampAmount The new max on ramp amount\\n */\\n function setMaxOnRampAmount(uint256 _maxOnRampAmount) external onlyOwner {\\n require(_maxOnRampAmount != 0, \\\"Max on ramp amount cannot be zero\\\");\\n\\n maxOnRampAmount = _maxOnRampAmount;\\n emit MaxOnRampAmountSet(_maxOnRampAmount);\\n }\\n\\n /**\\n * @notice GOVERNANCE ONLY: Updates the on-ramp cooldown period, once an on-ramp transaction is completed the user must wait this\\n * amount of time before they can signalIntent to on-ramp again.\\n *\\n * @param _onRampCooldownPeriod New on-ramp cooldown period\\n */\\n function setOnRampCooldownPeriod(uint256 _onRampCooldownPeriod) external onlyOwner {\\n onRampCooldownPeriod = _onRampCooldownPeriod;\\n emit OnRampCooldownPeriodSet(_onRampCooldownPeriod);\\n }\\n\\n /**\\n * @notice GOVERNANCE ONLY: Updates the intent expiration period, after this period elapses an intent can be pruned to prevent\\n * locking up a depositor's funds.\\n *\\n * @param _intentExpirationPeriod New intent expiration period\\n */\\n function setIntentExpirationPeriod(uint256 _intentExpirationPeriod) external onlyOwner {\\n require(_intentExpirationPeriod != 0, \\\"Max intent expiration period cannot be zero\\\");\\n\\n intentExpirationPeriod = _intentExpirationPeriod;\\n emit IntentExpirationPeriodSet(_intentExpirationPeriod);\\n }\\n\\n\\n /* ============ External View Functions ============ */\\n\\n function getDeposit(uint256 _depositId) external view returns (Deposit memory) {\\n return deposits[_depositId];\\n }\\n\\n function getAccountInfo(address _account) external view returns (AccountInfo memory) {\\n return accounts[_account];\\n }\\n\\n function getVenmoIdCurrentIntentHash(address _account) external view returns (bytes32) {\\n return globalAccount[accounts[_account].venmoIdHash].currentIntentHash;\\n }\\n\\n function getLastOnRampTimestamp(address _account) external view returns (uint256) {\\n return globalAccount[accounts[_account].venmoIdHash].lastOnrampTimestamp;\\n }\\n\\n function getDeniedUsers(address _account) external view returns (bytes32[] memory) {\\n return globalAccount[accounts[_account].venmoIdHash].denyList.deniedUsers;\\n }\\n\\n function isDeniedUser(address _account, bytes32 _deniedUser) external view returns (bool) {\\n return globalAccount[accounts[_account].venmoIdHash].denyList.isDenied[_deniedUser];\\n }\\n\\n function getIntentsWithOnRamperId(bytes32[] calldata _intentHashes) external view returns (IntentWithOnRamperId[] memory) {\\n IntentWithOnRamperId[] memory intentsWithOnRamperId = new IntentWithOnRamperId[](_intentHashes.length);\\n\\n for (uint256 i = 0; i < _intentHashes.length; ++i) {\\n Intent memory intent = intents[_intentHashes[i]];\\n intentsWithOnRamperId[i] = IntentWithOnRamperId({\\n intent: intent,\\n onRamperIdHash: accounts[intent.onRamper].venmoIdHash\\n });\\n }\\n\\n return intentsWithOnRamperId;\\n }\\n\\n function getAccountDeposits(address _account) external view returns (DepositWithAvailableLiquidity[] memory accountDeposits) {\\n uint256[] memory accountDepositIds = accounts[_account].deposits;\\n accountDeposits = new DepositWithAvailableLiquidity[](accountDepositIds.length);\\n \\n for (uint256 i = 0; i < accountDepositIds.length; ++i) {\\n uint256 depositId = accountDepositIds[i];\\n Deposit memory deposit = deposits[depositId];\\n ( , uint256 reclaimableAmount) = _getPrunableIntents(depositId);\\n\\n accountDeposits[i] = DepositWithAvailableLiquidity({\\n depositId: depositId,\\n deposit: deposit,\\n availableLiquidity: deposit.remainingDeposits + reclaimableAmount\\n });\\n }\\n }\\n\\n function getDepositFromIds(uint256[] memory _depositIds) external view returns (DepositWithAvailableLiquidity[] memory depositArray) {\\n depositArray = new DepositWithAvailableLiquidity[](_depositIds.length);\\n\\n for (uint256 i = 0; i < _depositIds.length; ++i) {\\n uint256 depositId = _depositIds[i];\\n Deposit memory deposit = deposits[depositId];\\n ( , uint256 reclaimableAmount) = _getPrunableIntents(depositId);\\n\\n depositArray[i] = DepositWithAvailableLiquidity({\\n depositId: depositId,\\n deposit: deposit,\\n availableLiquidity: deposit.remainingDeposits + reclaimableAmount\\n });\\n }\\n\\n return depositArray;\\n }\\n\\n /* ============ Internal Functions ============ */\\n\\n /**\\n * @notice Calculates the intentHash of new intent\\n */\\n function _calculateIntentHash(\\n bytes32 _venmoId,\\n uint256 _depositId\\n )\\n internal\\n view\\n virtual\\n returns (bytes32 intentHash)\\n {\\n // Mod with circom prime field to make sure it fits in a 254-bit field\\n uint256 intermediateHash = uint256(keccak256(abi.encodePacked(_venmoId, _depositId, block.timestamp)));\\n intentHash = bytes32(intermediateHash % CIRCOM_PRIME_FIELD);\\n }\\n\\n /**\\n * @notice Cycles through all intents currently open on a deposit and sees if any have expired. If they have expired\\n * the outstanding amounts are summed and returned alongside the intentHashes\\n */\\n function _getPrunableIntents(\\n uint256 _depositId\\n )\\n internal\\n view\\n returns(bytes32[] memory prunableIntents, uint256 reclaimedAmount)\\n {\\n bytes32[] memory intentHashes = deposits[_depositId].intentHashes;\\n prunableIntents = new bytes32[](intentHashes.length);\\n\\n for (uint256 i = 0; i < intentHashes.length; ++i) {\\n Intent memory intent = intents[intentHashes[i]];\\n if (intent.intentTimestamp + intentExpirationPeriod < block.timestamp) {\\n prunableIntents[i] = intentHashes[i];\\n reclaimedAmount += intent.amount;\\n }\\n }\\n }\\n\\n function _pruneIntents(Deposit storage _deposit, bytes32[] memory _intents) internal {\\n for (uint256 i = 0; i < _intents.length; ++i) {\\n if (_intents[i] != bytes32(0)) {\\n _pruneIntent(_deposit, _intents[i]);\\n }\\n }\\n }\\n\\n /**\\n * @notice Pruning an intent involves deleting its state from the intents mapping, zeroing out the intendee's currentIntentHash in\\n * their global account mapping, and deleting the intentHash from the deposit's intentHashes array.\\n */\\n function _pruneIntent(Deposit storage _deposit, bytes32 _intentHash) internal {\\n Intent memory intent = intents[_intentHash];\\n\\n delete globalAccount[accounts[intent.onRamper].venmoIdHash].currentIntentHash;\\n delete intents[_intentHash];\\n _deposit.intentHashes.removeStorage(_intentHash);\\n\\n emit IntentPruned(_intentHash, intent.deposit);\\n }\\n\\n /**\\n * @notice Removes a deposit if no outstanding intents AND no remaining deposits. Deleting a deposit deletes it from the\\n * deposits mapping and removes tracking it in the user's accounts mapping.\\n */\\n function _closeDepositIfNecessary(uint256 _depositId, Deposit storage _deposit) internal {\\n uint256 openDepositAmount = _deposit.outstandingIntentAmount + _deposit.remainingDeposits;\\n if (openDepositAmount == 0) {\\n accounts[_deposit.depositor].deposits.removeStorage(_depositId);\\n emit DepositClosed(_depositId, _deposit.depositor);\\n delete deposits[_depositId];\\n }\\n }\\n\\n /**\\n * @notice Checks if sustainability fee has been defined, if so sends fee to the fee recipient and intent amount minus fee\\n * to the on-ramper. If sustainability fee is undefined then full intent amount is transferred to on-ramper.\\n */\\n function _transferFunds(bytes32 _intentHash, Intent memory _intent) internal {\\n uint256 fee;\\n if (sustainabilityFee != 0) {\\n fee = (_intent.amount * sustainabilityFee) / PRECISE_UNIT;\\n usdc.transfer(sustainabilityFeeRecipient, fee);\\n }\\n\\n uint256 onRampAmount = _intent.amount - fee;\\n usdc.transfer(_intent.to, onRampAmount);\\n\\n emit IntentFulfilled(_intentHash, _intent.deposit, _intent.onRamper, _intent.to, onRampAmount, fee);\\n }\\n\\n /**\\n * @notice Validate venmo send payment email and check that it hasn't already been used (done on SendProcessor).\\n * Additionally, we validate that the offRamperIdHash matches the one from the specified intent and that enough\\n * was paid off-chain inclusive of the conversionRate.\\n */\\n function _verifyOnRampProof(\\n uint256[2] memory _a,\\n uint256[2][2] memory _b,\\n uint256[2] memory _c,\\n uint256[12] memory _signals\\n )\\n internal\\n returns(Intent memory, Deposit storage, bytes32)\\n {\\n (\\n uint256 amount,\\n uint256 timestamp,\\n bytes32 offRamperIdHash,\\n bytes32 onRamperIdHash,\\n bytes32 intentHash\\n ) = sendProcessor.processProof(\\n ISendProcessor.SendProof({\\n a: _a,\\n b: _b,\\n c: _c,\\n signals: _signals\\n })\\n );\\n\\n Intent memory intent = intents[intentHash];\\n Deposit storage deposit = deposits[intent.deposit];\\n\\n require(intent.onRamper != address(0), \\\"Intent does not exist\\\");\\n require(intent.intentTimestamp <= timestamp, \\\"Intent was not created before send\\\");\\n require(accounts[deposit.depositor].venmoIdHash == offRamperIdHash, \\\"Offramper id does not match\\\");\\n require(accounts[intent.onRamper].venmoIdHash == onRamperIdHash, \\\"Onramper id does not match\\\");\\n require(amount >= (intent.amount * PRECISE_UNIT) / deposit.conversionRate, \\\"Payment was not enough\\\");\\n\\n return (intent, deposit, intentHash);\\n }\\n\\n /**\\n * @notice Validate the user has a venmo account, we do not nullify this email since it can be reused to register under\\n * different addresses.\\n */\\n function _verifyRegistrationProof(\\n uint256[2] memory _a,\\n uint256[2][2] memory _b,\\n uint256[2] memory _c,\\n uint256[5] memory _signals\\n )\\n internal\\n view\\n returns(bytes32)\\n {\\n bytes32 venmoIdHash = registrationProcessor.processProof(\\n IRegistrationProcessor.RegistrationProof({\\n a: _a,\\n b: _b,\\n c: _c,\\n signals: _signals\\n })\\n );\\n\\n return venmoIdHash;\\n }\\n}\\n\",\"keccak256\":\"0x55cb1c9701d9b03ff4e445f03993659c7d3b6922ad280d3b2a88edfad8af9fed\",\"license\":\"MIT\"},\"contracts/ramps/venmo-v1/interfaces/IRegistrationProcessor.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.18;\\n\\ninterface IRegistrationProcessor {\\n\\n struct RegistrationProof {\\n uint256[2] a;\\n uint256[2][2] b;\\n uint256[2] c;\\n uint256[5] signals;\\n }\\n\\n function processProof(\\n RegistrationProof calldata _proof\\n )\\n external\\n view\\n returns (bytes32);\\n}\\n\",\"keccak256\":\"0xc80e1b5561af1a8631547c72e6c6dcdf4e66c06b3eb34b1a8db1bb0f6d3ea90f\",\"license\":\"MIT\"},\"contracts/ramps/venmo-v1/interfaces/ISendProcessor.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.18;\\n\\ninterface ISendProcessor {\\n\\n struct SendProof {\\n uint256[2] a;\\n uint256[2][2] b;\\n uint256[2] c;\\n uint256[12] signals;\\n }\\n\\n function processProof(\\n SendProof calldata _proof\\n )\\n external\\n returns(uint256, uint256, bytes32, bytes32, bytes32);\\n}\\n\",\"keccak256\":\"0x16811e82d90b1e15eafd8f3de30b6a05a48c906c96e65d263c557c66e9fcedb7\",\"license\":\"MIT\"},\"contracts/ramps/venmo-v2/VenmoRampV2.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\n\\nimport { IERC20 } from \\\"@openzeppelin/contracts/token/ERC20/IERC20.sol\\\";\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\nimport { Bytes32ArrayUtils } from \\\"../../external/Bytes32ArrayUtils.sol\\\";\\nimport { Uint256ArrayUtils } from \\\"../../external/Uint256ArrayUtils.sol\\\";\\n\\nimport { IPoseidon } from \\\"../../interfaces/IPoseidon.sol\\\";\\nimport { IRamp } from \\\"./interfaces/IRamp.sol\\\";\\nimport { IRegistrationProcessorV2 } from \\\"./interfaces/IRegistrationProcessorV2.sol\\\";\\nimport { ISendProcessor } from \\\"../venmo-v1/interfaces/ISendProcessor.sol\\\";\\n\\npragma solidity ^0.8.18;\\n\\ncontract VenmoRampV2 is Ownable {\\n\\n using Bytes32ArrayUtils for bytes32[];\\n using Uint256ArrayUtils for uint256[];\\n\\n /* ============ Events ============ */\\n event AccountRegistered(address indexed accountOwner, bytes32 indexed venmoIdHash);\\n event DepositReceived(\\n uint256 indexed depositId,\\n bytes32 indexed venmoId,\\n uint256 amount,\\n uint256 conversionRate\\n );\\n event IntentSignaled(\\n bytes32 indexed intentHash,\\n uint256 indexed depositId,\\n bytes32 indexed venmoId,\\n address to,\\n uint256 amount,\\n uint256 timestamp\\n );\\n\\n event IntentPruned(\\n bytes32 indexed intentHash,\\n uint256 indexed depositId\\n );\\n // Do we want to emit the onRamper or the venmoId\\n event IntentFulfilled(\\n bytes32 indexed intentHash,\\n uint256 indexed depositId,\\n address indexed onRamper,\\n address to,\\n uint256 amount,\\n uint256 feeAmount\\n );\\n // Do we want to emit the depositor or the venmoId\\n event DepositWithdrawn(\\n uint256 indexed depositId,\\n address indexed depositor,\\n uint256 amount\\n );\\n\\n event DepositClosed(uint256 depositId, address depositor);\\n event UserAddedToDenylist(bytes32 listOwner, bytes32 deniedUser);\\n event UserRemovedFromDenylist(bytes32 listOwner, bytes32 approvedUser);\\n event MinDepositAmountSet(uint256 minDepositAmount);\\n event MaxOnRampAmountSet(uint256 maxOnRampAmount);\\n event IntentExpirationPeriodSet(uint256 intentExpirationPeriod);\\n event OnRampCooldownPeriodSet(uint256 onRampCooldownPeriod);\\n event SustainabilityFeeUpdated(uint256 fee);\\n event SustainabilityFeeRecipientUpdated(address feeRecipient);\\n event NewSendProcessorSet(address sendProcessor);\\n event NewRegistrationProcessorSet(address registrationProcessor);\\n event NewReceiveProcessorSet(address receiveProcessor);\\n\\n /* ============ Structs ============ */\\n\\n // Each Account is tied to a GlobalAccount via its associated venmoIdHash. Each account is represented by an Ethereum address\\n // and is allowed to have at most 5 deposits associated with it.\\n struct AccountInfo {\\n bytes32 venmoIdHash; // Poseidon hash of account's venmoId\\n uint256[] deposits; // Array of open account deposits\\n }\\n\\n struct Deposit {\\n address depositor;\\n uint256[3] packedVenmoId;\\n uint256 depositAmount; // Amount of USDC deposited\\n uint256 remainingDeposits; // Amount of remaining deposited liquidity\\n uint256 outstandingIntentAmount; // Amount of outstanding intents (may include expired intents)\\n uint256 conversionRate; // Conversion required by off-ramper between USDC/USD\\n bytes32[] intentHashes; // Array of hashes of all open intents (may include some expired if not pruned)\\n }\\n\\n struct DepositWithAvailableLiquidity {\\n uint256 depositId; // ID of the deposit\\n bytes32 depositorIdHash; // Depositor's venmoIdHash \\n Deposit deposit; // Deposit struct\\n uint256 availableLiquidity; // Amount of liquidity available to signal intents (net of expired intents)\\n }\\n\\n struct Intent {\\n address onRamper; // On-ramper's address\\n address to; // Address to forward funds to (can be same as onRamper)\\n uint256 deposit; // ID of the deposit the intent is signaling on\\n uint256 amount; // Amount of USDC the on-ramper signals intent for on-chain\\n uint256 intentTimestamp; // Timestamp of when the intent was signaled\\n }\\n\\n struct IntentWithOnRamperId {\\n bytes32 intentHash; // Intent hash\\n Intent intent; // Intent struct\\n bytes32 onRamperIdHash; // Poseidon hash of the on-ramper's venmoId\\n }\\n\\n struct DenyList {\\n bytes32[] deniedUsers; // Array of venmoIdHashes that are denied from taking depositors liquidity\\n mapping(bytes32 => bool) isDenied; // Mapping of venmoIdHash to boolean indicating if the user is denied\\n }\\n\\n // A Global Account is defined as an account represented by one venmoIdHash. This is used to enforce limitations on actions across\\n // all Ethereum addresses that are associated with that venmoId. In this case we use it to enforce a cooldown period between on ramps,\\n // restrict each venmo account to one outstanding intent at a time, and to enforce deny lists.\\n struct GlobalAccountInfo {\\n bytes32 currentIntentHash; // Hash of the current open intent (if exists)\\n uint256 lastOnrampTimestamp; // Timestamp of the last on-ramp transaction used to check if cooldown period elapsed\\n DenyList denyList; // Deny list of the account\\n }\\n\\n /* ============ Modifiers ============ */\\n modifier onlyRegisteredUser() {\\n require(getAccountVenmoIdHash(msg.sender) != bytes32(0), \\\"Caller must be registered user\\\");\\n _;\\n }\\n\\n /* ============ Constants ============ */\\n uint256 internal constant PRECISE_UNIT = 1e18;\\n uint256 internal constant MAX_DEPOSITS = 5; // An account can only have max 5 different deposit parameterizations to prevent locking funds\\n uint256 constant CIRCOM_PRIME_FIELD = 21888242871839275222246405745257275088548364400416034343698204186575808495617;\\n uint256 constant MAX_SUSTAINABILITY_FEE = 5e16; // 5% max sustainability fee\\n \\n /* ============ State Variables ============ */\\n IERC20 public immutable usdc; // USDC token contract\\n IPoseidon public immutable poseidon; // Poseidon hashing contract\\n IRamp public immutable ramp; // V1 Ramp contract, used to share registration state\\n IRegistrationProcessorV2 public registrationProcessor; // Address of registration processor contract, verifies registration e-mails\\n ISendProcessor public sendProcessor; // Address of send processor contract, verifies onRamp emails\\n\\n bool public isInitialized; // Indicates if contract has been initialized\\n\\n mapping(bytes32 => GlobalAccountInfo) internal globalAccount; // Mapping of venmoIdHash to information used to enforce actions across Ethereum accounts\\n mapping(address => AccountInfo) internal accounts; // Mapping of Ethereum accounts to their account information (venmoIdHash and deposits)\\n mapping(uint256 => Deposit) public deposits; // Mapping of depositIds to deposit structs\\n mapping(bytes32 => Intent) public intents; // Mapping of intentHashes to intent structs\\n\\n uint256 public minDepositAmount; // Minimum amount of USDC that can be deposited\\n uint256 public maxOnRampAmount; // Maximum amount of USDC that can be on-ramped in a single transaction\\n uint256 public onRampCooldownPeriod; // Time period that must elapse between completing an on-ramp and signaling a new intent\\n uint256 public intentExpirationPeriod; // Time period after which an intent can be pruned from the system\\n uint256 public sustainabilityFee; // Fee charged to on-rampers in preciseUnits (1e16 = 1%)\\n address public sustainabilityFeeRecipient; // Address that receives the sustainability fee\\n\\n uint256 public depositCounter; // Counter for depositIds\\n\\n /* ============ Constructor ============ */\\n constructor(\\n address _owner,\\n IRamp _ramp,\\n IERC20 _usdc,\\n IPoseidon _poseidon,\\n uint256 _minDepositAmount,\\n uint256 _maxOnRampAmount,\\n uint256 _intentExpirationPeriod,\\n uint256 _onRampCooldownPeriod,\\n uint256 _sustainabilityFee,\\n address _sustainabilityFeeRecipient\\n )\\n Ownable()\\n {\\n usdc = _usdc;\\n ramp = _ramp;\\n poseidon = _poseidon;\\n minDepositAmount = _minDepositAmount;\\n maxOnRampAmount = _maxOnRampAmount;\\n intentExpirationPeriod = _intentExpirationPeriod;\\n onRampCooldownPeriod = _onRampCooldownPeriod;\\n sustainabilityFee = _sustainabilityFee;\\n sustainabilityFeeRecipient = _sustainabilityFeeRecipient;\\n\\n transferOwnership(_owner);\\n }\\n\\n /* ============ External Functions ============ */\\n\\n /**\\n * @notice Initialize Ramp with the addresses of the Processors\\n *\\n * @param _registrationProcessor Registration processor address\\n * @param _sendProcessor Send processor address\\n */\\n function initialize(\\n IRegistrationProcessorV2 _registrationProcessor,\\n ISendProcessor _sendProcessor\\n )\\n external\\n onlyOwner\\n {\\n require(!isInitialized, \\\"Already initialized\\\");\\n\\n registrationProcessor = _registrationProcessor;\\n sendProcessor = _sendProcessor;\\n\\n isInitialized = true;\\n }\\n\\n /**\\n * @notice Registers a new account by pulling the hash of the account id from the proof and assigning the account owner to the\\n * sender of the transaction. One venmo account can be registered to multiple Ethereum addresses.\\n *\\n * @param _a Parameter of zk proof\\n * @param _b Parameter of zk proof\\n * @param _c Parameter of zk proof\\n * @param _signals Encoded public signals of the zk proof, contains mailserverHash, fromEmail, userIdHash\\n */\\n function register(\\n uint[2] memory _a,\\n uint[2][2] memory _b,\\n uint[2] memory _c,\\n uint[5] memory _signals\\n )\\n external\\n {\\n require(getAccountVenmoIdHash(msg.sender) == bytes32(0), \\\"Account already associated with venmoId\\\");\\n bytes32 venmoIdHash = _verifyRegistrationProof(_a, _b, _c, _signals);\\n\\n accounts[msg.sender].venmoIdHash = venmoIdHash;\\n\\n emit AccountRegistered(msg.sender, venmoIdHash);\\n }\\n\\n /**\\n * @notice Generates a deposit entry for off-rampers that can then be fulfilled by an on-ramper. This function will not add to\\n * previous deposits. Every deposit has it's own unique identifier. User must approve the contract to transfer the deposit amount\\n * of USDC.\\n *\\n * @param _packedVenmoId The packed venmo id of the account owner (we pack for easy use with poseidon)\\n * @param _depositAmount The amount of USDC to off-ramp\\n * @param _receiveAmount The amount of USD to receive\\n */\\n function offRamp(\\n uint256[3] memory _packedVenmoId,\\n uint256 _depositAmount,\\n uint256 _receiveAmount\\n )\\n external\\n onlyRegisteredUser\\n {\\n bytes32 venmoIdHash = bytes32(poseidon.poseidon(_packedVenmoId));\\n\\n require(getAccountVenmoIdHash(msg.sender) == venmoIdHash, \\\"Sender must be the account owner\\\");\\n require(accounts[msg.sender].deposits.length < MAX_DEPOSITS, \\\"Maximum deposit amount reached\\\");\\n require(_depositAmount >= minDepositAmount, \\\"Deposit amount must be greater than min deposit amount\\\");\\n require(_receiveAmount > 0, \\\"Receive amount must be greater than 0\\\");\\n\\n uint256 conversionRate = (_depositAmount * PRECISE_UNIT) / _receiveAmount;\\n uint256 depositId = depositCounter++;\\n\\n accounts[msg.sender].deposits.push(depositId);\\n\\n deposits[depositId] = Deposit({\\n depositor: msg.sender,\\n packedVenmoId: _packedVenmoId,\\n depositAmount: _depositAmount,\\n remainingDeposits: _depositAmount,\\n outstandingIntentAmount: 0,\\n conversionRate: conversionRate,\\n intentHashes: new bytes32[](0)\\n });\\n\\n usdc.transferFrom(msg.sender, address(this), _depositAmount);\\n\\n emit DepositReceived(depositId, venmoIdHash, _depositAmount, conversionRate);\\n }\\n\\n /**\\n * @notice Signals intent to pay the depositor defined in the _depositId the _amount * deposit conversionRate off-chain\\n * in order to unlock _amount of funds on-chain. Each user can only have one outstanding intent at a time regardless of\\n * address (tracked using venmoId). Caller must not be on the depositor's deny list. If there are prunable intents then\\n * they will be deleted from the deposit to be able to maintain state hygiene.\\n *\\n * @param _depositId The ID of the deposit the on-ramper intends to use for \\n * @param _amount The amount of USDC the user wants to on-ramp\\n * @param _to Address to forward funds to (can be same as onRamper)\\n */\\n function signalIntent(uint256 _depositId, uint256 _amount, address _to) external onlyRegisteredUser {\\n bytes32 venmoIdHash = getAccountVenmoIdHash(msg.sender);\\n Deposit storage deposit = deposits[_depositId];\\n bytes32 depositorVenmoIdHash = getAccountVenmoIdHash(deposit.depositor);\\n\\n // Caller validity checks\\n require(!globalAccount[depositorVenmoIdHash].denyList.isDenied[venmoIdHash], \\\"Onramper on depositor's denylist\\\");\\n require(\\n globalAccount[venmoIdHash].lastOnrampTimestamp + onRampCooldownPeriod <= block.timestamp,\\n \\\"On ramp cool down period not elapsed\\\"\\n );\\n require(globalAccount[venmoIdHash].currentIntentHash == bytes32(0), \\\"Intent still outstanding\\\");\\n require(depositorVenmoIdHash != venmoIdHash, \\\"Sender cannot be the depositor\\\");\\n\\n // Intent information checks\\n require(deposit.depositor != address(0), \\\"Deposit does not exist\\\");\\n require(_amount > 0, \\\"Signaled amount must be greater than 0\\\");\\n require(_amount <= maxOnRampAmount, \\\"Signaled amount must be less than max on-ramp amount\\\");\\n require(_to != address(0), \\\"Cannot send to zero address\\\");\\n\\n bytes32 intentHash = _calculateIntentHash(venmoIdHash, _depositId);\\n\\n if (deposit.remainingDeposits < _amount) {\\n (\\n bytes32[] memory prunableIntents,\\n uint256 reclaimableAmount\\n ) = _getPrunableIntents(_depositId);\\n\\n require(deposit.remainingDeposits + reclaimableAmount >= _amount, \\\"Not enough liquidity\\\");\\n\\n _pruneIntents(deposit, prunableIntents);\\n deposit.remainingDeposits += reclaimableAmount;\\n deposit.outstandingIntentAmount -= reclaimableAmount;\\n }\\n\\n intents[intentHash] = Intent({\\n onRamper: msg.sender,\\n to: _to,\\n deposit: _depositId,\\n amount: _amount,\\n intentTimestamp: block.timestamp\\n });\\n\\n globalAccount[venmoIdHash].currentIntentHash = intentHash;\\n\\n deposit.remainingDeposits -= _amount;\\n deposit.outstandingIntentAmount += _amount;\\n deposit.intentHashes.push(intentHash);\\n\\n emit IntentSignaled(intentHash, _depositId, venmoIdHash, _to, _amount, block.timestamp);\\n }\\n\\n /**\\n * @notice Only callable by the originator of the intent. Cancels an outstanding intent thus allowing user to signal a new\\n * intent. Deposit state is updated to reflect the cancelled intent.\\n *\\n * @param _intentHash Hash of intent being cancelled\\n */\\n function cancelIntent(bytes32 _intentHash) external {\\n Intent memory intent = intents[_intentHash];\\n \\n require(intent.intentTimestamp != 0, \\\"Intent does not exist\\\");\\n require(\\n getAccountVenmoIdHash(intent.onRamper) == getAccountVenmoIdHash(msg.sender),\\n \\\"Sender must be the on-ramper\\\"\\n );\\n\\n Deposit storage deposit = deposits[intent.deposit];\\n\\n _pruneIntent(deposit, _intentHash);\\n\\n deposit.remainingDeposits += intent.amount;\\n deposit.outstandingIntentAmount -= intent.amount;\\n }\\n\\n /**\\n * @notice Anyone can submit an on-ramp transaction, even if caller isn't on-ramper. Upon submission the proof is validated,\\n * intent is removed, and deposit state is updated. USDC is transferred to the on-ramper.\\n *\\n * @param _a Parameter of zk proof\\n * @param _b Parameter of zk proof\\n * @param _c Parameter of zk proof\\n * @param _signals Encoded public signals of the zk proof, contains mailserverHash, fromEmail, timestamp, onRamperIdHash,\\n * nullifier, intentHash\\n */\\n function onRamp(\\n uint256[2] memory _a,\\n uint256[2][2] memory _b,\\n uint256[2] memory _c,\\n uint256[12] memory _signals\\n )\\n external\\n {\\n (\\n Intent memory intent,\\n Deposit storage deposit,\\n bytes32 intentHash\\n ) = _verifyOnRampProof(_a, _b, _c, _signals);\\n\\n _pruneIntent(deposit, intentHash);\\n\\n deposit.outstandingIntentAmount -= intent.amount;\\n globalAccount[getAccountVenmoIdHash(intent.onRamper)].lastOnrampTimestamp = block.timestamp;\\n _closeDepositIfNecessary(intent.deposit, deposit);\\n\\n _transferFunds(intentHash, intent);\\n }\\n\\n /**\\n * @notice Allows off-ramper to release funds to the on-ramper in case of a failed on-ramp or because of some other arrangement\\n * between the two parties. Upon submission we check to make sure the msg.sender is the depositor, the intent is removed, and \\n * deposit state is updated. USDC is transferred to the on-ramper.\\n *\\n * @param _intentHash Hash of intent to resolve by releasing the funds\\n */\\n function releaseFundsToOnramper(bytes32 _intentHash) external {\\n Intent memory intent = intents[_intentHash];\\n Deposit storage deposit = deposits[intent.deposit];\\n\\n require(intent.onRamper != address(0), \\\"Intent does not exist\\\");\\n require(deposit.depositor == msg.sender, \\\"Caller must be the depositor\\\");\\n\\n _pruneIntent(deposit, _intentHash);\\n\\n deposit.outstandingIntentAmount -= intent.amount;\\n globalAccount[getAccountVenmoIdHash(intent.onRamper)].lastOnrampTimestamp = block.timestamp;\\n _closeDepositIfNecessary(intent.deposit, deposit);\\n\\n _transferFunds(_intentHash, intent);\\n }\\n\\n /**\\n * @notice Caller must be the depositor for each depositId in the array, if not whole function fails. Depositor is returned all\\n * remaining deposits and any outstanding intents that are expired. If an intent is not expired then those funds will not be\\n * returned. Deposit will be deleted as long as there are no more outstanding intents.\\n *\\n * @param _depositIds Array of depositIds the depositor is attempting to withdraw\\n */\\n function withdrawDeposit(uint256[] memory _depositIds) external {\\n uint256 returnAmount;\\n\\n for (uint256 i = 0; i < _depositIds.length; ++i) {\\n uint256 depositId = _depositIds[i];\\n Deposit storage deposit = deposits[depositId];\\n\\n require(deposit.depositor == msg.sender, \\\"Sender must be the depositor\\\");\\n\\n (\\n bytes32[] memory prunableIntents,\\n uint256 reclaimableAmount\\n ) = _getPrunableIntents(depositId);\\n\\n _pruneIntents(deposit, prunableIntents);\\n\\n returnAmount += deposit.remainingDeposits + reclaimableAmount;\\n \\n deposit.outstandingIntentAmount -= reclaimableAmount;\\n\\n emit DepositWithdrawn(depositId, deposit.depositor, deposit.remainingDeposits + reclaimableAmount);\\n \\n delete deposit.remainingDeposits;\\n _closeDepositIfNecessary(depositId, deposit);\\n }\\n\\n usdc.transfer(msg.sender, returnAmount);\\n }\\n\\n /**\\n * @notice Adds a venmoId to a depositor's deny list. If an address associated with the banned venmoId attempts to\\n * signal an intent on the user's deposit they will be denied.\\n *\\n * @param _deniedUser Poseidon hash of the venmoId being banned\\n */\\n function addAccountToDenylist(bytes32 _deniedUser) external onlyRegisteredUser {\\n bytes32 denyingUser = getAccountVenmoIdHash(msg.sender);\\n\\n require(!globalAccount[denyingUser].denyList.isDenied[_deniedUser], \\\"User already on denylist\\\");\\n\\n globalAccount[denyingUser].denyList.isDenied[_deniedUser] = true;\\n globalAccount[denyingUser].denyList.deniedUsers.push(_deniedUser);\\n\\n emit UserAddedToDenylist(denyingUser, _deniedUser);\\n }\\n\\n /**\\n * @notice Removes a venmoId from a depositor's deny list.\\n *\\n * @param _approvedUser Poseidon hash of the venmoId being approved\\n */\\n function removeAccountFromDenylist(bytes32 _approvedUser) external onlyRegisteredUser {\\n bytes32 approvingUser = getAccountVenmoIdHash(msg.sender);\\n\\n require(globalAccount[approvingUser].denyList.isDenied[_approvedUser], \\\"User not on denylist\\\");\\n\\n globalAccount[approvingUser].denyList.isDenied[_approvedUser] = false;\\n globalAccount[approvingUser].denyList.deniedUsers.removeStorage(_approvedUser);\\n\\n emit UserRemovedFromDenylist(approvingUser, _approvedUser);\\n }\\n\\n /* ============ Governance Functions ============ */\\n\\n /**\\n * @notice GOVERNANCE ONLY: Updates the send processor address used for validating and interpreting zk proofs.\\n *\\n * @param _sendProcessor New send proccesor address\\n */\\n function setSendProcessor(ISendProcessor _sendProcessor) external onlyOwner {\\n sendProcessor = _sendProcessor;\\n emit NewSendProcessorSet(address(_sendProcessor));\\n }\\n\\n /**\\n * @notice GOVERNANCE ONLY: Updates the registration processor address used for validating and interpreting zk proofs.\\n *\\n * @param _registrationProcessor New registration proccesor address\\n */\\n function setRegistrationProcessor(IRegistrationProcessorV2 _registrationProcessor) external onlyOwner {\\n registrationProcessor = _registrationProcessor;\\n emit NewRegistrationProcessorSet(address(_registrationProcessor));\\n }\\n\\n /**\\n * @notice GOVERNANCE ONLY: Updates the minimum deposit amount a user can specify for off-ramping.\\n *\\n * @param _minDepositAmount The new minimum deposit amount\\n */\\n function setMinDepositAmount(uint256 _minDepositAmount) external onlyOwner {\\n require(_minDepositAmount != 0, \\\"Minimum deposit cannot be zero\\\");\\n\\n minDepositAmount = _minDepositAmount;\\n emit MinDepositAmountSet(_minDepositAmount);\\n }\\n\\n /**\\n * @notice GOVERNANCE ONLY: Updates the sustainability fee. This fee is charged to on-rampers upon a successful on-ramp.\\n *\\n * @param _fee The new sustainability fee in precise units (10**18, ie 10% = 1e17)\\n */\\n function setSustainabilityFee(uint256 _fee) external onlyOwner {\\n require(_fee <= MAX_SUSTAINABILITY_FEE, \\\"Fee cannot be greater than max fee\\\");\\n\\n sustainabilityFee = _fee;\\n emit SustainabilityFeeUpdated(_fee);\\n }\\n\\n /**\\n * @notice GOVERNANCE ONLY: Updates the recepient of sustainability fees.\\n *\\n * @param _feeRecipient The new fee recipient address\\n */\\n function setSustainabilityFeeRecipient(address _feeRecipient) external onlyOwner {\\n require(_feeRecipient != address(0), \\\"Fee recipient cannot be zero address\\\");\\n\\n sustainabilityFeeRecipient = _feeRecipient;\\n emit SustainabilityFeeRecipientUpdated(_feeRecipient);\\n }\\n\\n /**\\n * @notice GOVERNANCE ONLY: Updates the max amount allowed to be on-ramped in each transaction. To on-ramp more than\\n * this amount a user must make multiple transactions.\\n *\\n * @param _maxOnRampAmount The new max on ramp amount\\n */\\n function setMaxOnRampAmount(uint256 _maxOnRampAmount) external onlyOwner {\\n require(_maxOnRampAmount != 0, \\\"Max on ramp amount cannot be zero\\\");\\n\\n maxOnRampAmount = _maxOnRampAmount;\\n emit MaxOnRampAmountSet(_maxOnRampAmount);\\n }\\n\\n /**\\n * @notice GOVERNANCE ONLY: Updates the on-ramp cooldown period, once an on-ramp transaction is completed the user must wait this\\n * amount of time before they can signalIntent to on-ramp again.\\n *\\n * @param _onRampCooldownPeriod New on-ramp cooldown period\\n */\\n function setOnRampCooldownPeriod(uint256 _onRampCooldownPeriod) external onlyOwner {\\n onRampCooldownPeriod = _onRampCooldownPeriod;\\n emit OnRampCooldownPeriodSet(_onRampCooldownPeriod);\\n }\\n\\n /**\\n * @notice GOVERNANCE ONLY: Updates the intent expiration period, after this period elapses an intent can be pruned to prevent\\n * locking up a depositor's funds.\\n *\\n * @param _intentExpirationPeriod New intent expiration period\\n */\\n function setIntentExpirationPeriod(uint256 _intentExpirationPeriod) external onlyOwner {\\n require(_intentExpirationPeriod != 0, \\\"Max intent expiration period cannot be zero\\\");\\n\\n intentExpirationPeriod = _intentExpirationPeriod;\\n emit IntentExpirationPeriodSet(_intentExpirationPeriod);\\n }\\n\\n\\n /* ============ External View Functions ============ */\\n\\n function getDeposit(uint256 _depositId) external view returns (Deposit memory) {\\n return deposits[_depositId];\\n }\\n\\n function getAccountInfo(address _account) external view returns (AccountInfo memory) {\\n return AccountInfo({\\n venmoIdHash: getAccountVenmoIdHash(_account),\\n deposits: accounts[_account].deposits\\n });\\n }\\n\\n function getAccountVenmoIdHash(address _account) public view returns (bytes32) {\\n return accounts[_account].venmoIdHash == bytes32(0) ?\\n ramp.getAccountInfo(_account).venmoIdHash :\\n accounts[_account].venmoIdHash;\\n }\\n\\n function getVenmoIdCurrentIntentHash(address _account) external view returns (bytes32) {\\n return globalAccount[getAccountVenmoIdHash(_account)].currentIntentHash;\\n }\\n\\n function getLastOnRampTimestamp(address _account) external view returns (uint256) {\\n return globalAccount[getAccountVenmoIdHash(_account)].lastOnrampTimestamp;\\n }\\n\\n function getDeniedUsers(address _account) external view returns (bytes32[] memory) {\\n return globalAccount[getAccountVenmoIdHash(_account)].denyList.deniedUsers;\\n }\\n\\n function isDeniedUser(address _account, bytes32 _deniedUser) external view returns (bool) {\\n return globalAccount[getAccountVenmoIdHash(_account)].denyList.isDenied[_deniedUser];\\n }\\n\\n function getIntentsWithOnRamperId(bytes32[] calldata _intentHashes) external view returns (IntentWithOnRamperId[] memory) {\\n IntentWithOnRamperId[] memory intentsWithOnRamperId = new IntentWithOnRamperId[](_intentHashes.length);\\n\\n for (uint256 i = 0; i < _intentHashes.length; ++i) {\\n bytes32 intentHash = _intentHashes[i];\\n Intent memory intent = intents[intentHash];\\n intentsWithOnRamperId[i] = IntentWithOnRamperId({\\n intentHash: _intentHashes[i],\\n intent: intent,\\n onRamperIdHash: getAccountVenmoIdHash(intent.onRamper)\\n });\\n }\\n\\n return intentsWithOnRamperId;\\n }\\n\\n function getAccountDeposits(address _account) external view returns (DepositWithAvailableLiquidity[] memory accountDeposits) {\\n uint256[] memory accountDepositIds = accounts[_account].deposits;\\n accountDeposits = new DepositWithAvailableLiquidity[](accountDepositIds.length);\\n \\n for (uint256 i = 0; i < accountDepositIds.length; ++i) {\\n uint256 depositId = accountDepositIds[i];\\n Deposit memory deposit = deposits[depositId];\\n ( , uint256 reclaimableAmount) = _getPrunableIntents(depositId);\\n\\n accountDeposits[i] = DepositWithAvailableLiquidity({\\n depositId: depositId,\\n depositorIdHash: getAccountVenmoIdHash(deposit.depositor),\\n deposit: deposit,\\n availableLiquidity: deposit.remainingDeposits + reclaimableAmount\\n });\\n }\\n }\\n\\n function getDepositFromIds(uint256[] memory _depositIds) external view returns (DepositWithAvailableLiquidity[] memory depositArray) {\\n depositArray = new DepositWithAvailableLiquidity[](_depositIds.length);\\n\\n for (uint256 i = 0; i < _depositIds.length; ++i) {\\n uint256 depositId = _depositIds[i];\\n Deposit memory deposit = deposits[depositId];\\n ( , uint256 reclaimableAmount) = _getPrunableIntents(depositId);\\n\\n depositArray[i] = DepositWithAvailableLiquidity({\\n depositId: depositId,\\n depositorIdHash: getAccountVenmoIdHash(deposit.depositor),\\n deposit: deposit,\\n availableLiquidity: deposit.remainingDeposits + reclaimableAmount\\n });\\n }\\n\\n return depositArray;\\n }\\n\\n /* ============ Internal Functions ============ */\\n\\n /**\\n * @notice Calculates the intentHash of new intent\\n */\\n function _calculateIntentHash(\\n bytes32 _venmoId,\\n uint256 _depositId\\n )\\n internal\\n view\\n virtual\\n returns (bytes32 intentHash)\\n {\\n // Mod with circom prime field to make sure it fits in a 254-bit field\\n uint256 intermediateHash = uint256(keccak256(abi.encodePacked(_venmoId, _depositId, block.timestamp)));\\n intentHash = bytes32(intermediateHash % CIRCOM_PRIME_FIELD);\\n }\\n\\n /**\\n * @notice Cycles through all intents currently open on a deposit and sees if any have expired. If they have expired\\n * the outstanding amounts are summed and returned alongside the intentHashes\\n */\\n function _getPrunableIntents(\\n uint256 _depositId\\n )\\n internal\\n view\\n returns(bytes32[] memory prunableIntents, uint256 reclaimedAmount)\\n {\\n bytes32[] memory intentHashes = deposits[_depositId].intentHashes;\\n prunableIntents = new bytes32[](intentHashes.length);\\n\\n for (uint256 i = 0; i < intentHashes.length; ++i) {\\n Intent memory intent = intents[intentHashes[i]];\\n if (intent.intentTimestamp + intentExpirationPeriod < block.timestamp) {\\n prunableIntents[i] = intentHashes[i];\\n reclaimedAmount += intent.amount;\\n }\\n }\\n }\\n\\n function _pruneIntents(Deposit storage _deposit, bytes32[] memory _intents) internal {\\n for (uint256 i = 0; i < _intents.length; ++i) {\\n if (_intents[i] != bytes32(0)) {\\n _pruneIntent(_deposit, _intents[i]);\\n }\\n }\\n }\\n\\n /**\\n * @notice Pruning an intent involves deleting its state from the intents mapping, zeroing out the intendee's currentIntentHash in\\n * their global account mapping, and deleting the intentHash from the deposit's intentHashes array.\\n */\\n function _pruneIntent(Deposit storage _deposit, bytes32 _intentHash) internal {\\n Intent memory intent = intents[_intentHash];\\n\\n delete globalAccount[getAccountVenmoIdHash(intent.onRamper)].currentIntentHash;\\n delete intents[_intentHash];\\n _deposit.intentHashes.removeStorage(_intentHash);\\n\\n emit IntentPruned(_intentHash, intent.deposit);\\n }\\n\\n /**\\n * @notice Removes a deposit if no outstanding intents AND no remaining deposits. Deleting a deposit deletes it from the\\n * deposits mapping and removes tracking it in the user's accounts mapping.\\n */\\n function _closeDepositIfNecessary(uint256 _depositId, Deposit storage _deposit) internal {\\n uint256 openDepositAmount = _deposit.outstandingIntentAmount + _deposit.remainingDeposits;\\n if (openDepositAmount == 0) {\\n accounts[_deposit.depositor].deposits.removeStorage(_depositId);\\n emit DepositClosed(_depositId, _deposit.depositor);\\n delete deposits[_depositId];\\n }\\n }\\n\\n /**\\n * @notice Checks if sustainability fee has been defined, if so sends fee to the fee recipient and intent amount minus fee\\n * to the on-ramper. If sustainability fee is undefined then full intent amount is transferred to on-ramper.\\n */\\n function _transferFunds(bytes32 _intentHash, Intent memory _intent) internal {\\n uint256 fee;\\n if (sustainabilityFee != 0) {\\n fee = (_intent.amount * sustainabilityFee) / PRECISE_UNIT;\\n usdc.transfer(sustainabilityFeeRecipient, fee);\\n }\\n\\n uint256 onRampAmount = _intent.amount - fee;\\n usdc.transfer(_intent.to, onRampAmount);\\n\\n emit IntentFulfilled(_intentHash, _intent.deposit, _intent.onRamper, _intent.to, onRampAmount, fee);\\n }\\n\\n /**\\n * @notice Validate venmo send payment email and check that it hasn't already been used (done on SendProcessor).\\n * Additionally, we validate that the offRamperIdHash matches the one from the specified intent and that enough\\n * was paid off-chain inclusive of the conversionRate.\\n */\\n function _verifyOnRampProof(\\n uint256[2] memory _a,\\n uint256[2][2] memory _b,\\n uint256[2] memory _c,\\n uint256[12] memory _signals\\n )\\n internal\\n returns(Intent memory, Deposit storage, bytes32)\\n {\\n (\\n uint256 amount,\\n uint256 timestamp,\\n bytes32 offRamperIdHash,\\n bytes32 onRamperIdHash,\\n bytes32 intentHash\\n ) = sendProcessor.processProof(\\n ISendProcessor.SendProof({\\n a: _a,\\n b: _b,\\n c: _c,\\n signals: _signals\\n })\\n );\\n\\n Intent memory intent = intents[intentHash];\\n Deposit storage deposit = deposits[intent.deposit];\\n\\n require(intent.onRamper != address(0), \\\"Intent does not exist\\\");\\n require(intent.intentTimestamp <= timestamp, \\\"Intent was not created before send\\\");\\n require(getAccountVenmoIdHash(deposit.depositor) == offRamperIdHash, \\\"Offramper id does not match\\\");\\n require(getAccountVenmoIdHash(intent.onRamper) == onRamperIdHash, \\\"Onramper id does not match\\\");\\n require(amount >= (intent.amount * PRECISE_UNIT) / deposit.conversionRate, \\\"Payment was not enough\\\");\\n\\n return (intent, deposit, intentHash);\\n }\\n\\n /**\\n * @notice Validate the user has a venmo account, we do not nullify this email since it can be reused to register under\\n * different addresses.\\n */\\n function _verifyRegistrationProof(\\n uint256[2] memory _a,\\n uint256[2][2] memory _b,\\n uint256[2] memory _c,\\n uint256[5] memory _signals\\n )\\n internal\\n returns(bytes32)\\n {\\n bytes32 venmoIdHash = registrationProcessor.processProof(\\n IRegistrationProcessorV2.RegistrationProof({\\n a: _a,\\n b: _b,\\n c: _c,\\n signals: _signals\\n })\\n );\\n\\n return venmoIdHash;\\n }\\n}\\n\",\"keccak256\":\"0x518dcdcb17faceecc71150a2a412462429cdb61856603e23affd44394523dea8\",\"license\":\"MIT\"},\"contracts/ramps/venmo-v2/interfaces/IRamp.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\n\\nimport { Ramp } from \\\"../../venmo-v1/Ramp.sol\\\";\\n\\npragma solidity ^0.8.18;\\n\\ninterface IRamp {\\n function getAccountInfo(address _account) external view returns (Ramp.AccountInfo memory);\\n}\\n\",\"keccak256\":\"0xffaff7b2fe82cb5756f2c472987d6cfd157312da87a355f21ef7aaf62df27161\",\"license\":\"MIT\"},\"contracts/ramps/venmo-v2/interfaces/IRegistrationProcessorV2.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.18;\\n\\ninterface IRegistrationProcessorV2 {\\n\\n struct RegistrationProof {\\n uint256[2] a;\\n uint256[2][2] b;\\n uint256[2] c;\\n uint256[5] signals;\\n }\\n\\n function processProof(\\n RegistrationProof calldata _proof\\n )\\n external\\n returns (bytes32);\\n}\\n\",\"keccak256\":\"0x67a284be0f71e8f1518098567b7dc9200c8b312ea90e44600d4efeb9d8986f91\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x60e060405234801562000010575f80fd5b5060405162004229380380620042298339810160408190526200003391620001e7565b6200003e33620000a3565b6001600160a01b0388811660805289811660c05287811660a05260078790556008869055600a8590556009849055600b839055600c80546001600160a01b031916918316919091179055620000938a620000f2565b5050505050505050505062000294565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b620000fc62000175565b6001600160a01b038116620001675760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b6200017281620000a3565b50565b5f546001600160a01b03163314620001d05760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016200015e565b565b6001600160a01b038116811462000172575f80fd5b5f805f805f805f805f806101408b8d03121562000202575f80fd5b8a516200020f81620001d2565b60208c0151909a506200022281620001d2565b60408c01519099506200023581620001d2565b60608c01519098506200024881620001d2565b8097505060808b0151955060a08b0151945060c08b0151935060e08b015192506101008b015191506101208b01516200028181620001d2565b809150509295989b9194979a5092959850565b60805160a05160c051613f40620002e95f395f81816102eb015261210501525f818161061b01526110fa01525f81816103900152818161143101528181611a7a01528181612b140152612bbf0152613f405ff3fe608060405234801561000f575f80fd5b5060043610610281575f3560e01c80637b510fe811610156578063ce523ca3116100ca578063ecb3dc8811610084578063ecb3dc88146106b8578063ecd618f0146106c1578063ed1692b8146106e1578063eea1d197146106f4578063f2fde38b14610707578063fbf15b1f1461071a575f80fd5b8063ce523ca314610650578063d55f960d14610663578063d9478d2014610676578063da26c18914610689578063e215ad591461069c578063e279d964146106af575f80fd5b80639f9fb9681161011b5780639f9fb96814610562578063a1a954b714610582578063b02c43d01461058b578063b3fa4c0114610603578063c62b919e14610616578063cc181c2e1461063d575f80fd5b80637b510fe8146104915780638da5cb5b146104b15780639021578a146104c15780639087beff1461053c5780639b357b5a1461054f575f80fd5b806342987349116101f85780635dd76515116101b25780635dd7651514610434578063645006ca1461044757806366ec8419146104505780637113476214610463578063715018a61461047657806371a28f691461047e575f80fd5b806342987349146103b25780634595bba0146103c5578063485cc955146103e55780634877b7b6146103f8578063495223e71461040b5780635081d95214610414575f80fd5b8063238c849411610249578063238c8494146103255780632a80cda31461032e578063317dcc9614610341578063392e53cd146103545780633adba28a146103785780633e413bee1461038b575f80fd5b80630f1ef98c14610285578063123a11e4146102ab578063133de6cb146102be578063148172da146102d357806315d276e1146102e6575b5f80fd5b61029861029336600461344c565b61072d565b6040519081526020015b60405180910390f35b6102986102b936600461344c565b610752565b6102d16102cc36600461344c565b610775565b005b6102d16102e136600461346e565b6107d2565b61030d7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016102a2565b610298600b5481565b6102d161033c36600461346e565b6108fd565b6102d161034f36600461346e565b610989565b60025461036890600160a01b900460ff1681565b60405190151581526020016102a2565b6102d1610386366004613485565b6109c6565b61030d7f000000000000000000000000000000000000000000000000000000000000000081565b6102d16103c036600461346e565b610f13565b6103d86103d336600461344c565b610fb3565b6040516102a291906134bb565b6102d16103f33660046134fe565b611027565b6102d16104063660046135a1565b6110ba565b61029860095481565b61042761042236600461344c565b6114ea565b6040516102a291906136e9565b6102d161044236600461346e565b611728565b61029860075481565b6102d161045e36600461346e565b6117c7565b6102d1610471366004613797565b611908565b6102d1611aec565b61042761048c366004613797565b611aff565b6104a461049f36600461344c565b611cd8565b6040516102a29190613827565b5f546001600160a01b031661030d565b6105096104cf36600461346e565b60066020525f9081526040902080546001820154600283015460038401546004909401546001600160a01b03938416949390921692909185565b604080516001600160a01b039687168152959094166020860152928401919091526060830152608082015260a0016102a2565b6102d161054a36600461346e565b611d73565b6102d161055d36600461346e565b611e09565b61057561057036600461346e565b611f09565b6040516102a2919061387e565b610298600a5481565b6105d161059936600461346e565b600560208190525f9182526040909120805460048201549282015460068301546007909301546001600160a01b039092169392909185565b604080516001600160a01b0390961686526020860194909452928401919091526060830152608082015260a0016102a2565b6102d161061136600461344c565b611ff4565b61030d7f000000000000000000000000000000000000000000000000000000000000000081565b61029861064b36600461344c565b6120ac565b6102d161065e366004613929565b612178565b6102d161067136600461346e565b61222f565b600c5461030d906001600160a01b031681565b6102d16106973660046139db565b61235c565b60015461030d906001600160a01b031681565b61029860085481565b610298600d5481565b6106d46106cf366004613a4c565b6123de565b6040516102a29190613aba565b6102d16106ef36600461344c565b612520565b60025461030d906001600160a01b031681565b6102d161071536600461344c565b612576565b610368610728366004613b49565b6125ef565b5f60035f61073a846120ac565b81526020019081526020015f20600101549050919050565b5f60035f61075f846120ac565b815260208101919091526040015f205492915050565b61077d612627565b600280546001600160a01b0319166001600160a01b0383169081179091556040519081527f6e7665a41605edc0d70f4b991d652755f380754eb092d81ef9ab93664778d59e906020015b60405180910390a150565b5f6107dc336120ac565b036108025760405162461bcd60e51b81526004016107f990613b73565b60405180910390fd5b5f61080c336120ac565b5f818152600360208181526040808420878552909201905290205490915060ff161561087a5760405162461bcd60e51b815260206004820152601860248201527f5573657220616c7265616479206f6e2064656e796c697374000000000000000060448201526064016107f9565b5f8181526003602081815260408084208685528084018352818520805460ff19166001908117909155938352600201805493840181558452922001839055517f976c693d56f27ba17d902bda80c4fa0416b773fbf268bcb0ee71689234d769ee906108f19083908590918252602082015260400190565b60405180910390a15050565b610905612627565b805f036109545760405162461bcd60e51b815260206004820152601e60248201527f4d696e696d756d206465706f7369742063616e6e6f74206265207a65726f000060448201526064016107f9565b60078190556040518181527fbdde72a6d8d8b42770c9899945ccdce09d0c5c794d3326cdb2d2cca61b12a9fc906020016107c7565b610991612627565b60098190556040518181527f88397975d177ce5e18abf3a5fdb8de773e80673d85eeb54f48cfaf688b3d2c3e906020016107c7565b5f6109d0336120ac565b036109ed5760405162461bcd60e51b81526004016107f990613b73565b5f6109f7336120ac565b5f858152600560205260408120805492935091610a1c906001600160a01b03166120ac565b5f818152600360208181526040808420888552909201905290205490915060ff1615610a8a5760405162461bcd60e51b815260206004820181905260248201527f4f6e72616d706572206f6e206465706f7369746f7227732064656e796c69737460448201526064016107f9565b6009545f848152600360205260409020600101544291610aa991613bbe565b1115610b035760405162461bcd60e51b8152602060048201526024808201527f4f6e2072616d7020636f6f6c20646f776e20706572696f64206e6f7420656c616044820152631c1cd95960e21b60648201526084016107f9565b5f8381526003602052604090205415610b5e5760405162461bcd60e51b815260206004820152601860248201527f496e74656e74207374696c6c206f75747374616e64696e67000000000000000060448201526064016107f9565b828103610bad5760405162461bcd60e51b815260206004820152601e60248201527f53656e6465722063616e6e6f7420626520746865206465706f7369746f72000060448201526064016107f9565b81546001600160a01b0316610bfd5760405162461bcd60e51b815260206004820152601660248201527511195c1bdcda5d08191bd95cc81b9bdd08195e1a5cdd60521b60448201526064016107f9565b5f8511610c5b5760405162461bcd60e51b815260206004820152602660248201527f5369676e616c656420616d6f756e74206d75737420626520677265617465722060448201526507468616e20360d41b60648201526084016107f9565b600854851115610cca5760405162461bcd60e51b815260206004820152603460248201527f5369676e616c656420616d6f756e74206d757374206265206c657373207468616044820152731b881b585e081bdb8b5c985b5c08185b5bdd5b9d60621b60648201526084016107f9565b6001600160a01b038416610d205760405162461bcd60e51b815260206004820152601b60248201527f43616e6e6f742073656e6420746f207a65726f2061646472657373000000000060448201526064016107f9565b5f610d2b8488612680565b90508583600501541015610ddd575f80610d44896126ea565b9150915087818660050154610d599190613bbe565b1015610d9e5760405162461bcd60e51b81526020600482015260146024820152734e6f7420656e6f756768206c697175696469747960601b60448201526064016107f9565b610da88583612882565b80856005015f828254610dbb9190613bbe565b9250508190555080856006015f828254610dd59190613bd1565b909155505050505b6040805160a0810182523381526001600160a01b0387811660208084019182528385018c8152606085018c815242608087019081525f89815260068552888120975188549088166001600160a01b0319918216178955955160018901805491909816961695909517909555905160028601555160038086019190915592516004909401939093558781529152908120829055600584018054889290610e83908490613bd1565b9250508190555085836006015f828254610e9d9190613bbe565b90915550506008830180546001810182555f91825260209182902001829055604080516001600160a01b038816815291820188905242908201528490889083907f1a1292e170a0f000ccf956afba79bee0f9ec1d81f3f901c1d4d11e1f336aae109060600160405180910390a450505050505050565b610f1b612627565b805f03610f7e5760405162461bcd60e51b815260206004820152602b60248201527f4d617820696e74656e742065787069726174696f6e20706572696f642063616e60448201526a6e6f74206265207a65726f60a81b60648201526084016107f9565b600a8190556040518181527f55e3f6b95de9a0ec782f892e93fafe4e56be0696df204ddf8e0a40a9a713a803906020016107c7565b606060035f610fc1846120ac565b81526020019081526020015f206002015f0180548060200260200160405190810160405280929190818152602001828054801561101b57602002820191905f5260205f20905b815481526020019060010190808311611007575b50505050509050919050565b61102f612627565b600254600160a01b900460ff161561107f5760405162461bcd60e51b8152602060048201526013602482015272105b1c9958591e481a5b9a5d1a585b1a5e9959606a1b60448201526064016107f9565b600180546001600160a01b039384166001600160a01b0319909116179055600280546001600160a81b0319169190921617600160a01b179055565b5f6110c4336120ac565b036110e15760405162461bcd60e51b81526004016107f990613b73565b6040516304b98e1d60e31b81525f906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906325cc70e89061112f908790600401613be4565b602060405180830381865afa15801561114a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061116e9190613bf2565b90508061117a336120ac565b146111c75760405162461bcd60e51b815260206004820181905260248201527f53656e646572206d75737420626520746865206163636f756e74206f776e657260448201526064016107f9565b335f908152600460205260409020600101546005116112285760405162461bcd60e51b815260206004820152601e60248201527f4d6178696d756d206465706f73697420616d6f756e742072656163686564000060448201526064016107f9565b6007548310156112995760405162461bcd60e51b815260206004820152603660248201527f4465706f73697420616d6f756e74206d757374206265206772656174657220746044820152751a185b881b5a5b8819195c1bdcda5d08185b5bdd5b9d60521b60648201526084016107f9565b5f82116112f65760405162461bcd60e51b815260206004820152602560248201527f5265636569766520616d6f756e74206d75737420626520677265617465722074604482015264068616e20360dc1b60648201526084016107f9565b5f8261130a670de0b6b3a764000086613c09565b6113149190613c34565b600d80549192505f91908261132883613c47565b90915550335f81815260046020908152604080832060019081018054808301825590855283852001869055815160e0810183529485528483018c81528583018c9052606086018c90526080860185905260a086018990528251858152808501845260c087015286855260059093529220835181546001600160a01b0319166001600160a01b03909116178155905193945091926113c99183019060036132a2565b5060408201516004820155606082015160058201556080820151600682015560a0820151600782015560c0820151805161140d9160088401916020909101906132e0565b50506040516323b872dd60e01b8152336004820152306024820152604481018790527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031691506323b872dd906064016020604051808303815f875af1158015611480573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114a49190613c5f565b506040805186815260208101849052849183917f36b046df2c296f2a5a78570d5e52a92773cbb616825b1af59a49a4d02df2b109910160405180910390a3505050505050565b6001600160a01b0381165f90815260046020908152604080832060010180548251818502810185019093528083526060949383018282801561154957602002820191905f5260205f20905b815481526020019060010190808311611535575b5050505050905080516001600160401b0381111561156957611569613535565b6040519080825280602002602001820160405280156115a257816020015b61158f613318565b8152602001906001900390816115875790505b5091505f5b8151811015611721575f8282815181106115c3576115c3613c7e565b6020908102919091018101515f818152600583526040808220815160e08101835281546001600160a01b0316815282516060810190935293955091938301906001830160038282826020028201915b815481526020019060010190808311611612575050505050815260200160048201548152602001600582015481526020016006820154815260200160078201548152602001600882018054806020026020016040519081016040528092919081815260200182805480156116a357602002820191905f5260205f20905b81548152602001906001019080831161168f575b50505050508152505090505f6116b8836126ea565b91505060405180608001604052808481526020016116d8845f01516120ac565b81526020018381526020018284606001516116f39190613bbe565b81525086858151811061170857611708613c7e565b60200260200101819052505050508060010190506115a7565b5050919050565b611730612627565b66b1a2bc2ec500008111156117925760405162461bcd60e51b815260206004820152602260248201527f4665652063616e6e6f742062652067726561746572207468616e206d61782066604482015261656560f01b60648201526084016107f9565b600b8190556040518181527f44f48e1b871e6db1e909a7b253b054b7150a0b4ddf4d59b159c827d82e725670906020016107c7565b5f818152600660209081526040808320815160a08101835281546001600160a01b0390811682526001830154811682860152600283015482850181905260038401546060840152600490930154608083015291855260059093529220815191929091166118465760405162461bcd60e51b81526004016107f990613c92565b80546001600160a01b0316331461189f5760405162461bcd60e51b815260206004820152601c60248201527f43616c6c6572206d75737420626520746865206465706f7369746f720000000060448201526064016107f9565b6118a981846128da565b8160600151816006015f8282546118c09190613bd1565b925050819055504260035f6118d7855f01516120ac565b81526020019081526020015f20600101819055506118f98260400151826129cf565b6119038383612ab9565b505050565b5f805b8251811015611a5d575f83828151811061192757611927613c7e565b6020908102919091018101515f818152600590925260409091208054919250906001600160a01b0316331461199e5760405162461bcd60e51b815260206004820152601c60248201527f53656e646572206d75737420626520746865206465706f7369746f720000000060448201526064016107f9565b5f806119a9846126ea565b915091506119b78383612882565b8083600501546119c79190613bbe565b6119d19087613bbe565b955080836006015f8282546119e69190613bd1565b9091555050825460058401546001600160a01b039091169085907fae1f357660ab777dcfd38c0ab6357834684ec26289ecfa07ec65dbf6c3c6431290611a2d908590613bbe565b60405190815260200160405180910390a35f6005840155611a4e84846129cf565b5050505080600101905061190b565b5060405163a9059cbb60e01b8152336004820152602481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063a9059cbb906044016020604051808303815f875af1158015611ac8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119039190613c5f565b611af4612627565b611afd5f612c8e565b565b606081516001600160401b03811115611b1a57611b1a613535565b604051908082528060200260200182016040528015611b5357816020015b611b40613318565b815260200190600190039081611b385790505b5090505f5b8251811015611cd2575f838281518110611b7457611b74613c7e565b6020908102919091018101515f818152600583526040808220815160e08101835281546001600160a01b0316815282516060810190935293955091938301906001830160038282826020028201915b815481526020019060010190808311611bc357505050505081526020016004820154815260200160058201548152602001600682015481526020016007820154815260200160088201805480602002602001604051908101604052809291908181526020018280548015611c5457602002820191905f5260205f20905b815481526020019060010190808311611c40575b50505050508152505090505f611c69836126ea565b9150506040518060800160405280848152602001611c89845f01516120ac565b8152602001838152602001828460600151611ca49190613bbe565b815250858581518110611cb957611cb9613c7e565b6020026020010181905250505050806001019050611b58565b50919050565b604080518082019091525f8152606060208201526040518060400160405280611d00846120ac565b81526001600160a01b0384165f908152600460209081526040918290206001018054835181840281018401909452808452938201939091830182828015611d6457602002820191905f5260205f20905b815481526020019060010190808311611d50575b50505050508152509050919050565b611d7b612627565b805f03611dd45760405162461bcd60e51b815260206004820152602160248201527f4d6178206f6e2072616d7020616d6f756e742063616e6e6f74206265207a65726044820152606f60f81b60648201526084016107f9565b60088190556040518181527fcab6b49ca21dd111cf4a55d507bbe89dd12d69216e28247060d4b2163ca41b39906020016107c7565b5f611e13336120ac565b03611e305760405162461bcd60e51b81526004016107f990613b73565b5f611e3a336120ac565b5f818152600360208181526040808420878552909201905290205490915060ff16611e9e5760405162461bcd60e51b8152602060048201526014602482015273155cd95c881b9bdd081bdb8819195b9e5b1a5cdd60621b60448201526064016107f9565b5f8181526003602081815260408084208685528084018352908420805460ff191690559284905252611ed39060020183612cdd565b60408051828152602081018490527f8935205b1b382095d2d95efbb36f81a11a34c548d45af26adc1a02d2f2bb546f91016108f1565b611f11613342565b5f82815260056020908152604091829020825160e08101845281546001600160a01b031681528351606081019485905290939192840191600184019060039082845b815481526020019060010190808311611f5357505050505081526020016004820154815260200160058201548152602001600682015481526020016007820154815260200160088201805480602002602001604051908101604052809291908181526020018280548015611fe457602002820191905f5260205f20905b815481526020019060010190808311611fd0575b5050505050815250509050919050565b611ffc612627565b6001600160a01b03811661205e5760405162461bcd60e51b8152602060048201526024808201527f46656520726563697069656e742063616e6e6f74206265207a65726f206164646044820152637265737360e01b60648201526084016107f9565b600c80546001600160a01b0319166001600160a01b0383169081179091556040519081527f594ad6ee98bfc0c73e6d15fd4e762502f359e05d26907b7fa1ff82eb5e99f6e4906020016107c7565b6001600160a01b0381165f90815260046020526040812054156120e6576001600160a01b0382165f90815260046020526040902054612172565b604051630f6a21fd60e31b81526001600160a01b0383811660048301527f00000000000000000000000000000000000000000000000000000000000000001690637b510fe8906024015f60405180830381865afa158015612149573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526121709190810190613cc1565b515b92915050565b5f612182336120ac565b146121df5760405162461bcd60e51b815260206004820152602760248201527f4163636f756e7420616c7265616479206173736f6369617465642077697468206044820152661d995b9b5bd25960ca1b60648201526084016107f9565b5f6121ec85858585612dfc565b335f818152600460205260408082208490555192935083927f672144042732f7b1cdbf0772464ae545aedd7f41d38b8487dafd9085496a5d519190a35050505050565b5f818152600660209081526040808320815160a08101835281546001600160a01b039081168252600183015416938101939093526002810154918301919091526003810154606083015260040154608082018190529091036122a35760405162461bcd60e51b81526004016107f990613c92565b6122ac336120ac565b81516122b7906120ac565b146123045760405162461bcd60e51b815260206004820152601c60248201527f53656e646572206d75737420626520746865206f6e2d72616d7065720000000060448201526064016107f9565b6040808201515f90815260056020522061231e81846128da565b8160600151816005015f8282546123359190613bbe565b909155505060608201516006820180545f90612352908490613bd1565b9091555050505050565b5f805f61236b87878787612e98565b92509250925061237b82826128da565b8260600151826006015f8282546123929190613bd1565b925050819055504260035f6123a9865f01516120ac565b81526020019081526020015f20600101819055506123cb8360400151836129cf565b6123d58184612ab9565b50505050505050565b60605f826001600160401b038111156123f9576123f9613535565b60405190808252806020026020018201604052801561243257816020015b61241f613389565b8152602001906001900390816124175790505b5090505f5b83811015612518575f85858381811061245257612452613c7e565b602090810292909201355f81815260068452604090819020815160a08101835281546001600160a01b039081168252600183015416958101959095526002810154858301526003810154606080870191909152600490910154608086015281519081019091529093509050808888868181106124d0576124d0613c7e565b9050602002013581526020018281526020016124ee835f01516120ac565b81525084848151811061250357612503613c7e565b60209081029190910101525050600101612437565b509392505050565b612528612627565b600180546001600160a01b0319166001600160a01b0383169081179091556040519081527f73d3ac111d5926fbfd68ade03832f0b1a4daef0cd0effc1fa0829264bcc57c41906020016107c7565b61257e612627565b6001600160a01b0381166125e35760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016107f9565b6125ec81612c8e565b50565b5f60035f6125fc856120ac565b815260208082019290925260409081015f90812085825260030190925290205460ff16905092915050565b5f546001600160a01b03163314611afd5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107f9565b60408051602081018490529081018290524260608201525f90819060800160408051601f19818403018152919052805160209091012090506126e27f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000182613d88565b949350505050565b5f818152600560209081526040808320600801805482518185028101850190935280835260609493849392919083018282801561274457602002820191905f5260205f20905b815481526020019060010190808311612730575b5050505050905080516001600160401b0381111561276457612764613535565b60405190808252806020026020018201604052801561278d578160200160208202803683370190505b5092505f5b815181101561287b575f60065f8484815181106127b1576127b1613c7e565b60209081029190910181015182528181019290925260409081015f20815160a08101835281546001600160a01b03908116825260018301541693810193909352600281015491830191909152600381015460608301526004015460808201819052600a54919250429161282391613bbe565b10156128725782828151811061283b5761283b613c7e565b602002602001015185838151811061285557612855613c7e565b6020908102919091010152606081015161286f9085613bbe565b93505b50600101612792565b5050915091565b5f5b8151811015611903575f801b8282815181106128a2576128a2613c7e565b6020026020010151146128d2576128d2838383815181106128c5576128c5613c7e565b60200260200101516128da565b600101612884565b5f818152600660209081526040808320815160a08101835281546001600160a01b039081168083526001840154909116948201949094526002820154928101929092526003808201546060840152600490910154608083015290929091612940906120ac565b815260208082019290925260409081015f9081208190558481526006909252812080546001600160a01b03199081168255600182018054909116905560028101829055600381018290556004015561299b6008840183612cdd565b604080820151905183907fe8a865b4bab023c399cbd1f2cdd0df2199beb6e5012a4bd2d7691cf7e4199d5a905f90a3505050565b5f816005015482600601546129e49190613bbe565b9050805f036119035781546001600160a01b03165f908152600460205260409020612a129060010184613165565b8154604080518581526001600160a01b0390921660208301527f8ac07cc6e38c6222dd0309c80353c1962354bacf222b825d7401cc80e93ff3cc910160405180910390a15f83815260056020526040812080546001600160a01b031916815560018101829055600281018290556003810182905590600482015f9055600582015f9055600682015f9055600782015f9055600882015f612ab291906133af565b5050505050565b5f600b545f14612b8057670de0b6b3a7640000600b548360600151612ade9190613c09565b612ae89190613c34565b600c5460405163a9059cbb60e01b81526001600160a01b039182166004820152602481018390529192507f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906044016020604051808303815f875af1158015612b5a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612b7e9190613c5f565b505b5f818360600151612b919190613bd1565b602084015160405163a9059cbb60e01b81526001600160a01b039182166004820152602481018390529192507f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906044016020604051808303815f875af1158015612c05573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612c299190613c5f565b50825160408085015160208087015183516001600160a01b03918216815291820186905292810186905291909216919086907ffa03438194e61c243c6bb5349f1e1dc674431b86f119b5e3b2b327bc43446bce9060600160405180910390a450505050565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f80612d3684805480602002602001604051908101604052809291908181526020018280548015612d2b57602002820191905f5260205f20905b815481526020019060010190808311612d17575b505050505084613207565b9150915080612d7f5760405162461bcd60e51b8152602060048201526015602482015274313cba32b99999103737ba1034b71030b93930bc9760591b60448201526064016107f9565b83545f90612d8f90600190613bd1565b9050808314612dd157848181548110612daa57612daa613c7e565b905f5260205f200154858481548110612dc557612dc5613c7e565b5f918252602090912001555b84805480612de157612de1613d9b565b600190038181905f5260205f20015f90559055505b50505050565b6001546040805160808101825286815260208101869052808201859052606081018490529051630be4767960e11b81525f9283926001600160a01b03909116916317c8ecf291612e4e91600401613dfe565b6020604051808303815f875af1158015612e6a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612e8e9190613bf2565b9695505050505050565b612ea06133ca565b60025460408051608081018252878152602081018790528082018690526060810185905290516347f055c760e11b81525f928392839283928392839283926001600160a01b031691638fe0ab8e91612efb9190600401613e6b565b60a0604051808303815f875af1158015612f17573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612f3b9190613ece565b5f818152600660209081526040808320815160a08101835281546001600160a01b03908116825260018301548116828601526002830154828501819052600384015460608401526004909301546080830152918552600590935292208151979c50959a509398509196509450909216612fc65760405162461bcd60e51b81526004016107f990613c92565b85826080015111156130255760405162461bcd60e51b815260206004820152602260248201527f496e74656e7420776173206e6f742063726561746564206265666f72652073656044820152611b9960f21b60648201526084016107f9565b8054859061303b906001600160a01b03166120ac565b146130885760405162461bcd60e51b815260206004820152601b60248201527f4f666672616d70657220696420646f6573206e6f74206d61746368000000000060448201526064016107f9565b83613095835f01516120ac565b146130e25760405162461bcd60e51b815260206004820152601a60248201527f4f6e72616d70657220696420646f6573206e6f74206d6174636800000000000060448201526064016107f9565b8060070154670de0b6b3a764000083606001516130ff9190613c09565b6131099190613c34565b8710156131515760405162461bcd60e51b81526020600482015260166024820152750a0c2f2dacadce840eec2e640dcdee840cadcdeeaced60531b60448201526064016107f9565b909d909c50909a5098505050505050505050565b5f806131be848054806020026020016040519081016040528092919081815260200182805480156131b357602002820191905f5260205f20905b81548152602001906001019080831161319f575b50505050508461325d565b9150915080612d7f5760405162461bcd60e51b81526020600482015260156024820152743ab4b73a191a9b103737ba1034b71030b93930bc9760591b60448201526064016107f9565b81515f908190815b8181101561324c578486828151811061322a5761322a613c7e565b602002602001015103613244579250600191506132569050565b60010161320f565b505f195f92509250505b9250929050565b81515f908190815b8181101561324c578486828151811061328057613280613c7e565b60200260200101510361329a579250600191506132569050565b600101613265565b82600381019282156132d0579160200282015b828111156132d05782518255916020019190600101906132b5565b506132dc929150613406565b5090565b828054828255905f5260205f209081019282156132d057916020028201828111156132d05782518255916020019190600101906132b5565b604080516080810182525f8082526020820152908101613336613342565b81526020015f81525090565b6040518060e001604052805f6001600160a01b0316815260200161336461341a565b81526020015f81526020015f81526020015f81526020015f8152602001606081525090565b60408051606081019091525f8152602081016133a36133ca565b81525f60209091015290565b5080545f8255905f5260205f20908101906125ec9190613406565b6040518060a001604052805f6001600160a01b031681526020015f6001600160a01b031681526020015f81526020015f81526020015f81525090565b5b808211156132dc575f8155600101613407565b60405180606001604052806003906020820280368337509192915050565b6001600160a01b03811681146125ec575f80fd5b5f6020828403121561345c575f80fd5b813561346781613438565b9392505050565b5f6020828403121561347e575f80fd5b5035919050565b5f805f60608486031215613497575f80fd5b833592506020840135915060408401356134b081613438565b809150509250925092565b602080825282518282018190525f9190848201906040850190845b818110156134f2578351835292840192918401916001016134d6565b50909695505050505050565b5f806040838503121561350f575f80fd5b823561351a81613438565b9150602083013561352a81613438565b809150509250929050565b634e487b7160e01b5f52604160045260245ffd5b604080519081016001600160401b038111828210171561356b5761356b613535565b60405290565b604051601f8201601f191681016001600160401b038111828210171561359957613599613535565b604052919050565b5f805f60a084860312156135b3575f80fd5b84601f8501126135c1575f80fd5b604051606081018181106001600160401b03821117156135e3576135e3613535565b6040528060608601878111156135f7575f80fd5b865b818110156136115780358352602092830192016135f9565b5091979135965050608094909401359392505050565b805f5b6003811015612df657815184526020938401939091019060010161362a565b5f61012080840160018060a01b03845116855260208085015161366f6020880182613627565b5060408501516080870152606085015160a0870152608085015160c087015260a085015160e087015260c0850151836101008801528293508051808452610140880194506020820193505f91505b808210156136dd57835185529382019392820192600191909101906136bd565b50929695505050505050565b5f60208083018184528085518083526040925060408601915060408160051b8701018488015f5b8381101561376757603f198984030185528151608081518552888201518986015287820151818987015261374682870182613649565b60609384015196909301959095525094870194925090860190600101613710565b509098975050505050505050565b5f6001600160401b0382111561378d5761378d613535565b5060051b60200190565b5f60208083850312156137a8575f80fd5b82356001600160401b038111156137bd575f80fd5b8301601f810185136137cd575f80fd5b80356137e06137db82613775565b613571565b81815260059190911b820183019083810190878311156137fe575f80fd5b928401925b8284101561381c57833582529284019290840190613803565b979650505050505050565b6020808252825182820152828101516040808401528051606084018190525f9291820190839060808601905b808310156138735783518252928401926001929092019190840190613853565b509695505050505050565b602081525f6134676020830184613649565b5f82601f83011261389f575f80fd5b6138a7613549565b8060408401858111156138b8575f80fd5b845b818110156138d25780358452602093840193016138ba565b509095945050505050565b5f82601f8301126138ec575f80fd5b6138f4613549565b806080840185811115613905575f80fd5b845b818110156138d2576139198782613890565b8452602090930192604001613907565b5f805f806101a080868803121561393e575f80fd5b6139488787613890565b945061395787604088016138dd565b93506139668760c08801613890565b92508661011f870112613977575f80fd5b60405160a081018181106001600160401b038211171561399957613999613535565b6040529086019080888311156139ad575f80fd5b61010088015b838110156139cb5780358252602091820191016139b3565b5050809250505092959194509250565b5f805f806102808086880312156139f0575f80fd5b6139fa8787613890565b9450613a0987604088016138dd565b9350613a188760c08801613890565b92508661011f870112613a29575f80fd5b60405161018081018181106001600160401b038211171561399957613999613535565b5f8060208385031215613a5d575f80fd5b82356001600160401b0380821115613a73575f80fd5b818501915085601f830112613a86575f80fd5b813581811115613a94575f80fd5b8660208260051b8501011115613aa8575f80fd5b60209290920196919550909350505050565b602080825282518282018190525f919060409081850190868401855b82811015613b3c578151805185528681015180516001600160a01b039081168988015281890151168787015286810151606080880191909152810151608080880191909152015160a086015285015160c085015260e09093019290850190600101613ad6565b5091979650505050505050565b5f8060408385031215613b5a575f80fd5b8235613b6581613438565b946020939093013593505050565b6020808252601e908201527f43616c6c6572206d757374206265207265676973746572656420757365720000604082015260600190565b634e487b7160e01b5f52601160045260245ffd5b8082018082111561217257612172613baa565b8181038181111561217257612172613baa565b606081016121728284613627565b5f60208284031215613c02575f80fd5b5051919050565b808202811582820484141761217257612172613baa565b634e487b7160e01b5f52601260045260245ffd5b5f82613c4257613c42613c20565b500490565b5f60018201613c5857613c58613baa565b5060010190565b5f60208284031215613c6f575f80fd5b81518015158114613467575f80fd5b634e487b7160e01b5f52603260045260245ffd5b602080825260159082015274125b9d195b9d08191bd95cc81b9bdd08195e1a5cdd605a1b604082015260600190565b5f6020808385031215613cd2575f80fd5b82516001600160401b0380821115613ce8575f80fd5b9084019060408287031215613cfb575f80fd5b613d03613549565b825181528383015182811115613d17575f80fd5b80840193505086601f840112613d2b575f80fd5b82519150613d3b6137db83613775565b82815260059290921b83018401918481019088841115613d59575f80fd5b938501935b83851015613d7757845182529385019390850190613d5e565b948201949094529695505050505050565b5f82613d9657613d96613c20565b500690565b634e487b7160e01b5f52603160045260245ffd5b805f5b6002811015612df6578151845260209384019390910190600101613db2565b805f5b6002811015612df657613de8848351613daf565b6040939093019260209190910190600101613dd4565b5f6101a082019050613e11828451613daf565b602080840151613e246040850182613dd1565b506040840151613e3760c0850182613daf565b50606084015161010084015f5b6005811015613e6157825182529183019190830190600101613e44565b5050505092915050565b5f61028082019050613e7e828451613daf565b602080840151613e916040850182613dd1565b506040840151613ea460c0850182613daf565b50606084015161010084015f5b600c811015613e6157825182529183019190830190600101613eb1565b5f805f805f60a08688031215613ee2575f80fd5b505083516020850151604086015160608701516080909701519298919750959450909250905056fea26469706673582212203c4b3b4c184ba0ad7e0a51231aa9d2e0d4957f77d25289a078fdaa409ab19cde64736f6c63430008180033", + "deployedBytecode": "0x608060405234801561000f575f80fd5b5060043610610281575f3560e01c80637b510fe811610156578063ce523ca3116100ca578063ecb3dc8811610084578063ecb3dc88146106b8578063ecd618f0146106c1578063ed1692b8146106e1578063eea1d197146106f4578063f2fde38b14610707578063fbf15b1f1461071a575f80fd5b8063ce523ca314610650578063d55f960d14610663578063d9478d2014610676578063da26c18914610689578063e215ad591461069c578063e279d964146106af575f80fd5b80639f9fb9681161011b5780639f9fb96814610562578063a1a954b714610582578063b02c43d01461058b578063b3fa4c0114610603578063c62b919e14610616578063cc181c2e1461063d575f80fd5b80637b510fe8146104915780638da5cb5b146104b15780639021578a146104c15780639087beff1461053c5780639b357b5a1461054f575f80fd5b806342987349116101f85780635dd76515116101b25780635dd7651514610434578063645006ca1461044757806366ec8419146104505780637113476214610463578063715018a61461047657806371a28f691461047e575f80fd5b806342987349146103b25780634595bba0146103c5578063485cc955146103e55780634877b7b6146103f8578063495223e71461040b5780635081d95214610414575f80fd5b8063238c849411610249578063238c8494146103255780632a80cda31461032e578063317dcc9614610341578063392e53cd146103545780633adba28a146103785780633e413bee1461038b575f80fd5b80630f1ef98c14610285578063123a11e4146102ab578063133de6cb146102be578063148172da146102d357806315d276e1146102e6575b5f80fd5b61029861029336600461344c565b61072d565b6040519081526020015b60405180910390f35b6102986102b936600461344c565b610752565b6102d16102cc36600461344c565b610775565b005b6102d16102e136600461346e565b6107d2565b61030d7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016102a2565b610298600b5481565b6102d161033c36600461346e565b6108fd565b6102d161034f36600461346e565b610989565b60025461036890600160a01b900460ff1681565b60405190151581526020016102a2565b6102d1610386366004613485565b6109c6565b61030d7f000000000000000000000000000000000000000000000000000000000000000081565b6102d16103c036600461346e565b610f13565b6103d86103d336600461344c565b610fb3565b6040516102a291906134bb565b6102d16103f33660046134fe565b611027565b6102d16104063660046135a1565b6110ba565b61029860095481565b61042761042236600461344c565b6114ea565b6040516102a291906136e9565b6102d161044236600461346e565b611728565b61029860075481565b6102d161045e36600461346e565b6117c7565b6102d1610471366004613797565b611908565b6102d1611aec565b61042761048c366004613797565b611aff565b6104a461049f36600461344c565b611cd8565b6040516102a29190613827565b5f546001600160a01b031661030d565b6105096104cf36600461346e565b60066020525f9081526040902080546001820154600283015460038401546004909401546001600160a01b03938416949390921692909185565b604080516001600160a01b039687168152959094166020860152928401919091526060830152608082015260a0016102a2565b6102d161054a36600461346e565b611d73565b6102d161055d36600461346e565b611e09565b61057561057036600461346e565b611f09565b6040516102a2919061387e565b610298600a5481565b6105d161059936600461346e565b600560208190525f9182526040909120805460048201549282015460068301546007909301546001600160a01b039092169392909185565b604080516001600160a01b0390961686526020860194909452928401919091526060830152608082015260a0016102a2565b6102d161061136600461344c565b611ff4565b61030d7f000000000000000000000000000000000000000000000000000000000000000081565b61029861064b36600461344c565b6120ac565b6102d161065e366004613929565b612178565b6102d161067136600461346e565b61222f565b600c5461030d906001600160a01b031681565b6102d16106973660046139db565b61235c565b60015461030d906001600160a01b031681565b61029860085481565b610298600d5481565b6106d46106cf366004613a4c565b6123de565b6040516102a29190613aba565b6102d16106ef36600461344c565b612520565b60025461030d906001600160a01b031681565b6102d161071536600461344c565b612576565b610368610728366004613b49565b6125ef565b5f60035f61073a846120ac565b81526020019081526020015f20600101549050919050565b5f60035f61075f846120ac565b815260208101919091526040015f205492915050565b61077d612627565b600280546001600160a01b0319166001600160a01b0383169081179091556040519081527f6e7665a41605edc0d70f4b991d652755f380754eb092d81ef9ab93664778d59e906020015b60405180910390a150565b5f6107dc336120ac565b036108025760405162461bcd60e51b81526004016107f990613b73565b60405180910390fd5b5f61080c336120ac565b5f818152600360208181526040808420878552909201905290205490915060ff161561087a5760405162461bcd60e51b815260206004820152601860248201527f5573657220616c7265616479206f6e2064656e796c697374000000000000000060448201526064016107f9565b5f8181526003602081815260408084208685528084018352818520805460ff19166001908117909155938352600201805493840181558452922001839055517f976c693d56f27ba17d902bda80c4fa0416b773fbf268bcb0ee71689234d769ee906108f19083908590918252602082015260400190565b60405180910390a15050565b610905612627565b805f036109545760405162461bcd60e51b815260206004820152601e60248201527f4d696e696d756d206465706f7369742063616e6e6f74206265207a65726f000060448201526064016107f9565b60078190556040518181527fbdde72a6d8d8b42770c9899945ccdce09d0c5c794d3326cdb2d2cca61b12a9fc906020016107c7565b610991612627565b60098190556040518181527f88397975d177ce5e18abf3a5fdb8de773e80673d85eeb54f48cfaf688b3d2c3e906020016107c7565b5f6109d0336120ac565b036109ed5760405162461bcd60e51b81526004016107f990613b73565b5f6109f7336120ac565b5f858152600560205260408120805492935091610a1c906001600160a01b03166120ac565b5f818152600360208181526040808420888552909201905290205490915060ff1615610a8a5760405162461bcd60e51b815260206004820181905260248201527f4f6e72616d706572206f6e206465706f7369746f7227732064656e796c69737460448201526064016107f9565b6009545f848152600360205260409020600101544291610aa991613bbe565b1115610b035760405162461bcd60e51b8152602060048201526024808201527f4f6e2072616d7020636f6f6c20646f776e20706572696f64206e6f7420656c616044820152631c1cd95960e21b60648201526084016107f9565b5f8381526003602052604090205415610b5e5760405162461bcd60e51b815260206004820152601860248201527f496e74656e74207374696c6c206f75747374616e64696e67000000000000000060448201526064016107f9565b828103610bad5760405162461bcd60e51b815260206004820152601e60248201527f53656e6465722063616e6e6f7420626520746865206465706f7369746f72000060448201526064016107f9565b81546001600160a01b0316610bfd5760405162461bcd60e51b815260206004820152601660248201527511195c1bdcda5d08191bd95cc81b9bdd08195e1a5cdd60521b60448201526064016107f9565b5f8511610c5b5760405162461bcd60e51b815260206004820152602660248201527f5369676e616c656420616d6f756e74206d75737420626520677265617465722060448201526507468616e20360d41b60648201526084016107f9565b600854851115610cca5760405162461bcd60e51b815260206004820152603460248201527f5369676e616c656420616d6f756e74206d757374206265206c657373207468616044820152731b881b585e081bdb8b5c985b5c08185b5bdd5b9d60621b60648201526084016107f9565b6001600160a01b038416610d205760405162461bcd60e51b815260206004820152601b60248201527f43616e6e6f742073656e6420746f207a65726f2061646472657373000000000060448201526064016107f9565b5f610d2b8488612680565b90508583600501541015610ddd575f80610d44896126ea565b9150915087818660050154610d599190613bbe565b1015610d9e5760405162461bcd60e51b81526020600482015260146024820152734e6f7420656e6f756768206c697175696469747960601b60448201526064016107f9565b610da88583612882565b80856005015f828254610dbb9190613bbe565b9250508190555080856006015f828254610dd59190613bd1565b909155505050505b6040805160a0810182523381526001600160a01b0387811660208084019182528385018c8152606085018c815242608087019081525f89815260068552888120975188549088166001600160a01b0319918216178955955160018901805491909816961695909517909555905160028601555160038086019190915592516004909401939093558781529152908120829055600584018054889290610e83908490613bd1565b9250508190555085836006015f828254610e9d9190613bbe565b90915550506008830180546001810182555f91825260209182902001829055604080516001600160a01b038816815291820188905242908201528490889083907f1a1292e170a0f000ccf956afba79bee0f9ec1d81f3f901c1d4d11e1f336aae109060600160405180910390a450505050505050565b610f1b612627565b805f03610f7e5760405162461bcd60e51b815260206004820152602b60248201527f4d617820696e74656e742065787069726174696f6e20706572696f642063616e60448201526a6e6f74206265207a65726f60a81b60648201526084016107f9565b600a8190556040518181527f55e3f6b95de9a0ec782f892e93fafe4e56be0696df204ddf8e0a40a9a713a803906020016107c7565b606060035f610fc1846120ac565b81526020019081526020015f206002015f0180548060200260200160405190810160405280929190818152602001828054801561101b57602002820191905f5260205f20905b815481526020019060010190808311611007575b50505050509050919050565b61102f612627565b600254600160a01b900460ff161561107f5760405162461bcd60e51b8152602060048201526013602482015272105b1c9958591e481a5b9a5d1a585b1a5e9959606a1b60448201526064016107f9565b600180546001600160a01b039384166001600160a01b0319909116179055600280546001600160a81b0319169190921617600160a01b179055565b5f6110c4336120ac565b036110e15760405162461bcd60e51b81526004016107f990613b73565b6040516304b98e1d60e31b81525f906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906325cc70e89061112f908790600401613be4565b602060405180830381865afa15801561114a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061116e9190613bf2565b90508061117a336120ac565b146111c75760405162461bcd60e51b815260206004820181905260248201527f53656e646572206d75737420626520746865206163636f756e74206f776e657260448201526064016107f9565b335f908152600460205260409020600101546005116112285760405162461bcd60e51b815260206004820152601e60248201527f4d6178696d756d206465706f73697420616d6f756e742072656163686564000060448201526064016107f9565b6007548310156112995760405162461bcd60e51b815260206004820152603660248201527f4465706f73697420616d6f756e74206d757374206265206772656174657220746044820152751a185b881b5a5b8819195c1bdcda5d08185b5bdd5b9d60521b60648201526084016107f9565b5f82116112f65760405162461bcd60e51b815260206004820152602560248201527f5265636569766520616d6f756e74206d75737420626520677265617465722074604482015264068616e20360dc1b60648201526084016107f9565b5f8261130a670de0b6b3a764000086613c09565b6113149190613c34565b600d80549192505f91908261132883613c47565b90915550335f81815260046020908152604080832060019081018054808301825590855283852001869055815160e0810183529485528483018c81528583018c9052606086018c90526080860185905260a086018990528251858152808501845260c087015286855260059093529220835181546001600160a01b0319166001600160a01b03909116178155905193945091926113c99183019060036132a2565b5060408201516004820155606082015160058201556080820151600682015560a0820151600782015560c0820151805161140d9160088401916020909101906132e0565b50506040516323b872dd60e01b8152336004820152306024820152604481018790527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031691506323b872dd906064016020604051808303815f875af1158015611480573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114a49190613c5f565b506040805186815260208101849052849183917f36b046df2c296f2a5a78570d5e52a92773cbb616825b1af59a49a4d02df2b109910160405180910390a3505050505050565b6001600160a01b0381165f90815260046020908152604080832060010180548251818502810185019093528083526060949383018282801561154957602002820191905f5260205f20905b815481526020019060010190808311611535575b5050505050905080516001600160401b0381111561156957611569613535565b6040519080825280602002602001820160405280156115a257816020015b61158f613318565b8152602001906001900390816115875790505b5091505f5b8151811015611721575f8282815181106115c3576115c3613c7e565b6020908102919091018101515f818152600583526040808220815160e08101835281546001600160a01b0316815282516060810190935293955091938301906001830160038282826020028201915b815481526020019060010190808311611612575050505050815260200160048201548152602001600582015481526020016006820154815260200160078201548152602001600882018054806020026020016040519081016040528092919081815260200182805480156116a357602002820191905f5260205f20905b81548152602001906001019080831161168f575b50505050508152505090505f6116b8836126ea565b91505060405180608001604052808481526020016116d8845f01516120ac565b81526020018381526020018284606001516116f39190613bbe565b81525086858151811061170857611708613c7e565b60200260200101819052505050508060010190506115a7565b5050919050565b611730612627565b66b1a2bc2ec500008111156117925760405162461bcd60e51b815260206004820152602260248201527f4665652063616e6e6f742062652067726561746572207468616e206d61782066604482015261656560f01b60648201526084016107f9565b600b8190556040518181527f44f48e1b871e6db1e909a7b253b054b7150a0b4ddf4d59b159c827d82e725670906020016107c7565b5f818152600660209081526040808320815160a08101835281546001600160a01b0390811682526001830154811682860152600283015482850181905260038401546060840152600490930154608083015291855260059093529220815191929091166118465760405162461bcd60e51b81526004016107f990613c92565b80546001600160a01b0316331461189f5760405162461bcd60e51b815260206004820152601c60248201527f43616c6c6572206d75737420626520746865206465706f7369746f720000000060448201526064016107f9565b6118a981846128da565b8160600151816006015f8282546118c09190613bd1565b925050819055504260035f6118d7855f01516120ac565b81526020019081526020015f20600101819055506118f98260400151826129cf565b6119038383612ab9565b505050565b5f805b8251811015611a5d575f83828151811061192757611927613c7e565b6020908102919091018101515f818152600590925260409091208054919250906001600160a01b0316331461199e5760405162461bcd60e51b815260206004820152601c60248201527f53656e646572206d75737420626520746865206465706f7369746f720000000060448201526064016107f9565b5f806119a9846126ea565b915091506119b78383612882565b8083600501546119c79190613bbe565b6119d19087613bbe565b955080836006015f8282546119e69190613bd1565b9091555050825460058401546001600160a01b039091169085907fae1f357660ab777dcfd38c0ab6357834684ec26289ecfa07ec65dbf6c3c6431290611a2d908590613bbe565b60405190815260200160405180910390a35f6005840155611a4e84846129cf565b5050505080600101905061190b565b5060405163a9059cbb60e01b8152336004820152602481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063a9059cbb906044016020604051808303815f875af1158015611ac8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119039190613c5f565b611af4612627565b611afd5f612c8e565b565b606081516001600160401b03811115611b1a57611b1a613535565b604051908082528060200260200182016040528015611b5357816020015b611b40613318565b815260200190600190039081611b385790505b5090505f5b8251811015611cd2575f838281518110611b7457611b74613c7e565b6020908102919091018101515f818152600583526040808220815160e08101835281546001600160a01b0316815282516060810190935293955091938301906001830160038282826020028201915b815481526020019060010190808311611bc357505050505081526020016004820154815260200160058201548152602001600682015481526020016007820154815260200160088201805480602002602001604051908101604052809291908181526020018280548015611c5457602002820191905f5260205f20905b815481526020019060010190808311611c40575b50505050508152505090505f611c69836126ea565b9150506040518060800160405280848152602001611c89845f01516120ac565b8152602001838152602001828460600151611ca49190613bbe565b815250858581518110611cb957611cb9613c7e565b6020026020010181905250505050806001019050611b58565b50919050565b604080518082019091525f8152606060208201526040518060400160405280611d00846120ac565b81526001600160a01b0384165f908152600460209081526040918290206001018054835181840281018401909452808452938201939091830182828015611d6457602002820191905f5260205f20905b815481526020019060010190808311611d50575b50505050508152509050919050565b611d7b612627565b805f03611dd45760405162461bcd60e51b815260206004820152602160248201527f4d6178206f6e2072616d7020616d6f756e742063616e6e6f74206265207a65726044820152606f60f81b60648201526084016107f9565b60088190556040518181527fcab6b49ca21dd111cf4a55d507bbe89dd12d69216e28247060d4b2163ca41b39906020016107c7565b5f611e13336120ac565b03611e305760405162461bcd60e51b81526004016107f990613b73565b5f611e3a336120ac565b5f818152600360208181526040808420878552909201905290205490915060ff16611e9e5760405162461bcd60e51b8152602060048201526014602482015273155cd95c881b9bdd081bdb8819195b9e5b1a5cdd60621b60448201526064016107f9565b5f8181526003602081815260408084208685528084018352908420805460ff191690559284905252611ed39060020183612cdd565b60408051828152602081018490527f8935205b1b382095d2d95efbb36f81a11a34c548d45af26adc1a02d2f2bb546f91016108f1565b611f11613342565b5f82815260056020908152604091829020825160e08101845281546001600160a01b031681528351606081019485905290939192840191600184019060039082845b815481526020019060010190808311611f5357505050505081526020016004820154815260200160058201548152602001600682015481526020016007820154815260200160088201805480602002602001604051908101604052809291908181526020018280548015611fe457602002820191905f5260205f20905b815481526020019060010190808311611fd0575b5050505050815250509050919050565b611ffc612627565b6001600160a01b03811661205e5760405162461bcd60e51b8152602060048201526024808201527f46656520726563697069656e742063616e6e6f74206265207a65726f206164646044820152637265737360e01b60648201526084016107f9565b600c80546001600160a01b0319166001600160a01b0383169081179091556040519081527f594ad6ee98bfc0c73e6d15fd4e762502f359e05d26907b7fa1ff82eb5e99f6e4906020016107c7565b6001600160a01b0381165f90815260046020526040812054156120e6576001600160a01b0382165f90815260046020526040902054612172565b604051630f6a21fd60e31b81526001600160a01b0383811660048301527f00000000000000000000000000000000000000000000000000000000000000001690637b510fe8906024015f60405180830381865afa158015612149573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526121709190810190613cc1565b515b92915050565b5f612182336120ac565b146121df5760405162461bcd60e51b815260206004820152602760248201527f4163636f756e7420616c7265616479206173736f6369617465642077697468206044820152661d995b9b5bd25960ca1b60648201526084016107f9565b5f6121ec85858585612dfc565b335f818152600460205260408082208490555192935083927f672144042732f7b1cdbf0772464ae545aedd7f41d38b8487dafd9085496a5d519190a35050505050565b5f818152600660209081526040808320815160a08101835281546001600160a01b039081168252600183015416938101939093526002810154918301919091526003810154606083015260040154608082018190529091036122a35760405162461bcd60e51b81526004016107f990613c92565b6122ac336120ac565b81516122b7906120ac565b146123045760405162461bcd60e51b815260206004820152601c60248201527f53656e646572206d75737420626520746865206f6e2d72616d7065720000000060448201526064016107f9565b6040808201515f90815260056020522061231e81846128da565b8160600151816005015f8282546123359190613bbe565b909155505060608201516006820180545f90612352908490613bd1565b9091555050505050565b5f805f61236b87878787612e98565b92509250925061237b82826128da565b8260600151826006015f8282546123929190613bd1565b925050819055504260035f6123a9865f01516120ac565b81526020019081526020015f20600101819055506123cb8360400151836129cf565b6123d58184612ab9565b50505050505050565b60605f826001600160401b038111156123f9576123f9613535565b60405190808252806020026020018201604052801561243257816020015b61241f613389565b8152602001906001900390816124175790505b5090505f5b83811015612518575f85858381811061245257612452613c7e565b602090810292909201355f81815260068452604090819020815160a08101835281546001600160a01b039081168252600183015416958101959095526002810154858301526003810154606080870191909152600490910154608086015281519081019091529093509050808888868181106124d0576124d0613c7e565b9050602002013581526020018281526020016124ee835f01516120ac565b81525084848151811061250357612503613c7e565b60209081029190910101525050600101612437565b509392505050565b612528612627565b600180546001600160a01b0319166001600160a01b0383169081179091556040519081527f73d3ac111d5926fbfd68ade03832f0b1a4daef0cd0effc1fa0829264bcc57c41906020016107c7565b61257e612627565b6001600160a01b0381166125e35760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016107f9565b6125ec81612c8e565b50565b5f60035f6125fc856120ac565b815260208082019290925260409081015f90812085825260030190925290205460ff16905092915050565b5f546001600160a01b03163314611afd5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107f9565b60408051602081018490529081018290524260608201525f90819060800160408051601f19818403018152919052805160209091012090506126e27f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000182613d88565b949350505050565b5f818152600560209081526040808320600801805482518185028101850190935280835260609493849392919083018282801561274457602002820191905f5260205f20905b815481526020019060010190808311612730575b5050505050905080516001600160401b0381111561276457612764613535565b60405190808252806020026020018201604052801561278d578160200160208202803683370190505b5092505f5b815181101561287b575f60065f8484815181106127b1576127b1613c7e565b60209081029190910181015182528181019290925260409081015f20815160a08101835281546001600160a01b03908116825260018301541693810193909352600281015491830191909152600381015460608301526004015460808201819052600a54919250429161282391613bbe565b10156128725782828151811061283b5761283b613c7e565b602002602001015185838151811061285557612855613c7e565b6020908102919091010152606081015161286f9085613bbe565b93505b50600101612792565b5050915091565b5f5b8151811015611903575f801b8282815181106128a2576128a2613c7e565b6020026020010151146128d2576128d2838383815181106128c5576128c5613c7e565b60200260200101516128da565b600101612884565b5f818152600660209081526040808320815160a08101835281546001600160a01b039081168083526001840154909116948201949094526002820154928101929092526003808201546060840152600490910154608083015290929091612940906120ac565b815260208082019290925260409081015f9081208190558481526006909252812080546001600160a01b03199081168255600182018054909116905560028101829055600381018290556004015561299b6008840183612cdd565b604080820151905183907fe8a865b4bab023c399cbd1f2cdd0df2199beb6e5012a4bd2d7691cf7e4199d5a905f90a3505050565b5f816005015482600601546129e49190613bbe565b9050805f036119035781546001600160a01b03165f908152600460205260409020612a129060010184613165565b8154604080518581526001600160a01b0390921660208301527f8ac07cc6e38c6222dd0309c80353c1962354bacf222b825d7401cc80e93ff3cc910160405180910390a15f83815260056020526040812080546001600160a01b031916815560018101829055600281018290556003810182905590600482015f9055600582015f9055600682015f9055600782015f9055600882015f612ab291906133af565b5050505050565b5f600b545f14612b8057670de0b6b3a7640000600b548360600151612ade9190613c09565b612ae89190613c34565b600c5460405163a9059cbb60e01b81526001600160a01b039182166004820152602481018390529192507f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906044016020604051808303815f875af1158015612b5a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612b7e9190613c5f565b505b5f818360600151612b919190613bd1565b602084015160405163a9059cbb60e01b81526001600160a01b039182166004820152602481018390529192507f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906044016020604051808303815f875af1158015612c05573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612c299190613c5f565b50825160408085015160208087015183516001600160a01b03918216815291820186905292810186905291909216919086907ffa03438194e61c243c6bb5349f1e1dc674431b86f119b5e3b2b327bc43446bce9060600160405180910390a450505050565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f80612d3684805480602002602001604051908101604052809291908181526020018280548015612d2b57602002820191905f5260205f20905b815481526020019060010190808311612d17575b505050505084613207565b9150915080612d7f5760405162461bcd60e51b8152602060048201526015602482015274313cba32b99999103737ba1034b71030b93930bc9760591b60448201526064016107f9565b83545f90612d8f90600190613bd1565b9050808314612dd157848181548110612daa57612daa613c7e565b905f5260205f200154858481548110612dc557612dc5613c7e565b5f918252602090912001555b84805480612de157612de1613d9b565b600190038181905f5260205f20015f90559055505b50505050565b6001546040805160808101825286815260208101869052808201859052606081018490529051630be4767960e11b81525f9283926001600160a01b03909116916317c8ecf291612e4e91600401613dfe565b6020604051808303815f875af1158015612e6a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612e8e9190613bf2565b9695505050505050565b612ea06133ca565b60025460408051608081018252878152602081018790528082018690526060810185905290516347f055c760e11b81525f928392839283928392839283926001600160a01b031691638fe0ab8e91612efb9190600401613e6b565b60a0604051808303815f875af1158015612f17573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612f3b9190613ece565b5f818152600660209081526040808320815160a08101835281546001600160a01b03908116825260018301548116828601526002830154828501819052600384015460608401526004909301546080830152918552600590935292208151979c50959a509398509196509450909216612fc65760405162461bcd60e51b81526004016107f990613c92565b85826080015111156130255760405162461bcd60e51b815260206004820152602260248201527f496e74656e7420776173206e6f742063726561746564206265666f72652073656044820152611b9960f21b60648201526084016107f9565b8054859061303b906001600160a01b03166120ac565b146130885760405162461bcd60e51b815260206004820152601b60248201527f4f666672616d70657220696420646f6573206e6f74206d61746368000000000060448201526064016107f9565b83613095835f01516120ac565b146130e25760405162461bcd60e51b815260206004820152601a60248201527f4f6e72616d70657220696420646f6573206e6f74206d6174636800000000000060448201526064016107f9565b8060070154670de0b6b3a764000083606001516130ff9190613c09565b6131099190613c34565b8710156131515760405162461bcd60e51b81526020600482015260166024820152750a0c2f2dacadce840eec2e640dcdee840cadcdeeaced60531b60448201526064016107f9565b909d909c50909a5098505050505050505050565b5f806131be848054806020026020016040519081016040528092919081815260200182805480156131b357602002820191905f5260205f20905b81548152602001906001019080831161319f575b50505050508461325d565b9150915080612d7f5760405162461bcd60e51b81526020600482015260156024820152743ab4b73a191a9b103737ba1034b71030b93930bc9760591b60448201526064016107f9565b81515f908190815b8181101561324c578486828151811061322a5761322a613c7e565b602002602001015103613244579250600191506132569050565b60010161320f565b505f195f92509250505b9250929050565b81515f908190815b8181101561324c578486828151811061328057613280613c7e565b60200260200101510361329a579250600191506132569050565b600101613265565b82600381019282156132d0579160200282015b828111156132d05782518255916020019190600101906132b5565b506132dc929150613406565b5090565b828054828255905f5260205f209081019282156132d057916020028201828111156132d05782518255916020019190600101906132b5565b604080516080810182525f8082526020820152908101613336613342565b81526020015f81525090565b6040518060e001604052805f6001600160a01b0316815260200161336461341a565b81526020015f81526020015f81526020015f81526020015f8152602001606081525090565b60408051606081019091525f8152602081016133a36133ca565b81525f60209091015290565b5080545f8255905f5260205f20908101906125ec9190613406565b6040518060a001604052805f6001600160a01b031681526020015f6001600160a01b031681526020015f81526020015f81526020015f81525090565b5b808211156132dc575f8155600101613407565b60405180606001604052806003906020820280368337509192915050565b6001600160a01b03811681146125ec575f80fd5b5f6020828403121561345c575f80fd5b813561346781613438565b9392505050565b5f6020828403121561347e575f80fd5b5035919050565b5f805f60608486031215613497575f80fd5b833592506020840135915060408401356134b081613438565b809150509250925092565b602080825282518282018190525f9190848201906040850190845b818110156134f2578351835292840192918401916001016134d6565b50909695505050505050565b5f806040838503121561350f575f80fd5b823561351a81613438565b9150602083013561352a81613438565b809150509250929050565b634e487b7160e01b5f52604160045260245ffd5b604080519081016001600160401b038111828210171561356b5761356b613535565b60405290565b604051601f8201601f191681016001600160401b038111828210171561359957613599613535565b604052919050565b5f805f60a084860312156135b3575f80fd5b84601f8501126135c1575f80fd5b604051606081018181106001600160401b03821117156135e3576135e3613535565b6040528060608601878111156135f7575f80fd5b865b818110156136115780358352602092830192016135f9565b5091979135965050608094909401359392505050565b805f5b6003811015612df657815184526020938401939091019060010161362a565b5f61012080840160018060a01b03845116855260208085015161366f6020880182613627565b5060408501516080870152606085015160a0870152608085015160c087015260a085015160e087015260c0850151836101008801528293508051808452610140880194506020820193505f91505b808210156136dd57835185529382019392820192600191909101906136bd565b50929695505050505050565b5f60208083018184528085518083526040925060408601915060408160051b8701018488015f5b8381101561376757603f198984030185528151608081518552888201518986015287820151818987015261374682870182613649565b60609384015196909301959095525094870194925090860190600101613710565b509098975050505050505050565b5f6001600160401b0382111561378d5761378d613535565b5060051b60200190565b5f60208083850312156137a8575f80fd5b82356001600160401b038111156137bd575f80fd5b8301601f810185136137cd575f80fd5b80356137e06137db82613775565b613571565b81815260059190911b820183019083810190878311156137fe575f80fd5b928401925b8284101561381c57833582529284019290840190613803565b979650505050505050565b6020808252825182820152828101516040808401528051606084018190525f9291820190839060808601905b808310156138735783518252928401926001929092019190840190613853565b509695505050505050565b602081525f6134676020830184613649565b5f82601f83011261389f575f80fd5b6138a7613549565b8060408401858111156138b8575f80fd5b845b818110156138d25780358452602093840193016138ba565b509095945050505050565b5f82601f8301126138ec575f80fd5b6138f4613549565b806080840185811115613905575f80fd5b845b818110156138d2576139198782613890565b8452602090930192604001613907565b5f805f806101a080868803121561393e575f80fd5b6139488787613890565b945061395787604088016138dd565b93506139668760c08801613890565b92508661011f870112613977575f80fd5b60405160a081018181106001600160401b038211171561399957613999613535565b6040529086019080888311156139ad575f80fd5b61010088015b838110156139cb5780358252602091820191016139b3565b5050809250505092959194509250565b5f805f806102808086880312156139f0575f80fd5b6139fa8787613890565b9450613a0987604088016138dd565b9350613a188760c08801613890565b92508661011f870112613a29575f80fd5b60405161018081018181106001600160401b038211171561399957613999613535565b5f8060208385031215613a5d575f80fd5b82356001600160401b0380821115613a73575f80fd5b818501915085601f830112613a86575f80fd5b813581811115613a94575f80fd5b8660208260051b8501011115613aa8575f80fd5b60209290920196919550909350505050565b602080825282518282018190525f919060409081850190868401855b82811015613b3c578151805185528681015180516001600160a01b039081168988015281890151168787015286810151606080880191909152810151608080880191909152015160a086015285015160c085015260e09093019290850190600101613ad6565b5091979650505050505050565b5f8060408385031215613b5a575f80fd5b8235613b6581613438565b946020939093013593505050565b6020808252601e908201527f43616c6c6572206d757374206265207265676973746572656420757365720000604082015260600190565b634e487b7160e01b5f52601160045260245ffd5b8082018082111561217257612172613baa565b8181038181111561217257612172613baa565b606081016121728284613627565b5f60208284031215613c02575f80fd5b5051919050565b808202811582820484141761217257612172613baa565b634e487b7160e01b5f52601260045260245ffd5b5f82613c4257613c42613c20565b500490565b5f60018201613c5857613c58613baa565b5060010190565b5f60208284031215613c6f575f80fd5b81518015158114613467575f80fd5b634e487b7160e01b5f52603260045260245ffd5b602080825260159082015274125b9d195b9d08191bd95cc81b9bdd08195e1a5cdd605a1b604082015260600190565b5f6020808385031215613cd2575f80fd5b82516001600160401b0380821115613ce8575f80fd5b9084019060408287031215613cfb575f80fd5b613d03613549565b825181528383015182811115613d17575f80fd5b80840193505086601f840112613d2b575f80fd5b82519150613d3b6137db83613775565b82815260059290921b83018401918481019088841115613d59575f80fd5b938501935b83851015613d7757845182529385019390850190613d5e565b948201949094529695505050505050565b5f82613d9657613d96613c20565b500690565b634e487b7160e01b5f52603160045260245ffd5b805f5b6002811015612df6578151845260209384019390910190600101613db2565b805f5b6002811015612df657613de8848351613daf565b6040939093019260209190910190600101613dd4565b5f6101a082019050613e11828451613daf565b602080840151613e246040850182613dd1565b506040840151613e3760c0850182613daf565b50606084015161010084015f5b6005811015613e6157825182529183019190830190600101613e44565b5050505092915050565b5f61028082019050613e7e828451613daf565b602080840151613e916040850182613dd1565b506040840151613ea460c0850182613daf565b50606084015161010084015f5b600c811015613e6157825182529183019190830190600101613eb1565b5f805f805f60a08688031215613ee2575f80fd5b505083516020850151604086015160608701516080909701519298919750959450909250905056fea26469706673582212203c4b3b4c184ba0ad7e0a51231aa9d2e0d4957f77d25289a078fdaa409ab19cde64736f6c63430008180033", + "devdoc": { + "kind": "dev", + "methods": { + "addAccountToDenylist(bytes32)": { + "params": { + "_deniedUser": "Poseidon hash of the venmoId being banned" + } + }, + "cancelIntent(bytes32)": { + "params": { + "_intentHash": "Hash of intent being cancelled" + } + }, + "initialize(address,address)": { + "params": { + "_registrationProcessor": "Registration processor address", + "_sendProcessor": "Send processor address" + } + }, + "offRamp(uint256[3],uint256,uint256)": { + "params": { + "_depositAmount": "The amount of USDC to off-ramp", + "_packedVenmoId": "The packed venmo id of the account owner (we pack for easy use with poseidon)", + "_receiveAmount": "The amount of USD to receive" + } + }, + "onRamp(uint256[2],uint256[2][2],uint256[2],uint256[12])": { + "params": { + "_a": "Parameter of zk proof", + "_b": "Parameter of zk proof", + "_c": "Parameter of zk proof", + "_signals": "Encoded public signals of the zk proof, contains mailserverHash, fromEmail, timestamp, onRamperIdHash, nullifier, intentHash" + } + }, + "owner()": { + "details": "Returns the address of the current owner." + }, + "register(uint256[2],uint256[2][2],uint256[2],uint256[5])": { + "params": { + "_a": "Parameter of zk proof", + "_b": "Parameter of zk proof", + "_c": "Parameter of zk proof", + "_signals": "Encoded public signals of the zk proof, contains mailserverHash, fromEmail, userIdHash" + } + }, + "releaseFundsToOnramper(bytes32)": { + "params": { + "_intentHash": "Hash of intent to resolve by releasing the funds" + } + }, + "removeAccountFromDenylist(bytes32)": { + "params": { + "_approvedUser": "Poseidon hash of the venmoId being approved" + } + }, + "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." + }, + "setIntentExpirationPeriod(uint256)": { + "params": { + "_intentExpirationPeriod": "New intent expiration period" + } + }, + "setMaxOnRampAmount(uint256)": { + "params": { + "_maxOnRampAmount": "The new max on ramp amount" + } + }, + "setMinDepositAmount(uint256)": { + "params": { + "_minDepositAmount": "The new minimum deposit amount" + } + }, + "setOnRampCooldownPeriod(uint256)": { + "params": { + "_onRampCooldownPeriod": "New on-ramp cooldown period" + } + }, + "setRegistrationProcessor(address)": { + "params": { + "_registrationProcessor": "New registration proccesor address" + } + }, + "setSendProcessor(address)": { + "params": { + "_sendProcessor": "New send proccesor address" + } + }, + "setSustainabilityFee(uint256)": { + "params": { + "_fee": "The new sustainability fee in precise units (10**18, ie 10% = 1e17)" + } + }, + "setSustainabilityFeeRecipient(address)": { + "params": { + "_feeRecipient": "The new fee recipient address" + } + }, + "signalIntent(uint256,uint256,address)": { + "params": { + "_amount": "The amount of USDC the user wants to on-ramp", + "_depositId": "The ID of the deposit the on-ramper intends to use for ", + "_to": "Address to forward funds to (can be same as onRamper)" + } + }, + "transferOwnership(address)": { + "details": "Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner." + }, + "withdrawDeposit(uint256[])": { + "params": { + "_depositIds": "Array of depositIds the depositor is attempting to withdraw" + } + } + }, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": { + "addAccountToDenylist(bytes32)": { + "notice": "Adds a venmoId to a depositor's deny list. If an address associated with the banned venmoId attempts to signal an intent on the user's deposit they will be denied." + }, + "cancelIntent(bytes32)": { + "notice": "Only callable by the originator of the intent. Cancels an outstanding intent thus allowing user to signal a new intent. Deposit state is updated to reflect the cancelled intent." + }, + "initialize(address,address)": { + "notice": "Initialize Ramp with the addresses of the Processors" + }, + "offRamp(uint256[3],uint256,uint256)": { + "notice": "Generates a deposit entry for off-rampers that can then be fulfilled by an on-ramper. This function will not add to previous deposits. Every deposit has it's own unique identifier. User must approve the contract to transfer the deposit amount of USDC." + }, + "onRamp(uint256[2],uint256[2][2],uint256[2],uint256[12])": { + "notice": "Anyone can submit an on-ramp transaction, even if caller isn't on-ramper. Upon submission the proof is validated, intent is removed, and deposit state is updated. USDC is transferred to the on-ramper." + }, + "register(uint256[2],uint256[2][2],uint256[2],uint256[5])": { + "notice": "Registers a new account by pulling the hash of the account id from the proof and assigning the account owner to the sender of the transaction. One venmo account can be registered to multiple Ethereum addresses." + }, + "releaseFundsToOnramper(bytes32)": { + "notice": "Allows off-ramper to release funds to the on-ramper in case of a failed on-ramp or because of some other arrangement between the two parties. Upon submission we check to make sure the msg.sender is the depositor, the intent is removed, and deposit state is updated. USDC is transferred to the on-ramper." + }, + "removeAccountFromDenylist(bytes32)": { + "notice": "Removes a venmoId from a depositor's deny list." + }, + "setIntentExpirationPeriod(uint256)": { + "notice": "GOVERNANCE ONLY: Updates the intent expiration period, after this period elapses an intent can be pruned to prevent locking up a depositor's funds." + }, + "setMaxOnRampAmount(uint256)": { + "notice": "GOVERNANCE ONLY: Updates the max amount allowed to be on-ramped in each transaction. To on-ramp more than this amount a user must make multiple transactions." + }, + "setMinDepositAmount(uint256)": { + "notice": "GOVERNANCE ONLY: Updates the minimum deposit amount a user can specify for off-ramping." + }, + "setOnRampCooldownPeriod(uint256)": { + "notice": "GOVERNANCE ONLY: Updates the on-ramp cooldown period, once an on-ramp transaction is completed the user must wait this amount of time before they can signalIntent to on-ramp again." + }, + "setRegistrationProcessor(address)": { + "notice": "GOVERNANCE ONLY: Updates the registration processor address used for validating and interpreting zk proofs." + }, + "setSendProcessor(address)": { + "notice": "GOVERNANCE ONLY: Updates the send processor address used for validating and interpreting zk proofs." + }, + "setSustainabilityFee(uint256)": { + "notice": "GOVERNANCE ONLY: Updates the sustainability fee. This fee is charged to on-rampers upon a successful on-ramp." + }, + "setSustainabilityFeeRecipient(address)": { + "notice": "GOVERNANCE ONLY: Updates the recepient of sustainability fees." + }, + "signalIntent(uint256,uint256,address)": { + "notice": "Signals intent to pay the depositor defined in the _depositId the _amount * deposit conversionRate off-chain in order to unlock _amount of funds on-chain. Each user can only have one outstanding intent at a time regardless of address (tracked using venmoId). Caller must not be on the depositor's deny list. If there are prunable intents then they will be deleted from the deposit to be able to maintain state hygiene." + }, + "withdrawDeposit(uint256[])": { + "notice": "Caller must be the depositor for each depositId in the array, if not whole function fails. Depositor is returned all remaining deposits and any outstanding intents that are expired. If an intent is not expired then those funds will not be returned. Deposit will be deleted as long as there are no more outstanding intents." + } + }, + "version": 1 + }, + "storageLayout": { + "storage": [ + { + "astId": 7, + "contract": "contracts/ramps/venmo-v2/VenmoRampV2.sol:VenmoRampV2", + "label": "_owner", + "offset": 0, + "slot": "0", + "type": "t_address" + }, + { + "astId": 19458, + "contract": "contracts/ramps/venmo-v2/VenmoRampV2.sol:VenmoRampV2", + "label": "registrationProcessor", + "offset": 0, + "slot": "1", + "type": "t_contract(IRegistrationProcessorV2)21891" + }, + { + "astId": 19461, + "contract": "contracts/ramps/venmo-v2/VenmoRampV2.sol:VenmoRampV2", + "label": "sendProcessor", + "offset": 0, + "slot": "2", + "type": "t_contract(ISendProcessor)19118" + }, + { + "astId": 19463, + "contract": "contracts/ramps/venmo-v2/VenmoRampV2.sol:VenmoRampV2", + "label": "isInitialized", + "offset": 20, + "slot": "2", + "type": "t_bool" + }, + { + "astId": 19468, + "contract": "contracts/ramps/venmo-v2/VenmoRampV2.sol:VenmoRampV2", + "label": "globalAccount", + "offset": 0, + "slot": "3", + "type": "t_mapping(t_bytes32,t_struct(GlobalAccountInfo)19417_storage)" + }, + { + "astId": 19473, + "contract": "contracts/ramps/venmo-v2/VenmoRampV2.sol:VenmoRampV2", + "label": "accounts", + "offset": 0, + "slot": "4", + "type": "t_mapping(t_address,t_struct(AccountInfo)19354_storage)" + }, + { + "astId": 19478, + "contract": "contracts/ramps/venmo-v2/VenmoRampV2.sol:VenmoRampV2", + "label": "deposits", + "offset": 0, + "slot": "5", + "type": "t_mapping(t_uint256,t_struct(Deposit)19372_storage)" + }, + { + "astId": 19483, + "contract": "contracts/ramps/venmo-v2/VenmoRampV2.sol:VenmoRampV2", + "label": "intents", + "offset": 0, + "slot": "6", + "type": "t_mapping(t_bytes32,t_struct(Intent)19393_storage)" + }, + { + "astId": 19485, + "contract": "contracts/ramps/venmo-v2/VenmoRampV2.sol:VenmoRampV2", + "label": "minDepositAmount", + "offset": 0, + "slot": "7", + "type": "t_uint256" + }, + { + "astId": 19487, + "contract": "contracts/ramps/venmo-v2/VenmoRampV2.sol:VenmoRampV2", + "label": "maxOnRampAmount", + "offset": 0, + "slot": "8", + "type": "t_uint256" + }, + { + "astId": 19489, + "contract": "contracts/ramps/venmo-v2/VenmoRampV2.sol:VenmoRampV2", + "label": "onRampCooldownPeriod", + "offset": 0, + "slot": "9", + "type": "t_uint256" + }, + { + "astId": 19491, + "contract": "contracts/ramps/venmo-v2/VenmoRampV2.sol:VenmoRampV2", + "label": "intentExpirationPeriod", + "offset": 0, + "slot": "10", + "type": "t_uint256" + }, + { + "astId": 19493, + "contract": "contracts/ramps/venmo-v2/VenmoRampV2.sol:VenmoRampV2", + "label": "sustainabilityFee", + "offset": 0, + "slot": "11", + "type": "t_uint256" + }, + { + "astId": 19495, + "contract": "contracts/ramps/venmo-v2/VenmoRampV2.sol:VenmoRampV2", + "label": "sustainabilityFeeRecipient", + "offset": 0, + "slot": "12", + "type": "t_address" + }, + { + "astId": 19497, + "contract": "contracts/ramps/venmo-v2/VenmoRampV2.sol:VenmoRampV2", + "label": "depositCounter", + "offset": 0, + "slot": "13", + "type": "t_uint256" + } + ], + "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_array(t_uint256)3_storage": { + "base": "t_uint256", + "encoding": "inplace", + "label": "uint256[3]", + "numberOfBytes": "96" + }, + "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_contract(IRegistrationProcessorV2)21891": { + "encoding": "inplace", + "label": "contract IRegistrationProcessorV2", + "numberOfBytes": "20" + }, + "t_contract(ISendProcessor)19118": { + "encoding": "inplace", + "label": "contract ISendProcessor", + "numberOfBytes": "20" + }, + "t_mapping(t_address,t_struct(AccountInfo)19354_storage)": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => struct VenmoRampV2.AccountInfo)", + "numberOfBytes": "32", + "value": "t_struct(AccountInfo)19354_storage" + }, + "t_mapping(t_bytes32,t_bool)": { + "encoding": "mapping", + "key": "t_bytes32", + "label": "mapping(bytes32 => bool)", + "numberOfBytes": "32", + "value": "t_bool" + }, + "t_mapping(t_bytes32,t_struct(GlobalAccountInfo)19417_storage)": { + "encoding": "mapping", + "key": "t_bytes32", + "label": "mapping(bytes32 => struct VenmoRampV2.GlobalAccountInfo)", + "numberOfBytes": "32", + "value": "t_struct(GlobalAccountInfo)19417_storage" + }, + "t_mapping(t_bytes32,t_struct(Intent)19393_storage)": { + "encoding": "mapping", + "key": "t_bytes32", + "label": "mapping(bytes32 => struct VenmoRampV2.Intent)", + "numberOfBytes": "32", + "value": "t_struct(Intent)19393_storage" + }, + "t_mapping(t_uint256,t_struct(Deposit)19372_storage)": { + "encoding": "mapping", + "key": "t_uint256", + "label": "mapping(uint256 => struct VenmoRampV2.Deposit)", + "numberOfBytes": "32", + "value": "t_struct(Deposit)19372_storage" + }, + "t_struct(AccountInfo)19354_storage": { + "encoding": "inplace", + "label": "struct VenmoRampV2.AccountInfo", + "members": [ + { + "astId": 19350, + "contract": "contracts/ramps/venmo-v2/VenmoRampV2.sol:VenmoRampV2", + "label": "venmoIdHash", + "offset": 0, + "slot": "0", + "type": "t_bytes32" + }, + { + "astId": 19353, + "contract": "contracts/ramps/venmo-v2/VenmoRampV2.sol:VenmoRampV2", + "label": "deposits", + "offset": 0, + "slot": "1", + "type": "t_array(t_uint256)dyn_storage" + } + ], + "numberOfBytes": "64" + }, + "t_struct(DenyList)19409_storage": { + "encoding": "inplace", + "label": "struct VenmoRampV2.DenyList", + "members": [ + { + "astId": 19404, + "contract": "contracts/ramps/venmo-v2/VenmoRampV2.sol:VenmoRampV2", + "label": "deniedUsers", + "offset": 0, + "slot": "0", + "type": "t_array(t_bytes32)dyn_storage" + }, + { + "astId": 19408, + "contract": "contracts/ramps/venmo-v2/VenmoRampV2.sol:VenmoRampV2", + "label": "isDenied", + "offset": 0, + "slot": "1", + "type": "t_mapping(t_bytes32,t_bool)" + } + ], + "numberOfBytes": "64" + }, + "t_struct(Deposit)19372_storage": { + "encoding": "inplace", + "label": "struct VenmoRampV2.Deposit", + "members": [ + { + "astId": 19356, + "contract": "contracts/ramps/venmo-v2/VenmoRampV2.sol:VenmoRampV2", + "label": "depositor", + "offset": 0, + "slot": "0", + "type": "t_address" + }, + { + "astId": 19360, + "contract": "contracts/ramps/venmo-v2/VenmoRampV2.sol:VenmoRampV2", + "label": "packedVenmoId", + "offset": 0, + "slot": "1", + "type": "t_array(t_uint256)3_storage" + }, + { + "astId": 19362, + "contract": "contracts/ramps/venmo-v2/VenmoRampV2.sol:VenmoRampV2", + "label": "depositAmount", + "offset": 0, + "slot": "4", + "type": "t_uint256" + }, + { + "astId": 19364, + "contract": "contracts/ramps/venmo-v2/VenmoRampV2.sol:VenmoRampV2", + "label": "remainingDeposits", + "offset": 0, + "slot": "5", + "type": "t_uint256" + }, + { + "astId": 19366, + "contract": "contracts/ramps/venmo-v2/VenmoRampV2.sol:VenmoRampV2", + "label": "outstandingIntentAmount", + "offset": 0, + "slot": "6", + "type": "t_uint256" + }, + { + "astId": 19368, + "contract": "contracts/ramps/venmo-v2/VenmoRampV2.sol:VenmoRampV2", + "label": "conversionRate", + "offset": 0, + "slot": "7", + "type": "t_uint256" + }, + { + "astId": 19371, + "contract": "contracts/ramps/venmo-v2/VenmoRampV2.sol:VenmoRampV2", + "label": "intentHashes", + "offset": 0, + "slot": "8", + "type": "t_array(t_bytes32)dyn_storage" + } + ], + "numberOfBytes": "288" + }, + "t_struct(GlobalAccountInfo)19417_storage": { + "encoding": "inplace", + "label": "struct VenmoRampV2.GlobalAccountInfo", + "members": [ + { + "astId": 19411, + "contract": "contracts/ramps/venmo-v2/VenmoRampV2.sol:VenmoRampV2", + "label": "currentIntentHash", + "offset": 0, + "slot": "0", + "type": "t_bytes32" + }, + { + "astId": 19413, + "contract": "contracts/ramps/venmo-v2/VenmoRampV2.sol:VenmoRampV2", + "label": "lastOnrampTimestamp", + "offset": 0, + "slot": "1", + "type": "t_uint256" + }, + { + "astId": 19416, + "contract": "contracts/ramps/venmo-v2/VenmoRampV2.sol:VenmoRampV2", + "label": "denyList", + "offset": 0, + "slot": "2", + "type": "t_struct(DenyList)19409_storage" + } + ], + "numberOfBytes": "128" + }, + "t_struct(Intent)19393_storage": { + "encoding": "inplace", + "label": "struct VenmoRampV2.Intent", + "members": [ + { + "astId": 19384, + "contract": "contracts/ramps/venmo-v2/VenmoRampV2.sol:VenmoRampV2", + "label": "onRamper", + "offset": 0, + "slot": "0", + "type": "t_address" + }, + { + "astId": 19386, + "contract": "contracts/ramps/venmo-v2/VenmoRampV2.sol:VenmoRampV2", + "label": "to", + "offset": 0, + "slot": "1", + "type": "t_address" + }, + { + "astId": 19388, + "contract": "contracts/ramps/venmo-v2/VenmoRampV2.sol:VenmoRampV2", + "label": "deposit", + "offset": 0, + "slot": "2", + "type": "t_uint256" + }, + { + "astId": 19390, + "contract": "contracts/ramps/venmo-v2/VenmoRampV2.sol:VenmoRampV2", + "label": "amount", + "offset": 0, + "slot": "3", + "type": "t_uint256" + }, + { + "astId": 19392, + "contract": "contracts/ramps/venmo-v2/VenmoRampV2.sol:VenmoRampV2", + "label": "intentTimestamp", + "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/deployments/encifher/VenmoRegistrationProcessor.json b/contracts/deployments/encifher/VenmoRegistrationProcessor.json new file mode 100644 index 000000000..256657b0f --- /dev/null +++ b/contracts/deployments/encifher/VenmoRegistrationProcessor.json @@ -0,0 +1,404 @@ +{ + "address": "0xEAb25969e5285dF34a3B245324d0B2B91E31cAD4", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_ramp", + "type": "address" + }, + { + "internalType": "contract IKeyHashAdapter", + "name": "_venmoMailserverKeyHashAdapter", + "type": "address" + }, + { + "internalType": "contract INullifierRegistry", + "name": "_nullifierRegistry", + "type": "address" + }, + { + "internalType": "string", + "name": "_emailFromAddress", + "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" + }, + { + "inputs": [], + "name": "PACK_SIZE", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "emailFromAddress", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getEmailFromAddress", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getMailserverKeyHash", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "mailserverKeyHashAdapter", + "outputs": [ + { + "internalType": "contract IKeyHashAdapter", + "name": "", + "type": "address" + } + ], + "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[5]", + "name": "signals", + "type": "uint256[5]" + } + ], + "internalType": "struct IRegistrationProcessor.RegistrationProof", + "name": "_proof", + "type": "tuple" + } + ], + "name": "processProof", + "outputs": [ + { + "internalType": "bytes32", + "name": "userIdHash", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "ramp", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "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": "contract IKeyHashAdapter", + "name": "_mailserverKeyHashAdapter", + "type": "address" + } + ], + "name": "setMailserverKeyHashAdapter", + "outputs": [], + "stateMutability": "nonpayable", + "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[5]", + "name": "_pubSignals", + "type": "uint256[5]" + } + ], + "name": "verifyProof", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "transactionHash": "0x9fc6a74beb606f6ec647e2c1db5814198575a6c17ea4a4106af9be8b457f0a24", + "receipt": { + "to": null, + "from": "0xa0Ee7A142d267C1f36714E4a8F75612F20a79720", + "contractAddress": "0xEAb25969e5285dF34a3B245324d0B2B91E31cAD4", + "transactionIndex": 0, + "gasUsed": "1316897", + "logsBloom": "0x00000000000000000000040000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000001000000000000000008000000000000000000020000000000000000000800000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000004000000020000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0xcfba18c2770ef0a90429d9d18d2c94ac9724dc76ace7b94fe1ef8bb9a62d2059", + "transactionHash": "0x9fc6a74beb606f6ec647e2c1db5814198575a6c17ea4a4106af9be8b457f0a24", + "logs": [ + { + "transactionIndex": 0, + "blockNumber": 61358, + "transactionHash": "0x9fc6a74beb606f6ec647e2c1db5814198575a6c17ea4a4106af9be8b457f0a24", + "address": "0xEAb25969e5285dF34a3B245324d0B2B91E31cAD4", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x000000000000000000000000a0ee7a142d267c1f36714e4a8f75612f20a79720" + ], + "data": "0x", + "logIndex": 0, + "blockHash": "0xcfba18c2770ef0a90429d9d18d2c94ac9724dc76ace7b94fe1ef8bb9a62d2059" + } + ], + "blockNumber": 61358, + "cumulativeGasUsed": "1316897", + "status": 1, + "byzantium": true + }, + "args": [ + "0xe8F76a822B57b973c7a89006092364fFF8f69040", + "0x4e85DC48a70DA1298489d5B6FC2492767d98f384", + "0x4d8E02BBfCf205828A8352Af4376b165E123D7b0", + "venmo@venmo.com" + ], + "numDeployments": 1, + "solcInputHash": "75b8f55da346d7ed99a350632554d2fb", + "metadata": "{\"compiler\":{\"version\":\"0.8.24+commit.e11b9ed9\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_ramp\",\"type\":\"address\"},{\"internalType\":\"contract IKeyHashAdapter\",\"name\":\"_venmoMailserverKeyHashAdapter\",\"type\":\"address\"},{\"internalType\":\"contract INullifierRegistry\",\"name\":\"_nullifierRegistry\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_emailFromAddress\",\"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\"},{\"inputs\":[],\"name\":\"PACK_SIZE\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"emailFromAddress\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getEmailFromAddress\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getMailserverKeyHash\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"mailserverKeyHashAdapter\",\"outputs\":[{\"internalType\":\"contract IKeyHashAdapter\",\"name\":\"\",\"type\":\"address\"}],\"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[5]\",\"name\":\"signals\",\"type\":\"uint256[5]\"}],\"internalType\":\"struct IRegistrationProcessor.RegistrationProof\",\"name\":\"_proof\",\"type\":\"tuple\"}],\"name\":\"processProof\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"userIdHash\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ramp\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"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\":\"contract IKeyHashAdapter\",\"name\":\"_mailserverKeyHashAdapter\",\"type\":\"address\"}],\"name\":\"setMailserverKeyHashAdapter\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"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[5]\",\"name\":\"_pubSignals\",\"type\":\"uint256[5]\"}],\"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\"}},\"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.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/ramps/venmo-v1/VenmoRegistrationProcessor.sol\":\"VenmoRegistrationProcessor\"},\"evmVersion\":\"shanghai\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"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 v4.4.1 (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\",\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"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/processors/BaseProcessor.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\n\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\nimport { IKeyHashAdapter } from \\\"./keyHashAdapters/IKeyHashAdapter.sol\\\";\\nimport { INullifierRegistry } from \\\"./nullifierRegistries/INullifierRegistry.sol\\\";\\n\\npragma solidity ^0.8.18;\\n\\ncontract BaseProcessor is Ownable {\\n\\n /* ============ Modifiers ============ */\\n modifier onlyRamp() {\\n require(msg.sender == ramp, \\\"Only Ramp can call this function\\\");\\n _;\\n }\\n\\n /* ============ State Variables ============ */\\n address public immutable ramp;\\n IKeyHashAdapter public mailserverKeyHashAdapter;\\n INullifierRegistry public nullifierRegistry;\\n bytes public emailFromAddress;\\n\\n /* ============ Constructor ============ */\\n constructor(\\n address _ramp,\\n IKeyHashAdapter _mailserverKeyHashAdapter,\\n INullifierRegistry _nullifierRegistry,\\n string memory _emailFromAddress\\n )\\n Ownable()\\n {\\n ramp = _ramp;\\n mailserverKeyHashAdapter = _mailserverKeyHashAdapter;\\n nullifierRegistry = _nullifierRegistry;\\n emailFromAddress = bytes(_emailFromAddress);\\n }\\n\\n /* ============ External Functions ============ */\\n\\n function setMailserverKeyHashAdapter(IKeyHashAdapter _mailserverKeyHashAdapter) external onlyOwner {\\n mailserverKeyHashAdapter = _mailserverKeyHashAdapter;\\n }\\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 /* ============ External Getters ============ */\\n\\n function getEmailFromAddress() external view returns (bytes memory) {\\n return emailFromAddress;\\n }\\n\\n function getMailserverKeyHash() public view returns (bytes32) {\\n return IKeyHashAdapter(mailserverKeyHashAdapter).mailserverKeyHash();\\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\":\"0xfc86cb8d817fe51078572d31095cf563cec19d8baec590746bfc9183fa361740\",\"license\":\"MIT\"},\"contracts/processors/keyHashAdapters/IKeyHashAdapter.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.18;\\n\\ninterface IKeyHashAdapter {\\n function setMailserverKeyHash(bytes32 _mailserverKeyHash) external;\\n function mailserverKeyHash() external view returns (bytes32);\\n}\\n\",\"keccak256\":\"0xb009a89c52a6e84972852d8c9e60758ca45aca9ac301268fb738459a91090873\",\"license\":\"MIT\"},\"contracts/processors/nullifierRegistries/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/ramps/venmo-v1/VenmoRegistrationProcessor.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\n\\nimport { StringUtils } from \\\"@zk-email/contracts/utils/StringUtils.sol\\\";\\n\\nimport { BaseProcessor } from \\\"../../processors/BaseProcessor.sol\\\";\\nimport { Groth16Verifier } from \\\"../../verifiers/venmo_registration_verifier.sol\\\";\\nimport { IKeyHashAdapter } from \\\"../../processors/keyHashAdapters/IKeyHashAdapter.sol\\\";\\nimport { INullifierRegistry } from \\\"../../processors/nullifierRegistries/INullifierRegistry.sol\\\";\\nimport { IRegistrationProcessor } from \\\"./interfaces/IRegistrationProcessor.sol\\\";\\n\\npragma solidity ^0.8.18;\\n\\ncontract VenmoRegistrationProcessor is Groth16Verifier, IRegistrationProcessor, BaseProcessor {\\n\\n using StringUtils for uint256[];\\n\\n /* ============ Constants ============ */\\n uint256 constant public PACK_SIZE = 7;\\n \\n /* ============ Constructor ============ */\\n constructor(\\n address _ramp,\\n IKeyHashAdapter _venmoMailserverKeyHashAdapter,\\n INullifierRegistry _nullifierRegistry,\\n string memory _emailFromAddress\\n )\\n Groth16Verifier()\\n BaseProcessor(_ramp, _venmoMailserverKeyHashAdapter, _nullifierRegistry, _emailFromAddress)\\n {}\\n\\n /* ============ External Functions ============ */\\n\\n function processProof(\\n IRegistrationProcessor.RegistrationProof calldata _proof\\n )\\n public\\n view\\n override\\n onlyRamp\\n returns(bytes32 userIdHash)\\n {\\n require(this.verifyProof(_proof.a, _proof.b, _proof.c, _proof.signals), \\\"Invalid Proof\\\"); // checks effects iteractions, this should come first\\n\\n require(bytes32(_proof.signals[0]) == getMailserverKeyHash(), \\\"Invalid mailserver key hash\\\");\\n\\n // Signals [1:4] are the packed from email address\\n string memory fromEmail = _parseSignalArray(_proof.signals, 1, 4);\\n require(keccak256(abi.encodePacked(fromEmail)) == keccak256(emailFromAddress), \\\"Invalid email from address\\\");\\n\\n // Signals [4] is the packed onRamperIdHash\\n userIdHash = bytes32(_proof.signals[4]);\\n }\\n\\n /* ============ Internal Functions ============ */\\n\\n function _parseSignalArray(uint256[5] calldata _signals, uint8 _from, uint8 _to) internal pure returns (string memory) {\\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\":\"0xca7ad66cae637a7afc58121262db2990f290ad945de08f0765c7917031ad8a35\",\"license\":\"MIT\"},\"contracts/ramps/venmo-v1/interfaces/IRegistrationProcessor.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.18;\\n\\ninterface IRegistrationProcessor {\\n\\n struct RegistrationProof {\\n uint256[2] a;\\n uint256[2][2] b;\\n uint256[2] c;\\n uint256[5] signals;\\n }\\n\\n function processProof(\\n RegistrationProof calldata _proof\\n )\\n external\\n view\\n returns (bytes32);\\n}\\n\",\"keccak256\":\"0xc80e1b5561af1a8631547c72e6c6dcdf4e66c06b3eb34b1a8db1bb0f6d3ea90f\",\"license\":\"MIT\"},\"contracts/verifiers/venmo_registration_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 = 16692827623879808830126666424117838150546424161010311559130132272860078100250;\\n uint256 constant deltax2 = 10427071116080203280483990720065140241625477298313711514843941053378169062748;\\n uint256 constant deltay1 = 12292291730534257963793035250750833013505862587513324721305952905575695195722;\\n uint256 constant deltay2 = 20744227296603881754617447489692206687227195961073977292626564883622660146422;\\n\\n \\n uint256 constant IC0x = 8444387327591820163253359883706304250001395835708102283881672029412593968774;\\n uint256 constant IC0y = 277567402350001170949287541204029095267467381858853916455216632597839881894;\\n \\n uint256 constant IC1x = 11766018000598374647690511651127745003630346152255765679463620118729063279220;\\n uint256 constant IC1y = 9973870620290232174118930849612458053973396098852917252709131237691777167431;\\n \\n uint256 constant IC2x = 21007152236406284962452665998326532111064818140624217664323424373713986554835;\\n uint256 constant IC2y = 21775424933265972488601591944473690558387975377218817711132857025038427581344;\\n \\n uint256 constant IC3x = 19548332954070589452554863336717712265670681575029463650291986455368503640194;\\n uint256 constant IC3y = 9885572105525346384114396000793852863725331019928798599079916138124811450063;\\n \\n uint256 constant IC4x = 20459688676260758193620894047864540995062748169615148342851161008796903469478;\\n uint256 constant IC4y = 7185096966400904659568958817597117358528438755253953902329001546341542579806;\\n \\n uint256 constant IC5x = 15566588852465957839914470257479783208753427872712540953155019219989274639291;\\n uint256 constant IC5y = 13117341851862511824800803143692229606087651943401230287864971446454834743578;\\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[5] calldata _pubSignals) public view returns (bool) {\\n assembly {\\n function checkField(v) {\\n if iszero(lt(v, q)) {\\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\\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\\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\":\"0xff9780d09b9ca02c5ffe9a87891c78e8248d0c7a3529fc60a5a19dc26c6ab0e3\",\"license\":\"GPL-3.0\"}},\"version\":1}", + "bytecode": "0x60a060405234801562000010575f80fd5b5060405162001ab038038062001ab083398101604081905262000033916200010f565b83838383620000423362000094565b6001600160a01b03848116608052600180546001600160a01b031990811686841617909155600280549091169184169190911790556003620000858282620002a7565b50505050505050505062000373565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b0381168114620000f8575f80fd5b50565b634e487b7160e01b5f52604160045260245ffd5b5f805f806080858703121562000123575f80fd5b84516200013081620000e3565b809450506020808601516200014581620000e3565b60408701519094506200015881620000e3565b60608701519093506001600160401b038082111562000175575f80fd5b818801915088601f83011262000189575f80fd5b8151818111156200019e576200019e620000fb565b604051601f8201601f19908116603f01168101908382118183101715620001c957620001c9620000fb565b816040528281528b86848701011115620001e1575f80fd5b5f93505b82841015620002045784840186015181850187015292850192620001e5565b5f86848301015280965050505050505092959194509250565b600181811c908216806200023257607f821691505b6020821081036200025157634e487b7160e01b5f52602260045260245ffd5b50919050565b601f821115620002a257805f5260205f20601f840160051c810160208510156200027e5750805b601f840160051c820191505b818110156200029f575f81556001016200028a565b50505b505050565b81516001600160401b03811115620002c357620002c3620000fb565b620002db81620002d484546200021d565b8462000257565b602080601f83116001811462000311575f8415620002f95750858301515b5f19600386901b1c1916600185901b1785556200036b565b5f85815260208120601f198616915b82811015620003415788860151825594840194600190910190840162000320565b50858210156200035f57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b60805161171e620003925f395f818160ee0152610223015261171e5ff3fe608060405234801561000f575f80fd5b50600436106100e5575f3560e01c8063a87cb6ea11610088578063ced1e97811610063578063ced1e978146101d6578063d0b71f99146101de578063f2fde38b146101f1578063f6c7226b14610204575f80fd5b8063a87cb6ea146101a6578063b870676c146101ae578063c0d05fed146101c1575f80fd5b80633d0c9cc4116100c35780633d0c9cc414610171578063672ae59714610179578063715018a61461018c5780638da5cb5b14610196575f80fd5b806315d276e1146100e957806317c8ecf21461012d57806334baeab91461014e575b5f80fd5b6101107f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020015b60405180910390f35b61014061013b3660046111df565b610217565b604051908152602001610124565b61016161015c36600461120c565b610447565b6040519015158152602001610124565b610140600781565b600154610110906001600160a01b031681565b610194610a0d565b005b5f546001600160a01b0316610110565b610140610a20565b600254610110906001600160a01b031681565b6101c9610a90565b604051610124919061128f565b6101c9610b1c565b6101946101ec3660046112d5565b610bac565b6101946101ff3660046112d5565b610bd6565b61019461021236600461130b565b610c4c565b5f336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146102955760405162461bcd60e51b815260206004820181905260248201527f4f6e6c792052616d702063616e2063616c6c20746869732066756e6374696f6e60448201526064015b60405180910390fd5b604080516334baeab960e01b815230916334baeab9916102c89186919082019060c08301906101008401906004016113b6565b602060405180830381865afa1580156102e3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103079190611401565b6103435760405162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b210283937b7b360991b604482015260640161028c565b61034b610a20565b6101008301351461039e5760405162461bcd60e51b815260206004820152601b60248201527f496e76616c6964206d61696c736572766572206b657920686173680000000000604482015260640161028c565b5f6103b0836101000160016004610c64565b905060036040516103c19190611466565b6040518091039020816040516020016103da91906114d8565b604051602081830303815290604052805190602001201461043d5760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420656d61696c2066726f6d2061646472657373000000000000604482015260640161028c565b5050610180013590565b5f61099e565b7f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47811061047c575f805260205ff35b50565b5f60405183815284602082015285604082015260408160608360076107d05a03fa9150816104af575f805260205ff35b825160408201526020830151606082015260408360808360066107d05a03fa915050806104de575f805260205ff35b5050505050565b7f12ab5a9624956b76265fc0eec1d900b529add7b70792dbf4e5a843dd604b268685527e9d18fb29076cc91333c58ed5efb1c16e4c4895b9f4163f7d1b3f7c8d4026a660208601525f608086018661058087357f160d02be8268c1b255c0a0ebde2da936232ed0e153d6f8996f1defac51f930477f1a0354875e82d8f0ac2ac8aeb2dd4fc16d0da2df59f5071140d037af419e2a748461047f565b6105d060208801357f30247428f688b9e3e1d9a0b69811eac6c928394e70e275120108106592076ba07f2e71a076d6490c2f15b995d8b68ad3a0bfa3eb68a58fa33df69c0cfc955a8bd38461047f565b61062060408801357f15db0918919bf88282f6a317b654c06195e674b6d4d833681dab4bd774d036cf7f2b37f6e04a0bca3b2cdcaa0a9f8c2d544a3c5b360d4874c9c1894c59225bc0828461047f565b61067060608801357f0fe29eea9c50213502ef28c871f902b18884958f4eb0596758a1f8389a9cce5e7f2d3bc5feca96b1abbee7368fbcb0ade12a856a5785d8fc3cfb0ac8215850f1a68461047f565b6106c060808801357f1d002702c6a69936e861d6e2a0d8e2ac85847afea1277294beebdb36af9cc91a7f226a60872afad35dabefcc99fd4f84eb93add0df114af28147b4dd2770793bbb8461047f565b50823581527f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4760208401357f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4703066020820152833560408201526020840135606082015260408401356080820152606084013560a08201527f2d4d9aa7e302d9df41749d5507949d05dbea33fbb16c643b22f599a2be6df2e260c08201527f14bedd503c37ceb061d8ec60209fe345ce89830a19230301f076caff004d192660e08201527f0967032fcbf776d1afc985f88877f182d38480a653f2decaa9794cbc3bf3060c6101008201527f0e187847ad4c798374d0d6732bf501847dd68bc0e071241e0213bc7fc13db7ab6101208201527f304cfbd1e08a704a99f5e847d93f8c3caafddec46b7a0d379da69a4d112346a76101408201527f1739c1b1a457a8c7313123d24d2f9192f896b7c63eea05a9d57f06547ad0cec86101608201525f87015161018082015260205f018701516101a08201527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c26101c08201527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed6101e08201527f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b6102008201527f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa610220820152843561024082015260208501356102608201527f24e7ce3cf2d75f0b3bc44ddeeceef45d789f7c66da38ae223ef2eed52d894f1a6102808201527f170d835b2c98451e8b4e152ee67a3ceda06bbed8e6c68adc4a5c6f4342fec55c6102a08201527f1b2d30c8edee55fa0308f573fe5d1737f2e76ae12c5263f338e3b68e62911e4a6102c08201527f2ddcd10acc578091831b7e1a6edb36fb628c81b530513c55ffba19948e2004f66102e08201526020816103008360086107d05a03fa9051169695505050505050565b60405161038081016040526109b55f84013561044d565b6109c2602084013561044d565b6109cf604084013561044d565b6109dc606084013561044d565b6109e9608084013561044d565b6109f660a084013561044d565b610a03818486888a6104e5565b9050805f5260205ff35b610a15610d34565b610a1e5f610d8d565b565b60015460408051630d901b9960e21b815290515f926001600160a01b0316916336406e649160048083019260209291908290030181865afa158015610a67573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a8b91906114f3565b905090565b60038054610a9d90611434565b80601f0160208091040260200160405190810160405280929190818152602001828054610ac990611434565b8015610b145780601f10610aeb57610100808354040283529160200191610b14565b820191905f5260205f20905b815481529060010190602001808311610af757829003601f168201915b505050505081565b606060038054610b2b90611434565b80601f0160208091040260200160405190810160405280929190818152602001828054610b5790611434565b8015610ba25780601f10610b7957610100808354040283529160200191610ba2565b820191905f5260205f20905b815481529060010190602001808311610b8557829003601f168201915b5050505050905090565b610bb4610d34565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b610bde610d34565b6001600160a01b038116610c435760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161028c565b61047c81610d8d565b610c54610d34565b6003610c608282611553565b5050565b60605f610c718484611627565b60ff1667ffffffffffffffff811115610c8c57610c8c6112f7565b604051908082528060200260200182016040528015610cb5578160200160208202803683370190505b50905060ff84165b8360ff16811015610d1057858160058110610cda57610cda611420565b602002013582610ced60ff881684611640565b81518110610cfd57610cfd611420565b6020908102919091010152600101610cbd565b50610d2b60078251610d229190611653565b82906007610ddc565b95945050505050565b5f546001600160a01b03163314610a1e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161028c565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60605f80838651610ded9190611653565b67ffffffffffffffff811115610e0557610e056112f7565b6040519080825280601f01601f191660200182016040528015610e2f576020820181803683370190505b5090505f805b87518161ffff161015610fc9575f888261ffff1681518110610e5957610e59611420565b602002602001015190505f8767ffffffffffffffff811115610e7d57610e7d6112f7565b604051908082528060200260200182016040528015610ea6578160200160208202803683370190505b5090505f5b88811015610eed57610ebe816008611653565b83901c828281518110610ed357610ed3611420565b60ff90921660209283029190910190910152600101610eab565b505f5b88811015610fb3575f828281518110610f0b57610f0b611420565b602002602001015160ff169050805f14610f80578060f81b878781518110610f3557610f35611420565b60200101906001600160f81b03191690815f1a90535085610f558161166a565b9650610f649050600289611682565b60ff165f03610f7b57610f786001896116af565b97505b610fa3565b610f8b600289611682565b60ff16600103610fa357610fa06001896116af565b97505b5060089290921c91600101610ef0565b5050508080610fc1906116c8565b915050610e35565b5060018360ff16101561106a5760405162461bcd60e51b815260206004820152605760248201527f4e6f207061636b656420627974657320666f756e642120496e76616c6964206660448201527f696e616c207374617465206f66207061636b656420627974657320696e20656d60648201527f61696c3b2076616c7565206973206c696b656c79203021000000000000000000608482015260a40161028c565b858111156110d85760405162461bcd60e51b815260206004820152603560248201527f5061636b6564206279746573206d6f7265207468616e20616c6c6f776564206d6044820152746178206e756d626572206f66207369676e616c732160581b606482015260840161028c565b5f6110e2836110ee565b98975050505050505050565b805160609082905f5b82518110156111375782818151811061111257611112611420565b01602001516001600160f81b0319165f0361112f57809150611137565b6001016110f7565b505f8167ffffffffffffffff811115611152576111526112f7565b6040519080825280601f01601f19166020018201604052801561117c576020820181803683370190505b5090505f5b828110156111d65783818151811061119b5761119b611420565b602001015160f81c60f81b8282815181106111b8576111b8611420565b60200101906001600160f81b03191690815f1a905350600101611181565b50949350505050565b5f6101a082840312156111f0575f80fd5b50919050565b8060408101831015611206575f80fd5b92915050565b5f805f806101a0808688031215611221575f80fd5b61122b87876111f6565b945060c086018781111561123d575f80fd5b60408701945061124d88826111f6565b93505086818701111561125e575f80fd5b50929591945092610100019150565b5f5b8381101561128757818101518382015260200161126f565b50505f910152565b602081525f82518060208401526112ad81604085016020870161126d565b601f01601f19169190910160400192915050565b6001600160a01b038116811461047c575f80fd5b5f602082840312156112e5575f80fd5b81356112f0816112c1565b9392505050565b634e487b7160e01b5f52604160045260245ffd5b5f6020828403121561131b575f80fd5b813567ffffffffffffffff80821115611332575f80fd5b818401915084601f830112611345575f80fd5b813581811115611357576113576112f7565b604051601f8201601f19908116603f0116810190838211818310171561137f5761137f6112f7565b81604052828152876020848701011115611397575f80fd5b826020860160208301375f928101602001929092525095945050505050565b6101a08101604080878437808301865f5b60028110156113e4578382843791830191908301906001016113c7565b505050808560c08501375060a08361010084013795945050505050565b5f60208284031215611411575f80fd5b815180151581146112f0575f80fd5b634e487b7160e01b5f52603260045260245ffd5b600181811c9082168061144857607f821691505b6020821081036111f057634e487b7160e01b5f52602260045260245ffd5b5f80835461147381611434565b6001828116801561148b57600181146114a0576114cc565b60ff19841687528215158302870194506114cc565b875f526020805f205f5b858110156114c35781548a8201529084019082016114aa565b50505082870194505b50929695505050505050565b5f82516114e981846020870161126d565b9190910192915050565b5f60208284031215611503575f80fd5b5051919050565b601f82111561154e57805f5260205f20601f840160051c8101602085101561152f5750805b601f840160051c820191505b818110156104de575f815560010161153b565b505050565b815167ffffffffffffffff81111561156d5761156d6112f7565b6115818161157b8454611434565b8461150a565b602080601f8311600181146115b4575f841561159d5750858301515b5f19600386901b1c1916600185901b17855561160b565b5f85815260208120601f198616915b828110156115e2578886015182559484019460019091019084016115c3565b50858210156115ff57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b634e487b7160e01b5f52601160045260245ffd5b60ff828116828216039081111561120657611206611613565b8181038181111561120657611206611613565b808202811582820484141761120657611206611613565b5f6001820161167b5761167b611613565b5060010190565b5f60ff8316806116a057634e487b7160e01b5f52601260045260245ffd5b8060ff84160691505092915050565b60ff818116838216019081111561120657611206611613565b5f61ffff8083168181036116de576116de611613565b600101939250505056fea2646970667358221220f66f99f4d273443d6c878987396bbc6c4d3ebfb9c759109146c68ec78715e48164736f6c63430008180033", + "deployedBytecode": "0x608060405234801561000f575f80fd5b50600436106100e5575f3560e01c8063a87cb6ea11610088578063ced1e97811610063578063ced1e978146101d6578063d0b71f99146101de578063f2fde38b146101f1578063f6c7226b14610204575f80fd5b8063a87cb6ea146101a6578063b870676c146101ae578063c0d05fed146101c1575f80fd5b80633d0c9cc4116100c35780633d0c9cc414610171578063672ae59714610179578063715018a61461018c5780638da5cb5b14610196575f80fd5b806315d276e1146100e957806317c8ecf21461012d57806334baeab91461014e575b5f80fd5b6101107f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020015b60405180910390f35b61014061013b3660046111df565b610217565b604051908152602001610124565b61016161015c36600461120c565b610447565b6040519015158152602001610124565b610140600781565b600154610110906001600160a01b031681565b610194610a0d565b005b5f546001600160a01b0316610110565b610140610a20565b600254610110906001600160a01b031681565b6101c9610a90565b604051610124919061128f565b6101c9610b1c565b6101946101ec3660046112d5565b610bac565b6101946101ff3660046112d5565b610bd6565b61019461021236600461130b565b610c4c565b5f336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146102955760405162461bcd60e51b815260206004820181905260248201527f4f6e6c792052616d702063616e2063616c6c20746869732066756e6374696f6e60448201526064015b60405180910390fd5b604080516334baeab960e01b815230916334baeab9916102c89186919082019060c08301906101008401906004016113b6565b602060405180830381865afa1580156102e3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103079190611401565b6103435760405162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b210283937b7b360991b604482015260640161028c565b61034b610a20565b6101008301351461039e5760405162461bcd60e51b815260206004820152601b60248201527f496e76616c6964206d61696c736572766572206b657920686173680000000000604482015260640161028c565b5f6103b0836101000160016004610c64565b905060036040516103c19190611466565b6040518091039020816040516020016103da91906114d8565b604051602081830303815290604052805190602001201461043d5760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420656d61696c2066726f6d2061646472657373000000000000604482015260640161028c565b5050610180013590565b5f61099e565b7f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47811061047c575f805260205ff35b50565b5f60405183815284602082015285604082015260408160608360076107d05a03fa9150816104af575f805260205ff35b825160408201526020830151606082015260408360808360066107d05a03fa915050806104de575f805260205ff35b5050505050565b7f12ab5a9624956b76265fc0eec1d900b529add7b70792dbf4e5a843dd604b268685527e9d18fb29076cc91333c58ed5efb1c16e4c4895b9f4163f7d1b3f7c8d4026a660208601525f608086018661058087357f160d02be8268c1b255c0a0ebde2da936232ed0e153d6f8996f1defac51f930477f1a0354875e82d8f0ac2ac8aeb2dd4fc16d0da2df59f5071140d037af419e2a748461047f565b6105d060208801357f30247428f688b9e3e1d9a0b69811eac6c928394e70e275120108106592076ba07f2e71a076d6490c2f15b995d8b68ad3a0bfa3eb68a58fa33df69c0cfc955a8bd38461047f565b61062060408801357f15db0918919bf88282f6a317b654c06195e674b6d4d833681dab4bd774d036cf7f2b37f6e04a0bca3b2cdcaa0a9f8c2d544a3c5b360d4874c9c1894c59225bc0828461047f565b61067060608801357f0fe29eea9c50213502ef28c871f902b18884958f4eb0596758a1f8389a9cce5e7f2d3bc5feca96b1abbee7368fbcb0ade12a856a5785d8fc3cfb0ac8215850f1a68461047f565b6106c060808801357f1d002702c6a69936e861d6e2a0d8e2ac85847afea1277294beebdb36af9cc91a7f226a60872afad35dabefcc99fd4f84eb93add0df114af28147b4dd2770793bbb8461047f565b50823581527f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4760208401357f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4703066020820152833560408201526020840135606082015260408401356080820152606084013560a08201527f2d4d9aa7e302d9df41749d5507949d05dbea33fbb16c643b22f599a2be6df2e260c08201527f14bedd503c37ceb061d8ec60209fe345ce89830a19230301f076caff004d192660e08201527f0967032fcbf776d1afc985f88877f182d38480a653f2decaa9794cbc3bf3060c6101008201527f0e187847ad4c798374d0d6732bf501847dd68bc0e071241e0213bc7fc13db7ab6101208201527f304cfbd1e08a704a99f5e847d93f8c3caafddec46b7a0d379da69a4d112346a76101408201527f1739c1b1a457a8c7313123d24d2f9192f896b7c63eea05a9d57f06547ad0cec86101608201525f87015161018082015260205f018701516101a08201527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c26101c08201527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed6101e08201527f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b6102008201527f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa610220820152843561024082015260208501356102608201527f24e7ce3cf2d75f0b3bc44ddeeceef45d789f7c66da38ae223ef2eed52d894f1a6102808201527f170d835b2c98451e8b4e152ee67a3ceda06bbed8e6c68adc4a5c6f4342fec55c6102a08201527f1b2d30c8edee55fa0308f573fe5d1737f2e76ae12c5263f338e3b68e62911e4a6102c08201527f2ddcd10acc578091831b7e1a6edb36fb628c81b530513c55ffba19948e2004f66102e08201526020816103008360086107d05a03fa9051169695505050505050565b60405161038081016040526109b55f84013561044d565b6109c2602084013561044d565b6109cf604084013561044d565b6109dc606084013561044d565b6109e9608084013561044d565b6109f660a084013561044d565b610a03818486888a6104e5565b9050805f5260205ff35b610a15610d34565b610a1e5f610d8d565b565b60015460408051630d901b9960e21b815290515f926001600160a01b0316916336406e649160048083019260209291908290030181865afa158015610a67573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a8b91906114f3565b905090565b60038054610a9d90611434565b80601f0160208091040260200160405190810160405280929190818152602001828054610ac990611434565b8015610b145780601f10610aeb57610100808354040283529160200191610b14565b820191905f5260205f20905b815481529060010190602001808311610af757829003601f168201915b505050505081565b606060038054610b2b90611434565b80601f0160208091040260200160405190810160405280929190818152602001828054610b5790611434565b8015610ba25780601f10610b7957610100808354040283529160200191610ba2565b820191905f5260205f20905b815481529060010190602001808311610b8557829003601f168201915b5050505050905090565b610bb4610d34565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b610bde610d34565b6001600160a01b038116610c435760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161028c565b61047c81610d8d565b610c54610d34565b6003610c608282611553565b5050565b60605f610c718484611627565b60ff1667ffffffffffffffff811115610c8c57610c8c6112f7565b604051908082528060200260200182016040528015610cb5578160200160208202803683370190505b50905060ff84165b8360ff16811015610d1057858160058110610cda57610cda611420565b602002013582610ced60ff881684611640565b81518110610cfd57610cfd611420565b6020908102919091010152600101610cbd565b50610d2b60078251610d229190611653565b82906007610ddc565b95945050505050565b5f546001600160a01b03163314610a1e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161028c565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60605f80838651610ded9190611653565b67ffffffffffffffff811115610e0557610e056112f7565b6040519080825280601f01601f191660200182016040528015610e2f576020820181803683370190505b5090505f805b87518161ffff161015610fc9575f888261ffff1681518110610e5957610e59611420565b602002602001015190505f8767ffffffffffffffff811115610e7d57610e7d6112f7565b604051908082528060200260200182016040528015610ea6578160200160208202803683370190505b5090505f5b88811015610eed57610ebe816008611653565b83901c828281518110610ed357610ed3611420565b60ff90921660209283029190910190910152600101610eab565b505f5b88811015610fb3575f828281518110610f0b57610f0b611420565b602002602001015160ff169050805f14610f80578060f81b878781518110610f3557610f35611420565b60200101906001600160f81b03191690815f1a90535085610f558161166a565b9650610f649050600289611682565b60ff165f03610f7b57610f786001896116af565b97505b610fa3565b610f8b600289611682565b60ff16600103610fa357610fa06001896116af565b97505b5060089290921c91600101610ef0565b5050508080610fc1906116c8565b915050610e35565b5060018360ff16101561106a5760405162461bcd60e51b815260206004820152605760248201527f4e6f207061636b656420627974657320666f756e642120496e76616c6964206660448201527f696e616c207374617465206f66207061636b656420627974657320696e20656d60648201527f61696c3b2076616c7565206973206c696b656c79203021000000000000000000608482015260a40161028c565b858111156110d85760405162461bcd60e51b815260206004820152603560248201527f5061636b6564206279746573206d6f7265207468616e20616c6c6f776564206d6044820152746178206e756d626572206f66207369676e616c732160581b606482015260840161028c565b5f6110e2836110ee565b98975050505050505050565b805160609082905f5b82518110156111375782818151811061111257611112611420565b01602001516001600160f81b0319165f0361112f57809150611137565b6001016110f7565b505f8167ffffffffffffffff811115611152576111526112f7565b6040519080825280601f01601f19166020018201604052801561117c576020820181803683370190505b5090505f5b828110156111d65783818151811061119b5761119b611420565b602001015160f81c60f81b8282815181106111b8576111b8611420565b60200101906001600160f81b03191690815f1a905350600101611181565b50949350505050565b5f6101a082840312156111f0575f80fd5b50919050565b8060408101831015611206575f80fd5b92915050565b5f805f806101a0808688031215611221575f80fd5b61122b87876111f6565b945060c086018781111561123d575f80fd5b60408701945061124d88826111f6565b93505086818701111561125e575f80fd5b50929591945092610100019150565b5f5b8381101561128757818101518382015260200161126f565b50505f910152565b602081525f82518060208401526112ad81604085016020870161126d565b601f01601f19169190910160400192915050565b6001600160a01b038116811461047c575f80fd5b5f602082840312156112e5575f80fd5b81356112f0816112c1565b9392505050565b634e487b7160e01b5f52604160045260245ffd5b5f6020828403121561131b575f80fd5b813567ffffffffffffffff80821115611332575f80fd5b818401915084601f830112611345575f80fd5b813581811115611357576113576112f7565b604051601f8201601f19908116603f0116810190838211818310171561137f5761137f6112f7565b81604052828152876020848701011115611397575f80fd5b826020860160208301375f928101602001929092525095945050505050565b6101a08101604080878437808301865f5b60028110156113e4578382843791830191908301906001016113c7565b505050808560c08501375060a08361010084013795945050505050565b5f60208284031215611411575f80fd5b815180151581146112f0575f80fd5b634e487b7160e01b5f52603260045260245ffd5b600181811c9082168061144857607f821691505b6020821081036111f057634e487b7160e01b5f52602260045260245ffd5b5f80835461147381611434565b6001828116801561148b57600181146114a0576114cc565b60ff19841687528215158302870194506114cc565b875f526020805f205f5b858110156114c35781548a8201529084019082016114aa565b50505082870194505b50929695505050505050565b5f82516114e981846020870161126d565b9190910192915050565b5f60208284031215611503575f80fd5b5051919050565b601f82111561154e57805f5260205f20601f840160051c8101602085101561152f5750805b601f840160051c820191505b818110156104de575f815560010161153b565b505050565b815167ffffffffffffffff81111561156d5761156d6112f7565b6115818161157b8454611434565b8461150a565b602080601f8311600181146115b4575f841561159d5750858301515b5f19600386901b1c1916600185901b17855561160b565b5f85815260208120601f198616915b828110156115e2578886015182559484019460019091019084016115c3565b50858210156115ff57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b634e487b7160e01b5f52601160045260245ffd5b60ff828116828216039081111561120657611206611613565b8181038181111561120657611206611613565b808202811582820484141761120657611206611613565b5f6001820161167b5761167b611613565b5060010190565b5f60ff8316806116a057634e487b7160e01b5f52601260045260245ffd5b8060ff84160691505092915050565b60ff818116838216019081111561120657611206611613565b5f61ffff8083168181036116de576116de611613565b600101939250505056fea2646970667358221220f66f99f4d273443d6c878987396bbc6c4d3ebfb9c759109146c68ec78715e48164736f6c63430008180033", + "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" + } + }, + "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." + } + }, + "version": 1 + }, + "storageLayout": { + "storage": [ + { + "astId": 7, + "contract": "contracts/ramps/venmo-v1/VenmoRegistrationProcessor.sol:VenmoRegistrationProcessor", + "label": "_owner", + "offset": 0, + "slot": "0", + "type": "t_address" + }, + { + "astId": 5930, + "contract": "contracts/ramps/venmo-v1/VenmoRegistrationProcessor.sol:VenmoRegistrationProcessor", + "label": "mailserverKeyHashAdapter", + "offset": 0, + "slot": "1", + "type": "t_contract(IKeyHashAdapter)6405" + }, + { + "astId": 5933, + "contract": "contracts/ramps/venmo-v1/VenmoRegistrationProcessor.sol:VenmoRegistrationProcessor", + "label": "nullifierRegistry", + "offset": 0, + "slot": "2", + "type": "t_contract(INullifierRegistry)6636" + }, + { + "astId": 5935, + "contract": "contracts/ramps/venmo-v1/VenmoRegistrationProcessor.sol:VenmoRegistrationProcessor", + "label": "emailFromAddress", + "offset": 0, + "slot": "3", + "type": "t_bytes_storage" + } + ], + "types": { + "t_address": { + "encoding": "inplace", + "label": "address", + "numberOfBytes": "20" + }, + "t_bytes_storage": { + "encoding": "bytes", + "label": "bytes", + "numberOfBytes": "32" + }, + "t_contract(IKeyHashAdapter)6405": { + "encoding": "inplace", + "label": "contract IKeyHashAdapter", + "numberOfBytes": "20" + }, + "t_contract(INullifierRegistry)6636": { + "encoding": "inplace", + "label": "contract INullifierRegistry", + "numberOfBytes": "20" + } + } + } +} \ No newline at end of file diff --git a/contracts/deployments/encifher/VenmoRegistrationProcessorV2.json b/contracts/deployments/encifher/VenmoRegistrationProcessorV2.json new file mode 100644 index 000000000..f6ad46bea --- /dev/null +++ b/contracts/deployments/encifher/VenmoRegistrationProcessorV2.json @@ -0,0 +1,463 @@ +{ + "address": "0x3EBD66861C1d8F298c20ED56506b063206103227", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_ramp", + "type": "address" + }, + { + "internalType": "contract IKeyHashAdapterV2", + "name": "_venmoMailserverKeyHashAdapter", + "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": "PACK_SIZE", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "emailFromAddress", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getEmailFromAddress", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_keyHash", + "type": "bytes32" + } + ], + "name": "isMailServerKeyHash", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "mailServerKeyHashAdapter", + "outputs": [ + { + "internalType": "contract IKeyHashAdapterV2", + "name": "", + "type": "address" + } + ], + "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[5]", + "name": "signals", + "type": "uint256[5]" + } + ], + "internalType": "struct IRegistrationProcessorV2.RegistrationProof", + "name": "_proof", + "type": "tuple" + } + ], + "name": "processProof", + "outputs": [ + { + "internalType": "bytes32", + "name": "userIdHash", + "type": "bytes32" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "ramp", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "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": "contract IKeyHashAdapterV2", + "name": "_mailServerKeyHashAdapter", + "type": "address" + } + ], + "name": "setMailserverKeyHashAdapter", + "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[5]", + "name": "_pubSignals", + "type": "uint256[5]" + } + ], + "name": "verifyProof", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "transactionHash": "0x6be5d23e27ecc010221250634d1fc7ac575c29243fb54560f68cf0ea7f6f4fe8", + "receipt": { + "to": null, + "from": "0xa0Ee7A142d267C1f36714E4a8F75612F20a79720", + "contractAddress": "0x3EBD66861C1d8F298c20ED56506b063206103227", + "transactionIndex": 0, + "gasUsed": "1412162", + "logsBloom": "0x00000000000000000000040000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000008000000000000000000020000000000000000000800000000000000000000000400000000400000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000004000000020000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0x1766a873b3e2e71b2bb4aaed6c67620b62a6a9f1cafe974a21dbf81c4a772c14", + "transactionHash": "0x6be5d23e27ecc010221250634d1fc7ac575c29243fb54560f68cf0ea7f6f4fe8", + "logs": [ + { + "transactionIndex": 0, + "blockNumber": 61381, + "transactionHash": "0x6be5d23e27ecc010221250634d1fc7ac575c29243fb54560f68cf0ea7f6f4fe8", + "address": "0x3EBD66861C1d8F298c20ED56506b063206103227", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x000000000000000000000000a0ee7a142d267c1f36714e4a8f75612f20a79720" + ], + "data": "0x", + "logIndex": 0, + "blockHash": "0x1766a873b3e2e71b2bb4aaed6c67620b62a6a9f1cafe974a21dbf81c4a772c14" + } + ], + "blockNumber": 61381, + "cumulativeGasUsed": "1412162", + "status": 1, + "byzantium": true + }, + "args": [ + "0x67f65B834aaAc92C15c2EBa9FF7E81f2d33a1cFD", + "0xa7B987f505366630109De019862c183E690a040B", + "0x4d8E02BBfCf205828A8352Af4376b165E123D7b0", + "venmo@venmo.com", + "0" + ], + "numDeployments": 1, + "solcInputHash": "75b8f55da346d7ed99a350632554d2fb", + "metadata": "{\"compiler\":{\"version\":\"0.8.24+commit.e11b9ed9\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_ramp\",\"type\":\"address\"},{\"internalType\":\"contract IKeyHashAdapterV2\",\"name\":\"_venmoMailserverKeyHashAdapter\",\"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\":\"PACK_SIZE\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"emailFromAddress\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getEmailFromAddress\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_keyHash\",\"type\":\"bytes32\"}],\"name\":\"isMailServerKeyHash\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"mailServerKeyHashAdapter\",\"outputs\":[{\"internalType\":\"contract IKeyHashAdapterV2\",\"name\":\"\",\"type\":\"address\"}],\"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[5]\",\"name\":\"signals\",\"type\":\"uint256[5]\"}],\"internalType\":\"struct IRegistrationProcessorV2.RegistrationProof\",\"name\":\"_proof\",\"type\":\"tuple\"}],\"name\":\"processProof\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"userIdHash\",\"type\":\"bytes32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ramp\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"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\":\"contract IKeyHashAdapterV2\",\"name\":\"_mailServerKeyHashAdapter\",\"type\":\"address\"}],\"name\":\"setMailserverKeyHashAdapter\",\"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[5]\",\"name\":\"_pubSignals\",\"type\":\"uint256[5]\"}],\"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/ramps/venmo-v2/VenmoRegistrationProcessorV2.sol\":\"VenmoRegistrationProcessorV2\"},\"evmVersion\":\"shanghai\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"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 v4.4.1 (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\",\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"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/processors/BaseProcessorV2.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\n\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\nimport { IKeyHashAdapterV2 } from \\\"./keyHashAdapters/IKeyHashAdapterV2.sol\\\";\\nimport { INullifierRegistry } from \\\"./nullifierRegistries/INullifierRegistry.sol\\\";\\n\\npragma solidity ^0.8.18;\\n\\ncontract BaseProcessorV2 is Ownable {\\n\\n /* ============ Modifiers ============ */\\n modifier onlyRamp() {\\n require(msg.sender == ramp, \\\"Only Ramp can call this function\\\");\\n _;\\n }\\n\\n /* ============ State Variables ============ */\\n address public immutable ramp;\\n IKeyHashAdapterV2 public mailServerKeyHashAdapter;\\n INullifierRegistry public nullifierRegistry;\\n bytes public emailFromAddress;\\n uint256 public timestampBuffer;\\n\\n /* ============ Constructor ============ */\\n constructor(\\n address _ramp,\\n IKeyHashAdapterV2 _mailServerKeyHashAdapter,\\n INullifierRegistry _nullifierRegistry,\\n string memory _emailFromAddress,\\n uint256 _timestampBuffer\\n )\\n Ownable()\\n {\\n ramp = _ramp;\\n mailServerKeyHashAdapter = _mailServerKeyHashAdapter;\\n nullifierRegistry = _nullifierRegistry;\\n emailFromAddress = bytes(_emailFromAddress);\\n timestampBuffer = _timestampBuffer;\\n }\\n\\n /* ============ External Functions ============ */\\n\\n function setMailserverKeyHashAdapter(IKeyHashAdapterV2 _mailServerKeyHashAdapter) external onlyOwner {\\n mailServerKeyHashAdapter = _mailServerKeyHashAdapter;\\n }\\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 function isMailServerKeyHash(bytes32 _keyHash) public view returns (bool) {\\n return IKeyHashAdapterV2(mailServerKeyHashAdapter).isMailServerKeyHash(_keyHash);\\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\":\"0x207174fcbbfa8d2de65a5a5665f05e3f2d668f7df33b682a0f139c967dd3f6be\",\"license\":\"MIT\"},\"contracts/processors/keyHashAdapters/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/processors/nullifierRegistries/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/ramps/venmo-v2/VenmoRegistrationProcessorV2.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\n\\nimport { StringUtils } from \\\"@zk-email/contracts/utils/StringUtils.sol\\\";\\n\\nimport { BaseProcessorV2 } from \\\"../../processors/BaseProcessorV2.sol\\\";\\nimport { Groth16Verifier } from \\\"../../verifiers/venmo_registration_verifier.sol\\\";\\nimport { IKeyHashAdapterV2 } from \\\"../../processors/keyHashAdapters/IKeyHashAdapterV2.sol\\\";\\nimport { INullifierRegistry } from \\\"../../processors/nullifierRegistries/INullifierRegistry.sol\\\";\\nimport { IRegistrationProcessorV2 } from \\\"./interfaces/IRegistrationProcessorV2.sol\\\";\\n\\npragma solidity ^0.8.18;\\n\\ncontract VenmoRegistrationProcessorV2 is Groth16Verifier, IRegistrationProcessorV2, BaseProcessorV2 {\\n\\n using StringUtils for uint256[];\\n\\n /* ============ Constants ============ */\\n uint256 constant public PACK_SIZE = 7;\\n \\n /* ============ Constructor ============ */\\n constructor(\\n address _ramp,\\n IKeyHashAdapterV2 _venmoMailserverKeyHashAdapter,\\n INullifierRegistry _nullifierRegistry,\\n string memory _emailFromAddress,\\n uint256 _timestampBuffer\\n )\\n Groth16Verifier()\\n BaseProcessorV2(\\n _ramp,\\n _venmoMailserverKeyHashAdapter,\\n _nullifierRegistry,\\n _emailFromAddress,\\n _timestampBuffer\\n )\\n {}\\n\\n /* ============ External Functions ============ */\\n\\n function processProof(\\n IRegistrationProcessorV2.RegistrationProof calldata _proof\\n )\\n public\\n override\\n onlyRamp\\n returns(bytes32 userIdHash)\\n {\\n require(this.verifyProof(_proof.a, _proof.b, _proof.c, _proof.signals), \\\"Invalid Proof\\\"); // checks effects iteractions, this should come first\\n\\n require(isMailServerKeyHash(bytes32(_proof.signals[0])), \\\"Invalid mailserver key hash\\\");\\n\\n // Signals [1:4] are the packed from email address\\n string memory fromEmail = _parseSignalArray(_proof.signals, 1, 4);\\n require(keccak256(abi.encodePacked(fromEmail)) == keccak256(emailFromAddress), \\\"Invalid email from address\\\");\\n\\n _validateAndAddNullifier(keccak256(abi.encode(_proof)));\\n\\n // Signals [4] is the packed onRamperIdHash\\n userIdHash = bytes32(_proof.signals[4]);\\n }\\n\\n /* ============ Internal Functions ============ */\\n\\n function _parseSignalArray(uint256[5] calldata _signals, uint8 _from, uint8 _to) internal pure returns (string memory) {\\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\":\"0x96fed71c2e264aaec9a1bcaaa6ae0b497742b6cba06f2e2c76715815d8d9e755\",\"license\":\"MIT\"},\"contracts/ramps/venmo-v2/interfaces/IRegistrationProcessorV2.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.18;\\n\\ninterface IRegistrationProcessorV2 {\\n\\n struct RegistrationProof {\\n uint256[2] a;\\n uint256[2][2] b;\\n uint256[2] c;\\n uint256[5] signals;\\n }\\n\\n function processProof(\\n RegistrationProof calldata _proof\\n )\\n external\\n returns (bytes32);\\n}\\n\",\"keccak256\":\"0x67a284be0f71e8f1518098567b7dc9200c8b312ea90e44600d4efeb9d8986f91\",\"license\":\"MIT\"},\"contracts/verifiers/venmo_registration_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 = 16692827623879808830126666424117838150546424161010311559130132272860078100250;\\n uint256 constant deltax2 = 10427071116080203280483990720065140241625477298313711514843941053378169062748;\\n uint256 constant deltay1 = 12292291730534257963793035250750833013505862587513324721305952905575695195722;\\n uint256 constant deltay2 = 20744227296603881754617447489692206687227195961073977292626564883622660146422;\\n\\n \\n uint256 constant IC0x = 8444387327591820163253359883706304250001395835708102283881672029412593968774;\\n uint256 constant IC0y = 277567402350001170949287541204029095267467381858853916455216632597839881894;\\n \\n uint256 constant IC1x = 11766018000598374647690511651127745003630346152255765679463620118729063279220;\\n uint256 constant IC1y = 9973870620290232174118930849612458053973396098852917252709131237691777167431;\\n \\n uint256 constant IC2x = 21007152236406284962452665998326532111064818140624217664323424373713986554835;\\n uint256 constant IC2y = 21775424933265972488601591944473690558387975377218817711132857025038427581344;\\n \\n uint256 constant IC3x = 19548332954070589452554863336717712265670681575029463650291986455368503640194;\\n uint256 constant IC3y = 9885572105525346384114396000793852863725331019928798599079916138124811450063;\\n \\n uint256 constant IC4x = 20459688676260758193620894047864540995062748169615148342851161008796903469478;\\n uint256 constant IC4y = 7185096966400904659568958817597117358528438755253953902329001546341542579806;\\n \\n uint256 constant IC5x = 15566588852465957839914470257479783208753427872712540953155019219989274639291;\\n uint256 constant IC5y = 13117341851862511824800803143692229606087651943401230287864971446454834743578;\\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[5] calldata _pubSignals) public view returns (bool) {\\n assembly {\\n function checkField(v) {\\n if iszero(lt(v, q)) {\\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\\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\\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\":\"0xff9780d09b9ca02c5ffe9a87891c78e8248d0c7a3529fc60a5a19dc26c6ab0e3\",\"license\":\"GPL-3.0\"}},\"version\":1}", + "bytecode": "0x60a060405234801562000010575f80fd5b5060405162001c8738038062001c87833981016040819052620000339162000115565b848484848462000043336200009a565b6001600160a01b03858116608052600180546001600160a01b031990811687841617909155600280549091169185169190911790556003620000868382620002b6565b506004555062000382975050505050505050565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b0381168114620000fe575f80fd5b50565b634e487b7160e01b5f52604160045260245ffd5b5f805f805f60a086880312156200012a575f80fd5b85516200013781620000e9565b809550506020808701516200014c81620000e9565b60408801519095506200015f81620000e9565b60608801519094506001600160401b03808211156200017c575f80fd5b818901915089601f83011262000190575f80fd5b815181811115620001a557620001a562000101565b604051601f8201601f19908116603f01168101908382118183101715620001d057620001d062000101565b816040528281528c86848701011115620001e8575f80fd5b5f93505b828410156200020b5784840186015181850187015292850192620001ec565b5f868483010152809750505050505050608086015190509295509295909350565b600181811c908216806200024157607f821691505b6020821081036200026057634e487b7160e01b5f52602260045260245ffd5b50919050565b601f821115620002b157805f5260205f20601f840160051c810160208510156200028d5750805b601f840160051c820191505b81811015620002ae575f815560010162000299565b50505b505050565b81516001600160401b03811115620002d257620002d262000101565b620002ea81620002e384546200022c565b8462000266565b602080601f83116001811462000320575f8415620003085750858301515b5f19600386901b1c1916600185901b1785556200037a565b5f85815260208120601f198616915b8281101562000350578886015182559484019460019091019084016200032f565b50858210156200036e57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b6080516118e5620003a25f395f8181610104015261026001526118e55ff3fe608060405234801561000f575f80fd5b50600436106100fb575f3560e01c8063b2a3fda411610093578063d0b71f9911610063578063d0b71f9914610212578063dbac582114610225578063f2fde38b1461022e578063f6c7226b14610241575f80fd5b8063b2a3fda4146101cf578063b870676c146101e2578063c0d05fed146101f5578063ced1e9781461020a575f80fd5b80633d0c9cc4116100ce5780633d0c9cc41461019a578063715018a6146101a25780638da5cb5b146101ac578063a8ef333f146101bc575f80fd5b806315d276e1146100ff57806317c8ecf21461014357806319d091521461016457806334baeab914610187575b5f80fd5b6101267f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020015b60405180910390f35b610156610151366004611365565b610254565b60405190815260200161013a565b61017761017236600461137c565b6104b2565b604051901515815260200161013a565b6101776101953660046113a3565b610523565b610156600781565b6101aa610ae9565b005b5f546001600160a01b0316610126565b600154610126906001600160a01b031681565b6101aa6101dd36600461137c565b610afc565b600254610126906001600160a01b031681565b6101fd610b09565b60405161013a9190611426565b6101fd610b95565b6101aa61022036600461146c565b610c25565b61015660045481565b6101aa61023c36600461146c565b610c4f565b6101aa61024f3660046114a2565b610cc5565b5f336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146102d25760405162461bcd60e51b815260206004820181905260248201527f4f6e6c792052616d702063616e2063616c6c20746869732066756e6374696f6e60448201526064015b60405180910390fd5b604080516334baeab960e01b815230916334baeab9916103059186919082019060c0830190610100840190600401611576565b602060405180830381865afa158015610320573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061034491906115a7565b6103805760405162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b210283937b7b360991b60448201526064016102c9565b61038e6101008301356104b2565b6103da5760405162461bcd60e51b815260206004820152601b60248201527f496e76616c6964206d61696c736572766572206b65792068617368000000000060448201526064016102c9565b5f6103ec836101000160016004610cdd565b905060036040516103fd919061160c565b604051809103902081604051602001610416919061167e565b60405160208183030381529060405280519060200120146104795760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420656d61696c2066726f6d206164647265737300000000000060448201526064016102c9565b6104a88360405160200161048d9190611699565b60405160208183030381529060405280519060200120610dad565b5050610180013590565b600154604051630ce848a960e11b8152600481018390525f916001600160a01b0316906319d0915290602401602060405180830381865afa1580156104f9573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061051d91906115a7565b92915050565b5f610a7a565b7f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd478110610558575f805260205ff35b50565b5f60405183815284602082015285604082015260408160608360076107d05a03fa91508161058b575f805260205ff35b825160408201526020830151606082015260408360808360066107d05a03fa915050806105ba575f805260205ff35b5050505050565b7f12ab5a9624956b76265fc0eec1d900b529add7b70792dbf4e5a843dd604b268685527e9d18fb29076cc91333c58ed5efb1c16e4c4895b9f4163f7d1b3f7c8d4026a660208601525f608086018661065c87357f160d02be8268c1b255c0a0ebde2da936232ed0e153d6f8996f1defac51f930477f1a0354875e82d8f0ac2ac8aeb2dd4fc16d0da2df59f5071140d037af419e2a748461055b565b6106ac60208801357f30247428f688b9e3e1d9a0b69811eac6c928394e70e275120108106592076ba07f2e71a076d6490c2f15b995d8b68ad3a0bfa3eb68a58fa33df69c0cfc955a8bd38461055b565b6106fc60408801357f15db0918919bf88282f6a317b654c06195e674b6d4d833681dab4bd774d036cf7f2b37f6e04a0bca3b2cdcaa0a9f8c2d544a3c5b360d4874c9c1894c59225bc0828461055b565b61074c60608801357f0fe29eea9c50213502ef28c871f902b18884958f4eb0596758a1f8389a9cce5e7f2d3bc5feca96b1abbee7368fbcb0ade12a856a5785d8fc3cfb0ac8215850f1a68461055b565b61079c60808801357f1d002702c6a69936e861d6e2a0d8e2ac85847afea1277294beebdb36af9cc91a7f226a60872afad35dabefcc99fd4f84eb93add0df114af28147b4dd2770793bbb8461055b565b50823581527f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4760208401357f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4703066020820152833560408201526020840135606082015260408401356080820152606084013560a08201527f2d4d9aa7e302d9df41749d5507949d05dbea33fbb16c643b22f599a2be6df2e260c08201527f14bedd503c37ceb061d8ec60209fe345ce89830a19230301f076caff004d192660e08201527f0967032fcbf776d1afc985f88877f182d38480a653f2decaa9794cbc3bf3060c6101008201527f0e187847ad4c798374d0d6732bf501847dd68bc0e071241e0213bc7fc13db7ab6101208201527f304cfbd1e08a704a99f5e847d93f8c3caafddec46b7a0d379da69a4d112346a76101408201527f1739c1b1a457a8c7313123d24d2f9192f896b7c63eea05a9d57f06547ad0cec86101608201525f87015161018082015260205f018701516101a08201527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c26101c08201527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed6101e08201527f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b6102008201527f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa610220820152843561024082015260208501356102608201527f24e7ce3cf2d75f0b3bc44ddeeceef45d789f7c66da38ae223ef2eed52d894f1a6102808201527f170d835b2c98451e8b4e152ee67a3ceda06bbed8e6c68adc4a5c6f4342fec55c6102a08201527f1b2d30c8edee55fa0308f573fe5d1737f2e76ae12c5263f338e3b68e62911e4a6102c08201527f2ddcd10acc578091831b7e1a6edb36fb628c81b530513c55ffba19948e2004f66102e08201526020816103008360086107d05a03fa9051169695505050505050565b6040516103808101604052610a915f840135610529565b610a9e6020840135610529565b610aab6040840135610529565b610ab86060840135610529565b610ac56080840135610529565b610ad260a0840135610529565b610adf818486888a6105c1565b9050805f5260205ff35b610af1610eba565b610afa5f610f13565b565b610b04610eba565b600455565b60038054610b16906115da565b80601f0160208091040260200160405190810160405280929190818152602001828054610b42906115da565b8015610b8d5780601f10610b6457610100808354040283529160200191610b8d565b820191905f5260205f20905b815481529060010190602001808311610b7057829003601f168201915b505050505081565b606060038054610ba4906115da565b80601f0160208091040260200160405190810160405280929190818152602001828054610bd0906115da565b8015610c1b5780601f10610bf257610100808354040283529160200191610c1b565b820191905f5260205f20905b815481529060010190602001808311610bfe57829003601f168201915b5050505050905090565b610c2d610eba565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b610c57610eba565b6001600160a01b038116610cbc5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016102c9565b61055881610f13565b610ccd610eba565b6003610cd9828261171a565b5050565b60605f610cea84846117ee565b60ff1667ffffffffffffffff811115610d0557610d0561148e565b604051908082528060200260200182016040528015610d2e578160200160208202803683370190505b50905060ff84165b8360ff16811015610d8957858160058110610d5357610d536115c6565b602002013582610d6660ff881684611807565b81518110610d7657610d766115c6565b6020908102919091010152600101610d36565b50610da460078251610d9b919061181a565b82906007610f62565b95945050505050565b60025460405163169394bb60e01b8152600481018390526001600160a01b039091169063169394bb90602401602060405180830381865afa158015610df4573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e1891906115a7565b15610e655760405162461bcd60e51b815260206004820152601f60248201527f4e756c6c69666965722068617320616c7265616479206265656e20757365640060448201526064016102c9565b600254604051632dea6f9960e11b8152600481018390526001600160a01b0390911690635bd4df32906024015f604051808303815f87803b158015610ea8575f80fd5b505af11580156105ba573d5f803e3d5ffd5b5f546001600160a01b03163314610afa5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016102c9565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60605f80838651610f73919061181a565b67ffffffffffffffff811115610f8b57610f8b61148e565b6040519080825280601f01601f191660200182016040528015610fb5576020820181803683370190505b5090505f805b87518161ffff16101561114f575f888261ffff1681518110610fdf57610fdf6115c6565b602002602001015190505f8767ffffffffffffffff8111156110035761100361148e565b60405190808252806020026020018201604052801561102c578160200160208202803683370190505b5090505f5b888110156110735761104481600861181a565b83901c828281518110611059576110596115c6565b60ff90921660209283029190910190910152600101611031565b505f5b88811015611139575f828281518110611091576110916115c6565b602002602001015160ff169050805f14611106578060f81b8787815181106110bb576110bb6115c6565b60200101906001600160f81b03191690815f1a905350856110db81611831565b96506110ea9050600289611849565b60ff165f03611101576110fe600189611876565b97505b611129565b611111600289611849565b60ff1660010361112957611126600189611876565b97505b5060089290921c91600101611076565b50505080806111479061188f565b915050610fbb565b5060018360ff1610156111f05760405162461bcd60e51b815260206004820152605760248201527f4e6f207061636b656420627974657320666f756e642120496e76616c6964206660448201527f696e616c207374617465206f66207061636b656420627974657320696e20656d60648201527f61696c3b2076616c7565206973206c696b656c79203021000000000000000000608482015260a4016102c9565b8581111561125e5760405162461bcd60e51b815260206004820152603560248201527f5061636b6564206279746573206d6f7265207468616e20616c6c6f776564206d6044820152746178206e756d626572206f66207369676e616c732160581b60648201526084016102c9565b5f61126883611274565b98975050505050505050565b805160609082905f5b82518110156112bd57828181518110611298576112986115c6565b01602001516001600160f81b0319165f036112b5578091506112bd565b60010161127d565b505f8167ffffffffffffffff8111156112d8576112d861148e565b6040519080825280601f01601f191660200182016040528015611302576020820181803683370190505b5090505f5b8281101561135c57838181518110611321576113216115c6565b602001015160f81c60f81b82828151811061133e5761133e6115c6565b60200101906001600160f81b03191690815f1a905350600101611307565b50949350505050565b5f6101a08284031215611376575f80fd5b50919050565b5f6020828403121561138c575f80fd5b5035919050565b806040810183101561051d575f80fd5b5f805f806101a08086880312156113b8575f80fd5b6113c28787611393565b945060c08601878111156113d4575f80fd5b6040870194506113e48882611393565b9350508681870111156113f5575f80fd5b50929591945092610100019150565b5f5b8381101561141e578181015183820152602001611406565b50505f910152565b602081525f8251806020840152611444816040850160208701611404565b601f01601f19169190910160400192915050565b6001600160a01b0381168114610558575f80fd5b5f6020828403121561147c575f80fd5b813561148781611458565b9392505050565b634e487b7160e01b5f52604160045260245ffd5b5f602082840312156114b2575f80fd5b813567ffffffffffffffff808211156114c9575f80fd5b818401915084601f8301126114dc575f80fd5b8135818111156114ee576114ee61148e565b604051601f8201601f19908116603f011681019083821181831017156115165761151661148e565b8160405282815287602084870101111561152e575f80fd5b826020860160208301375f928101602001929092525095945050505050565b805f5b600281101561157057604080838637938401939190910190600101611550565b50505050565b6101a08101604086833761158d604083018661154d565b60408460c084013760a08361010084013795945050505050565b5f602082840312156115b7575f80fd5b81518015158114611487575f80fd5b634e487b7160e01b5f52603260045260245ffd5b600181811c908216806115ee57607f821691505b60208210810361137657634e487b7160e01b5f52602260045260245ffd5b5f808354611619816115da565b60018281168015611631576001811461164657611672565b60ff1984168752821515830287019450611672565b875f526020805f205f5b858110156116695781548a820152908401908201611650565b50505082870194505b50929695505050505050565b5f825161168f818460208701611404565b9190910192915050565b6101a0810160408383376116b3604083016040850161154d565b604060c0840160c084013761010060a0818501828501375092915050565b601f82111561171557805f5260205f20601f840160051c810160208510156116f65750805b601f840160051c820191505b818110156105ba575f8155600101611702565b505050565b815167ffffffffffffffff8111156117345761173461148e565b6117488161174284546115da565b846116d1565b602080601f83116001811461177b575f84156117645750858301515b5f19600386901b1c1916600185901b1785556117d2565b5f85815260208120601f198616915b828110156117a95788860151825594840194600190910190840161178a565b50858210156117c657878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b634e487b7160e01b5f52601160045260245ffd5b60ff828116828216039081111561051d5761051d6117da565b8181038181111561051d5761051d6117da565b808202811582820484141761051d5761051d6117da565b5f60018201611842576118426117da565b5060010190565b5f60ff83168061186757634e487b7160e01b5f52601260045260245ffd5b8060ff84160691505092915050565b60ff818116838216019081111561051d5761051d6117da565b5f61ffff8083168181036118a5576118a56117da565b600101939250505056fea2646970667358221220663fc2aa33edceffa6324dfb75f792137bc3f7aff8dac0b00dd21eed668c580364736f6c63430008180033", + "deployedBytecode": "0x608060405234801561000f575f80fd5b50600436106100fb575f3560e01c8063b2a3fda411610093578063d0b71f9911610063578063d0b71f9914610212578063dbac582114610225578063f2fde38b1461022e578063f6c7226b14610241575f80fd5b8063b2a3fda4146101cf578063b870676c146101e2578063c0d05fed146101f5578063ced1e9781461020a575f80fd5b80633d0c9cc4116100ce5780633d0c9cc41461019a578063715018a6146101a25780638da5cb5b146101ac578063a8ef333f146101bc575f80fd5b806315d276e1146100ff57806317c8ecf21461014357806319d091521461016457806334baeab914610187575b5f80fd5b6101267f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020015b60405180910390f35b610156610151366004611365565b610254565b60405190815260200161013a565b61017761017236600461137c565b6104b2565b604051901515815260200161013a565b6101776101953660046113a3565b610523565b610156600781565b6101aa610ae9565b005b5f546001600160a01b0316610126565b600154610126906001600160a01b031681565b6101aa6101dd36600461137c565b610afc565b600254610126906001600160a01b031681565b6101fd610b09565b60405161013a9190611426565b6101fd610b95565b6101aa61022036600461146c565b610c25565b61015660045481565b6101aa61023c36600461146c565b610c4f565b6101aa61024f3660046114a2565b610cc5565b5f336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146102d25760405162461bcd60e51b815260206004820181905260248201527f4f6e6c792052616d702063616e2063616c6c20746869732066756e6374696f6e60448201526064015b60405180910390fd5b604080516334baeab960e01b815230916334baeab9916103059186919082019060c0830190610100840190600401611576565b602060405180830381865afa158015610320573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061034491906115a7565b6103805760405162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b210283937b7b360991b60448201526064016102c9565b61038e6101008301356104b2565b6103da5760405162461bcd60e51b815260206004820152601b60248201527f496e76616c6964206d61696c736572766572206b65792068617368000000000060448201526064016102c9565b5f6103ec836101000160016004610cdd565b905060036040516103fd919061160c565b604051809103902081604051602001610416919061167e565b60405160208183030381529060405280519060200120146104795760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420656d61696c2066726f6d206164647265737300000000000060448201526064016102c9565b6104a88360405160200161048d9190611699565b60405160208183030381529060405280519060200120610dad565b5050610180013590565b600154604051630ce848a960e11b8152600481018390525f916001600160a01b0316906319d0915290602401602060405180830381865afa1580156104f9573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061051d91906115a7565b92915050565b5f610a7a565b7f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd478110610558575f805260205ff35b50565b5f60405183815284602082015285604082015260408160608360076107d05a03fa91508161058b575f805260205ff35b825160408201526020830151606082015260408360808360066107d05a03fa915050806105ba575f805260205ff35b5050505050565b7f12ab5a9624956b76265fc0eec1d900b529add7b70792dbf4e5a843dd604b268685527e9d18fb29076cc91333c58ed5efb1c16e4c4895b9f4163f7d1b3f7c8d4026a660208601525f608086018661065c87357f160d02be8268c1b255c0a0ebde2da936232ed0e153d6f8996f1defac51f930477f1a0354875e82d8f0ac2ac8aeb2dd4fc16d0da2df59f5071140d037af419e2a748461055b565b6106ac60208801357f30247428f688b9e3e1d9a0b69811eac6c928394e70e275120108106592076ba07f2e71a076d6490c2f15b995d8b68ad3a0bfa3eb68a58fa33df69c0cfc955a8bd38461055b565b6106fc60408801357f15db0918919bf88282f6a317b654c06195e674b6d4d833681dab4bd774d036cf7f2b37f6e04a0bca3b2cdcaa0a9f8c2d544a3c5b360d4874c9c1894c59225bc0828461055b565b61074c60608801357f0fe29eea9c50213502ef28c871f902b18884958f4eb0596758a1f8389a9cce5e7f2d3bc5feca96b1abbee7368fbcb0ade12a856a5785d8fc3cfb0ac8215850f1a68461055b565b61079c60808801357f1d002702c6a69936e861d6e2a0d8e2ac85847afea1277294beebdb36af9cc91a7f226a60872afad35dabefcc99fd4f84eb93add0df114af28147b4dd2770793bbb8461055b565b50823581527f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4760208401357f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4703066020820152833560408201526020840135606082015260408401356080820152606084013560a08201527f2d4d9aa7e302d9df41749d5507949d05dbea33fbb16c643b22f599a2be6df2e260c08201527f14bedd503c37ceb061d8ec60209fe345ce89830a19230301f076caff004d192660e08201527f0967032fcbf776d1afc985f88877f182d38480a653f2decaa9794cbc3bf3060c6101008201527f0e187847ad4c798374d0d6732bf501847dd68bc0e071241e0213bc7fc13db7ab6101208201527f304cfbd1e08a704a99f5e847d93f8c3caafddec46b7a0d379da69a4d112346a76101408201527f1739c1b1a457a8c7313123d24d2f9192f896b7c63eea05a9d57f06547ad0cec86101608201525f87015161018082015260205f018701516101a08201527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c26101c08201527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed6101e08201527f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b6102008201527f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa610220820152843561024082015260208501356102608201527f24e7ce3cf2d75f0b3bc44ddeeceef45d789f7c66da38ae223ef2eed52d894f1a6102808201527f170d835b2c98451e8b4e152ee67a3ceda06bbed8e6c68adc4a5c6f4342fec55c6102a08201527f1b2d30c8edee55fa0308f573fe5d1737f2e76ae12c5263f338e3b68e62911e4a6102c08201527f2ddcd10acc578091831b7e1a6edb36fb628c81b530513c55ffba19948e2004f66102e08201526020816103008360086107d05a03fa9051169695505050505050565b6040516103808101604052610a915f840135610529565b610a9e6020840135610529565b610aab6040840135610529565b610ab86060840135610529565b610ac56080840135610529565b610ad260a0840135610529565b610adf818486888a6105c1565b9050805f5260205ff35b610af1610eba565b610afa5f610f13565b565b610b04610eba565b600455565b60038054610b16906115da565b80601f0160208091040260200160405190810160405280929190818152602001828054610b42906115da565b8015610b8d5780601f10610b6457610100808354040283529160200191610b8d565b820191905f5260205f20905b815481529060010190602001808311610b7057829003601f168201915b505050505081565b606060038054610ba4906115da565b80601f0160208091040260200160405190810160405280929190818152602001828054610bd0906115da565b8015610c1b5780601f10610bf257610100808354040283529160200191610c1b565b820191905f5260205f20905b815481529060010190602001808311610bfe57829003601f168201915b5050505050905090565b610c2d610eba565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b610c57610eba565b6001600160a01b038116610cbc5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016102c9565b61055881610f13565b610ccd610eba565b6003610cd9828261171a565b5050565b60605f610cea84846117ee565b60ff1667ffffffffffffffff811115610d0557610d0561148e565b604051908082528060200260200182016040528015610d2e578160200160208202803683370190505b50905060ff84165b8360ff16811015610d8957858160058110610d5357610d536115c6565b602002013582610d6660ff881684611807565b81518110610d7657610d766115c6565b6020908102919091010152600101610d36565b50610da460078251610d9b919061181a565b82906007610f62565b95945050505050565b60025460405163169394bb60e01b8152600481018390526001600160a01b039091169063169394bb90602401602060405180830381865afa158015610df4573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e1891906115a7565b15610e655760405162461bcd60e51b815260206004820152601f60248201527f4e756c6c69666965722068617320616c7265616479206265656e20757365640060448201526064016102c9565b600254604051632dea6f9960e11b8152600481018390526001600160a01b0390911690635bd4df32906024015f604051808303815f87803b158015610ea8575f80fd5b505af11580156105ba573d5f803e3d5ffd5b5f546001600160a01b03163314610afa5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016102c9565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60605f80838651610f73919061181a565b67ffffffffffffffff811115610f8b57610f8b61148e565b6040519080825280601f01601f191660200182016040528015610fb5576020820181803683370190505b5090505f805b87518161ffff16101561114f575f888261ffff1681518110610fdf57610fdf6115c6565b602002602001015190505f8767ffffffffffffffff8111156110035761100361148e565b60405190808252806020026020018201604052801561102c578160200160208202803683370190505b5090505f5b888110156110735761104481600861181a565b83901c828281518110611059576110596115c6565b60ff90921660209283029190910190910152600101611031565b505f5b88811015611139575f828281518110611091576110916115c6565b602002602001015160ff169050805f14611106578060f81b8787815181106110bb576110bb6115c6565b60200101906001600160f81b03191690815f1a905350856110db81611831565b96506110ea9050600289611849565b60ff165f03611101576110fe600189611876565b97505b611129565b611111600289611849565b60ff1660010361112957611126600189611876565b97505b5060089290921c91600101611076565b50505080806111479061188f565b915050610fbb565b5060018360ff1610156111f05760405162461bcd60e51b815260206004820152605760248201527f4e6f207061636b656420627974657320666f756e642120496e76616c6964206660448201527f696e616c207374617465206f66207061636b656420627974657320696e20656d60648201527f61696c3b2076616c7565206973206c696b656c79203021000000000000000000608482015260a4016102c9565b8581111561125e5760405162461bcd60e51b815260206004820152603560248201527f5061636b6564206279746573206d6f7265207468616e20616c6c6f776564206d6044820152746178206e756d626572206f66207369676e616c732160581b60648201526084016102c9565b5f61126883611274565b98975050505050505050565b805160609082905f5b82518110156112bd57828181518110611298576112986115c6565b01602001516001600160f81b0319165f036112b5578091506112bd565b60010161127d565b505f8167ffffffffffffffff8111156112d8576112d861148e565b6040519080825280601f01601f191660200182016040528015611302576020820181803683370190505b5090505f5b8281101561135c57838181518110611321576113216115c6565b602001015160f81c60f81b82828151811061133e5761133e6115c6565b60200101906001600160f81b03191690815f1a905350600101611307565b50949350505050565b5f6101a08284031215611376575f80fd5b50919050565b5f6020828403121561138c575f80fd5b5035919050565b806040810183101561051d575f80fd5b5f805f806101a08086880312156113b8575f80fd5b6113c28787611393565b945060c08601878111156113d4575f80fd5b6040870194506113e48882611393565b9350508681870111156113f5575f80fd5b50929591945092610100019150565b5f5b8381101561141e578181015183820152602001611406565b50505f910152565b602081525f8251806020840152611444816040850160208701611404565b601f01601f19169190910160400192915050565b6001600160a01b0381168114610558575f80fd5b5f6020828403121561147c575f80fd5b813561148781611458565b9392505050565b634e487b7160e01b5f52604160045260245ffd5b5f602082840312156114b2575f80fd5b813567ffffffffffffffff808211156114c9575f80fd5b818401915084601f8301126114dc575f80fd5b8135818111156114ee576114ee61148e565b604051601f8201601f19908116603f011681019083821181831017156115165761151661148e565b8160405282815287602084870101111561152e575f80fd5b826020860160208301375f928101602001929092525095945050505050565b805f5b600281101561157057604080838637938401939190910190600101611550565b50505050565b6101a08101604086833761158d604083018661154d565b60408460c084013760a08361010084013795945050505050565b5f602082840312156115b7575f80fd5b81518015158114611487575f80fd5b634e487b7160e01b5f52603260045260245ffd5b600181811c908216806115ee57607f821691505b60208210810361137657634e487b7160e01b5f52602260045260245ffd5b5f808354611619816115da565b60018281168015611631576001811461164657611672565b60ff1984168752821515830287019450611672565b875f526020805f205f5b858110156116695781548a820152908401908201611650565b50505082870194505b50929695505050505050565b5f825161168f818460208701611404565b9190910192915050565b6101a0810160408383376116b3604083016040850161154d565b604060c0840160c084013761010060a0818501828501375092915050565b601f82111561171557805f5260205f20601f840160051c810160208510156116f65750805b601f840160051c820191505b818110156105ba575f8155600101611702565b505050565b815167ffffffffffffffff8111156117345761173461148e565b6117488161174284546115da565b846116d1565b602080601f83116001811461177b575f84156117645750858301515b5f19600386901b1c1916600185901b1785556117d2565b5f85815260208120601f198616915b828110156117a95788860151825594840194600190910190840161178a565b50858210156117c657878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b634e487b7160e01b5f52601160045260245ffd5b60ff828116828216039081111561051d5761051d6117da565b8181038181111561051d5761051d6117da565b808202811582820484141761051d5761051d6117da565b5f60018201611842576118426117da565b5060010190565b5f60ff83168061186757634e487b7160e01b5f52601260045260245ffd5b8060ff84160691505092915050565b60ff818116838216019081111561051d5761051d6117da565b5f61ffff8083168181036118a5576118a56117da565b600101939250505056fea2646970667358221220663fc2aa33edceffa6324dfb75f792137bc3f7aff8dac0b00dd21eed668c580364736f6c63430008180033", + "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/ramps/venmo-v2/VenmoRegistrationProcessorV2.sol:VenmoRegistrationProcessorV2", + "label": "_owner", + "offset": 0, + "slot": "0", + "type": "t_address" + }, + { + "astId": 6068, + "contract": "contracts/ramps/venmo-v2/VenmoRegistrationProcessorV2.sol:VenmoRegistrationProcessorV2", + "label": "mailServerKeyHashAdapter", + "offset": 0, + "slot": "1", + "type": "t_contract(IKeyHashAdapterV2)6431" + }, + { + "astId": 6071, + "contract": "contracts/ramps/venmo-v2/VenmoRegistrationProcessorV2.sol:VenmoRegistrationProcessorV2", + "label": "nullifierRegistry", + "offset": 0, + "slot": "2", + "type": "t_contract(INullifierRegistry)6636" + }, + { + "astId": 6073, + "contract": "contracts/ramps/venmo-v2/VenmoRegistrationProcessorV2.sol:VenmoRegistrationProcessorV2", + "label": "emailFromAddress", + "offset": 0, + "slot": "3", + "type": "t_bytes_storage" + }, + { + "astId": 6075, + "contract": "contracts/ramps/venmo-v2/VenmoRegistrationProcessorV2.sol:VenmoRegistrationProcessorV2", + "label": "timestampBuffer", + "offset": 0, + "slot": "4", + "type": "t_uint256" + } + ], + "types": { + "t_address": { + "encoding": "inplace", + "label": "address", + "numberOfBytes": "20" + }, + "t_bytes_storage": { + "encoding": "bytes", + "label": "bytes", + "numberOfBytes": "32" + }, + "t_contract(IKeyHashAdapterV2)6431": { + "encoding": "inplace", + "label": "contract IKeyHashAdapterV2", + "numberOfBytes": "20" + }, + "t_contract(INullifierRegistry)6636": { + "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/deployments/encifher/VenmoSendProcessor.json b/contracts/deployments/encifher/VenmoSendProcessor.json new file mode 100644 index 000000000..efe865235 --- /dev/null +++ b/contracts/deployments/encifher/VenmoSendProcessor.json @@ -0,0 +1,424 @@ +{ + "address": "0x150890d6984e98f408162eE65684779804bFf858", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_ramp", + "type": "address" + }, + { + "internalType": "contract IKeyHashAdapter", + "name": "_venmoMailserverKeyHashAdapter", + "type": "address" + }, + { + "internalType": "contract INullifierRegistry", + "name": "_nullifierRegistry", + "type": "address" + }, + { + "internalType": "string", + "name": "_emailFromAddress", + "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" + }, + { + "inputs": [], + "name": "PACK_SIZE", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "emailFromAddress", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getEmailFromAddress", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getMailserverKeyHash", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "mailserverKeyHashAdapter", + "outputs": [ + { + "internalType": "contract IKeyHashAdapter", + "name": "", + "type": "address" + } + ], + "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[12]", + "name": "signals", + "type": "uint256[12]" + } + ], + "internalType": "struct ISendProcessor.SendProof", + "name": "_proof", + "type": "tuple" + } + ], + "name": "processProof", + "outputs": [ + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "timestamp", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "offRamperIdHash", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "onRamperIdHash", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "intentHash", + "type": "bytes32" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "ramp", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "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": "contract IKeyHashAdapter", + "name": "_mailserverKeyHashAdapter", + "type": "address" + } + ], + "name": "setMailserverKeyHashAdapter", + "outputs": [], + "stateMutability": "nonpayable", + "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[12]", + "name": "_pubSignals", + "type": "uint256[12]" + } + ], + "name": "verifyProof", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "transactionHash": "0xd5af5adf9f95ee7ccf9d1834b90972eebf97d779ea183de5375839efc39e5045", + "receipt": { + "to": null, + "from": "0xa0Ee7A142d267C1f36714E4a8F75612F20a79720", + "contractAddress": "0x150890d6984e98f408162eE65684779804bFf858", + "transactionIndex": 0, + "gasUsed": "1683047", + "logsBloom": "0x00000000000000000000040000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000001000000000000000008000000000000000000020000000000000000000800000000000000800000000000000000400000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000020000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0x3efb917c857944d91c15eded1c63bd1f68811ae8e2ea5f52f547e32954f84917", + "transactionHash": "0xd5af5adf9f95ee7ccf9d1834b90972eebf97d779ea183de5375839efc39e5045", + "logs": [ + { + "transactionIndex": 0, + "blockNumber": 61359, + "transactionHash": "0xd5af5adf9f95ee7ccf9d1834b90972eebf97d779ea183de5375839efc39e5045", + "address": "0x150890d6984e98f408162eE65684779804bFf858", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x000000000000000000000000a0ee7a142d267c1f36714e4a8f75612f20a79720" + ], + "data": "0x", + "logIndex": 0, + "blockHash": "0x3efb917c857944d91c15eded1c63bd1f68811ae8e2ea5f52f547e32954f84917" + } + ], + "blockNumber": 61359, + "cumulativeGasUsed": "1683047", + "status": 1, + "byzantium": true + }, + "args": [ + "0xe8F76a822B57b973c7a89006092364fFF8f69040", + "0x4e85DC48a70DA1298489d5B6FC2492767d98f384", + "0x4d8E02BBfCf205828A8352Af4376b165E123D7b0", + "venmo@venmo.com" + ], + "numDeployments": 1, + "solcInputHash": "75b8f55da346d7ed99a350632554d2fb", + "metadata": "{\"compiler\":{\"version\":\"0.8.24+commit.e11b9ed9\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_ramp\",\"type\":\"address\"},{\"internalType\":\"contract IKeyHashAdapter\",\"name\":\"_venmoMailserverKeyHashAdapter\",\"type\":\"address\"},{\"internalType\":\"contract INullifierRegistry\",\"name\":\"_nullifierRegistry\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_emailFromAddress\",\"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\"},{\"inputs\":[],\"name\":\"PACK_SIZE\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"emailFromAddress\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getEmailFromAddress\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getMailserverKeyHash\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"mailserverKeyHashAdapter\",\"outputs\":[{\"internalType\":\"contract IKeyHashAdapter\",\"name\":\"\",\"type\":\"address\"}],\"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[12]\",\"name\":\"signals\",\"type\":\"uint256[12]\"}],\"internalType\":\"struct ISendProcessor.SendProof\",\"name\":\"_proof\",\"type\":\"tuple\"}],\"name\":\"processProof\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"offRamperIdHash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"onRamperIdHash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"intentHash\",\"type\":\"bytes32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ramp\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"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\":\"contract IKeyHashAdapter\",\"name\":\"_mailserverKeyHashAdapter\",\"type\":\"address\"}],\"name\":\"setMailserverKeyHashAdapter\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"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[12]\",\"name\":\"_pubSignals\",\"type\":\"uint256[12]\"}],\"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\"}},\"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.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/ramps/venmo-v1/VenmoSendProcessor.sol\":\"VenmoSendProcessor\"},\"evmVersion\":\"shanghai\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"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 v4.4.1 (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\",\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"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/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/processors/BaseProcessor.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\n\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\nimport { IKeyHashAdapter } from \\\"./keyHashAdapters/IKeyHashAdapter.sol\\\";\\nimport { INullifierRegistry } from \\\"./nullifierRegistries/INullifierRegistry.sol\\\";\\n\\npragma solidity ^0.8.18;\\n\\ncontract BaseProcessor is Ownable {\\n\\n /* ============ Modifiers ============ */\\n modifier onlyRamp() {\\n require(msg.sender == ramp, \\\"Only Ramp can call this function\\\");\\n _;\\n }\\n\\n /* ============ State Variables ============ */\\n address public immutable ramp;\\n IKeyHashAdapter public mailserverKeyHashAdapter;\\n INullifierRegistry public nullifierRegistry;\\n bytes public emailFromAddress;\\n\\n /* ============ Constructor ============ */\\n constructor(\\n address _ramp,\\n IKeyHashAdapter _mailserverKeyHashAdapter,\\n INullifierRegistry _nullifierRegistry,\\n string memory _emailFromAddress\\n )\\n Ownable()\\n {\\n ramp = _ramp;\\n mailserverKeyHashAdapter = _mailserverKeyHashAdapter;\\n nullifierRegistry = _nullifierRegistry;\\n emailFromAddress = bytes(_emailFromAddress);\\n }\\n\\n /* ============ External Functions ============ */\\n\\n function setMailserverKeyHashAdapter(IKeyHashAdapter _mailserverKeyHashAdapter) external onlyOwner {\\n mailserverKeyHashAdapter = _mailserverKeyHashAdapter;\\n }\\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 /* ============ External Getters ============ */\\n\\n function getEmailFromAddress() external view returns (bytes memory) {\\n return emailFromAddress;\\n }\\n\\n function getMailserverKeyHash() public view returns (bytes32) {\\n return IKeyHashAdapter(mailserverKeyHashAdapter).mailserverKeyHash();\\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\":\"0xfc86cb8d817fe51078572d31095cf563cec19d8baec590746bfc9183fa361740\",\"license\":\"MIT\"},\"contracts/processors/keyHashAdapters/IKeyHashAdapter.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.18;\\n\\ninterface IKeyHashAdapter {\\n function setMailserverKeyHash(bytes32 _mailserverKeyHash) external;\\n function mailserverKeyHash() external view returns (bytes32);\\n}\\n\",\"keccak256\":\"0xb009a89c52a6e84972852d8c9e60758ca45aca9ac301268fb738459a91090873\",\"license\":\"MIT\"},\"contracts/processors/nullifierRegistries/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/ramps/venmo-v1/VenmoSendProcessor.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\n\\nimport { StringUtils } from \\\"@zk-email/contracts/utils/StringUtils.sol\\\";\\n\\nimport { BaseProcessor } from \\\"../../processors/BaseProcessor.sol\\\";\\nimport { Groth16Verifier } from \\\"../../verifiers/venmo_send_verifier_v1.sol\\\";\\nimport { IKeyHashAdapter } from \\\"../../processors/keyHashAdapters/IKeyHashAdapter.sol\\\";\\nimport { INullifierRegistry } from \\\"../../processors/nullifierRegistries/INullifierRegistry.sol\\\";\\nimport { ISendProcessor } from \\\"./interfaces/ISendProcessor.sol\\\";\\nimport { StringConversionUtils } from \\\"../../lib/StringConversionUtils.sol\\\";\\n\\npragma solidity ^0.8.18;\\n\\ncontract VenmoSendProcessor is Groth16Verifier, ISendProcessor, BaseProcessor {\\n \\n using StringUtils for uint256[];\\n using StringConversionUtils for string;\\n\\n /* ============ Constants ============ */\\n uint256 constant public PACK_SIZE = 7;\\n\\n /* ============ Constructor ============ */\\n constructor(\\n address _ramp,\\n IKeyHashAdapter _venmoMailserverKeyHashAdapter,\\n INullifierRegistry _nullifierRegistry,\\n string memory _emailFromAddress\\n )\\n Groth16Verifier()\\n BaseProcessor(_ramp, _venmoMailserverKeyHashAdapter, _nullifierRegistry, _emailFromAddress)\\n {}\\n \\n /* ============ External Functions ============ */\\n function processProof(\\n ISendProcessor.SendProof calldata _proof\\n )\\n public\\n override\\n onlyRamp\\n returns(uint256 amount, uint256 timestamp, bytes32 offRamperIdHash, bytes32 onRamperIdHash, bytes32 intentHash)\\n {\\n require(this.verifyProof(_proof.a, _proof.b, _proof.c, _proof.signals), \\\"Invalid Proof\\\"); // checks effects iteractions, this should come first\\n\\n require(bytes32(_proof.signals[0]) == getMailserverKeyHash(), \\\"Invalid mailserver key hash\\\");\\n\\n // Signals [1:4] are the packed from email address\\n string memory fromEmail = _parseSignalArray(_proof.signals, 1, 4);\\n require(keccak256(abi.encodePacked(fromEmail)) == keccak256(emailFromAddress), \\\"Invalid email from address\\\");\\n\\n // Signals [4:5] is the packed amount, since this is a USDC amount we want to make sure the returned number is\\n // properly padded to 6 decimals. If the parsed has more than 6 figures to the right of the decimal it will revert\\n amount = _parseSignalArray(_proof.signals, 4, 6).stringToUint(6);\\n\\n // Signals [5:7] are the packed timestamp, we do not expect there to be any decimal places in this number so we\\n // specify 0 decimals, if any decimal appears this function will revert\\n timestamp = _parseSignalArray(_proof.signals, 6, 8).stringToUint(0);\\n\\n // Signals [8] is the packed offRamperIdHash\\n offRamperIdHash = bytes32(_proof.signals[8]);\\n\\n // Signals [9] is the packed onRamperIdHash\\n onRamperIdHash = bytes32(_proof.signals[9]);\\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[10]));\\n\\n // Signals [11] is intentHash\\n intentHash = bytes32(_proof.signals[11]);\\n }\\n\\n /* ============ Internal Functions ============ */\\n\\n function _parseSignalArray(uint256[12] calldata _signals, uint8 _from, uint8 _to) internal pure returns (string memory) {\\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\":\"0xc2b09fbac32fd08e4a183fd9479cea74d83ffab9c90d6f745e2ac621fa20383e\",\"license\":\"MIT\"},\"contracts/ramps/venmo-v1/interfaces/ISendProcessor.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.18;\\n\\ninterface ISendProcessor {\\n\\n struct SendProof {\\n uint256[2] a;\\n uint256[2][2] b;\\n uint256[2] c;\\n uint256[12] signals;\\n }\\n\\n function processProof(\\n SendProof calldata _proof\\n )\\n external\\n returns(uint256, uint256, bytes32, bytes32, bytes32);\\n}\\n\",\"keccak256\":\"0x16811e82d90b1e15eafd8f3de30b6a05a48c906c96e65d263c557c66e9fcedb7\",\"license\":\"MIT\"},\"contracts/verifiers/venmo_send_verifier_v1.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 = 7537613082883539239998105689980695625949864158911233083307240523481447029201;\\n uint256 constant deltax2 = 18425422419094349166845299166446400283955610392693002196033474730898100891393;\\n uint256 constant deltay1 = 9734737963690957740179121580228276788359472364486142941618892845265550985341;\\n uint256 constant deltay2 = 19424219928877642960622596960718531292261548324721236723020030007333427710256;\\n\\n \\n uint256 constant IC0x = 6902718247877772411363845861177050309258223353503700050311359326150519336692;\\n uint256 constant IC0y = 15825279453398516401265572637576445394013091560186110937875220954546679110159;\\n \\n uint256 constant IC1x = 2335804858433576387747825582160359354916267733138827948973385608187184828569;\\n uint256 constant IC1y = 5736008506642285963655345198014496364551739958976504633673791816202163044118;\\n \\n uint256 constant IC2x = 6269455652562704144793722062373279568471767955901279627797463015040136088132;\\n uint256 constant IC2y = 2097530588191744967177200393826023428699458382295316095274264671302200006698;\\n \\n uint256 constant IC3x = 9822862276973085434476438868692851322487547916783049654593145248962644277643;\\n uint256 constant IC3y = 13358026137961492797393341724052128319258593462853360012627607362475815103442;\\n \\n uint256 constant IC4x = 14719148997270446956997289375593821114034084437550001883662517657000734282586;\\n uint256 constant IC4y = 1998224198671702911531451107100115167770885039941574729645701907241412776308;\\n \\n uint256 constant IC5x = 359894349223066781310974365307972581164914770698407647854073977658157147230;\\n uint256 constant IC5y = 4226113369443688791926415338604034925838584747992607214489363181365627308608;\\n \\n uint256 constant IC6x = 8131352830647874407773009521188360590887607801163495436549679220199551501178;\\n uint256 constant IC6y = 2496366191763335194055513493653718797330181861495912467368843578731618007027;\\n \\n uint256 constant IC7x = 5324791436169324680862288927376094103624123876195563861346513574577173643567;\\n uint256 constant IC7y = 10539632294755752334066059856447171990510491871168341570429569842426314117653;\\n \\n uint256 constant IC8x = 21398838651908546916551334433437076903885176753396417385115556979686206468251;\\n uint256 constant IC8y = 2283165388441295638775771203114643615346617529992451266709724264297809953544;\\n \\n uint256 constant IC9x = 16450282086321400334368283708403499847573182040077819178856321188442820130414;\\n uint256 constant IC9y = 20227982940527385555692156484806747209260038014579804010296344969319860246613;\\n \\n uint256 constant IC10x = 1416849092724586759478061558363222409117668509275228664731118821895695167480;\\n uint256 constant IC10y = 14279591006307641048883156401797861581231631415414897920853119376578010808716;\\n \\n uint256 constant IC11x = 10972046352748637769234591589921324542843146653569482848432798172628944437256;\\n uint256 constant IC11y = 13951850916181885013998871924877530212665252857591601803360542322172843954667;\\n \\n uint256 constant IC12x = 10475342243781351585273160940612655577727791739250775206756870040352542452664;\\n uint256 constant IC12y = 5139068014462344879213636708300130277178459139177464895691208627008733872682;\\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[12] calldata _pubSignals) public view returns (bool) {\\n assembly {\\n function checkField(v) {\\n if iszero(lt(v, q)) {\\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 g1_mulAccC(_pVk, IC11x, IC11y, calldataload(add(pubSignals, 320)))\\n \\n g1_mulAccC(_pVk, IC12x, IC12y, calldataload(add(pubSignals, 352)))\\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 checkField(calldataload(add(_pubSignals, 352)))\\n \\n checkField(calldataload(add(_pubSignals, 384)))\\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\":\"0xb46605787554cd622d1fc6100e5097902ec0c4c57b787d48ef3a27e2b1e1beb7\",\"license\":\"GPL-3.0\"}},\"version\":1}", + "bytecode": "0x60a060405234801562000010575f80fd5b50604051620021b1380380620021b183398101604081905262000033916200010f565b83838383620000423362000094565b6001600160a01b03848116608052600180546001600160a01b031990811686841617909155600280549091169184169190911790556003620000858282620002a7565b50505050505050505062000373565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b0381168114620000f8575f80fd5b50565b634e487b7160e01b5f52604160045260245ffd5b5f805f806080858703121562000123575f80fd5b84516200013081620000e3565b809450506020808601516200014581620000e3565b60408701519094506200015881620000e3565b60608701519093506001600160401b038082111562000175575f80fd5b818801915088601f83011262000189575f80fd5b8151818111156200019e576200019e620000fb565b604051601f8201601f19908116603f01168101908382118183101715620001c957620001c9620000fb565b816040528281528b86848701011115620001e1575f80fd5b5f93505b82841015620002045784840186015181850187015292850192620001e5565b5f86848301015280965050505050505092959194509250565b600181811c908216806200023257607f821691505b6020821081036200025157634e487b7160e01b5f52602260045260245ffd5b50919050565b601f821115620002a257805f5260205f20601f840160051c810160208510156200027e5750805b601f840160051c820191505b818110156200029f575f81556001016200028a565b50505b505050565b81516001600160401b03811115620002c357620002c3620000fb565b620002db81620002d484546200021d565b8462000257565b602080601f83116001811462000311575f8415620002f95750858301515b5f19600386901b1c1916600185901b1785556200036b565b5f85815260208120601f198616915b82811015620003415788860151825594840194600190910190840162000320565b50858210156200035f57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b608051611e1f620003925f395f818160ee0152610abc0152611e1f5ff3fe608060405234801561000f575f80fd5b50600436106100e5575f3560e01c8063a87cb6ea11610088578063ced1e97811610063578063ced1e978146101fe578063d0b71f9914610206578063f2fde38b14610219578063f6c7226b1461022c575f80fd5b8063a87cb6ea146101ce578063b870676c146101d6578063c0d05fed146101e9575f80fd5b8063715018a6116100c3578063715018a6146101565780638cbac0fa146101605780638da5cb5b146101835780638fe0ab8e14610193575f80fd5b806315d276e1146100e95780633d0c9cc41461012d578063672ae59714610143575b5f80fd5b6101107f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020015b60405180910390f35b610135600781565b604051908152602001610124565b600154610110906001600160a01b031681565b61015e61023f565b005b61017361016e3660046117f7565b610252565b6040519015158152602001610124565b5f546001600160a01b0316610110565b6101a66101a1366004611858565b610aac565b604080519586526020860194909452928401919091526060830152608082015260a001610124565b610135610d3c565b600254610110906001600160a01b031681565b6101f1610dac565b6040516101249190611891565b6101f1610e38565b61015e6102143660046118d7565b610ec8565b61015e6102273660046118d7565b610ef2565b61015e61023a36600461190d565b610f68565b610247610f80565b6102505f610fd9565b565b5f6109dd565b7f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd478110610287575f805260205ff35b50565b5f60405183815284602082015285604082015260408160608360076107d05a03fa9150816102ba575f805260205ff35b825160408201526020830151606082015260408360808360066107d05a03fa915050806102e9575f805260205ff35b5050505050565b7f0f42ccd1d09da2e97c7da52e3141035e6b7e29969488d781cc5907e911f2aef485527f22fcca6ed9538287a5d63ddd6213998aca52d06bd1a9ea2ba0000e6c0abcda0f60208601525f608086018661038c87357f0cae773c551389c4b3748876eb879fd5a22df84214423ccdffcb6b2580d7bf167f052a04c97a2182b6a1b2907b2cc1e38ec3a31f802548459a134bac0d763650998461028a565b6103dc60208801357f04a3290596fa6594ac4116f78951e6613a335fb4a55575fccc749f7e0047182a7f0ddc62daadf2242f06ed2fc536f6506d2c9c2b8aca41cef637e48643f42d8a448461028a565b61042c60408801357f1d885ff71ea4bb465c1156808c77dc42b4109067a9817e25c049b7e286486bd27f15b78b03c0442b3c971ab6085dc2d971895a91484fad7490112b418f5acbf98b8461028a565b61047c60608801357f046af46ee1b42873cef47bef79ee3b6c3a3858b963b830a1392b74980842d1747f208abe3bef839194b75dfce6f70774a09f0159d6b6ee8d9c4a3fb56dbbbad35a8461028a565b6104cb60808801357f0957e53908d052485184ec6ce32d3f28b35b4098c84faa43193147c67605ca407ecbb167565d1fc4ff126056f6ad5ae6d7ee36240d58724adace5b93d8bda45e8461028a565b61051b60a08801357f0584e4a8541cf7270af7b54ca5b9b7d6356113d303ceb57742bd1ef633ca77f37f11fa2ebf5417b4549c753e84aca2920f9bb5f0cc20653ee4c4dc9fcba77d837a8461028a565b61056b60c08801357f174d3871564045120f8d87478d04f57d15ff67945f107417d75dd7d98e3a52157f0bc5b9a3762ffbc89579ac3efa6366f610946639a924884c149d6b882663412f8461028a565b6105bb60e08801357f050c39cf04b7e31780a9530e8c37cf035af9bb0771f9b97b043b5da06fa9c3087f2f4f503f73c7e882f95d7c60d6a1d949fc692d10f7e7d1a46848955b38fdf09b8461028a565b61060c6101008801357f2cb8a1f363d9ee404ae54ea0e20f3f914a407fe0515415dba540fe52e28d98557f245e879af3861119e5c5b2a274fa09fd79254dab1c167d927f206c0e3ce1366e8461028a565b61065d6101208801357f1f91f64be622f47fa11f93a86381c5361fbb73a73bbfc92d24ecaf865f0a018c7f0321e87db17c101496865d1841aef0981b235e079c4cc0e6b292ead4b9feeff88461028a565b6106ae6101408801357f1ed877c0515893c450a07970e36b669ade589147607ebb95e648eb8417ae91eb7f1841f54a2c24330cf3d50547868a8ad41209f45b33e9286b40386214e66c40088461028a565b6106ff6101608801357f0b5c9c02e164fd7e26208c6fcd1024f172411845c45b76543488da69d66e822a7f1728d566cfd864539960fb0e369fdcd413176050d48e4f32cdf89fc4789c6bb88461028a565b50823581527f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4760208401357f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4703066020820152833560408201526020840135606082015260408401356080820152606084013560a08201527f2d4d9aa7e302d9df41749d5507949d05dbea33fbb16c643b22f599a2be6df2e260c08201527f14bedd503c37ceb061d8ec60209fe345ce89830a19230301f076caff004d192660e08201527f0967032fcbf776d1afc985f88877f182d38480a653f2decaa9794cbc3bf3060c6101008201527f0e187847ad4c798374d0d6732bf501847dd68bc0e071241e0213bc7fc13db7ab6101208201527f304cfbd1e08a704a99f5e847d93f8c3caafddec46b7a0d379da69a4d112346a76101408201527f1739c1b1a457a8c7313123d24d2f9192f896b7c63eea05a9d57f06547ad0cec86101608201525f87015161018082015260205f018701516101a08201527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c26101c08201527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed6101e08201527f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b6102008201527f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa610220820152843561024082015260208501356102608201527f10aa234815d8947d72c1a64fbb4e78aac6858af89d49f9070f9039968b9659d16102808201527f28bc6b65a8c0751bd05adbaba004ec5da668ca9c05371b02540d2954e198af016102a08201527f1585aa9b4d728104ede3ab504f56e6e0ed2b4b0fe8e026f431e2b8720416487d6102c08201527f2af1b8085331fb26d7218460fc6aa847165175389ebef6e6c4713d2a674d89306102e08201526020816103008360086107d05a03fa9051169695505050505050565b60405161038081016040526109f45f840135610258565b610a016020840135610258565b610a0e6040840135610258565b610a1b6060840135610258565b610a286080840135610258565b610a3560a0840135610258565b610a4260c0840135610258565b610a4f60e0840135610258565b610a5d610100840135610258565b610a6b610120840135610258565b610a79610140840135610258565b610a87610160840135610258565b610a95610180840135610258565b610aa2818486888a6102f0565b9050805f5260205ff35b5f80808080336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610b2e5760405162461bcd60e51b815260206004820181905260248201527f4f6e6c792052616d702063616e2063616c6c20746869732066756e6374696f6e60448201526064015b60405180910390fd5b6040805163465d607d60e11b81523091638cbac0fa91610b61918a919082019060c08301906101008401906004016119b8565b602060405180830381865afa158015610b7c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ba09190611a04565b610bdc5760405162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b210283937b7b360991b6044820152606401610b25565b610be4610d3c565b61010087013514610c375760405162461bcd60e51b815260206004820152601b60248201527f496e76616c6964206d61696c736572766572206b6579206861736800000000006044820152606401610b25565b5f610c49876101000160016004611028565b90506003604051610c5a9190611a69565b604051809103902081604051602001610c739190611adb565b6040516020818303038152906040528051906020012014610cd65760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420656d61696c2066726f6d20616464726573730000000000006044820152606401610b25565b610cf26006610cec896101000160046006611028565b906110f8565b9550610d095f610cec896101000160066008611028565b945061020087013593506102208701359250610d29610240880135611111565b5093959294919350916102609091013590565b60015460408051630d901b9960e21b815290515f926001600160a01b0316916336406e649160048083019260209291908290030181865afa158015610d83573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610da79190611af6565b905090565b60038054610db990611a37565b80601f0160208091040260200160405190810160405280929190818152602001828054610de590611a37565b8015610e305780601f10610e0757610100808354040283529160200191610e30565b820191905f5260205f20905b815481529060010190602001808311610e1357829003601f168201915b505050505081565b606060038054610e4790611a37565b80601f0160208091040260200160405190810160405280929190818152602001828054610e7390611a37565b8015610ebe5780601f10610e9557610100808354040283529160200191610ebe565b820191905f5260205f20905b815481529060010190602001808311610ea157829003601f168201915b5050505050905090565b610ed0610f80565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b610efa610f80565b6001600160a01b038116610f5f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b25565b61028781610fd9565b610f70610f80565b6003610f7c8282611b56565b5050565b5f546001600160a01b031633146102505760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b25565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60605f6110358484611c2a565b60ff1667ffffffffffffffff811115611050576110506118f9565b604051908082528060200260200182016040528015611079578160200160208202803683370190505b50905060ff84165b8360ff168110156110d4578581600c811061109e5761109e611a23565b6020020135826110b160ff881684611c43565b815181106110c1576110c1611a23565b6020908102919091010152600101611081565b506110ef600782516110e69190611c56565b8290600761121e565b95945050505050565b5f61110883601760f91b84611530565b90505b92915050565b60025460405163169394bb60e01b8152600481018390526001600160a01b039091169063169394bb90602401602060405180830381865afa158015611158573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061117c9190611a04565b156111c95760405162461bcd60e51b815260206004820152601f60248201527f4e756c6c69666965722068617320616c7265616479206265656e2075736564006044820152606401610b25565b600254604051632dea6f9960e11b8152600481018390526001600160a01b0390911690635bd4df32906024015f604051808303815f87803b15801561120c575f80fd5b505af11580156102e9573d5f803e3d5ffd5b60605f8083865161122f9190611c56565b67ffffffffffffffff811115611247576112476118f9565b6040519080825280601f01601f191660200182016040528015611271576020820181803683370190505b5090505f805b87518161ffff16101561140b575f888261ffff168151811061129b5761129b611a23565b602002602001015190505f8767ffffffffffffffff8111156112bf576112bf6118f9565b6040519080825280602002602001820160405280156112e8578160200160208202803683370190505b5090505f5b8881101561132f57611300816008611c56565b83901c82828151811061131557611315611a23565b60ff909216602092830291909101909101526001016112ed565b505f5b888110156113f5575f82828151811061134d5761134d611a23565b602002602001015160ff169050805f146113c2578060f81b87878151811061137757611377611a23565b60200101906001600160f81b03191690815f1a9053508561139781611c6d565b96506113a69050600289611c85565b60ff165f036113bd576113ba600189611cb2565b97505b6113e5565b6113cd600289611c85565b60ff166001036113e5576113e2600189611cb2565b97505b5060089290921c91600101611332565b505050808061140390611ccb565b915050611277565b5060018360ff1610156114ac5760405162461bcd60e51b815260206004820152605760248201527f4e6f207061636b656420627974657320666f756e642120496e76616c6964206660448201527f696e616c207374617465206f66207061636b656420627974657320696e20656d60648201527f61696c3b2076616c7565206973206c696b656c79203021000000000000000000608482015260a401610b25565b8581111561151a5760405162461bcd60e51b815260206004820152603560248201527f5061636b6564206279746573206d6f7265207468616e20616c6c6f776564206d6044820152746178206e756d626572206f66207369676e616c732160581b6064820152608401610b25565b5f611524836116f6565b98975050505050505050565b5f83818080805b845181101561167b57603060f81b85828151811061155757611557611a23565b01602001516001600160f81b031916108015906115985750603960f81b85828151811061158657611586611a23565b01602001516001600160f81b03191611155b156115db5760308582815181106115b1576115b1611a23565b01602001516115c3919060f81c611c43565b6115ce85600a611c56565b6115d89190611ceb565b93505b81156115ef57826115eb81611c6d565b9350505b876001600160f81b03191685828151811061160c5761160c611a23565b01602001516001600160f81b0319160361167357811561166e5760405162461bcd60e51b815260206004820152601c60248201527f537472696e6720686173206d756c7469706c6520646563696d616c73000000006044820152606401610b25565b600191505b600101611537565b50858211156116d75760405162461bcd60e51b815260206004820152602260248201527f537472696e672068617320746f6f206d616e7920646563696d616c20706c6163604482015261657360f01b6064820152608401610b25565b6116e18287611c43565b6116ec90600a611dde565b6115249084611c56565b805160609082905f5b825181101561173f5782818151811061171a5761171a611a23565b01602001516001600160f81b0319165f036117375780915061173f565b6001016116ff565b505f8167ffffffffffffffff81111561175a5761175a6118f9565b6040519080825280601f01601f191660200182016040528015611784576020820181803683370190505b5090505f5b828110156117de578381815181106117a3576117a3611a23565b602001015160f81c60f81b8282815181106117c0576117c0611a23565b60200101906001600160f81b03191690815f1a905350600101611789565b50949350505050565b806040810183101561110b575f80fd5b5f805f8061028080868803121561180c575f80fd5b61181687876117e7565b945060c0860187811115611828575f80fd5b60408701945061183888826117e7565b935050868187011115611849575f80fd5b50929591945092610100019150565b5f6102808284031215611869575f80fd5b50919050565b5f5b83811015611889578181015183820152602001611871565b50505f910152565b602081525f82518060208401526118af81604085016020870161186f565b601f01601f19169190910160400192915050565b6001600160a01b0381168114610287575f80fd5b5f602082840312156118e7575f80fd5b81356118f2816118c3565b9392505050565b634e487b7160e01b5f52604160045260245ffd5b5f6020828403121561191d575f80fd5b813567ffffffffffffffff80821115611934575f80fd5b818401915084601f830112611947575f80fd5b813581811115611959576119596118f9565b604051601f8201601f19908116603f01168101908382118183101715611981576119816118f9565b81604052828152876020848701011115611999575f80fd5b826020860160208301375f928101602001929092525095945050505050565b6102808101604080878437808301865f5b60028110156119e6578382843791830191908301906001016119c9565b505050808560c0850137506101808361010084013795945050505050565b5f60208284031215611a14575f80fd5b815180151581146118f2575f80fd5b634e487b7160e01b5f52603260045260245ffd5b600181811c90821680611a4b57607f821691505b60208210810361186957634e487b7160e01b5f52602260045260245ffd5b5f808354611a7681611a37565b60018281168015611a8e5760018114611aa357611acf565b60ff1984168752821515830287019450611acf565b875f526020805f205f5b85811015611ac65781548a820152908401908201611aad565b50505082870194505b50929695505050505050565b5f8251611aec81846020870161186f565b9190910192915050565b5f60208284031215611b06575f80fd5b5051919050565b601f821115611b5157805f5260205f20601f840160051c81016020851015611b325750805b601f840160051c820191505b818110156102e9575f8155600101611b3e565b505050565b815167ffffffffffffffff811115611b7057611b706118f9565b611b8481611b7e8454611a37565b84611b0d565b602080601f831160018114611bb7575f8415611ba05750858301515b5f19600386901b1c1916600185901b178555611c0e565b5f85815260208120601f198616915b82811015611be557888601518255948401946001909101908401611bc6565b5085821015611c0257878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b634e487b7160e01b5f52601160045260245ffd5b60ff828116828216039081111561110b5761110b611c16565b8181038181111561110b5761110b611c16565b808202811582820484141761110b5761110b611c16565b5f60018201611c7e57611c7e611c16565b5060010190565b5f60ff831680611ca357634e487b7160e01b5f52601260045260245ffd5b8060ff84160691505092915050565b60ff818116838216019081111561110b5761110b611c16565b5f61ffff808316818103611ce157611ce1611c16565b6001019392505050565b8082018082111561110b5761110b611c16565b600181815b80851115611d3857815f1904821115611d1e57611d1e611c16565b80851615611d2b57918102915b93841c9390800290611d03565b509250929050565b5f82611d4e5750600161110b565b81611d5a57505f61110b565b8160018114611d705760028114611d7a57611d96565b600191505061110b565b60ff841115611d8b57611d8b611c16565b50506001821b61110b565b5060208310610133831016604e8410600b8410161715611db9575081810a61110b565b611dc38383611cfe565b805f1904821115611dd657611dd6611c16565b029392505050565b5f6111088383611d4056fea2646970667358221220cd1a903d31427c3e4a34899fc612e208951c507b39cfb3fbe71ea7c3433dc86f64736f6c63430008180033", + "deployedBytecode": "0x608060405234801561000f575f80fd5b50600436106100e5575f3560e01c8063a87cb6ea11610088578063ced1e97811610063578063ced1e978146101fe578063d0b71f9914610206578063f2fde38b14610219578063f6c7226b1461022c575f80fd5b8063a87cb6ea146101ce578063b870676c146101d6578063c0d05fed146101e9575f80fd5b8063715018a6116100c3578063715018a6146101565780638cbac0fa146101605780638da5cb5b146101835780638fe0ab8e14610193575f80fd5b806315d276e1146100e95780633d0c9cc41461012d578063672ae59714610143575b5f80fd5b6101107f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020015b60405180910390f35b610135600781565b604051908152602001610124565b600154610110906001600160a01b031681565b61015e61023f565b005b61017361016e3660046117f7565b610252565b6040519015158152602001610124565b5f546001600160a01b0316610110565b6101a66101a1366004611858565b610aac565b604080519586526020860194909452928401919091526060830152608082015260a001610124565b610135610d3c565b600254610110906001600160a01b031681565b6101f1610dac565b6040516101249190611891565b6101f1610e38565b61015e6102143660046118d7565b610ec8565b61015e6102273660046118d7565b610ef2565b61015e61023a36600461190d565b610f68565b610247610f80565b6102505f610fd9565b565b5f6109dd565b7f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd478110610287575f805260205ff35b50565b5f60405183815284602082015285604082015260408160608360076107d05a03fa9150816102ba575f805260205ff35b825160408201526020830151606082015260408360808360066107d05a03fa915050806102e9575f805260205ff35b5050505050565b7f0f42ccd1d09da2e97c7da52e3141035e6b7e29969488d781cc5907e911f2aef485527f22fcca6ed9538287a5d63ddd6213998aca52d06bd1a9ea2ba0000e6c0abcda0f60208601525f608086018661038c87357f0cae773c551389c4b3748876eb879fd5a22df84214423ccdffcb6b2580d7bf167f052a04c97a2182b6a1b2907b2cc1e38ec3a31f802548459a134bac0d763650998461028a565b6103dc60208801357f04a3290596fa6594ac4116f78951e6613a335fb4a55575fccc749f7e0047182a7f0ddc62daadf2242f06ed2fc536f6506d2c9c2b8aca41cef637e48643f42d8a448461028a565b61042c60408801357f1d885ff71ea4bb465c1156808c77dc42b4109067a9817e25c049b7e286486bd27f15b78b03c0442b3c971ab6085dc2d971895a91484fad7490112b418f5acbf98b8461028a565b61047c60608801357f046af46ee1b42873cef47bef79ee3b6c3a3858b963b830a1392b74980842d1747f208abe3bef839194b75dfce6f70774a09f0159d6b6ee8d9c4a3fb56dbbbad35a8461028a565b6104cb60808801357f0957e53908d052485184ec6ce32d3f28b35b4098c84faa43193147c67605ca407ecbb167565d1fc4ff126056f6ad5ae6d7ee36240d58724adace5b93d8bda45e8461028a565b61051b60a08801357f0584e4a8541cf7270af7b54ca5b9b7d6356113d303ceb57742bd1ef633ca77f37f11fa2ebf5417b4549c753e84aca2920f9bb5f0cc20653ee4c4dc9fcba77d837a8461028a565b61056b60c08801357f174d3871564045120f8d87478d04f57d15ff67945f107417d75dd7d98e3a52157f0bc5b9a3762ffbc89579ac3efa6366f610946639a924884c149d6b882663412f8461028a565b6105bb60e08801357f050c39cf04b7e31780a9530e8c37cf035af9bb0771f9b97b043b5da06fa9c3087f2f4f503f73c7e882f95d7c60d6a1d949fc692d10f7e7d1a46848955b38fdf09b8461028a565b61060c6101008801357f2cb8a1f363d9ee404ae54ea0e20f3f914a407fe0515415dba540fe52e28d98557f245e879af3861119e5c5b2a274fa09fd79254dab1c167d927f206c0e3ce1366e8461028a565b61065d6101208801357f1f91f64be622f47fa11f93a86381c5361fbb73a73bbfc92d24ecaf865f0a018c7f0321e87db17c101496865d1841aef0981b235e079c4cc0e6b292ead4b9feeff88461028a565b6106ae6101408801357f1ed877c0515893c450a07970e36b669ade589147607ebb95e648eb8417ae91eb7f1841f54a2c24330cf3d50547868a8ad41209f45b33e9286b40386214e66c40088461028a565b6106ff6101608801357f0b5c9c02e164fd7e26208c6fcd1024f172411845c45b76543488da69d66e822a7f1728d566cfd864539960fb0e369fdcd413176050d48e4f32cdf89fc4789c6bb88461028a565b50823581527f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4760208401357f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4703066020820152833560408201526020840135606082015260408401356080820152606084013560a08201527f2d4d9aa7e302d9df41749d5507949d05dbea33fbb16c643b22f599a2be6df2e260c08201527f14bedd503c37ceb061d8ec60209fe345ce89830a19230301f076caff004d192660e08201527f0967032fcbf776d1afc985f88877f182d38480a653f2decaa9794cbc3bf3060c6101008201527f0e187847ad4c798374d0d6732bf501847dd68bc0e071241e0213bc7fc13db7ab6101208201527f304cfbd1e08a704a99f5e847d93f8c3caafddec46b7a0d379da69a4d112346a76101408201527f1739c1b1a457a8c7313123d24d2f9192f896b7c63eea05a9d57f06547ad0cec86101608201525f87015161018082015260205f018701516101a08201527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c26101c08201527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed6101e08201527f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b6102008201527f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa610220820152843561024082015260208501356102608201527f10aa234815d8947d72c1a64fbb4e78aac6858af89d49f9070f9039968b9659d16102808201527f28bc6b65a8c0751bd05adbaba004ec5da668ca9c05371b02540d2954e198af016102a08201527f1585aa9b4d728104ede3ab504f56e6e0ed2b4b0fe8e026f431e2b8720416487d6102c08201527f2af1b8085331fb26d7218460fc6aa847165175389ebef6e6c4713d2a674d89306102e08201526020816103008360086107d05a03fa9051169695505050505050565b60405161038081016040526109f45f840135610258565b610a016020840135610258565b610a0e6040840135610258565b610a1b6060840135610258565b610a286080840135610258565b610a3560a0840135610258565b610a4260c0840135610258565b610a4f60e0840135610258565b610a5d610100840135610258565b610a6b610120840135610258565b610a79610140840135610258565b610a87610160840135610258565b610a95610180840135610258565b610aa2818486888a6102f0565b9050805f5260205ff35b5f80808080336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610b2e5760405162461bcd60e51b815260206004820181905260248201527f4f6e6c792052616d702063616e2063616c6c20746869732066756e6374696f6e60448201526064015b60405180910390fd5b6040805163465d607d60e11b81523091638cbac0fa91610b61918a919082019060c08301906101008401906004016119b8565b602060405180830381865afa158015610b7c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ba09190611a04565b610bdc5760405162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b210283937b7b360991b6044820152606401610b25565b610be4610d3c565b61010087013514610c375760405162461bcd60e51b815260206004820152601b60248201527f496e76616c6964206d61696c736572766572206b6579206861736800000000006044820152606401610b25565b5f610c49876101000160016004611028565b90506003604051610c5a9190611a69565b604051809103902081604051602001610c739190611adb565b6040516020818303038152906040528051906020012014610cd65760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420656d61696c2066726f6d20616464726573730000000000006044820152606401610b25565b610cf26006610cec896101000160046006611028565b906110f8565b9550610d095f610cec896101000160066008611028565b945061020087013593506102208701359250610d29610240880135611111565b5093959294919350916102609091013590565b60015460408051630d901b9960e21b815290515f926001600160a01b0316916336406e649160048083019260209291908290030181865afa158015610d83573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610da79190611af6565b905090565b60038054610db990611a37565b80601f0160208091040260200160405190810160405280929190818152602001828054610de590611a37565b8015610e305780601f10610e0757610100808354040283529160200191610e30565b820191905f5260205f20905b815481529060010190602001808311610e1357829003601f168201915b505050505081565b606060038054610e4790611a37565b80601f0160208091040260200160405190810160405280929190818152602001828054610e7390611a37565b8015610ebe5780601f10610e9557610100808354040283529160200191610ebe565b820191905f5260205f20905b815481529060010190602001808311610ea157829003601f168201915b5050505050905090565b610ed0610f80565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b610efa610f80565b6001600160a01b038116610f5f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b25565b61028781610fd9565b610f70610f80565b6003610f7c8282611b56565b5050565b5f546001600160a01b031633146102505760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b25565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60605f6110358484611c2a565b60ff1667ffffffffffffffff811115611050576110506118f9565b604051908082528060200260200182016040528015611079578160200160208202803683370190505b50905060ff84165b8360ff168110156110d4578581600c811061109e5761109e611a23565b6020020135826110b160ff881684611c43565b815181106110c1576110c1611a23565b6020908102919091010152600101611081565b506110ef600782516110e69190611c56565b8290600761121e565b95945050505050565b5f61110883601760f91b84611530565b90505b92915050565b60025460405163169394bb60e01b8152600481018390526001600160a01b039091169063169394bb90602401602060405180830381865afa158015611158573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061117c9190611a04565b156111c95760405162461bcd60e51b815260206004820152601f60248201527f4e756c6c69666965722068617320616c7265616479206265656e2075736564006044820152606401610b25565b600254604051632dea6f9960e11b8152600481018390526001600160a01b0390911690635bd4df32906024015f604051808303815f87803b15801561120c575f80fd5b505af11580156102e9573d5f803e3d5ffd5b60605f8083865161122f9190611c56565b67ffffffffffffffff811115611247576112476118f9565b6040519080825280601f01601f191660200182016040528015611271576020820181803683370190505b5090505f805b87518161ffff16101561140b575f888261ffff168151811061129b5761129b611a23565b602002602001015190505f8767ffffffffffffffff8111156112bf576112bf6118f9565b6040519080825280602002602001820160405280156112e8578160200160208202803683370190505b5090505f5b8881101561132f57611300816008611c56565b83901c82828151811061131557611315611a23565b60ff909216602092830291909101909101526001016112ed565b505f5b888110156113f5575f82828151811061134d5761134d611a23565b602002602001015160ff169050805f146113c2578060f81b87878151811061137757611377611a23565b60200101906001600160f81b03191690815f1a9053508561139781611c6d565b96506113a69050600289611c85565b60ff165f036113bd576113ba600189611cb2565b97505b6113e5565b6113cd600289611c85565b60ff166001036113e5576113e2600189611cb2565b97505b5060089290921c91600101611332565b505050808061140390611ccb565b915050611277565b5060018360ff1610156114ac5760405162461bcd60e51b815260206004820152605760248201527f4e6f207061636b656420627974657320666f756e642120496e76616c6964206660448201527f696e616c207374617465206f66207061636b656420627974657320696e20656d60648201527f61696c3b2076616c7565206973206c696b656c79203021000000000000000000608482015260a401610b25565b8581111561151a5760405162461bcd60e51b815260206004820152603560248201527f5061636b6564206279746573206d6f7265207468616e20616c6c6f776564206d6044820152746178206e756d626572206f66207369676e616c732160581b6064820152608401610b25565b5f611524836116f6565b98975050505050505050565b5f83818080805b845181101561167b57603060f81b85828151811061155757611557611a23565b01602001516001600160f81b031916108015906115985750603960f81b85828151811061158657611586611a23565b01602001516001600160f81b03191611155b156115db5760308582815181106115b1576115b1611a23565b01602001516115c3919060f81c611c43565b6115ce85600a611c56565b6115d89190611ceb565b93505b81156115ef57826115eb81611c6d565b9350505b876001600160f81b03191685828151811061160c5761160c611a23565b01602001516001600160f81b0319160361167357811561166e5760405162461bcd60e51b815260206004820152601c60248201527f537472696e6720686173206d756c7469706c6520646563696d616c73000000006044820152606401610b25565b600191505b600101611537565b50858211156116d75760405162461bcd60e51b815260206004820152602260248201527f537472696e672068617320746f6f206d616e7920646563696d616c20706c6163604482015261657360f01b6064820152608401610b25565b6116e18287611c43565b6116ec90600a611dde565b6115249084611c56565b805160609082905f5b825181101561173f5782818151811061171a5761171a611a23565b01602001516001600160f81b0319165f036117375780915061173f565b6001016116ff565b505f8167ffffffffffffffff81111561175a5761175a6118f9565b6040519080825280601f01601f191660200182016040528015611784576020820181803683370190505b5090505f5b828110156117de578381815181106117a3576117a3611a23565b602001015160f81c60f81b8282815181106117c0576117c0611a23565b60200101906001600160f81b03191690815f1a905350600101611789565b50949350505050565b806040810183101561110b575f80fd5b5f805f8061028080868803121561180c575f80fd5b61181687876117e7565b945060c0860187811115611828575f80fd5b60408701945061183888826117e7565b935050868187011115611849575f80fd5b50929591945092610100019150565b5f6102808284031215611869575f80fd5b50919050565b5f5b83811015611889578181015183820152602001611871565b50505f910152565b602081525f82518060208401526118af81604085016020870161186f565b601f01601f19169190910160400192915050565b6001600160a01b0381168114610287575f80fd5b5f602082840312156118e7575f80fd5b81356118f2816118c3565b9392505050565b634e487b7160e01b5f52604160045260245ffd5b5f6020828403121561191d575f80fd5b813567ffffffffffffffff80821115611934575f80fd5b818401915084601f830112611947575f80fd5b813581811115611959576119596118f9565b604051601f8201601f19908116603f01168101908382118183101715611981576119816118f9565b81604052828152876020848701011115611999575f80fd5b826020860160208301375f928101602001929092525095945050505050565b6102808101604080878437808301865f5b60028110156119e6578382843791830191908301906001016119c9565b505050808560c0850137506101808361010084013795945050505050565b5f60208284031215611a14575f80fd5b815180151581146118f2575f80fd5b634e487b7160e01b5f52603260045260245ffd5b600181811c90821680611a4b57607f821691505b60208210810361186957634e487b7160e01b5f52602260045260245ffd5b5f808354611a7681611a37565b60018281168015611a8e5760018114611aa357611acf565b60ff1984168752821515830287019450611acf565b875f526020805f205f5b85811015611ac65781548a820152908401908201611aad565b50505082870194505b50929695505050505050565b5f8251611aec81846020870161186f565b9190910192915050565b5f60208284031215611b06575f80fd5b5051919050565b601f821115611b5157805f5260205f20601f840160051c81016020851015611b325750805b601f840160051c820191505b818110156102e9575f8155600101611b3e565b505050565b815167ffffffffffffffff811115611b7057611b706118f9565b611b8481611b7e8454611a37565b84611b0d565b602080601f831160018114611bb7575f8415611ba05750858301515b5f19600386901b1c1916600185901b178555611c0e565b5f85815260208120601f198616915b82811015611be557888601518255948401946001909101908401611bc6565b5085821015611c0257878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b634e487b7160e01b5f52601160045260245ffd5b60ff828116828216039081111561110b5761110b611c16565b8181038181111561110b5761110b611c16565b808202811582820484141761110b5761110b611c16565b5f60018201611c7e57611c7e611c16565b5060010190565b5f60ff831680611ca357634e487b7160e01b5f52601260045260245ffd5b8060ff84160691505092915050565b60ff818116838216019081111561110b5761110b611c16565b5f61ffff808316818103611ce157611ce1611c16565b6001019392505050565b8082018082111561110b5761110b611c16565b600181815b80851115611d3857815f1904821115611d1e57611d1e611c16565b80851615611d2b57918102915b93841c9390800290611d03565b509250929050565b5f82611d4e5750600161110b565b81611d5a57505f61110b565b8160018114611d705760028114611d7a57611d96565b600191505061110b565b60ff841115611d8b57611d8b611c16565b50506001821b61110b565b5060208310610133831016604e8410600b8410161715611db9575081810a61110b565b611dc38383611cfe565b805f1904821115611dd657611dd6611c16565b029392505050565b5f6111088383611d4056fea2646970667358221220cd1a903d31427c3e4a34899fc612e208951c507b39cfb3fbe71ea7c3433dc86f64736f6c63430008180033", + "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" + } + }, + "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." + } + }, + "version": 1 + }, + "storageLayout": { + "storage": [ + { + "astId": 7, + "contract": "contracts/ramps/venmo-v1/VenmoSendProcessor.sol:VenmoSendProcessor", + "label": "_owner", + "offset": 0, + "slot": "0", + "type": "t_address" + }, + { + "astId": 5930, + "contract": "contracts/ramps/venmo-v1/VenmoSendProcessor.sol:VenmoSendProcessor", + "label": "mailserverKeyHashAdapter", + "offset": 0, + "slot": "1", + "type": "t_contract(IKeyHashAdapter)6405" + }, + { + "astId": 5933, + "contract": "contracts/ramps/venmo-v1/VenmoSendProcessor.sol:VenmoSendProcessor", + "label": "nullifierRegistry", + "offset": 0, + "slot": "2", + "type": "t_contract(INullifierRegistry)6636" + }, + { + "astId": 5935, + "contract": "contracts/ramps/venmo-v1/VenmoSendProcessor.sol:VenmoSendProcessor", + "label": "emailFromAddress", + "offset": 0, + "slot": "3", + "type": "t_bytes_storage" + } + ], + "types": { + "t_address": { + "encoding": "inplace", + "label": "address", + "numberOfBytes": "20" + }, + "t_bytes_storage": { + "encoding": "bytes", + "label": "bytes", + "numberOfBytes": "32" + }, + "t_contract(IKeyHashAdapter)6405": { + "encoding": "inplace", + "label": "contract IKeyHashAdapter", + "numberOfBytes": "20" + }, + "t_contract(INullifierRegistry)6636": { + "encoding": "inplace", + "label": "contract INullifierRegistry", + "numberOfBytes": "20" + } + } + } +} \ No newline at end of file diff --git a/contracts/deployments/encifher/VenmoSendProcessorV2.json b/contracts/deployments/encifher/VenmoSendProcessorV2.json new file mode 100644 index 000000000..bdcb3804a --- /dev/null +++ b/contracts/deployments/encifher/VenmoSendProcessorV2.json @@ -0,0 +1,483 @@ +{ + "address": "0xBF3cD410Aa5a3E9dA22FD9109AdD5D3655fcb1c5", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_ramp", + "type": "address" + }, + { + "internalType": "contract IKeyHashAdapterV2", + "name": "_venmoMailserverKeyHashAdapter", + "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": "PACK_SIZE", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "emailFromAddress", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getEmailFromAddress", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_keyHash", + "type": "bytes32" + } + ], + "name": "isMailServerKeyHash", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "mailServerKeyHashAdapter", + "outputs": [ + { + "internalType": "contract IKeyHashAdapterV2", + "name": "", + "type": "address" + } + ], + "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[12]", + "name": "signals", + "type": "uint256[12]" + } + ], + "internalType": "struct ISendProcessor.SendProof", + "name": "_proof", + "type": "tuple" + } + ], + "name": "processProof", + "outputs": [ + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "timestamp", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "offRamperIdHash", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "onRamperIdHash", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "intentHash", + "type": "bytes32" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "ramp", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "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": "contract IKeyHashAdapterV2", + "name": "_mailServerKeyHashAdapter", + "type": "address" + } + ], + "name": "setMailserverKeyHashAdapter", + "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[12]", + "name": "_pubSignals", + "type": "uint256[12]" + } + ], + "name": "verifyProof", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "transactionHash": "0x8f4c6cf7fa359a46bbd88fdc56bd4d1bd6f6843fb1f6d283ded087db2d481858", + "receipt": { + "to": null, + "from": "0xa0Ee7A142d267C1f36714E4a8F75612F20a79720", + "contractAddress": "0xBF3cD410Aa5a3E9dA22FD9109AdD5D3655fcb1c5", + "transactionIndex": 0, + "gasUsed": "1721436", + "logsBloom": "0x00000000000000000000040000000000000000000008000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000008004000000000000000020000000000000000000800000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000004000000020000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0xa0fd4656d37b01f5260ee963587dca4fadca94717accd04f230a8cc0d6bac54b", + "transactionHash": "0x8f4c6cf7fa359a46bbd88fdc56bd4d1bd6f6843fb1f6d283ded087db2d481858", + "logs": [ + { + "transactionIndex": 0, + "blockNumber": 61383, + "transactionHash": "0x8f4c6cf7fa359a46bbd88fdc56bd4d1bd6f6843fb1f6d283ded087db2d481858", + "address": "0xBF3cD410Aa5a3E9dA22FD9109AdD5D3655fcb1c5", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x000000000000000000000000a0ee7a142d267c1f36714e4a8f75612f20a79720" + ], + "data": "0x", + "logIndex": 0, + "blockHash": "0xa0fd4656d37b01f5260ee963587dca4fadca94717accd04f230a8cc0d6bac54b" + } + ], + "blockNumber": 61383, + "cumulativeGasUsed": "1721436", + "status": 1, + "byzantium": true + }, + "args": [ + "0x67f65B834aaAc92C15c2EBa9FF7E81f2d33a1cFD", + "0xa7B987f505366630109De019862c183E690a040B", + "0x4d8E02BBfCf205828A8352Af4376b165E123D7b0", + "venmo@venmo.com", + "30" + ], + "numDeployments": 1, + "solcInputHash": "75b8f55da346d7ed99a350632554d2fb", + "metadata": "{\"compiler\":{\"version\":\"0.8.24+commit.e11b9ed9\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_ramp\",\"type\":\"address\"},{\"internalType\":\"contract IKeyHashAdapterV2\",\"name\":\"_venmoMailserverKeyHashAdapter\",\"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\":\"PACK_SIZE\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"emailFromAddress\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getEmailFromAddress\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_keyHash\",\"type\":\"bytes32\"}],\"name\":\"isMailServerKeyHash\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"mailServerKeyHashAdapter\",\"outputs\":[{\"internalType\":\"contract IKeyHashAdapterV2\",\"name\":\"\",\"type\":\"address\"}],\"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[12]\",\"name\":\"signals\",\"type\":\"uint256[12]\"}],\"internalType\":\"struct ISendProcessor.SendProof\",\"name\":\"_proof\",\"type\":\"tuple\"}],\"name\":\"processProof\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"offRamperIdHash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"onRamperIdHash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"intentHash\",\"type\":\"bytes32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ramp\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"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\":\"contract IKeyHashAdapterV2\",\"name\":\"_mailServerKeyHashAdapter\",\"type\":\"address\"}],\"name\":\"setMailserverKeyHashAdapter\",\"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[12]\",\"name\":\"_pubSignals\",\"type\":\"uint256[12]\"}],\"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/ramps/venmo-v2/VenmoSendProcessorV2.sol\":\"VenmoSendProcessorV2\"},\"evmVersion\":\"shanghai\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"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 v4.4.1 (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\",\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"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/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/processors/BaseProcessorV2.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\n\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\nimport { IKeyHashAdapterV2 } from \\\"./keyHashAdapters/IKeyHashAdapterV2.sol\\\";\\nimport { INullifierRegistry } from \\\"./nullifierRegistries/INullifierRegistry.sol\\\";\\n\\npragma solidity ^0.8.18;\\n\\ncontract BaseProcessorV2 is Ownable {\\n\\n /* ============ Modifiers ============ */\\n modifier onlyRamp() {\\n require(msg.sender == ramp, \\\"Only Ramp can call this function\\\");\\n _;\\n }\\n\\n /* ============ State Variables ============ */\\n address public immutable ramp;\\n IKeyHashAdapterV2 public mailServerKeyHashAdapter;\\n INullifierRegistry public nullifierRegistry;\\n bytes public emailFromAddress;\\n uint256 public timestampBuffer;\\n\\n /* ============ Constructor ============ */\\n constructor(\\n address _ramp,\\n IKeyHashAdapterV2 _mailServerKeyHashAdapter,\\n INullifierRegistry _nullifierRegistry,\\n string memory _emailFromAddress,\\n uint256 _timestampBuffer\\n )\\n Ownable()\\n {\\n ramp = _ramp;\\n mailServerKeyHashAdapter = _mailServerKeyHashAdapter;\\n nullifierRegistry = _nullifierRegistry;\\n emailFromAddress = bytes(_emailFromAddress);\\n timestampBuffer = _timestampBuffer;\\n }\\n\\n /* ============ External Functions ============ */\\n\\n function setMailserverKeyHashAdapter(IKeyHashAdapterV2 _mailServerKeyHashAdapter) external onlyOwner {\\n mailServerKeyHashAdapter = _mailServerKeyHashAdapter;\\n }\\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 function isMailServerKeyHash(bytes32 _keyHash) public view returns (bool) {\\n return IKeyHashAdapterV2(mailServerKeyHashAdapter).isMailServerKeyHash(_keyHash);\\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\":\"0x207174fcbbfa8d2de65a5a5665f05e3f2d668f7df33b682a0f139c967dd3f6be\",\"license\":\"MIT\"},\"contracts/processors/keyHashAdapters/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/processors/nullifierRegistries/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/ramps/venmo-v1/interfaces/ISendProcessor.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.18;\\n\\ninterface ISendProcessor {\\n\\n struct SendProof {\\n uint256[2] a;\\n uint256[2][2] b;\\n uint256[2] c;\\n uint256[12] signals;\\n }\\n\\n function processProof(\\n SendProof calldata _proof\\n )\\n external\\n returns(uint256, uint256, bytes32, bytes32, bytes32);\\n}\\n\",\"keccak256\":\"0x16811e82d90b1e15eafd8f3de30b6a05a48c906c96e65d263c557c66e9fcedb7\",\"license\":\"MIT\"},\"contracts/ramps/venmo-v2/VenmoSendProcessorV2.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\n\\nimport { StringUtils } from \\\"@zk-email/contracts/utils/StringUtils.sol\\\";\\n\\nimport { BaseProcessorV2 } from \\\"../../processors/BaseProcessorV2.sol\\\";\\nimport { Groth16Verifier } from \\\"../../verifiers/venmo_send_verifier.sol\\\";\\nimport { IKeyHashAdapterV2 } from \\\"../../processors/keyHashAdapters/IKeyHashAdapterV2.sol\\\";\\nimport { INullifierRegistry } from \\\"../../processors/nullifierRegistries/INullifierRegistry.sol\\\";\\nimport { ISendProcessor } from \\\"../venmo-v1/interfaces/ISendProcessor.sol\\\";\\nimport { StringConversionUtils } from \\\"../../lib/StringConversionUtils.sol\\\";\\n\\npragma solidity ^0.8.18;\\n\\ncontract VenmoSendProcessorV2 is Groth16Verifier, ISendProcessor, BaseProcessorV2 {\\n \\n using StringUtils for uint256[];\\n using StringConversionUtils for string;\\n\\n /* ============ Constants ============ */\\n uint256 constant public PACK_SIZE = 7;\\n\\n /* ============ Constructor ============ */\\n constructor(\\n address _ramp,\\n IKeyHashAdapterV2 _venmoMailserverKeyHashAdapter,\\n INullifierRegistry _nullifierRegistry,\\n string memory _emailFromAddress,\\n uint256 _timestampBuffer\\n )\\n Groth16Verifier()\\n BaseProcessorV2(\\n _ramp,\\n _venmoMailserverKeyHashAdapter,\\n _nullifierRegistry,\\n _emailFromAddress,\\n _timestampBuffer\\n )\\n {}\\n \\n /* ============ External Functions ============ */\\n function processProof(\\n ISendProcessor.SendProof calldata _proof\\n )\\n public\\n override\\n onlyRamp\\n returns(uint256 amount, uint256 timestamp, bytes32 offRamperIdHash, bytes32 onRamperIdHash, bytes32 intentHash)\\n {\\n require(this.verifyProof(_proof.a, _proof.b, _proof.c, _proof.signals), \\\"Invalid Proof\\\"); // checks effects iteractions, this should come first\\n\\n require(isMailServerKeyHash(bytes32(_proof.signals[0])), \\\"Invalid mailserver key hash\\\");\\n\\n // Signals [1:4] are the packed from email address\\n string memory fromEmail = _parseSignalArray(_proof.signals, 1, 4);\\n require(keccak256(abi.encodePacked(fromEmail)) == keccak256(emailFromAddress), \\\"Invalid email from address\\\");\\n\\n // Signals [4:5] is the packed amount, since this is a USDC amount we want to make sure the returned number is\\n // properly padded to 6 decimals. If the parsed has more than 6 figures to the right of the decimal it will revert\\n amount = _parseSignalArray(_proof.signals, 4, 6).stringToUint(6);\\n\\n // Signals [5:7] are the packed timestamp, we do not expect there to be any decimal places in this number so we\\n // specify 0 decimals, if any decimal appears this function will revert\\n // Add the buffer to build in flexibility with L2 timestamps\\n timestamp = _parseSignalArray(_proof.signals, 6, 8).stringToUint(0) + timestampBuffer;\\n\\n // Signals [8] is the packed offRamperIdHash\\n offRamperIdHash = bytes32(_proof.signals[8]);\\n\\n // Signals [9] is the packed onRamperIdHash\\n onRamperIdHash = bytes32(_proof.signals[9]);\\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[10]));\\n\\n // Signals [11] is intentHash\\n intentHash = bytes32(_proof.signals[11]);\\n }\\n\\n /* ============ Internal Functions ============ */\\n\\n function _parseSignalArray(uint256[12] calldata _signals, uint8 _from, uint8 _to) internal pure returns (string memory) {\\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\":\"0x32dac49aa74b2b58ae06f85454adfcef11355c507f18c79ffa57cc0ca7a62ed0\",\"license\":\"MIT\"},\"contracts/verifiers/venmo_send_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 = 5710629204359318057562498392234897061794505526378244639613545081979421872324;\\n uint256 constant deltax2 = 990656993167988662763349194790300993619547607285680693352122387169954518876;\\n uint256 constant deltay1 = 716219014029453087010203485855017030343957665868140907538168510860723855404;\\n uint256 constant deltay2 = 15567073068481787678459322691280596720950847803967120869528969231388542383007;\\n\\n \\n uint256 constant IC0x = 3627016935680980991432758845809120437097698562642321662019774941798047598180;\\n uint256 constant IC0y = 16742737478481137559777273336649173908087975045426893354724005348183061433359;\\n \\n uint256 constant IC1x = 1454889468509402624274228018232533000837827531552657849863656594197598947498;\\n uint256 constant IC1y = 21114519264105667881501109217530601184286085076749464919673271702318856586869;\\n \\n uint256 constant IC2x = 15214926606177919954497590021391485480795904680262796779354958872907701613369;\\n uint256 constant IC2y = 3436701283643568631088610954415601741399004409005447167420424641912447528939;\\n \\n uint256 constant IC3x = 4535577697185795754970511618264939460763831131849914629687538976336257649268;\\n uint256 constant IC3y = 7758558535557743288212279084775965030097651866120453423634300893790511261820;\\n \\n uint256 constant IC4x = 874294953994422297831973347765527399192587644625708091600444498339317231142;\\n uint256 constant IC4y = 987062449590966973283739390864507348641413150099442677760662058272414279274;\\n \\n uint256 constant IC5x = 21093306057635441117249393023592254587788813974241613308459037792013982125271;\\n uint256 constant IC5y = 2674227458751675036151996130714025181946977717008550031124827209614433661640;\\n \\n uint256 constant IC6x = 13846687013867984054231693830774779045583700534400211257658890706223553634739;\\n uint256 constant IC6y = 8017285138819571587063238313118652954321504644123983130004849545264828919081;\\n \\n uint256 constant IC7x = 13134004890952141957850059371765174729898824494756098133509785273144965229605;\\n uint256 constant IC7y = 19833383650616654544301917274181853787895876513168493371626228893058581160277;\\n \\n uint256 constant IC8x = 15730855678085463666228938279082107543444904323060443712618683292548728266981;\\n uint256 constant IC8y = 11187003173972315212472857297424367154976035201682387760241185052675631112914;\\n \\n uint256 constant IC9x = 19431007015983296833648365920726396734910027676221391642968597625199383752634;\\n uint256 constant IC9y = 21132440606561643161647678729377817341013518219983716149257194049459184921050;\\n \\n uint256 constant IC10x = 4559717915456495626304866642697317683057747436742022494016974327403606371979;\\n uint256 constant IC10y = 11478380993372530002009436682140297146781606321299572933211280870931334446617;\\n \\n uint256 constant IC11x = 16525805622865173604160997674689687443990633252176419982940261013647563901344;\\n uint256 constant IC11y = 792201218354373970098710160330509619168590675536085985581042389294282406443;\\n \\n uint256 constant IC12x = 10525116069038722935367461628431297752051968830490923775813610986261326824582;\\n uint256 constant IC12y = 10970802876973329565857167947893820731407652682848506683295471907792738767120;\\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[12] calldata _pubSignals) public view returns (bool) {\\n assembly {\\n function checkField(v) {\\n if iszero(lt(v, q)) {\\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 g1_mulAccC(_pVk, IC11x, IC11y, calldataload(add(pubSignals, 320)))\\n \\n g1_mulAccC(_pVk, IC12x, IC12y, calldataload(add(pubSignals, 352)))\\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 checkField(calldataload(add(_pubSignals, 352)))\\n \\n checkField(calldataload(add(_pubSignals, 384)))\\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\":\"0x1ddacf233eeb13eaeaac81146d4f8b3421d8724ffdb00e3fbf439c34c479373c\",\"license\":\"GPL-3.0\"}},\"version\":1}", + "bytecode": "0x60a060405234801562000010575f80fd5b506040516200221038038062002210833981016040819052620000339162000115565b848484848462000043336200009a565b6001600160a01b03858116608052600180546001600160a01b031990811687841617909155600280549091169185169190911790556003620000868382620002b6565b506004555062000382975050505050505050565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b0381168114620000fe575f80fd5b50565b634e487b7160e01b5f52604160045260245ffd5b5f805f805f60a086880312156200012a575f80fd5b85516200013781620000e9565b809550506020808701516200014c81620000e9565b60408801519095506200015f81620000e9565b60608801519094506001600160401b03808211156200017c575f80fd5b818901915089601f83011262000190575f80fd5b815181811115620001a557620001a562000101565b604051601f8201601f19908116603f01168101908382118183101715620001d057620001d062000101565b816040528281528c86848701011115620001e8575f80fd5b5f93505b828410156200020b5784840186015181850187015292850192620001ec565b5f868483010152809750505050505050608086015190509295509295909350565b600181811c908216806200024157607f821691505b6020821081036200026057634e487b7160e01b5f52602260045260245ffd5b50919050565b601f821115620002b157805f5260205f20601f840160051c810160208510156200028d5750805b601f840160051c820191505b81811015620002ae575f815560010162000299565b50505b505050565b81516001600160401b03811115620002d257620002d262000101565b620002ea81620002e384546200022c565b8462000266565b602080601f83116001811462000320575f8415620003085750858301515b5f19600386901b1c1916600185901b1785556200037a565b5f85815260208120601f198616915b8281101562000350578886015182559484019460019091019084016200032f565b50858210156200036e57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b608051611e6e620003a25f395f81816101040152610b6b0152611e6e5ff3fe608060405234801561000f575f80fd5b50600436106100fb575f3560e01c8063b2a3fda411610093578063d0b71f9911610063578063d0b71f991461023a578063dbac58211461024d578063f2fde38b14610256578063f6c7226b14610269575f80fd5b8063b2a3fda4146101f7578063b870676c1461020a578063c0d05fed1461021d578063ced1e97814610232575f80fd5b80638cbac0fa116100ce5780638cbac0fa146101865780638da5cb5b146101995780638fe0ab8e146101a9578063a8ef333f146101e4575f80fd5b806315d276e1146100ff57806319d09152146101435780633d0c9cc414610166578063715018a61461017c575b5f80fd5b6101267f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020015b60405180910390f35b61015661015136600461183d565b61027c565b604051901515815260200161013a565b61016e600781565b60405190815260200161013a565b6101846102ed565b005b610156610194366004611864565b610300565b5f546001600160a01b0316610126565b6101bc6101b73660046118c5565b610b5b565b604080519586526020860194909452928401919091526060830152608082015260a00161013a565b600154610126906001600160a01b031681565b61018461020536600461183d565b610df7565b600254610126906001600160a01b031681565b610225610e04565b60405161013a91906118fe565b610225610e90565b610184610248366004611944565b610f20565b61016e60045481565b610184610264366004611944565b610f4a565b610184610277366004611973565b610fc0565b600154604051630ce848a960e11b8152600481018390525f916001600160a01b0316906319d0915290602401602060405180830381865afa1580156102c3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102e79190611a1e565b92915050565b6102f5610fd8565b6102fe5f611031565b565b5f610a8c565b7f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd478110610335575f805260205ff35b50565b5f60405183815284602082015285604082015260408160608360076107d05a03fa915081610368575f805260205ff35b825160408201526020830151606082015260408360808360066107d05a03fa91505080610397575f805260205ff35b5050505050565b7f0804d19f43c6e0aa984ef2d1e375b431a8fe0835289c656e6bba9441f166c66485527f25040db85863a4bb8731ec62d2c93ad23ff5aeba9f07860c47e85bd014a20c0f60208601525f608086018661043a87357f2eae64f73b7738369e069525e66cfe0748a4ff7a2278be1c2ff348129e5cc6757f03377031a6d2d0e51c3ba8115124ff36fbec49d2cf074f1317f2b0797133c8aa84610338565b61048a60208801357f07991a9f64c6f476627d8224834870d0468de2a4dda39e3f640486598d9d6feb7f21a357e17fb9c4a2035b9157f3ee366a49b2ddf8f741b8bc295664ce3d74f33984610338565b6104da60408801357f1127304267d4dc4109446b0bc64adf5d2fc1b09e30d6bb5172b9e6237793687c7f0a070bc6e9c8f2337f5e496e80a7dfb2f7d8120e051f6e7a82431cd477768a7484610338565b61052a60608801357f022ea8551762fb0d484eaf5dbaa9ebfc61570969e16c50553fc5256593dca66a7f01eed55a356e1365ecafc63de65edc7ed13717958ea0c4749452d7e393812e2684610338565b61057a60808801357f05e98f216225c8fd66611cf79935b4df8b4e1c1fffb6ede6384de90c66eb32c87f2ea2635dac52a7d0d21dfd61ef9bb70c5e6c969cfa3a53de181fd4ea568c4cd784610338565b6105ca60a08801357f11b99f617cbc07d59b321ae93d4fb398afc90fa19aea298eb111c4f62c8e2d297f1e9cf276628411884bf183a85eeccacbb63bf25d35a6d4554f87f4efc6cce1b384610338565b61061a60c08801357f2bd94c1e4213428e3647ba827fb2e473dd95460a9b8b0879693fb8c0a9b061557f1d0995553f2d35c98c8945170ee69c13085388df1221105c8ef10e7086426c2584610338565b61066a60e08801357f18bb9e91ce7be822a53d86b569077a4a12059e6923182dd5813951c1c6de62d27f22c7594a5e07dd0ac0bcfd42e3865beeb3b8996939e882e48c172393ec06a0e584610338565b6106bb6101008801357f2eb8899ac4d9f3c81edff23c8e14363a0e8998432c3e72bd886cd5e7fe16e9da7f2af58f6b609a74fe1a52d27026ef1fd8e719145496bc31704cc23c8144772fba84610338565b61070c6101208801357f1960888dce35e4417f924cafc664f31501a7a0e0bb584179b7d0de2402783e197f0a14b5795fc594ff84bacee8fa1e316c5cf9b9dfff5f16ed5d4c8cd1d7e2ee8b84610338565b61075d6101408801357f01c05eb851284bf3d8d069756a0a26c55d0b53ccd29b1be951cda7061c8f7a2b7f248946469d2ca9a1b04005223ad17489f4a081ae906286952ac7ebb5308349a084610338565b6107ae6101608801357f1841411f17ad3fbb997447e9f644114194d820241b5ad22e424a8e79340ad1107f1745012c998ad198581a529c8ad6dacca6372bf1b865978299698c2716fb848684610338565b50823581527f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4760208401357f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4703066020820152833560408201526020840135606082015260408401356080820152606084013560a08201527f2d4d9aa7e302d9df41749d5507949d05dbea33fbb16c643b22f599a2be6df2e260c08201527f14bedd503c37ceb061d8ec60209fe345ce89830a19230301f076caff004d192660e08201527f0967032fcbf776d1afc985f88877f182d38480a653f2decaa9794cbc3bf3060c6101008201527f0e187847ad4c798374d0d6732bf501847dd68bc0e071241e0213bc7fc13db7ab6101208201527f304cfbd1e08a704a99f5e847d93f8c3caafddec46b7a0d379da69a4d112346a76101408201527f1739c1b1a457a8c7313123d24d2f9192f896b7c63eea05a9d57f06547ad0cec86101608201525f87015161018082015260205f018701516101a08201527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c26101c08201527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed6101e08201527f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b6102008201527f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa610220820152843561024082015260208501356102608201527f0ca01a01b0e88539a2eb8751fa5a97c62e0c0d170309c2a63cdbf4d824bc50c46102808201527f0230b1261f6ff569ba908e8b64b3457d4457f211379daf0d8bdf40230ed4575c6102a08201527f01955d97b88498fecafedeaacfddd0d70ef179ff31d1a88f9ea74d1e9f45a02c6102c08201527f226aa6afbcf630c798ca6ef7896ed4b17694d0ec43e17e74fc5a68b68e9a339f6102e08201526020816103008360086107d05a03fa9051169695505050505050565b6040516103808101604052610aa35f840135610306565b610ab06020840135610306565b610abd6040840135610306565b610aca6060840135610306565b610ad76080840135610306565b610ae460a0840135610306565b610af160c0840135610306565b610afe60e0840135610306565b610b0c610100840135610306565b610b1a610120840135610306565b610b28610140840135610306565b610b36610160840135610306565b610b44610180840135610306565b610b51818486888a61039e565b9050805f5260205ff35b5f80808080336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610bdd5760405162461bcd60e51b815260206004820181905260248201527f4f6e6c792052616d702063616e2063616c6c20746869732066756e6374696f6e60448201526064015b60405180910390fd5b6040805163465d607d60e11b81523091638cbac0fa91610c10918a919082019060c0830190610100840190600401611a3d565b602060405180830381865afa158015610c2b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c4f9190611a1e565b610c8b5760405162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b210283937b7b360991b6044820152606401610bd4565b610c9961010087013561027c565b610ce55760405162461bcd60e51b815260206004820152601b60248201527f496e76616c6964206d61696c736572766572206b6579206861736800000000006044820152606401610bd4565b5f610cf7876101000160016004611080565b90506003604051610d089190611acf565b604051809103902081604051602001610d219190611b41565b6040516020818303038152906040528051906020012014610d845760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420656d61696c2066726f6d20616464726573730000000000006044820152606401610bd4565b610da06006610d9a896101000160046006611080565b90611150565b9550600454610dba5f610d9a8a6101000160066008611080565b610dc49190611b70565b945061020087013593506102208701359250610de4610240880135611167565b5093959294919350916102609091013590565b610dff610fd8565b600455565b60038054610e1190611a9d565b80601f0160208091040260200160405190810160405280929190818152602001828054610e3d90611a9d565b8015610e885780601f10610e5f57610100808354040283529160200191610e88565b820191905f5260205f20905b815481529060010190602001808311610e6b57829003601f168201915b505050505081565b606060038054610e9f90611a9d565b80601f0160208091040260200160405190810160405280929190818152602001828054610ecb90611a9d565b8015610f165780601f10610eed57610100808354040283529160200191610f16565b820191905f5260205f20905b815481529060010190602001808311610ef957829003601f168201915b5050505050905090565b610f28610fd8565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b610f52610fd8565b6001600160a01b038116610fb75760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610bd4565b61033581611031565b610fc8610fd8565b6003610fd48282611bcc565b5050565b5f546001600160a01b031633146102fe5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610bd4565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60605f61108d8484611c8c565b60ff1667ffffffffffffffff8111156110a8576110a861195f565b6040519080825280602002602001820160405280156110d1578160200160208202803683370190505b50905060ff84165b8360ff1681101561112c578581600c81106110f6576110f6611a89565b60200201358261110960ff881684611ca5565b8151811061111957611119611a89565b60209081029190910101526001016110d9565b506111476007825161113e9190611cb8565b82906007611274565b95945050505050565b5f61116083601760f91b84611586565b9392505050565b60025460405163169394bb60e01b8152600481018390526001600160a01b039091169063169394bb90602401602060405180830381865afa1580156111ae573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111d29190611a1e565b1561121f5760405162461bcd60e51b815260206004820152601f60248201527f4e756c6c69666965722068617320616c7265616479206265656e2075736564006044820152606401610bd4565b600254604051632dea6f9960e11b8152600481018390526001600160a01b0390911690635bd4df32906024015f604051808303815f87803b158015611262575f80fd5b505af1158015610397573d5f803e3d5ffd5b60605f808386516112859190611cb8565b67ffffffffffffffff81111561129d5761129d61195f565b6040519080825280601f01601f1916602001820160405280156112c7576020820181803683370190505b5090505f805b87518161ffff161015611461575f888261ffff16815181106112f1576112f1611a89565b602002602001015190505f8767ffffffffffffffff8111156113155761131561195f565b60405190808252806020026020018201604052801561133e578160200160208202803683370190505b5090505f5b8881101561138557611356816008611cb8565b83901c82828151811061136b5761136b611a89565b60ff90921660209283029190910190910152600101611343565b505f5b8881101561144b575f8282815181106113a3576113a3611a89565b602002602001015160ff169050805f14611418578060f81b8787815181106113cd576113cd611a89565b60200101906001600160f81b03191690815f1a905350856113ed81611ccf565b96506113fc9050600289611ce7565b60ff165f0361141357611410600189611d14565b97505b61143b565b611423600289611ce7565b60ff1660010361143b57611438600189611d14565b97505b5060089290921c91600101611388565b505050808061145990611d2d565b9150506112cd565b5060018360ff1610156115025760405162461bcd60e51b815260206004820152605760248201527f4e6f207061636b656420627974657320666f756e642120496e76616c6964206660448201527f696e616c207374617465206f66207061636b656420627974657320696e20656d60648201527f61696c3b2076616c7565206973206c696b656c79203021000000000000000000608482015260a401610bd4565b858111156115705760405162461bcd60e51b815260206004820152603560248201527f5061636b6564206279746573206d6f7265207468616e20616c6c6f776564206d6044820152746178206e756d626572206f66207369676e616c732160581b6064820152608401610bd4565b5f61157a8361174c565b98975050505050505050565b5f83818080805b84518110156116d157603060f81b8582815181106115ad576115ad611a89565b01602001516001600160f81b031916108015906115ee5750603960f81b8582815181106115dc576115dc611a89565b01602001516001600160f81b03191611155b1561163157603085828151811061160757611607611a89565b0160200151611619919060f81c611ca5565b61162485600a611cb8565b61162e9190611b70565b93505b8115611645578261164181611ccf565b9350505b876001600160f81b03191685828151811061166257611662611a89565b01602001516001600160f81b031916036116c95781156116c45760405162461bcd60e51b815260206004820152601c60248201527f537472696e6720686173206d756c7469706c6520646563696d616c73000000006044820152606401610bd4565b600191505b60010161158d565b508582111561172d5760405162461bcd60e51b815260206004820152602260248201527f537472696e672068617320746f6f206d616e7920646563696d616c20706c6163604482015261657360f01b6064820152608401610bd4565b6117378287611ca5565b61174290600a611e2d565b61157a9084611cb8565b805160609082905f5b82518110156117955782818151811061177057611770611a89565b01602001516001600160f81b0319165f0361178d57809150611795565b600101611755565b505f8167ffffffffffffffff8111156117b0576117b061195f565b6040519080825280601f01601f1916602001820160405280156117da576020820181803683370190505b5090505f5b82811015611834578381815181106117f9576117f9611a89565b602001015160f81c60f81b82828151811061181657611816611a89565b60200101906001600160f81b03191690815f1a9053506001016117df565b50949350505050565b5f6020828403121561184d575f80fd5b5035919050565b80604081018310156102e7575f80fd5b5f805f80610280808688031215611879575f80fd5b6118838787611854565b945060c0860187811115611895575f80fd5b6040870194506118a58882611854565b9350508681870111156118b6575f80fd5b50929591945092610100019150565b5f61028082840312156118d6575f80fd5b50919050565b5f5b838110156118f65781810151838201526020016118de565b50505f910152565b602081525f825180602084015261191c8160408501602087016118dc565b601f01601f19169190910160400192915050565b6001600160a01b0381168114610335575f80fd5b5f60208284031215611954575f80fd5b813561116081611930565b634e487b7160e01b5f52604160045260245ffd5b5f60208284031215611983575f80fd5b813567ffffffffffffffff8082111561199a575f80fd5b818401915084601f8301126119ad575f80fd5b8135818111156119bf576119bf61195f565b604051601f8201601f19908116603f011681019083821181831017156119e7576119e761195f565b816040528281528760208487010111156119ff575f80fd5b826020860160208301375f928101602001929092525095945050505050565b5f60208284031215611a2e575f80fd5b81518015158114611160575f80fd5b6102808101604080878437808301865f5b6002811015611a6b57838284379183019190830190600101611a4e565b505050808560c0850137506101808361010084013795945050505050565b634e487b7160e01b5f52603260045260245ffd5b600181811c90821680611ab157607f821691505b6020821081036118d657634e487b7160e01b5f52602260045260245ffd5b5f808354611adc81611a9d565b60018281168015611af45760018114611b0957611b35565b60ff1984168752821515830287019450611b35565b875f526020805f205f5b85811015611b2c5781548a820152908401908201611b13565b50505082870194505b50929695505050505050565b5f8251611b528184602087016118dc565b9190910192915050565b634e487b7160e01b5f52601160045260245ffd5b808201808211156102e7576102e7611b5c565b601f821115611bc757805f5260205f20601f840160051c81016020851015611ba85750805b601f840160051c820191505b81811015610397575f8155600101611bb4565b505050565b815167ffffffffffffffff811115611be657611be661195f565b611bfa81611bf48454611a9d565b84611b83565b602080601f831160018114611c2d575f8415611c165750858301515b5f19600386901b1c1916600185901b178555611c84565b5f85815260208120601f198616915b82811015611c5b57888601518255948401946001909101908401611c3c565b5085821015611c7857878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b60ff82811682821603908111156102e7576102e7611b5c565b818103818111156102e7576102e7611b5c565b80820281158282048414176102e7576102e7611b5c565b5f60018201611ce057611ce0611b5c565b5060010190565b5f60ff831680611d0557634e487b7160e01b5f52601260045260245ffd5b8060ff84160691505092915050565b60ff81811683821601908111156102e7576102e7611b5c565b5f61ffff808316818103611d4357611d43611b5c565b6001019392505050565b600181815b80851115611d8757815f1904821115611d6d57611d6d611b5c565b80851615611d7a57918102915b93841c9390800290611d52565b509250929050565b5f82611d9d575060016102e7565b81611da957505f6102e7565b8160018114611dbf5760028114611dc957611de5565b60019150506102e7565b60ff841115611dda57611dda611b5c565b50506001821b6102e7565b5060208310610133831016604e8410600b8410161715611e08575081810a6102e7565b611e128383611d4d565b805f1904821115611e2557611e25611b5c565b029392505050565b5f6111608383611d8f56fea2646970667358221220d228ec6eaddbb42a04c53cafc69eb1d37036333c85a39e207cfd76959c3b76e064736f6c63430008180033", + "deployedBytecode": "0x608060405234801561000f575f80fd5b50600436106100fb575f3560e01c8063b2a3fda411610093578063d0b71f9911610063578063d0b71f991461023a578063dbac58211461024d578063f2fde38b14610256578063f6c7226b14610269575f80fd5b8063b2a3fda4146101f7578063b870676c1461020a578063c0d05fed1461021d578063ced1e97814610232575f80fd5b80638cbac0fa116100ce5780638cbac0fa146101865780638da5cb5b146101995780638fe0ab8e146101a9578063a8ef333f146101e4575f80fd5b806315d276e1146100ff57806319d09152146101435780633d0c9cc414610166578063715018a61461017c575b5f80fd5b6101267f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020015b60405180910390f35b61015661015136600461183d565b61027c565b604051901515815260200161013a565b61016e600781565b60405190815260200161013a565b6101846102ed565b005b610156610194366004611864565b610300565b5f546001600160a01b0316610126565b6101bc6101b73660046118c5565b610b5b565b604080519586526020860194909452928401919091526060830152608082015260a00161013a565b600154610126906001600160a01b031681565b61018461020536600461183d565b610df7565b600254610126906001600160a01b031681565b610225610e04565b60405161013a91906118fe565b610225610e90565b610184610248366004611944565b610f20565b61016e60045481565b610184610264366004611944565b610f4a565b610184610277366004611973565b610fc0565b600154604051630ce848a960e11b8152600481018390525f916001600160a01b0316906319d0915290602401602060405180830381865afa1580156102c3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102e79190611a1e565b92915050565b6102f5610fd8565b6102fe5f611031565b565b5f610a8c565b7f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd478110610335575f805260205ff35b50565b5f60405183815284602082015285604082015260408160608360076107d05a03fa915081610368575f805260205ff35b825160408201526020830151606082015260408360808360066107d05a03fa91505080610397575f805260205ff35b5050505050565b7f0804d19f43c6e0aa984ef2d1e375b431a8fe0835289c656e6bba9441f166c66485527f25040db85863a4bb8731ec62d2c93ad23ff5aeba9f07860c47e85bd014a20c0f60208601525f608086018661043a87357f2eae64f73b7738369e069525e66cfe0748a4ff7a2278be1c2ff348129e5cc6757f03377031a6d2d0e51c3ba8115124ff36fbec49d2cf074f1317f2b0797133c8aa84610338565b61048a60208801357f07991a9f64c6f476627d8224834870d0468de2a4dda39e3f640486598d9d6feb7f21a357e17fb9c4a2035b9157f3ee366a49b2ddf8f741b8bc295664ce3d74f33984610338565b6104da60408801357f1127304267d4dc4109446b0bc64adf5d2fc1b09e30d6bb5172b9e6237793687c7f0a070bc6e9c8f2337f5e496e80a7dfb2f7d8120e051f6e7a82431cd477768a7484610338565b61052a60608801357f022ea8551762fb0d484eaf5dbaa9ebfc61570969e16c50553fc5256593dca66a7f01eed55a356e1365ecafc63de65edc7ed13717958ea0c4749452d7e393812e2684610338565b61057a60808801357f05e98f216225c8fd66611cf79935b4df8b4e1c1fffb6ede6384de90c66eb32c87f2ea2635dac52a7d0d21dfd61ef9bb70c5e6c969cfa3a53de181fd4ea568c4cd784610338565b6105ca60a08801357f11b99f617cbc07d59b321ae93d4fb398afc90fa19aea298eb111c4f62c8e2d297f1e9cf276628411884bf183a85eeccacbb63bf25d35a6d4554f87f4efc6cce1b384610338565b61061a60c08801357f2bd94c1e4213428e3647ba827fb2e473dd95460a9b8b0879693fb8c0a9b061557f1d0995553f2d35c98c8945170ee69c13085388df1221105c8ef10e7086426c2584610338565b61066a60e08801357f18bb9e91ce7be822a53d86b569077a4a12059e6923182dd5813951c1c6de62d27f22c7594a5e07dd0ac0bcfd42e3865beeb3b8996939e882e48c172393ec06a0e584610338565b6106bb6101008801357f2eb8899ac4d9f3c81edff23c8e14363a0e8998432c3e72bd886cd5e7fe16e9da7f2af58f6b609a74fe1a52d27026ef1fd8e719145496bc31704cc23c8144772fba84610338565b61070c6101208801357f1960888dce35e4417f924cafc664f31501a7a0e0bb584179b7d0de2402783e197f0a14b5795fc594ff84bacee8fa1e316c5cf9b9dfff5f16ed5d4c8cd1d7e2ee8b84610338565b61075d6101408801357f01c05eb851284bf3d8d069756a0a26c55d0b53ccd29b1be951cda7061c8f7a2b7f248946469d2ca9a1b04005223ad17489f4a081ae906286952ac7ebb5308349a084610338565b6107ae6101608801357f1841411f17ad3fbb997447e9f644114194d820241b5ad22e424a8e79340ad1107f1745012c998ad198581a529c8ad6dacca6372bf1b865978299698c2716fb848684610338565b50823581527f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4760208401357f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4703066020820152833560408201526020840135606082015260408401356080820152606084013560a08201527f2d4d9aa7e302d9df41749d5507949d05dbea33fbb16c643b22f599a2be6df2e260c08201527f14bedd503c37ceb061d8ec60209fe345ce89830a19230301f076caff004d192660e08201527f0967032fcbf776d1afc985f88877f182d38480a653f2decaa9794cbc3bf3060c6101008201527f0e187847ad4c798374d0d6732bf501847dd68bc0e071241e0213bc7fc13db7ab6101208201527f304cfbd1e08a704a99f5e847d93f8c3caafddec46b7a0d379da69a4d112346a76101408201527f1739c1b1a457a8c7313123d24d2f9192f896b7c63eea05a9d57f06547ad0cec86101608201525f87015161018082015260205f018701516101a08201527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c26101c08201527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed6101e08201527f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b6102008201527f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa610220820152843561024082015260208501356102608201527f0ca01a01b0e88539a2eb8751fa5a97c62e0c0d170309c2a63cdbf4d824bc50c46102808201527f0230b1261f6ff569ba908e8b64b3457d4457f211379daf0d8bdf40230ed4575c6102a08201527f01955d97b88498fecafedeaacfddd0d70ef179ff31d1a88f9ea74d1e9f45a02c6102c08201527f226aa6afbcf630c798ca6ef7896ed4b17694d0ec43e17e74fc5a68b68e9a339f6102e08201526020816103008360086107d05a03fa9051169695505050505050565b6040516103808101604052610aa35f840135610306565b610ab06020840135610306565b610abd6040840135610306565b610aca6060840135610306565b610ad76080840135610306565b610ae460a0840135610306565b610af160c0840135610306565b610afe60e0840135610306565b610b0c610100840135610306565b610b1a610120840135610306565b610b28610140840135610306565b610b36610160840135610306565b610b44610180840135610306565b610b51818486888a61039e565b9050805f5260205ff35b5f80808080336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610bdd5760405162461bcd60e51b815260206004820181905260248201527f4f6e6c792052616d702063616e2063616c6c20746869732066756e6374696f6e60448201526064015b60405180910390fd5b6040805163465d607d60e11b81523091638cbac0fa91610c10918a919082019060c0830190610100840190600401611a3d565b602060405180830381865afa158015610c2b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c4f9190611a1e565b610c8b5760405162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b210283937b7b360991b6044820152606401610bd4565b610c9961010087013561027c565b610ce55760405162461bcd60e51b815260206004820152601b60248201527f496e76616c6964206d61696c736572766572206b6579206861736800000000006044820152606401610bd4565b5f610cf7876101000160016004611080565b90506003604051610d089190611acf565b604051809103902081604051602001610d219190611b41565b6040516020818303038152906040528051906020012014610d845760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420656d61696c2066726f6d20616464726573730000000000006044820152606401610bd4565b610da06006610d9a896101000160046006611080565b90611150565b9550600454610dba5f610d9a8a6101000160066008611080565b610dc49190611b70565b945061020087013593506102208701359250610de4610240880135611167565b5093959294919350916102609091013590565b610dff610fd8565b600455565b60038054610e1190611a9d565b80601f0160208091040260200160405190810160405280929190818152602001828054610e3d90611a9d565b8015610e885780601f10610e5f57610100808354040283529160200191610e88565b820191905f5260205f20905b815481529060010190602001808311610e6b57829003601f168201915b505050505081565b606060038054610e9f90611a9d565b80601f0160208091040260200160405190810160405280929190818152602001828054610ecb90611a9d565b8015610f165780601f10610eed57610100808354040283529160200191610f16565b820191905f5260205f20905b815481529060010190602001808311610ef957829003601f168201915b5050505050905090565b610f28610fd8565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b610f52610fd8565b6001600160a01b038116610fb75760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610bd4565b61033581611031565b610fc8610fd8565b6003610fd48282611bcc565b5050565b5f546001600160a01b031633146102fe5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610bd4565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60605f61108d8484611c8c565b60ff1667ffffffffffffffff8111156110a8576110a861195f565b6040519080825280602002602001820160405280156110d1578160200160208202803683370190505b50905060ff84165b8360ff1681101561112c578581600c81106110f6576110f6611a89565b60200201358261110960ff881684611ca5565b8151811061111957611119611a89565b60209081029190910101526001016110d9565b506111476007825161113e9190611cb8565b82906007611274565b95945050505050565b5f61116083601760f91b84611586565b9392505050565b60025460405163169394bb60e01b8152600481018390526001600160a01b039091169063169394bb90602401602060405180830381865afa1580156111ae573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111d29190611a1e565b1561121f5760405162461bcd60e51b815260206004820152601f60248201527f4e756c6c69666965722068617320616c7265616479206265656e2075736564006044820152606401610bd4565b600254604051632dea6f9960e11b8152600481018390526001600160a01b0390911690635bd4df32906024015f604051808303815f87803b158015611262575f80fd5b505af1158015610397573d5f803e3d5ffd5b60605f808386516112859190611cb8565b67ffffffffffffffff81111561129d5761129d61195f565b6040519080825280601f01601f1916602001820160405280156112c7576020820181803683370190505b5090505f805b87518161ffff161015611461575f888261ffff16815181106112f1576112f1611a89565b602002602001015190505f8767ffffffffffffffff8111156113155761131561195f565b60405190808252806020026020018201604052801561133e578160200160208202803683370190505b5090505f5b8881101561138557611356816008611cb8565b83901c82828151811061136b5761136b611a89565b60ff90921660209283029190910190910152600101611343565b505f5b8881101561144b575f8282815181106113a3576113a3611a89565b602002602001015160ff169050805f14611418578060f81b8787815181106113cd576113cd611a89565b60200101906001600160f81b03191690815f1a905350856113ed81611ccf565b96506113fc9050600289611ce7565b60ff165f0361141357611410600189611d14565b97505b61143b565b611423600289611ce7565b60ff1660010361143b57611438600189611d14565b97505b5060089290921c91600101611388565b505050808061145990611d2d565b9150506112cd565b5060018360ff1610156115025760405162461bcd60e51b815260206004820152605760248201527f4e6f207061636b656420627974657320666f756e642120496e76616c6964206660448201527f696e616c207374617465206f66207061636b656420627974657320696e20656d60648201527f61696c3b2076616c7565206973206c696b656c79203021000000000000000000608482015260a401610bd4565b858111156115705760405162461bcd60e51b815260206004820152603560248201527f5061636b6564206279746573206d6f7265207468616e20616c6c6f776564206d6044820152746178206e756d626572206f66207369676e616c732160581b6064820152608401610bd4565b5f61157a8361174c565b98975050505050505050565b5f83818080805b84518110156116d157603060f81b8582815181106115ad576115ad611a89565b01602001516001600160f81b031916108015906115ee5750603960f81b8582815181106115dc576115dc611a89565b01602001516001600160f81b03191611155b1561163157603085828151811061160757611607611a89565b0160200151611619919060f81c611ca5565b61162485600a611cb8565b61162e9190611b70565b93505b8115611645578261164181611ccf565b9350505b876001600160f81b03191685828151811061166257611662611a89565b01602001516001600160f81b031916036116c95781156116c45760405162461bcd60e51b815260206004820152601c60248201527f537472696e6720686173206d756c7469706c6520646563696d616c73000000006044820152606401610bd4565b600191505b60010161158d565b508582111561172d5760405162461bcd60e51b815260206004820152602260248201527f537472696e672068617320746f6f206d616e7920646563696d616c20706c6163604482015261657360f01b6064820152608401610bd4565b6117378287611ca5565b61174290600a611e2d565b61157a9084611cb8565b805160609082905f5b82518110156117955782818151811061177057611770611a89565b01602001516001600160f81b0319165f0361178d57809150611795565b600101611755565b505f8167ffffffffffffffff8111156117b0576117b061195f565b6040519080825280601f01601f1916602001820160405280156117da576020820181803683370190505b5090505f5b82811015611834578381815181106117f9576117f9611a89565b602001015160f81c60f81b82828151811061181657611816611a89565b60200101906001600160f81b03191690815f1a9053506001016117df565b50949350505050565b5f6020828403121561184d575f80fd5b5035919050565b80604081018310156102e7575f80fd5b5f805f80610280808688031215611879575f80fd5b6118838787611854565b945060c0860187811115611895575f80fd5b6040870194506118a58882611854565b9350508681870111156118b6575f80fd5b50929591945092610100019150565b5f61028082840312156118d6575f80fd5b50919050565b5f5b838110156118f65781810151838201526020016118de565b50505f910152565b602081525f825180602084015261191c8160408501602087016118dc565b601f01601f19169190910160400192915050565b6001600160a01b0381168114610335575f80fd5b5f60208284031215611954575f80fd5b813561116081611930565b634e487b7160e01b5f52604160045260245ffd5b5f60208284031215611983575f80fd5b813567ffffffffffffffff8082111561199a575f80fd5b818401915084601f8301126119ad575f80fd5b8135818111156119bf576119bf61195f565b604051601f8201601f19908116603f011681019083821181831017156119e7576119e761195f565b816040528281528760208487010111156119ff575f80fd5b826020860160208301375f928101602001929092525095945050505050565b5f60208284031215611a2e575f80fd5b81518015158114611160575f80fd5b6102808101604080878437808301865f5b6002811015611a6b57838284379183019190830190600101611a4e565b505050808560c0850137506101808361010084013795945050505050565b634e487b7160e01b5f52603260045260245ffd5b600181811c90821680611ab157607f821691505b6020821081036118d657634e487b7160e01b5f52602260045260245ffd5b5f808354611adc81611a9d565b60018281168015611af45760018114611b0957611b35565b60ff1984168752821515830287019450611b35565b875f526020805f205f5b85811015611b2c5781548a820152908401908201611b13565b50505082870194505b50929695505050505050565b5f8251611b528184602087016118dc565b9190910192915050565b634e487b7160e01b5f52601160045260245ffd5b808201808211156102e7576102e7611b5c565b601f821115611bc757805f5260205f20601f840160051c81016020851015611ba85750805b601f840160051c820191505b81811015610397575f8155600101611bb4565b505050565b815167ffffffffffffffff811115611be657611be661195f565b611bfa81611bf48454611a9d565b84611b83565b602080601f831160018114611c2d575f8415611c165750858301515b5f19600386901b1c1916600185901b178555611c84565b5f85815260208120601f198616915b82811015611c5b57888601518255948401946001909101908401611c3c565b5085821015611c7857878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b60ff82811682821603908111156102e7576102e7611b5c565b818103818111156102e7576102e7611b5c565b80820281158282048414176102e7576102e7611b5c565b5f60018201611ce057611ce0611b5c565b5060010190565b5f60ff831680611d0557634e487b7160e01b5f52601260045260245ffd5b8060ff84160691505092915050565b60ff81811683821601908111156102e7576102e7611b5c565b5f61ffff808316818103611d4357611d43611b5c565b6001019392505050565b600181815b80851115611d8757815f1904821115611d6d57611d6d611b5c565b80851615611d7a57918102915b93841c9390800290611d52565b509250929050565b5f82611d9d575060016102e7565b81611da957505f6102e7565b8160018114611dbf5760028114611dc957611de5565b60019150506102e7565b60ff841115611dda57611dda611b5c565b50506001821b6102e7565b5060208310610133831016604e8410600b8410161715611e08575081810a6102e7565b611e128383611d4d565b805f1904821115611e2557611e25611b5c565b029392505050565b5f6111608383611d8f56fea2646970667358221220d228ec6eaddbb42a04c53cafc69eb1d37036333c85a39e207cfd76959c3b76e064736f6c63430008180033", + "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/ramps/venmo-v2/VenmoSendProcessorV2.sol:VenmoSendProcessorV2", + "label": "_owner", + "offset": 0, + "slot": "0", + "type": "t_address" + }, + { + "astId": 6068, + "contract": "contracts/ramps/venmo-v2/VenmoSendProcessorV2.sol:VenmoSendProcessorV2", + "label": "mailServerKeyHashAdapter", + "offset": 0, + "slot": "1", + "type": "t_contract(IKeyHashAdapterV2)6431" + }, + { + "astId": 6071, + "contract": "contracts/ramps/venmo-v2/VenmoSendProcessorV2.sol:VenmoSendProcessorV2", + "label": "nullifierRegistry", + "offset": 0, + "slot": "2", + "type": "t_contract(INullifierRegistry)6636" + }, + { + "astId": 6073, + "contract": "contracts/ramps/venmo-v2/VenmoSendProcessorV2.sol:VenmoSendProcessorV2", + "label": "emailFromAddress", + "offset": 0, + "slot": "3", + "type": "t_bytes_storage" + }, + { + "astId": 6075, + "contract": "contracts/ramps/venmo-v2/VenmoSendProcessorV2.sol:VenmoSendProcessorV2", + "label": "timestampBuffer", + "offset": 0, + "slot": "4", + "type": "t_uint256" + } + ], + "types": { + "t_address": { + "encoding": "inplace", + "label": "address", + "numberOfBytes": "20" + }, + "t_bytes_storage": { + "encoding": "bytes", + "label": "bytes", + "numberOfBytes": "32" + }, + "t_contract(IKeyHashAdapterV2)6431": { + "encoding": "inplace", + "label": "contract IKeyHashAdapterV2", + "numberOfBytes": "20" + }, + "t_contract(INullifierRegistry)6636": { + "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/deployments/encifher/solcInputs/75b8f55da346d7ed99a350632554d2fb.json b/contracts/deployments/encifher/solcInputs/75b8f55da346d7ed99a350632554d2fb.json new file mode 100644 index 000000000..7657df383 --- /dev/null +++ b/contracts/deployments/encifher/solcInputs/75b8f55da346d7ed99a350632554d2fb.json @@ -0,0 +1,329 @@ +{ + "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/access/Ownable2Step.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable2Step.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./Ownable.sol\";\n\n/**\n * @dev Contract module which provides 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} and {acceptOwnership}.\n *\n * This module is used through inheritance. It will make available all functions\n * from parent (Ownable).\n */\nabstract contract Ownable2Step is Ownable {\n address private _pendingOwner;\n\n event OwnershipTransferStarted(address indexed previousOwner, address indexed newOwner);\n\n /**\n * @dev Returns the address of the pending owner.\n */\n function pendingOwner() public view virtual returns (address) {\n return _pendingOwner;\n }\n\n /**\n * @dev Starts the ownership transfer of the contract to a new account. Replaces the pending transfer if there is one.\n * Can only be called by the current owner.\n */\n function transferOwnership(address newOwner) public virtual override onlyOwner {\n _pendingOwner = newOwner;\n emit OwnershipTransferStarted(owner(), newOwner);\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`) and deletes any pending owner.\n * Internal function without access restriction.\n */\n function _transferOwnership(address newOwner) internal virtual override {\n delete _pendingOwner;\n super._transferOwnership(newOwner);\n }\n\n /**\n * @dev The new owner accepts the ownership transfer.\n */\n function acceptOwnership() public virtual {\n address sender = _msgSender();\n require(pendingOwner() == sender, \"Ownable2Step: caller is not the new owner\");\n _transferOwnership(sender);\n }\n}\n" + }, + "@openzeppelin/contracts/interfaces/IERC1271.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (interfaces/IERC1271.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC1271 standard signature validation method for\n * contracts as defined in https://eips.ethereum.org/EIPS/eip-1271[ERC-1271].\n *\n * _Available since v4.1._\n */\ninterface IERC1271 {\n /**\n * @dev Should return whether the signature provided is valid for the provided data\n * @param hash Hash of the data to be signed\n * @param signature Signature byte array associated with _data\n */\n function isValidSignature(bytes32 hash, bytes memory signature) external view returns (bytes4 magicValue);\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/Context.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (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" + }, + "@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/cryptography/SignatureChecker.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/cryptography/SignatureChecker.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./ECDSA.sol\";\nimport \"../../interfaces/IERC1271.sol\";\n\n/**\n * @dev Signature verification helper that can be used instead of `ECDSA.recover` to seamlessly support both ECDSA\n * signatures from externally owned accounts (EOAs) as well as ERC1271 signatures from smart contract wallets like\n * Argent and Gnosis Safe.\n *\n * _Available since v4.1._\n */\nlibrary SignatureChecker {\n /**\n * @dev Checks if a signature is valid for a given signer and data hash. If the signer is a smart contract, the\n * signature is validated against that smart contract using ERC1271, otherwise it's validated using `ECDSA.recover`.\n *\n * NOTE: Unlike ECDSA signatures, contract signatures are revocable, and the outcome of this function can thus\n * change through time. It could return true at block N and false at block N+1 (or the opposite).\n */\n function isValidSignatureNow(address signer, bytes32 hash, bytes memory signature) internal view returns (bool) {\n (address recovered, ECDSA.RecoverError error) = ECDSA.tryRecover(hash, signature);\n return\n (error == ECDSA.RecoverError.NoError && recovered == signer) ||\n isValidERC1271SignatureNow(signer, hash, signature);\n }\n\n /**\n * @dev Checks if a signature is valid for a given signer and data hash. The signature is validated\n * against the signer smart contract using ERC1271.\n *\n * NOTE: Unlike ECDSA signatures, contract signatures are revocable, and the outcome of this function can thus\n * change through time. It could return true at block N and false at block N+1 (or the opposite).\n */\n function isValidERC1271SignatureNow(\n address signer,\n bytes32 hash,\n bytes memory signature\n ) internal view returns (bool) {\n (bool success, bytes memory result) = signer.staticcall(\n abi.encodeWithSelector(IERC1271.isValidSignature.selector, hash, signature)\n );\n return (success &&\n result.length >= 32 &&\n abi.decode(result, (bytes32)) == bytes32(IERC1271.isValidSignature.selector));\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" + }, + "@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/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/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/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/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 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/IEERC20.sol": { + "content": "// SPDX-License-Identifier: UNLICENSED\n\npragma solidity ^0.8.24;\n\nimport \"fhevm/lib/TFHE.sol\";\n\ninterface IeERC20 {\n event Transfer(address indexed from, address indexed to);\n event Approval(address indexed owner, address indexed spender);\n event Mint(address indexed to, uint64 amount);\n\n // Returns the name of the token.\n function name() external view returns (string memory);\n\n // Returns the symbol of the token, usually a shorter version of the name.\n function symbol() external view returns (string memory);\n\n // Returns the total supply of the token.\n function totalSupply() external view returns (uint64);\n\n // Transfers an encrypted amount from the message sender address to the `to` address.\n function transfer(address to, einput encryptedAmount, bytes calldata inputProof) external returns (bool);\n\n // Transfers an amount from the message sender address to the `to` address.\n function transfer(address to, euint64 amount) external returns (bool);\n\n // Returns the balance handle of the specified wallet.\n function balanceOf(address wallet) external view returns (euint64);\n\n // Sets the `encryptedAmount` as the allowance of `spender` over the caller's tokens.\n function approve(address spender, einput encryptedAmount, bytes calldata inputProof) external returns (bool);\n\n // Sets the `amount` as the allowance of `spender` over the caller's tokens.\n function approve(address spender, euint64 amount) external returns (bool);\n\n // Returns the remaining number of tokens that `spender` is allowed to spend on behalf of the owner.\n function allowance(address owner, address spender) external view returns (euint64);\n\n // Transfers `encryptedAmount` tokens using the caller's allowance.\n function transferFrom(\n address from,\n address to,\n einput encryptedAmount,\n bytes calldata inputProof\n ) external returns (bool);\n\n // Transfers `amount` tokens using the caller's allowance.\n function transferFrom(address from, address to, euint64 amount) external returns (bool);\n}\n" + }, + "contracts/interfaces/IPoseidon.sol": { + "content": "//SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.18;\n\ninterface IPoseidon {\n function poseidon(uint256[3] memory _a) external pure returns(uint256);\n}\n" + }, + "contracts/interfaces/IPoseidon3.sol": { + "content": "//SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.18;\n\ninterface IPoseidon3 {\n function poseidon(uint256[3] memory _a) external pure returns(uint256);\n}\n" + }, + "contracts/interfaces/IPoseidon6.sol": { + "content": "//SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.18;\n\ninterface IPoseidon6 {\n function poseidon(uint256[6] memory _a) external pure returns(uint256);\n}\n" + }, + "contracts/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/mocks/EncryptedERC20.sol": { + "content": "// SPDX-License-Identifier: BSD-3-Clause-Clear\n\npragma solidity ^0.8.24;\n\nimport \"fhevm/lib/TFHE.sol\";\nimport \"@openzeppelin/contracts/access/Ownable2Step.sol\";\n\ncontract EncryptedERC20 is Ownable2Step {\n event Transfer(address indexed from, address indexed to);\n event Approval(address indexed owner, address indexed spender);\n event Mint(address indexed to, uint64 amount);\n\n uint64 private _totalSupply;\n string private _name;\n string private _symbol;\n uint8 public constant decimals = 6;\n\n // A mapping from address to an encrypted balance.\n mapping(address => euint64) internal balances;\n\n // A mapping of the form mapping(owner => mapping(spender => allowance)).\n mapping(address => mapping(address => euint64)) internal allowances;\n\n constructor(string memory name_, string memory symbol_) Ownable() {\n _name = name_;\n _symbol = symbol_;\n }\n\n // Returns the name of the token.\n function name() public view virtual returns (string memory) {\n return _name;\n }\n\n // Returns the symbol of the token, usually a shorter version of the name.\n function symbol() public view virtual returns (string memory) {\n return _symbol;\n }\n\n // Returns the total supply of the token\n function totalSupply() public view virtual returns (uint64) {\n return _totalSupply;\n }\n\n // Sets the balance of the owner to the given encrypted balance.\n function mint(uint64 mintedAmount) public virtual onlyOwner {\n balances[owner()] = TFHE.add(balances[owner()], mintedAmount); // overflow impossible because of next line\n TFHE.allow(balances[owner()], address(this));\n TFHE.allow(balances[owner()], owner());\n _totalSupply = _totalSupply + mintedAmount;\n emit Mint(owner(), mintedAmount);\n }\n\n // Transfers an encrypted amount from the message sender address to the `to` address.\n function transfer(address to, einput encryptedAmount, bytes calldata inputProof) public virtual returns (bool) {\n transfer(to, TFHE.asEuint64(encryptedAmount, inputProof));\n return true;\n }\n\n // Transfers an amount from the message sender address to the `to` address.\n function transfer(address to, euint64 amount) public virtual returns (bool) {\n require(TFHE.isSenderAllowed(amount));\n // makes sure the owner has enough tokens\n ebool canTransfer = TFHE.le(amount, balances[msg.sender]);\n _transfer(msg.sender, to, amount, canTransfer);\n return true;\n }\n\n // Returns the balance handle of the caller.\n function balanceOf(address wallet) public view virtual returns (euint64) {\n return balances[wallet];\n }\n\n // Sets the `encryptedAmount` as the allowance of `spender` over the caller's tokens.\n function approve(address spender, einput encryptedAmount, bytes calldata inputProof) public virtual returns (bool) {\n approve(spender, TFHE.asEuint64(encryptedAmount, inputProof));\n return true;\n }\n\n // Sets the `amount` as the allowance of `spender` over the caller's tokens.\n function approve(address spender, euint64 amount) public virtual returns (bool) {\n require(TFHE.isSenderAllowed(amount));\n address owner = msg.sender;\n _approve(owner, spender, amount);\n emit Approval(owner, spender);\n return true;\n }\n\n // Returns the remaining number of tokens that `spender` is allowed to spend\n // on behalf of the caller.\n function allowance(address owner, address spender) public view virtual returns (euint64) {\n return _allowance(owner, spender);\n }\n\n // Transfers `encryptedAmount` tokens using the caller's allowance.\n function transferFrom(\n address from,\n address to,\n einput encryptedAmount,\n bytes calldata inputProof\n ) public virtual returns (bool) {\n transferFrom(from, to, TFHE.asEuint64(encryptedAmount, inputProof));\n return true;\n }\n\n // Transfers `amount` tokens using the caller's allowance.\n function transferFrom(address from, address to, euint64 amount) public virtual returns (bool) {\n require(TFHE.isSenderAllowed(amount));\n address spender = msg.sender;\n ebool isTransferable = _updateAllowance(from, spender, amount);\n _transfer(from, to, amount, isTransferable);\n return true;\n }\n\n function _approve(address owner, address spender, euint64 amount) internal virtual {\n allowances[owner][spender] = amount;\n TFHE.allow(amount, address(this));\n TFHE.allow(amount, owner);\n TFHE.allow(amount, spender);\n }\n\n function _allowance(address owner, address spender) internal view virtual returns (euint64) {\n return allowances[owner][spender];\n }\n\n function _updateAllowance(address owner, address spender, euint64 amount) internal virtual returns (ebool) {\n euint64 currentAllowance = _allowance(owner, spender);\n // makes sure the allowance suffices\n ebool allowedTransfer = TFHE.le(amount, currentAllowance);\n // makes sure the owner has enough tokens\n ebool canTransfer = TFHE.le(amount, balances[owner]);\n ebool isTransferable = TFHE.and(canTransfer, allowedTransfer);\n _approve(owner, spender, TFHE.select(isTransferable, TFHE.sub(currentAllowance, amount), currentAllowance));\n return isTransferable;\n }\n\n // Transfers an encrypted amount.\n function _transfer(address from, address to, euint64 amount, ebool isTransferable) internal virtual {\n // Add to the balance of `to` and subract from the balance of `from`.\n euint64 transferValue = TFHE.select(isTransferable, amount, TFHE.asEuint64(0));\n euint64 newBalanceTo = TFHE.add(balances[to], transferValue);\n balances[to] = newBalanceTo;\n TFHE.allow(newBalanceTo, address(this));\n TFHE.allow(newBalanceTo, to);\n euint64 newBalanceFrom = TFHE.sub(balances[from], transferValue);\n balances[from] = newBalanceFrom;\n TFHE.allow(newBalanceFrom, address(this));\n TFHE.allow(newBalanceFrom, from);\n emit Transfer(from, to);\n }\n}" + }, + "contracts/mocks/StringConversionUtilsMock.sol": { + "content": "//SPDX-License-Identifier: MIT\n\nimport { StringConversionUtils } from \"../lib/StringConversionUtils.sol\";\n\npragma solidity ^0.8.18;\n\ncontract StringConversionUtilsMock {\n\n using StringConversionUtils for string;\n\n function stringToUint(string memory _s, uint256 _desiredDecimals) public pure returns (uint256) {\n return _s.stringToUint(_desiredDecimals);\n }\n\n function stringToUintDefinedCharacter(\n string memory _s,\n bytes1 _decimalCharacter,\n uint256 _desiredDecimals\n )\n public\n pure\n returns (uint256)\n {\n return _s.stringToUint(_decimalCharacter, _desiredDecimals);\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/processors/BaseProcessor.sol": { + "content": "//SPDX-License-Identifier: MIT\n\nimport { Ownable } from \"@openzeppelin/contracts/access/Ownable.sol\";\n\nimport { IKeyHashAdapter } from \"./keyHashAdapters/IKeyHashAdapter.sol\";\nimport { INullifierRegistry } from \"./nullifierRegistries/INullifierRegistry.sol\";\n\npragma solidity ^0.8.18;\n\ncontract BaseProcessor is Ownable {\n\n /* ============ Modifiers ============ */\n modifier onlyRamp() {\n require(msg.sender == ramp, \"Only Ramp can call this function\");\n _;\n }\n\n /* ============ State Variables ============ */\n address public immutable ramp;\n IKeyHashAdapter public mailserverKeyHashAdapter;\n INullifierRegistry public nullifierRegistry;\n bytes public emailFromAddress;\n\n /* ============ Constructor ============ */\n constructor(\n address _ramp,\n IKeyHashAdapter _mailserverKeyHashAdapter,\n INullifierRegistry _nullifierRegistry,\n string memory _emailFromAddress\n )\n Ownable()\n {\n ramp = _ramp;\n mailserverKeyHashAdapter = _mailserverKeyHashAdapter;\n nullifierRegistry = _nullifierRegistry;\n emailFromAddress = bytes(_emailFromAddress);\n }\n\n /* ============ External Functions ============ */\n\n function setMailserverKeyHashAdapter(IKeyHashAdapter _mailserverKeyHashAdapter) external onlyOwner {\n mailserverKeyHashAdapter = _mailserverKeyHashAdapter;\n }\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 /* ============ External Getters ============ */\n\n function getEmailFromAddress() external view returns (bytes memory) {\n return emailFromAddress;\n }\n\n function getMailserverKeyHash() public view returns (bytes32) {\n return IKeyHashAdapter(mailserverKeyHashAdapter).mailserverKeyHash();\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/processors/BaseProcessorV2.sol": { + "content": "//SPDX-License-Identifier: MIT\n\nimport { Ownable } from \"@openzeppelin/contracts/access/Ownable.sol\";\n\nimport { IKeyHashAdapterV2 } from \"./keyHashAdapters/IKeyHashAdapterV2.sol\";\nimport { INullifierRegistry } from \"./nullifierRegistries/INullifierRegistry.sol\";\n\npragma solidity ^0.8.18;\n\ncontract BaseProcessorV2 is Ownable {\n\n /* ============ Modifiers ============ */\n modifier onlyRamp() {\n require(msg.sender == ramp, \"Only Ramp can call this function\");\n _;\n }\n\n /* ============ State Variables ============ */\n address public immutable ramp;\n IKeyHashAdapterV2 public mailServerKeyHashAdapter;\n INullifierRegistry public nullifierRegistry;\n bytes public emailFromAddress;\n uint256 public timestampBuffer;\n\n /* ============ Constructor ============ */\n constructor(\n address _ramp,\n IKeyHashAdapterV2 _mailServerKeyHashAdapter,\n INullifierRegistry _nullifierRegistry,\n string memory _emailFromAddress,\n uint256 _timestampBuffer\n )\n Ownable()\n {\n ramp = _ramp;\n mailServerKeyHashAdapter = _mailServerKeyHashAdapter;\n nullifierRegistry = _nullifierRegistry;\n emailFromAddress = bytes(_emailFromAddress);\n timestampBuffer = _timestampBuffer;\n }\n\n /* ============ External Functions ============ */\n\n function setMailserverKeyHashAdapter(IKeyHashAdapterV2 _mailServerKeyHashAdapter) external onlyOwner {\n mailServerKeyHashAdapter = _mailServerKeyHashAdapter;\n }\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 function isMailServerKeyHash(bytes32 _keyHash) public view returns (bool) {\n return IKeyHashAdapterV2(mailServerKeyHashAdapter).isMailServerKeyHash(_keyHash);\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/processors/keyHashAdapters/IKeyHashAdapter.sol": { + "content": "//SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.18;\n\ninterface IKeyHashAdapter {\n function setMailserverKeyHash(bytes32 _mailserverKeyHash) external;\n function mailserverKeyHash() external view returns (bytes32);\n}\n" + }, + "contracts/processors/keyHashAdapters/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/processors/keyHashAdapters/ManagedKeyHashAdapter.sol": { + "content": "//SPDX-License-Identifier: MIT\n\nimport { Ownable } from \"@openzeppelin/contracts/access/Ownable.sol\";\n\nimport { IKeyHashAdapter } from \"./IKeyHashAdapter.sol\";\n\npragma solidity ^0.8.18;\n\ncontract ManagedKeyHashAdapter is Ownable, IKeyHashAdapter {\n \n /* ============ State Variables ============ */\n\n bytes32 public mailserverKeyHash;\n\n /* ============ Constructor ============ */\n\n constructor(\n bytes32 _mailserverKeyHash\n )\n Ownable()\n {\n mailserverKeyHash = _mailserverKeyHash;\n }\n\n /* ============ External Functions ============ */\n\n function setMailserverKeyHash(bytes32 _mailserverKeyHash) external onlyOwner {\n mailserverKeyHash = _mailserverKeyHash;\n }\n}\n" + }, + "contracts/processors/keyHashAdapters/ManagedKeyHashAdapterV2.sol": { + "content": "//SPDX-License-Identifier: MIT\n\nimport { Ownable } from \"@openzeppelin/contracts/access/Ownable.sol\";\n\nimport { IKeyHashAdapterV2 } from \"./IKeyHashAdapterV2.sol\";\nimport { Bytes32ArrayUtils } from \"../../external/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/processors/nullifierRegistries/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/processors/nullifierRegistries/NullifierRegistry.sol": { + "content": "//SPDX-License-Identifier: MIT\n\nimport { Ownable } from \"@openzeppelin/contracts/access/Ownable.sol\";\n\nimport { AddressArrayUtils } from \"../../external/AddressArrayUtils.sol\";\nimport { INullifierRegistry } from \"./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/processors/TLSBaseProcessor.sol": { + "content": "//SPDX-License-Identifier: MIT\n\nimport { ECDSA } from \"@openzeppelin/contracts/utils/cryptography/ECDSA.sol\";\nimport { Ownable } from \"@openzeppelin/contracts/access/Ownable.sol\";\nimport { SignatureChecker } from \"@openzeppelin/contracts/utils/cryptography/SignatureChecker.sol\";\n\nimport { INullifierRegistry } from \"./nullifierRegistries/INullifierRegistry.sol\";\n\npragma solidity ^0.8.18;\n\ncontract TLSBaseProcessor is Ownable {\n\n using SignatureChecker for address;\n using ECDSA for bytes32;\n\n /* ============ Modifiers ============ */\n modifier onlyRamp() {\n require(msg.sender == ramp, \"Only Ramp can call this function\");\n _;\n }\n\n /* ============ State Variables ============ */\n address public immutable ramp;\n string public endpoint;\n string public host;\n\n INullifierRegistry public nullifierRegistry;\n uint256 public timestampBuffer;\n\n /* ============ Constructor ============ */\n constructor(\n address _ramp,\n INullifierRegistry _nullifierRegistry,\n uint256 _timestampBuffer,\n string memory _endpoint,\n string memory _host\n )\n Ownable()\n {\n ramp = _ramp;\n endpoint = _endpoint;\n host = _host;\n\n nullifierRegistry = _nullifierRegistry;\n timestampBuffer = _timestampBuffer;\n }\n\n /* ============ External Functions ============ */\n\n /**\n * @notice ONLY OWNER: Sets the timestamp buffer for validated TLS calls. 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 TLS calls\n */\n function setTimestampBuffer(uint256 _timestampBuffer) external onlyOwner {\n timestampBuffer = _timestampBuffer;\n }\n\n /* ============ Internal Functions ============ */\n\n function _validateTLSEndpoint(\n string memory _expectedEndpoint,\n string memory _passedEndpoint\n )\n internal\n pure\n {\n require(\n keccak256(abi.encode(_expectedEndpoint)) == keccak256(abi.encode(_passedEndpoint)),\n \"Endpoint does not match expected\"\n );\n }\n\n function _validateTLSHost(\n string memory _expectedHost,\n string memory _passedHost\n )\n internal\n pure\n {\n require(\n keccak256(abi.encode(_expectedHost)) == keccak256(abi.encode(_passedHost)),\n \"Host does not match expected\"\n );\n }\n\n function _validateAndAddNullifier(bytes32 _nullifier) internal {\n require(!nullifierRegistry.isNullified(_nullifier), \"Nullifier has already been used\");\n nullifierRegistry.addNullifier(_nullifier);\n }\n\n function _isValidSignature(\n bytes memory _message,\n bytes memory _signature,\n address _signer\n )\n internal\n view\n returns(bool)\n {\n bytes32 verifierPayload = keccak256(_message).toEthSignedMessageHash();\n\n return _signer.isValidSignatureNow(verifierPayload, _signature);\n }\n}\n" + }, + "contracts/ramps/garanti/GarantiRamp.sol": { + "content": "//SPDX-License-Identifier: MIT\n\nimport { IERC20 } from \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\nimport { Ownable } from \"@openzeppelin/contracts/access/Ownable.sol\";\n\nimport { Bytes32ArrayUtils } from \"../../external/Bytes32ArrayUtils.sol\";\nimport { Uint256ArrayUtils } from \"../../external/Uint256ArrayUtils.sol\";\n\nimport { IPoseidon3 } from \"../../interfaces/IPoseidon3.sol\";\nimport { IPoseidon6 } from \"../../interfaces/IPoseidon6.sol\";\nimport { IGarantiBodySuffixHashVerifier } from \"./interfaces/IGarantiBodySuffixHashVerifier.sol\";\nimport { IGarantiRegistrationProcessor } from \"./interfaces/IGarantiRegistrationProcessor.sol\";\nimport { IGarantiSendProcessor } from \"./interfaces/IGarantiSendProcessor.sol\";\n\npragma solidity ^0.8.18;\n\ncontract GarantiRamp is Ownable {\n\n using Bytes32ArrayUtils for bytes32[];\n using Uint256ArrayUtils for uint256[];\n\n /* ============ Events ============ */\n event AccountRegistered(address indexed accountOwner, bytes32 indexed idHash);\n event DepositReceived(\n uint256 indexed depositId,\n bytes32 indexed idHash,\n uint256 amount,\n uint256 conversionRate\n );\n event IntentSignaled(\n bytes32 indexed intentHash,\n uint256 indexed depositId,\n bytes32 indexed idHash,\n address to,\n uint256 amount,\n uint256 timestamp\n );\n\n event IntentPruned(\n bytes32 indexed intentHash,\n uint256 indexed depositId\n );\n // Do we want to emit the onRamper or the idHash\n event IntentFulfilled(\n bytes32 indexed intentHash,\n uint256 indexed depositId,\n address indexed onRamper,\n address to,\n uint256 amount,\n uint256 feeAmount\n );\n event DepositWithdrawn(\n uint256 indexed depositId,\n address indexed depositor,\n uint256 amount\n );\n\n event DepositClosed(uint256 depositId, address depositor);\n event UserAddedToDenylist(bytes32 listOwner, bytes32 deniedUser);\n event UserRemovedFromDenylist(bytes32 listOwner, bytes32 approvedUser);\n event MinDepositAmountSet(uint256 minDepositAmount);\n event MaxOnRampAmountSet(uint256 maxOnRampAmount);\n event IntentExpirationPeriodSet(uint256 intentExpirationPeriod);\n event OnRampCooldownPeriodSet(uint256 onRampCooldownPeriod);\n event SustainabilityFeeUpdated(uint256 fee);\n event SustainabilityFeeRecipientUpdated(address feeRecipient);\n event NewSendProcessorSet(address sendProcessor);\n event NewRegistrationProcessorSet(address registrationProcessor);\n event NewReceiveProcessorSet(address receiveProcessor);\n\n /* ============ Structs ============ */\n\n // Each Account is tied to a GlobalAccount via its associated idHash. Each account is represented by an Ethereum address\n // and is allowed to have at most 5 deposits associated with it.\n struct AccountInfo {\n bytes32 idHash; // Hash of payment processor id\n uint256[] deposits; // Array of open account deposits\n }\n\n struct Deposit {\n address depositor;\n string garantiIban; // IBAN number of the depositor with spacing as such: \"TR## #### #### #### #### #### ##\"\n string garantiName; // Name given for Garanti IBAN account, necessary for on-rampers to complete on-ramp\n uint256 depositAmount; // Amount of USDC deposited\n uint256 remainingDeposits; // Amount of remaining deposited liquidity\n uint256 outstandingIntentAmount; // Amount of outstanding intents (may include expired intents)\n uint256 conversionRate; // Conversion required by off-ramper between USDC/USD\n bytes32[] intentHashes; // Array of hashes of all open intents (may include some expired if not pruned)\n }\n\n struct DepositWithAvailableLiquidity {\n uint256 depositId; // ID of the deposit\n bytes32 depositorIdHash; // Depositor's idHash \n Deposit deposit; // Deposit struct\n uint256 availableLiquidity; // Amount of liquidity available to signal intents (net of expired intents)\n }\n\n struct Intent {\n address onRamper; // On-ramper's address\n address to; // Address to forward funds to (can be same as onRamper)\n uint256 deposit; // ID of the deposit the intent is signaling on\n uint256 amount; // Amount of USDC the on-ramper signals intent for on-chain\n uint256 intentTimestamp; // Timestamp of when the intent was signaled\n }\n\n struct IntentWithOnRamperId {\n bytes32 intentHash; // Intent hash\n Intent intent; // Intent struct\n bytes32 onRamperIdHash; // Poseidon hash of the on-ramper's idHash\n }\n\n struct DenyList {\n bytes32[] deniedUsers; // Array of idHashes that are denied from taking depositors liquidity\n mapping(bytes32 => bool) isDenied; // Mapping of idHash to boolean indicating if the user is denied\n }\n\n // A Global Account is defined as an account represented by one idHash. This is used to enforce limitations on actions across\n // all Ethereum addresses that are associated with that idHash. In this case we use it to enforce a cooldown period between on ramps,\n // restrict each Garanti account to one outstanding intent at a time, and to enforce deny lists.\n struct GlobalAccountInfo {\n bytes32 currentIntentHash; // Hash of the current open intent (if exists)\n uint256 lastOnrampTimestamp; // Timestamp of the last on-ramp transaction used to check if cooldown period elapsed\n DenyList denyList; // Deny list of the account\n }\n\n /* ============ Modifiers ============ */\n modifier onlyRegisteredUser() {\n require(accounts[msg.sender].idHash != bytes32(0), \"Caller must be registered user\");\n _;\n }\n\n /* ============ Constants ============ */\n uint256 internal constant PRECISE_UNIT = 1e18;\n uint256 internal constant MAX_DEPOSITS = 5; // An account can only have max 5 different deposit parameterizations to prevent locking funds\n uint256 constant CIRCOM_PRIME_FIELD = 21888242871839275222246405745257275088548364400416034343698204186575808495617;\n uint256 constant MAX_SUSTAINABILITY_FEE = 5e16; // 5% max sustainability fee\n \n /* ============ State Variables ============ */\n IERC20 public immutable usdc; // USDC token contract\n IGarantiRegistrationProcessor public registrationProcessor; // Address of registration processor contract, verifies registration e-mails\n IGarantiSendProcessor public sendProcessor; // Address of send processor contract, verifies onRamp emails\n\n bool public isInitialized; // Indicates if contract has been initialized\n\n mapping(bytes32 => GlobalAccountInfo) internal globalAccount; // Mapping of idHash to information used to enforce actions across Ethereum accounts\n mapping(address => AccountInfo) internal accounts; // Mapping of Ethereum accounts to their account information (idHash and deposits)\n mapping(uint256 => Deposit) public deposits; // Mapping of depositIds to deposit structs\n mapping(bytes32 => Intent) public intents; // Mapping of intentHashes to intent structs\n\n uint256 public minDepositAmount; // Minimum amount of USDC that can be deposited\n uint256 public maxOnRampAmount; // Maximum amount of USDC that can be on-ramped in a single transaction\n uint256 public onRampCooldownPeriod; // Time period that must elapse between completing an on-ramp and signaling a new intent\n uint256 public intentExpirationPeriod; // Time period after which an intent can be pruned from the system\n uint256 public sustainabilityFee; // Fee charged to on-rampers in preciseUnits (1e16 = 1%)\n address public sustainabilityFeeRecipient; // Address that receives the sustainability fee\n\n uint256 public depositCounter; // Counter for depositIds\n\n /* ============ Constructor ============ */\n constructor(\n address _owner,\n IERC20 _usdc,\n uint256 _minDepositAmount,\n uint256 _maxOnRampAmount,\n uint256 _intentExpirationPeriod,\n uint256 _onRampCooldownPeriod,\n uint256 _sustainabilityFee,\n address _sustainabilityFeeRecipient\n )\n Ownable()\n {\n usdc = _usdc;\n minDepositAmount = _minDepositAmount;\n maxOnRampAmount = _maxOnRampAmount;\n intentExpirationPeriod = _intentExpirationPeriod;\n onRampCooldownPeriod = _onRampCooldownPeriod;\n sustainabilityFee = _sustainabilityFee;\n sustainabilityFeeRecipient = _sustainabilityFeeRecipient;\n\n transferOwnership(_owner);\n }\n\n /* ============ External Functions ============ */\n\n /**\n * @notice Initialize Ramp with the addresses of the Processors\n *\n * @param _registrationProcessor Registration processor address\n * @param _sendProcessor Send processor address\n */\n function initialize(\n IGarantiRegistrationProcessor _registrationProcessor,\n IGarantiSendProcessor _sendProcessor\n )\n external\n onlyOwner\n {\n require(!isInitialized, \"Already initialized\");\n\n registrationProcessor = _registrationProcessor;\n sendProcessor = _sendProcessor;\n\n isInitialized = true;\n }\n\n /**\n * @notice Registers a new account by pulling the hash of the account id from the proof and assigning the account owner to the\n * sender of the transaction. One Garanti account can be registered to multiple Ethereum addresses.\n *\n * @param _proof Parameters and signals for registration email proof\n * @param _bodyHashProof Parameters and signals for body hash proof\n */\n function register(\n IGarantiRegistrationProcessor.RegistrationProof calldata _proof,\n IGarantiBodySuffixHashVerifier.BodySuffixHashProof calldata _bodyHashProof\n )\n external\n {\n require(accounts[msg.sender].idHash == bytes32(0), \"Account already associated with idHash\");\n bytes32 idHash = _verifyRegistrationProof(_proof, _bodyHashProof);\n\n accounts[msg.sender].idHash = idHash;\n\n emit AccountRegistered(msg.sender, idHash);\n }\n\n /**\n * @notice Generates a deposit entry for off-rampers that can then be fulfilled by an on-ramper. This function will not add to\n * previous deposits. Every deposit has it's own unique identifier. User must approve the contract to transfer the deposit amount\n * of USDC.\n *\n * @param _garantiIban IBAN number of the depositor with spacing as such: \"TR## #### #### #### #### #### ##\"\n * @param _garantiName Name given for Garanti IBAN account, necessary for on-rampers to complete on-ramp\n * @param _depositAmount The amount of USDC to off-ramp\n * @param _receiveAmount The amount of USD to receive\n */\n function offRamp(\n string memory _garantiIban,\n string memory _garantiName,\n uint256 _depositAmount,\n uint256 _receiveAmount\n )\n external\n onlyRegisteredUser\n {\n require(isValidIban(_garantiIban), \"Invalid IBAN\");\n require(accounts[msg.sender].deposits.length < MAX_DEPOSITS, \"Maximum deposit amount reached\");\n require(_depositAmount >= minDepositAmount, \"Deposit amount must be greater than min deposit amount\");\n require(_receiveAmount > 0, \"Receive amount must be greater than 0\");\n\n uint256 conversionRate = (_depositAmount * PRECISE_UNIT) / _receiveAmount;\n uint256 depositId = depositCounter++;\n\n AccountInfo storage account = accounts[msg.sender];\n account.deposits.push(depositId);\n\n deposits[depositId] = Deposit({\n depositor: msg.sender,\n garantiIban: _garantiIban,\n garantiName: _garantiName,\n depositAmount: _depositAmount,\n remainingDeposits: _depositAmount,\n outstandingIntentAmount: 0,\n conversionRate: conversionRate,\n intentHashes: new bytes32[](0)\n });\n\n usdc.transferFrom(msg.sender, address(this), _depositAmount);\n\n emit DepositReceived(depositId, account.idHash, _depositAmount, conversionRate);\n }\n\n /**\n * @notice Signals intent to pay the depositor defined in the _depositId the _amount * deposit conversionRate off-chain\n * in order to unlock _amount of funds on-chain. Each user can only have one outstanding intent at a time regardless of\n * address (tracked using idHash). Caller must not be on the depositor's deny list. If there are prunable intents then\n * they will be deleted from the deposit to be able to maintain state hygiene.\n *\n * @param _depositId The ID of the deposit the on-ramper intends to use for \n * @param _amount The amount of USDC the user wants to on-ramp\n * @param _to Address to forward funds to (can be same as onRamper)\n */\n function signalIntent(uint256 _depositId, uint256 _amount, address _to) external onlyRegisteredUser {\n bytes32 idHash = accounts[msg.sender].idHash;\n Deposit storage deposit = deposits[_depositId];\n bytes32 depositorIdHash = accounts[deposit.depositor].idHash;\n\n // Caller validity checks\n require(!globalAccount[depositorIdHash].denyList.isDenied[idHash], \"Onramper on depositor's denylist\");\n require(\n globalAccount[idHash].lastOnrampTimestamp + onRampCooldownPeriod <= block.timestamp,\n \"On ramp cool down period not elapsed\"\n );\n require(globalAccount[idHash].currentIntentHash == bytes32(0), \"Intent still outstanding\");\n require(depositorIdHash != idHash, \"Sender cannot be the depositor\");\n\n // Intent information checks\n require(deposit.depositor != address(0), \"Deposit does not exist\");\n require(_amount > 0, \"Signaled amount must be greater than 0\");\n require(_amount <= maxOnRampAmount, \"Signaled amount must be less than max on-ramp amount\");\n require(_to != address(0), \"Cannot send to zero address\");\n\n bytes32 intentHash = _calculateIntentHash(idHash, _depositId);\n\n if (deposit.remainingDeposits < _amount) {\n (\n bytes32[] memory prunableIntents,\n uint256 reclaimableAmount\n ) = _getPrunableIntents(_depositId);\n\n require(deposit.remainingDeposits + reclaimableAmount >= _amount, \"Not enough liquidity\");\n\n _pruneIntents(deposit, prunableIntents);\n deposit.remainingDeposits += reclaimableAmount;\n deposit.outstandingIntentAmount -= reclaimableAmount;\n }\n\n intents[intentHash] = Intent({\n onRamper: msg.sender,\n to: _to,\n deposit: _depositId,\n amount: _amount,\n intentTimestamp: block.timestamp\n });\n\n globalAccount[idHash].currentIntentHash = intentHash;\n\n deposit.remainingDeposits -= _amount;\n deposit.outstandingIntentAmount += _amount;\n deposit.intentHashes.push(intentHash);\n\n emit IntentSignaled(intentHash, _depositId, idHash, _to, _amount, block.timestamp);\n }\n\n /**\n * @notice Only callable by the originator of the intent. Cancels an outstanding intent thus allowing user to signal a new\n * intent. Deposit state is updated to reflect the cancelled intent.\n *\n * @param _intentHash Hash of intent being cancelled\n */\n function cancelIntent(bytes32 _intentHash) external {\n Intent memory intent = intents[_intentHash];\n \n require(intent.intentTimestamp != 0, \"Intent does not exist\");\n require(\n accounts[intent.onRamper].idHash == accounts[msg.sender].idHash,\n \"Sender must be the on-ramper\"\n );\n\n Deposit storage deposit = deposits[intent.deposit];\n\n _pruneIntent(deposit, _intentHash);\n\n deposit.remainingDeposits += intent.amount;\n deposit.outstandingIntentAmount -= intent.amount;\n }\n\n /**\n * @notice Anyone can submit an on-ramp transaction, even if caller isn't on-ramper. Upon submission the proof is validated,\n * intent is removed, and deposit state is updated. USDC is transferred to the on-ramper.\n *\n * @param _proof Parameters and signals for send email proof\n * @param _bodyHashProof Parameters and signals for body hash proof\n */\n function onRamp(\n IGarantiSendProcessor.SendProof calldata _proof,\n IGarantiBodySuffixHashVerifier.BodySuffixHashProof calldata _bodyHashProof\n )\n external\n {\n (\n Intent memory intent,\n Deposit storage deposit,\n bytes32 intentHash\n ) = _verifyOnRampProof(_proof, _bodyHashProof);\n\n _pruneIntent(deposit, intentHash);\n\n deposit.outstandingIntentAmount -= intent.amount;\n globalAccount[accounts[intent.onRamper].idHash].lastOnrampTimestamp = block.timestamp;\n _closeDepositIfNecessary(intent.deposit, deposit);\n\n _transferFunds(intentHash, intent);\n }\n\n /**\n * @notice Allows off-ramper to release funds to the on-ramper in case of a failed on-ramp or because of some other arrangement\n * between the two parties. Upon submission we check to make sure the msg.sender is the depositor, the intent is removed, and \n * deposit state is updated. USDC is transferred to the on-ramper.\n *\n * @param _intentHash Hash of intent to resolve by releasing the funds\n */\n function releaseFundsToOnramper(bytes32 _intentHash) external {\n Intent memory intent = intents[_intentHash];\n Deposit storage deposit = deposits[intent.deposit];\n\n require(intent.onRamper != address(0), \"Intent does not exist\");\n require(deposit.depositor == msg.sender, \"Caller must be the depositor\");\n\n _pruneIntent(deposit, _intentHash);\n\n deposit.outstandingIntentAmount -= intent.amount;\n globalAccount[accounts[intent.onRamper].idHash].lastOnrampTimestamp = block.timestamp;\n _closeDepositIfNecessary(intent.deposit, deposit);\n\n _transferFunds(_intentHash, intent);\n }\n\n /**\n * @notice Caller must be the depositor for each depositId in the array, if not whole function fails. Depositor is returned all\n * remaining deposits and any outstanding intents that are expired. If an intent is not expired then those funds will not be\n * returned. Deposit will be deleted as long as there are no more outstanding intents.\n *\n * @param _depositIds Array of depositIds the depositor is attempting to withdraw\n */\n function withdrawDeposit(uint256[] memory _depositIds) external {\n uint256 returnAmount;\n\n for (uint256 i = 0; i < _depositIds.length; ++i) {\n uint256 depositId = _depositIds[i];\n Deposit storage deposit = deposits[depositId];\n\n require(deposit.depositor == msg.sender, \"Sender must be the depositor\");\n\n (\n bytes32[] memory prunableIntents,\n uint256 reclaimableAmount\n ) = _getPrunableIntents(depositId);\n\n _pruneIntents(deposit, prunableIntents);\n\n returnAmount += deposit.remainingDeposits + reclaimableAmount;\n \n deposit.outstandingIntentAmount -= reclaimableAmount;\n\n emit DepositWithdrawn(depositId, deposit.depositor, deposit.remainingDeposits + reclaimableAmount);\n \n delete deposit.remainingDeposits;\n _closeDepositIfNecessary(depositId, deposit);\n }\n\n usdc.transfer(msg.sender, returnAmount);\n }\n\n /**\n * @notice Adds an idHash to a depositor's deny list. If an address associated with the banned idHash attempts to\n * signal an intent on the user's deposit they will be denied.\n *\n * @param _deniedUser Poseidon hash of the idHash being banned\n */\n function addAccountToDenylist(bytes32 _deniedUser) external onlyRegisteredUser {\n bytes32 denyingUser = accounts[msg.sender].idHash;\n\n require(!globalAccount[denyingUser].denyList.isDenied[_deniedUser], \"User already on denylist\");\n\n globalAccount[denyingUser].denyList.isDenied[_deniedUser] = true;\n globalAccount[denyingUser].denyList.deniedUsers.push(_deniedUser);\n\n emit UserAddedToDenylist(denyingUser, _deniedUser);\n }\n\n /**\n * @notice Removes a idHash from a depositor's deny list.\n *\n * @param _approvedUser Poseidon hash of the idHash being approved\n */\n function removeAccountFromDenylist(bytes32 _approvedUser) external onlyRegisteredUser {\n bytes32 approvingUser = accounts[msg.sender].idHash;\n\n require(globalAccount[approvingUser].denyList.isDenied[_approvedUser], \"User not on denylist\");\n\n globalAccount[approvingUser].denyList.isDenied[_approvedUser] = false;\n globalAccount[approvingUser].denyList.deniedUsers.removeStorage(_approvedUser);\n\n emit UserRemovedFromDenylist(approvingUser, _approvedUser);\n }\n\n /* ============ Governance Functions ============ */\n\n /**\n * @notice GOVERNANCE ONLY: Updates the send processor address used for validating and interpreting zk proofs.\n *\n * @param _sendProcessor New send proccesor address\n */\n function setSendProcessor(IGarantiSendProcessor _sendProcessor) external onlyOwner {\n sendProcessor = _sendProcessor;\n emit NewSendProcessorSet(address(_sendProcessor));\n }\n\n /**\n * @notice GOVERNANCE ONLY: Updates the registration processor address used for validating and interpreting zk proofs.\n *\n * @param _registrationProcessor New registration proccesor address\n */\n function setRegistrationProcessor(IGarantiRegistrationProcessor _registrationProcessor) external onlyOwner {\n registrationProcessor = _registrationProcessor;\n emit NewRegistrationProcessorSet(address(_registrationProcessor));\n }\n\n /**\n * @notice GOVERNANCE ONLY: Updates the minimum deposit amount a user can specify for off-ramping.\n *\n * @param _minDepositAmount The new minimum deposit amount\n */\n function setMinDepositAmount(uint256 _minDepositAmount) external onlyOwner {\n require(_minDepositAmount != 0, \"Minimum deposit cannot be zero\");\n\n minDepositAmount = _minDepositAmount;\n emit MinDepositAmountSet(_minDepositAmount);\n }\n\n /**\n * @notice GOVERNANCE ONLY: Updates the sustainability fee. This fee is charged to on-rampers upon a successful on-ramp.\n *\n * @param _fee The new sustainability fee in precise units (10**18, ie 10% = 1e17)\n */\n function setSustainabilityFee(uint256 _fee) external onlyOwner {\n require(_fee <= MAX_SUSTAINABILITY_FEE, \"Fee cannot be greater than max fee\");\n\n sustainabilityFee = _fee;\n emit SustainabilityFeeUpdated(_fee);\n }\n\n /**\n * @notice GOVERNANCE ONLY: Updates the recepient of sustainability fees.\n *\n * @param _feeRecipient The new fee recipient address\n */\n function setSustainabilityFeeRecipient(address _feeRecipient) external onlyOwner {\n require(_feeRecipient != address(0), \"Fee recipient cannot be zero address\");\n\n sustainabilityFeeRecipient = _feeRecipient;\n emit SustainabilityFeeRecipientUpdated(_feeRecipient);\n }\n\n /**\n * @notice GOVERNANCE ONLY: Updates the max amount allowed to be on-ramped in each transaction. To on-ramp more than\n * this amount a user must make multiple transactions.\n *\n * @param _maxOnRampAmount The new max on ramp amount\n */\n function setMaxOnRampAmount(uint256 _maxOnRampAmount) external onlyOwner {\n require(_maxOnRampAmount != 0, \"Max on ramp amount cannot be zero\");\n\n maxOnRampAmount = _maxOnRampAmount;\n emit MaxOnRampAmountSet(_maxOnRampAmount);\n }\n\n /**\n * @notice GOVERNANCE ONLY: Updates the on-ramp cooldown period, once an on-ramp transaction is completed the user must wait this\n * amount of time before they can signalIntent to on-ramp again.\n *\n * @param _onRampCooldownPeriod New on-ramp cooldown period\n */\n function setOnRampCooldownPeriod(uint256 _onRampCooldownPeriod) external onlyOwner {\n onRampCooldownPeriod = _onRampCooldownPeriod;\n emit OnRampCooldownPeriodSet(_onRampCooldownPeriod);\n }\n\n /**\n * @notice GOVERNANCE ONLY: Updates the intent expiration period, after this period elapses an intent can be pruned to prevent\n * locking up a depositor's funds.\n *\n * @param _intentExpirationPeriod New intent expiration period\n */\n function setIntentExpirationPeriod(uint256 _intentExpirationPeriod) external onlyOwner {\n require(_intentExpirationPeriod != 0, \"Max intent expiration period cannot be zero\");\n\n intentExpirationPeriod = _intentExpirationPeriod;\n emit IntentExpirationPeriodSet(_intentExpirationPeriod);\n }\n\n\n /* ============ External View Functions ============ */\n\n function getDeposit(uint256 _depositId) external view returns (Deposit memory) {\n return deposits[_depositId];\n }\n\n function getAccountInfo(address _account) external view returns (AccountInfo memory) {\n return accounts[_account];\n }\n\n function getIdCurrentIntentHash(address _account) external view returns (bytes32) {\n return globalAccount[accounts[_account].idHash].currentIntentHash;\n }\n\n function getLastOnRampTimestamp(address _account) external view returns (uint256) {\n return globalAccount[accounts[_account].idHash].lastOnrampTimestamp;\n }\n\n function getDeniedUsers(address _account) external view returns (bytes32[] memory) {\n return globalAccount[accounts[_account].idHash].denyList.deniedUsers;\n }\n\n function isDeniedUser(address _account, bytes32 _deniedUser) external view returns (bool) {\n return globalAccount[accounts[_account].idHash].denyList.isDenied[_deniedUser];\n }\n\n function getIntentsWithOnRamperId(bytes32[] calldata _intentHashes) external view returns (IntentWithOnRamperId[] memory) {\n IntentWithOnRamperId[] memory intentsWithOnRamperId = new IntentWithOnRamperId[](_intentHashes.length);\n\n for (uint256 i = 0; i < _intentHashes.length; ++i) {\n bytes32 intentHash = _intentHashes[i];\n Intent memory intent = intents[intentHash];\n intentsWithOnRamperId[i] = IntentWithOnRamperId({\n intentHash: _intentHashes[i],\n intent: intent,\n onRamperIdHash: accounts[intent.onRamper].idHash\n });\n }\n\n return intentsWithOnRamperId;\n }\n\n function getAccountDeposits(address _account) external view returns (DepositWithAvailableLiquidity[] memory accountDeposits) {\n uint256[] memory accountDepositIds = accounts[_account].deposits;\n accountDeposits = new DepositWithAvailableLiquidity[](accountDepositIds.length);\n \n for (uint256 i = 0; i < accountDepositIds.length; ++i) {\n uint256 depositId = accountDepositIds[i];\n Deposit memory deposit = deposits[depositId];\n ( , uint256 reclaimableAmount) = _getPrunableIntents(depositId);\n\n accountDeposits[i] = DepositWithAvailableLiquidity({\n depositId: depositId,\n depositorIdHash: accounts[deposit.depositor].idHash,\n deposit: deposit,\n availableLiquidity: deposit.remainingDeposits + reclaimableAmount\n });\n }\n }\n\n function getDepositFromIds(uint256[] memory _depositIds) external view returns (DepositWithAvailableLiquidity[] memory depositArray) {\n depositArray = new DepositWithAvailableLiquidity[](_depositIds.length);\n\n for (uint256 i = 0; i < _depositIds.length; ++i) {\n uint256 depositId = _depositIds[i];\n Deposit memory deposit = deposits[depositId];\n ( , uint256 reclaimableAmount) = _getPrunableIntents(depositId);\n\n depositArray[i] = DepositWithAvailableLiquidity({\n depositId: depositId,\n depositorIdHash: accounts[deposit.depositor].idHash,\n deposit: deposit,\n availableLiquidity: deposit.remainingDeposits + reclaimableAmount\n });\n }\n\n return depositArray;\n }\n\n function isValidIban(string memory _iban) public pure returns(bool) {\n bytes memory ibanBytes = bytes(_iban);\n if(ibanBytes.length != 32) { return false; }\n\n for (uint256 i = 0; i < ibanBytes.length; ++i) {\n if (i < 2) {\n if(ibanBytes[i] < 0x41 || ibanBytes[i] > 0x5a) { return false; }\n } else if (i % 5 == 4) {\n // i = 4, 9, 14, 19, 24, 29 should be spaces\n if(ibanBytes[i] != 0x20) { return false; }\n } else {\n if(ibanBytes[i] < 0x30 || ibanBytes[i] > 0x39) { return false; }\n }\n }\n\n return true;\n }\n\n /* ============ Internal Functions ============ */\n\n /**\n * @notice Calculates the intentHash of new intent\n */\n function _calculateIntentHash(\n bytes32 _idHash,\n uint256 _depositId\n )\n internal\n view\n virtual\n returns (bytes32 intentHash)\n {\n // Mod with circom prime field to make sure it fits in a 254-bit field\n uint256 intermediateHash = uint256(keccak256(abi.encodePacked(_idHash, _depositId, block.timestamp)));\n intentHash = bytes32(intermediateHash % CIRCOM_PRIME_FIELD);\n }\n\n /**\n * @notice Cycles through all intents currently open on a deposit and sees if any have expired. If they have expired\n * the outstanding amounts are summed and returned alongside the intentHashes\n */\n function _getPrunableIntents(\n uint256 _depositId\n )\n internal\n view\n returns(bytes32[] memory prunableIntents, uint256 reclaimedAmount)\n {\n bytes32[] memory intentHashes = deposits[_depositId].intentHashes;\n prunableIntents = new bytes32[](intentHashes.length);\n\n for (uint256 i = 0; i < intentHashes.length; ++i) {\n Intent memory intent = intents[intentHashes[i]];\n if (intent.intentTimestamp + intentExpirationPeriod < block.timestamp) {\n prunableIntents[i] = intentHashes[i];\n reclaimedAmount += intent.amount;\n }\n }\n }\n\n function _pruneIntents(Deposit storage _deposit, bytes32[] memory _intents) internal {\n for (uint256 i = 0; i < _intents.length; ++i) {\n if (_intents[i] != bytes32(0)) {\n _pruneIntent(_deposit, _intents[i]);\n }\n }\n }\n\n /**\n * @notice Pruning an intent involves deleting its state from the intents mapping, zeroing out the intendee's currentIntentHash in\n * their global account mapping, and deleting the intentHash from the deposit's intentHashes array.\n */\n function _pruneIntent(Deposit storage _deposit, bytes32 _intentHash) internal {\n Intent memory intent = intents[_intentHash];\n\n delete globalAccount[accounts[intent.onRamper].idHash].currentIntentHash;\n delete intents[_intentHash];\n _deposit.intentHashes.removeStorage(_intentHash);\n\n emit IntentPruned(_intentHash, intent.deposit);\n }\n\n /**\n * @notice Removes a deposit if no outstanding intents AND no remaining deposits. Deleting a deposit deletes it from the\n * deposits mapping and removes tracking it in the user's accounts mapping.\n */\n function _closeDepositIfNecessary(uint256 _depositId, Deposit storage _deposit) internal {\n uint256 openDepositAmount = _deposit.outstandingIntentAmount + _deposit.remainingDeposits;\n if (openDepositAmount == 0) {\n accounts[_deposit.depositor].deposits.removeStorage(_depositId);\n emit DepositClosed(_depositId, _deposit.depositor);\n delete deposits[_depositId];\n }\n }\n\n /**\n * @notice Checks if sustainability fee has been defined, if so sends fee to the fee recipient and intent amount minus fee\n * to the on-ramper. If sustainability fee is undefined then full intent amount is transferred to on-ramper.\n */\n function _transferFunds(bytes32 _intentHash, Intent memory _intent) internal {\n uint256 fee;\n if (sustainabilityFee != 0) {\n fee = (_intent.amount * sustainabilityFee) / PRECISE_UNIT;\n usdc.transfer(sustainabilityFeeRecipient, fee);\n }\n\n uint256 onRampAmount = _intent.amount - fee;\n usdc.transfer(_intent.to, onRampAmount);\n\n emit IntentFulfilled(_intentHash, _intent.deposit, _intent.onRamper, _intent.to, onRampAmount, fee);\n }\n\n /**\n * @notice Validate send payment email and check that it hasn't already been used (done on SendProcessor).\n * Additionally, we validate that the offRamperIdHash matches the one from the specified intent and that enough\n * was paid off-chain inclusive of the conversionRate.\n */\n function _verifyOnRampProof(\n IGarantiSendProcessor.SendProof calldata _proof,\n IGarantiBodySuffixHashVerifier.BodySuffixHashProof calldata _bodyHashProof\n )\n internal\n returns(Intent memory, Deposit storage, bytes32)\n {\n (\n uint256 amount,\n uint256 timestamp,\n bytes32 offRamperNameHash,\n bytes32 offRamperIdHash,\n bytes32 onRamperIdHash,\n bytes32 intentHash\n ) = sendProcessor.processProof(_proof, _bodyHashProof);\n\n Intent memory intent = intents[intentHash];\n Deposit storage deposit = deposits[intent.deposit];\n\n require(intent.onRamper != address(0), \"Intent does not exist\");\n require(intent.intentTimestamp <= timestamp, \"Intent was not created before send\");\n require(keccak256(abi.encodePacked(deposit.garantiName)) == offRamperNameHash, \"Offramper id does not match\");\n require(keccak256(abi.encodePacked(deposit.garantiIban)) == offRamperIdHash, \"Offramper id does not match\");\n require(accounts[intent.onRamper].idHash == onRamperIdHash, \"Onramper id does not match\");\n require(amount >= (intent.amount * PRECISE_UNIT) / deposit.conversionRate, \"Payment was not enough\");\n\n return (intent, deposit, intentHash);\n }\n\n /**\n * @notice Validate the user has an Garanti account, we do not nullify this email since it can be reused to register under\n * different addresses.\n */\n function _verifyRegistrationProof(\n IGarantiRegistrationProcessor.RegistrationProof calldata _proof,\n IGarantiBodySuffixHashVerifier.BodySuffixHashProof calldata _bodyHashProof\n )\n internal\n returns(bytes32)\n {\n bytes32 idHash = registrationProcessor.processProof(_proof, _bodyHashProof);\n\n return idHash;\n }\n}\n" + }, + "contracts/ramps/garanti/GarantiRegistrationProcessor.sol": { + "content": "//SPDX-License-Identifier: MIT\n\nimport { StringUtils } from \"@zk-email/contracts/utils/StringUtils.sol\";\n\nimport { BaseProcessorV2 } from \"../../processors/BaseProcessorV2.sol\";\nimport { Groth16Verifier } from \"../../verifiers/garanti_registration_verifier.sol\";\nimport { IGarantiBodySuffixHashVerifier } from \"./interfaces/IGarantiBodySuffixHashVerifier.sol\";\nimport { IGarantiRegistrationProcessor } from \"./interfaces/IGarantiRegistrationProcessor.sol\";\nimport { IKeyHashAdapterV2 } from \"../../processors/keyHashAdapters/IKeyHashAdapterV2.sol\";\nimport { INullifierRegistry } from \"../../processors/nullifierRegistries/INullifierRegistry.sol\";\n\npragma solidity ^0.8.18;\n\ncontract GarantiRegistrationProcessor is\n Groth16Verifier,\n IGarantiRegistrationProcessor,\n BaseProcessorV2\n{\n\n using StringUtils for uint256[];\n\n /* ============ Constants ============ */\n uint256 constant public PACK_SIZE = 7;\n\n /* ============ Public Variables ============ */\n IGarantiBodySuffixHashVerifier public bodyHashVerifier;\n \n /* ============ Constructor ============ */\n constructor(\n address _ramp,\n IKeyHashAdapterV2 _garantiMailserverKeyHashAdapter,\n INullifierRegistry _nullifierRegistry,\n IGarantiBodySuffixHashVerifier _bodyHashVerifier,\n string memory _emailFromAddress,\n uint256 _timestampBuffer\n )\n Groth16Verifier()\n BaseProcessorV2(\n _ramp,\n _garantiMailserverKeyHashAdapter,\n _nullifierRegistry,\n _emailFromAddress,\n _timestampBuffer\n )\n {\n bodyHashVerifier = _bodyHashVerifier;\n }\n\n /* ============ External Functions ============ */\n\n function processProof(\n IGarantiRegistrationProcessor.RegistrationProof calldata _proof,\n IGarantiBodySuffixHashVerifier.BodySuffixHashProof calldata _bodyHashProof\n )\n public\n override\n onlyRamp\n returns(bytes32 userIdHash)\n {\n require(this.verifyProof(_proof.a, _proof.b, _proof.c, _proof.signals), \"Invalid Proof\"); // checks effects iteractions, this should come first\n require(\n bodyHashVerifier.verifyProof(_bodyHashProof.a, _bodyHashProof.b, _bodyHashProof.c, _bodyHashProof.signals),\n \"Invalid body hash proof\"\n );\n _validateIntermediateHash(_proof.signals, _bodyHashProof.signals);\n\n require(isMailServerKeyHash(bytes32(_proof.signals[0])), \"Invalid mailserver key hash\");\n\n // Signals [5:10] are the packed from email address\n string memory fromEmail = _parseSignalArray(_proof.signals, 5, 10);\n require(keccak256(abi.encodePacked(fromEmail)) == keccak256(emailFromAddress), \"Invalid email from address\");\n\n _validateAndAddNullifier(keccak256(abi.encode(_proof)));\n\n // Signals [10] is the packed userIdHash\n userIdHash = bytes32(_proof.signals[10]);\n }\n\n /* ============ Internal Functions ============ */\n\n function _parseSignalArray(uint256[11] calldata _signals, uint8 _from, uint8 _to) internal pure returns (string memory) {\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 function _validateIntermediateHash(uint256[11] calldata _sendSignals, uint256[4] calldata _bodyHashSignals) internal pure {\n bytes32 intermediateHash = keccak256(abi.encode(_sendSignals[1], _sendSignals[2], _sendSignals[3], _sendSignals[4]));\n bytes32 inputHash = keccak256(abi.encode(_bodyHashSignals[0], _bodyHashSignals[1], _bodyHashSignals[2], _bodyHashSignals[3]));\n require(intermediateHash == inputHash, \"Invalid intermediate or output hash\");\n }\n}\n" + }, + "contracts/ramps/garanti/GarantiSendProcessor.sol": { + "content": "//SPDX-License-Identifier: MIT\n\nimport { StringUtils } from \"@zk-email/contracts/utils/StringUtils.sol\";\n\nimport { BaseProcessorV2 } from \"../../processors/BaseProcessorV2.sol\";\nimport { Groth16Verifier } from \"../../verifiers/garanti_send_verifier.sol\";\nimport { IGarantiBodySuffixHashVerifier } from \"./interfaces/IGarantiBodySuffixHashVerifier.sol\";\nimport { IGarantiSendProcessor } from \"./interfaces/IGarantiSendProcessor.sol\";\nimport { IKeyHashAdapterV2 } from \"../../processors/keyHashAdapters/IKeyHashAdapterV2.sol\";\nimport { INullifierRegistry } from \"../../processors/nullifierRegistries/INullifierRegistry.sol\";\nimport { StringConversionUtils } from \"../../lib/StringConversionUtils.sol\";\n\npragma solidity ^0.8.18;\n\ncontract GarantiSendProcessor is Groth16Verifier, IGarantiSendProcessor, BaseProcessorV2 {\n \n using StringUtils for uint256[];\n using StringConversionUtils for string;\n\n /* ============ Constants ============ */\n uint256 constant PACK_SIZE = 7;\n\n /* ============ Public Variables ============ */\n IGarantiBodySuffixHashVerifier public bodyHashVerifier;\n\n /* ============ Constructor ============ */\n constructor(\n address _ramp,\n IKeyHashAdapterV2 _garantiMailserverKeyHashAdapter,\n INullifierRegistry _nullifierRegistry,\n IGarantiBodySuffixHashVerifier _bodyHashVerifier,\n string memory _emailFromAddress,\n uint256 _timestampBuffer\n )\n Groth16Verifier()\n BaseProcessorV2(\n _ramp,\n _garantiMailserverKeyHashAdapter,\n _nullifierRegistry,\n _emailFromAddress,\n _timestampBuffer\n )\n {\n bodyHashVerifier = _bodyHashVerifier;\n }\n \n /* ============ External Functions ============ */\n function processProof(\n IGarantiSendProcessor.SendProof calldata _proof,\n IGarantiBodySuffixHashVerifier.BodySuffixHashProof calldata _bodyHashProof\n )\n public\n override\n onlyRamp\n returns(\n uint256 amount,\n uint256 timestamp,\n bytes32 offRamperNameHash,\n bytes32 offRamperIdHash,\n bytes32 onRamperIdHash,\n bytes32 intentHash\n )\n {\n require(this.verifyProof(_proof.a, _proof.b, _proof.c, _proof.signals), \"Invalid Proof\"); // checks effects iteractions, this should come first\n require(\n bodyHashVerifier.verifyProof(_bodyHashProof.a, _bodyHashProof.b, _bodyHashProof.c, _bodyHashProof.signals),\n \"Invalid body hash proof\"\n );\n\n _validateIntermediateHash(_proof.signals, _bodyHashProof.signals);\n\n require(isMailServerKeyHash(bytes32(_proof.signals[0])), \"Invalid mailserver key hash\");\n\n // Signals [5:10] are the packed from email address\n string memory fromEmail = _parseSignalArray(_proof.signals, 5, 10);\n require(keccak256(abi.encodePacked(fromEmail)) == keccak256(emailFromAddress), \"Invalid email from address\");\n\n // Signals [17:19] is the packed amount, since this is a USDC amount we want to make sure the returned number is\n // properly padded to 6 decimals. If the parsed has more than 6 figures to the right of the decimal it will revert\n amount = _parseSignalArray(_proof.signals, 23, 25).stringToUint(0x2C, 6);\n\n // Signals [10:12] are the packed timestamp, the timestamp is returned as a string in the format, that we need to\n // parse and convert to a unix timestamp\n // Add the buffer to build in flexibility with L2 timestamps\n timestamp = _parseSignalArray(_proof.signals, 10, 12).stringToUint(0) + timestampBuffer;\n\n // Signals [19] is the packed onRamperIdHash\n onRamperIdHash = bytes32(_proof.signals[25]);\n\n // Signals [12:17] is the packed name of the Garanti account owner which must be hashed to get the offRamperNameHash\n offRamperNameHash = keccak256(abi.encodePacked(_parseSignalArray(_proof.signals, 12, 18)));\n\n // Signals [12:17] is the packed IBAN number which must be hashed to get the offRamperIdHash\n offRamperIdHash = keccak256(abi.encodePacked(_parseSignalArray(_proof.signals, 18, 23)));\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[26]));\n\n // Signals [14] is intentHash\n intentHash = bytes32(_proof.signals[27]);\n }\n \n /* ============ Internal Functions ============ */\n\n function _parseSignalArray(uint256[28] calldata _signals, uint8 _from, uint8 _to) internal pure returns (string memory) {\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 function _validateIntermediateHash(uint256[28] calldata _sendSignals, uint256[4] calldata _bodyHashSignals) internal pure {\n bytes32 intermediateHash = keccak256(abi.encode(_sendSignals[1], _sendSignals[2], _sendSignals[3], _sendSignals[4]));\n bytes32 inputHash = keccak256(abi.encode(_bodyHashSignals[0], _bodyHashSignals[1], _bodyHashSignals[2], _bodyHashSignals[3]));\n require(intermediateHash == inputHash, \"Invalid intermediate or output hash\");\n }\n}\n" + }, + "contracts/ramps/garanti/interfaces/IGarantiBodySuffixHashVerifier.sol": { + "content": "//SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.18;\n\ninterface IGarantiBodySuffixHashVerifier {\n\n struct BodySuffixHashProof {\n uint256[2] a;\n uint256[2][2] b;\n uint256[2] c;\n uint256[4] signals;\n }\n\n function verifyProof(\n uint[2] calldata _pA,\n uint[2][2] calldata _pB,\n uint[2] calldata _pC,\n uint[4] calldata _pubSignals\n )\n external\n view\n returns (bool);\n}\n" + }, + "contracts/ramps/garanti/interfaces/IGarantiRegistrationProcessor.sol": { + "content": "//SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.18;\n\nimport { IGarantiBodySuffixHashVerifier } from \"./IGarantiBodySuffixHashVerifier.sol\";\n\ninterface IGarantiRegistrationProcessor {\n\n struct RegistrationProof {\n uint256[2] a;\n uint256[2][2] b;\n uint256[2] c;\n uint256[11] signals;\n }\n\n function processProof(\n RegistrationProof calldata _proof,\n IGarantiBodySuffixHashVerifier.BodySuffixHashProof calldata _bodyHashProof\n )\n external\n returns (bytes32);\n}\n" + }, + "contracts/ramps/garanti/interfaces/IGarantiSendProcessor.sol": { + "content": "//SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.18;\n\nimport { IGarantiBodySuffixHashVerifier } from \"./IGarantiBodySuffixHashVerifier.sol\";\n\ninterface IGarantiSendProcessor {\n\n struct SendProof {\n uint256[2] a;\n uint256[2][2] b;\n uint256[2] c;\n uint256[28] signals;\n }\n\n function processProof(\n SendProof calldata _proof,\n IGarantiBodySuffixHashVerifier.BodySuffixHashProof calldata _bodyHashProof\n )\n external\n returns(uint256, uint256, bytes32, bytes32, bytes32, bytes32);\n}\n" + }, + "contracts/ramps/garanti/mocks/GarantiRegistrationProcessorMock.sol": { + "content": "//SPDX-License-Identifier: MIT\n\nimport { IGarantiBodySuffixHashVerifier } from \"../interfaces/IGarantiBodySuffixHashVerifier.sol\";\nimport { IGarantiRegistrationProcessor } from \"../interfaces/IGarantiRegistrationProcessor.sol\";\n\npragma solidity ^0.8.18;\n\ncontract GarantiRegistrationProcessorMock is IGarantiRegistrationProcessor {\n\n /* ============ Constructor ============ */\n constructor() {}\n\n /* ============ External View Functions ============ */\n function processProof(\n RegistrationProof calldata _proof,\n IGarantiBodySuffixHashVerifier.BodySuffixHashProof calldata /*_bodyHashProof*/\n )\n public\n pure\n override\n returns(bytes32 userIdHash)\n {\n return(bytes32(_proof.signals[1]));\n }\n}\n" + }, + "contracts/ramps/garanti/mocks/GarantiSendProcessorMock.sol": { + "content": "//SPDX-License-Identifier: MIT\n\nimport { IGarantiBodySuffixHashVerifier } from \"../interfaces/IGarantiBodySuffixHashVerifier.sol\";\nimport { IGarantiSendProcessor } from \"../interfaces/IGarantiSendProcessor.sol\";\n\npragma solidity ^0.8.18;\n\ncontract GarantiSendProcessorMock is IGarantiSendProcessor {\n\n /* ============ Constructor ============ */\n constructor() {}\n\n /* ============ External View Functions ============ */\n function processProof(\n SendProof calldata _proof,\n IGarantiBodySuffixHashVerifier.BodySuffixHashProof calldata /*_bodyHashProof*/\n )\n public\n pure\n override\n returns(\n uint256 amount,\n uint256 timestamp,\n bytes32 offRamperNameHash,\n bytes32 offRamperIdHash,\n bytes32 onRamperIdHash,\n bytes32 intentHash\n )\n {\n return(\n _proof.signals[0],\n _proof.signals[1],\n bytes32(_proof.signals[2]),\n bytes32(_proof.signals[3]),\n bytes32(_proof.signals[4]),\n bytes32(_proof.signals[5])\n );\n }\n}\n" + }, + "contracts/ramps/hdfc/HDFCRamp.sol": { + "content": "//SPDX-License-Identifier: MIT\n\nimport { IERC20 } from \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\nimport { Ownable } from \"@openzeppelin/contracts/access/Ownable.sol\";\n\nimport { Bytes32ArrayUtils } from \"../../external/Bytes32ArrayUtils.sol\";\nimport { Uint256ArrayUtils } from \"../../external/Uint256ArrayUtils.sol\";\n\nimport { IPoseidon3 } from \"../../interfaces/IPoseidon3.sol\";\nimport { IPoseidon6 } from \"../../interfaces/IPoseidon6.sol\";\nimport { IRegistrationProcessor } from \"./interfaces/IRegistrationProcessor.sol\";\nimport { IHDFCSendProcessor } from \"./interfaces/IHDFCSendProcessor.sol\";\n\nimport { IeERC20 } from \"../../interfaces/IEERC20.sol\";\nimport \"fhevm/lib/TFHE.sol\";\n\npragma solidity ^0.8.18;\ncontract HDFCRamp is Ownable {\n\n using Bytes32ArrayUtils for bytes32[];\n using Uint256ArrayUtils for uint256[];\n\n /* ============ Events ============ */\n event AccountRegistered(address indexed accountOwner, bytes32 indexed idHash);\n event DepositReceived(\n uint256 indexed depositId,\n bytes32 indexed idHash,\n uint256 amount,\n uint256 conversionRate\n );\n\n event EncryptedDepositReceived(\n uint256 indexed depositId,\n bytes32 indexed idHash,\n euint32 amount,\n euint32 conversionRate\n );\n\n event IntentSignaled(\n bytes32 indexed intentHash,\n uint256 indexed depositId,\n bytes32 indexed idHash,\n address to,\n uint256 amount,\n uint256 timestamp\n );\n\n event IntentPruned(\n bytes32 indexed intentHash,\n uint256 indexed depositId\n );\n // Do we want to emit the onRamper or the idHash\n event IntentFulfilled(\n bytes32 indexed intentHash,\n uint256 indexed depositId,\n address indexed onRamper,\n address to,\n uint256 amount,\n uint256 feeAmount\n );\n event DepositWithdrawn(\n uint256 indexed depositId,\n address indexed depositor,\n uint256 amount\n );\n\n event DepositClosed(uint256 depositId, address depositor);\n event UserAddedToDenylist(bytes32 listOwner, bytes32 deniedUser);\n event UserRemovedFromDenylist(bytes32 listOwner, bytes32 approvedUser);\n event MinDepositAmountSet(uint256 minDepositAmount);\n event MaxOnRampAmountSet(uint256 maxOnRampAmount);\n event IntentExpirationPeriodSet(uint256 intentExpirationPeriod);\n event OnRampCooldownPeriodSet(uint256 onRampCooldownPeriod);\n event SustainabilityFeeUpdated(uint256 fee);\n event SustainabilityFeeRecipientUpdated(address feeRecipient);\n event NewSendProcessorSet(address sendProcessor);\n event NewRegistrationProcessorSet(address registrationProcessor);\n event NewReceiveProcessorSet(address receiveProcessor);\n\n /* ============ Structs ============ */\n\n // Each Account is tied to a GlobalAccount via its associated idHash. Each account is represented by an Ethereum address\n // and is allowed to have at most 5 deposits associated with it.\n struct AccountInfo {\n bytes32 idHash; // Hash of payment processor id\n uint256[] deposits; // Array of open account deposits\n }\n\n struct Deposit {\n address depositor;\n uint256[8] upiId;\n uint256 depositAmount; // Amount of USDC deposited\n uint256 remainingDeposits; // Amount of remaining deposited liquidity\n uint256 outstandingIntentAmount; // Amount of outstanding intents (may include expired intents)\n uint256 conversionRate; // Conversion required by off-ramper between USDC/USD\n bytes32[] intentHashes; // Array of hashes of all open intents (may include some expired if not pruned)\n }\n\n struct EncryptedDeposit {\n address despositor;\n uint256[8] upiId;\n euint32 depositAmount;\n euint32 remainingDeposits;\n euint32 outstandingIntentAmount;\n euint32 conversionRate;\n bytes32[] intentHashes;\n }\n\n struct DepositWithAvailableLiquidity {\n uint256 depositId; // ID of the deposit\n bytes32 depositorIdHash; // Depositor's idHash \n Deposit deposit; // Deposit struct\n uint256 availableLiquidity; // Amount of liquidity available to signal intents (net of expired intents)\n }\n\n struct Intent {\n address onRamper; // On-ramper's address\n address to; // Address to forward funds to (can be same as onRamper)\n uint256 deposit; // ID of the deposit the intent is signaling on\n uint256 amount; // Amount of USDC the on-ramper signals intent for on-chain\n uint256 intentTimestamp; // Timestamp of when the intent was signaled\n }\n\n struct IntentWithOnRamperId {\n bytes32 intentHash; // Intent hash\n Intent intent; // Intent struct\n bytes32 onRamperIdHash; // Poseidon hash of the on-ramper's idHash\n }\n\n struct DenyList {\n bytes32[] deniedUsers; // Array of idHashes that are denied from taking depositors liquidity\n mapping(bytes32 => bool) isDenied; // Mapping of idHash to boolean indicating if the user is denied\n }\n\n // A Global Account is defined as an account represented by one idHash. This is used to enforce limitations on actions across\n // all Ethereum addresses that are associated with that idHash. In this case we use it to enforce a cooldown period between on ramps,\n // restrict each HDFC account to one outstanding intent at a time, and to enforce deny lists.\n struct GlobalAccountInfo {\n bytes32 currentIntentHash; // Hash of the current open intent (if exists)\n uint256 lastOnrampTimestamp; // Timestamp of the last on-ramp transaction used to check if cooldown period elapsed\n DenyList denyList; // Deny list of the account\n }\n\n /* ============ Modifiers ============ */\n modifier onlyRegisteredUser() {\n require(accounts[msg.sender].idHash != bytes32(0), \"Caller must be registered user\");\n _;\n }\n\n /* ============ Constants ============ */\n uint256 internal constant PRECISE_UNIT = 1e18;\n uint256 internal constant MAX_DEPOSITS = 5; // An account can only have max 5 different deposit parameterizations to prevent locking funds\n uint256 constant CIRCOM_PRIME_FIELD = 21888242871839275222246405745257275088548364400416034343698204186575808495617;\n uint256 constant MAX_SUSTAINABILITY_FEE = 5e16; // 5% max sustainability fee\n \n /* ============ State Variables ============ */\n IERC20 public immutable usdc; // USDC token contract\n IeERC20 public immutable eusdc; // Encrypted USDC token contract (just named is encrypted usdc lol)\n IPoseidon3 public immutable poseidon3; // Poseidon hashing contract\n IPoseidon6 public immutable poseidon6; // Poseidon hashing contract\n IRegistrationProcessor public registrationProcessor; // Address of registration processor contract, verifies registration e-mails\n IHDFCSendProcessor public sendProcessor; // Address of send processor contract, verifies onRamp emails\n\n bool public isInitialized; // Indicates if contract has been initialized\n\n mapping(bytes32 => GlobalAccountInfo) internal globalAccount; // Mapping of idHash to information used to enforce actions across Ethereum accounts\n mapping(address => AccountInfo) internal accounts; // Mapping of Ethereum accounts to their account information (idHash and deposits)\n mapping(uint256 => Deposit) public deposits; // Mapping of depositIds to deposit structs\n mapping(uint256 => EncryptedDeposit) public encryptedDeposits; // Mapping of depositIds to deposit structs\n mapping(bytes32 => Intent) public intents; // Mapping of intentHashes to intent structs\n\n uint256 public minDepositAmount; // Minimum amount of USDC that can be deposited\n uint256 public maxOnRampAmount; // Maximum amount of USDC that can be on-ramped in a single transaction\n uint256 public onRampCooldownPeriod; // Time period that must elapse between completing an on-ramp and signaling a new intent\n uint256 public intentExpirationPeriod; // Time period after which an intent can be pruned from the system\n uint256 public sustainabilityFee; // Fee charged to on-rampers in preciseUnits (1e16 = 1%)\n address public sustainabilityFeeRecipient; // Address that receives the sustainability fee\n\n uint256 public depositCounter; // Counter for depositIds\n\n /* ============ Constructor ============ */\n constructor(\n address _owner,\n IERC20 _usdc,\n IeERC20 _eusdc,\n IPoseidon3 _poseidon3,\n IPoseidon6 _poseidon6,\n uint256 _minDepositAmount,\n uint256 _maxOnRampAmount,\n uint256 _intentExpirationPeriod,\n uint256 _onRampCooldownPeriod,\n uint256 _sustainabilityFee,\n address _sustainabilityFeeRecipient\n )\n Ownable()\n {\n usdc = _usdc;\n eusdc = _eusdc;\n poseidon3 = _poseidon3;\n poseidon6 = _poseidon6;\n minDepositAmount = _minDepositAmount;\n maxOnRampAmount = _maxOnRampAmount;\n intentExpirationPeriod = _intentExpirationPeriod;\n onRampCooldownPeriod = _onRampCooldownPeriod;\n sustainabilityFee = _sustainabilityFee;\n sustainabilityFeeRecipient = _sustainabilityFeeRecipient;\n\n transferOwnership(_owner);\n }\n\n /* ============ External Functions ============ */\n\n /**\n * @notice Initialize Ramp with the addresses of the Processors\n *\n * @param _registrationProcessor Registration processor address\n * @param _sendProcessor Send processor address\n */\n function initialize(\n IRegistrationProcessor _registrationProcessor,\n IHDFCSendProcessor _sendProcessor\n )\n external\n onlyOwner\n {\n require(!isInitialized, \"Already initialized\");\n\n registrationProcessor = _registrationProcessor;\n sendProcessor = _sendProcessor;\n\n isInitialized = true;\n }\n\n /**\n * @notice Registers a new account by pulling the hash of the account id from the proof and assigning the account owner to the\n * sender of the transaction. One HDFC account can be registered to multiple Ethereum addresses.\n *\n * @param _a Parameter of zk proof\n * @param _b Parameter of zk proof\n * @param _c Parameter of zk proof\n * @param _signals Encoded public signals of the zk proof, contains mailserverHash, fromEmail, userIdHash\n */\n function register(\n uint[2] memory _a,\n uint[2][2] memory _b,\n uint[2] memory _c,\n uint[5] memory _signals\n )\n external\n {\n require(accounts[msg.sender].idHash == bytes32(0), \"Account already associated with idHash\");\n bytes32 idHash = _verifyRegistrationProof(_a, _b, _c, _signals);\n\n accounts[msg.sender].idHash = idHash;\n\n emit AccountRegistered(msg.sender, idHash);\n }\n\n /**\n * @notice Generates a deposit entry for off-rampers that can then be fulfilled by an on-ramper. This function will not add to\n * previous deposits. Every deposit has it's own unique identifier. User must approve the contract to transfer the deposit amount\n * of USDC.\n *\n * @param _upiId The packed upi ID of the depositor\n * @param _depositAmount The amount of USDC to off-ramp\n * @param _receiveAmount The amount of USD to receive\n */\n function offRamp(\n uint256[8] memory _upiId,\n uint256 _depositAmount,\n uint256 _receiveAmount\n )\n external\n onlyRegisteredUser\n {\n require(accounts[msg.sender].deposits.length < MAX_DEPOSITS, \"Maximum deposit amount reached\");\n require(_depositAmount >= minDepositAmount, \"Deposit amount must be greater than min deposit amount\");\n require(_receiveAmount > 0, \"Receive amount must be greater than 0\");\n\n uint256 conversionRate = (_depositAmount * PRECISE_UNIT) / _receiveAmount;\n uint256 depositId = depositCounter++;\n\n AccountInfo storage account = accounts[msg.sender];\n account.deposits.push(depositId);\n\n deposits[depositId] = Deposit({\n depositor: msg.sender,\n upiId: _upiId,\n depositAmount: _depositAmount,\n remainingDeposits: _depositAmount,\n outstandingIntentAmount: 0,\n conversionRate: conversionRate,\n intentHashes: new bytes32[](0)\n });\n\n usdc.transferFrom(msg.sender, address(this), _depositAmount);\n\n emit DepositReceived(depositId, account.idHash, _depositAmount, conversionRate);\n }\n\n // for simplicity considering uint32 only\n // this method doesn't implements requires and assumes parameters are valid for simplicity\n function privateOffRamp(\n uint256[8] memory _upiId,\n einput _encryptedDepositAmount, \n einput _encryptedReceiveAmount,\n bytes calldata _inputProof,\n uint256 _depositAmount,\n uint256 _receiveAmount\n )\n external\n onlyRegisteredUser\n {\n // require(accounts[msg.sender].deposits.length < MAX_DEPOSITS, \"Maximum deposit amount reached\");\n euint32 encryptedDepositAmount = TFHE.asEuint32(_encryptedDepositAmount, _inputProof);\n euint32 encryptedReceiveAmount = TFHE.asEuint32(_encryptedReceiveAmount, _inputProof);\n\n // ebool depositAmountGreaterThanMinDeposit = TFHE.gt(encryptedDepositAmount, TFHE.asEuint32(minDepositAmount));\n // ebool receivedAmountGreaterThanZero = TFHE.gt(encryptedReceiveAmount, TFHE.asEuint32(0));\n\n // require(_depositAmount >= minDepositAmount, \"Deposit amount must be greater than min deposit amount\");\n // require(_receiveAmount > 0, \"Receive amount must be greater than 0\");\n\n // uint256 conversionRate = (_depositAmount * PRECISE_UNIT) / _receiveAmount;\n\n // since 1e18 can't fit into 2^64\n uint32 ENC_PRECISE_UINT = 1e9;\n // for now let's keep the conversion uint as 1 since division between two encrypted values is not supported\n euint32 encryptedConversionRate = TFHE.asEuint32(1);\n // TFHE.div(TFHE.mul(encryptedDepositAmount, TFHE.asEuint32(ENC_PRECISE_UINT)), encryptedReceiveAmount);\n uint256 depositId = depositCounter++;\n\n AccountInfo storage account = accounts[msg.sender];\n account.deposits.push(depositId);\n\n encryptedDeposits[depositId] = EncryptedDeposit({\n despositor: msg.sender,\n upiId: _upiId,\n depositAmount: encryptedDepositAmount,\n remainingDeposits: encryptedDepositAmount,\n outstandingIntentAmount: TFHE.asEuint32(0),\n conversionRate: encryptedConversionRate,\n intentHashes: new bytes32[](0)\n });\n\n // deposits[depositId] = Deposit({\n // depositor: msg.sender,\n // upiId: _upiId,\n // depositAmount: _depositAmount,\n // remainingDeposits: _depositAmount,\n // outstandingIntentAmount: 0,\n // conversionRate: conversionRate,\n // intentHashes: new bytes32[](0)\n // });\n\n // usdc.transferFrom(msg.sender, address(this), _depositAmount);\n // transferFrom will implicitly convert euint32 to euint64\n eusdc.transferFrom(msg.sender, address(this), _encryptedDepositAmount, _inputProof);\n emit EncryptedDepositReceived(depositId, account.idHash, encryptedDepositAmount, encryptedConversionRate);\n // emit DepositReceived(depositId, account.idHash, _depositAmount, conversionRate);\n }\n\n /**\n * @notice Signals intent to pay the depositor defined in the _depositId the _amount * deposit conversionRate off-chain\n * in order to unlock _amount of funds on-chain. Each user can only have one outstanding intent at a time regardless of\n * address (tracked using idHash). Caller must not be on the depositor's deny list. If there are prunable intents then\n * they will be deleted from the deposit to be able to maintain state hygiene.\n *\n * @param _depositId The ID of the deposit the on-ramper intends to use for \n * @param _amount The amount of USDC the user wants to on-ramp\n * @param _to Address to forward funds to (can be same as onRamper)\n */\n function signalIntent(uint256 _depositId, uint256 _amount, address _to) external onlyRegisteredUser {\n bytes32 idHash = accounts[msg.sender].idHash;\n Deposit storage deposit = deposits[_depositId];\n bytes32 depositorIdHash = accounts[deposit.depositor].idHash;\n\n // Caller validity checks\n require(!globalAccount[depositorIdHash].denyList.isDenied[idHash], \"Onramper on depositor's denylist\");\n require(\n globalAccount[idHash].lastOnrampTimestamp + onRampCooldownPeriod <= block.timestamp,\n \"On ramp cool down period not elapsed\"\n );\n require(globalAccount[idHash].currentIntentHash == bytes32(0), \"Intent still outstanding\");\n require(depositorIdHash != idHash, \"Sender cannot be the depositor\");\n\n // Intent information checks\n require(deposit.depositor != address(0), \"Deposit does not exist\");\n require(_amount > 0, \"Signaled amount must be greater than 0\");\n require(_amount <= maxOnRampAmount, \"Signaled amount must be less than max on-ramp amount\");\n require(_to != address(0), \"Cannot send to zero address\");\n\n bytes32 intentHash = _calculateIntentHash(idHash, _depositId);\n\n if (deposit.remainingDeposits < _amount) {\n (\n bytes32[] memory prunableIntents,\n uint256 reclaimableAmount\n ) = _getPrunableIntents(_depositId);\n\n require(deposit.remainingDeposits + reclaimableAmount >= _amount, \"Not enough liquidity\");\n\n _pruneIntents(deposit, prunableIntents);\n deposit.remainingDeposits += reclaimableAmount;\n deposit.outstandingIntentAmount -= reclaimableAmount;\n }\n\n intents[intentHash] = Intent({\n onRamper: msg.sender,\n to: _to,\n deposit: _depositId,\n amount: _amount,\n intentTimestamp: block.timestamp\n });\n\n globalAccount[idHash].currentIntentHash = intentHash;\n\n deposit.remainingDeposits -= _amount;\n deposit.outstandingIntentAmount += _amount;\n deposit.intentHashes.push(intentHash);\n\n emit IntentSignaled(intentHash, _depositId, idHash, _to, _amount, block.timestamp);\n }\n\n /**\n * @notice Only callable by the originator of the intent. Cancels an outstanding intent thus allowing user to signal a new\n * intent. Deposit state is updated to reflect the cancelled intent.\n *\n * @param _intentHash Hash of intent being cancelled\n */\n function cancelIntent(bytes32 _intentHash) external {\n Intent memory intent = intents[_intentHash];\n \n require(intent.intentTimestamp != 0, \"Intent does not exist\");\n require(\n accounts[intent.onRamper].idHash == accounts[msg.sender].idHash,\n \"Sender must be the on-ramper\"\n );\n\n Deposit storage deposit = deposits[intent.deposit];\n\n _pruneIntent(deposit, _intentHash);\n\n deposit.remainingDeposits += intent.amount;\n deposit.outstandingIntentAmount -= intent.amount;\n }\n\n /**\n * @notice Anyone can submit an on-ramp transaction, even if caller isn't on-ramper. Upon submission the proof is validated,\n * intent is removed, and deposit state is updated. USDC is transferred to the on-ramper.\n *\n * @param _a Parameter of zk proof\n * @param _b Parameter of zk proof\n * @param _c Parameter of zk proof\n * @param _signals Encoded public signals of the zk proof, contains mailserverHash, fromEmail, timestamp, onRamperIdHash,\n * nullifier, intentHash\n */\n function onRamp(\n uint256[2] memory _a,\n uint256[2][2] memory _b,\n uint256[2] memory _c,\n uint256[15] memory _signals\n )\n external\n {\n (\n Intent memory intent,\n Deposit storage deposit,\n bytes32 intentHash\n ) = _verifyOnRampProof(_a, _b, _c, _signals);\n\n _pruneIntent(deposit, intentHash);\n\n deposit.outstandingIntentAmount -= intent.amount;\n globalAccount[accounts[intent.onRamper].idHash].lastOnrampTimestamp = block.timestamp;\n _closeDepositIfNecessary(intent.deposit, deposit);\n\n _transferFunds(intentHash, intent);\n }\n\n /**\n * @notice Allows off-ramper to release funds to the on-ramper in case of a failed on-ramp or because of some other arrangement\n * between the two parties. Upon submission we check to make sure the msg.sender is the depositor, the intent is removed, and \n * deposit state is updated. USDC is transferred to the on-ramper.\n *\n * @param _intentHash Hash of intent to resolve by releasing the funds\n */\n function releaseFundsToOnramper(bytes32 _intentHash) external {\n Intent memory intent = intents[_intentHash];\n Deposit storage deposit = deposits[intent.deposit];\n\n require(intent.onRamper != address(0), \"Intent does not exist\");\n require(deposit.depositor == msg.sender, \"Caller must be the depositor\");\n\n _pruneIntent(deposit, _intentHash);\n\n deposit.outstandingIntentAmount -= intent.amount;\n globalAccount[accounts[intent.onRamper].idHash].lastOnrampTimestamp = block.timestamp;\n _closeDepositIfNecessary(intent.deposit, deposit);\n\n _transferFunds(_intentHash, intent);\n }\n\n /**\n * @notice Caller must be the depositor for each depositId in the array, if not whole function fails. Depositor is returned all\n * remaining deposits and any outstanding intents that are expired. If an intent is not expired then those funds will not be\n * returned. Deposit will be deleted as long as there are no more outstanding intents.\n *\n * @param _depositIds Array of depositIds the depositor is attempting to withdraw\n */\n function withdrawDeposit(uint256[] memory _depositIds) external {\n uint256 returnAmount;\n\n for (uint256 i = 0; i < _depositIds.length; ++i) {\n uint256 depositId = _depositIds[i];\n Deposit storage deposit = deposits[depositId];\n\n require(deposit.depositor == msg.sender, \"Sender must be the depositor\");\n\n (\n bytes32[] memory prunableIntents,\n uint256 reclaimableAmount\n ) = _getPrunableIntents(depositId);\n\n _pruneIntents(deposit, prunableIntents);\n\n returnAmount += deposit.remainingDeposits + reclaimableAmount;\n \n deposit.outstandingIntentAmount -= reclaimableAmount;\n\n emit DepositWithdrawn(depositId, deposit.depositor, deposit.remainingDeposits + reclaimableAmount);\n \n delete deposit.remainingDeposits;\n _closeDepositIfNecessary(depositId, deposit);\n }\n\n usdc.transfer(msg.sender, returnAmount);\n }\n\n /**\n * @notice Adds an idHash to a depositor's deny list. If an address associated with the banned idHash attempts to\n * signal an intent on the user's deposit they will be denied.\n *\n * @param _deniedUser Poseidon hash of the idHash being banned\n */\n function addAccountToDenylist(bytes32 _deniedUser) external onlyRegisteredUser {\n bytes32 denyingUser = accounts[msg.sender].idHash;\n\n require(!globalAccount[denyingUser].denyList.isDenied[_deniedUser], \"User already on denylist\");\n\n globalAccount[denyingUser].denyList.isDenied[_deniedUser] = true;\n globalAccount[denyingUser].denyList.deniedUsers.push(_deniedUser);\n\n emit UserAddedToDenylist(denyingUser, _deniedUser);\n }\n\n /**\n * @notice Removes a idHash from a depositor's deny list.\n *\n * @param _approvedUser Poseidon hash of the idHash being approved\n */\n function removeAccountFromDenylist(bytes32 _approvedUser) external onlyRegisteredUser {\n bytes32 approvingUser = accounts[msg.sender].idHash;\n\n require(globalAccount[approvingUser].denyList.isDenied[_approvedUser], \"User not on denylist\");\n\n globalAccount[approvingUser].denyList.isDenied[_approvedUser] = false;\n globalAccount[approvingUser].denyList.deniedUsers.removeStorage(_approvedUser);\n\n emit UserRemovedFromDenylist(approvingUser, _approvedUser);\n }\n\n /* ============ Governance Functions ============ */\n\n /**\n * @notice GOVERNANCE ONLY: Updates the send processor address used for validating and interpreting zk proofs.\n *\n * @param _sendProcessor New send proccesor address\n */\n function setSendProcessor(IHDFCSendProcessor _sendProcessor) external onlyOwner {\n sendProcessor = _sendProcessor;\n emit NewSendProcessorSet(address(_sendProcessor));\n }\n\n /**\n * @notice GOVERNANCE ONLY: Updates the registration processor address used for validating and interpreting zk proofs.\n *\n * @param _registrationProcessor New registration proccesor address\n */\n function setRegistrationProcessor(IRegistrationProcessor _registrationProcessor) external onlyOwner {\n registrationProcessor = _registrationProcessor;\n emit NewRegistrationProcessorSet(address(_registrationProcessor));\n }\n\n /**\n * @notice GOVERNANCE ONLY: Updates the minimum deposit amount a user can specify for off-ramping.\n *\n * @param _minDepositAmount The new minimum deposit amount\n */\n function setMinDepositAmount(uint256 _minDepositAmount) external onlyOwner {\n require(_minDepositAmount != 0, \"Minimum deposit cannot be zero\");\n\n minDepositAmount = _minDepositAmount;\n emit MinDepositAmountSet(_minDepositAmount);\n }\n\n /**\n * @notice GOVERNANCE ONLY: Updates the sustainability fee. This fee is charged to on-rampers upon a successful on-ramp.\n *\n * @param _fee The new sustainability fee in precise units (10**18, ie 10% = 1e17)\n */\n function setSustainabilityFee(uint256 _fee) external onlyOwner {\n require(_fee <= MAX_SUSTAINABILITY_FEE, \"Fee cannot be greater than max fee\");\n\n sustainabilityFee = _fee;\n emit SustainabilityFeeUpdated(_fee);\n }\n\n /**\n * @notice GOVERNANCE ONLY: Updates the recepient of sustainability fees.\n *\n * @param _feeRecipient The new fee recipient address\n */\n function setSustainabilityFeeRecipient(address _feeRecipient) external onlyOwner {\n require(_feeRecipient != address(0), \"Fee recipient cannot be zero address\");\n\n sustainabilityFeeRecipient = _feeRecipient;\n emit SustainabilityFeeRecipientUpdated(_feeRecipient);\n }\n\n /**\n * @notice GOVERNANCE ONLY: Updates the max amount allowed to be on-ramped in each transaction. To on-ramp more than\n * this amount a user must make multiple transactions.\n *\n * @param _maxOnRampAmount The new max on ramp amount\n */\n function setMaxOnRampAmount(uint256 _maxOnRampAmount) external onlyOwner {\n require(_maxOnRampAmount != 0, \"Max on ramp amount cannot be zero\");\n\n maxOnRampAmount = _maxOnRampAmount;\n emit MaxOnRampAmountSet(_maxOnRampAmount);\n }\n\n /**\n * @notice GOVERNANCE ONLY: Updates the on-ramp cooldown period, once an on-ramp transaction is completed the user must wait this\n * amount of time before they can signalIntent to on-ramp again.\n *\n * @param _onRampCooldownPeriod New on-ramp cooldown period\n */\n function setOnRampCooldownPeriod(uint256 _onRampCooldownPeriod) external onlyOwner {\n onRampCooldownPeriod = _onRampCooldownPeriod;\n emit OnRampCooldownPeriodSet(_onRampCooldownPeriod);\n }\n\n /**\n * @notice GOVERNANCE ONLY: Updates the intent expiration period, after this period elapses an intent can be pruned to prevent\n * locking up a depositor's funds.\n *\n * @param _intentExpirationPeriod New intent expiration period\n */\n function setIntentExpirationPeriod(uint256 _intentExpirationPeriod) external onlyOwner {\n require(_intentExpirationPeriod != 0, \"Max intent expiration period cannot be zero\");\n\n intentExpirationPeriod = _intentExpirationPeriod;\n emit IntentExpirationPeriodSet(_intentExpirationPeriod);\n }\n\n\n /* ============ External View Functions ============ */\n\n function getDeposit(uint256 _depositId) external view returns (Deposit memory) {\n return deposits[_depositId];\n }\n\n function getAccountInfo(address _account) external view returns (AccountInfo memory) {\n return accounts[_account];\n }\n\n function getIdCurrentIntentHash(address _account) external view returns (bytes32) {\n return globalAccount[accounts[_account].idHash].currentIntentHash;\n }\n\n function getLastOnRampTimestamp(address _account) external view returns (uint256) {\n return globalAccount[accounts[_account].idHash].lastOnrampTimestamp;\n }\n\n function getDeniedUsers(address _account) external view returns (bytes32[] memory) {\n return globalAccount[accounts[_account].idHash].denyList.deniedUsers;\n }\n\n function isDeniedUser(address _account, bytes32 _deniedUser) external view returns (bool) {\n return globalAccount[accounts[_account].idHash].denyList.isDenied[_deniedUser];\n }\n\n function getIntentsWithOnRamperId(bytes32[] calldata _intentHashes) external view returns (IntentWithOnRamperId[] memory) {\n IntentWithOnRamperId[] memory intentsWithOnRamperId = new IntentWithOnRamperId[](_intentHashes.length);\n\n for (uint256 i = 0; i < _intentHashes.length; ++i) {\n bytes32 intentHash = _intentHashes[i];\n Intent memory intent = intents[intentHash];\n intentsWithOnRamperId[i] = IntentWithOnRamperId({\n intentHash: _intentHashes[i],\n intent: intent,\n onRamperIdHash: accounts[intent.onRamper].idHash\n });\n }\n\n return intentsWithOnRamperId;\n }\n\n function getAccountDeposits(address _account) external view returns (DepositWithAvailableLiquidity[] memory accountDeposits) {\n uint256[] memory accountDepositIds = accounts[_account].deposits;\n accountDeposits = new DepositWithAvailableLiquidity[](accountDepositIds.length);\n \n for (uint256 i = 0; i < accountDepositIds.length; ++i) {\n uint256 depositId = accountDepositIds[i];\n Deposit memory deposit = deposits[depositId];\n ( , uint256 reclaimableAmount) = _getPrunableIntents(depositId);\n\n accountDeposits[i] = DepositWithAvailableLiquidity({\n depositId: depositId,\n depositorIdHash: accounts[deposit.depositor].idHash,\n deposit: deposit,\n availableLiquidity: deposit.remainingDeposits + reclaimableAmount\n });\n }\n }\n\n function getDepositFromIds(uint256[] memory _depositIds) external view returns (DepositWithAvailableLiquidity[] memory depositArray) {\n depositArray = new DepositWithAvailableLiquidity[](_depositIds.length);\n\n for (uint256 i = 0; i < _depositIds.length; ++i) {\n uint256 depositId = _depositIds[i];\n Deposit memory deposit = deposits[depositId];\n ( , uint256 reclaimableAmount) = _getPrunableIntents(depositId);\n\n depositArray[i] = DepositWithAvailableLiquidity({\n depositId: depositId,\n depositorIdHash: accounts[deposit.depositor].idHash,\n deposit: deposit,\n availableLiquidity: deposit.remainingDeposits + reclaimableAmount\n });\n }\n\n return depositArray;\n }\n\n /* ============ Internal Functions ============ */\n\n /**\n * @notice Calculates the intentHash of new intent\n */\n function _calculateIntentHash(\n bytes32 _idHash,\n uint256 _depositId\n )\n internal\n view\n virtual\n returns (bytes32 intentHash)\n {\n // Mod with circom prime field to make sure it fits in a 254-bit field\n uint256 intermediateHash = uint256(keccak256(abi.encodePacked(_idHash, _depositId, block.timestamp)));\n intentHash = bytes32(intermediateHash % CIRCOM_PRIME_FIELD);\n }\n\n /**\n * @notice Cycles through all intents currently open on a deposit and sees if any have expired. If they have expired\n * the outstanding amounts are summed and returned alongside the intentHashes\n */\n function _getPrunableIntents(\n uint256 _depositId\n )\n internal\n view\n returns(bytes32[] memory prunableIntents, uint256 reclaimedAmount)\n {\n bytes32[] memory intentHashes = deposits[_depositId].intentHashes;\n prunableIntents = new bytes32[](intentHashes.length);\n\n for (uint256 i = 0; i < intentHashes.length; ++i) {\n Intent memory intent = intents[intentHashes[i]];\n if (intent.intentTimestamp + intentExpirationPeriod < block.timestamp) {\n prunableIntents[i] = intentHashes[i];\n reclaimedAmount += intent.amount;\n }\n }\n }\n\n function _pruneIntents(Deposit storage _deposit, bytes32[] memory _intents) internal {\n for (uint256 i = 0; i < _intents.length; ++i) {\n if (_intents[i] != bytes32(0)) {\n _pruneIntent(_deposit, _intents[i]);\n }\n }\n }\n\n /**\n * @notice Pruning an intent involves deleting its state from the intents mapping, zeroing out the intendee's currentIntentHash in\n * their global account mapping, and deleting the intentHash from the deposit's intentHashes array.\n */\n function _pruneIntent(Deposit storage _deposit, bytes32 _intentHash) internal {\n Intent memory intent = intents[_intentHash];\n\n delete globalAccount[accounts[intent.onRamper].idHash].currentIntentHash;\n delete intents[_intentHash];\n _deposit.intentHashes.removeStorage(_intentHash);\n\n emit IntentPruned(_intentHash, intent.deposit);\n }\n\n /**\n * @notice Removes a deposit if no outstanding intents AND no remaining deposits. Deleting a deposit deletes it from the\n * deposits mapping and removes tracking it in the user's accounts mapping.\n */\n function _closeDepositIfNecessary(uint256 _depositId, Deposit storage _deposit) internal {\n uint256 openDepositAmount = _deposit.outstandingIntentAmount + _deposit.remainingDeposits;\n if (openDepositAmount == 0) {\n accounts[_deposit.depositor].deposits.removeStorage(_depositId);\n emit DepositClosed(_depositId, _deposit.depositor);\n delete deposits[_depositId];\n }\n }\n\n /**\n * @notice Checks if sustainability fee has been defined, if so sends fee to the fee recipient and intent amount minus fee\n * to the on-ramper. If sustainability fee is undefined then full intent amount is transferred to on-ramper.\n */\n function _transferFunds(bytes32 _intentHash, Intent memory _intent) internal {\n uint256 fee;\n if (sustainabilityFee != 0) {\n fee = (_intent.amount * sustainabilityFee) / PRECISE_UNIT;\n usdc.transfer(sustainabilityFeeRecipient, fee);\n }\n\n uint256 onRampAmount = _intent.amount - fee;\n usdc.transfer(_intent.to, onRampAmount);\n\n emit IntentFulfilled(_intentHash, _intent.deposit, _intent.onRamper, _intent.to, onRampAmount, fee);\n }\n\n /**\n * @notice Validate send payment email and check that it hasn't already been used (done on SendProcessor).\n * Additionally, we validate that the offRamperIdHash matches the one from the specified intent and that enough\n * was paid off-chain inclusive of the conversionRate.\n */\n function _verifyOnRampProof(\n uint256[2] memory _a,\n uint256[2][2] memory _b,\n uint256[2] memory _c,\n uint256[15] memory _signals\n )\n internal\n returns(Intent memory, Deposit storage, bytes32)\n {\n (\n uint256 amount,\n uint256 timestamp,\n bytes32 offRamperIdHash,\n bytes32 onRamperIdHash,\n bytes32 intentHash\n ) = sendProcessor.processProof(\n IHDFCSendProcessor.SendProof({\n a: _a,\n b: _b,\n c: _c,\n signals: _signals\n })\n );\n\n Intent memory intent = intents[intentHash];\n Deposit storage deposit = deposits[intent.deposit];\n\n require(intent.onRamper != address(0), \"Intent does not exist\");\n require(intent.intentTimestamp <= timestamp, \"Intent was not created before send\");\n require(bytes32(_getUpiIdHash(deposit.upiId)) == offRamperIdHash, \"Offramper id does not match\");\n require(accounts[intent.onRamper].idHash == onRamperIdHash, \"Onramper id does not match\");\n require(amount >= (intent.amount * PRECISE_UNIT) / deposit.conversionRate, \"Payment was not enough\");\n\n return (intent, deposit, intentHash);\n }\n\n /**\n * @notice Validate the user has an HDFC account, we do not nullify this email since it can be reused to register under\n * different addresses.\n */\n function _verifyRegistrationProof(\n uint256[2] memory _a,\n uint256[2][2] memory _b,\n uint256[2] memory _c,\n uint256[5] memory _signals\n )\n internal\n returns(bytes32)\n {\n bytes32 idHash = registrationProcessor.processProof(\n IRegistrationProcessor.RegistrationProof({\n a: _a,\n b: _b,\n c: _c,\n signals: _signals\n })\n );\n\n return idHash;\n }\n\n /**\n * @notice Returns the poseidon hash of the given raw UPI ID \n */\n function _getUpiIdHash(uint256[8] memory _upiId) internal view returns (bytes32) {\n uint256[6] memory temp1;\n uint256[3] memory temp2;\n\n for (uint256 i = 0; i < 6; ++i) {\n temp1[i] = _upiId[i];\n }\n temp2[0] = poseidon6.poseidon(temp1);\n temp2[1] = _upiId[6];\n temp2[2] = _upiId[7];\n\n return bytes32(poseidon3.poseidon(temp2));\n }\n}\n" + }, + "contracts/ramps/hdfc/HDFCRegistrationProcessor.sol": { + "content": "//SPDX-License-Identifier: MIT\n\nimport { StringUtils } from \"@zk-email/contracts/utils/StringUtils.sol\";\n\nimport { BaseProcessorV2 } from \"../../processors/BaseProcessorV2.sol\";\nimport { Groth16Verifier } from \"../../verifiers/hdfc_registration_verifier.sol\";\nimport { IKeyHashAdapterV2 } from \"../../processors/keyHashAdapters/IKeyHashAdapterV2.sol\";\nimport { INullifierRegistry } from \"../../processors/nullifierRegistries/INullifierRegistry.sol\";\nimport { IRegistrationProcessor } from \"./interfaces/IRegistrationProcessor.sol\";\n\npragma solidity ^0.8.18;\n\ncontract HDFCRegistrationProcessor is Groth16Verifier, IRegistrationProcessor, BaseProcessorV2 {\n\n using StringUtils for uint256[];\n\n /* ============ Constants ============ */\n uint256 constant public PACK_SIZE = 7;\n \n /* ============ Constructor ============ */\n constructor(\n address _ramp,\n IKeyHashAdapterV2 _hdfcMailserverKeyHashAdapter,\n INullifierRegistry _nullifierRegistry,\n string memory _emailFromAddress,\n uint256 _timestampBuffer\n )\n Groth16Verifier()\n BaseProcessorV2(\n _ramp,\n _hdfcMailserverKeyHashAdapter,\n _nullifierRegistry,\n _emailFromAddress,\n _timestampBuffer\n )\n {}\n\n /* ============ External Functions ============ */\n\n function processProof(\n IRegistrationProcessor.RegistrationProof calldata _proof\n )\n public\n override\n onlyRamp\n returns(bytes32 userIdHash)\n {\n require(this.verifyProof(_proof.a, _proof.b, _proof.c, _proof.signals), \"Invalid Proof\"); // checks effects iteractions, this should come first\n\n require(isMailServerKeyHash(bytes32(_proof.signals[0])), \"Invalid mailserver key hash\");\n\n // Signals [1:4] are the packed from email address\n string memory fromEmail = _parseSignalArray(_proof.signals, 1, 4);\n require(keccak256(abi.encodePacked(fromEmail)) == keccak256(emailFromAddress), \"Invalid email from address\");\n\n _validateAndAddNullifier(keccak256(abi.encode(_proof)));\n\n // Signals [4] is the packed userIdHash\n userIdHash = bytes32(_proof.signals[4]);\n }\n\n /* ============ Internal Functions ============ */\n\n function _parseSignalArray(uint256[5] calldata _signals, uint8 _from, uint8 _to) internal pure returns (string memory) {\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/ramps/hdfc/HDFCSendProcessor.sol": { + "content": "//SPDX-License-Identifier: MIT\n\nimport { StringUtils } from \"@zk-email/contracts/utils/StringUtils.sol\";\n\nimport { BaseProcessorV2 } from \"../../processors/BaseProcessorV2.sol\";\nimport { Groth16Verifier } from \"../../verifiers/hdfc_send_verifier.sol\";\nimport { HDFCTimestampParsing } from \"./lib/HDFCTimestampParsing.sol\";\nimport { IKeyHashAdapterV2 } from \"../../processors/keyHashAdapters/IKeyHashAdapterV2.sol\";\nimport { INullifierRegistry } from \"../../processors/nullifierRegistries/INullifierRegistry.sol\";\nimport { IHDFCSendProcessor } from \"./interfaces/IHDFCSendProcessor.sol\";\nimport { StringConversionUtils } from \"../../lib/StringConversionUtils.sol\";\n\npragma solidity ^0.8.18;\n\ncontract HDFCSendProcessor is Groth16Verifier, IHDFCSendProcessor, BaseProcessorV2 {\n \n using StringUtils for uint256[];\n using StringConversionUtils for string;\n\n /* ============ Constants ============ */\n uint256 constant PACK_SIZE = 7;\n\n /* ============ Constructor ============ */\n constructor(\n address _ramp,\n IKeyHashAdapterV2 _hdfcMailserverKeyHashAdapter,\n INullifierRegistry _nullifierRegistry,\n string memory _emailFromAddress,\n uint256 _timestampBuffer\n )\n Groth16Verifier()\n BaseProcessorV2(\n _ramp,\n _hdfcMailserverKeyHashAdapter,\n _nullifierRegistry,\n _emailFromAddress,\n _timestampBuffer\n )\n {}\n \n /* ============ External Functions ============ */\n function processProof(\n IHDFCSendProcessor.SendProof calldata _proof\n )\n public\n override\n onlyRamp\n returns(\n uint256 amount,\n uint256 timestamp,\n bytes32 offRamperIdHash,\n bytes32 onRamperIdHash,\n bytes32 intentHash\n )\n {\n require(this.verifyProof(_proof.a, _proof.b, _proof.c, _proof.signals), \"Invalid Proof\"); // checks effects iteractions, this should come first\n\n require(isMailServerKeyHash(bytes32(_proof.signals[0])), \"Invalid mailserver key hash\");\n\n // Signals [1:4] are the packed from email address\n string memory fromEmail = _parseSignalArray(_proof.signals, 1, 4);\n require(keccak256(abi.encodePacked(fromEmail)) == keccak256(emailFromAddress), \"Invalid email from address\");\n\n // Signals [4:6] is the packed amount, since this is a USDC amount we want to make sure the returned number is\n // properly padded to 6 decimals. If the parsed has more than 6 figures to the right of the decimal it will revert\n amount = _parseSignalArray(_proof.signals, 4, 6).stringToUint(6);\n\n // Signals [6:11] are the packed timestamp, the timestamp is returned as a string in the format, that we need to\n // parse and convert to a unix timestamp\n string memory rawTimestamp = _parseSignalArray(_proof.signals, 6, 11);\n // Add the buffer to build in flexibility with L2 timestamps\n timestamp = HDFCTimestampParsing._dateStringToTimestamp(rawTimestamp) + timestampBuffer;\n\n // Signals [11] is the packed onRamperIdHash\n onRamperIdHash = bytes32(_proof.signals[11]);\n\n // Signals [12] is the packed offRamper UPI ID hash\n offRamperIdHash = bytes32(_proof.signals[12]);\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[13]));\n\n // Signals [14] is intentHash\n intentHash = bytes32(_proof.signals[14]);\n }\n \n /* ============ Internal Functions ============ */\n\n function _parseSignalArray(uint256[15] calldata _signals, uint8 _from, uint8 _to) internal pure returns (string memory) {\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/ramps/hdfc/interfaces/IHDFCSendProcessor.sol": { + "content": "//SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.18;\n\ninterface IHDFCSendProcessor {\n\n struct SendProof {\n uint256[2] a;\n uint256[2][2] b;\n uint256[2] c;\n uint256[15] signals;\n }\n\n function processProof(\n SendProof calldata _proof\n )\n external\n returns(uint256, uint256, bytes32, bytes32, bytes32);\n}\n" + }, + "contracts/ramps/hdfc/interfaces/IRegistrationProcessor.sol": { + "content": "//SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.18;\n\ninterface IRegistrationProcessor {\n\n struct RegistrationProof {\n uint256[2] a;\n uint256[2][2] b;\n uint256[2] c;\n uint256[5] signals;\n }\n\n function processProof(\n RegistrationProof calldata _proof\n )\n external\n returns (bytes32);\n}\n" + }, + "contracts/ramps/hdfc/lib/HDFCTimestampParsing.sol": { + "content": "//SPDX-License-Identifier: MIT\n\nimport { DateTime } from \"../../../external/DateTime.sol\";\n\nimport { StringConversionUtils } from \"../../../lib/StringConversionUtils.sol\";\n\npragma solidity ^0.8.18;\n\nlibrary HDFCTimestampParsing {\n\n using StringConversionUtils for string;\n\n /**\n * @notice Iterates through every character in the date string and splits the string at each space or colon. Function will revert\n * if there are not 8 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 HDFC, not suitable for use with other date formats.\n */\n function _dateStringToTimestamp(string memory _dateString) internal pure returns (uint256) {\n string[8] memory extractedStrings;\n uint256 breakCounter;\n uint256 lastBreak;\n for (uint256 i = 0; i < bytes(_dateString).length; i++) {\n if (bytes(_dateString)[i] == 0x20 || bytes(_dateString)[i] == 0x3a) {\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 8 substrings were found (string is split at 7 different places)\n require(breakCounter == 7, \"Invalid date string\");\n\n uint256 unOffsetTimestamp = DateTime.timestampFromDateTime(\n extractedStrings[3].stringToUint(0), // year\n _parseMonth(extractedStrings[2]), // month\n extractedStrings[1].stringToUint(0), // day\n extractedStrings[4].stringToUint(0), // hour\n extractedStrings[5].stringToUint(0), // minute\n extractedStrings[6].stringToUint(0) // second\n );\n\n return _calculateTimestampWithOffset(unOffsetTimestamp, extractedStrings[7]);\n }\n\n /**\n * @notice Adds or subtracts an offset from the calculated unOffset timestamp based on the timezone offset string. The timezone offset\n * string is of the format \"+0530\" or \"-0530\" where the first character is either a \"+\" or a \"-\" and the next 4 characters are hhmm. If\n * the _timeOffsetString is \"+0530\" then we subtract 5 hours and 30 minutes (19800s) from the unOffset timestamp, to get a GMT timestamp.\n * We constrain the _timeOffsetString to be 5 characters long to be of the format +/-hhmm.\n *\n * @param unOffsetTimestamp The unix timestamp without any timezone offset applied\n * @param _timeOffsetString The timezone offset string indicating the magnitude and direction of the timezone offset\n */\n function _calculateTimestampWithOffset(uint256 unOffsetTimestamp, string memory _timeOffsetString) internal pure returns (uint256) {\n require(bytes(_timeOffsetString).length == 5, \"Invalid timezone offset\");\n uint256 tzHours = _timeOffsetString.substring(1, 3).stringToUint(0);\n uint256 tzMinutes = _timeOffsetString.substring(3, 5).stringToUint(0);\n\n uint256 rawOffset = tzHours * 3600 + tzMinutes * 60;\n\n // Check if tz offset is positive or negative relative to GMT, 0x2b is the hex value for \"+\" meaning the tz is ahead of GMT and must\n // be subtracted\n bytes1 _offsetDirection = bytes(_timeOffsetString.substring(0, 1))[0];\n return _offsetDirection == 0x2b ? unOffsetTimestamp - rawOffset : unOffsetTimestamp + rawOffset;\n }\n\n function _parseMonth(string memory _month) internal pure returns (uint256) {\n if (keccak256(abi.encodePacked(_month)) == keccak256(\"Jan\")) {\n return 1;\n } else if (keccak256(abi.encodePacked(_month)) == keccak256(\"Feb\")) {\n return 2;\n } else if (keccak256(abi.encodePacked(_month)) == keccak256(\"Mar\")) {\n return 3;\n } else if (keccak256(abi.encodePacked(_month)) == keccak256(\"Apr\")) {\n return 4;\n } else if (keccak256(abi.encodePacked(_month)) == keccak256(\"May\")) {\n return 5;\n } else if (keccak256(abi.encodePacked(_month)) == keccak256(\"Jun\")) {\n return 6;\n } else if (keccak256(abi.encodePacked(_month)) == keccak256(\"Jul\")) {\n return 7;\n } else if (keccak256(abi.encodePacked(_month)) == keccak256(\"Aug\")) {\n return 8;\n } else if (keccak256(abi.encodePacked(_month)) == keccak256(\"Sep\")) {\n return 9;\n } else if (keccak256(abi.encodePacked(_month)) == keccak256(\"Oct\")) {\n return 10;\n } else if (keccak256(abi.encodePacked(_month)) == keccak256(\"Nov\")) {\n return 11;\n } else if (keccak256(abi.encodePacked(_month)) == keccak256(\"Dec\")) {\n return 12;\n } else {\n revert(\"Invalid month\");\n }\n }\n}\n" + }, + "contracts/ramps/hdfc/mocks/HDFCRegistrationProcessorMock.sol": { + "content": "//SPDX-License-Identifier: MIT\n\nimport { IRegistrationProcessor } from \"../interfaces/IRegistrationProcessor.sol\";\n\npragma solidity ^0.8.18;\n\ncontract HDFCRegistrationProcessorMock is IRegistrationProcessor {\n\n /* ============ Constructor ============ */\n constructor() {}\n\n /* ============ External View Functions ============ */\n function processProof(\n RegistrationProof calldata _proof\n )\n public\n pure\n override\n returns(bytes32 userIdHash)\n {\n return(bytes32(_proof.signals[1]));\n }\n}\n" + }, + "contracts/ramps/hdfc/mocks/HDFCSendProcessorMock.sol": { + "content": "//SPDX-License-Identifier: MIT\n\nimport { IHDFCSendProcessor } from \"../interfaces/IHDFCSendProcessor.sol\";\n\npragma solidity ^0.8.18;\n\ncontract HDFCSendProcessorMock is IHDFCSendProcessor {\n\n /* ============ Constructor ============ */\n constructor() {}\n\n /* ============ External View Functions ============ */\n function processProof(\n SendProof calldata _proof\n )\n public\n pure\n override\n returns(uint256 amount, uint256 timestamp, bytes32 onRamperIdHash, bytes32 offRamperIdHash, bytes32 intentHash)\n {\n return(\n _proof.signals[0],\n _proof.signals[1],\n bytes32(_proof.signals[2]),\n bytes32(_proof.signals[3]),\n bytes32(_proof.signals[4])\n );\n }\n}\n" + }, + "contracts/ramps/hdfc/mocks/HDFCTimestampParsingMock.sol": { + "content": "//SPDX-License-Identifier: MIT\n\nimport { HDFCTimestampParsing } from \"../lib/HDFCTimestampParsing.sol\";\n\npragma solidity ^0.8.18;\n\ncontract HDFCTimestampParsingMock {\n\n /**\n * @notice Iterates through every character in the date string and splits the string at each space or colon. Function will revert\n * if there are not 8 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 HDFC, not suitable for use with other date formats.\n */\n function dateStringToTimestamp(string memory _dateString) external pure returns (uint256) {\n return HDFCTimestampParsing._dateStringToTimestamp(_dateString);\n }\n\n /**\n * @notice Adds or subtracts an offset from the calculated unOffset timestamp based on the timezone offset string. The timezone offset\n * string is of the format \"+0530\" or \"-0530\" where the first character is either a \"+\" or a \"-\" and the next 4 characters are hhmm. If\n * the _timeOffsetString is \"+0530\" then we subtract 5 hours and 30 minutes (19800s) from the unOffset timestamp, to get a GMT timestamp.\n * We constrain the _timeOffsetString to be 5 characters long to be of the format +/-hhmm.\n *\n * @param unOffsetTimestamp The unix timestamp without any timezone offset applied\n * @param _timeOffsetString The timezone offset string indicating the magnitude and direction of the timezone offset\n */\n function _calculateTimestampWithOffset(uint256 unOffsetTimestamp, string memory _timeOffsetString) external pure returns (uint256) {\n return HDFCTimestampParsing._calculateTimestampWithOffset(unOffsetTimestamp, _timeOffsetString);\n }\n\n function _parseMonth(string memory _month) external pure returns (uint256) {\n return HDFCTimestampParsing._parseMonth(_month);\n }\n}\n" + }, + "contracts/ramps/revolut/interfaces/IRevolutAccountRegistrationProcessor.sol": { + "content": "//SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.18;\n\ninterface IRevolutAccountRegistrationProcessor {\n\n struct RegistrationData {\n string endpoint;\n string host;\n string profileId;\n address userAddress;\n uint256 notaryKeyHash;\n }\n\n struct RegistrationProof {\n RegistrationData public_values;\n bytes proof;\n }\n\n function processProof(\n RegistrationProof calldata _proof\n )\n external\n returns (bytes32);\n}\n" + }, + "contracts/ramps/revolut/interfaces/IRevolutAccountRegistry.sol": { + "content": "//SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.18;\n\ninterface IRevolutAccountRegistry {\n function getAccountId(address _account) external view returns (bytes32);\n function isRegisteredUser(address _account) external view returns (bool);\n function isAllowedUser(address _account, bytes32 _deniedUser) external view returns (bool);\n}\n" + }, + "contracts/ramps/revolut/interfaces/IRevolutSendProcessor.sol": { + "content": "//SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.18;\n\ninterface IRevolutSendProcessor {\n\n struct SendData {\n string endpoint;\n string host;\n string transferId;\n string recipientId;\n string amount;\n string currencyId;\n string status;\n string timestamp;\n uint256 intentHash;\n uint256 notaryKeyHash;\n }\n\n struct SendProof {\n SendData public_values;\n bytes proof;\n }\n\n function processProof(\n SendProof calldata _proof,\n address _verifierSigningKey\n )\n external\n returns(uint256, uint256, bytes32, bytes32, bytes32);\n}\n" + }, + "contracts/ramps/revolut/mocks/RevolutAccountRegistrationProcessorMock.sol": { + "content": "//SPDX-License-Identifier: MIT\n\nimport { IRevolutAccountRegistrationProcessor } from \"../interfaces/IRevolutAccountRegistrationProcessor.sol\";\nimport { StringConversionUtils } from \"../../../lib/StringConversionUtils.sol\";\n\npragma solidity ^0.8.18;\n\ncontract RevolutAccountRegistrationProcessorMock is IRevolutAccountRegistrationProcessor {\n\n using StringConversionUtils for string;\n\n /* ============ Constructor ============ */\n constructor() {}\n\n /* ============ External View Functions ============ */\n function processProof(\n RegistrationProof calldata _proof\n )\n public\n pure\n override\n returns(bytes32 onRampId)\n {\n return bytes32(_proof.public_values.profileId.stringToUint(0));\n }\n}\n" + }, + "contracts/ramps/revolut/mocks/RevolutSendProcessorMock.sol": { + "content": "//SPDX-License-Identifier: MIT\n\nimport { IRevolutSendProcessor } from \"../interfaces/IRevolutSendProcessor.sol\";\nimport { StringConversionUtils } from \"../../../lib/StringConversionUtils.sol\";\n\npragma solidity ^0.8.18;\n\ncontract RevolutSendProcessorMock is IRevolutSendProcessor {\n\n using StringConversionUtils for string;\n\n /* ============ Constructor ============ */\n constructor() {}\n\n /* ============ External View Functions ============ */\n function processProof(\n SendProof calldata _proof,\n address /*_verifierSigningKey*/\n )\n public\n pure\n override\n returns(\n uint256 amount,\n uint256 timestamp,\n bytes32 revolutTagHash,\n bytes32 currencyId,\n bytes32 notaryKeyHash\n )\n {\n return(\n _proof.public_values.amount.stringToUint(6),\n _proof.public_values.timestamp.stringToUint(0),\n keccak256(abi.encodePacked(_proof.public_values.recipientId)),\n keccak256(abi.encodePacked(_proof.public_values.currencyId)),\n bytes32(_proof.public_values.notaryKeyHash)\n );\n }\n}\n" + }, + "contracts/ramps/revolut/RevolutAccountRegistrationProcessor.sol": { + "content": "//SPDX-License-Identifier: MIT\n\nimport { ECDSA } from \"@openzeppelin/contracts/utils/cryptography/ECDSA.sol\";\nimport { SignatureChecker } from \"@openzeppelin/contracts/utils/cryptography/SignatureChecker.sol\";\n\nimport { INullifierRegistry } from \"../../processors/nullifierRegistries/INullifierRegistry.sol\";\nimport { IRevolutAccountRegistrationProcessor } from \"./interfaces/IRevolutAccountRegistrationProcessor.sol\";\nimport { StringConversionUtils } from \"../../lib/StringConversionUtils.sol\";\nimport { TLSBaseProcessor } from \"../../processors/TLSBaseProcessor.sol\";\n\npragma solidity ^0.8.18;\n\ncontract RevolutAccountRegistrationProcessor is IRevolutAccountRegistrationProcessor, TLSBaseProcessor {\n\n using ECDSA for bytes32;\n using SignatureChecker for address;\n using StringConversionUtils for string;\n \n /* ============ Events ============ */\n event VerifierSigningKeySet(address _verifierSigningKey);\n \n /* ============ Public Variables ============ */\n address public verifierSigningKey;\n bytes32 public notaryKeyHash;\n \n /* ============ Constructor ============ */\n constructor(\n address _ramp,\n address _verifierSigningKey,\n bytes32 _notaryKeyHash,\n INullifierRegistry _nullifierRegistry,\n uint256 _timestampBuffer,\n string memory _endpoint,\n string memory _host\n )\n TLSBaseProcessor(\n _ramp,\n _nullifierRegistry,\n _timestampBuffer,\n _endpoint,\n _host\n )\n {\n verifierSigningKey = _verifierSigningKey;\n notaryKeyHash = _notaryKeyHash;\n }\n\n /* ============ External Functions ============ */\n\n function processProof(\n IRevolutAccountRegistrationProcessor.RegistrationProof calldata _proof\n )\n public\n override\n onlyRamp\n returns(bytes32 onRampId)\n {\n _validateProof(_proof.public_values, _proof.proof);\n\n _validateTLSEndpoint(endpoint, _proof.public_values.endpoint);\n _validateTLSHost(host, _proof.public_values.host);\n\n _validateAndAddNullifier(keccak256(abi.encode(_proof.public_values.userAddress, _proof.public_values.profileId)));\n\n onRampId = bytes32(_proof.public_values.profileId.stringToUint(0));\n }\n\n /* ============ External Admin Functions ============ */\n\n function setVerifierSigningKey(address _verifierSigningKey) external onlyOwner {\n verifierSigningKey = _verifierSigningKey;\n\n emit VerifierSigningKeySet(_verifierSigningKey);\n }\n\n /* ============ View Functions ============ */\n\n function verifyProof(\n IRevolutAccountRegistrationProcessor.RegistrationData memory _publicValues,\n bytes memory _proof\n )\n public\n view\n returns(bool)\n {\n bytes memory encodedMessage = abi.encode(\n _publicValues.endpoint,\n _publicValues.host,\n _publicValues.profileId,\n _publicValues.userAddress,\n _publicValues.notaryKeyHash\n );\n\n require(bytes32(_publicValues.notaryKeyHash) == notaryKeyHash, \"Invalid notary key hash\");\n\n return _isValidSignature(encodedMessage, _proof, verifierSigningKey);\n }\n \n /* ============ Internal Functions ============ */\n\n function _validateProof(\n IRevolutAccountRegistrationProcessor.RegistrationData memory _publicValues, \n bytes memory _proof\n )\n internal\n view\n { \n require(\n verifyProof(_publicValues, _proof),\n \"Invalid proof\"\n );\n }\n}\n" + }, + "contracts/ramps/revolut/RevolutAccountRegistry.sol": { + "content": "//SPDX-License-Identifier: MIT\n\nimport { Ownable } from \"@openzeppelin/contracts/access/Ownable.sol\";\n\nimport { Bytes32ArrayUtils } from \"../../external/Bytes32ArrayUtils.sol\";\nimport { Uint256ArrayUtils } from \"../../external/Uint256ArrayUtils.sol\";\n\nimport { IRevolutAccountRegistrationProcessor } from \"./interfaces/IRevolutAccountRegistrationProcessor.sol\";\nimport { IRevolutAccountRegistry } from \"./interfaces/IRevolutAccountRegistry.sol\";\n\npragma solidity ^0.8.18;\n\ncontract RevolutAccountRegistry is IRevolutAccountRegistry, Ownable {\n using Bytes32ArrayUtils for bytes32[];\n using Uint256ArrayUtils for uint256[];\n\n /* ============ Events ============ */\n event AccountRegistered(address indexed accountOwner, bytes32 indexed accountId);\n\n event UserAddedToDenylist(bytes32 listOwner, bytes32 deniedUser);\n event UserRemovedFromDenylist(bytes32 listOwner, bytes32 approvedUser);\n\n event AllowlistEnabled(bytes32 listOwner);\n event UserAddedToAllowlist(bytes32 indexed listOwner, bytes32 allowedUser);\n event UserRemovedFromAllowlist(bytes32 indexed listOwner, bytes32 allowedUser);\n\n event NewAccountRegistrationProcessorSet(address registrationProcessor);\n\n /* ============ Structs ============ */\n\n struct DenyList {\n bytes32[] deniedUsers; // Array of accountIds that are denied from taking depositors liquidity\n mapping(bytes32 => bool) isDenied; // Mapping of accountId to boolean indicating if the user is denied\n }\n\n struct AllowList {\n bool isEnabled; // Boolean indicating if the allowlist is enabled\n bytes32[] allowedUsers; // Array of accountIds that are allowed from taking depositors liquidity\n mapping(bytes32 => bool) isAllowed; // Mapping of accountId to boolean indicating if the user is allowed\n }\n\n /* ============ Modifiers ============ */\n modifier onlyRegisteredUser() {\n require(isRegisteredUser(msg.sender), \"Caller must be registered user\");\n _;\n }\n\n /* ============ State Variables ============ */\n IRevolutAccountRegistrationProcessor public accountRegistrationProcessor; // Address of Account registration processor contract\n\n bool public isInitialized; // Indicates if contract has been initialized\n\n mapping(address => bytes32) internal accounts; // Mapping of Ethereum accounts to hash of original Rev Tag\n // resulting hash is the accountId for our system\n mapping(bytes32 => DenyList) internal denyList; // Mapping of accountId to denylist\n mapping(bytes32 => AllowList) internal allowList; // Mapping of accountId to allow list\n\n /* ============ Constructor ============ */\n constructor(\n address _owner\n )\n Ownable()\n {\n transferOwnership(_owner);\n }\n\n /* ============ External Functions ============ */\n\n /**\n * @notice Initialize Ramp with the addresses of the Processors\n *\n * @param _accountRegistrationProcessor Account Registration processor address\n */\n function initialize(\n IRevolutAccountRegistrationProcessor _accountRegistrationProcessor\n )\n external\n onlyOwner\n {\n require(!isInitialized, \"Already initialized\");\n\n accountRegistrationProcessor = _accountRegistrationProcessor;\n\n isInitialized = true;\n }\n\n /**\n * @notice Registers a new account by pulling the profileId from the proof and assigning the account owner to the\n * sender of the transaction.\n *\n * @param _proof Registration proof consisting of unredacted data being notarized and a signature\n */\n function register(\n IRevolutAccountRegistrationProcessor.RegistrationProof calldata _proof\n )\n external\n {\n require(msg.sender == _proof.public_values.userAddress, \"Caller must be address specified in proof\");\n require(accounts[msg.sender] == bytes32(0), \"Account already associated with accountId\");\n bytes32 accountId = _verifyRegistrationProof(_proof);\n\n accounts[msg.sender] = accountId;\n\n emit AccountRegistered(msg.sender, accountId);\n }\n\n /**\n * @notice Adds an accountId to a depositor's deny list. If an address associated with the banned accountId attempts to\n * signal an intent on the user's deposit they will be denied.\n *\n * @param _deniedUser accountId being banned\n */\n function addAccountToDenylist(bytes32 _deniedUser) external onlyRegisteredUser {\n bytes32 denyingUser = accounts[msg.sender];\n\n require(!denyList[denyingUser].isDenied[_deniedUser], \"User already on denylist\");\n\n denyList[denyingUser].isDenied[_deniedUser] = true;\n denyList[denyingUser].deniedUsers.push(_deniedUser);\n\n emit UserAddedToDenylist(denyingUser, _deniedUser);\n }\n\n /**\n * @notice Removes an accountId from a depositor's deny list.\n *\n * @param _approvedUser accountId being approved\n */\n function removeAccountFromDenylist(bytes32 _approvedUser) external onlyRegisteredUser {\n bytes32 approvingUser = accounts[msg.sender];\n\n require(denyList[approvingUser].isDenied[_approvedUser], \"User not on denylist\");\n\n denyList[approvingUser].isDenied[_approvedUser] = false;\n denyList[approvingUser].deniedUsers.removeStorage(_approvedUser);\n\n emit UserRemovedFromDenylist(approvingUser, _approvedUser);\n }\n\n /**\n * @notice Enables allow list for user, only users on the allow list will be able to signal intents on the user's deposit.\n */\n function enableAllowlist() external onlyRegisteredUser {\n bytes32 allowingUser = accounts[msg.sender];\n\n require(!allowList[allowingUser].isEnabled, \"Allow list already enabled\");\n\n allowList[allowingUser].isEnabled = true;\n\n emit AllowlistEnabled(allowingUser);\n }\n\n /**\n * @notice Adds passed accountIds to a depositor's allow list. All addresses associated with the allowed accountIds will\n * be able to signal intents on the user's deposit.\n *\n * @param _allowedUsers List of accountIds allowed to signal intents on the user's deposit\n */\n function addAccountsToAllowlist(bytes32[] memory _allowedUsers) external onlyRegisteredUser {\n bytes32 allowingUser = accounts[msg.sender];\n\n for(uint256 i = 0; i < _allowedUsers.length; i++) {\n bytes32 allowedUser = _allowedUsers[i];\n\n require(!allowList[allowingUser].isAllowed[allowedUser], \"User already on allowlist\");\n\n allowList[allowingUser].isAllowed[allowedUser] = true;\n allowList[allowingUser].allowedUsers.push(allowedUser);\n\n emit UserAddedToAllowlist(allowingUser, allowedUser);\n }\n }\n\n /**\n * @notice Removes an passed accountId's from allow list. If allow list is enabled only users on the allow list will be\n * able to signal intents on the user's deposit.\n *\n * @param _disallowedUsers List of accountIds being approved\n */\n function removeAccountsFromAllowlist(bytes32[] memory _disallowedUsers) external onlyRegisteredUser {\n bytes32 disallowingUser = accounts[msg.sender];\n\n for(uint256 i = 0; i < _disallowedUsers.length; i++) {\n bytes32 disallowedUser = _disallowedUsers[i];\n\n require(allowList[disallowingUser].isAllowed[disallowedUser], \"User not on allowlist\");\n\n allowList[disallowingUser].isAllowed[disallowedUser] = false;\n allowList[disallowingUser].allowedUsers.removeStorage(disallowedUser);\n\n emit UserRemovedFromAllowlist(disallowingUser, disallowedUser);\n }\n }\n\n /* ============ Governance Functions ============ */\n\n /**\n * @notice GOVERNANCE ONLY: Updates the account registration processor address used for validating and interpreting tls proofs.\n *\n * @param _registrationProcessor New registration proccesor address\n */\n function setAccountRegistrationProcessor(IRevolutAccountRegistrationProcessor _registrationProcessor) external onlyOwner {\n accountRegistrationProcessor = _registrationProcessor;\n emit NewAccountRegistrationProcessorSet(address(_registrationProcessor));\n }\n\n /* ============ External View Functions ============ */\n\n function getAccountId(address _account) public view returns (bytes32) {\n return accounts[_account];\n }\n\n function isRegisteredUser(address _account) public view returns (bool) {\n return getAccountId(_account) != bytes32(0);\n }\n\n function getDeniedUsers(address _account) external view returns (bytes32[] memory) {\n return denyList[getAccountId(_account)].deniedUsers;\n }\n\n function isDeniedUser(address _account, bytes32 _deniedUser) external view returns (bool) {\n return denyList[getAccountId(_account)].isDenied[_deniedUser];\n }\n\n function isAllowlistEnabled(address _account) external view returns (bool) {\n return allowList[getAccountId(_account)].isEnabled;\n }\n\n function getAllowedUsers(address _account) external view returns (bytes32[] memory) {\n return allowList[getAccountId(_account)].allowedUsers;\n }\n\n function isAllowedUser(address _account, bytes32 _allowedUser) external view returns (bool) {\n bytes32 allowingUser = getAccountId(_account);\n\n // Deny list overrides, if user on deny list then they are not allowed\n if(denyList[allowingUser].isDenied[_allowedUser]) { return false; }\n\n // Check if allow list is enabled, if so return status of user, else return true\n return allowList[allowingUser].isEnabled ? allowList[allowingUser].isAllowed[_allowedUser] : true;\n }\n \n /* ============ Internal Functions ============ */\n\n /**\n * @notice Validate the user has an Revolut account. We nullify this accountId along with the calling address so that\n * it can't be used again.\n */\n function _verifyRegistrationProof(\n IRevolutAccountRegistrationProcessor.RegistrationProof calldata _proof\n )\n internal\n returns (bytes32 accountId)\n {\n accountId = accountRegistrationProcessor.processProof(_proof);\n }\n}\n" + }, + "contracts/ramps/revolut/RevolutRamp.sol": { + "content": "//SPDX-License-Identifier: MIT\n\nimport { IERC20 } from \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\nimport { Ownable } from \"@openzeppelin/contracts/access/Ownable.sol\";\n\nimport { Bytes32ArrayUtils } from \"../../external/Bytes32ArrayUtils.sol\";\nimport { Uint256ArrayUtils } from \"../../external/Uint256ArrayUtils.sol\";\n\nimport { IRevolutAccountRegistry } from \"./interfaces/IRevolutAccountRegistry.sol\";\nimport { IRevolutSendProcessor } from \"./interfaces/IRevolutSendProcessor.sol\";\n\npragma solidity ^0.8.18;\n\ncontract RevolutRamp is Ownable {\n\n using Bytes32ArrayUtils for bytes32[];\n using Uint256ArrayUtils for uint256[];\n\n /* ============ Events ============ */\n event DepositReceived(\n uint256 indexed depositId,\n bytes32 indexed offRampId,\n bytes32 indexed currencyId,\n uint256 amount,\n uint256 conversionRate\n );\n event IntentSignaled(\n bytes32 indexed intentHash,\n uint256 indexed depositId,\n bytes32 indexed accountId,\n address to,\n uint256 amount,\n uint256 timestamp\n );\n\n event IntentPruned(\n bytes32 indexed intentHash,\n uint256 indexed depositId\n );\n event IntentFulfilled(\n bytes32 indexed intentHash,\n uint256 indexed depositId,\n address indexed onRamper,\n address to,\n uint256 amount,\n uint256 feeAmount\n );\n event DepositWithdrawn(\n uint256 indexed depositId,\n address indexed depositor,\n uint256 amount\n );\n\n event DepositClosed(uint256 depositId, address depositor);\n event MinDepositAmountSet(uint256 minDepositAmount);\n event MaxOnRampAmountSet(uint256 maxOnRampAmount);\n event IntentExpirationPeriodSet(uint256 intentExpirationPeriod);\n event OnRampCooldownPeriodSet(uint256 onRampCooldownPeriod);\n event SustainabilityFeeUpdated(uint256 fee);\n event SustainabilityFeeRecipientUpdated(address feeRecipient);\n event NewSendProcessorSet(address sendProcessor);\n\n /* ============ Structs ============ */\n\n struct Deposit {\n address depositor;\n string revolutTag;\n address verifierSigningKey; // Public key of the verifier depositor wants to sign the TLS proof\n bytes32 notaryKeyHash; // Hash of notary's public key\n uint256 depositAmount; // Amount of USDC deposited\n bytes32 receiveCurrencyId; // Id of the currency to be received off-chain (bytes32(Revolut currency code))\n uint256 remainingDeposits; // Amount of remaining deposited liquidity\n uint256 outstandingIntentAmount; // Amount of outstanding intents (may include expired intents)\n uint256 conversionRate; // Conversion required by off-ramper between USDC/USD\n bytes32[] intentHashes; // Array of hashes of all open intents (may include some expired if not pruned)\n }\n\n struct DepositWithAvailableLiquidity {\n uint256 depositId; // ID of the deposit\n bytes32 depositorId; // Depositor's accountId, this ID is a hash of the user's original Rev Tag \n Deposit deposit; // Deposit struct\n uint256 availableLiquidity; // Amount of liquidity available to signal intents (net of expired intents)\n }\n\n struct Intent {\n address onRamper; // On-ramper's address\n address to; // Address to forward funds to (can be same as onRamper)\n uint256 deposit; // ID of the deposit the intent is signaling on\n uint256 amount; // Amount of USDC the on-ramper signals intent for on-chain\n uint256 intentTimestamp; // Timestamp of when the intent was signaled\n }\n\n struct IntentWithOnRamperId {\n bytes32 intentHash; // Intent hash\n Intent intent; // Intent struct\n bytes32 onRamperId; // onRamper's onRamperId, this ID is a hash of the user's original Rev Tag\n }\n\n // A Global Account is defined as an account represented by one accountId. This is used to enforce limitations on actions across\n // all Ethereum addresses that are associated with that accountId. In this case we use it to enforce a cooldown period between on ramps,\n // restrict each Revolut account to one outstanding intent at a time, and to enforce deny lists.\n struct GlobalAccountInfo {\n bytes32 currentIntentHash; // Hash of the current open intent (if exists)\n uint256 lastOnrampTimestamp; // Timestamp of the last on-ramp transaction used to check if cooldown period elapsed\n uint256[] deposits; // Array of open account deposits\n }\n\n /* ============ Modifiers ============ */\n modifier onlyRegisteredUser() {\n require(accountRegistry.isRegisteredUser(msg.sender), \"Caller must be registered user\");\n _;\n }\n\n /* ============ Constants ============ */\n uint256 internal constant PRECISE_UNIT = 1e18;\n uint256 internal constant MAX_DEPOSITS = 5; // An account can only have max 5 different deposit parameterizations to prevent locking funds\n uint256 constant CIRCOM_PRIME_FIELD = 21888242871839275222246405745257275088548364400416034343698204186575808495617;\n uint256 constant MAX_SUSTAINABILITY_FEE = 5e16; // 5% max sustainability fee\n \n /* ============ State Variables ============ */\n IERC20 public immutable usdc; // USDC token contract\n IRevolutAccountRegistry public accountRegistry; // Account Registry contract for Revolut\n IRevolutSendProcessor public sendProcessor; // Address of send processor contract\n\n bool public isInitialized; // Indicates if contract has been initialized\n\n mapping(bytes32 => GlobalAccountInfo) internal globalAccount; // Mapping of onRamp ID to information used to enforce actions across Ethereum accounts\n mapping(uint256 => Deposit) public deposits; // Mapping of depositIds to deposit structs\n mapping(bytes32 => Intent) public intents; // Mapping of intentHashes to intent structs\n\n uint256 public minDepositAmount; // Minimum amount of USDC that can be deposited\n uint256 public maxOnRampAmount; // Maximum amount of USDC that can be on-ramped in a single transaction\n uint256 public onRampCooldownPeriod; // Time period that must elapse between completing an on-ramp and signaling a new intent\n uint256 public intentExpirationPeriod; // Time period after which an intent can be pruned from the system\n uint256 public sustainabilityFee; // Fee charged to on-rampers in preciseUnits (1e16 = 1%)\n address public sustainabilityFeeRecipient; // Address that receives the sustainability fee\n\n uint256 public depositCounter; // Counter for depositIds\n\n /* ============ Constructor ============ */\n constructor(\n address _owner,\n IERC20 _usdc,\n uint256 _minDepositAmount,\n uint256 _maxOnRampAmount,\n uint256 _intentExpirationPeriod,\n uint256 _onRampCooldownPeriod,\n uint256 _sustainabilityFee,\n address _sustainabilityFeeRecipient\n )\n Ownable()\n {\n usdc = _usdc;\n minDepositAmount = _minDepositAmount;\n maxOnRampAmount = _maxOnRampAmount;\n intentExpirationPeriod = _intentExpirationPeriod;\n onRampCooldownPeriod = _onRampCooldownPeriod;\n sustainabilityFee = _sustainabilityFee;\n sustainabilityFeeRecipient = _sustainabilityFeeRecipient;\n\n transferOwnership(_owner);\n }\n\n /* ============ External Functions ============ */\n\n /**\n * @notice Initialize Ramp with the addresses of the Processors\n *\n * @param _accountRegistry Account Registry contract for Revolut\n * @param _sendProcessor Send processor address\n */\n function initialize(\n IRevolutAccountRegistry _accountRegistry,\n IRevolutSendProcessor _sendProcessor\n )\n external\n onlyOwner\n {\n require(!isInitialized, \"Already initialized\");\n\n accountRegistry = _accountRegistry;\n sendProcessor = _sendProcessor;\n\n isInitialized = true;\n }\n\n /**\n * @notice Generates a deposit entry for off-rampers that can then be fulfilled by an on-ramper. This function will not add to\n * previous deposits. Every deposit has it's own unique identifier. User must approve the contract to transfer the deposit amount\n * of USDC.\n *\n * @param _revolutTag Depositor's Revolut tag to receive payments\n * @param _receiveCurrencyId Id of the currency to be received off-chain\n * @param _depositAmount The amount of USDC to off-ramp\n * @param _receiveAmount The amount of USD to receive\n * @param _verifierSigningKey Public key of the verifier depositor wants to sign the TLS proof\n * @param _notaryKeyHash Hash of the notary public key that is required to do notarization\n */\n function offRamp(\n string calldata _revolutTag,\n bytes32 _receiveCurrencyId,\n uint256 _depositAmount,\n uint256 _receiveAmount,\n address _verifierSigningKey,\n bytes32 _notaryKeyHash\n )\n external\n onlyRegisteredUser\n {\n bytes32 offRamperId = accountRegistry.getAccountId(msg.sender);\n GlobalAccountInfo storage globalAccountInfo = globalAccount[offRamperId];\n\n require(keccak256(abi.encode(_revolutTag)) == offRamperId, \"Revolut tag must match id\");\n require(globalAccountInfo.deposits.length < MAX_DEPOSITS, \"Maximum deposit amount reached\");\n require(_depositAmount >= minDepositAmount, \"Deposit amount must be greater than min deposit amount\");\n require(_receiveAmount > 0, \"Receive amount must be greater than 0\");\n\n uint256 conversionRate = (_depositAmount * PRECISE_UNIT) / _receiveAmount;\n uint256 depositId = depositCounter++;\n\n globalAccountInfo.deposits.push(depositId);\n\n deposits[depositId] = Deposit({\n depositor: msg.sender,\n revolutTag: _revolutTag,\n receiveCurrencyId: _receiveCurrencyId,\n depositAmount: _depositAmount,\n remainingDeposits: _depositAmount,\n outstandingIntentAmount: 0,\n conversionRate: conversionRate,\n intentHashes: new bytes32[](0),\n verifierSigningKey: _verifierSigningKey,\n notaryKeyHash: _notaryKeyHash\n });\n\n usdc.transferFrom(msg.sender, address(this), _depositAmount);\n\n emit DepositReceived(depositId, offRamperId, _receiveCurrencyId, _depositAmount, conversionRate);\n }\n\n /**\n * @notice Signals intent to pay the depositor defined in the _depositId the _amount * deposit conversionRate off-chain\n * in order to unlock _amount of funds on-chain. Each user can only have one outstanding intent at a time regardless of\n * address (tracked using accountId). Caller must not be on the depositor's deny list. If there are prunable intents then\n * they will be deleted from the deposit to be able to maintain state hygiene.\n *\n * @param _depositId The ID of the deposit the on-ramper intends to use for \n * @param _amount The amount of USDC the user wants to on-ramp\n * @param _to Address to forward funds to (can be same as onRamper)\n */\n function signalIntent(uint256 _depositId, uint256 _amount, address _to) external onlyRegisteredUser {\n bytes32 onRamperId = accountRegistry.getAccountId(msg.sender);\n Deposit storage deposit = deposits[_depositId];\n\n // Caller validity checks\n require(accountRegistry.isAllowedUser(deposit.depositor, onRamperId), \"Onramper on depositor's denylist\");\n require(\n globalAccount[onRamperId].lastOnrampTimestamp + onRampCooldownPeriod <= block.timestamp,\n \"On ramp cool down period not elapsed\"\n );\n require(globalAccount[onRamperId].currentIntentHash == bytes32(0), \"Intent still outstanding\");\n require(accountRegistry.getAccountId(deposit.depositor) != onRamperId, \"Sender cannot be the depositor\");\n\n // Intent information checks\n require(deposit.depositor != address(0), \"Deposit does not exist\");\n require(_amount > 0, \"Signaled amount must be greater than 0\");\n require(_amount <= maxOnRampAmount, \"Signaled amount must be less than max on-ramp amount\");\n require(_to != address(0), \"Cannot send to zero address\");\n\n bytes32 intentHash = _calculateIntentHash(onRamperId, _depositId);\n\n if (deposit.remainingDeposits < _amount) {\n (\n bytes32[] memory prunableIntents,\n uint256 reclaimableAmount\n ) = _getPrunableIntents(_depositId);\n\n require(deposit.remainingDeposits + reclaimableAmount >= _amount, \"Not enough liquidity\");\n\n _pruneIntents(deposit, prunableIntents);\n deposit.remainingDeposits += reclaimableAmount;\n deposit.outstandingIntentAmount -= reclaimableAmount;\n }\n\n intents[intentHash] = Intent({\n onRamper: msg.sender,\n to: _to,\n deposit: _depositId,\n amount: _amount,\n intentTimestamp: block.timestamp\n });\n\n globalAccount[onRamperId].currentIntentHash = intentHash;\n\n deposit.remainingDeposits -= _amount;\n deposit.outstandingIntentAmount += _amount;\n deposit.intentHashes.push(intentHash);\n\n emit IntentSignaled(intentHash, _depositId, onRamperId, _to, _amount, block.timestamp);\n }\n\n /**\n * @notice Only callable by the originator of the intent. Cancels an outstanding intent thus allowing user to signal a new\n * intent. Deposit state is updated to reflect the cancelled intent.\n *\n * @param _intentHash Hash of intent being cancelled\n */\n function cancelIntent(bytes32 _intentHash) external {\n Intent memory intent = intents[_intentHash];\n \n require(intent.intentTimestamp != 0, \"Intent does not exist\");\n require(\n accountRegistry.getAccountId(intent.onRamper) == accountRegistry.getAccountId(msg.sender),\n \"Sender must be the on-ramper\"\n );\n\n Deposit storage deposit = deposits[intent.deposit];\n\n _pruneIntent(deposit, _intentHash);\n\n deposit.remainingDeposits += intent.amount;\n deposit.outstandingIntentAmount -= intent.amount;\n }\n\n /**\n * @notice Anyone can submit an on-ramp transaction, even if caller isn't on-ramper. Upon submission the proof is validated,\n * intent is removed, and deposit state is updated. USDC is transferred to the on-ramper.\n *\n * @param _sendData Struct containing unredacted data from API call to Revolut\n * @param _verifierSignature Signature by verifier of the unredacted data\n */\n function onRamp(\n IRevolutSendProcessor.SendData calldata _sendData,\n bytes calldata _verifierSignature\n )\n external\n {\n (\n Intent memory intent,\n Deposit storage deposit,\n bytes32 intentHash\n ) = _verifyOnRampProof(_sendData, _verifierSignature);\n\n _pruneIntent(deposit, intentHash);\n\n deposit.outstandingIntentAmount -= intent.amount;\n globalAccount[accountRegistry.getAccountId(intent.onRamper)].lastOnrampTimestamp = block.timestamp;\n _closeDepositIfNecessary(intent.deposit, deposit);\n\n _transferFunds(intentHash, intent);\n }\n\n /**\n * @notice Allows off-ramper to release funds to the on-ramper in case of a failed on-ramp or because of some other arrangement\n * between the two parties. Upon submission we check to make sure the msg.sender is the depositor, the intent is removed, and \n * deposit state is updated. USDC is transferred to the on-ramper.\n *\n * @param _intentHash Hash of intent to resolve by releasing the funds\n */\n function releaseFundsToOnramper(bytes32 _intentHash) external {\n Intent memory intent = intents[_intentHash];\n Deposit storage deposit = deposits[intent.deposit];\n\n require(intent.onRamper != address(0), \"Intent does not exist\");\n require(deposit.depositor == msg.sender, \"Caller must be the depositor\");\n\n _pruneIntent(deposit, _intentHash);\n\n deposit.outstandingIntentAmount -= intent.amount;\n globalAccount[accountRegistry.getAccountId(intent.onRamper)].lastOnrampTimestamp = block.timestamp;\n _closeDepositIfNecessary(intent.deposit, deposit);\n\n _transferFunds(_intentHash, intent);\n }\n\n /**\n * @notice Caller must be the depositor for each depositId in the array, if not whole function fails. Depositor is returned all\n * remaining deposits and any outstanding intents that are expired. If an intent is not expired then those funds will not be\n * returned. Deposit will be deleted as long as there are no more outstanding intents.\n *\n * @param _depositIds Array of depositIds the depositor is attempting to withdraw\n */\n function withdrawDeposit(uint256[] memory _depositIds) external {\n uint256 returnAmount;\n\n for (uint256 i = 0; i < _depositIds.length; ++i) {\n uint256 depositId = _depositIds[i];\n Deposit storage deposit = deposits[depositId];\n\n require(deposit.depositor == msg.sender, \"Sender must be the depositor\");\n\n (\n bytes32[] memory prunableIntents,\n uint256 reclaimableAmount\n ) = _getPrunableIntents(depositId);\n\n _pruneIntents(deposit, prunableIntents);\n\n returnAmount += deposit.remainingDeposits + reclaimableAmount;\n \n deposit.outstandingIntentAmount -= reclaimableAmount;\n\n emit DepositWithdrawn(depositId, deposit.depositor, deposit.remainingDeposits + reclaimableAmount);\n \n delete deposit.remainingDeposits;\n _closeDepositIfNecessary(depositId, deposit);\n }\n\n usdc.transfer(msg.sender, returnAmount);\n }\n\n /* ============ Governance Functions ============ */\n\n /**\n * @notice GOVERNANCE ONLY: Updates the send processor address used for validating and interpreting zk proofs.\n *\n * @param _sendProcessor New send proccesor address\n */\n function setSendProcessor(IRevolutSendProcessor _sendProcessor) external onlyOwner {\n sendProcessor = _sendProcessor;\n emit NewSendProcessorSet(address(_sendProcessor));\n }\n\n\n /**\n * @notice GOVERNANCE ONLY: Updates the minimum deposit amount a user can specify for off-ramping.\n *\n * @param _minDepositAmount The new minimum deposit amount\n */\n function setMinDepositAmount(uint256 _minDepositAmount) external onlyOwner {\n require(_minDepositAmount != 0, \"Minimum deposit cannot be zero\");\n\n minDepositAmount = _minDepositAmount;\n emit MinDepositAmountSet(_minDepositAmount);\n }\n\n /**\n * @notice GOVERNANCE ONLY: Updates the sustainability fee. This fee is charged to on-rampers upon a successful on-ramp.\n *\n * @param _fee The new sustainability fee in precise units (10**18, ie 10% = 1e17)\n */\n function setSustainabilityFee(uint256 _fee) external onlyOwner {\n require(_fee <= MAX_SUSTAINABILITY_FEE, \"Fee cannot be greater than max fee\");\n\n sustainabilityFee = _fee;\n emit SustainabilityFeeUpdated(_fee);\n }\n\n /**\n * @notice GOVERNANCE ONLY: Updates the recepient of sustainability fees.\n *\n * @param _feeRecipient The new fee recipient address\n */\n function setSustainabilityFeeRecipient(address _feeRecipient) external onlyOwner {\n require(_feeRecipient != address(0), \"Fee recipient cannot be zero address\");\n\n sustainabilityFeeRecipient = _feeRecipient;\n emit SustainabilityFeeRecipientUpdated(_feeRecipient);\n }\n\n /**\n * @notice GOVERNANCE ONLY: Updates the max amount allowed to be on-ramped in each transaction. To on-ramp more than\n * this amount a user must make multiple transactions.\n *\n * @param _maxOnRampAmount The new max on ramp amount\n */\n function setMaxOnRampAmount(uint256 _maxOnRampAmount) external onlyOwner {\n require(_maxOnRampAmount != 0, \"Max on ramp amount cannot be zero\");\n\n maxOnRampAmount = _maxOnRampAmount;\n emit MaxOnRampAmountSet(_maxOnRampAmount);\n }\n\n /**\n * @notice GOVERNANCE ONLY: Updates the on-ramp cooldown period, once an on-ramp transaction is completed the user must wait this\n * amount of time before they can signalIntent to on-ramp again.\n *\n * @param _onRampCooldownPeriod New on-ramp cooldown period\n */\n function setOnRampCooldownPeriod(uint256 _onRampCooldownPeriod) external onlyOwner {\n onRampCooldownPeriod = _onRampCooldownPeriod;\n emit OnRampCooldownPeriodSet(_onRampCooldownPeriod);\n }\n\n /**\n * @notice GOVERNANCE ONLY: Updates the intent expiration period, after this period elapses an intent can be pruned to prevent\n * locking up a depositor's funds.\n *\n * @param _intentExpirationPeriod New intent expiration period\n */\n function setIntentExpirationPeriod(uint256 _intentExpirationPeriod) external onlyOwner {\n require(_intentExpirationPeriod != 0, \"Max intent expiration period cannot be zero\");\n\n intentExpirationPeriod = _intentExpirationPeriod;\n emit IntentExpirationPeriodSet(_intentExpirationPeriod);\n }\n\n\n /* ============ External View Functions ============ */\n\n function getDeposit(uint256 _depositId) external view returns (Deposit memory) {\n return deposits[_depositId];\n }\n\n function getIdCurrentIntentHash(address _account) public view returns (bytes32) {\n return globalAccount[accountRegistry.getAccountId(_account)].currentIntentHash;\n }\n\n function getIdCurrentIntentHashAsUint(address _account) external view returns (uint256) {\n return uint256(getIdCurrentIntentHash(_account));\n }\n\n function getLastOnRampTimestamp(address _account) external view returns (uint256) {\n return globalAccount[accountRegistry.getAccountId(_account)].lastOnrampTimestamp;\n }\n\n function getIntentsWithOnRamperId(bytes32[] calldata _intentHashes) external view returns (IntentWithOnRamperId[] memory) {\n IntentWithOnRamperId[] memory intentsWithOnRamperId = new IntentWithOnRamperId[](_intentHashes.length);\n\n for (uint256 i = 0; i < _intentHashes.length; ++i) {\n bytes32 intentHash = _intentHashes[i];\n Intent memory intent = intents[intentHash];\n intentsWithOnRamperId[i] = IntentWithOnRamperId({\n intentHash: _intentHashes[i],\n intent: intent,\n onRamperId: accountRegistry.getAccountId(intent.onRamper)\n });\n }\n\n return intentsWithOnRamperId;\n }\n\n function getAccountDeposits(address _account) external view returns (DepositWithAvailableLiquidity[] memory accountDeposits) {\n uint256[] memory accountDepositIds = globalAccount[accountRegistry.getAccountId(_account)].deposits;\n accountDeposits = new DepositWithAvailableLiquidity[](accountDepositIds.length);\n \n for (uint256 i = 0; i < accountDepositIds.length; ++i) {\n uint256 depositId = accountDepositIds[i];\n Deposit memory deposit = deposits[depositId];\n ( , uint256 reclaimableAmount) = _getPrunableIntents(depositId);\n\n accountDeposits[i] = DepositWithAvailableLiquidity({\n depositId: depositId,\n depositorId: accountRegistry.getAccountId(deposit.depositor),\n deposit: deposit,\n availableLiquidity: deposit.remainingDeposits + reclaimableAmount\n });\n }\n }\n\n function getDepositFromIds(uint256[] memory _depositIds) external view returns (DepositWithAvailableLiquidity[] memory depositArray) {\n depositArray = new DepositWithAvailableLiquidity[](_depositIds.length);\n\n for (uint256 i = 0; i < _depositIds.length; ++i) {\n uint256 depositId = _depositIds[i];\n Deposit memory deposit = deposits[depositId];\n ( , uint256 reclaimableAmount) = _getPrunableIntents(depositId);\n\n depositArray[i] = DepositWithAvailableLiquidity({\n depositId: depositId,\n depositorId: accountRegistry.getAccountId(deposit.depositor),\n deposit: deposit,\n availableLiquidity: deposit.remainingDeposits + reclaimableAmount\n });\n }\n\n return depositArray;\n }\n\n /* ============ Internal Functions ============ */\n\n /**\n * @notice Calculates the intentHash of new intent\n */\n function _calculateIntentHash(\n bytes32 _accountId,\n uint256 _depositId\n )\n internal\n view\n virtual\n returns (bytes32 intentHash)\n {\n // Mod with circom prime field to make sure it fits in a 254-bit field\n uint256 intermediateHash = uint256(keccak256(abi.encodePacked(_accountId, _depositId, block.timestamp)));\n intentHash = bytes32(intermediateHash % CIRCOM_PRIME_FIELD);\n }\n\n /**\n * @notice Cycles through all intents currently open on a deposit and sees if any have expired. If they have expired\n * the outstanding amounts are summed and returned alongside the intentHashes\n */\n function _getPrunableIntents(\n uint256 _depositId\n )\n internal\n view\n returns(bytes32[] memory prunableIntents, uint256 reclaimedAmount)\n {\n bytes32[] memory intentHashes = deposits[_depositId].intentHashes;\n prunableIntents = new bytes32[](intentHashes.length);\n\n for (uint256 i = 0; i < intentHashes.length; ++i) {\n Intent memory intent = intents[intentHashes[i]];\n if (intent.intentTimestamp + intentExpirationPeriod < block.timestamp) {\n prunableIntents[i] = intentHashes[i];\n reclaimedAmount += intent.amount;\n }\n }\n }\n\n function _pruneIntents(Deposit storage _deposit, bytes32[] memory _intents) internal {\n for (uint256 i = 0; i < _intents.length; ++i) {\n if (_intents[i] != bytes32(0)) {\n _pruneIntent(_deposit, _intents[i]);\n }\n }\n }\n\n /**\n * @notice Pruning an intent involves deleting its state from the intents mapping, zeroing out the intendee's currentIntentHash in\n * their global account mapping, and deleting the intentHash from the deposit's intentHashes array.\n */\n function _pruneIntent(Deposit storage _deposit, bytes32 _intentHash) internal {\n Intent memory intent = intents[_intentHash];\n\n delete globalAccount[accountRegistry.getAccountId(intent.onRamper)].currentIntentHash;\n delete intents[_intentHash];\n _deposit.intentHashes.removeStorage(_intentHash);\n\n emit IntentPruned(_intentHash, intent.deposit);\n }\n\n /**\n * @notice Removes a deposit if no outstanding intents AND no remaining deposits. Deleting a deposit deletes it from the\n * deposits mapping and removes tracking it in the user's accounts mapping.\n */\n function _closeDepositIfNecessary(uint256 _depositId, Deposit storage _deposit) internal {\n uint256 openDepositAmount = _deposit.outstandingIntentAmount + _deposit.remainingDeposits;\n if (openDepositAmount == 0) {\n globalAccount[accountRegistry.getAccountId(_deposit.depositor)].deposits.removeStorage(_depositId);\n emit DepositClosed(_depositId, _deposit.depositor);\n delete deposits[_depositId];\n }\n }\n\n /**\n * @notice Checks if sustainability fee has been defined, if so sends fee to the fee recipient and intent amount minus fee\n * to the on-ramper. If sustainability fee is undefined then full intent amount is transferred to on-ramper.\n */\n function _transferFunds(bytes32 _intentHash, Intent memory _intent) internal {\n uint256 fee;\n if (sustainabilityFee != 0) {\n fee = (_intent.amount * sustainabilityFee) / PRECISE_UNIT;\n usdc.transfer(sustainabilityFeeRecipient, fee);\n }\n\n uint256 onRampAmount = _intent.amount - fee;\n usdc.transfer(_intent.to, onRampAmount);\n\n emit IntentFulfilled(_intentHash, _intent.deposit, _intent.onRamper, _intent.to, onRampAmount, fee);\n }\n\n /**\n * @notice Validate send payment email and check that it hasn't already been used (done on SendProcessor).\n * Additionally, we validate that the offRamperId matches the one from the specified intent and that enough\n * was paid off-chain inclusive of the conversionRate.\n */\n function _verifyOnRampProof(\n IRevolutSendProcessor.SendData calldata _data,\n bytes calldata _verifierSignature\n )\n internal\n returns(Intent storage intent, Deposit storage deposit, bytes32 intentHash)\n {\n intentHash = bytes32(_data.intentHash);\n intent = intents[intentHash];\n require(intent.onRamper == msg.sender, \"Caller must be the on-ramper\");\n\n deposit = deposits[intent.deposit];\n\n (\n uint256 amount,\n uint256 timestamp,\n bytes32 offRamperId,\n bytes32 currencyId,\n bytes32 notaryKeyHash\n ) = sendProcessor.processProof(\n IRevolutSendProcessor.SendProof({\n public_values: _data,\n proof: _verifierSignature\n }),\n deposit.verifierSigningKey\n );\n\n require(notaryKeyHash == deposit.notaryKeyHash, \"Incorrect notary used for notarization\");\n require(currencyId == deposit.receiveCurrencyId, \"Wrong currency sent\");\n require(intent.intentTimestamp <= timestamp, \"Intent was not created before send\");\n require(keccak256(abi.encodePacked(deposit.revolutTag)) == offRamperId, \"Offramper id does not match\");\n require(amount >= (intent.amount * PRECISE_UNIT) / deposit.conversionRate, \"Payment was not enough\");\n }\n}\n" + }, + "contracts/ramps/revolut/RevolutSendProcessor.sol": { + "content": "//SPDX-License-Identifier: MIT\n\nimport { ECDSA } from \"@openzeppelin/contracts/utils/cryptography/ECDSA.sol\";\nimport { SignatureChecker } from \"@openzeppelin/contracts/utils/cryptography/SignatureChecker.sol\";\n\nimport { IKeyHashAdapterV2 } from \"../../processors/keyHashAdapters/IKeyHashAdapterV2.sol\";\nimport { INullifierRegistry } from \"../../processors/nullifierRegistries/INullifierRegistry.sol\";\nimport { IRevolutSendProcessor } from \"./interfaces/IRevolutSendProcessor.sol\";\nimport { StringConversionUtils } from \"../../lib/StringConversionUtils.sol\";\nimport { TLSBaseProcessor } from \"../../processors/TLSBaseProcessor.sol\";\n\npragma solidity ^0.8.18;\n\ncontract RevolutSendProcessor is IRevolutSendProcessor, TLSBaseProcessor {\n\n using ECDSA for bytes32;\n using SignatureChecker for address;\n using StringConversionUtils for string;\n\n /* ============ Constants ============ */\n bytes32 public constant PAYMENT_STATUS = keccak256(abi.encodePacked(\"COMPLETED\"));\n\n /* ============ Constructor ============ */\n constructor(\n address _ramp,\n INullifierRegistry _nullifierRegistry,\n uint256 _timestampBuffer,\n string memory _endpoint,\n string memory _host\n )\n TLSBaseProcessor(\n _ramp,\n _nullifierRegistry,\n _timestampBuffer,\n _endpoint,\n _host\n )\n {}\n \n /* ============ External Functions ============ */\n function processProof(\n IRevolutSendProcessor.SendProof calldata _proof,\n address _verifierSigningKey\n )\n public\n override\n onlyRamp\n returns(\n uint256 amount,\n uint256 timestamp,\n bytes32 offRamperId,\n bytes32 currencyId,\n bytes32 notaryKeyHash\n )\n {\n _validateProof(_verifierSigningKey, _proof.public_values, _proof.proof);\n\n _validateTLSEndpoint(\n endpoint.replaceString(\"*\", _proof.public_values.transferId),\n _proof.public_values.endpoint\n );\n _validateTLSHost(host, _proof.public_values.host);\n \n // Validate status\n require(\n keccak256(abi.encodePacked(_proof.public_values.status)) == PAYMENT_STATUS,\n \"Payment status not confirmed as sent\"\n );\n _validateAndAddNullifier(keccak256(abi.encodePacked(\"Revolut\", _proof.public_values.transferId)));\n\n amount = _parseAmount(_proof.public_values.amount);\n\n // Add the buffer to build in flexibility with L2 timestamps\n timestamp = _proof.public_values.timestamp.stringToUint(0) / 1000 + timestampBuffer;\n\n offRamperId = keccak256(abi.encodePacked(_proof.public_values.recipientId));\n currencyId = keccak256(abi.encodePacked(_proof.public_values.currencyId));\n notaryKeyHash = bytes32(_proof.public_values.notaryKeyHash);\n }\n\n /* ============ View Functions ============ */\n\n function verifyProof(\n address _verifierSigningKey,\n IRevolutSendProcessor.SendData memory _publicValues, \n bytes memory _proof\n )\n internal\n view\n returns(bool)\n { \n bytes memory encodedMessage = abi.encode(\n _publicValues.endpoint,\n _publicValues.host,\n _publicValues.transferId,\n _publicValues.recipientId,\n _publicValues.amount,\n _publicValues.currencyId,\n _publicValues.status,\n _publicValues.timestamp,\n _publicValues.intentHash,\n _publicValues.notaryKeyHash\n );\n return _isValidSignature(encodedMessage, _proof, _verifierSigningKey);\n }\n\n /* ============ Internal Functions ============ */\n\n function _validateProof(\n address _verifierSigningKey,\n IRevolutSendProcessor.SendData memory _publicValues, \n bytes memory _proof\n )\n internal\n view\n { \n require(\n verifyProof(_verifierSigningKey, _publicValues, _proof),\n \"Invalid proof\"\n );\n }\n\n function _parseAmount(string memory amount) internal pure returns(uint256) {\n // For send transactions, the amount is prefixed with a '-' character, if the character doesn't exist then\n // it would be a receive transaction\n require(bytes(amount)[0] == 0x2D, \"Not a send transaction\"); \n return amount.stringToUint(6);\n }\n}\n" + }, + "contracts/ramps/venmo-v1/interfaces/IRegistrationProcessor.sol": { + "content": "//SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.18;\n\ninterface IRegistrationProcessor {\n\n struct RegistrationProof {\n uint256[2] a;\n uint256[2][2] b;\n uint256[2] c;\n uint256[5] signals;\n }\n\n function processProof(\n RegistrationProof calldata _proof\n )\n external\n view\n returns (bytes32);\n}\n" + }, + "contracts/ramps/venmo-v1/interfaces/ISendProcessor.sol": { + "content": "//SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.18;\n\ninterface ISendProcessor {\n\n struct SendProof {\n uint256[2] a;\n uint256[2][2] b;\n uint256[2] c;\n uint256[12] signals;\n }\n\n function processProof(\n SendProof calldata _proof\n )\n external\n returns(uint256, uint256, bytes32, bytes32, bytes32);\n}\n" + }, + "contracts/ramps/venmo-v1/mocks/VenmoRegistrationProcessorMock.sol": { + "content": "//SPDX-License-Identifier: MIT\n\nimport { IRegistrationProcessor } from \"../interfaces/IRegistrationProcessor.sol\";\n\npragma solidity ^0.8.18;\n\ncontract VenmoRegistrationProcessorMock is IRegistrationProcessor {\n\n /* ============ Constructor ============ */\n constructor() {}\n\n /* ============ External View Functions ============ */\n function processProof(\n RegistrationProof calldata _proof\n )\n public\n pure\n override\n returns(bytes32 onRamperIdHash)\n {\n return(bytes32(_proof.signals[1]));\n }\n}\n" + }, + "contracts/ramps/venmo-v1/mocks/VenmoSendProcessorMock.sol": { + "content": "//SPDX-License-Identifier: MIT\n\nimport { ISendProcessor } from \"../interfaces/ISendProcessor.sol\";\n\npragma solidity ^0.8.18;\n\ncontract VenmoSendProcessorMock is ISendProcessor {\n\n /* ============ Constructor ============ */\n constructor() {}\n\n /* ============ External View Functions ============ */\n function processProof(\n SendProof calldata _proof\n )\n public\n pure\n override\n returns(uint256 amount, uint256 timestamp, bytes32 offRamperIdHash, bytes32 onRamperIdHash, bytes32 intentHash)\n {\n return(_proof.signals[0], _proof.signals[1], bytes32(_proof.signals[2]), bytes32(_proof.signals[3]), bytes32(_proof.signals[4]));\n }\n}\n" + }, + "contracts/ramps/venmo-v1/Ramp.sol": { + "content": "//SPDX-License-Identifier: MIT\n\nimport { IERC20 } from \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\nimport { Ownable } from \"@openzeppelin/contracts/access/Ownable.sol\";\n\nimport { Bytes32ArrayUtils } from \"../../external/Bytes32ArrayUtils.sol\";\nimport { Uint256ArrayUtils } from \"../../external/Uint256ArrayUtils.sol\";\n\nimport { IPoseidon } from \"../../interfaces/IPoseidon.sol\";\nimport { IRegistrationProcessor } from \"./interfaces/IRegistrationProcessor.sol\";\nimport { ISendProcessor } from \"./interfaces/ISendProcessor.sol\";\n\npragma solidity ^0.8.18;\n\ncontract Ramp is Ownable {\n\n using Bytes32ArrayUtils for bytes32[];\n using Uint256ArrayUtils for uint256[];\n\n /* ============ Events ============ */\n event AccountRegistered(address indexed accountOwner, bytes32 indexed venmoIdHash);\n event DepositReceived(\n uint256 indexed depositId,\n bytes32 indexed venmoId,\n uint256 amount,\n uint256 conversionRate\n );\n event IntentSignaled(\n bytes32 indexed intentHash,\n uint256 indexed depositId,\n bytes32 indexed venmoId,\n address to,\n uint256 amount,\n uint256 timestamp\n );\n\n event IntentPruned(\n bytes32 indexed intentHash,\n uint256 indexed depositId\n );\n // Do we want to emit the onRamper or the venmoId\n event IntentFulfilled(\n bytes32 indexed intentHash,\n uint256 indexed depositId,\n address indexed onRamper,\n address to,\n uint256 amount,\n uint256 feeAmount\n );\n // Do we want to emit the depositor or the venmoId\n event DepositWithdrawn(\n uint256 indexed depositId,\n address indexed depositor,\n uint256 amount\n );\n\n event DepositClosed(uint256 depositId, address depositor);\n event UserAddedToDenylist(bytes32 listOwner, bytes32 deniedUser);\n event UserRemovedFromDenylist(bytes32 listOwner, bytes32 approvedUser);\n event MinDepositAmountSet(uint256 minDepositAmount);\n event MaxOnRampAmountSet(uint256 maxOnRampAmount);\n event IntentExpirationPeriodSet(uint256 intentExpirationPeriod);\n event OnRampCooldownPeriodSet(uint256 onRampCooldownPeriod);\n event SustainabilityFeeUpdated(uint256 fee);\n event SustainabilityFeeRecipientUpdated(address feeRecipient);\n event NewSendProcessorSet(address sendProcessor);\n event NewRegistrationProcessorSet(address registrationProcessor);\n event NewReceiveProcessorSet(address receiveProcessor);\n\n /* ============ Structs ============ */\n\n // Each Account is tied to a GlobalAccount via its associated venmoIdHash. Each account is represented by an Ethereum address\n // and is allowed to have at most 5 deposits associated with it.\n struct AccountInfo {\n bytes32 venmoIdHash; // Poseidon hash of account's venmoId\n uint256[] deposits; // Array of open account deposits\n }\n\n struct Deposit {\n address depositor;\n uint256[3] packedVenmoId;\n uint256 depositAmount; // Amount of USDC deposited\n uint256 remainingDeposits; // Amount of remaining deposited liquidity\n uint256 outstandingIntentAmount; // Amount of outstanding intents (may include expired intents)\n uint256 conversionRate; // Conversion required by off-ramper between USDC/USD\n bytes32[] intentHashes; // Array of hashes of all open intents (may include some expired if not pruned)\n }\n\n struct DepositWithAvailableLiquidity {\n uint256 depositId; // ID of the deposit\n Deposit deposit; // Deposit struct\n uint256 availableLiquidity; // Amount of liquidity available to signal intents (net of expired intents)\n }\n\n struct Intent {\n address onRamper; // On-ramper's address\n address to; // Address to forward funds to (can be same as onRamper)\n uint256 deposit; // ID of the deposit the intent is signaling on\n uint256 amount; // Amount of USDC the on-ramper signals intent for on-chain\n uint256 intentTimestamp; // Timestamp of when the intent was signaled\n }\n\n struct IntentWithOnRamperId {\n Intent intent; // Intent struct\n bytes32 onRamperIdHash; // Poseidon hash of the on-ramper's venmoId\n }\n\n struct DenyList {\n bytes32[] deniedUsers; // Array of venmoIdHashes that are denied from taking depositors liquidity\n mapping(bytes32 => bool) isDenied; // Mapping of venmoIdHash to boolean indicating if the user is denied\n }\n\n // A Global Account is defined as an account represented by one venmoIdHash. This is used to enforce limitations on actions across\n // all Ethereum addresses that are associated with that venmoId. In this case we use it to enforce a cooldown period between on ramps,\n // restrict each venmo account to one outstanding intent at a time, and to enforce deny lists.\n struct GlobalAccountInfo {\n bytes32 currentIntentHash; // Hash of the current open intent (if exists)\n uint256 lastOnrampTimestamp; // Timestamp of the last on-ramp transaction used to check if cooldown period elapsed\n DenyList denyList; // Deny list of the account\n }\n\n /* ============ Modifiers ============ */\n modifier onlyRegisteredUser() {\n require(accounts[msg.sender].venmoIdHash != bytes32(0), \"Caller must be registered user\");\n _;\n }\n\n /* ============ Constants ============ */\n uint256 internal constant PRECISE_UNIT = 1e18;\n uint256 internal constant MAX_DEPOSITS = 5; // An account can only have max 5 different deposit parameterizations to prevent locking funds\n uint256 constant CIRCOM_PRIME_FIELD = 21888242871839275222246405745257275088548364400416034343698204186575808495617;\n uint256 constant MAX_SUSTAINABILITY_FEE = 5e16; // 5% max sustainability fee\n \n /* ============ State Variables ============ */\n IERC20 public immutable usdc; // USDC token contract\n IPoseidon public immutable poseidon; // Poseidon hashing contract\n IRegistrationProcessor public registrationProcessor; // Address of registration processor contract, verifies registration e-mails\n ISendProcessor public sendProcessor; // Address of send processor contract, verifies onRamp emails\n\n bool internal isInitialized; // Indicates if contract has been initialized\n\n mapping(bytes32 => GlobalAccountInfo) internal globalAccount; // Mapping of venmoIdHash to information used to enforce actions across Ethereum accounts\n mapping(address => AccountInfo) internal accounts; // Mapping of Ethereum accounts to their account information (venmoIdHash and deposits)\n mapping(uint256 => Deposit) public deposits; // Mapping of depositIds to deposit structs\n mapping(bytes32 => Intent) public intents; // Mapping of intentHashes to intent structs\n\n uint256 public minDepositAmount; // Minimum amount of USDC that can be deposited\n uint256 public maxOnRampAmount; // Maximum amount of USDC that can be on-ramped in a single transaction\n uint256 public onRampCooldownPeriod; // Time period that must elapse between completing an on-ramp and signaling a new intent\n uint256 public intentExpirationPeriod; // Time period after which an intent can be pruned from the system\n uint256 public sustainabilityFee; // Fee charged to on-rampers in preciseUnits (1e16 = 1%)\n address public sustainabilityFeeRecipient; // Address that receives the sustainability fee\n\n uint256 public depositCounter; // Counter for depositIds\n\n /* ============ Constructor ============ */\n constructor(\n address _owner,\n IERC20 _usdc,\n IPoseidon _poseidon,\n uint256 _minDepositAmount,\n uint256 _maxOnRampAmount,\n uint256 _intentExpirationPeriod,\n uint256 _onRampCooldownPeriod,\n uint256 _sustainabilityFee,\n address _sustainabilityFeeRecipient\n )\n Ownable()\n {\n usdc = _usdc;\n poseidon = _poseidon;\n minDepositAmount = _minDepositAmount;\n maxOnRampAmount = _maxOnRampAmount;\n intentExpirationPeriod = _intentExpirationPeriod;\n onRampCooldownPeriod = _onRampCooldownPeriod;\n sustainabilityFee = _sustainabilityFee;\n sustainabilityFeeRecipient = _sustainabilityFeeRecipient;\n\n transferOwnership(_owner);\n }\n\n /* ============ External Functions ============ */\n\n /**\n * @notice Initialize Ramp with the addresses of the Processors\n *\n * @param _registrationProcessor Registration processor address\n * @param _sendProcessor Send processor address\n */\n function initialize(\n IRegistrationProcessor _registrationProcessor,\n ISendProcessor _sendProcessor\n )\n external\n onlyOwner\n {\n require(!isInitialized, \"Already initialized\");\n\n registrationProcessor = _registrationProcessor;\n sendProcessor = _sendProcessor;\n\n isInitialized = true;\n }\n\n /**\n * @notice Registers a new account by pulling the hash of the account id from the proof and assigning the account owner to the\n * sender of the transaction. One venmo account can be registered to multiple Ethereum addresses.\n *\n * @param _a Parameter of zk proof\n * @param _b Parameter of zk proof\n * @param _c Parameter of zk proof\n * @param _signals Encoded public signals of the zk proof, contains mailserverHash, fromEmail, userIdHash\n */\n function register(\n uint[2] memory _a,\n uint[2][2] memory _b,\n uint[2] memory _c,\n uint[5] memory _signals\n )\n external\n {\n require(accounts[msg.sender].venmoIdHash == bytes32(0), \"Account already associated with venmoId\");\n bytes32 venmoIdHash = _verifyRegistrationProof(_a, _b, _c, _signals);\n\n accounts[msg.sender].venmoIdHash = venmoIdHash;\n\n emit AccountRegistered(msg.sender, venmoIdHash);\n }\n\n /**\n * @notice Generates a deposit entry for off-rampers that can then be fulfilled by an on-ramper. This function will not add to\n * previous deposits. Every deposit has it's own unique identifier. User must approve the contract to transfer the deposit amount\n * of USDC.\n *\n * @param _packedVenmoId The packed venmo id of the account owner (we pack for easy use with poseidon)\n * @param _depositAmount The amount of USDC to off-ramp\n * @param _receiveAmount The amount of USD to receive\n */\n function offRamp(\n uint256[3] memory _packedVenmoId,\n uint256 _depositAmount,\n uint256 _receiveAmount\n )\n external\n onlyRegisteredUser\n {\n bytes32 venmoIdHash = bytes32(poseidon.poseidon(_packedVenmoId));\n\n require(accounts[msg.sender].venmoIdHash == venmoIdHash, \"Sender must be the account owner\");\n require(accounts[msg.sender].deposits.length < MAX_DEPOSITS, \"Maximum deposit amount reached\");\n require(_depositAmount >= minDepositAmount, \"Deposit amount must be greater than min deposit amount\");\n require(_receiveAmount > 0, \"Receive amount must be greater than 0\");\n\n uint256 conversionRate = (_depositAmount * PRECISE_UNIT) / _receiveAmount;\n uint256 depositId = depositCounter++;\n\n accounts[msg.sender].deposits.push(depositId);\n\n deposits[depositId] = Deposit({\n depositor: msg.sender,\n packedVenmoId: _packedVenmoId,\n depositAmount: _depositAmount,\n remainingDeposits: _depositAmount,\n outstandingIntentAmount: 0,\n conversionRate: conversionRate,\n intentHashes: new bytes32[](0)\n });\n\n usdc.transferFrom(msg.sender, address(this), _depositAmount);\n\n emit DepositReceived(depositId, venmoIdHash, _depositAmount, conversionRate);\n }\n\n /**\n * @notice Signals intent to pay the depositor defined in the _depositId the _amount * deposit conversionRate off-chain\n * in order to unlock _amount of funds on-chain. Each user can only have one outstanding intent at a time regardless of\n * address (tracked using venmoId). Caller must not be on the depositor's deny list. If there are prunable intents then\n * they will be deleted from the deposit to be able to maintain state hygiene.\n *\n * @param _depositId The ID of the deposit the on-ramper intends to use for \n * @param _amount The amount of USDC the user wants to on-ramp\n * @param _to Address to forward funds to (can be same as onRamper)\n */\n function signalIntent(uint256 _depositId, uint256 _amount, address _to) external onlyRegisteredUser {\n bytes32 venmoIdHash = accounts[msg.sender].venmoIdHash;\n Deposit storage deposit = deposits[_depositId];\n bytes32 depositorVenmoIdHash = accounts[deposit.depositor].venmoIdHash;\n\n // Caller validity checks\n require(!globalAccount[depositorVenmoIdHash].denyList.isDenied[venmoIdHash], \"Onramper on depositor's denylist\");\n require(\n globalAccount[venmoIdHash].lastOnrampTimestamp + onRampCooldownPeriod <= block.timestamp,\n \"On ramp cool down period not elapsed\"\n );\n require(globalAccount[venmoIdHash].currentIntentHash == bytes32(0), \"Intent still outstanding\");\n require(depositorVenmoIdHash != venmoIdHash, \"Sender cannot be the depositor\");\n\n // Intent information checks\n require(deposit.depositor != address(0), \"Deposit does not exist\");\n require(_amount > 0, \"Signaled amount must be greater than 0\");\n require(_amount <= maxOnRampAmount, \"Signaled amount must be less than max on-ramp amount\");\n require(_to != address(0), \"Cannot send to zero address\");\n\n bytes32 intentHash = _calculateIntentHash(venmoIdHash, _depositId);\n\n if (deposit.remainingDeposits < _amount) {\n (\n bytes32[] memory prunableIntents,\n uint256 reclaimableAmount\n ) = _getPrunableIntents(_depositId);\n\n require(deposit.remainingDeposits + reclaimableAmount >= _amount, \"Not enough liquidity\");\n\n _pruneIntents(deposit, prunableIntents);\n deposit.remainingDeposits += reclaimableAmount;\n deposit.outstandingIntentAmount -= reclaimableAmount;\n }\n\n intents[intentHash] = Intent({\n onRamper: msg.sender,\n to: _to,\n deposit: _depositId,\n amount: _amount,\n intentTimestamp: block.timestamp\n });\n\n globalAccount[venmoIdHash].currentIntentHash = intentHash;\n\n deposit.remainingDeposits -= _amount;\n deposit.outstandingIntentAmount += _amount;\n deposit.intentHashes.push(intentHash);\n\n emit IntentSignaled(intentHash, _depositId, venmoIdHash, _to, _amount, block.timestamp);\n }\n\n /**\n * @notice Only callable by the originator of the intent. Cancels an outstanding intent thus allowing user to signal a new\n * intent. Deposit state is updated to reflect the cancelled intent.\n *\n * @param _intentHash Hash of intent being cancelled\n */\n function cancelIntent(bytes32 _intentHash) external {\n Intent memory intent = intents[_intentHash];\n \n require(intent.intentTimestamp != 0, \"Intent does not exist\");\n require(intent.onRamper == msg.sender, \"Sender must be the on-ramper\");\n\n Deposit storage deposit = deposits[intent.deposit];\n\n _pruneIntent(deposit, _intentHash);\n\n deposit.remainingDeposits += intent.amount;\n deposit.outstandingIntentAmount -= intent.amount;\n }\n\n /**\n * @notice Anyone can submit an on-ramp transaction, even if caller isn't on-ramper. Upon submission the proof is validated,\n * intent is removed, and deposit state is updated. USDC is transferred to the on-ramper.\n *\n * @param _a Parameter of zk proof\n * @param _b Parameter of zk proof\n * @param _c Parameter of zk proof\n * @param _signals Encoded public signals of the zk proof, contains mailserverHash, fromEmail, timestamp, onRamperIdHash,\n * nullifier, intentHash\n */\n function onRamp(\n uint256[2] memory _a,\n uint256[2][2] memory _b,\n uint256[2] memory _c,\n uint256[12] memory _signals\n )\n external\n {\n (\n Intent memory intent,\n Deposit storage deposit,\n bytes32 intentHash\n ) = _verifyOnRampProof(_a, _b, _c, _signals);\n\n _pruneIntent(deposit, intentHash);\n\n deposit.outstandingIntentAmount -= intent.amount;\n globalAccount[accounts[intent.onRamper].venmoIdHash].lastOnrampTimestamp = block.timestamp;\n _closeDepositIfNecessary(intent.deposit, deposit);\n\n _transferFunds(intentHash, intent);\n }\n\n /**\n * @notice Caller must be the depositor for each depositId in the array, if not whole function fails. Depositor is returned all\n * remaining deposits and any outstanding intents that are expired. If an intent is not expired then those funds will not be\n * returned. Deposit will be deleted as long as there are no more outstanding intents.\n *\n * @param _depositIds Array of depositIds the depositor is attempting to withdraw\n */\n function withdrawDeposit(uint256[] memory _depositIds) external {\n uint256 returnAmount;\n\n for (uint256 i = 0; i < _depositIds.length; ++i) {\n uint256 depositId = _depositIds[i];\n Deposit storage deposit = deposits[depositId];\n\n require(deposit.depositor == msg.sender, \"Sender must be the depositor\");\n\n (\n bytes32[] memory prunableIntents,\n uint256 reclaimableAmount\n ) = _getPrunableIntents(depositId);\n\n _pruneIntents(deposit, prunableIntents);\n\n returnAmount += deposit.remainingDeposits + reclaimableAmount;\n \n deposit.outstandingIntentAmount -= reclaimableAmount;\n\n emit DepositWithdrawn(depositId, deposit.depositor, deposit.remainingDeposits + reclaimableAmount);\n \n delete deposit.remainingDeposits;\n _closeDepositIfNecessary(depositId, deposit);\n }\n\n usdc.transfer(msg.sender, returnAmount);\n }\n\n /**\n * @notice Adds a venmoId to a depositor's deny list. If an address associated with the banned venmoId attempts to\n * signal an intent on the user's deposit they will be denied.\n *\n * @param _deniedUser Poseidon hash of the venmoId being banned\n */\n function addAccountToDenylist(bytes32 _deniedUser) external onlyRegisteredUser {\n bytes32 denyingUser = accounts[msg.sender].venmoIdHash;\n\n require(!globalAccount[denyingUser].denyList.isDenied[_deniedUser], \"User already on denylist\");\n\n globalAccount[denyingUser].denyList.isDenied[_deniedUser] = true;\n globalAccount[denyingUser].denyList.deniedUsers.push(_deniedUser);\n\n emit UserAddedToDenylist(denyingUser, _deniedUser);\n }\n\n /**\n * @notice Removes a venmoId from a depositor's deny list.\n *\n * @param _approvedUser Poseidon hash of the venmoId being approved\n */\n function removeAccountFromDenylist(bytes32 _approvedUser) external onlyRegisteredUser {\n bytes32 approvingUser = accounts[msg.sender].venmoIdHash;\n\n require(globalAccount[approvingUser].denyList.isDenied[_approvedUser], \"User not on denylist\");\n\n globalAccount[approvingUser].denyList.isDenied[_approvedUser] = false;\n globalAccount[approvingUser].denyList.deniedUsers.removeStorage(_approvedUser);\n\n emit UserRemovedFromDenylist(approvingUser, _approvedUser);\n }\n\n /* ============ Governance Functions ============ */\n\n /**\n * @notice GOVERNANCE ONLY: Updates the send processor address used for validating and interpreting zk proofs.\n *\n * @param _sendProcessor New send proccesor address\n */\n function setSendProcessor(ISendProcessor _sendProcessor) external onlyOwner {\n sendProcessor = _sendProcessor;\n emit NewSendProcessorSet(address(_sendProcessor));\n }\n\n /**\n * @notice GOVERNANCE ONLY: Updates the registration processor address used for validating and interpreting zk proofs.\n *\n * @param _registrationProcessor New registration proccesor address\n */\n function setRegistrationProcessor(IRegistrationProcessor _registrationProcessor) external onlyOwner {\n registrationProcessor = _registrationProcessor;\n emit NewRegistrationProcessorSet(address(_registrationProcessor));\n }\n\n /**\n * @notice GOVERNANCE ONLY: Updates the minimum deposit amount a user can specify for off-ramping.\n *\n * @param _minDepositAmount The new minimum deposit amount\n */\n function setMinDepositAmount(uint256 _minDepositAmount) external onlyOwner {\n require(_minDepositAmount != 0, \"Minimum deposit cannot be zero\");\n\n minDepositAmount = _minDepositAmount;\n emit MinDepositAmountSet(_minDepositAmount);\n }\n\n /**\n * @notice GOVERNANCE ONLY: Updates the sustainability fee. This fee is charged to on-rampers upon a successful on-ramp.\n *\n * @param _fee The new sustainability fee in precise units (10**18, ie 10% = 1e17)\n */\n function setSustainabilityFee(uint256 _fee) external onlyOwner {\n require(_fee <= MAX_SUSTAINABILITY_FEE, \"Fee cannot be greater than max fee\");\n\n sustainabilityFee = _fee;\n emit SustainabilityFeeUpdated(_fee);\n }\n\n /**\n * @notice GOVERNANCE ONLY: Updates the recepient of sustainability fees.\n *\n * @param _feeRecipient The new fee recipient address\n */\n function setSustainabilityFeeRecipient(address _feeRecipient) external onlyOwner {\n require(_feeRecipient != address(0), \"Fee recipient cannot be zero address\");\n\n sustainabilityFeeRecipient = _feeRecipient;\n emit SustainabilityFeeRecipientUpdated(_feeRecipient);\n }\n\n /**\n * @notice GOVERNANCE ONLY: Updates the max amount allowed to be on-ramped in each transaction. To on-ramp more than\n * this amount a user must make multiple transactions.\n *\n * @param _maxOnRampAmount The new max on ramp amount\n */\n function setMaxOnRampAmount(uint256 _maxOnRampAmount) external onlyOwner {\n require(_maxOnRampAmount != 0, \"Max on ramp amount cannot be zero\");\n\n maxOnRampAmount = _maxOnRampAmount;\n emit MaxOnRampAmountSet(_maxOnRampAmount);\n }\n\n /**\n * @notice GOVERNANCE ONLY: Updates the on-ramp cooldown period, once an on-ramp transaction is completed the user must wait this\n * amount of time before they can signalIntent to on-ramp again.\n *\n * @param _onRampCooldownPeriod New on-ramp cooldown period\n */\n function setOnRampCooldownPeriod(uint256 _onRampCooldownPeriod) external onlyOwner {\n onRampCooldownPeriod = _onRampCooldownPeriod;\n emit OnRampCooldownPeriodSet(_onRampCooldownPeriod);\n }\n\n /**\n * @notice GOVERNANCE ONLY: Updates the intent expiration period, after this period elapses an intent can be pruned to prevent\n * locking up a depositor's funds.\n *\n * @param _intentExpirationPeriod New intent expiration period\n */\n function setIntentExpirationPeriod(uint256 _intentExpirationPeriod) external onlyOwner {\n require(_intentExpirationPeriod != 0, \"Max intent expiration period cannot be zero\");\n\n intentExpirationPeriod = _intentExpirationPeriod;\n emit IntentExpirationPeriodSet(_intentExpirationPeriod);\n }\n\n\n /* ============ External View Functions ============ */\n\n function getDeposit(uint256 _depositId) external view returns (Deposit memory) {\n return deposits[_depositId];\n }\n\n function getAccountInfo(address _account) external view returns (AccountInfo memory) {\n return accounts[_account];\n }\n\n function getVenmoIdCurrentIntentHash(address _account) external view returns (bytes32) {\n return globalAccount[accounts[_account].venmoIdHash].currentIntentHash;\n }\n\n function getLastOnRampTimestamp(address _account) external view returns (uint256) {\n return globalAccount[accounts[_account].venmoIdHash].lastOnrampTimestamp;\n }\n\n function getDeniedUsers(address _account) external view returns (bytes32[] memory) {\n return globalAccount[accounts[_account].venmoIdHash].denyList.deniedUsers;\n }\n\n function isDeniedUser(address _account, bytes32 _deniedUser) external view returns (bool) {\n return globalAccount[accounts[_account].venmoIdHash].denyList.isDenied[_deniedUser];\n }\n\n function getIntentsWithOnRamperId(bytes32[] calldata _intentHashes) external view returns (IntentWithOnRamperId[] memory) {\n IntentWithOnRamperId[] memory intentsWithOnRamperId = new IntentWithOnRamperId[](_intentHashes.length);\n\n for (uint256 i = 0; i < _intentHashes.length; ++i) {\n Intent memory intent = intents[_intentHashes[i]];\n intentsWithOnRamperId[i] = IntentWithOnRamperId({\n intent: intent,\n onRamperIdHash: accounts[intent.onRamper].venmoIdHash\n });\n }\n\n return intentsWithOnRamperId;\n }\n\n function getAccountDeposits(address _account) external view returns (DepositWithAvailableLiquidity[] memory accountDeposits) {\n uint256[] memory accountDepositIds = accounts[_account].deposits;\n accountDeposits = new DepositWithAvailableLiquidity[](accountDepositIds.length);\n \n for (uint256 i = 0; i < accountDepositIds.length; ++i) {\n uint256 depositId = accountDepositIds[i];\n Deposit memory deposit = deposits[depositId];\n ( , uint256 reclaimableAmount) = _getPrunableIntents(depositId);\n\n accountDeposits[i] = DepositWithAvailableLiquidity({\n depositId: depositId,\n deposit: deposit,\n availableLiquidity: deposit.remainingDeposits + reclaimableAmount\n });\n }\n }\n\n function getDepositFromIds(uint256[] memory _depositIds) external view returns (DepositWithAvailableLiquidity[] memory depositArray) {\n depositArray = new DepositWithAvailableLiquidity[](_depositIds.length);\n\n for (uint256 i = 0; i < _depositIds.length; ++i) {\n uint256 depositId = _depositIds[i];\n Deposit memory deposit = deposits[depositId];\n ( , uint256 reclaimableAmount) = _getPrunableIntents(depositId);\n\n depositArray[i] = DepositWithAvailableLiquidity({\n depositId: depositId,\n deposit: deposit,\n availableLiquidity: deposit.remainingDeposits + reclaimableAmount\n });\n }\n\n return depositArray;\n }\n\n /* ============ Internal Functions ============ */\n\n /**\n * @notice Calculates the intentHash of new intent\n */\n function _calculateIntentHash(\n bytes32 _venmoId,\n uint256 _depositId\n )\n internal\n view\n virtual\n returns (bytes32 intentHash)\n {\n // Mod with circom prime field to make sure it fits in a 254-bit field\n uint256 intermediateHash = uint256(keccak256(abi.encodePacked(_venmoId, _depositId, block.timestamp)));\n intentHash = bytes32(intermediateHash % CIRCOM_PRIME_FIELD);\n }\n\n /**\n * @notice Cycles through all intents currently open on a deposit and sees if any have expired. If they have expired\n * the outstanding amounts are summed and returned alongside the intentHashes\n */\n function _getPrunableIntents(\n uint256 _depositId\n )\n internal\n view\n returns(bytes32[] memory prunableIntents, uint256 reclaimedAmount)\n {\n bytes32[] memory intentHashes = deposits[_depositId].intentHashes;\n prunableIntents = new bytes32[](intentHashes.length);\n\n for (uint256 i = 0; i < intentHashes.length; ++i) {\n Intent memory intent = intents[intentHashes[i]];\n if (intent.intentTimestamp + intentExpirationPeriod < block.timestamp) {\n prunableIntents[i] = intentHashes[i];\n reclaimedAmount += intent.amount;\n }\n }\n }\n\n function _pruneIntents(Deposit storage _deposit, bytes32[] memory _intents) internal {\n for (uint256 i = 0; i < _intents.length; ++i) {\n if (_intents[i] != bytes32(0)) {\n _pruneIntent(_deposit, _intents[i]);\n }\n }\n }\n\n /**\n * @notice Pruning an intent involves deleting its state from the intents mapping, zeroing out the intendee's currentIntentHash in\n * their global account mapping, and deleting the intentHash from the deposit's intentHashes array.\n */\n function _pruneIntent(Deposit storage _deposit, bytes32 _intentHash) internal {\n Intent memory intent = intents[_intentHash];\n\n delete globalAccount[accounts[intent.onRamper].venmoIdHash].currentIntentHash;\n delete intents[_intentHash];\n _deposit.intentHashes.removeStorage(_intentHash);\n\n emit IntentPruned(_intentHash, intent.deposit);\n }\n\n /**\n * @notice Removes a deposit if no outstanding intents AND no remaining deposits. Deleting a deposit deletes it from the\n * deposits mapping and removes tracking it in the user's accounts mapping.\n */\n function _closeDepositIfNecessary(uint256 _depositId, Deposit storage _deposit) internal {\n uint256 openDepositAmount = _deposit.outstandingIntentAmount + _deposit.remainingDeposits;\n if (openDepositAmount == 0) {\n accounts[_deposit.depositor].deposits.removeStorage(_depositId);\n emit DepositClosed(_depositId, _deposit.depositor);\n delete deposits[_depositId];\n }\n }\n\n /**\n * @notice Checks if sustainability fee has been defined, if so sends fee to the fee recipient and intent amount minus fee\n * to the on-ramper. If sustainability fee is undefined then full intent amount is transferred to on-ramper.\n */\n function _transferFunds(bytes32 _intentHash, Intent memory _intent) internal {\n uint256 fee;\n if (sustainabilityFee != 0) {\n fee = (_intent.amount * sustainabilityFee) / PRECISE_UNIT;\n usdc.transfer(sustainabilityFeeRecipient, fee);\n }\n\n uint256 onRampAmount = _intent.amount - fee;\n usdc.transfer(_intent.to, onRampAmount);\n\n emit IntentFulfilled(_intentHash, _intent.deposit, _intent.onRamper, _intent.to, onRampAmount, fee);\n }\n\n /**\n * @notice Validate venmo send payment email and check that it hasn't already been used (done on SendProcessor).\n * Additionally, we validate that the offRamperIdHash matches the one from the specified intent and that enough\n * was paid off-chain inclusive of the conversionRate.\n */\n function _verifyOnRampProof(\n uint256[2] memory _a,\n uint256[2][2] memory _b,\n uint256[2] memory _c,\n uint256[12] memory _signals\n )\n internal\n returns(Intent memory, Deposit storage, bytes32)\n {\n (\n uint256 amount,\n uint256 timestamp,\n bytes32 offRamperIdHash,\n bytes32 onRamperIdHash,\n bytes32 intentHash\n ) = sendProcessor.processProof(\n ISendProcessor.SendProof({\n a: _a,\n b: _b,\n c: _c,\n signals: _signals\n })\n );\n\n Intent memory intent = intents[intentHash];\n Deposit storage deposit = deposits[intent.deposit];\n\n require(intent.onRamper != address(0), \"Intent does not exist\");\n require(intent.intentTimestamp <= timestamp, \"Intent was not created before send\");\n require(accounts[deposit.depositor].venmoIdHash == offRamperIdHash, \"Offramper id does not match\");\n require(accounts[intent.onRamper].venmoIdHash == onRamperIdHash, \"Onramper id does not match\");\n require(amount >= (intent.amount * PRECISE_UNIT) / deposit.conversionRate, \"Payment was not enough\");\n\n return (intent, deposit, intentHash);\n }\n\n /**\n * @notice Validate the user has a venmo account, we do not nullify this email since it can be reused to register under\n * different addresses.\n */\n function _verifyRegistrationProof(\n uint256[2] memory _a,\n uint256[2][2] memory _b,\n uint256[2] memory _c,\n uint256[5] memory _signals\n )\n internal\n view\n returns(bytes32)\n {\n bytes32 venmoIdHash = registrationProcessor.processProof(\n IRegistrationProcessor.RegistrationProof({\n a: _a,\n b: _b,\n c: _c,\n signals: _signals\n })\n );\n\n return venmoIdHash;\n }\n}\n" + }, + "contracts/ramps/venmo-v1/VenmoRegistrationProcessor.sol": { + "content": "//SPDX-License-Identifier: MIT\n\nimport { StringUtils } from \"@zk-email/contracts/utils/StringUtils.sol\";\n\nimport { BaseProcessor } from \"../../processors/BaseProcessor.sol\";\nimport { Groth16Verifier } from \"../../verifiers/venmo_registration_verifier.sol\";\nimport { IKeyHashAdapter } from \"../../processors/keyHashAdapters/IKeyHashAdapter.sol\";\nimport { INullifierRegistry } from \"../../processors/nullifierRegistries/INullifierRegistry.sol\";\nimport { IRegistrationProcessor } from \"./interfaces/IRegistrationProcessor.sol\";\n\npragma solidity ^0.8.18;\n\ncontract VenmoRegistrationProcessor is Groth16Verifier, IRegistrationProcessor, BaseProcessor {\n\n using StringUtils for uint256[];\n\n /* ============ Constants ============ */\n uint256 constant public PACK_SIZE = 7;\n \n /* ============ Constructor ============ */\n constructor(\n address _ramp,\n IKeyHashAdapter _venmoMailserverKeyHashAdapter,\n INullifierRegistry _nullifierRegistry,\n string memory _emailFromAddress\n )\n Groth16Verifier()\n BaseProcessor(_ramp, _venmoMailserverKeyHashAdapter, _nullifierRegistry, _emailFromAddress)\n {}\n\n /* ============ External Functions ============ */\n\n function processProof(\n IRegistrationProcessor.RegistrationProof calldata _proof\n )\n public\n view\n override\n onlyRamp\n returns(bytes32 userIdHash)\n {\n require(this.verifyProof(_proof.a, _proof.b, _proof.c, _proof.signals), \"Invalid Proof\"); // checks effects iteractions, this should come first\n\n require(bytes32(_proof.signals[0]) == getMailserverKeyHash(), \"Invalid mailserver key hash\");\n\n // Signals [1:4] are the packed from email address\n string memory fromEmail = _parseSignalArray(_proof.signals, 1, 4);\n require(keccak256(abi.encodePacked(fromEmail)) == keccak256(emailFromAddress), \"Invalid email from address\");\n\n // Signals [4] is the packed onRamperIdHash\n userIdHash = bytes32(_proof.signals[4]);\n }\n\n /* ============ Internal Functions ============ */\n\n function _parseSignalArray(uint256[5] calldata _signals, uint8 _from, uint8 _to) internal pure returns (string memory) {\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/ramps/venmo-v1/VenmoSendProcessor.sol": { + "content": "//SPDX-License-Identifier: MIT\n\nimport { StringUtils } from \"@zk-email/contracts/utils/StringUtils.sol\";\n\nimport { BaseProcessor } from \"../../processors/BaseProcessor.sol\";\nimport { Groth16Verifier } from \"../../verifiers/venmo_send_verifier_v1.sol\";\nimport { IKeyHashAdapter } from \"../../processors/keyHashAdapters/IKeyHashAdapter.sol\";\nimport { INullifierRegistry } from \"../../processors/nullifierRegistries/INullifierRegistry.sol\";\nimport { ISendProcessor } from \"./interfaces/ISendProcessor.sol\";\nimport { StringConversionUtils } from \"../../lib/StringConversionUtils.sol\";\n\npragma solidity ^0.8.18;\n\ncontract VenmoSendProcessor is Groth16Verifier, ISendProcessor, BaseProcessor {\n \n using StringUtils for uint256[];\n using StringConversionUtils for string;\n\n /* ============ Constants ============ */\n uint256 constant public PACK_SIZE = 7;\n\n /* ============ Constructor ============ */\n constructor(\n address _ramp,\n IKeyHashAdapter _venmoMailserverKeyHashAdapter,\n INullifierRegistry _nullifierRegistry,\n string memory _emailFromAddress\n )\n Groth16Verifier()\n BaseProcessor(_ramp, _venmoMailserverKeyHashAdapter, _nullifierRegistry, _emailFromAddress)\n {}\n \n /* ============ External Functions ============ */\n function processProof(\n ISendProcessor.SendProof calldata _proof\n )\n public\n override\n onlyRamp\n returns(uint256 amount, uint256 timestamp, bytes32 offRamperIdHash, bytes32 onRamperIdHash, bytes32 intentHash)\n {\n require(this.verifyProof(_proof.a, _proof.b, _proof.c, _proof.signals), \"Invalid Proof\"); // checks effects iteractions, this should come first\n\n require(bytes32(_proof.signals[0]) == getMailserverKeyHash(), \"Invalid mailserver key hash\");\n\n // Signals [1:4] are the packed from email address\n string memory fromEmail = _parseSignalArray(_proof.signals, 1, 4);\n require(keccak256(abi.encodePacked(fromEmail)) == keccak256(emailFromAddress), \"Invalid email from address\");\n\n // Signals [4:5] is the packed amount, since this is a USDC amount we want to make sure the returned number is\n // properly padded to 6 decimals. If the parsed has more than 6 figures to the right of the decimal it will revert\n amount = _parseSignalArray(_proof.signals, 4, 6).stringToUint(6);\n\n // Signals [5:7] are the packed timestamp, we do not expect there to be any decimal places in this number so we\n // specify 0 decimals, if any decimal appears this function will revert\n timestamp = _parseSignalArray(_proof.signals, 6, 8).stringToUint(0);\n\n // Signals [8] is the packed offRamperIdHash\n offRamperIdHash = bytes32(_proof.signals[8]);\n\n // Signals [9] is the packed onRamperIdHash\n onRamperIdHash = bytes32(_proof.signals[9]);\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[10]));\n\n // Signals [11] is intentHash\n intentHash = bytes32(_proof.signals[11]);\n }\n\n /* ============ Internal Functions ============ */\n\n function _parseSignalArray(uint256[12] calldata _signals, uint8 _from, uint8 _to) internal pure returns (string memory) {\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/ramps/venmo-v2/interfaces/IRamp.sol": { + "content": "//SPDX-License-Identifier: MIT\n\nimport { Ramp } from \"../../venmo-v1/Ramp.sol\";\n\npragma solidity ^0.8.18;\n\ninterface IRamp {\n function getAccountInfo(address _account) external view returns (Ramp.AccountInfo memory);\n}\n" + }, + "contracts/ramps/venmo-v2/interfaces/IRegistrationProcessorV2.sol": { + "content": "//SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.18;\n\ninterface IRegistrationProcessorV2 {\n\n struct RegistrationProof {\n uint256[2] a;\n uint256[2][2] b;\n uint256[2] c;\n uint256[5] signals;\n }\n\n function processProof(\n RegistrationProof calldata _proof\n )\n external\n returns (bytes32);\n}\n" + }, + "contracts/ramps/venmo-v2/VenmoRampV2.sol": { + "content": "//SPDX-License-Identifier: MIT\n\nimport { IERC20 } from \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\nimport { Ownable } from \"@openzeppelin/contracts/access/Ownable.sol\";\n\nimport { Bytes32ArrayUtils } from \"../../external/Bytes32ArrayUtils.sol\";\nimport { Uint256ArrayUtils } from \"../../external/Uint256ArrayUtils.sol\";\n\nimport { IPoseidon } from \"../../interfaces/IPoseidon.sol\";\nimport { IRamp } from \"./interfaces/IRamp.sol\";\nimport { IRegistrationProcessorV2 } from \"./interfaces/IRegistrationProcessorV2.sol\";\nimport { ISendProcessor } from \"../venmo-v1/interfaces/ISendProcessor.sol\";\n\npragma solidity ^0.8.18;\n\ncontract VenmoRampV2 is Ownable {\n\n using Bytes32ArrayUtils for bytes32[];\n using Uint256ArrayUtils for uint256[];\n\n /* ============ Events ============ */\n event AccountRegistered(address indexed accountOwner, bytes32 indexed venmoIdHash);\n event DepositReceived(\n uint256 indexed depositId,\n bytes32 indexed venmoId,\n uint256 amount,\n uint256 conversionRate\n );\n event IntentSignaled(\n bytes32 indexed intentHash,\n uint256 indexed depositId,\n bytes32 indexed venmoId,\n address to,\n uint256 amount,\n uint256 timestamp\n );\n\n event IntentPruned(\n bytes32 indexed intentHash,\n uint256 indexed depositId\n );\n // Do we want to emit the onRamper or the venmoId\n event IntentFulfilled(\n bytes32 indexed intentHash,\n uint256 indexed depositId,\n address indexed onRamper,\n address to,\n uint256 amount,\n uint256 feeAmount\n );\n // Do we want to emit the depositor or the venmoId\n event DepositWithdrawn(\n uint256 indexed depositId,\n address indexed depositor,\n uint256 amount\n );\n\n event DepositClosed(uint256 depositId, address depositor);\n event UserAddedToDenylist(bytes32 listOwner, bytes32 deniedUser);\n event UserRemovedFromDenylist(bytes32 listOwner, bytes32 approvedUser);\n event MinDepositAmountSet(uint256 minDepositAmount);\n event MaxOnRampAmountSet(uint256 maxOnRampAmount);\n event IntentExpirationPeriodSet(uint256 intentExpirationPeriod);\n event OnRampCooldownPeriodSet(uint256 onRampCooldownPeriod);\n event SustainabilityFeeUpdated(uint256 fee);\n event SustainabilityFeeRecipientUpdated(address feeRecipient);\n event NewSendProcessorSet(address sendProcessor);\n event NewRegistrationProcessorSet(address registrationProcessor);\n event NewReceiveProcessorSet(address receiveProcessor);\n\n /* ============ Structs ============ */\n\n // Each Account is tied to a GlobalAccount via its associated venmoIdHash. Each account is represented by an Ethereum address\n // and is allowed to have at most 5 deposits associated with it.\n struct AccountInfo {\n bytes32 venmoIdHash; // Poseidon hash of account's venmoId\n uint256[] deposits; // Array of open account deposits\n }\n\n struct Deposit {\n address depositor;\n uint256[3] packedVenmoId;\n uint256 depositAmount; // Amount of USDC deposited\n uint256 remainingDeposits; // Amount of remaining deposited liquidity\n uint256 outstandingIntentAmount; // Amount of outstanding intents (may include expired intents)\n uint256 conversionRate; // Conversion required by off-ramper between USDC/USD\n bytes32[] intentHashes; // Array of hashes of all open intents (may include some expired if not pruned)\n }\n\n struct DepositWithAvailableLiquidity {\n uint256 depositId; // ID of the deposit\n bytes32 depositorIdHash; // Depositor's venmoIdHash \n Deposit deposit; // Deposit struct\n uint256 availableLiquidity; // Amount of liquidity available to signal intents (net of expired intents)\n }\n\n struct Intent {\n address onRamper; // On-ramper's address\n address to; // Address to forward funds to (can be same as onRamper)\n uint256 deposit; // ID of the deposit the intent is signaling on\n uint256 amount; // Amount of USDC the on-ramper signals intent for on-chain\n uint256 intentTimestamp; // Timestamp of when the intent was signaled\n }\n\n struct IntentWithOnRamperId {\n bytes32 intentHash; // Intent hash\n Intent intent; // Intent struct\n bytes32 onRamperIdHash; // Poseidon hash of the on-ramper's venmoId\n }\n\n struct DenyList {\n bytes32[] deniedUsers; // Array of venmoIdHashes that are denied from taking depositors liquidity\n mapping(bytes32 => bool) isDenied; // Mapping of venmoIdHash to boolean indicating if the user is denied\n }\n\n // A Global Account is defined as an account represented by one venmoIdHash. This is used to enforce limitations on actions across\n // all Ethereum addresses that are associated with that venmoId. In this case we use it to enforce a cooldown period between on ramps,\n // restrict each venmo account to one outstanding intent at a time, and to enforce deny lists.\n struct GlobalAccountInfo {\n bytes32 currentIntentHash; // Hash of the current open intent (if exists)\n uint256 lastOnrampTimestamp; // Timestamp of the last on-ramp transaction used to check if cooldown period elapsed\n DenyList denyList; // Deny list of the account\n }\n\n /* ============ Modifiers ============ */\n modifier onlyRegisteredUser() {\n require(getAccountVenmoIdHash(msg.sender) != bytes32(0), \"Caller must be registered user\");\n _;\n }\n\n /* ============ Constants ============ */\n uint256 internal constant PRECISE_UNIT = 1e18;\n uint256 internal constant MAX_DEPOSITS = 5; // An account can only have max 5 different deposit parameterizations to prevent locking funds\n uint256 constant CIRCOM_PRIME_FIELD = 21888242871839275222246405745257275088548364400416034343698204186575808495617;\n uint256 constant MAX_SUSTAINABILITY_FEE = 5e16; // 5% max sustainability fee\n \n /* ============ State Variables ============ */\n IERC20 public immutable usdc; // USDC token contract\n IPoseidon public immutable poseidon; // Poseidon hashing contract\n IRamp public immutable ramp; // V1 Ramp contract, used to share registration state\n IRegistrationProcessorV2 public registrationProcessor; // Address of registration processor contract, verifies registration e-mails\n ISendProcessor public sendProcessor; // Address of send processor contract, verifies onRamp emails\n\n bool public isInitialized; // Indicates if contract has been initialized\n\n mapping(bytes32 => GlobalAccountInfo) internal globalAccount; // Mapping of venmoIdHash to information used to enforce actions across Ethereum accounts\n mapping(address => AccountInfo) internal accounts; // Mapping of Ethereum accounts to their account information (venmoIdHash and deposits)\n mapping(uint256 => Deposit) public deposits; // Mapping of depositIds to deposit structs\n mapping(bytes32 => Intent) public intents; // Mapping of intentHashes to intent structs\n\n uint256 public minDepositAmount; // Minimum amount of USDC that can be deposited\n uint256 public maxOnRampAmount; // Maximum amount of USDC that can be on-ramped in a single transaction\n uint256 public onRampCooldownPeriod; // Time period that must elapse between completing an on-ramp and signaling a new intent\n uint256 public intentExpirationPeriod; // Time period after which an intent can be pruned from the system\n uint256 public sustainabilityFee; // Fee charged to on-rampers in preciseUnits (1e16 = 1%)\n address public sustainabilityFeeRecipient; // Address that receives the sustainability fee\n\n uint256 public depositCounter; // Counter for depositIds\n\n /* ============ Constructor ============ */\n constructor(\n address _owner,\n IRamp _ramp,\n IERC20 _usdc,\n IPoseidon _poseidon,\n uint256 _minDepositAmount,\n uint256 _maxOnRampAmount,\n uint256 _intentExpirationPeriod,\n uint256 _onRampCooldownPeriod,\n uint256 _sustainabilityFee,\n address _sustainabilityFeeRecipient\n )\n Ownable()\n {\n usdc = _usdc;\n ramp = _ramp;\n poseidon = _poseidon;\n minDepositAmount = _minDepositAmount;\n maxOnRampAmount = _maxOnRampAmount;\n intentExpirationPeriod = _intentExpirationPeriod;\n onRampCooldownPeriod = _onRampCooldownPeriod;\n sustainabilityFee = _sustainabilityFee;\n sustainabilityFeeRecipient = _sustainabilityFeeRecipient;\n\n transferOwnership(_owner);\n }\n\n /* ============ External Functions ============ */\n\n /**\n * @notice Initialize Ramp with the addresses of the Processors\n *\n * @param _registrationProcessor Registration processor address\n * @param _sendProcessor Send processor address\n */\n function initialize(\n IRegistrationProcessorV2 _registrationProcessor,\n ISendProcessor _sendProcessor\n )\n external\n onlyOwner\n {\n require(!isInitialized, \"Already initialized\");\n\n registrationProcessor = _registrationProcessor;\n sendProcessor = _sendProcessor;\n\n isInitialized = true;\n }\n\n /**\n * @notice Registers a new account by pulling the hash of the account id from the proof and assigning the account owner to the\n * sender of the transaction. One venmo account can be registered to multiple Ethereum addresses.\n *\n * @param _a Parameter of zk proof\n * @param _b Parameter of zk proof\n * @param _c Parameter of zk proof\n * @param _signals Encoded public signals of the zk proof, contains mailserverHash, fromEmail, userIdHash\n */\n function register(\n uint[2] memory _a,\n uint[2][2] memory _b,\n uint[2] memory _c,\n uint[5] memory _signals\n )\n external\n {\n require(getAccountVenmoIdHash(msg.sender) == bytes32(0), \"Account already associated with venmoId\");\n bytes32 venmoIdHash = _verifyRegistrationProof(_a, _b, _c, _signals);\n\n accounts[msg.sender].venmoIdHash = venmoIdHash;\n\n emit AccountRegistered(msg.sender, venmoIdHash);\n }\n\n /**\n * @notice Generates a deposit entry for off-rampers that can then be fulfilled by an on-ramper. This function will not add to\n * previous deposits. Every deposit has it's own unique identifier. User must approve the contract to transfer the deposit amount\n * of USDC.\n *\n * @param _packedVenmoId The packed venmo id of the account owner (we pack for easy use with poseidon)\n * @param _depositAmount The amount of USDC to off-ramp\n * @param _receiveAmount The amount of USD to receive\n */\n function offRamp(\n uint256[3] memory _packedVenmoId,\n uint256 _depositAmount,\n uint256 _receiveAmount\n )\n external\n onlyRegisteredUser\n {\n bytes32 venmoIdHash = bytes32(poseidon.poseidon(_packedVenmoId));\n\n require(getAccountVenmoIdHash(msg.sender) == venmoIdHash, \"Sender must be the account owner\");\n require(accounts[msg.sender].deposits.length < MAX_DEPOSITS, \"Maximum deposit amount reached\");\n require(_depositAmount >= minDepositAmount, \"Deposit amount must be greater than min deposit amount\");\n require(_receiveAmount > 0, \"Receive amount must be greater than 0\");\n\n uint256 conversionRate = (_depositAmount * PRECISE_UNIT) / _receiveAmount;\n uint256 depositId = depositCounter++;\n\n accounts[msg.sender].deposits.push(depositId);\n\n deposits[depositId] = Deposit({\n depositor: msg.sender,\n packedVenmoId: _packedVenmoId,\n depositAmount: _depositAmount,\n remainingDeposits: _depositAmount,\n outstandingIntentAmount: 0,\n conversionRate: conversionRate,\n intentHashes: new bytes32[](0)\n });\n\n usdc.transferFrom(msg.sender, address(this), _depositAmount);\n\n emit DepositReceived(depositId, venmoIdHash, _depositAmount, conversionRate);\n }\n\n /**\n * @notice Signals intent to pay the depositor defined in the _depositId the _amount * deposit conversionRate off-chain\n * in order to unlock _amount of funds on-chain. Each user can only have one outstanding intent at a time regardless of\n * address (tracked using venmoId). Caller must not be on the depositor's deny list. If there are prunable intents then\n * they will be deleted from the deposit to be able to maintain state hygiene.\n *\n * @param _depositId The ID of the deposit the on-ramper intends to use for \n * @param _amount The amount of USDC the user wants to on-ramp\n * @param _to Address to forward funds to (can be same as onRamper)\n */\n function signalIntent(uint256 _depositId, uint256 _amount, address _to) external onlyRegisteredUser {\n bytes32 venmoIdHash = getAccountVenmoIdHash(msg.sender);\n Deposit storage deposit = deposits[_depositId];\n bytes32 depositorVenmoIdHash = getAccountVenmoIdHash(deposit.depositor);\n\n // Caller validity checks\n require(!globalAccount[depositorVenmoIdHash].denyList.isDenied[venmoIdHash], \"Onramper on depositor's denylist\");\n require(\n globalAccount[venmoIdHash].lastOnrampTimestamp + onRampCooldownPeriod <= block.timestamp,\n \"On ramp cool down period not elapsed\"\n );\n require(globalAccount[venmoIdHash].currentIntentHash == bytes32(0), \"Intent still outstanding\");\n require(depositorVenmoIdHash != venmoIdHash, \"Sender cannot be the depositor\");\n\n // Intent information checks\n require(deposit.depositor != address(0), \"Deposit does not exist\");\n require(_amount > 0, \"Signaled amount must be greater than 0\");\n require(_amount <= maxOnRampAmount, \"Signaled amount must be less than max on-ramp amount\");\n require(_to != address(0), \"Cannot send to zero address\");\n\n bytes32 intentHash = _calculateIntentHash(venmoIdHash, _depositId);\n\n if (deposit.remainingDeposits < _amount) {\n (\n bytes32[] memory prunableIntents,\n uint256 reclaimableAmount\n ) = _getPrunableIntents(_depositId);\n\n require(deposit.remainingDeposits + reclaimableAmount >= _amount, \"Not enough liquidity\");\n\n _pruneIntents(deposit, prunableIntents);\n deposit.remainingDeposits += reclaimableAmount;\n deposit.outstandingIntentAmount -= reclaimableAmount;\n }\n\n intents[intentHash] = Intent({\n onRamper: msg.sender,\n to: _to,\n deposit: _depositId,\n amount: _amount,\n intentTimestamp: block.timestamp\n });\n\n globalAccount[venmoIdHash].currentIntentHash = intentHash;\n\n deposit.remainingDeposits -= _amount;\n deposit.outstandingIntentAmount += _amount;\n deposit.intentHashes.push(intentHash);\n\n emit IntentSignaled(intentHash, _depositId, venmoIdHash, _to, _amount, block.timestamp);\n }\n\n /**\n * @notice Only callable by the originator of the intent. Cancels an outstanding intent thus allowing user to signal a new\n * intent. Deposit state is updated to reflect the cancelled intent.\n *\n * @param _intentHash Hash of intent being cancelled\n */\n function cancelIntent(bytes32 _intentHash) external {\n Intent memory intent = intents[_intentHash];\n \n require(intent.intentTimestamp != 0, \"Intent does not exist\");\n require(\n getAccountVenmoIdHash(intent.onRamper) == getAccountVenmoIdHash(msg.sender),\n \"Sender must be the on-ramper\"\n );\n\n Deposit storage deposit = deposits[intent.deposit];\n\n _pruneIntent(deposit, _intentHash);\n\n deposit.remainingDeposits += intent.amount;\n deposit.outstandingIntentAmount -= intent.amount;\n }\n\n /**\n * @notice Anyone can submit an on-ramp transaction, even if caller isn't on-ramper. Upon submission the proof is validated,\n * intent is removed, and deposit state is updated. USDC is transferred to the on-ramper.\n *\n * @param _a Parameter of zk proof\n * @param _b Parameter of zk proof\n * @param _c Parameter of zk proof\n * @param _signals Encoded public signals of the zk proof, contains mailserverHash, fromEmail, timestamp, onRamperIdHash,\n * nullifier, intentHash\n */\n function onRamp(\n uint256[2] memory _a,\n uint256[2][2] memory _b,\n uint256[2] memory _c,\n uint256[12] memory _signals\n )\n external\n {\n (\n Intent memory intent,\n Deposit storage deposit,\n bytes32 intentHash\n ) = _verifyOnRampProof(_a, _b, _c, _signals);\n\n _pruneIntent(deposit, intentHash);\n\n deposit.outstandingIntentAmount -= intent.amount;\n globalAccount[getAccountVenmoIdHash(intent.onRamper)].lastOnrampTimestamp = block.timestamp;\n _closeDepositIfNecessary(intent.deposit, deposit);\n\n _transferFunds(intentHash, intent);\n }\n\n /**\n * @notice Allows off-ramper to release funds to the on-ramper in case of a failed on-ramp or because of some other arrangement\n * between the two parties. Upon submission we check to make sure the msg.sender is the depositor, the intent is removed, and \n * deposit state is updated. USDC is transferred to the on-ramper.\n *\n * @param _intentHash Hash of intent to resolve by releasing the funds\n */\n function releaseFundsToOnramper(bytes32 _intentHash) external {\n Intent memory intent = intents[_intentHash];\n Deposit storage deposit = deposits[intent.deposit];\n\n require(intent.onRamper != address(0), \"Intent does not exist\");\n require(deposit.depositor == msg.sender, \"Caller must be the depositor\");\n\n _pruneIntent(deposit, _intentHash);\n\n deposit.outstandingIntentAmount -= intent.amount;\n globalAccount[getAccountVenmoIdHash(intent.onRamper)].lastOnrampTimestamp = block.timestamp;\n _closeDepositIfNecessary(intent.deposit, deposit);\n\n _transferFunds(_intentHash, intent);\n }\n\n /**\n * @notice Caller must be the depositor for each depositId in the array, if not whole function fails. Depositor is returned all\n * remaining deposits and any outstanding intents that are expired. If an intent is not expired then those funds will not be\n * returned. Deposit will be deleted as long as there are no more outstanding intents.\n *\n * @param _depositIds Array of depositIds the depositor is attempting to withdraw\n */\n function withdrawDeposit(uint256[] memory _depositIds) external {\n uint256 returnAmount;\n\n for (uint256 i = 0; i < _depositIds.length; ++i) {\n uint256 depositId = _depositIds[i];\n Deposit storage deposit = deposits[depositId];\n\n require(deposit.depositor == msg.sender, \"Sender must be the depositor\");\n\n (\n bytes32[] memory prunableIntents,\n uint256 reclaimableAmount\n ) = _getPrunableIntents(depositId);\n\n _pruneIntents(deposit, prunableIntents);\n\n returnAmount += deposit.remainingDeposits + reclaimableAmount;\n \n deposit.outstandingIntentAmount -= reclaimableAmount;\n\n emit DepositWithdrawn(depositId, deposit.depositor, deposit.remainingDeposits + reclaimableAmount);\n \n delete deposit.remainingDeposits;\n _closeDepositIfNecessary(depositId, deposit);\n }\n\n usdc.transfer(msg.sender, returnAmount);\n }\n\n /**\n * @notice Adds a venmoId to a depositor's deny list. If an address associated with the banned venmoId attempts to\n * signal an intent on the user's deposit they will be denied.\n *\n * @param _deniedUser Poseidon hash of the venmoId being banned\n */\n function addAccountToDenylist(bytes32 _deniedUser) external onlyRegisteredUser {\n bytes32 denyingUser = getAccountVenmoIdHash(msg.sender);\n\n require(!globalAccount[denyingUser].denyList.isDenied[_deniedUser], \"User already on denylist\");\n\n globalAccount[denyingUser].denyList.isDenied[_deniedUser] = true;\n globalAccount[denyingUser].denyList.deniedUsers.push(_deniedUser);\n\n emit UserAddedToDenylist(denyingUser, _deniedUser);\n }\n\n /**\n * @notice Removes a venmoId from a depositor's deny list.\n *\n * @param _approvedUser Poseidon hash of the venmoId being approved\n */\n function removeAccountFromDenylist(bytes32 _approvedUser) external onlyRegisteredUser {\n bytes32 approvingUser = getAccountVenmoIdHash(msg.sender);\n\n require(globalAccount[approvingUser].denyList.isDenied[_approvedUser], \"User not on denylist\");\n\n globalAccount[approvingUser].denyList.isDenied[_approvedUser] = false;\n globalAccount[approvingUser].denyList.deniedUsers.removeStorage(_approvedUser);\n\n emit UserRemovedFromDenylist(approvingUser, _approvedUser);\n }\n\n /* ============ Governance Functions ============ */\n\n /**\n * @notice GOVERNANCE ONLY: Updates the send processor address used for validating and interpreting zk proofs.\n *\n * @param _sendProcessor New send proccesor address\n */\n function setSendProcessor(ISendProcessor _sendProcessor) external onlyOwner {\n sendProcessor = _sendProcessor;\n emit NewSendProcessorSet(address(_sendProcessor));\n }\n\n /**\n * @notice GOVERNANCE ONLY: Updates the registration processor address used for validating and interpreting zk proofs.\n *\n * @param _registrationProcessor New registration proccesor address\n */\n function setRegistrationProcessor(IRegistrationProcessorV2 _registrationProcessor) external onlyOwner {\n registrationProcessor = _registrationProcessor;\n emit NewRegistrationProcessorSet(address(_registrationProcessor));\n }\n\n /**\n * @notice GOVERNANCE ONLY: Updates the minimum deposit amount a user can specify for off-ramping.\n *\n * @param _minDepositAmount The new minimum deposit amount\n */\n function setMinDepositAmount(uint256 _minDepositAmount) external onlyOwner {\n require(_minDepositAmount != 0, \"Minimum deposit cannot be zero\");\n\n minDepositAmount = _minDepositAmount;\n emit MinDepositAmountSet(_minDepositAmount);\n }\n\n /**\n * @notice GOVERNANCE ONLY: Updates the sustainability fee. This fee is charged to on-rampers upon a successful on-ramp.\n *\n * @param _fee The new sustainability fee in precise units (10**18, ie 10% = 1e17)\n */\n function setSustainabilityFee(uint256 _fee) external onlyOwner {\n require(_fee <= MAX_SUSTAINABILITY_FEE, \"Fee cannot be greater than max fee\");\n\n sustainabilityFee = _fee;\n emit SustainabilityFeeUpdated(_fee);\n }\n\n /**\n * @notice GOVERNANCE ONLY: Updates the recepient of sustainability fees.\n *\n * @param _feeRecipient The new fee recipient address\n */\n function setSustainabilityFeeRecipient(address _feeRecipient) external onlyOwner {\n require(_feeRecipient != address(0), \"Fee recipient cannot be zero address\");\n\n sustainabilityFeeRecipient = _feeRecipient;\n emit SustainabilityFeeRecipientUpdated(_feeRecipient);\n }\n\n /**\n * @notice GOVERNANCE ONLY: Updates the max amount allowed to be on-ramped in each transaction. To on-ramp more than\n * this amount a user must make multiple transactions.\n *\n * @param _maxOnRampAmount The new max on ramp amount\n */\n function setMaxOnRampAmount(uint256 _maxOnRampAmount) external onlyOwner {\n require(_maxOnRampAmount != 0, \"Max on ramp amount cannot be zero\");\n\n maxOnRampAmount = _maxOnRampAmount;\n emit MaxOnRampAmountSet(_maxOnRampAmount);\n }\n\n /**\n * @notice GOVERNANCE ONLY: Updates the on-ramp cooldown period, once an on-ramp transaction is completed the user must wait this\n * amount of time before they can signalIntent to on-ramp again.\n *\n * @param _onRampCooldownPeriod New on-ramp cooldown period\n */\n function setOnRampCooldownPeriod(uint256 _onRampCooldownPeriod) external onlyOwner {\n onRampCooldownPeriod = _onRampCooldownPeriod;\n emit OnRampCooldownPeriodSet(_onRampCooldownPeriod);\n }\n\n /**\n * @notice GOVERNANCE ONLY: Updates the intent expiration period, after this period elapses an intent can be pruned to prevent\n * locking up a depositor's funds.\n *\n * @param _intentExpirationPeriod New intent expiration period\n */\n function setIntentExpirationPeriod(uint256 _intentExpirationPeriod) external onlyOwner {\n require(_intentExpirationPeriod != 0, \"Max intent expiration period cannot be zero\");\n\n intentExpirationPeriod = _intentExpirationPeriod;\n emit IntentExpirationPeriodSet(_intentExpirationPeriod);\n }\n\n\n /* ============ External View Functions ============ */\n\n function getDeposit(uint256 _depositId) external view returns (Deposit memory) {\n return deposits[_depositId];\n }\n\n function getAccountInfo(address _account) external view returns (AccountInfo memory) {\n return AccountInfo({\n venmoIdHash: getAccountVenmoIdHash(_account),\n deposits: accounts[_account].deposits\n });\n }\n\n function getAccountVenmoIdHash(address _account) public view returns (bytes32) {\n return accounts[_account].venmoIdHash == bytes32(0) ?\n ramp.getAccountInfo(_account).venmoIdHash :\n accounts[_account].venmoIdHash;\n }\n\n function getVenmoIdCurrentIntentHash(address _account) external view returns (bytes32) {\n return globalAccount[getAccountVenmoIdHash(_account)].currentIntentHash;\n }\n\n function getLastOnRampTimestamp(address _account) external view returns (uint256) {\n return globalAccount[getAccountVenmoIdHash(_account)].lastOnrampTimestamp;\n }\n\n function getDeniedUsers(address _account) external view returns (bytes32[] memory) {\n return globalAccount[getAccountVenmoIdHash(_account)].denyList.deniedUsers;\n }\n\n function isDeniedUser(address _account, bytes32 _deniedUser) external view returns (bool) {\n return globalAccount[getAccountVenmoIdHash(_account)].denyList.isDenied[_deniedUser];\n }\n\n function getIntentsWithOnRamperId(bytes32[] calldata _intentHashes) external view returns (IntentWithOnRamperId[] memory) {\n IntentWithOnRamperId[] memory intentsWithOnRamperId = new IntentWithOnRamperId[](_intentHashes.length);\n\n for (uint256 i = 0; i < _intentHashes.length; ++i) {\n bytes32 intentHash = _intentHashes[i];\n Intent memory intent = intents[intentHash];\n intentsWithOnRamperId[i] = IntentWithOnRamperId({\n intentHash: _intentHashes[i],\n intent: intent,\n onRamperIdHash: getAccountVenmoIdHash(intent.onRamper)\n });\n }\n\n return intentsWithOnRamperId;\n }\n\n function getAccountDeposits(address _account) external view returns (DepositWithAvailableLiquidity[] memory accountDeposits) {\n uint256[] memory accountDepositIds = accounts[_account].deposits;\n accountDeposits = new DepositWithAvailableLiquidity[](accountDepositIds.length);\n \n for (uint256 i = 0; i < accountDepositIds.length; ++i) {\n uint256 depositId = accountDepositIds[i];\n Deposit memory deposit = deposits[depositId];\n ( , uint256 reclaimableAmount) = _getPrunableIntents(depositId);\n\n accountDeposits[i] = DepositWithAvailableLiquidity({\n depositId: depositId,\n depositorIdHash: getAccountVenmoIdHash(deposit.depositor),\n deposit: deposit,\n availableLiquidity: deposit.remainingDeposits + reclaimableAmount\n });\n }\n }\n\n function getDepositFromIds(uint256[] memory _depositIds) external view returns (DepositWithAvailableLiquidity[] memory depositArray) {\n depositArray = new DepositWithAvailableLiquidity[](_depositIds.length);\n\n for (uint256 i = 0; i < _depositIds.length; ++i) {\n uint256 depositId = _depositIds[i];\n Deposit memory deposit = deposits[depositId];\n ( , uint256 reclaimableAmount) = _getPrunableIntents(depositId);\n\n depositArray[i] = DepositWithAvailableLiquidity({\n depositId: depositId,\n depositorIdHash: getAccountVenmoIdHash(deposit.depositor),\n deposit: deposit,\n availableLiquidity: deposit.remainingDeposits + reclaimableAmount\n });\n }\n\n return depositArray;\n }\n\n /* ============ Internal Functions ============ */\n\n /**\n * @notice Calculates the intentHash of new intent\n */\n function _calculateIntentHash(\n bytes32 _venmoId,\n uint256 _depositId\n )\n internal\n view\n virtual\n returns (bytes32 intentHash)\n {\n // Mod with circom prime field to make sure it fits in a 254-bit field\n uint256 intermediateHash = uint256(keccak256(abi.encodePacked(_venmoId, _depositId, block.timestamp)));\n intentHash = bytes32(intermediateHash % CIRCOM_PRIME_FIELD);\n }\n\n /**\n * @notice Cycles through all intents currently open on a deposit and sees if any have expired. If they have expired\n * the outstanding amounts are summed and returned alongside the intentHashes\n */\n function _getPrunableIntents(\n uint256 _depositId\n )\n internal\n view\n returns(bytes32[] memory prunableIntents, uint256 reclaimedAmount)\n {\n bytes32[] memory intentHashes = deposits[_depositId].intentHashes;\n prunableIntents = new bytes32[](intentHashes.length);\n\n for (uint256 i = 0; i < intentHashes.length; ++i) {\n Intent memory intent = intents[intentHashes[i]];\n if (intent.intentTimestamp + intentExpirationPeriod < block.timestamp) {\n prunableIntents[i] = intentHashes[i];\n reclaimedAmount += intent.amount;\n }\n }\n }\n\n function _pruneIntents(Deposit storage _deposit, bytes32[] memory _intents) internal {\n for (uint256 i = 0; i < _intents.length; ++i) {\n if (_intents[i] != bytes32(0)) {\n _pruneIntent(_deposit, _intents[i]);\n }\n }\n }\n\n /**\n * @notice Pruning an intent involves deleting its state from the intents mapping, zeroing out the intendee's currentIntentHash in\n * their global account mapping, and deleting the intentHash from the deposit's intentHashes array.\n */\n function _pruneIntent(Deposit storage _deposit, bytes32 _intentHash) internal {\n Intent memory intent = intents[_intentHash];\n\n delete globalAccount[getAccountVenmoIdHash(intent.onRamper)].currentIntentHash;\n delete intents[_intentHash];\n _deposit.intentHashes.removeStorage(_intentHash);\n\n emit IntentPruned(_intentHash, intent.deposit);\n }\n\n /**\n * @notice Removes a deposit if no outstanding intents AND no remaining deposits. Deleting a deposit deletes it from the\n * deposits mapping and removes tracking it in the user's accounts mapping.\n */\n function _closeDepositIfNecessary(uint256 _depositId, Deposit storage _deposit) internal {\n uint256 openDepositAmount = _deposit.outstandingIntentAmount + _deposit.remainingDeposits;\n if (openDepositAmount == 0) {\n accounts[_deposit.depositor].deposits.removeStorage(_depositId);\n emit DepositClosed(_depositId, _deposit.depositor);\n delete deposits[_depositId];\n }\n }\n\n /**\n * @notice Checks if sustainability fee has been defined, if so sends fee to the fee recipient and intent amount minus fee\n * to the on-ramper. If sustainability fee is undefined then full intent amount is transferred to on-ramper.\n */\n function _transferFunds(bytes32 _intentHash, Intent memory _intent) internal {\n uint256 fee;\n if (sustainabilityFee != 0) {\n fee = (_intent.amount * sustainabilityFee) / PRECISE_UNIT;\n usdc.transfer(sustainabilityFeeRecipient, fee);\n }\n\n uint256 onRampAmount = _intent.amount - fee;\n usdc.transfer(_intent.to, onRampAmount);\n\n emit IntentFulfilled(_intentHash, _intent.deposit, _intent.onRamper, _intent.to, onRampAmount, fee);\n }\n\n /**\n * @notice Validate venmo send payment email and check that it hasn't already been used (done on SendProcessor).\n * Additionally, we validate that the offRamperIdHash matches the one from the specified intent and that enough\n * was paid off-chain inclusive of the conversionRate.\n */\n function _verifyOnRampProof(\n uint256[2] memory _a,\n uint256[2][2] memory _b,\n uint256[2] memory _c,\n uint256[12] memory _signals\n )\n internal\n returns(Intent memory, Deposit storage, bytes32)\n {\n (\n uint256 amount,\n uint256 timestamp,\n bytes32 offRamperIdHash,\n bytes32 onRamperIdHash,\n bytes32 intentHash\n ) = sendProcessor.processProof(\n ISendProcessor.SendProof({\n a: _a,\n b: _b,\n c: _c,\n signals: _signals\n })\n );\n\n Intent memory intent = intents[intentHash];\n Deposit storage deposit = deposits[intent.deposit];\n\n require(intent.onRamper != address(0), \"Intent does not exist\");\n require(intent.intentTimestamp <= timestamp, \"Intent was not created before send\");\n require(getAccountVenmoIdHash(deposit.depositor) == offRamperIdHash, \"Offramper id does not match\");\n require(getAccountVenmoIdHash(intent.onRamper) == onRamperIdHash, \"Onramper id does not match\");\n require(amount >= (intent.amount * PRECISE_UNIT) / deposit.conversionRate, \"Payment was not enough\");\n\n return (intent, deposit, intentHash);\n }\n\n /**\n * @notice Validate the user has a venmo account, we do not nullify this email since it can be reused to register under\n * different addresses.\n */\n function _verifyRegistrationProof(\n uint256[2] memory _a,\n uint256[2][2] memory _b,\n uint256[2] memory _c,\n uint256[5] memory _signals\n )\n internal\n returns(bytes32)\n {\n bytes32 venmoIdHash = registrationProcessor.processProof(\n IRegistrationProcessorV2.RegistrationProof({\n a: _a,\n b: _b,\n c: _c,\n signals: _signals\n })\n );\n\n return venmoIdHash;\n }\n}\n" + }, + "contracts/ramps/venmo-v2/VenmoRegistrationProcessorV2.sol": { + "content": "//SPDX-License-Identifier: MIT\n\nimport { StringUtils } from \"@zk-email/contracts/utils/StringUtils.sol\";\n\nimport { BaseProcessorV2 } from \"../../processors/BaseProcessorV2.sol\";\nimport { Groth16Verifier } from \"../../verifiers/venmo_registration_verifier.sol\";\nimport { IKeyHashAdapterV2 } from \"../../processors/keyHashAdapters/IKeyHashAdapterV2.sol\";\nimport { INullifierRegistry } from \"../../processors/nullifierRegistries/INullifierRegistry.sol\";\nimport { IRegistrationProcessorV2 } from \"./interfaces/IRegistrationProcessorV2.sol\";\n\npragma solidity ^0.8.18;\n\ncontract VenmoRegistrationProcessorV2 is Groth16Verifier, IRegistrationProcessorV2, BaseProcessorV2 {\n\n using StringUtils for uint256[];\n\n /* ============ Constants ============ */\n uint256 constant public PACK_SIZE = 7;\n \n /* ============ Constructor ============ */\n constructor(\n address _ramp,\n IKeyHashAdapterV2 _venmoMailserverKeyHashAdapter,\n INullifierRegistry _nullifierRegistry,\n string memory _emailFromAddress,\n uint256 _timestampBuffer\n )\n Groth16Verifier()\n BaseProcessorV2(\n _ramp,\n _venmoMailserverKeyHashAdapter,\n _nullifierRegistry,\n _emailFromAddress,\n _timestampBuffer\n )\n {}\n\n /* ============ External Functions ============ */\n\n function processProof(\n IRegistrationProcessorV2.RegistrationProof calldata _proof\n )\n public\n override\n onlyRamp\n returns(bytes32 userIdHash)\n {\n require(this.verifyProof(_proof.a, _proof.b, _proof.c, _proof.signals), \"Invalid Proof\"); // checks effects iteractions, this should come first\n\n require(isMailServerKeyHash(bytes32(_proof.signals[0])), \"Invalid mailserver key hash\");\n\n // Signals [1:4] are the packed from email address\n string memory fromEmail = _parseSignalArray(_proof.signals, 1, 4);\n require(keccak256(abi.encodePacked(fromEmail)) == keccak256(emailFromAddress), \"Invalid email from address\");\n\n _validateAndAddNullifier(keccak256(abi.encode(_proof)));\n\n // Signals [4] is the packed onRamperIdHash\n userIdHash = bytes32(_proof.signals[4]);\n }\n\n /* ============ Internal Functions ============ */\n\n function _parseSignalArray(uint256[5] calldata _signals, uint8 _from, uint8 _to) internal pure returns (string memory) {\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/ramps/venmo-v2/VenmoSendProcessorV2.sol": { + "content": "//SPDX-License-Identifier: MIT\n\nimport { StringUtils } from \"@zk-email/contracts/utils/StringUtils.sol\";\n\nimport { BaseProcessorV2 } from \"../../processors/BaseProcessorV2.sol\";\nimport { Groth16Verifier } from \"../../verifiers/venmo_send_verifier.sol\";\nimport { IKeyHashAdapterV2 } from \"../../processors/keyHashAdapters/IKeyHashAdapterV2.sol\";\nimport { INullifierRegistry } from \"../../processors/nullifierRegistries/INullifierRegistry.sol\";\nimport { ISendProcessor } from \"../venmo-v1/interfaces/ISendProcessor.sol\";\nimport { StringConversionUtils } from \"../../lib/StringConversionUtils.sol\";\n\npragma solidity ^0.8.18;\n\ncontract VenmoSendProcessorV2 is Groth16Verifier, ISendProcessor, BaseProcessorV2 {\n \n using StringUtils for uint256[];\n using StringConversionUtils for string;\n\n /* ============ Constants ============ */\n uint256 constant public PACK_SIZE = 7;\n\n /* ============ Constructor ============ */\n constructor(\n address _ramp,\n IKeyHashAdapterV2 _venmoMailserverKeyHashAdapter,\n INullifierRegistry _nullifierRegistry,\n string memory _emailFromAddress,\n uint256 _timestampBuffer\n )\n Groth16Verifier()\n BaseProcessorV2(\n _ramp,\n _venmoMailserverKeyHashAdapter,\n _nullifierRegistry,\n _emailFromAddress,\n _timestampBuffer\n )\n {}\n \n /* ============ External Functions ============ */\n function processProof(\n ISendProcessor.SendProof calldata _proof\n )\n public\n override\n onlyRamp\n returns(uint256 amount, uint256 timestamp, bytes32 offRamperIdHash, bytes32 onRamperIdHash, bytes32 intentHash)\n {\n require(this.verifyProof(_proof.a, _proof.b, _proof.c, _proof.signals), \"Invalid Proof\"); // checks effects iteractions, this should come first\n\n require(isMailServerKeyHash(bytes32(_proof.signals[0])), \"Invalid mailserver key hash\");\n\n // Signals [1:4] are the packed from email address\n string memory fromEmail = _parseSignalArray(_proof.signals, 1, 4);\n require(keccak256(abi.encodePacked(fromEmail)) == keccak256(emailFromAddress), \"Invalid email from address\");\n\n // Signals [4:5] is the packed amount, since this is a USDC amount we want to make sure the returned number is\n // properly padded to 6 decimals. If the parsed has more than 6 figures to the right of the decimal it will revert\n amount = _parseSignalArray(_proof.signals, 4, 6).stringToUint(6);\n\n // Signals [5:7] are the packed timestamp, we do not expect there to be any decimal places in this number so we\n // specify 0 decimals, if any decimal appears this function will revert\n // Add the buffer to build in flexibility with L2 timestamps\n timestamp = _parseSignalArray(_proof.signals, 6, 8).stringToUint(0) + timestampBuffer;\n\n // Signals [8] is the packed offRamperIdHash\n offRamperIdHash = bytes32(_proof.signals[8]);\n\n // Signals [9] is the packed onRamperIdHash\n onRamperIdHash = bytes32(_proof.signals[9]);\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[10]));\n\n // Signals [11] is intentHash\n intentHash = bytes32(_proof.signals[11]);\n }\n\n /* ============ Internal Functions ============ */\n\n function _parseSignalArray(uint256[12] calldata _signals, uint8 _from, uint8 _to) internal pure returns (string memory) {\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/ramps/wise/interfaces/IWiseAccountRegistrationProcessor.sol": { + "content": "//SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.18;\n\ninterface IWiseAccountRegistrationProcessor {\n\n struct RegistrationData {\n string endpoint;\n string host;\n string profileId;\n string wiseTagHash;\n address userAddress;\n }\n\n struct RegistrationProof {\n RegistrationData public_values;\n bytes proof;\n }\n\n function processProof(\n RegistrationProof calldata _proof\n )\n external\n returns (bytes32, bytes32);\n}\n" + }, + "contracts/ramps/wise/interfaces/IWiseAccountRegistry.sol": { + "content": "//SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.18;\n\ninterface IWiseAccountRegistry {\n\n // Each Account is tied to a Wise ID and is represented by an Ethereum address.\n struct AccountInfo {\n bytes32 accountId; // User's Wise account ID\n bytes32 offRampId; // Multi-currency account ID to receive funds\n bytes32 wiseTagHash; // Hash of user's wise tag account stored on register. Used to verify offramper's wise tag\n }\n\n function getAccountInfo(address _account) external view returns (AccountInfo memory);\n function getAccountId(address _account) external view returns (bytes32);\n\n function isRegisteredUser(address _account) external view returns (bool);\n \n function isAllowedUser(address _account, bytes32 _deniedUser) external view returns (bool);\n}\n" + }, + "contracts/ramps/wise/interfaces/IWiseOffRamperRegistrationProcessor.sol": { + "content": "//SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.18;\n\ninterface IWiseOffRamperRegistrationProcessor {\n\n struct OffRamperRegistrationData {\n string endpoint;\n string host;\n string profileId;\n string mcAccountId;\n }\n\n struct OffRamperRegistrationProof {\n OffRamperRegistrationData public_values;\n bytes proof;\n }\n\n function processProof(\n OffRamperRegistrationProof calldata _proof\n )\n external\n returns (bytes32, bytes32);\n}\n" + }, + "contracts/ramps/wise/interfaces/IWiseSendProcessor.sol": { + "content": "//SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.18;\n\ninterface IWiseSendProcessor {\n\n struct SendData {\n string endpoint;\n string host;\n string transferId;\n string senderId;\n string recipientId;\n string amount;\n string currencyId;\n string status;\n string timestamp;\n uint256 intentHash;\n }\n\n struct SendProof {\n SendData public_values;\n bytes proof;\n }\n\n function processProof(\n SendProof calldata _proof,\n address _verifierSigningKey\n )\n external\n returns(uint256, uint256, bytes32, bytes32);\n}\n" + }, + "contracts/ramps/wise/mocks/WiseAccountRegistrationProcessorMock.sol": { + "content": "//SPDX-License-Identifier: MIT\n\nimport { IWiseAccountRegistrationProcessor } from \"../interfaces/IWiseAccountRegistrationProcessor.sol\";\nimport { StringConversionUtils } from \"../../../lib/StringConversionUtils.sol\";\n\npragma solidity ^0.8.18;\n\ncontract WiseAccountRegistrationProcessorMock is IWiseAccountRegistrationProcessor {\n\n using StringConversionUtils for string;\n\n /* ============ Constructor ============ */\n constructor() {}\n\n /* ============ External View Functions ============ */\n function processProof(\n RegistrationProof calldata _proof\n )\n public\n pure\n override\n returns(bytes32 onRampId, bytes32 wiseTagHash)\n {\n return(\n bytes32(_proof.public_values.profileId.stringToUint(0)),\n bytes32(_proof.public_values.wiseTagHash.stringToUint(0))\n );\n }\n}\n" + }, + "contracts/ramps/wise/mocks/WiseOffRamperRegistrationProcessorMock.sol": { + "content": "//SPDX-License-Identifier: MIT\n\nimport { IWiseOffRamperRegistrationProcessor } from \"../interfaces/IWiseOffRamperRegistrationProcessor.sol\";\nimport { StringConversionUtils } from \"../../../lib/StringConversionUtils.sol\";\n\npragma solidity ^0.8.18;\n\ncontract WiseOffRamperRegistrationProcessorMock is IWiseOffRamperRegistrationProcessor {\n\n using StringConversionUtils for string;\n\n /* ============ Constructor ============ */\n constructor() {}\n\n /* ============ External View Functions ============ */\n function processProof(\n OffRamperRegistrationProof calldata _proof\n )\n public\n pure\n override\n returns(bytes32 onRampId, bytes32 wiseTagHash)\n {\n return(\n bytes32(_proof.public_values.profileId.stringToUint(0)),\n bytes32(_proof.public_values.mcAccountId.stringToUint(0))\n );\n }\n}\n" + }, + "contracts/ramps/wise/mocks/WiseSendProcessorMock.sol": { + "content": "//SPDX-License-Identifier: MIT\n\nimport { IWiseSendProcessor } from \"../interfaces/IWiseSendProcessor.sol\";\nimport { StringConversionUtils } from \"../../../lib/StringConversionUtils.sol\";\n\npragma solidity ^0.8.18;\n\ncontract WiseSendProcessorMock is IWiseSendProcessor {\n\n using StringConversionUtils for string;\n\n /* ============ Constructor ============ */\n constructor() {}\n\n /* ============ External View Functions ============ */\n function processProof(\n SendProof calldata _proof,\n address /*_verifierSigningKey*/\n )\n public\n pure\n override\n returns(\n uint256 amount,\n uint256 timestamp,\n bytes32 offRamperIdHash,\n bytes32 currencyId\n )\n {\n return(\n _proof.public_values.amount.stringToUint(6),\n _proof.public_values.timestamp.stringToUint(0),\n bytes32(_proof.public_values.recipientId.stringToUint(0)),\n keccak256(abi.encodePacked(_proof.public_values.currencyId))\n );\n }\n}\n" + }, + "contracts/ramps/wise/WiseAccountRegistrationProcessor.sol": { + "content": "//SPDX-License-Identifier: MIT\n\nimport { ECDSA } from \"@openzeppelin/contracts/utils/cryptography/ECDSA.sol\";\nimport { SignatureChecker } from \"@openzeppelin/contracts/utils/cryptography/SignatureChecker.sol\";\n\nimport { INullifierRegistry } from \"../../processors/nullifierRegistries/INullifierRegistry.sol\";\nimport { IWiseAccountRegistrationProcessor } from \"./interfaces/IWiseAccountRegistrationProcessor.sol\";\nimport { StringConversionUtils } from \"../../lib/StringConversionUtils.sol\";\nimport { TLSBaseProcessor } from \"../../processors/TLSBaseProcessor.sol\";\n\npragma solidity ^0.8.18;\n\ncontract WiseAccountRegistrationProcessor is IWiseAccountRegistrationProcessor, TLSBaseProcessor {\n\n using ECDSA for bytes32;\n using SignatureChecker for address;\n using StringConversionUtils for string;\n \n /* ============ Events ============ */\n event VerifierSigningKeySet(address _verifierSigningKey);\n \n /* ============ Public Variables ============ */\n address public verifierSigningKey;\n \n /* ============ Constructor ============ */\n constructor(\n address _ramp,\n address _verifierSigningKey,\n INullifierRegistry _nullifierRegistry,\n uint256 _timestampBuffer,\n string memory _endpoint,\n string memory _host\n )\n TLSBaseProcessor(\n _ramp,\n _nullifierRegistry,\n _timestampBuffer,\n _endpoint,\n _host\n )\n {\n verifierSigningKey = _verifierSigningKey;\n }\n\n /* ============ External Functions ============ */\n\n function processProof(\n IWiseAccountRegistrationProcessor.RegistrationProof calldata _proof\n )\n public\n override\n onlyRamp\n returns(bytes32 onRampId, bytes32 wiseTagHash)\n {\n _validateProof(_proof.public_values, _proof.proof);\n\n _validateTLSEndpoint(endpoint, _proof.public_values.endpoint);\n _validateTLSHost(host, _proof.public_values.host);\n\n _validateAndAddNullifier(keccak256(abi.encode(_proof.public_values.userAddress, _proof.public_values.profileId)));\n\n onRampId = bytes32(_proof.public_values.profileId.stringToUint(0));\n wiseTagHash = bytes32(_proof.public_values.wiseTagHash.stringToUint(0));\n }\n\n /* ============ External Admin Functions ============ */\n\n function setVerifierSigningKey(address _verifierSigningKey) external onlyOwner {\n verifierSigningKey = _verifierSigningKey;\n\n emit VerifierSigningKeySet(_verifierSigningKey);\n }\n\n /* ============ View Functions ============ */\n\n function verifyProof(\n IWiseAccountRegistrationProcessor.RegistrationData memory _publicValues,\n bytes memory _proof\n )\n public\n view\n returns(bool)\n {\n bytes memory encodedMessage = abi.encode(\n _publicValues.endpoint,\n _publicValues.host,\n _publicValues.profileId,\n _publicValues.wiseTagHash,\n _publicValues.userAddress\n );\n return _isValidSignature(encodedMessage, _proof, verifierSigningKey);\n }\n \n /* ============ Internal Functions ============ */\n\n function _validateProof(\n IWiseAccountRegistrationProcessor.RegistrationData memory _publicValues, \n bytes memory _proof\n )\n internal\n view\n { \n require(\n verifyProof(_publicValues, _proof),\n \"Invalid proof\"\n );\n }\n}\n" + }, + "contracts/ramps/wise/WiseAccountRegistry.sol": { + "content": "//SPDX-License-Identifier: MIT\n\nimport { Ownable } from \"@openzeppelin/contracts/access/Ownable.sol\";\n\nimport { Bytes32ArrayUtils } from \"../../external/Bytes32ArrayUtils.sol\";\nimport { Uint256ArrayUtils } from \"../../external/Uint256ArrayUtils.sol\";\n\nimport { IWiseAccountRegistrationProcessor } from \"./interfaces/IWiseAccountRegistrationProcessor.sol\";\nimport { IWiseAccountRegistry } from \"./interfaces/IWiseAccountRegistry.sol\";\nimport { IWiseOffRamperRegistrationProcessor } from \"./interfaces/IWiseOffRamperRegistrationProcessor.sol\";\n\npragma solidity ^0.8.18;\n\ncontract WiseAccountRegistry is IWiseAccountRegistry, Ownable {\n using Bytes32ArrayUtils for bytes32[];\n using Uint256ArrayUtils for uint256[];\n\n /* ============ Events ============ */\n event AccountRegistered(address indexed accountOwner, bytes32 indexed accountId, bytes32 indexed wiseTagHash);\n event OffRamperRegistered(address indexed accountOwner, bytes32 indexed accountId, bytes32 indexed offRampId);\n\n event UserAddedToDenylist(bytes32 listOwner, bytes32 deniedUser);\n event UserRemovedFromDenylist(bytes32 listOwner, bytes32 approvedUser);\n\n event AllowlistEnabled(bytes32 listOwner);\n event UserAddedToAllowlist(bytes32 indexed listOwner, bytes32 allowedUser);\n event UserRemovedFromAllowlist(bytes32 indexed listOwner, bytes32 allowedUser);\n\n event NewAccountRegistrationProcessorSet(address registrationProcessor);\n event NewOffRamperRegistrationProcessorSet(address registrationProcessor);\n\n /* ============ Structs ============ */\n\n struct DenyList {\n bytes32[] deniedUsers; // Array of accountIds that are denied from taking depositors liquidity\n mapping(bytes32 => bool) isDenied; // Mapping of accountId to boolean indicating if the user is denied\n }\n\n struct AllowList {\n bool isEnabled; // Boolean indicating if the allowlist is enabled\n bytes32[] allowedUsers; // Array of accountIds that are allowed from taking depositors liquidity\n mapping(bytes32 => bool) isAllowed; // Mapping of accountId to boolean indicating if the user is allowed\n }\n\n /* ============ Modifiers ============ */\n modifier onlyRegisteredUser() {\n require(isRegisteredUser(msg.sender), \"Caller must be registered user\");\n _;\n }\n\n /* ============ State Variables ============ */\n IWiseAccountRegistrationProcessor public accountRegistrationProcessor; // Address of Account registration processor contract\n IWiseOffRamperRegistrationProcessor public offRamperRegistrationProcessor; // Address of Off-ramper registration processor contract\n\n bool public isInitialized; // Indicates if contract has been initialized\n\n mapping(address => AccountInfo) internal accounts; // Mapping of Ethereum accounts to their account information (IDs and deposits)\n mapping(bytes32 => DenyList) internal denyList; // Mapping of accountId to denylist\n mapping(bytes32 => AllowList) internal allowList; // Mapping of accountId to allow list\n\n /* ============ Constructor ============ */\n constructor(\n address _owner\n )\n Ownable()\n {\n transferOwnership(_owner);\n }\n\n /* ============ External Functions ============ */\n\n /**\n * @notice Initialize Ramp with the addresses of the Processors\n *\n * @param _accountRegistrationProcessor Account Registration processor address\n * @param _offRamperRegistrationProcessor Off-ramper Registration processor address\n */\n function initialize(\n IWiseAccountRegistrationProcessor _accountRegistrationProcessor,\n IWiseOffRamperRegistrationProcessor _offRamperRegistrationProcessor\n )\n external\n onlyOwner\n {\n require(!isInitialized, \"Already initialized\");\n\n accountRegistrationProcessor = _accountRegistrationProcessor;\n offRamperRegistrationProcessor = _offRamperRegistrationProcessor;\n\n isInitialized = true;\n }\n\n /**\n * @notice Registers a new account by pulling the profileId from the proof and assigning the account owner to the\n * sender of the transaction.\n *\n * @param _proof Registration proof consisting of unredacted data being notarized and a signature\n */\n function register(\n IWiseAccountRegistrationProcessor.RegistrationProof calldata _proof\n )\n external\n {\n require(msg.sender == _proof.public_values.userAddress, \"Caller must be address specified in proof\");\n require(accounts[msg.sender].accountId == bytes32(0), \"Account already associated with accountId\");\n (\n bytes32 accountId,\n bytes32 wiseTagHash\n ) = _verifyRegistrationProof(_proof);\n\n accounts[msg.sender].accountId = accountId;\n accounts[msg.sender].wiseTagHash = wiseTagHash;\n\n emit AccountRegistered(msg.sender, accountId, wiseTagHash);\n }\n\n /**\n * @notice Registers an account for off-ramping by pulling the multi-currency account id from the proof and assigning\n * the account owner to the sender of the transaction.\n *\n * @param _proof Registration proof consisting of unredacted data being notarized and a signature\n */\n function registerAsOffRamper(\n IWiseOffRamperRegistrationProcessor.OffRamperRegistrationProof calldata _proof\n )\n external\n onlyRegisteredUser\n {\n require(accounts[msg.sender].offRampId == bytes32(0), \"Account already associated with offRampId\");\n (\n bytes32 accountId,\n bytes32 offRampId\n ) = _verifyOffRamperRegistrationProof(_proof);\n\n accounts[msg.sender].offRampId = offRampId;\n\n emit OffRamperRegistered(msg.sender, accountId, offRampId);\n }\n\n /**\n * @notice Adds an accountId to a depositor's deny list. If an address associated with the banned accountId attempts to\n * signal an intent on the user's deposit they will be denied.\n *\n * @param _deniedUser accountId being banned\n */\n function addAccountToDenylist(bytes32 _deniedUser) external onlyRegisteredUser {\n bytes32 denyingUser = accounts[msg.sender].accountId;\n\n require(!denyList[denyingUser].isDenied[_deniedUser], \"User already on denylist\");\n\n denyList[denyingUser].isDenied[_deniedUser] = true;\n denyList[denyingUser].deniedUsers.push(_deniedUser);\n\n emit UserAddedToDenylist(denyingUser, _deniedUser);\n }\n\n /**\n * @notice Removes an accountId from a depositor's deny list.\n *\n * @param _approvedUser accountId being approved\n */\n function removeAccountFromDenylist(bytes32 _approvedUser) external onlyRegisteredUser {\n bytes32 approvingUser = accounts[msg.sender].accountId;\n\n require(denyList[approvingUser].isDenied[_approvedUser], \"User not on denylist\");\n\n denyList[approvingUser].isDenied[_approvedUser] = false;\n denyList[approvingUser].deniedUsers.removeStorage(_approvedUser);\n\n emit UserRemovedFromDenylist(approvingUser, _approvedUser);\n }\n\n /**\n * @notice Enables allow list for user, only users on the allow list will be able to signal intents on the user's deposit.\n */\n function enableAllowlist() external onlyRegisteredUser {\n bytes32 allowingUser = accounts[msg.sender].accountId;\n\n require(!allowList[allowingUser].isEnabled, \"Allow list already enabled\");\n\n allowList[allowingUser].isEnabled = true;\n\n emit AllowlistEnabled(allowingUser);\n }\n\n /**\n * @notice Adds passed accountIds to a depositor's allow list. All addresses associated with the allowed accountIds will\n * be able to signal intents on the user's deposit.\n *\n * @param _allowedUsers List of accountIds allowed to signal intents on the user's deposit\n */\n function addAccountsToAllowlist(bytes32[] memory _allowedUsers) external onlyRegisteredUser {\n bytes32 allowingUser = accounts[msg.sender].accountId;\n\n for(uint256 i = 0; i < _allowedUsers.length; i++) {\n bytes32 allowedUser = _allowedUsers[i];\n\n require(!allowList[allowingUser].isAllowed[allowedUser], \"User already on allowlist\");\n\n allowList[allowingUser].isAllowed[allowedUser] = true;\n allowList[allowingUser].allowedUsers.push(allowedUser);\n\n emit UserAddedToAllowlist(allowingUser, allowedUser);\n }\n }\n\n /**\n * @notice Removes an passed accountId's from allow list. If allow list is enabled only users on the allow list will be\n * able to signal intents on the user's deposit.\n *\n * @param _disallowedUsers List of accountIds being approved\n */\n function removeAccountsFromAllowlist(bytes32[] memory _disallowedUsers) external onlyRegisteredUser {\n bytes32 disallowingUser = accounts[msg.sender].accountId;\n\n for(uint256 i = 0; i < _disallowedUsers.length; i++) {\n bytes32 disallowedUser = _disallowedUsers[i];\n\n require(allowList[disallowingUser].isAllowed[disallowedUser], \"User not on allowlist\");\n\n allowList[disallowingUser].isAllowed[disallowedUser] = false;\n allowList[disallowingUser].allowedUsers.removeStorage(disallowedUser);\n\n emit UserRemovedFromAllowlist(disallowingUser, disallowedUser);\n }\n }\n\n /* ============ Governance Functions ============ */\n\n /**\n * @notice GOVERNANCE ONLY: Updates the account registration processor address used for validating and interpreting tls proofs.\n *\n * @param _registrationProcessor New registration proccesor address\n */\n function setAccountRegistrationProcessor(IWiseAccountRegistrationProcessor _registrationProcessor) external onlyOwner {\n accountRegistrationProcessor = _registrationProcessor;\n emit NewAccountRegistrationProcessorSet(address(_registrationProcessor));\n }\n\n /**\n * @notice GOVERNANCE ONLY: Updates the off ramper registration processor address used for validating and interpreting tls proofs.\n *\n * @param _registrationProcessor New registration proccesor address\n */\n function setOffRamperRegistrationProcessor(IWiseOffRamperRegistrationProcessor _registrationProcessor) external onlyOwner {\n offRamperRegistrationProcessor = _registrationProcessor;\n emit NewOffRamperRegistrationProcessorSet(address(_registrationProcessor));\n }\n\n /* ============ External View Functions ============ */\n\n function getAccountInfo(address _account) external view returns (AccountInfo memory) {\n return accounts[_account];\n }\n\n function getAccountId(address _account) public view returns (bytes32) {\n return accounts[_account].accountId;\n }\n\n function isRegisteredUser(address _account) public view returns (bool) {\n return getAccountId(_account) != bytes32(0);\n }\n\n function getDeniedUsers(address _account) external view returns (bytes32[] memory) {\n return denyList[getAccountId(_account)].deniedUsers;\n }\n\n function isDeniedUser(address _account, bytes32 _deniedUser) external view returns (bool) {\n return denyList[getAccountId(_account)].isDenied[_deniedUser];\n }\n\n function isAllowlistEnabled(address _account) external view returns (bool) {\n return allowList[getAccountId(_account)].isEnabled;\n }\n\n function getAllowedUsers(address _account) external view returns (bytes32[] memory) {\n return allowList[getAccountId(_account)].allowedUsers;\n }\n\n function isAllowedUser(address _account, bytes32 _allowedUser) external view returns (bool) {\n bytes32 allowingUser = getAccountId(_account);\n\n // Deny list overrides, if user on deny list then they are not allowed\n if(denyList[allowingUser].isDenied[_allowedUser]) { return false; }\n\n // Check if allow list is enabled, if so return status of user, else return true\n return allowList[allowingUser].isEnabled ? allowList[allowingUser].isAllowed[_allowedUser] : true;\n }\n \n /* ============ Internal Functions ============ */\n\n /**\n * @notice Validate the user has an Wise account, we do not nullify this email since it can be reused to register under\n * different addresses.\n */\n function _verifyRegistrationProof(\n IWiseAccountRegistrationProcessor.RegistrationProof calldata _proof\n )\n internal\n returns(bytes32 accountId, bytes32 wiseTagHash)\n {\n (\n accountId,\n wiseTagHash\n ) = accountRegistrationProcessor.processProof(_proof);\n }\n\n /**\n * @notice Validate the user has an Wise account, we do not nullify this email since it can be reused to register under\n * different addresses.\n */\n function _verifyOffRamperRegistrationProof(\n IWiseOffRamperRegistrationProcessor.OffRamperRegistrationProof calldata _proof\n )\n internal\n returns(bytes32 accountId, bytes32 offRampId)\n {\n (\n accountId,\n offRampId\n ) = offRamperRegistrationProcessor.processProof(_proof);\n\n require(accountId == accounts[msg.sender].accountId, \"AccountId does not match\");\n }\n}\n" + }, + "contracts/ramps/wise/WiseOffRamperRegistrationProcessor.sol": { + "content": "//SPDX-License-Identifier: MIT\n\nimport { INullifierRegistry } from \"../../processors/nullifierRegistries/INullifierRegistry.sol\";\nimport { IWiseOffRamperRegistrationProcessor } from \"./interfaces/IWiseOffRamperRegistrationProcessor.sol\";\nimport { StringConversionUtils } from \"../../lib/StringConversionUtils.sol\";\nimport { TLSBaseProcessor } from \"../../processors/TLSBaseProcessor.sol\";\n\npragma solidity ^0.8.18;\n\ncontract WiseOffRamperRegistrationProcessor is IWiseOffRamperRegistrationProcessor, TLSBaseProcessor {\n\n using StringConversionUtils for string;\n \n /* ============ Events ============ */\n event VerifierSigningKeySet(address _verifierSigningKey);\n \n /* ============ Public Variables ============ */\n address public verifierSigningKey;\n \n /* ============ Constructor ============ */\n constructor(\n address _ramp,\n address _verifierSigningKey,\n INullifierRegistry _nullifierRegistry,\n uint256 _timestampBuffer,\n string memory _endpoint,\n string memory _host\n )\n TLSBaseProcessor(\n _ramp,\n _nullifierRegistry,\n _timestampBuffer,\n _endpoint,\n _host\n )\n {\n verifierSigningKey = _verifierSigningKey;\n }\n\n /* ============ External Functions ============ */\n\n function processProof(\n IWiseOffRamperRegistrationProcessor.OffRamperRegistrationProof calldata _proof\n )\n public\n view\n override\n onlyRamp\n returns(bytes32 onRampId, bytes32 offRampId)\n {\n _validateProof(_proof.public_values, _proof.proof);\n\n _validateTLSEndpoint(endpoint.replaceString(\"*\", _proof.public_values.profileId), _proof.public_values.endpoint);\n _validateTLSHost(host, _proof.public_values.host);\n\n onRampId = bytes32(_proof.public_values.profileId.stringToUint(0));\n offRampId = bytes32(_proof.public_values.mcAccountId.stringToUint(0));\n }\n\n /* ============ External Admin Functions ============ */\n\n function setVerifierSigningKey(address _verifierSigningKey) external onlyOwner {\n verifierSigningKey = _verifierSigningKey;\n\n emit VerifierSigningKeySet(_verifierSigningKey);\n }\n\n /* ============ View Functions ============ */\n\n function verifyProof(\n IWiseOffRamperRegistrationProcessor.OffRamperRegistrationData memory _publicValues, \n bytes memory _proof\n )\n internal\n view\n returns(bool)\n { \n bytes memory encodedMessage = abi.encode(_publicValues.endpoint, _publicValues.host, _publicValues.profileId, _publicValues.mcAccountId);\n return _isValidSignature(encodedMessage, _proof, verifierSigningKey);\n }\n\n /* ============ Internal Functions ============ */\n\n function _validateProof(\n IWiseOffRamperRegistrationProcessor.OffRamperRegistrationData memory _publicValues, \n bytes memory _proof\n )\n internal\n view\n { \n require(\n verifyProof(_publicValues, _proof),\n \"Invalid proof\"\n );\n }\n}\n" + }, + "contracts/ramps/wise/WiseRamp.sol": { + "content": "//SPDX-License-Identifier: MIT\n\nimport { IERC20 } from \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\nimport { Ownable } from \"@openzeppelin/contracts/access/Ownable.sol\";\n\nimport { Bytes32ArrayUtils } from \"../../external/Bytes32ArrayUtils.sol\";\nimport { Uint256ArrayUtils } from \"../../external/Uint256ArrayUtils.sol\";\n\nimport { IWiseAccountRegistry } from \"./interfaces/IWiseAccountRegistry.sol\";\nimport { IWiseSendProcessor } from \"./interfaces/IWiseSendProcessor.sol\";\n\npragma solidity ^0.8.18;\n\ncontract WiseRamp is Ownable {\n\n using Bytes32ArrayUtils for bytes32[];\n using Uint256ArrayUtils for uint256[];\n\n /* ============ Events ============ */\n event DepositReceived(\n uint256 indexed depositId,\n bytes32 indexed offRampId,\n bytes32 indexed currencyId,\n uint256 amount,\n uint256 conversionRate\n );\n event IntentSignaled(\n bytes32 indexed intentHash,\n uint256 indexed depositId,\n bytes32 indexed accountId,\n address to,\n uint256 amount,\n uint256 timestamp\n );\n\n event IntentPruned(\n bytes32 indexed intentHash,\n uint256 indexed depositId\n );\n event IntentFulfilled(\n bytes32 indexed intentHash,\n uint256 indexed depositId,\n address indexed onRamper,\n address to,\n uint256 amount,\n uint256 feeAmount\n );\n event DepositWithdrawn(\n uint256 indexed depositId,\n address indexed depositor,\n uint256 amount\n );\n\n event DepositClosed(uint256 depositId, address depositor);\n event MinDepositAmountSet(uint256 minDepositAmount);\n event MaxOnRampAmountSet(uint256 maxOnRampAmount);\n event IntentExpirationPeriodSet(uint256 intentExpirationPeriod);\n event OnRampCooldownPeriodSet(uint256 onRampCooldownPeriod);\n event SustainabilityFeeUpdated(uint256 fee);\n event SustainabilityFeeRecipientUpdated(address feeRecipient);\n event NewSendProcessorSet(address sendProcessor);\n\n /* ============ Structs ============ */\n\n struct Deposit {\n address depositor;\n string wiseTag;\n address verifierSigningKey; // Public key of the verifier depositor wants to sign the TLS proof\n uint256 depositAmount; // Amount of USDC deposited\n bytes32 receiveCurrencyId; // Id of the currency to be received off-chain (bytes32(Wise currency code))\n uint256 remainingDeposits; // Amount of remaining deposited liquidity\n uint256 outstandingIntentAmount; // Amount of outstanding intents (may include expired intents)\n uint256 conversionRate; // Conversion required by off-ramper between USDC/USD\n bytes32[] intentHashes; // Array of hashes of all open intents (may include some expired if not pruned)\n }\n\n struct DepositWithAvailableLiquidity {\n uint256 depositId; // ID of the deposit\n bytes32 depositorId; // Depositor's offRampId \n Deposit deposit; // Deposit struct\n uint256 availableLiquidity; // Amount of liquidity available to signal intents (net of expired intents)\n }\n\n struct Intent {\n address onRamper; // On-ramper's address\n address to; // Address to forward funds to (can be same as onRamper)\n uint256 deposit; // ID of the deposit the intent is signaling on\n uint256 amount; // Amount of USDC the on-ramper signals intent for on-chain\n uint256 intentTimestamp; // Timestamp of when the intent was signaled\n }\n\n struct IntentWithOnRamperId {\n bytes32 intentHash; // Intent hash\n Intent intent; // Intent struct\n bytes32 onRamperId; // onRamper's onRamperId\n }\n\n // A Global Account is defined as an account represented by one accountId. This is used to enforce limitations on actions across\n // all Ethereum addresses that are associated with that accountId. In this case we use it to enforce a cooldown period between on ramps,\n // restrict each Wise account to one outstanding intent at a time, and to enforce deny lists.\n struct GlobalAccountInfo {\n bytes32 currentIntentHash; // Hash of the current open intent (if exists)\n uint256 lastOnrampTimestamp; // Timestamp of the last on-ramp transaction used to check if cooldown period elapsed\n uint256[] deposits; // Array of open account deposits\n }\n\n /* ============ Modifiers ============ */\n modifier onlyRegisteredUser() {\n require(accountRegistry.isRegisteredUser(msg.sender), \"Caller must be registered user\");\n _;\n }\n\n /* ============ Constants ============ */\n uint256 internal constant PRECISE_UNIT = 1e18;\n uint256 internal constant MAX_DEPOSITS = 5; // An account can only have max 5 different deposit parameterizations to prevent locking funds\n uint256 constant CIRCOM_PRIME_FIELD = 21888242871839275222246405745257275088548364400416034343698204186575808495617;\n uint256 constant MAX_SUSTAINABILITY_FEE = 5e16; // 5% max sustainability fee\n \n /* ============ State Variables ============ */\n IERC20 public immutable usdc; // USDC token contract\n IWiseAccountRegistry public accountRegistry; // Account Registry contract for Wise\n IWiseSendProcessor public sendProcessor; // Address of send processor contract\n\n bool public isInitialized; // Indicates if contract has been initialized\n\n mapping(bytes32 => GlobalAccountInfo) internal globalAccount; // Mapping of onRamp ID to information used to enforce actions across Ethereum accounts\n mapping(uint256 => Deposit) public deposits; // Mapping of depositIds to deposit structs\n mapping(bytes32 => Intent) public intents; // Mapping of intentHashes to intent structs\n\n uint256 public minDepositAmount; // Minimum amount of USDC that can be deposited\n uint256 public maxOnRampAmount; // Maximum amount of USDC that can be on-ramped in a single transaction\n uint256 public onRampCooldownPeriod; // Time period that must elapse between completing an on-ramp and signaling a new intent\n uint256 public intentExpirationPeriod; // Time period after which an intent can be pruned from the system\n uint256 public sustainabilityFee; // Fee charged to on-rampers in preciseUnits (1e16 = 1%)\n address public sustainabilityFeeRecipient; // Address that receives the sustainability fee\n\n uint256 public depositCounter; // Counter for depositIds\n\n /* ============ Constructor ============ */\n constructor(\n address _owner,\n IERC20 _usdc,\n uint256 _minDepositAmount,\n uint256 _maxOnRampAmount,\n uint256 _intentExpirationPeriod,\n uint256 _onRampCooldownPeriod,\n uint256 _sustainabilityFee,\n address _sustainabilityFeeRecipient\n )\n Ownable()\n {\n usdc = _usdc;\n minDepositAmount = _minDepositAmount;\n maxOnRampAmount = _maxOnRampAmount;\n intentExpirationPeriod = _intentExpirationPeriod;\n onRampCooldownPeriod = _onRampCooldownPeriod;\n sustainabilityFee = _sustainabilityFee;\n sustainabilityFeeRecipient = _sustainabilityFeeRecipient;\n\n transferOwnership(_owner);\n }\n\n /* ============ External Functions ============ */\n\n /**\n * @notice Initialize Ramp with the addresses of the Processors\n *\n * @param _accountRegistry Account Registry contract for Wise\n * @param _sendProcessor Send processor address\n */\n function initialize(\n IWiseAccountRegistry _accountRegistry,\n IWiseSendProcessor _sendProcessor\n )\n external\n onlyOwner\n {\n require(!isInitialized, \"Already initialized\");\n\n accountRegistry = _accountRegistry;\n sendProcessor = _sendProcessor;\n\n isInitialized = true;\n }\n\n /**\n * @notice Generates a deposit entry for off-rampers that can then be fulfilled by an on-ramper. This function will not add to\n * previous deposits. Every deposit has it's own unique identifier. User must approve the contract to transfer the deposit amount\n * of USDC.\n *\n * @param _wiseTag Depositor's Wise tag to receive payments\n * @param _receiveCurrencyId Id of the currency to be received off-chain\n * @param _depositAmount The amount of USDC to off-ramp\n * @param _receiveAmount The amount of USD to receive\n * @param _verifierSigningKey Public key of the verifier depositor wants to sign the TLS proof\n */\n function offRamp(\n string calldata _wiseTag,\n bytes32 _receiveCurrencyId,\n uint256 _depositAmount,\n uint256 _receiveAmount,\n address _verifierSigningKey\n )\n external\n onlyRegisteredUser\n {\n IWiseAccountRegistry.AccountInfo memory account = accountRegistry.getAccountInfo(msg.sender);\n GlobalAccountInfo storage globalAccountInfo = globalAccount[account.accountId];\n\n require(account.offRampId != bytes32(0), \"Must be registered as off ramper\");\n require(keccak256(abi.encode(_wiseTag)) == account.wiseTagHash, \"Wise tag does not match registered wise tag\");\n require(globalAccountInfo.deposits.length < MAX_DEPOSITS, \"Maximum deposit amount reached\");\n require(_depositAmount >= minDepositAmount, \"Deposit amount must be greater than min deposit amount\");\n require(_receiveAmount > 0, \"Receive amount must be greater than 0\");\n\n uint256 conversionRate = (_depositAmount * PRECISE_UNIT) / _receiveAmount;\n uint256 depositId = depositCounter++;\n\n globalAccountInfo.deposits.push(depositId);\n\n deposits[depositId] = Deposit({\n depositor: msg.sender,\n wiseTag: _wiseTag,\n receiveCurrencyId: _receiveCurrencyId,\n depositAmount: _depositAmount,\n remainingDeposits: _depositAmount,\n outstandingIntentAmount: 0,\n conversionRate: conversionRate,\n intentHashes: new bytes32[](0),\n verifierSigningKey: _verifierSigningKey\n });\n\n usdc.transferFrom(msg.sender, address(this), _depositAmount);\n\n emit DepositReceived(depositId, account.accountId, _receiveCurrencyId, _depositAmount, conversionRate);\n }\n\n /**\n * @notice Signals intent to pay the depositor defined in the _depositId the _amount * deposit conversionRate off-chain\n * in order to unlock _amount of funds on-chain. Each user can only have one outstanding intent at a time regardless of\n * address (tracked using accountId). Caller must not be on the depositor's deny list. If there are prunable intents then\n * they will be deleted from the deposit to be able to maintain state hygiene.\n *\n * @param _depositId The ID of the deposit the on-ramper intends to use for \n * @param _amount The amount of USDC the user wants to on-ramp\n * @param _to Address to forward funds to (can be same as onRamper)\n */\n function signalIntent(uint256 _depositId, uint256 _amount, address _to) external onlyRegisteredUser {\n bytes32 onRamperId = accountRegistry.getAccountId(msg.sender);\n Deposit storage deposit = deposits[_depositId];\n\n // Caller validity checks\n require(accountRegistry.isAllowedUser(deposit.depositor, onRamperId), \"Onramper on depositor's denylist\");\n require(\n globalAccount[onRamperId].lastOnrampTimestamp + onRampCooldownPeriod <= block.timestamp,\n \"On ramp cool down period not elapsed\"\n );\n require(globalAccount[onRamperId].currentIntentHash == bytes32(0), \"Intent still outstanding\");\n require(accountRegistry.getAccountId(deposit.depositor) != onRamperId, \"Sender cannot be the depositor\");\n\n // Intent information checks\n require(deposit.depositor != address(0), \"Deposit does not exist\");\n require(_amount > 0, \"Signaled amount must be greater than 0\");\n require(_amount <= maxOnRampAmount, \"Signaled amount must be less than max on-ramp amount\");\n require(_to != address(0), \"Cannot send to zero address\");\n\n bytes32 intentHash = _calculateIntentHash(onRamperId, _depositId);\n\n if (deposit.remainingDeposits < _amount) {\n (\n bytes32[] memory prunableIntents,\n uint256 reclaimableAmount\n ) = _getPrunableIntents(_depositId);\n\n require(deposit.remainingDeposits + reclaimableAmount >= _amount, \"Not enough liquidity\");\n\n _pruneIntents(deposit, prunableIntents);\n deposit.remainingDeposits += reclaimableAmount;\n deposit.outstandingIntentAmount -= reclaimableAmount;\n }\n\n intents[intentHash] = Intent({\n onRamper: msg.sender,\n to: _to,\n deposit: _depositId,\n amount: _amount,\n intentTimestamp: block.timestamp\n });\n\n globalAccount[onRamperId].currentIntentHash = intentHash;\n\n deposit.remainingDeposits -= _amount;\n deposit.outstandingIntentAmount += _amount;\n deposit.intentHashes.push(intentHash);\n\n emit IntentSignaled(intentHash, _depositId, onRamperId, _to, _amount, block.timestamp);\n }\n\n /**\n * @notice Only callable by the originator of the intent. Cancels an outstanding intent thus allowing user to signal a new\n * intent. Deposit state is updated to reflect the cancelled intent.\n *\n * @param _intentHash Hash of intent being cancelled\n */\n function cancelIntent(bytes32 _intentHash) external {\n Intent memory intent = intents[_intentHash];\n \n require(intent.intentTimestamp != 0, \"Intent does not exist\");\n require(\n accountRegistry.getAccountId(intent.onRamper) == accountRegistry.getAccountId(msg.sender),\n \"Sender must be the on-ramper\"\n );\n\n Deposit storage deposit = deposits[intent.deposit];\n\n _pruneIntent(deposit, _intentHash);\n\n deposit.remainingDeposits += intent.amount;\n deposit.outstandingIntentAmount -= intent.amount;\n }\n\n /**\n * @notice Anyone can submit an on-ramp transaction, even if caller isn't on-ramper. Upon submission the proof is validated,\n * intent is removed, and deposit state is updated. USDC is transferred to the on-ramper.\n *\n * @param _sendData Struct containing unredacted data from API call to Wise\n * @param _verifierSignature Signature by verifier of the unredacted data\n */\n function onRamp(\n IWiseSendProcessor.SendData calldata _sendData,\n bytes calldata _verifierSignature\n )\n external\n {\n (\n Intent memory intent,\n Deposit storage deposit,\n bytes32 intentHash\n ) = _verifyOnRampProof(_sendData, _verifierSignature);\n\n _pruneIntent(deposit, intentHash);\n\n deposit.outstandingIntentAmount -= intent.amount;\n globalAccount[accountRegistry.getAccountId(intent.onRamper)].lastOnrampTimestamp = block.timestamp;\n _closeDepositIfNecessary(intent.deposit, deposit);\n\n _transferFunds(intentHash, intent);\n }\n\n /**\n * @notice Allows off-ramper to release funds to the on-ramper in case of a failed on-ramp or because of some other arrangement\n * between the two parties. Upon submission we check to make sure the msg.sender is the depositor, the intent is removed, and \n * deposit state is updated. USDC is transferred to the on-ramper.\n *\n * @param _intentHash Hash of intent to resolve by releasing the funds\n */\n function releaseFundsToOnramper(bytes32 _intentHash) external {\n Intent memory intent = intents[_intentHash];\n Deposit storage deposit = deposits[intent.deposit];\n\n require(intent.onRamper != address(0), \"Intent does not exist\");\n require(deposit.depositor == msg.sender, \"Caller must be the depositor\");\n\n _pruneIntent(deposit, _intentHash);\n\n deposit.outstandingIntentAmount -= intent.amount;\n globalAccount[accountRegistry.getAccountId(intent.onRamper)].lastOnrampTimestamp = block.timestamp;\n _closeDepositIfNecessary(intent.deposit, deposit);\n\n _transferFunds(_intentHash, intent);\n }\n\n /**\n * @notice Caller must be the depositor for each depositId in the array, if not whole function fails. Depositor is returned all\n * remaining deposits and any outstanding intents that are expired. If an intent is not expired then those funds will not be\n * returned. Deposit will be deleted as long as there are no more outstanding intents.\n *\n * @param _depositIds Array of depositIds the depositor is attempting to withdraw\n */\n function withdrawDeposit(uint256[] memory _depositIds) external {\n uint256 returnAmount;\n\n for (uint256 i = 0; i < _depositIds.length; ++i) {\n uint256 depositId = _depositIds[i];\n Deposit storage deposit = deposits[depositId];\n\n require(deposit.depositor == msg.sender, \"Sender must be the depositor\");\n\n (\n bytes32[] memory prunableIntents,\n uint256 reclaimableAmount\n ) = _getPrunableIntents(depositId);\n\n _pruneIntents(deposit, prunableIntents);\n\n returnAmount += deposit.remainingDeposits + reclaimableAmount;\n \n deposit.outstandingIntentAmount -= reclaimableAmount;\n\n emit DepositWithdrawn(depositId, deposit.depositor, deposit.remainingDeposits + reclaimableAmount);\n \n delete deposit.remainingDeposits;\n _closeDepositIfNecessary(depositId, deposit);\n }\n\n usdc.transfer(msg.sender, returnAmount);\n }\n\n /* ============ Governance Functions ============ */\n\n /**\n * @notice GOVERNANCE ONLY: Updates the send processor address used for validating and interpreting zk proofs.\n *\n * @param _sendProcessor New send proccesor address\n */\n function setSendProcessor(IWiseSendProcessor _sendProcessor) external onlyOwner {\n sendProcessor = _sendProcessor;\n emit NewSendProcessorSet(address(_sendProcessor));\n }\n\n\n /**\n * @notice GOVERNANCE ONLY: Updates the minimum deposit amount a user can specify for off-ramping.\n *\n * @param _minDepositAmount The new minimum deposit amount\n */\n function setMinDepositAmount(uint256 _minDepositAmount) external onlyOwner {\n require(_minDepositAmount != 0, \"Minimum deposit cannot be zero\");\n\n minDepositAmount = _minDepositAmount;\n emit MinDepositAmountSet(_minDepositAmount);\n }\n\n /**\n * @notice GOVERNANCE ONLY: Updates the sustainability fee. This fee is charged to on-rampers upon a successful on-ramp.\n *\n * @param _fee The new sustainability fee in precise units (10**18, ie 10% = 1e17)\n */\n function setSustainabilityFee(uint256 _fee) external onlyOwner {\n require(_fee <= MAX_SUSTAINABILITY_FEE, \"Fee cannot be greater than max fee\");\n\n sustainabilityFee = _fee;\n emit SustainabilityFeeUpdated(_fee);\n }\n\n /**\n * @notice GOVERNANCE ONLY: Updates the recepient of sustainability fees.\n *\n * @param _feeRecipient The new fee recipient address\n */\n function setSustainabilityFeeRecipient(address _feeRecipient) external onlyOwner {\n require(_feeRecipient != address(0), \"Fee recipient cannot be zero address\");\n\n sustainabilityFeeRecipient = _feeRecipient;\n emit SustainabilityFeeRecipientUpdated(_feeRecipient);\n }\n\n /**\n * @notice GOVERNANCE ONLY: Updates the max amount allowed to be on-ramped in each transaction. To on-ramp more than\n * this amount a user must make multiple transactions.\n *\n * @param _maxOnRampAmount The new max on ramp amount\n */\n function setMaxOnRampAmount(uint256 _maxOnRampAmount) external onlyOwner {\n require(_maxOnRampAmount != 0, \"Max on ramp amount cannot be zero\");\n\n maxOnRampAmount = _maxOnRampAmount;\n emit MaxOnRampAmountSet(_maxOnRampAmount);\n }\n\n /**\n * @notice GOVERNANCE ONLY: Updates the on-ramp cooldown period, once an on-ramp transaction is completed the user must wait this\n * amount of time before they can signalIntent to on-ramp again.\n *\n * @param _onRampCooldownPeriod New on-ramp cooldown period\n */\n function setOnRampCooldownPeriod(uint256 _onRampCooldownPeriod) external onlyOwner {\n onRampCooldownPeriod = _onRampCooldownPeriod;\n emit OnRampCooldownPeriodSet(_onRampCooldownPeriod);\n }\n\n /**\n * @notice GOVERNANCE ONLY: Updates the intent expiration period, after this period elapses an intent can be pruned to prevent\n * locking up a depositor's funds.\n *\n * @param _intentExpirationPeriod New intent expiration period\n */\n function setIntentExpirationPeriod(uint256 _intentExpirationPeriod) external onlyOwner {\n require(_intentExpirationPeriod != 0, \"Max intent expiration period cannot be zero\");\n\n intentExpirationPeriod = _intentExpirationPeriod;\n emit IntentExpirationPeriodSet(_intentExpirationPeriod);\n }\n\n\n /* ============ External View Functions ============ */\n\n function getDeposit(uint256 _depositId) external view returns (Deposit memory) {\n return deposits[_depositId];\n }\n\n function getIdCurrentIntentHash(address _account) public view returns (bytes32) {\n return globalAccount[accountRegistry.getAccountId(_account)].currentIntentHash;\n }\n\n function getIdCurrentIntentHashAsUint(address _account) external view returns (uint256) {\n return uint256(getIdCurrentIntentHash(_account));\n }\n\n function getLastOnRampTimestamp(address _account) external view returns (uint256) {\n return globalAccount[accountRegistry.getAccountId(_account)].lastOnrampTimestamp;\n }\n\n function getIntentsWithOnRamperId(bytes32[] calldata _intentHashes) external view returns (IntentWithOnRamperId[] memory) {\n IntentWithOnRamperId[] memory intentsWithOnRamperId = new IntentWithOnRamperId[](_intentHashes.length);\n\n for (uint256 i = 0; i < _intentHashes.length; ++i) {\n bytes32 intentHash = _intentHashes[i];\n Intent memory intent = intents[intentHash];\n intentsWithOnRamperId[i] = IntentWithOnRamperId({\n intentHash: _intentHashes[i],\n intent: intent,\n onRamperId: accountRegistry.getAccountId(intent.onRamper)\n });\n }\n\n return intentsWithOnRamperId;\n }\n\n function getAccountDeposits(address _account) external view returns (DepositWithAvailableLiquidity[] memory accountDeposits) {\n uint256[] memory accountDepositIds = globalAccount[accountRegistry.getAccountId(_account)].deposits;\n accountDeposits = new DepositWithAvailableLiquidity[](accountDepositIds.length);\n \n for (uint256 i = 0; i < accountDepositIds.length; ++i) {\n uint256 depositId = accountDepositIds[i];\n Deposit memory deposit = deposits[depositId];\n ( , uint256 reclaimableAmount) = _getPrunableIntents(depositId);\n\n accountDeposits[i] = DepositWithAvailableLiquidity({\n depositId: depositId,\n depositorId: accountRegistry.getAccountId(deposit.depositor),\n deposit: deposit,\n availableLiquidity: deposit.remainingDeposits + reclaimableAmount\n });\n }\n }\n\n function getDepositFromIds(uint256[] memory _depositIds) external view returns (DepositWithAvailableLiquidity[] memory depositArray) {\n depositArray = new DepositWithAvailableLiquidity[](_depositIds.length);\n\n for (uint256 i = 0; i < _depositIds.length; ++i) {\n uint256 depositId = _depositIds[i];\n Deposit memory deposit = deposits[depositId];\n ( , uint256 reclaimableAmount) = _getPrunableIntents(depositId);\n\n depositArray[i] = DepositWithAvailableLiquidity({\n depositId: depositId,\n depositorId: accountRegistry.getAccountId(deposit.depositor),\n deposit: deposit,\n availableLiquidity: deposit.remainingDeposits + reclaimableAmount\n });\n }\n\n return depositArray;\n }\n\n /* ============ Internal Functions ============ */\n\n /**\n * @notice Calculates the intentHash of new intent\n */\n function _calculateIntentHash(\n bytes32 _accountId,\n uint256 _depositId\n )\n internal\n view\n virtual\n returns (bytes32 intentHash)\n {\n // Mod with circom prime field to make sure it fits in a 254-bit field\n uint256 intermediateHash = uint256(keccak256(abi.encodePacked(_accountId, _depositId, block.timestamp)));\n intentHash = bytes32(intermediateHash % CIRCOM_PRIME_FIELD);\n }\n\n /**\n * @notice Cycles through all intents currently open on a deposit and sees if any have expired. If they have expired\n * the outstanding amounts are summed and returned alongside the intentHashes\n */\n function _getPrunableIntents(\n uint256 _depositId\n )\n internal\n view\n returns(bytes32[] memory prunableIntents, uint256 reclaimedAmount)\n {\n bytes32[] memory intentHashes = deposits[_depositId].intentHashes;\n prunableIntents = new bytes32[](intentHashes.length);\n\n for (uint256 i = 0; i < intentHashes.length; ++i) {\n Intent memory intent = intents[intentHashes[i]];\n if (intent.intentTimestamp + intentExpirationPeriod < block.timestamp) {\n prunableIntents[i] = intentHashes[i];\n reclaimedAmount += intent.amount;\n }\n }\n }\n\n function _pruneIntents(Deposit storage _deposit, bytes32[] memory _intents) internal {\n for (uint256 i = 0; i < _intents.length; ++i) {\n if (_intents[i] != bytes32(0)) {\n _pruneIntent(_deposit, _intents[i]);\n }\n }\n }\n\n /**\n * @notice Pruning an intent involves deleting its state from the intents mapping, zeroing out the intendee's currentIntentHash in\n * their global account mapping, and deleting the intentHash from the deposit's intentHashes array.\n */\n function _pruneIntent(Deposit storage _deposit, bytes32 _intentHash) internal {\n Intent memory intent = intents[_intentHash];\n\n delete globalAccount[accountRegistry.getAccountId(intent.onRamper)].currentIntentHash;\n delete intents[_intentHash];\n _deposit.intentHashes.removeStorage(_intentHash);\n\n emit IntentPruned(_intentHash, intent.deposit);\n }\n\n /**\n * @notice Removes a deposit if no outstanding intents AND no remaining deposits. Deleting a deposit deletes it from the\n * deposits mapping and removes tracking it in the user's accounts mapping.\n */\n function _closeDepositIfNecessary(uint256 _depositId, Deposit storage _deposit) internal {\n uint256 openDepositAmount = _deposit.outstandingIntentAmount + _deposit.remainingDeposits;\n if (openDepositAmount == 0) {\n globalAccount[accountRegistry.getAccountId(_deposit.depositor)].deposits.removeStorage(_depositId);\n emit DepositClosed(_depositId, _deposit.depositor);\n delete deposits[_depositId];\n }\n }\n\n /**\n * @notice Checks if sustainability fee has been defined, if so sends fee to the fee recipient and intent amount minus fee\n * to the on-ramper. If sustainability fee is undefined then full intent amount is transferred to on-ramper.\n */\n function _transferFunds(bytes32 _intentHash, Intent memory _intent) internal {\n uint256 fee;\n if (sustainabilityFee != 0) {\n fee = (_intent.amount * sustainabilityFee) / PRECISE_UNIT;\n usdc.transfer(sustainabilityFeeRecipient, fee);\n }\n\n uint256 onRampAmount = _intent.amount - fee;\n usdc.transfer(_intent.to, onRampAmount);\n\n emit IntentFulfilled(_intentHash, _intent.deposit, _intent.onRamper, _intent.to, onRampAmount, fee);\n }\n\n /**\n * @notice Validate send payment email and check that it hasn't already been used (done on SendProcessor).\n * Additionally, we validate that the offRamperId matches the one from the specified intent and that enough\n * was paid off-chain inclusive of the conversionRate.\n */\n function _verifyOnRampProof(\n IWiseSendProcessor.SendData calldata _data,\n bytes calldata _verifierSignature\n )\n internal\n returns(Intent storage intent, Deposit storage deposit, bytes32 intentHash)\n {\n intentHash = bytes32(_data.intentHash);\n intent = intents[intentHash];\n require(intent.onRamper == msg.sender, \"Caller must be the on-ramper\");\n\n deposit = deposits[intent.deposit];\n\n (\n uint256 amount,\n uint256 timestamp,\n bytes32 offRamperId,\n bytes32 currencyId\n ) = sendProcessor.processProof(\n IWiseSendProcessor.SendProof({\n public_values: _data,\n proof: _verifierSignature\n }),\n deposit.verifierSigningKey\n );\n\n require(currencyId == deposit.receiveCurrencyId, \"Wrong currency sent\");\n require(intent.intentTimestamp <= timestamp, \"Intent was not created before send\");\n require(accountRegistry.getAccountInfo(deposit.depositor).offRampId == offRamperId, \"Offramper id does not match\");\n require(amount >= (intent.amount * PRECISE_UNIT) / deposit.conversionRate, \"Payment was not enough\");\n }\n}\n" + }, + "contracts/ramps/wise/WiseSendProcessor.sol": { + "content": "//SPDX-License-Identifier: MIT\n\nimport { ECDSA } from \"@openzeppelin/contracts/utils/cryptography/ECDSA.sol\";\nimport { SignatureChecker } from \"@openzeppelin/contracts/utils/cryptography/SignatureChecker.sol\";\n\nimport { IKeyHashAdapterV2 } from \"../../processors/keyHashAdapters/IKeyHashAdapterV2.sol\";\nimport { INullifierRegistry } from \"../../processors/nullifierRegistries/INullifierRegistry.sol\";\nimport { IWiseSendProcessor } from \"./interfaces/IWiseSendProcessor.sol\";\nimport { StringConversionUtils } from \"../../lib/StringConversionUtils.sol\";\nimport { TLSBaseProcessor } from \"../../processors/TLSBaseProcessor.sol\";\n\npragma solidity ^0.8.18;\n\ncontract WiseSendProcessor is IWiseSendProcessor, TLSBaseProcessor {\n\n using ECDSA for bytes32;\n using SignatureChecker for address;\n using StringConversionUtils for string;\n\n /* ============ Constants ============ */\n bytes32 public constant PAYMENT_STATUS = keccak256(abi.encodePacked(\"OUTGOING_PAYMENT_SENT\"));\n\n /* ============ Constructor ============ */\n constructor(\n address _ramp,\n INullifierRegistry _nullifierRegistry,\n uint256 _timestampBuffer,\n string memory _endpoint,\n string memory _host\n )\n TLSBaseProcessor(\n _ramp,\n _nullifierRegistry,\n _timestampBuffer,\n _endpoint,\n _host\n )\n {}\n \n /* ============ External Functions ============ */\n function processProof(\n IWiseSendProcessor.SendProof calldata _proof,\n address _verifierSigningKey\n )\n public\n override\n onlyRamp\n returns(\n uint256 amount,\n uint256 timestamp,\n bytes32 offRamperId,\n bytes32 currencyId\n )\n {\n _validateProof(_verifierSigningKey, _proof.public_values, _proof.proof);\n\n _validateTLSEndpoint(\n endpoint.replaceString(\"*\", _proof.public_values.senderId),\n _proof.public_values.endpoint\n );\n _validateTLSHost(host, _proof.public_values.host);\n \n // Validate status\n require(\n keccak256(abi.encodePacked(_proof.public_values.status)) == PAYMENT_STATUS,\n \"Payment status not confirmed as sent\"\n );\n _validateAndAddNullifier(keccak256(abi.encodePacked(\"Wise\", _proof.public_values.transferId)));\n\n amount = _proof.public_values.amount.stringToUint(6);\n\n // Add the buffer to build in flexibility with L2 timestamps\n timestamp = _proof.public_values.timestamp.stringToUint(0) / 1000 + timestampBuffer;\n\n offRamperId = bytes32(_proof.public_values.recipientId.stringToUint(0));\n currencyId = keccak256(abi.encodePacked(_proof.public_values.currencyId));\n }\n\n /* ============ View Functions ============ */\n\n function verifyProof(\n address _verifierSigningKey,\n IWiseSendProcessor.SendData memory _publicValues, \n bytes memory _proof\n )\n internal\n view\n returns(bool)\n { \n bytes memory encodedMessage = abi.encode(\n _publicValues.endpoint,\n _publicValues.host,\n _publicValues.transferId,\n _publicValues.senderId,\n _publicValues.recipientId,\n _publicValues.amount,\n _publicValues.currencyId,\n _publicValues.status,\n _publicValues.timestamp,\n _publicValues.intentHash\n );\n return _isValidSignature(encodedMessage, _proof, _verifierSigningKey);\n }\n\n /* ============ Internal Functions ============ */\n\n function _validateProof(\n address _verifierSigningKey,\n IWiseSendProcessor.SendData memory _publicValues, \n bytes memory _proof\n )\n internal\n view\n { \n require(\n verifyProof(_verifierSigningKey, _publicValues, _proof),\n \"Invalid proof\"\n );\n }\n}\n" + }, + "contracts/verifiers/garanti_body_suffix_hasher_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 = 11538879775846674526835491352245177428215656017176257554677806790730122530182;\n uint256 constant deltax2 = 10342899044037521395319393040886647066391079897134856423910842052487918973972;\n uint256 constant deltay1 = 7673810604697646469980418300855404491906175026657152448502078673835866310816;\n uint256 constant deltay2 = 19203038665686855899042926072269909772185515054222824546695896577042064928540;\n\n \n uint256 constant IC0x = 20587965622151968069995649582541315422977747903983693959922015701361725155516;\n uint256 constant IC0y = 11982628613930328510673935238960631358206293440826148517770479845792210741285;\n \n uint256 constant IC1x = 5273354119219253101148387206199535064921520774240409596621174025648940059654;\n uint256 constant IC1y = 21111800092158453137375162645358573333185713447967811304768419840931409544316;\n \n uint256 constant IC2x = 7179175801248398469937796235742931530426723599609730333951354848886540229587;\n uint256 constant IC2y = 15726679295073391999231605242588933096637939096505469654743841929466661215600;\n \n uint256 constant IC3x = 2573745117148849325739153454910100127780727692332106642244822573322697768926;\n uint256 constant IC3y = 17190036615770915642770313751070930945137672912553152769513644794677235106500;\n \n uint256 constant IC4x = 14116421034256566786657627477297711601610402849971726529887805013466353201397;\n uint256 constant IC4y = 8485070584229074200559412926578438645883198277594792037977619628201373699513;\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[4] calldata _pubSignals) public view returns (bool) {\n assembly {\n function checkField(v) {\n if iszero(lt(v, q)) {\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\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\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" + }, + "contracts/verifiers/garanti_registration_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 = 18981494493146797699413473584003903337500344026674158748356152365740882604347;\n uint256 constant deltax2 = 18221584421696726841818737862375935398226401959970671461464876789891440943773;\n uint256 constant deltay1 = 13182257072392169632964104391551423396767366986119198763222331185570216766141;\n uint256 constant deltay2 = 1055999763619532764683818987535346820930542189966934424182524126391532263114;\n\n \n uint256 constant IC0x = 9579394250047657534563426426095079127489461685731836585345036136643186501106;\n uint256 constant IC0y = 9099104635803858536528567879429672150768221243251986952752931620888312777966;\n \n uint256 constant IC1x = 16742803921251520060956705617051970891800993226648453532191536908864553127292;\n uint256 constant IC1y = 2370866612075105760679084555015532787057818492816729720553168629900878453411;\n \n uint256 constant IC2x = 1198559044032862867053778079830233446818498911409168176648000603364093739186;\n uint256 constant IC2y = 1705707149442825364231032898199260673345453686156603650050734584575953146683;\n \n uint256 constant IC3x = 8227987931602929528667070816607404329077624702451836798457232294948292078891;\n uint256 constant IC3y = 20063181599207889574438820489532781853843300843638785745397328806539284090642;\n \n uint256 constant IC4x = 7125527347590397815378809200378110039642415532864842326060497590633383667506;\n uint256 constant IC4y = 8163556343727594939335759011237867566342023627791431441294508737734621079426;\n \n uint256 constant IC5x = 20997293494068572835171892599738628766725761987729696402069061203595826478359;\n uint256 constant IC5y = 16059948127534196987124792060676979843199916529699136496438545284995501095602;\n \n uint256 constant IC6x = 17021328822525982324390769568000212688520466580333628288761906560962941841995;\n uint256 constant IC6y = 5261883703408033387118117055674706016521465932763230261610744756010618560924;\n \n uint256 constant IC7x = 10901863109753159213080424471809415914535140513760405640349521060137871219075;\n uint256 constant IC7y = 14778288214979337896639472664043167455491393250289008539543476005381670290683;\n \n uint256 constant IC8x = 13998728805440395622299361078362563277551541602983787454571111205410111192315;\n uint256 constant IC8y = 3559585529617912948298445099059517654792071369006112940929259959502551444001;\n \n uint256 constant IC9x = 882238089295873026642043167782680157609481002907959944699397709882967318643;\n uint256 constant IC9y = 19580305433284686836351193255169672439178344945533214806182941836067594348566;\n \n uint256 constant IC10x = 18249568535822147984640535315870134333016531565170750204717365905873651523988;\n uint256 constant IC10y = 2529169972933823970798378850481383664704791812605724365414811723841765790997;\n \n uint256 constant IC11x = 12446414909202635741535199485188270293088983356699925634672281045851347103474;\n uint256 constant IC11y = 7278349290662903089838342599021073819845167033436014498220846982051650195077;\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[11] calldata _pubSignals) public view returns (bool) {\n assembly {\n function checkField(v) {\n if iszero(lt(v, q)) {\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 g1_mulAccC(_pVk, IC11x, IC11y, calldataload(add(pubSignals, 320)))\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 checkField(calldataload(add(_pubSignals, 352)))\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" + }, + "contracts/verifiers/garanti_send_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 = 16343044642992925849324144222241208767090826466619068823722193270756586862401;\n uint256 constant deltax2 = 10314194466904948834262239669041981907722654474458582136706961656951325286580;\n uint256 constant deltay1 = 18870959210104009605384605724613549900634110254044850171595460926756475612559;\n uint256 constant deltay2 = 20925792905154616635554201642170069367235560764483397919960492041377193399415;\n\n \n uint256 constant IC0x = 16279736454292033378580080582261180344588543377812411740103484792347015356622;\n uint256 constant IC0y = 803733000626129867641117797978078317549395205362063131280860756724996638023;\n \n uint256 constant IC1x = 5619211177410198973702607025162236734773579252262834151760411624196842318554;\n uint256 constant IC1y = 15681435570112682455420063796287496568176754470688920089793013849736514435508;\n \n uint256 constant IC2x = 5717814455265966580691161694191686582106132906777222823293831790775696595822;\n uint256 constant IC2y = 7288198057139032054533375522924224835499925739466115677964293122948640493060;\n \n uint256 constant IC3x = 11719874491549074336746418596127831936593847863714866444448223031713643812414;\n uint256 constant IC3y = 3896921643091289790188930365771248018546305504721622929270212144308780835428;\n \n uint256 constant IC4x = 16934638514464830968323332218909199124530296213903795969456913426832964661346;\n uint256 constant IC4y = 19219084029045271363030542000358821303054800197657303997612890875588511097378;\n \n uint256 constant IC5x = 21433322676719947948419816354200354171932787369257885135630906528192815911568;\n uint256 constant IC5y = 15498974494399429179225623039072826422890776979301626083872919197439857331783;\n \n uint256 constant IC6x = 19791360312577802765870043762144676029009513261081081551634408233199622166897;\n uint256 constant IC6y = 19833757387208994290140152520904701847141710351997160555863681935452894633990;\n \n uint256 constant IC7x = 11812987319798762911565293502198240965361030266171903511793751983047671339267;\n uint256 constant IC7y = 3362118538113056304065427216001833533279308090045141448508689267731951424922;\n \n uint256 constant IC8x = 3657617595416795675551564184500064160630109848673253434901020037985236883321;\n uint256 constant IC8y = 7212064867888157055116070351675888907682605134292867650646453862420866384926;\n \n uint256 constant IC9x = 2751759577697788291515493518584254550958879092432516239681454344732308836675;\n uint256 constant IC9y = 17395718658677435768781780150392352856658297249604860622676183225242767693766;\n \n uint256 constant IC10x = 11558057052303902400059702043280340777083666103888311295557744738942786146876;\n uint256 constant IC10y = 21030565793076706653087540750237162719144743600115243962610282019181365614469;\n \n uint256 constant IC11x = 211290016040205171000789973300768147213249959649767730538575620641807752262;\n uint256 constant IC11y = 14074251329913641447383549058545049618774236675214643503129059817355211685945;\n \n uint256 constant IC12x = 5007882212908576436870074686757285949917671554669174089445073689337366116032;\n uint256 constant IC12y = 8210959292191381885861754575475610556426433048220439915161269333131257813130;\n \n uint256 constant IC13x = 13293719279090013504236450573751283305572177027415191811669599490547722825726;\n uint256 constant IC13y = 8394737425044468237637593002772009401923423400600154508468919657373196692829;\n \n uint256 constant IC14x = 17849795851187379032917708589772528668451956196405749334825448419860699439305;\n uint256 constant IC14y = 20196166092660826205542664729835753060825163009279265243562561763561842525422;\n \n uint256 constant IC15x = 17368992658991284229859666999462406799966588789284178471226211727121441855077;\n uint256 constant IC15y = 19638423699585201994958334447594876287044896849536887922062219468095291438511;\n \n uint256 constant IC16x = 19654713907060319277441312033604826926154173819497970431557465349988247571915;\n uint256 constant IC16y = 3817298700918036836886147395996118992183906216420518826507097883667875267292;\n \n uint256 constant IC17x = 7715044101419724963760869030711123766888906257960572330606070125777728578096;\n uint256 constant IC17y = 2749100633169600021571256078032739990539406582409355713895084604499131892503;\n \n uint256 constant IC18x = 1173364949775522746248454406902101588760396247931949401978732835369488287447;\n uint256 constant IC18y = 9162940134343148423841367568602434228374502231432445416424257085827811468306;\n \n uint256 constant IC19x = 8575038783593555420096523497046480724134527603142091243347577907184483020590;\n uint256 constant IC19y = 3995032950668712745213557428894999127778473468206002684518315008696369722974;\n \n uint256 constant IC20x = 16279031557779536503297581695798771201855657790427788979382231118751393888831;\n uint256 constant IC20y = 11912095810291450993597456027203060366509629970620014777813772359854497244336;\n \n uint256 constant IC21x = 497943037882247940402571514635505206539213343750949867327216752909870789343;\n uint256 constant IC21y = 14079819629540574449052320474177348262506545728548218346242372754966492347379;\n \n uint256 constant IC22x = 2466234520097193073740775906158395638512443576205561976749084142029636175391;\n uint256 constant IC22y = 106854436093524765859901864629893863994296607336300054760758587613638113109;\n \n uint256 constant IC23x = 10223460436131205976086221904034407754257122156968155547422280250210902765374;\n uint256 constant IC23y = 10646352474369269228971861663558957719664548073963349507349868931039896494345;\n \n uint256 constant IC24x = 7262802786186402103264187138606829015445409360219261120109243327566500881725;\n uint256 constant IC24y = 18331284185744023511439764643398593091927871820445384971993219024493909818118;\n \n uint256 constant IC25x = 13551021044771273396960595497281785961547884026117011307870286500103178948328;\n uint256 constant IC25y = 4186342654966538951118943039446911387678070729114812060402041727621399406368;\n \n uint256 constant IC26x = 15441069578651304978207067953794626204821594755773027544683951205991389396614;\n uint256 constant IC26y = 17560455184568150998457976400911956640491317398464001157951114666917781447625;\n \n uint256 constant IC27x = 7943633557899190383766787269575005363322575426463196731233157476227666177399;\n uint256 constant IC27y = 4879497724217437831661729305237201086591299485711452428791616388363643489471;\n \n uint256 constant IC28x = 76528467087185644481693720110962395284170988413766942453585983860142660820;\n uint256 constant IC28y = 14004039488612212499780635126224013900123007327247416988670721391551869445987;\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[28] calldata _pubSignals) public view returns (bool) {\n assembly {\n function checkField(v) {\n if iszero(lt(v, q)) {\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 g1_mulAccC(_pVk, IC11x, IC11y, calldataload(add(pubSignals, 320)))\n \n g1_mulAccC(_pVk, IC12x, IC12y, calldataload(add(pubSignals, 352)))\n \n g1_mulAccC(_pVk, IC13x, IC13y, calldataload(add(pubSignals, 384)))\n \n g1_mulAccC(_pVk, IC14x, IC14y, calldataload(add(pubSignals, 416)))\n \n g1_mulAccC(_pVk, IC15x, IC15y, calldataload(add(pubSignals, 448)))\n \n g1_mulAccC(_pVk, IC16x, IC16y, calldataload(add(pubSignals, 480)))\n \n g1_mulAccC(_pVk, IC17x, IC17y, calldataload(add(pubSignals, 512)))\n \n g1_mulAccC(_pVk, IC18x, IC18y, calldataload(add(pubSignals, 544)))\n \n g1_mulAccC(_pVk, IC19x, IC19y, calldataload(add(pubSignals, 576)))\n \n g1_mulAccC(_pVk, IC20x, IC20y, calldataload(add(pubSignals, 608)))\n \n g1_mulAccC(_pVk, IC21x, IC21y, calldataload(add(pubSignals, 640)))\n \n g1_mulAccC(_pVk, IC22x, IC22y, calldataload(add(pubSignals, 672)))\n \n g1_mulAccC(_pVk, IC23x, IC23y, calldataload(add(pubSignals, 704)))\n \n g1_mulAccC(_pVk, IC24x, IC24y, calldataload(add(pubSignals, 736)))\n \n g1_mulAccC(_pVk, IC25x, IC25y, calldataload(add(pubSignals, 768)))\n \n g1_mulAccC(_pVk, IC26x, IC26y, calldataload(add(pubSignals, 800)))\n \n g1_mulAccC(_pVk, IC27x, IC27y, calldataload(add(pubSignals, 832)))\n \n g1_mulAccC(_pVk, IC28x, IC28y, calldataload(add(pubSignals, 864)))\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 checkField(calldataload(add(_pubSignals, 352)))\n \n checkField(calldataload(add(_pubSignals, 384)))\n \n checkField(calldataload(add(_pubSignals, 416)))\n \n checkField(calldataload(add(_pubSignals, 448)))\n \n checkField(calldataload(add(_pubSignals, 480)))\n \n checkField(calldataload(add(_pubSignals, 512)))\n \n checkField(calldataload(add(_pubSignals, 544)))\n \n checkField(calldataload(add(_pubSignals, 576)))\n \n checkField(calldataload(add(_pubSignals, 608)))\n \n checkField(calldataload(add(_pubSignals, 640)))\n \n checkField(calldataload(add(_pubSignals, 672)))\n \n checkField(calldataload(add(_pubSignals, 704)))\n \n checkField(calldataload(add(_pubSignals, 736)))\n \n checkField(calldataload(add(_pubSignals, 768)))\n \n checkField(calldataload(add(_pubSignals, 800)))\n \n checkField(calldataload(add(_pubSignals, 832)))\n \n checkField(calldataload(add(_pubSignals, 864)))\n \n checkField(calldataload(add(_pubSignals, 896)))\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" + }, + "contracts/verifiers/hdfc_registration_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 = 18941993809644597263122344954710203970320565994383305999328476744235410761420;\n uint256 constant deltax2 = 16269071872410952148518498647090098652233286976541031880547316776610079594158;\n uint256 constant deltay1 = 1550998249936592441357989923809006764271578090146442710328018508594456802732;\n uint256 constant deltay2 = 19185606473196777841488599791312660844041715603856581158138067158870364920677;\n\n\n uint256 constant IC0x = 18372946622689748518823039356212228839772233944452095064036571257568061521778;\n uint256 constant IC0y = 4090510570013847365600433655993260067276592374276000919765717308908464822251;\n\n uint256 constant IC1x = 14530896712312421799791723884957588697322730616061235674192507548768166179620;\n uint256 constant IC1y = 13241452075905838374684838766757247775031921510259565862881370673172146127140;\n\n uint256 constant IC2x = 14067991457947420245134633075363919619678925016010769439544345434672907387120;\n uint256 constant IC2y = 15075242420546569507483308905973479840611557062002193416356995522848676830458;\n\n uint256 constant IC3x = 2268679644940985681075191131123258317084928252651134980820814399102444034331;\n uint256 constant IC3y = 610946500236913130324137013956528865009524976591765517218479867010763423535;\n\n uint256 constant IC4x = 13966057128193603356523191212776509611934676597484902071144796821963056393663;\n uint256 constant IC4y = 10287649621411400155282198379447556062773569989590617756213092986925054733118;\n\n uint256 constant IC5x = 16014135780036425835288045946537103382733734245255165282336104564746920453689;\n uint256 constant IC5y = 5690379499787398426952245667412062460369879600268772354791710800039878218708;\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[5] calldata _pubSignals) public view returns (bool) {\n assembly {\n function checkField(v) {\n if iszero(lt(v, q)) {\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\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\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/verifiers/hdfc_send_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 = 4702324236483749359376242949045822465319116726958430523945202749659299908356;\n uint256 constant deltax2 = 3208360273321841799729262863226982899406813453791710733556183670543714948331;\n uint256 constant deltay1 = 20522417867108599823821076712059869373887669366867675744686285826246555872195;\n uint256 constant deltay2 = 12670660525148580266180384698238910692596142688879851786303352145688714106072;\n\n\n uint256 constant IC0x = 8030280747517387687084877954234429976549976554414160216395914656104281510226;\n uint256 constant IC0y = 17104142844454039490663032536549076577086340484025562888729760759694808607073;\n\n uint256 constant IC1x = 8772237536144360869027888991210947226074582978952325102593968904821952496262;\n uint256 constant IC1y = 3122625119048240212134605236752638202088112691321561361183603728052095638860;\n\n uint256 constant IC2x = 9866912783934848269401547176895297308112639832209806585476829119584997553683;\n uint256 constant IC2y = 18902285702690262680512478183614519704432813846276579831365492715033962922088;\n\n uint256 constant IC3x = 16438843084767575186842465721500270558254188834133860009416059973276198912687;\n uint256 constant IC3y = 19637681743089590686621664763467973754245190088097969027495488201226096932201;\n\n uint256 constant IC4x = 16244957609429507716576008270804128279750543290646474514068167892102606186532;\n uint256 constant IC4y = 16583611018934211828874350883177026517224756607611408661470436361325164178493;\n\n uint256 constant IC5x = 1880231857260586659536997649990861400508081010769531584628586338531085366147;\n uint256 constant IC5y = 3722839973812376181715232865179709729667208171660553266886579036419738778905;\n\n uint256 constant IC6x = 1270409441163088899313281517456149544998439975345678595006767836844214411555;\n uint256 constant IC6y = 10860874768269047281776646019661374802388524425936615586287903660208564296932;\n\n uint256 constant IC7x = 8434045441105599576935866859120453521448783233787069448109618000861402242607;\n uint256 constant IC7y = 21026011281811734411736486883798620858743532933669000129465844405873540372296;\n\n uint256 constant IC8x = 16444826603046727982676650569240181121009190318002859965831975618430480163200;\n uint256 constant IC8y = 13330479436133799576954496017456751243468101156567577943444875506883800747485;\n\n uint256 constant IC9x = 10555698792423422968534735611731058731769401972428000627056129295681285141769;\n uint256 constant IC9y = 16920701552148154082888907960678652530790355790484478529127070630322055182590;\n\n uint256 constant IC10x = 560745557010411154560455562795570257381559403111495489793631749127360454692;\n uint256 constant IC10y = 1810559313890482073038275535517759684260573040004038901411592861530654003553;\n\n uint256 constant IC11x = 16290647924331362744847363177877456121951933254859466501497770055360811608170;\n uint256 constant IC11y = 7357664199131242056460365154843603175601302622408068632904637798809388576439;\n\n uint256 constant IC12x = 18752167508011332686902609807404507911733917202367475123738963433802316522501;\n uint256 constant IC12y = 18915834728830385178845869536888475042275783085177607701559012212414153432990;\n\n uint256 constant IC13x = 510508922566750460861825255921948971141871467672055616177326398295988211346;\n uint256 constant IC13y = 897537967901588078181449387398733392563087304136250554173225523551061601615;\n\n uint256 constant IC14x = 12705726630718483467144829385938528127462379446304491139120491926133440095304;\n uint256 constant IC14y = 17721913697683987271820073115272158306375363130125429582329456762454201602835;\n\n uint256 constant IC15x = 5311519503957019671658191600270827412585500467097722438446167059198229906675;\n uint256 constant IC15y = 18882610836190640499297283067779602696308349987082087123526913107849320426311;\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[15] calldata _pubSignals) public view returns (bool) {\n assembly {\n function checkField(v) {\n if iszero(lt(v, q)) {\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 g1_mulAccC(_pVk, IC11x, IC11y, calldataload(add(pubSignals, 320)))\n\n g1_mulAccC(_pVk, IC12x, IC12y, calldataload(add(pubSignals, 352)))\n\n g1_mulAccC(_pVk, IC13x, IC13y, calldataload(add(pubSignals, 384)))\n\n g1_mulAccC(_pVk, IC14x, IC14y, calldataload(add(pubSignals, 416)))\n\n g1_mulAccC(_pVk, IC15x, IC15y, calldataload(add(pubSignals, 448)))\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 checkField(calldataload(add(_pubSignals, 352)))\n\n checkField(calldataload(add(_pubSignals, 384)))\n\n checkField(calldataload(add(_pubSignals, 416)))\n\n checkField(calldataload(add(_pubSignals, 448)))\n\n checkField(calldataload(add(_pubSignals, 480)))\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/verifiers/paylah_registration_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 = 12318562733668318057967382830221427666237239699225987985032893645092597896963;\n uint256 constant IC0y = 15657855671899618400007556951504294630273940980996673137263735010085055707390;\n \n uint256 constant IC1x = 16318436856423729107287918093922545458632495139231320565602979356428303462569;\n uint256 constant IC1y = 4810495723973346753789371240387123720895262429716398137877195360051164546484;\n \n uint256 constant IC2x = 19814687963098454533998306163824705102640821485692777137542340920712268514939;\n uint256 constant IC2y = 12257167397615177534567396175047492625199161266145909600553858630293299369528;\n \n uint256 constant IC3x = 13408219487503284549933183576863274981455900506485858464155495162051949037230;\n uint256 constant IC3y = 9837915164010549514666046938539565570695561213547492187431353950688871824403;\n \n uint256 constant IC4x = 15543791996387053481579384412794738528925166527611579250450212802063639702844;\n uint256 constant IC4y = 5711235029861715956844520578122416240878608085931395321340665939384951185140;\n \n uint256 constant IC5x = 9285521198372927293693672678871700213226154499641345273147438129961321930909;\n uint256 constant IC5y = 6639545694811747222574459017287704241632404869005602957496735525145341964055;\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[5] calldata _pubSignals) public view returns (bool) {\n assembly {\n function checkField(v) {\n if iszero(lt(v, q)) {\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\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\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" + }, + "contracts/verifiers/paylah_send_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 = 4319092860097441316049418287444305039048095779893231017821104130403285480292;\n uint256 constant IC0y = 3344270019018610365449998567906450467594170878535598825094680934991584852741;\n \n uint256 constant IC1x = 11429228706986239563767652983220536909858458799154303285237181995899415633242;\n uint256 constant IC1y = 6545942313783633046339776542891696224348608938393152226164374231576653212555;\n \n uint256 constant IC2x = 14507068915704780413895893436584481111775977127382466290584364276286279184041;\n uint256 constant IC2y = 12776142996006275734195042667469848917703677799581851578857261713008840863587;\n \n uint256 constant IC3x = 14620516799603281774801254498631557026600888569007394605375777517068998816879;\n uint256 constant IC3y = 20976214052881772763019511760449083741597478065750993373689562141499728441796;\n \n uint256 constant IC4x = 16766647170945501501541003327281802167884713355161858308462457164639811605202;\n uint256 constant IC4y = 11886305766668108824339744801942299055520242182778941834166632869362289143493;\n \n uint256 constant IC5x = 11263898715798439144132753806492009129785774651116390021927310377487984024124;\n uint256 constant IC5y = 7543303976811892298907828969898468450551675871586411621350951724138970946737;\n \n uint256 constant IC6x = 15153415750327097394944359932059175991634488891027708778561653867959201049294;\n uint256 constant IC6y = 12307113852217971769318985952244808209695770821561174396817655585087333742160;\n \n uint256 constant IC7x = 21196231101285620583549326665225815879246352177423395771525369700801116630992;\n uint256 constant IC7y = 14459731184654830201793061011757567801109181845548939353216436254601523234552;\n \n uint256 constant IC8x = 7203912293872733817769230689902912693525332881269205037210466412487983872706;\n uint256 constant IC8y = 2940690450033114274124219354713399179597380520169733279056465256673148319135;\n \n uint256 constant IC9x = 11984207621756507416244014805108208533750302466835052107461830843008928620881;\n uint256 constant IC9y = 2430148058811900854399441420965836415485217642124795150473630732384740578596;\n \n uint256 constant IC10x = 10106847969584100379020046975698681078894886225943410562611583385863259672832;\n uint256 constant IC10y = 1329585604772287813230345578109804382389620429996175314125687849382909846276;\n \n uint256 constant IC11x = 11456165332954408921987303410118414759538447430037079456477186229507006675539;\n uint256 constant IC11y = 12923074421638603217293676161886695123100153432410892646493728460724993816182;\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[11] calldata _pubSignals) public view returns (bool) {\n assembly {\n function checkField(v) {\n if iszero(lt(v, q)) {\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 g1_mulAccC(_pVk, IC11x, IC11y, calldataload(add(pubSignals, 320)))\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 checkField(calldataload(add(_pubSignals, 352)))\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" + }, + "contracts/verifiers/venmo_registration_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 = 16692827623879808830126666424117838150546424161010311559130132272860078100250;\n uint256 constant deltax2 = 10427071116080203280483990720065140241625477298313711514843941053378169062748;\n uint256 constant deltay1 = 12292291730534257963793035250750833013505862587513324721305952905575695195722;\n uint256 constant deltay2 = 20744227296603881754617447489692206687227195961073977292626564883622660146422;\n\n \n uint256 constant IC0x = 8444387327591820163253359883706304250001395835708102283881672029412593968774;\n uint256 constant IC0y = 277567402350001170949287541204029095267467381858853916455216632597839881894;\n \n uint256 constant IC1x = 11766018000598374647690511651127745003630346152255765679463620118729063279220;\n uint256 constant IC1y = 9973870620290232174118930849612458053973396098852917252709131237691777167431;\n \n uint256 constant IC2x = 21007152236406284962452665998326532111064818140624217664323424373713986554835;\n uint256 constant IC2y = 21775424933265972488601591944473690558387975377218817711132857025038427581344;\n \n uint256 constant IC3x = 19548332954070589452554863336717712265670681575029463650291986455368503640194;\n uint256 constant IC3y = 9885572105525346384114396000793852863725331019928798599079916138124811450063;\n \n uint256 constant IC4x = 20459688676260758193620894047864540995062748169615148342851161008796903469478;\n uint256 constant IC4y = 7185096966400904659568958817597117358528438755253953902329001546341542579806;\n \n uint256 constant IC5x = 15566588852465957839914470257479783208753427872712540953155019219989274639291;\n uint256 constant IC5y = 13117341851862511824800803143692229606087651943401230287864971446454834743578;\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[5] calldata _pubSignals) public view returns (bool) {\n assembly {\n function checkField(v) {\n if iszero(lt(v, q)) {\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\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\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" + }, + "contracts/verifiers/venmo_send_verifier_v1.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 = 7537613082883539239998105689980695625949864158911233083307240523481447029201;\n uint256 constant deltax2 = 18425422419094349166845299166446400283955610392693002196033474730898100891393;\n uint256 constant deltay1 = 9734737963690957740179121580228276788359472364486142941618892845265550985341;\n uint256 constant deltay2 = 19424219928877642960622596960718531292261548324721236723020030007333427710256;\n\n \n uint256 constant IC0x = 6902718247877772411363845861177050309258223353503700050311359326150519336692;\n uint256 constant IC0y = 15825279453398516401265572637576445394013091560186110937875220954546679110159;\n \n uint256 constant IC1x = 2335804858433576387747825582160359354916267733138827948973385608187184828569;\n uint256 constant IC1y = 5736008506642285963655345198014496364551739958976504633673791816202163044118;\n \n uint256 constant IC2x = 6269455652562704144793722062373279568471767955901279627797463015040136088132;\n uint256 constant IC2y = 2097530588191744967177200393826023428699458382295316095274264671302200006698;\n \n uint256 constant IC3x = 9822862276973085434476438868692851322487547916783049654593145248962644277643;\n uint256 constant IC3y = 13358026137961492797393341724052128319258593462853360012627607362475815103442;\n \n uint256 constant IC4x = 14719148997270446956997289375593821114034084437550001883662517657000734282586;\n uint256 constant IC4y = 1998224198671702911531451107100115167770885039941574729645701907241412776308;\n \n uint256 constant IC5x = 359894349223066781310974365307972581164914770698407647854073977658157147230;\n uint256 constant IC5y = 4226113369443688791926415338604034925838584747992607214489363181365627308608;\n \n uint256 constant IC6x = 8131352830647874407773009521188360590887607801163495436549679220199551501178;\n uint256 constant IC6y = 2496366191763335194055513493653718797330181861495912467368843578731618007027;\n \n uint256 constant IC7x = 5324791436169324680862288927376094103624123876195563861346513574577173643567;\n uint256 constant IC7y = 10539632294755752334066059856447171990510491871168341570429569842426314117653;\n \n uint256 constant IC8x = 21398838651908546916551334433437076903885176753396417385115556979686206468251;\n uint256 constant IC8y = 2283165388441295638775771203114643615346617529992451266709724264297809953544;\n \n uint256 constant IC9x = 16450282086321400334368283708403499847573182040077819178856321188442820130414;\n uint256 constant IC9y = 20227982940527385555692156484806747209260038014579804010296344969319860246613;\n \n uint256 constant IC10x = 1416849092724586759478061558363222409117668509275228664731118821895695167480;\n uint256 constant IC10y = 14279591006307641048883156401797861581231631415414897920853119376578010808716;\n \n uint256 constant IC11x = 10972046352748637769234591589921324542843146653569482848432798172628944437256;\n uint256 constant IC11y = 13951850916181885013998871924877530212665252857591601803360542322172843954667;\n \n uint256 constant IC12x = 10475342243781351585273160940612655577727791739250775206756870040352542452664;\n uint256 constant IC12y = 5139068014462344879213636708300130277178459139177464895691208627008733872682;\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[12] calldata _pubSignals) public view returns (bool) {\n assembly {\n function checkField(v) {\n if iszero(lt(v, q)) {\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 g1_mulAccC(_pVk, IC11x, IC11y, calldataload(add(pubSignals, 320)))\n \n g1_mulAccC(_pVk, IC12x, IC12y, calldataload(add(pubSignals, 352)))\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 checkField(calldataload(add(_pubSignals, 352)))\n \n checkField(calldataload(add(_pubSignals, 384)))\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/verifiers/venmo_send_verifier_v2.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 = 18328387051598807528249493314514145024937042250885627547959044883136494366641;\n uint256 constant deltax2 = 3386774781507691045496398544280778263778440812515279208798807180083491280173;\n uint256 constant deltay1 = 16821727561116842532884384419138673375540064786328931249817719916404888022536;\n uint256 constant deltay2 = 1123664166477505744129630415618405338920235895404387079679232588612219519562;\n\n\n uint256 constant IC0x = 683472932776948400750928183065263098669615563556360338372833924600438813516;\n uint256 constant IC0y = 18666217517107659198468932537223289488211162204021049201152947701274582172524;\n\n uint256 constant IC1x = 5957489728060043789412617245535794043845955108950274902279429275472126033981;\n uint256 constant IC1y = 17213842189027108453793126183491372346749115594951602121554021001250817448283;\n\n uint256 constant IC2x = 5280592858930732491081692246698697527250251794316036984307511741279974296201;\n uint256 constant IC2y = 8111734476836347257234571099465898187033625933584344316720010645066801977050;\n\n uint256 constant IC3x = 176983152191433697844590348335722945315715793420756570889736101696034089744;\n uint256 constant IC3y = 4147783463854782141079943196300178088429603752756004708323436962592942199215;\n\n uint256 constant IC4x = 7016641010839351826808883117249407312720210763319474150330325663058498172140;\n uint256 constant IC4y = 15257618442351784318448796698076117344608912509409931913911370631502942212130;\n\n uint256 constant IC5x = 15817725721802798668222148653046845952443466764768454194052249826220321621816;\n uint256 constant IC5y = 2940267881915130534698359759164565925974426096153642581826065077020524285232;\n\n uint256 constant IC6x = 8833333661367035240569025508763324883570403851344432159561900646778286378282;\n uint256 constant IC6y = 3556536150047088396537732554265301999296282372311505822332350804480691191981;\n\n uint256 constant IC7x = 9959056323665039276989174002345573767882071324121097256708298686272275486451;\n uint256 constant IC7y = 7023002103308412666408975880294927323004827513171170207971973197470018772559;\n\n uint256 constant IC8x = 8207282690550689468584562794282986294440142872347002351019411985498318040139;\n uint256 constant IC8y = 8643622322844942938685778286305956077045792123184210921354210423962087823720;\n\n uint256 constant IC9x = 12401119311682184985808768788213841283516443570850536486255767033548969139477;\n uint256 constant IC9y = 16241900536813668741972736250522049008644456869472181028111305624265055525406;\n\n uint256 constant IC10x = 10782959726843763353999019108675107447363568230835523629682248381458082459751;\n uint256 constant IC10y = 14325272441282241380202625730402651125881798640016732547740500645998775923797;\n\n uint256 constant IC11x = 38003989415781860274750588784706013486298216837357322126260012146590910783;\n uint256 constant IC11y = 16359614766165062542993995673953446181450261979749599674250920047691643311095;\n\n uint256 constant IC12x = 4163626116766781564865195283570334511561738797859190315348089812662616563873;\n uint256 constant IC12y = 5621503726237114129092618034079311909999731069956955773990556602251925493627;\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[12] calldata _pubSignals) public view returns (bool) {\n assembly {\n function checkField(v) {\n if iszero(lt(v, q)) {\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 g1_mulAccC(_pVk, IC11x, IC11y, calldataload(add(pubSignals, 320)))\n\n g1_mulAccC(_pVk, IC12x, IC12y, calldataload(add(pubSignals, 352)))\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 checkField(calldataload(add(_pubSignals, 352)))\n\n checkField(calldataload(add(_pubSignals, 384)))\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/verifiers/venmo_send_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 = 5710629204359318057562498392234897061794505526378244639613545081979421872324;\n uint256 constant deltax2 = 990656993167988662763349194790300993619547607285680693352122387169954518876;\n uint256 constant deltay1 = 716219014029453087010203485855017030343957665868140907538168510860723855404;\n uint256 constant deltay2 = 15567073068481787678459322691280596720950847803967120869528969231388542383007;\n\n \n uint256 constant IC0x = 3627016935680980991432758845809120437097698562642321662019774941798047598180;\n uint256 constant IC0y = 16742737478481137559777273336649173908087975045426893354724005348183061433359;\n \n uint256 constant IC1x = 1454889468509402624274228018232533000837827531552657849863656594197598947498;\n uint256 constant IC1y = 21114519264105667881501109217530601184286085076749464919673271702318856586869;\n \n uint256 constant IC2x = 15214926606177919954497590021391485480795904680262796779354958872907701613369;\n uint256 constant IC2y = 3436701283643568631088610954415601741399004409005447167420424641912447528939;\n \n uint256 constant IC3x = 4535577697185795754970511618264939460763831131849914629687538976336257649268;\n uint256 constant IC3y = 7758558535557743288212279084775965030097651866120453423634300893790511261820;\n \n uint256 constant IC4x = 874294953994422297831973347765527399192587644625708091600444498339317231142;\n uint256 constant IC4y = 987062449590966973283739390864507348641413150099442677760662058272414279274;\n \n uint256 constant IC5x = 21093306057635441117249393023592254587788813974241613308459037792013982125271;\n uint256 constant IC5y = 2674227458751675036151996130714025181946977717008550031124827209614433661640;\n \n uint256 constant IC6x = 13846687013867984054231693830774779045583700534400211257658890706223553634739;\n uint256 constant IC6y = 8017285138819571587063238313118652954321504644123983130004849545264828919081;\n \n uint256 constant IC7x = 13134004890952141957850059371765174729898824494756098133509785273144965229605;\n uint256 constant IC7y = 19833383650616654544301917274181853787895876513168493371626228893058581160277;\n \n uint256 constant IC8x = 15730855678085463666228938279082107543444904323060443712618683292548728266981;\n uint256 constant IC8y = 11187003173972315212472857297424367154976035201682387760241185052675631112914;\n \n uint256 constant IC9x = 19431007015983296833648365920726396734910027676221391642968597625199383752634;\n uint256 constant IC9y = 21132440606561643161647678729377817341013518219983716149257194049459184921050;\n \n uint256 constant IC10x = 4559717915456495626304866642697317683057747436742022494016974327403606371979;\n uint256 constant IC10y = 11478380993372530002009436682140297146781606321299572933211280870931334446617;\n \n uint256 constant IC11x = 16525805622865173604160997674689687443990633252176419982940261013647563901344;\n uint256 constant IC11y = 792201218354373970098710160330509619168590675536085985581042389294282406443;\n \n uint256 constant IC12x = 10525116069038722935367461628431297752051968830490923775813610986261326824582;\n uint256 constant IC12y = 10970802876973329565857167947893820731407652682848506683295471907792738767120;\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[12] calldata _pubSignals) public view returns (bool) {\n assembly {\n function checkField(v) {\n if iszero(lt(v, q)) {\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 g1_mulAccC(_pVk, IC11x, IC11y, calldataload(add(pubSignals, 320)))\n \n g1_mulAccC(_pVk, IC12x, IC12y, calldataload(add(pubSignals, 352)))\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 checkField(calldataload(add(_pubSignals, 352)))\n \n checkField(calldataload(add(_pubSignals, 384)))\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" + }, + "fhevm/lib/ACLAddress.sol": { + "content": "// SPDX-License-Identifier: BSD-3-Clause-Clear\n\npragma solidity ^0.8.24;\n\naddress constant aclAdd = 0x2Fb4341027eb1d2aD8B5D9708187df8633cAFA92;\n" + }, + "fhevm/lib/FHEVMCoprocessorAddress.sol": { + "content": "// SPDX-License-Identifier: BSD-3-Clause-Clear\n\npragma solidity ^0.8.24;\n\naddress constant fhevmCoprocessorAdd = 0x05fD9B5EFE0a996095f42Ed7e77c390810CF660c;\n" + }, + "fhevm/lib/Impl.sol": { + "content": "// SPDX-License-Identifier: BSD-3-Clause-Clear\n\npragma solidity ^0.8.24;\n\nimport \"./TFHE.sol\";\nimport \"./FHEVMCoprocessorAddress.sol\";\nimport \"./ACLAddress.sol\";\n\ninterface IFHEVMCoprocessor {\n function fheAdd(uint256 lhs, uint256 rhs, bytes1 scalarByte) external returns (uint256 result);\n function fheSub(uint256 lhs, uint256 rhs, bytes1 scalarByte) external returns (uint256 result);\n function fheMul(uint256 lhs, uint256 rhs, bytes1 scalarByte) external returns (uint256 result);\n function fheDiv(uint256 lhs, uint256 rhs, bytes1 scalarByte) external returns (uint256 result);\n function fheRem(uint256 lhs, uint256 rhs, bytes1 scalarByte) external returns (uint256 result);\n function fheBitAnd(uint256 lhs, uint256 rhs, bytes1 scalarByte) external returns (uint256 result);\n function fheBitOr(uint256 lhs, uint256 rhs, bytes1 scalarByte) external returns (uint256 result);\n function fheBitXor(uint256 lhs, uint256 rhs, bytes1 scalarByte) external returns (uint256 result);\n function fheShl(uint256 lhs, uint256 rhs, bytes1 scalarByte) external returns (uint256 result);\n function fheShr(uint256 lhs, uint256 rhs, bytes1 scalarByte) external returns (uint256 result);\n function fheRotl(uint256 lhs, uint256 rhs, bytes1 scalarByte) external returns (uint256 result);\n function fheRotr(uint256 lhs, uint256 rhs, bytes1 scalarByte) external returns (uint256 result);\n function fheEq(uint256 lhs, uint256 rhs, bytes1 scalarByte) external returns (uint256 result);\n function fheNe(uint256 lhs, uint256 rhs, bytes1 scalarByte) external returns (uint256 result);\n function fheGe(uint256 lhs, uint256 rhs, bytes1 scalarByte) external returns (uint256 result);\n function fheGt(uint256 lhs, uint256 rhs, bytes1 scalarByte) external returns (uint256 result);\n function fheLe(uint256 lhs, uint256 rhs, bytes1 scalarByte) external returns (uint256 result);\n function fheLt(uint256 lhs, uint256 rhs, bytes1 scalarByte) external returns (uint256 result);\n function fheMin(uint256 lhs, uint256 rhs, bytes1 scalarByte) external returns (uint256 result);\n function fheMax(uint256 lhs, uint256 rhs, bytes1 scalarByte) external returns (uint256 result);\n function fheNeg(uint256 ct) external returns (uint256 result);\n function fheNot(uint256 ct) external returns (uint256 result);\n function verifyCiphertext(\n bytes32 inputHandle,\n address callerAddress,\n bytes memory inputProof,\n bytes1 inputType\n ) external returns (uint256 result);\n function cast(uint256 ct, bytes1 toType) external returns (uint256 result);\n function trivialEncrypt(uint256 ct, bytes1 toType) external returns (uint256 result);\n function fheIfThenElse(uint256 control, uint256 ifTrue, uint256 ifFalse) external returns (uint256 result);\n function fheRand(bytes1 randType) external returns (uint256 result);\n function fheRandBounded(uint256 upperBound, bytes1 randType) external returns (uint256 result);\n function cleanTransientStorage() external;\n}\n\ninterface IACL {\n function allowTransient(uint256 ciphertext, address account) external;\n function allow(uint256 handle, address account) external;\n function cleanTransientStorage() external;\n function isAllowed(uint256 handle, address account) external view returns (bool);\n}\n\nlibrary Impl {\n function add(uint256 lhs, uint256 rhs, bool scalar) internal returns (uint256 result) {\n bytes1 scalarByte;\n if (scalar) {\n scalarByte = 0x01;\n } else {\n scalarByte = 0x00;\n }\n result = IFHEVMCoprocessor(fhevmCoprocessorAdd).fheAdd(lhs, rhs, scalarByte);\n }\n\n function sub(uint256 lhs, uint256 rhs, bool scalar) internal returns (uint256 result) {\n bytes1 scalarByte;\n if (scalar) {\n scalarByte = 0x01;\n } else {\n scalarByte = 0x00;\n }\n result = IFHEVMCoprocessor(fhevmCoprocessorAdd).fheSub(lhs, rhs, scalarByte);\n }\n\n function mul(uint256 lhs, uint256 rhs, bool scalar) internal returns (uint256 result) {\n bytes1 scalarByte;\n if (scalar) {\n scalarByte = 0x01;\n } else {\n scalarByte = 0x00;\n }\n result = IFHEVMCoprocessor(fhevmCoprocessorAdd).fheMul(lhs, rhs, scalarByte);\n }\n\n function div(uint256 lhs, uint256 rhs) internal returns (uint256 result) {\n bytes1 scalarByte = 0x01;\n result = IFHEVMCoprocessor(fhevmCoprocessorAdd).fheDiv(lhs, rhs, scalarByte);\n }\n\n function rem(uint256 lhs, uint256 rhs) internal returns (uint256 result) {\n bytes1 scalarByte = 0x01;\n result = IFHEVMCoprocessor(fhevmCoprocessorAdd).fheRem(lhs, rhs, scalarByte);\n }\n\n function and(uint256 lhs, uint256 rhs) internal returns (uint256 result) {\n bytes1 scalarByte = 0x00;\n result = IFHEVMCoprocessor(fhevmCoprocessorAdd).fheBitAnd(lhs, rhs, scalarByte);\n }\n\n function or(uint256 lhs, uint256 rhs) internal returns (uint256 result) {\n bytes1 scalarByte = 0x00;\n result = IFHEVMCoprocessor(fhevmCoprocessorAdd).fheBitOr(lhs, rhs, scalarByte);\n }\n\n function xor(uint256 lhs, uint256 rhs) internal returns (uint256 result) {\n bytes1 scalarByte = 0x00;\n result = IFHEVMCoprocessor(fhevmCoprocessorAdd).fheBitXor(lhs, rhs, scalarByte);\n }\n\n function shl(uint256 lhs, uint256 rhs, bool scalar) internal returns (uint256 result) {\n bytes1 scalarByte;\n if (scalar) {\n scalarByte = 0x01;\n } else {\n scalarByte = 0x00;\n }\n result = IFHEVMCoprocessor(fhevmCoprocessorAdd).fheShl(lhs, rhs, scalarByte);\n }\n\n function shr(uint256 lhs, uint256 rhs, bool scalar) internal returns (uint256 result) {\n bytes1 scalarByte;\n if (scalar) {\n scalarByte = 0x01;\n } else {\n scalarByte = 0x00;\n }\n result = IFHEVMCoprocessor(fhevmCoprocessorAdd).fheShr(lhs, rhs, scalarByte);\n }\n\n function rotl(uint256 lhs, uint256 rhs, bool scalar) internal returns (uint256 result) {\n bytes1 scalarByte;\n if (scalar) {\n scalarByte = 0x01;\n } else {\n scalarByte = 0x00;\n }\n result = IFHEVMCoprocessor(fhevmCoprocessorAdd).fheRotl(lhs, rhs, scalarByte);\n }\n\n function rotr(uint256 lhs, uint256 rhs, bool scalar) internal returns (uint256 result) {\n bytes1 scalarByte;\n if (scalar) {\n scalarByte = 0x01;\n } else {\n scalarByte = 0x00;\n }\n result = IFHEVMCoprocessor(fhevmCoprocessorAdd).fheRotr(lhs, rhs, scalarByte);\n }\n\n function eq(uint256 lhs, uint256 rhs, bool scalar) internal returns (uint256 result) {\n bytes1 scalarByte;\n if (scalar) {\n scalarByte = 0x01;\n } else {\n scalarByte = 0x00;\n }\n result = IFHEVMCoprocessor(fhevmCoprocessorAdd).fheEq(lhs, rhs, scalarByte);\n }\n\n function ne(uint256 lhs, uint256 rhs, bool scalar) internal returns (uint256 result) {\n bytes1 scalarByte;\n if (scalar) {\n scalarByte = 0x01;\n } else {\n scalarByte = 0x00;\n }\n result = IFHEVMCoprocessor(fhevmCoprocessorAdd).fheNe(lhs, rhs, scalarByte);\n }\n\n function ge(uint256 lhs, uint256 rhs, bool scalar) internal returns (uint256 result) {\n bytes1 scalarByte;\n if (scalar) {\n scalarByte = 0x01;\n } else {\n scalarByte = 0x00;\n }\n result = IFHEVMCoprocessor(fhevmCoprocessorAdd).fheGe(lhs, rhs, scalarByte);\n }\n\n function gt(uint256 lhs, uint256 rhs, bool scalar) internal returns (uint256 result) {\n bytes1 scalarByte;\n if (scalar) {\n scalarByte = 0x01;\n } else {\n scalarByte = 0x00;\n }\n result = IFHEVMCoprocessor(fhevmCoprocessorAdd).fheGt(lhs, rhs, scalarByte);\n }\n\n function le(uint256 lhs, uint256 rhs, bool scalar) internal returns (uint256 result) {\n bytes1 scalarByte;\n if (scalar) {\n scalarByte = 0x01;\n } else {\n scalarByte = 0x00;\n }\n result = IFHEVMCoprocessor(fhevmCoprocessorAdd).fheLe(lhs, rhs, scalarByte);\n }\n\n function lt(uint256 lhs, uint256 rhs, bool scalar) internal returns (uint256 result) {\n bytes1 scalarByte;\n if (scalar) {\n scalarByte = 0x01;\n } else {\n scalarByte = 0x00;\n }\n result = IFHEVMCoprocessor(fhevmCoprocessorAdd).fheLt(lhs, rhs, scalarByte);\n }\n\n function min(uint256 lhs, uint256 rhs, bool scalar) internal returns (uint256 result) {\n bytes1 scalarByte;\n if (scalar) {\n scalarByte = 0x01;\n } else {\n scalarByte = 0x00;\n }\n result = IFHEVMCoprocessor(fhevmCoprocessorAdd).fheMin(lhs, rhs, scalarByte);\n }\n\n function max(uint256 lhs, uint256 rhs, bool scalar) internal returns (uint256 result) {\n bytes1 scalarByte;\n if (scalar) {\n scalarByte = 0x01;\n } else {\n scalarByte = 0x00;\n }\n result = IFHEVMCoprocessor(fhevmCoprocessorAdd).fheMax(lhs, rhs, scalarByte);\n }\n\n function neg(uint256 ct) internal returns (uint256 result) {\n result = IFHEVMCoprocessor(fhevmCoprocessorAdd).fheNeg(ct);\n }\n\n function not(uint256 ct) internal returns (uint256 result) {\n result = IFHEVMCoprocessor(fhevmCoprocessorAdd).fheNot(ct);\n }\n\n // If 'control's value is 'true', the result has the same value as 'ifTrue'.\n // If 'control's value is 'false', the result has the same value as 'ifFalse'.\n function select(uint256 control, uint256 ifTrue, uint256 ifFalse) internal returns (uint256 result) {\n result = IFHEVMCoprocessor(fhevmCoprocessorAdd).fheIfThenElse(control, ifTrue, ifFalse);\n }\n\n function verify(bytes32 inputHandle, bytes memory inputProof, uint8 toType) internal returns (uint256 result) {\n result = IFHEVMCoprocessor(fhevmCoprocessorAdd).verifyCiphertext(\n inputHandle,\n msg.sender,\n inputProof,\n bytes1(toType)\n );\n IACL(aclAdd).allowTransient(result, msg.sender);\n }\n\n function cast(uint256 ciphertext, uint8 toType) internal returns (uint256 result) {\n result = IFHEVMCoprocessor(fhevmCoprocessorAdd).cast(ciphertext, bytes1(toType));\n }\n\n function trivialEncrypt(uint256 value, uint8 toType) internal returns (uint256 result) {\n result = IFHEVMCoprocessor(fhevmCoprocessorAdd).trivialEncrypt(value, bytes1(toType));\n }\n\n function rand(uint8 randType) internal returns (uint256 result) {\n result = IFHEVMCoprocessor(fhevmCoprocessorAdd).fheRand(bytes1(randType));\n }\n\n function randBounded(uint256 upperBound, uint8 randType) internal returns (uint256 result) {\n result = IFHEVMCoprocessor(fhevmCoprocessorAdd).fheRandBounded(upperBound, bytes1(randType));\n }\n\n function allowTransient(uint256 handle, address account) internal {\n IACL(aclAdd).allowTransient(handle, account);\n }\n\n function allow(uint256 handle, address account) internal {\n IACL(aclAdd).allow(handle, account);\n }\n\n function cleanTransientStorage() internal {\n IACL(aclAdd).cleanTransientStorage();\n IFHEVMCoprocessor(fhevmCoprocessorAdd).cleanTransientStorage();\n }\n\n function isAllowed(uint256 handle, address account) internal view returns (bool) {\n return IACL(aclAdd).isAllowed(handle, account);\n }\n}\n" + }, + "fhevm/lib/TFHE.sol": { + "content": "// SPDX-License-Identifier: BSD-3-Clause-Clear\n\npragma solidity ^0.8.24;\n\ntype ebool is uint256;\ntype euint4 is uint256;\ntype euint8 is uint256;\ntype euint16 is uint256;\ntype euint32 is uint256;\ntype euint64 is uint256;\ntype eaddress is uint256;\ntype ebytes256 is uint256;\ntype einput is bytes32;\n\nlibrary Common {\n // Values used to communicate types to the runtime.\n uint8 internal constant ebool_t = 0;\n uint8 internal constant euint4_t = 1;\n uint8 internal constant euint8_t = 2;\n uint8 internal constant euint16_t = 3;\n uint8 internal constant euint32_t = 4;\n uint8 internal constant euint64_t = 5;\n uint8 internal constant euint128_t = 6;\n uint8 internal constant euint160_t = 7;\n uint8 internal constant euint256_t = 8;\n uint8 internal constant ebytes64_t = 9;\n uint8 internal constant ebytes128_t = 10;\n uint8 internal constant ebytes256_t = 11;\n}\n\nimport \"./Impl.sol\";\n\nlibrary TFHE {\n euint4 constant NIL4 = euint4.wrap(0);\n euint8 constant NIL8 = euint8.wrap(0);\n euint16 constant NIL16 = euint16.wrap(0);\n euint32 constant NIL32 = euint32.wrap(0);\n euint64 constant NIL64 = euint64.wrap(0);\n\n // Return true if the enrypted bool is initialized and false otherwise.\n function isInitialized(ebool v) internal pure returns (bool) {\n return ebool.unwrap(v) != 0;\n }\n\n // Return true if the enrypted integer is initialized and false otherwise.\n function isInitialized(euint4 v) internal pure returns (bool) {\n return euint4.unwrap(v) != 0;\n }\n\n // Return true if the enrypted integer is initialized and false otherwise.\n function isInitialized(euint8 v) internal pure returns (bool) {\n return euint8.unwrap(v) != 0;\n }\n\n // Return true if the enrypted integer is initialized and false otherwise.\n function isInitialized(euint16 v) internal pure returns (bool) {\n return euint16.unwrap(v) != 0;\n }\n\n // Return true if the enrypted integer is initialized and false otherwise.\n function isInitialized(euint32 v) internal pure returns (bool) {\n return euint32.unwrap(v) != 0;\n }\n\n // Return true if the enrypted integer is initialized and false otherwise.\n function isInitialized(euint64 v) internal pure returns (bool) {\n return euint64.unwrap(v) != 0;\n }\n\n // Evaluate add(a, b) and return the result.\n function add(euint4 a, euint4 b) internal returns (euint4) {\n if (!isInitialized(a)) {\n a = asEuint4(0);\n }\n if (!isInitialized(b)) {\n b = asEuint4(0);\n }\n return euint4.wrap(Impl.add(euint4.unwrap(a), euint4.unwrap(b), false));\n }\n\n // Evaluate sub(a, b) and return the result.\n function sub(euint4 a, euint4 b) internal returns (euint4) {\n if (!isInitialized(a)) {\n a = asEuint4(0);\n }\n if (!isInitialized(b)) {\n b = asEuint4(0);\n }\n return euint4.wrap(Impl.sub(euint4.unwrap(a), euint4.unwrap(b), false));\n }\n\n // Evaluate mul(a, b) and return the result.\n function mul(euint4 a, euint4 b) internal returns (euint4) {\n if (!isInitialized(a)) {\n a = asEuint4(0);\n }\n if (!isInitialized(b)) {\n b = asEuint4(0);\n }\n return euint4.wrap(Impl.mul(euint4.unwrap(a), euint4.unwrap(b), false));\n }\n\n // Evaluate and(a, b) and return the result.\n function and(euint4 a, euint4 b) internal returns (euint4) {\n if (!isInitialized(a)) {\n a = asEuint4(0);\n }\n if (!isInitialized(b)) {\n b = asEuint4(0);\n }\n return euint4.wrap(Impl.and(euint4.unwrap(a), euint4.unwrap(b)));\n }\n\n // Evaluate or(a, b) and return the result.\n function or(euint4 a, euint4 b) internal returns (euint4) {\n if (!isInitialized(a)) {\n a = asEuint4(0);\n }\n if (!isInitialized(b)) {\n b = asEuint4(0);\n }\n return euint4.wrap(Impl.or(euint4.unwrap(a), euint4.unwrap(b)));\n }\n\n // Evaluate xor(a, b) and return the result.\n function xor(euint4 a, euint4 b) internal returns (euint4) {\n if (!isInitialized(a)) {\n a = asEuint4(0);\n }\n if (!isInitialized(b)) {\n b = asEuint4(0);\n }\n return euint4.wrap(Impl.xor(euint4.unwrap(a), euint4.unwrap(b)));\n }\n\n // Evaluate eq(a, b) and return the result.\n function eq(euint4 a, euint4 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint4(0);\n }\n if (!isInitialized(b)) {\n b = asEuint4(0);\n }\n return ebool.wrap(Impl.eq(euint4.unwrap(a), euint4.unwrap(b), false));\n }\n\n // Evaluate ne(a, b) and return the result.\n function ne(euint4 a, euint4 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint4(0);\n }\n if (!isInitialized(b)) {\n b = asEuint4(0);\n }\n return ebool.wrap(Impl.ne(euint4.unwrap(a), euint4.unwrap(b), false));\n }\n\n // Evaluate ge(a, b) and return the result.\n function ge(euint4 a, euint4 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint4(0);\n }\n if (!isInitialized(b)) {\n b = asEuint4(0);\n }\n return ebool.wrap(Impl.ge(euint4.unwrap(a), euint4.unwrap(b), false));\n }\n\n // Evaluate gt(a, b) and return the result.\n function gt(euint4 a, euint4 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint4(0);\n }\n if (!isInitialized(b)) {\n b = asEuint4(0);\n }\n return ebool.wrap(Impl.gt(euint4.unwrap(a), euint4.unwrap(b), false));\n }\n\n // Evaluate le(a, b) and return the result.\n function le(euint4 a, euint4 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint4(0);\n }\n if (!isInitialized(b)) {\n b = asEuint4(0);\n }\n return ebool.wrap(Impl.le(euint4.unwrap(a), euint4.unwrap(b), false));\n }\n\n // Evaluate lt(a, b) and return the result.\n function lt(euint4 a, euint4 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint4(0);\n }\n if (!isInitialized(b)) {\n b = asEuint4(0);\n }\n return ebool.wrap(Impl.lt(euint4.unwrap(a), euint4.unwrap(b), false));\n }\n\n // Evaluate min(a, b) and return the result.\n function min(euint4 a, euint4 b) internal returns (euint4) {\n if (!isInitialized(a)) {\n a = asEuint4(0);\n }\n if (!isInitialized(b)) {\n b = asEuint4(0);\n }\n return euint4.wrap(Impl.min(euint4.unwrap(a), euint4.unwrap(b), false));\n }\n\n // Evaluate max(a, b) and return the result.\n function max(euint4 a, euint4 b) internal returns (euint4) {\n if (!isInitialized(a)) {\n a = asEuint4(0);\n }\n if (!isInitialized(b)) {\n b = asEuint4(0);\n }\n return euint4.wrap(Impl.max(euint4.unwrap(a), euint4.unwrap(b), false));\n }\n\n // Evaluate add(a, b) and return the result.\n function add(euint4 a, euint8 b) internal returns (euint8) {\n if (!isInitialized(a)) {\n a = asEuint4(0);\n }\n if (!isInitialized(b)) {\n b = asEuint8(0);\n }\n return euint8.wrap(Impl.add(euint8.unwrap(asEuint8(a)), euint8.unwrap(b), false));\n }\n\n // Evaluate sub(a, b) and return the result.\n function sub(euint4 a, euint8 b) internal returns (euint8) {\n if (!isInitialized(a)) {\n a = asEuint4(0);\n }\n if (!isInitialized(b)) {\n b = asEuint8(0);\n }\n return euint8.wrap(Impl.sub(euint8.unwrap(asEuint8(a)), euint8.unwrap(b), false));\n }\n\n // Evaluate mul(a, b) and return the result.\n function mul(euint4 a, euint8 b) internal returns (euint8) {\n if (!isInitialized(a)) {\n a = asEuint4(0);\n }\n if (!isInitialized(b)) {\n b = asEuint8(0);\n }\n return euint8.wrap(Impl.mul(euint8.unwrap(asEuint8(a)), euint8.unwrap(b), false));\n }\n\n // Evaluate and(a, b) and return the result.\n function and(euint4 a, euint8 b) internal returns (euint8) {\n if (!isInitialized(a)) {\n a = asEuint4(0);\n }\n if (!isInitialized(b)) {\n b = asEuint8(0);\n }\n return euint8.wrap(Impl.and(euint8.unwrap(asEuint8(a)), euint8.unwrap(b)));\n }\n\n // Evaluate or(a, b) and return the result.\n function or(euint4 a, euint8 b) internal returns (euint8) {\n if (!isInitialized(a)) {\n a = asEuint4(0);\n }\n if (!isInitialized(b)) {\n b = asEuint8(0);\n }\n return euint8.wrap(Impl.or(euint8.unwrap(asEuint8(a)), euint8.unwrap(b)));\n }\n\n // Evaluate xor(a, b) and return the result.\n function xor(euint4 a, euint8 b) internal returns (euint8) {\n if (!isInitialized(a)) {\n a = asEuint4(0);\n }\n if (!isInitialized(b)) {\n b = asEuint8(0);\n }\n return euint8.wrap(Impl.xor(euint8.unwrap(asEuint8(a)), euint8.unwrap(b)));\n }\n\n // Evaluate eq(a, b) and return the result.\n function eq(euint4 a, euint8 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint4(0);\n }\n if (!isInitialized(b)) {\n b = asEuint8(0);\n }\n return ebool.wrap(Impl.eq(euint8.unwrap(asEuint8(a)), euint8.unwrap(b), false));\n }\n\n // Evaluate ne(a, b) and return the result.\n function ne(euint4 a, euint8 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint4(0);\n }\n if (!isInitialized(b)) {\n b = asEuint8(0);\n }\n return ebool.wrap(Impl.ne(euint8.unwrap(asEuint8(a)), euint8.unwrap(b), false));\n }\n\n // Evaluate ge(a, b) and return the result.\n function ge(euint4 a, euint8 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint4(0);\n }\n if (!isInitialized(b)) {\n b = asEuint8(0);\n }\n return ebool.wrap(Impl.ge(euint8.unwrap(asEuint8(a)), euint8.unwrap(b), false));\n }\n\n // Evaluate gt(a, b) and return the result.\n function gt(euint4 a, euint8 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint4(0);\n }\n if (!isInitialized(b)) {\n b = asEuint8(0);\n }\n return ebool.wrap(Impl.gt(euint8.unwrap(asEuint8(a)), euint8.unwrap(b), false));\n }\n\n // Evaluate le(a, b) and return the result.\n function le(euint4 a, euint8 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint4(0);\n }\n if (!isInitialized(b)) {\n b = asEuint8(0);\n }\n return ebool.wrap(Impl.le(euint8.unwrap(asEuint8(a)), euint8.unwrap(b), false));\n }\n\n // Evaluate lt(a, b) and return the result.\n function lt(euint4 a, euint8 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint4(0);\n }\n if (!isInitialized(b)) {\n b = asEuint8(0);\n }\n return ebool.wrap(Impl.lt(euint8.unwrap(asEuint8(a)), euint8.unwrap(b), false));\n }\n\n // Evaluate min(a, b) and return the result.\n function min(euint4 a, euint8 b) internal returns (euint8) {\n if (!isInitialized(a)) {\n a = asEuint4(0);\n }\n if (!isInitialized(b)) {\n b = asEuint8(0);\n }\n return euint8.wrap(Impl.min(euint8.unwrap(asEuint8(a)), euint8.unwrap(b), false));\n }\n\n // Evaluate max(a, b) and return the result.\n function max(euint4 a, euint8 b) internal returns (euint8) {\n if (!isInitialized(a)) {\n a = asEuint4(0);\n }\n if (!isInitialized(b)) {\n b = asEuint8(0);\n }\n return euint8.wrap(Impl.max(euint8.unwrap(asEuint8(a)), euint8.unwrap(b), false));\n }\n\n // Evaluate add(a, b) and return the result.\n function add(euint4 a, euint16 b) internal returns (euint16) {\n if (!isInitialized(a)) {\n a = asEuint4(0);\n }\n if (!isInitialized(b)) {\n b = asEuint16(0);\n }\n return euint16.wrap(Impl.add(euint16.unwrap(asEuint16(a)), euint16.unwrap(b), false));\n }\n\n // Evaluate sub(a, b) and return the result.\n function sub(euint4 a, euint16 b) internal returns (euint16) {\n if (!isInitialized(a)) {\n a = asEuint4(0);\n }\n if (!isInitialized(b)) {\n b = asEuint16(0);\n }\n return euint16.wrap(Impl.sub(euint16.unwrap(asEuint16(a)), euint16.unwrap(b), false));\n }\n\n // Evaluate mul(a, b) and return the result.\n function mul(euint4 a, euint16 b) internal returns (euint16) {\n if (!isInitialized(a)) {\n a = asEuint4(0);\n }\n if (!isInitialized(b)) {\n b = asEuint16(0);\n }\n return euint16.wrap(Impl.mul(euint16.unwrap(asEuint16(a)), euint16.unwrap(b), false));\n }\n\n // Evaluate and(a, b) and return the result.\n function and(euint4 a, euint16 b) internal returns (euint16) {\n if (!isInitialized(a)) {\n a = asEuint4(0);\n }\n if (!isInitialized(b)) {\n b = asEuint16(0);\n }\n return euint16.wrap(Impl.and(euint16.unwrap(asEuint16(a)), euint16.unwrap(b)));\n }\n\n // Evaluate or(a, b) and return the result.\n function or(euint4 a, euint16 b) internal returns (euint16) {\n if (!isInitialized(a)) {\n a = asEuint4(0);\n }\n if (!isInitialized(b)) {\n b = asEuint16(0);\n }\n return euint16.wrap(Impl.or(euint16.unwrap(asEuint16(a)), euint16.unwrap(b)));\n }\n\n // Evaluate xor(a, b) and return the result.\n function xor(euint4 a, euint16 b) internal returns (euint16) {\n if (!isInitialized(a)) {\n a = asEuint4(0);\n }\n if (!isInitialized(b)) {\n b = asEuint16(0);\n }\n return euint16.wrap(Impl.xor(euint16.unwrap(asEuint16(a)), euint16.unwrap(b)));\n }\n\n // Evaluate eq(a, b) and return the result.\n function eq(euint4 a, euint16 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint4(0);\n }\n if (!isInitialized(b)) {\n b = asEuint16(0);\n }\n return ebool.wrap(Impl.eq(euint16.unwrap(asEuint16(a)), euint16.unwrap(b), false));\n }\n\n // Evaluate ne(a, b) and return the result.\n function ne(euint4 a, euint16 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint4(0);\n }\n if (!isInitialized(b)) {\n b = asEuint16(0);\n }\n return ebool.wrap(Impl.ne(euint16.unwrap(asEuint16(a)), euint16.unwrap(b), false));\n }\n\n // Evaluate ge(a, b) and return the result.\n function ge(euint4 a, euint16 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint4(0);\n }\n if (!isInitialized(b)) {\n b = asEuint16(0);\n }\n return ebool.wrap(Impl.ge(euint16.unwrap(asEuint16(a)), euint16.unwrap(b), false));\n }\n\n // Evaluate gt(a, b) and return the result.\n function gt(euint4 a, euint16 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint4(0);\n }\n if (!isInitialized(b)) {\n b = asEuint16(0);\n }\n return ebool.wrap(Impl.gt(euint16.unwrap(asEuint16(a)), euint16.unwrap(b), false));\n }\n\n // Evaluate le(a, b) and return the result.\n function le(euint4 a, euint16 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint4(0);\n }\n if (!isInitialized(b)) {\n b = asEuint16(0);\n }\n return ebool.wrap(Impl.le(euint16.unwrap(asEuint16(a)), euint16.unwrap(b), false));\n }\n\n // Evaluate lt(a, b) and return the result.\n function lt(euint4 a, euint16 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint4(0);\n }\n if (!isInitialized(b)) {\n b = asEuint16(0);\n }\n return ebool.wrap(Impl.lt(euint16.unwrap(asEuint16(a)), euint16.unwrap(b), false));\n }\n\n // Evaluate min(a, b) and return the result.\n function min(euint4 a, euint16 b) internal returns (euint16) {\n if (!isInitialized(a)) {\n a = asEuint4(0);\n }\n if (!isInitialized(b)) {\n b = asEuint16(0);\n }\n return euint16.wrap(Impl.min(euint16.unwrap(asEuint16(a)), euint16.unwrap(b), false));\n }\n\n // Evaluate max(a, b) and return the result.\n function max(euint4 a, euint16 b) internal returns (euint16) {\n if (!isInitialized(a)) {\n a = asEuint4(0);\n }\n if (!isInitialized(b)) {\n b = asEuint16(0);\n }\n return euint16.wrap(Impl.max(euint16.unwrap(asEuint16(a)), euint16.unwrap(b), false));\n }\n\n // Evaluate add(a, b) and return the result.\n function add(euint4 a, euint32 b) internal returns (euint32) {\n if (!isInitialized(a)) {\n a = asEuint4(0);\n }\n if (!isInitialized(b)) {\n b = asEuint32(0);\n }\n return euint32.wrap(Impl.add(euint32.unwrap(asEuint32(a)), euint32.unwrap(b), false));\n }\n\n // Evaluate sub(a, b) and return the result.\n function sub(euint4 a, euint32 b) internal returns (euint32) {\n if (!isInitialized(a)) {\n a = asEuint4(0);\n }\n if (!isInitialized(b)) {\n b = asEuint32(0);\n }\n return euint32.wrap(Impl.sub(euint32.unwrap(asEuint32(a)), euint32.unwrap(b), false));\n }\n\n // Evaluate mul(a, b) and return the result.\n function mul(euint4 a, euint32 b) internal returns (euint32) {\n if (!isInitialized(a)) {\n a = asEuint4(0);\n }\n if (!isInitialized(b)) {\n b = asEuint32(0);\n }\n return euint32.wrap(Impl.mul(euint32.unwrap(asEuint32(a)), euint32.unwrap(b), false));\n }\n\n // Evaluate and(a, b) and return the result.\n function and(euint4 a, euint32 b) internal returns (euint32) {\n if (!isInitialized(a)) {\n a = asEuint4(0);\n }\n if (!isInitialized(b)) {\n b = asEuint32(0);\n }\n return euint32.wrap(Impl.and(euint32.unwrap(asEuint32(a)), euint32.unwrap(b)));\n }\n\n // Evaluate or(a, b) and return the result.\n function or(euint4 a, euint32 b) internal returns (euint32) {\n if (!isInitialized(a)) {\n a = asEuint4(0);\n }\n if (!isInitialized(b)) {\n b = asEuint32(0);\n }\n return euint32.wrap(Impl.or(euint32.unwrap(asEuint32(a)), euint32.unwrap(b)));\n }\n\n // Evaluate xor(a, b) and return the result.\n function xor(euint4 a, euint32 b) internal returns (euint32) {\n if (!isInitialized(a)) {\n a = asEuint4(0);\n }\n if (!isInitialized(b)) {\n b = asEuint32(0);\n }\n return euint32.wrap(Impl.xor(euint32.unwrap(asEuint32(a)), euint32.unwrap(b)));\n }\n\n // Evaluate eq(a, b) and return the result.\n function eq(euint4 a, euint32 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint4(0);\n }\n if (!isInitialized(b)) {\n b = asEuint32(0);\n }\n return ebool.wrap(Impl.eq(euint32.unwrap(asEuint32(a)), euint32.unwrap(b), false));\n }\n\n // Evaluate ne(a, b) and return the result.\n function ne(euint4 a, euint32 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint4(0);\n }\n if (!isInitialized(b)) {\n b = asEuint32(0);\n }\n return ebool.wrap(Impl.ne(euint32.unwrap(asEuint32(a)), euint32.unwrap(b), false));\n }\n\n // Evaluate ge(a, b) and return the result.\n function ge(euint4 a, euint32 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint4(0);\n }\n if (!isInitialized(b)) {\n b = asEuint32(0);\n }\n return ebool.wrap(Impl.ge(euint32.unwrap(asEuint32(a)), euint32.unwrap(b), false));\n }\n\n // Evaluate gt(a, b) and return the result.\n function gt(euint4 a, euint32 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint4(0);\n }\n if (!isInitialized(b)) {\n b = asEuint32(0);\n }\n return ebool.wrap(Impl.gt(euint32.unwrap(asEuint32(a)), euint32.unwrap(b), false));\n }\n\n // Evaluate le(a, b) and return the result.\n function le(euint4 a, euint32 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint4(0);\n }\n if (!isInitialized(b)) {\n b = asEuint32(0);\n }\n return ebool.wrap(Impl.le(euint32.unwrap(asEuint32(a)), euint32.unwrap(b), false));\n }\n\n // Evaluate lt(a, b) and return the result.\n function lt(euint4 a, euint32 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint4(0);\n }\n if (!isInitialized(b)) {\n b = asEuint32(0);\n }\n return ebool.wrap(Impl.lt(euint32.unwrap(asEuint32(a)), euint32.unwrap(b), false));\n }\n\n // Evaluate min(a, b) and return the result.\n function min(euint4 a, euint32 b) internal returns (euint32) {\n if (!isInitialized(a)) {\n a = asEuint4(0);\n }\n if (!isInitialized(b)) {\n b = asEuint32(0);\n }\n return euint32.wrap(Impl.min(euint32.unwrap(asEuint32(a)), euint32.unwrap(b), false));\n }\n\n // Evaluate max(a, b) and return the result.\n function max(euint4 a, euint32 b) internal returns (euint32) {\n if (!isInitialized(a)) {\n a = asEuint4(0);\n }\n if (!isInitialized(b)) {\n b = asEuint32(0);\n }\n return euint32.wrap(Impl.max(euint32.unwrap(asEuint32(a)), euint32.unwrap(b), false));\n }\n\n // Evaluate add(a, b) and return the result.\n function add(euint4 a, euint64 b) internal returns (euint64) {\n if (!isInitialized(a)) {\n a = asEuint4(0);\n }\n if (!isInitialized(b)) {\n b = asEuint64(0);\n }\n return euint64.wrap(Impl.add(euint64.unwrap(asEuint64(a)), euint64.unwrap(b), false));\n }\n\n // Evaluate sub(a, b) and return the result.\n function sub(euint4 a, euint64 b) internal returns (euint64) {\n if (!isInitialized(a)) {\n a = asEuint4(0);\n }\n if (!isInitialized(b)) {\n b = asEuint64(0);\n }\n return euint64.wrap(Impl.sub(euint64.unwrap(asEuint64(a)), euint64.unwrap(b), false));\n }\n\n // Evaluate mul(a, b) and return the result.\n function mul(euint4 a, euint64 b) internal returns (euint64) {\n if (!isInitialized(a)) {\n a = asEuint4(0);\n }\n if (!isInitialized(b)) {\n b = asEuint64(0);\n }\n return euint64.wrap(Impl.mul(euint64.unwrap(asEuint64(a)), euint64.unwrap(b), false));\n }\n\n // Evaluate and(a, b) and return the result.\n function and(euint4 a, euint64 b) internal returns (euint64) {\n if (!isInitialized(a)) {\n a = asEuint4(0);\n }\n if (!isInitialized(b)) {\n b = asEuint64(0);\n }\n return euint64.wrap(Impl.and(euint64.unwrap(asEuint64(a)), euint64.unwrap(b)));\n }\n\n // Evaluate or(a, b) and return the result.\n function or(euint4 a, euint64 b) internal returns (euint64) {\n if (!isInitialized(a)) {\n a = asEuint4(0);\n }\n if (!isInitialized(b)) {\n b = asEuint64(0);\n }\n return euint64.wrap(Impl.or(euint64.unwrap(asEuint64(a)), euint64.unwrap(b)));\n }\n\n // Evaluate xor(a, b) and return the result.\n function xor(euint4 a, euint64 b) internal returns (euint64) {\n if (!isInitialized(a)) {\n a = asEuint4(0);\n }\n if (!isInitialized(b)) {\n b = asEuint64(0);\n }\n return euint64.wrap(Impl.xor(euint64.unwrap(asEuint64(a)), euint64.unwrap(b)));\n }\n\n // Evaluate eq(a, b) and return the result.\n function eq(euint4 a, euint64 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint4(0);\n }\n if (!isInitialized(b)) {\n b = asEuint64(0);\n }\n return ebool.wrap(Impl.eq(euint64.unwrap(asEuint64(a)), euint64.unwrap(b), false));\n }\n\n // Evaluate ne(a, b) and return the result.\n function ne(euint4 a, euint64 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint4(0);\n }\n if (!isInitialized(b)) {\n b = asEuint64(0);\n }\n return ebool.wrap(Impl.ne(euint64.unwrap(asEuint64(a)), euint64.unwrap(b), false));\n }\n\n // Evaluate ge(a, b) and return the result.\n function ge(euint4 a, euint64 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint4(0);\n }\n if (!isInitialized(b)) {\n b = asEuint64(0);\n }\n return ebool.wrap(Impl.ge(euint64.unwrap(asEuint64(a)), euint64.unwrap(b), false));\n }\n\n // Evaluate gt(a, b) and return the result.\n function gt(euint4 a, euint64 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint4(0);\n }\n if (!isInitialized(b)) {\n b = asEuint64(0);\n }\n return ebool.wrap(Impl.gt(euint64.unwrap(asEuint64(a)), euint64.unwrap(b), false));\n }\n\n // Evaluate le(a, b) and return the result.\n function le(euint4 a, euint64 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint4(0);\n }\n if (!isInitialized(b)) {\n b = asEuint64(0);\n }\n return ebool.wrap(Impl.le(euint64.unwrap(asEuint64(a)), euint64.unwrap(b), false));\n }\n\n // Evaluate lt(a, b) and return the result.\n function lt(euint4 a, euint64 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint4(0);\n }\n if (!isInitialized(b)) {\n b = asEuint64(0);\n }\n return ebool.wrap(Impl.lt(euint64.unwrap(asEuint64(a)), euint64.unwrap(b), false));\n }\n\n // Evaluate min(a, b) and return the result.\n function min(euint4 a, euint64 b) internal returns (euint64) {\n if (!isInitialized(a)) {\n a = asEuint4(0);\n }\n if (!isInitialized(b)) {\n b = asEuint64(0);\n }\n return euint64.wrap(Impl.min(euint64.unwrap(asEuint64(a)), euint64.unwrap(b), false));\n }\n\n // Evaluate max(a, b) and return the result.\n function max(euint4 a, euint64 b) internal returns (euint64) {\n if (!isInitialized(a)) {\n a = asEuint4(0);\n }\n if (!isInitialized(b)) {\n b = asEuint64(0);\n }\n return euint64.wrap(Impl.max(euint64.unwrap(asEuint64(a)), euint64.unwrap(b), false));\n }\n\n // Evaluate add(a, b) and return the result.\n function add(euint4 a, uint8 b) internal returns (euint4) {\n if (!isInitialized(a)) {\n a = asEuint4(0);\n }\n return euint4.wrap(Impl.add(euint4.unwrap(a), uint256(b), true));\n }\n\n // Evaluate add(a, b) and return the result.\n function add(uint8 a, euint4 b) internal returns (euint4) {\n if (!isInitialized(b)) {\n b = asEuint4(0);\n }\n return euint4.wrap(Impl.add(euint4.unwrap(b), uint256(a), true));\n }\n\n // Evaluate sub(a, b) and return the result.\n function sub(euint4 a, uint8 b) internal returns (euint4) {\n if (!isInitialized(a)) {\n a = asEuint4(0);\n }\n return euint4.wrap(Impl.sub(euint4.unwrap(a), uint256(b), true));\n }\n\n // Evaluate sub(a, b) and return the result.\n function sub(uint8 a, euint4 b) internal returns (euint4) {\n euint4 aEnc = asEuint4(a);\n if (!isInitialized(b)) {\n b = asEuint4(0);\n }\n return euint4.wrap(Impl.sub(euint4.unwrap(aEnc), euint4.unwrap(b), false));\n }\n\n // Evaluate mul(a, b) and return the result.\n function mul(euint4 a, uint8 b) internal returns (euint4) {\n if (!isInitialized(a)) {\n a = asEuint4(0);\n }\n return euint4.wrap(Impl.mul(euint4.unwrap(a), uint256(b), true));\n }\n\n // Evaluate mul(a, b) and return the result.\n function mul(uint8 a, euint4 b) internal returns (euint4) {\n if (!isInitialized(b)) {\n b = asEuint4(0);\n }\n return euint4.wrap(Impl.mul(euint4.unwrap(b), uint256(a), true));\n }\n\n // Evaluate div(a, b) and return the result.\n function div(euint4 a, uint8 b) internal returns (euint4) {\n if (!isInitialized(a)) {\n a = asEuint4(0);\n }\n return euint4.wrap(Impl.div(euint4.unwrap(a), uint256(b)));\n }\n\n // Evaluate rem(a, b) and return the result.\n function rem(euint4 a, uint8 b) internal returns (euint4) {\n if (!isInitialized(a)) {\n a = asEuint4(0);\n }\n return euint4.wrap(Impl.rem(euint4.unwrap(a), uint256(b)));\n }\n\n // Evaluate eq(a, b) and return the result.\n function eq(euint4 a, uint8 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint4(0);\n }\n return ebool.wrap(Impl.eq(euint4.unwrap(a), uint256(b), true));\n }\n\n // Evaluate eq(a, b) and return the result.\n function eq(uint8 a, euint4 b) internal returns (ebool) {\n if (!isInitialized(b)) {\n b = asEuint4(0);\n }\n return ebool.wrap(Impl.eq(euint4.unwrap(b), uint256(a), true));\n }\n\n // Evaluate ne(a, b) and return the result.\n function ne(euint4 a, uint8 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint4(0);\n }\n return ebool.wrap(Impl.ne(euint4.unwrap(a), uint256(b), true));\n }\n\n // Evaluate ne(a, b) and return the result.\n function ne(uint8 a, euint4 b) internal returns (ebool) {\n if (!isInitialized(b)) {\n b = asEuint4(0);\n }\n return ebool.wrap(Impl.ne(euint4.unwrap(b), uint256(a), true));\n }\n\n // Evaluate ge(a, b) and return the result.\n function ge(euint4 a, uint8 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint4(0);\n }\n return ebool.wrap(Impl.ge(euint4.unwrap(a), uint256(b), true));\n }\n\n // Evaluate ge(a, b) and return the result.\n function ge(uint8 a, euint4 b) internal returns (ebool) {\n if (!isInitialized(b)) {\n b = asEuint4(0);\n }\n return ebool.wrap(Impl.le(euint4.unwrap(b), uint256(a), true));\n }\n\n // Evaluate gt(a, b) and return the result.\n function gt(euint4 a, uint8 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint4(0);\n }\n return ebool.wrap(Impl.gt(euint4.unwrap(a), uint256(b), true));\n }\n\n // Evaluate gt(a, b) and return the result.\n function gt(uint8 a, euint4 b) internal returns (ebool) {\n if (!isInitialized(b)) {\n b = asEuint4(0);\n }\n return ebool.wrap(Impl.lt(euint4.unwrap(b), uint256(a), true));\n }\n\n // Evaluate le(a, b) and return the result.\n function le(euint4 a, uint8 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint4(0);\n }\n return ebool.wrap(Impl.le(euint4.unwrap(a), uint256(b), true));\n }\n\n // Evaluate le(a, b) and return the result.\n function le(uint8 a, euint4 b) internal returns (ebool) {\n if (!isInitialized(b)) {\n b = asEuint4(0);\n }\n return ebool.wrap(Impl.ge(euint4.unwrap(b), uint256(a), true));\n }\n\n // Evaluate lt(a, b) and return the result.\n function lt(euint4 a, uint8 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint4(0);\n }\n return ebool.wrap(Impl.lt(euint4.unwrap(a), uint256(b), true));\n }\n\n // Evaluate lt(a, b) and return the result.\n function lt(uint8 a, euint4 b) internal returns (ebool) {\n if (!isInitialized(b)) {\n b = asEuint4(0);\n }\n return ebool.wrap(Impl.gt(euint4.unwrap(b), uint256(a), true));\n }\n\n // Evaluate min(a, b) and return the result.\n function min(euint4 a, uint8 b) internal returns (euint4) {\n if (!isInitialized(a)) {\n a = asEuint4(0);\n }\n return euint4.wrap(Impl.min(euint4.unwrap(a), uint256(b), true));\n }\n\n // Evaluate min(a, b) and return the result.\n function min(uint8 a, euint4 b) internal returns (euint4) {\n if (!isInitialized(b)) {\n b = asEuint4(0);\n }\n return euint4.wrap(Impl.min(euint4.unwrap(b), uint256(a), true));\n }\n\n // Evaluate max(a, b) and return the result.\n function max(euint4 a, uint8 b) internal returns (euint4) {\n if (!isInitialized(a)) {\n a = asEuint4(0);\n }\n return euint4.wrap(Impl.max(euint4.unwrap(a), uint256(b), true));\n }\n\n // Evaluate max(a, b) and return the result.\n function max(uint8 a, euint4 b) internal returns (euint4) {\n if (!isInitialized(b)) {\n b = asEuint4(0);\n }\n return euint4.wrap(Impl.max(euint4.unwrap(b), uint256(a), true));\n }\n\n // Evaluate add(a, b) and return the result.\n function add(euint8 a, euint4 b) internal returns (euint8) {\n if (!isInitialized(a)) {\n a = asEuint8(0);\n }\n if (!isInitialized(b)) {\n b = asEuint4(0);\n }\n return euint8.wrap(Impl.add(euint8.unwrap(a), euint8.unwrap(asEuint8(b)), false));\n }\n\n // Evaluate sub(a, b) and return the result.\n function sub(euint8 a, euint4 b) internal returns (euint8) {\n if (!isInitialized(a)) {\n a = asEuint8(0);\n }\n if (!isInitialized(b)) {\n b = asEuint4(0);\n }\n return euint8.wrap(Impl.sub(euint8.unwrap(a), euint8.unwrap(asEuint8(b)), false));\n }\n\n // Evaluate mul(a, b) and return the result.\n function mul(euint8 a, euint4 b) internal returns (euint8) {\n if (!isInitialized(a)) {\n a = asEuint8(0);\n }\n if (!isInitialized(b)) {\n b = asEuint4(0);\n }\n return euint8.wrap(Impl.mul(euint8.unwrap(a), euint8.unwrap(asEuint8(b)), false));\n }\n\n // Evaluate and(a, b) and return the result.\n function and(euint8 a, euint4 b) internal returns (euint8) {\n if (!isInitialized(a)) {\n a = asEuint8(0);\n }\n if (!isInitialized(b)) {\n b = asEuint4(0);\n }\n return euint8.wrap(Impl.and(euint8.unwrap(a), euint8.unwrap(asEuint8(b))));\n }\n\n // Evaluate or(a, b) and return the result.\n function or(euint8 a, euint4 b) internal returns (euint8) {\n if (!isInitialized(a)) {\n a = asEuint8(0);\n }\n if (!isInitialized(b)) {\n b = asEuint4(0);\n }\n return euint8.wrap(Impl.or(euint8.unwrap(a), euint8.unwrap(asEuint8(b))));\n }\n\n // Evaluate xor(a, b) and return the result.\n function xor(euint8 a, euint4 b) internal returns (euint8) {\n if (!isInitialized(a)) {\n a = asEuint8(0);\n }\n if (!isInitialized(b)) {\n b = asEuint4(0);\n }\n return euint8.wrap(Impl.xor(euint8.unwrap(a), euint8.unwrap(asEuint8(b))));\n }\n\n // Evaluate eq(a, b) and return the result.\n function eq(euint8 a, euint4 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint8(0);\n }\n if (!isInitialized(b)) {\n b = asEuint4(0);\n }\n return ebool.wrap(Impl.eq(euint8.unwrap(a), euint8.unwrap(asEuint8(b)), false));\n }\n\n // Evaluate ne(a, b) and return the result.\n function ne(euint8 a, euint4 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint8(0);\n }\n if (!isInitialized(b)) {\n b = asEuint4(0);\n }\n return ebool.wrap(Impl.ne(euint8.unwrap(a), euint8.unwrap(asEuint8(b)), false));\n }\n\n // Evaluate ge(a, b) and return the result.\n function ge(euint8 a, euint4 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint8(0);\n }\n if (!isInitialized(b)) {\n b = asEuint4(0);\n }\n return ebool.wrap(Impl.ge(euint8.unwrap(a), euint8.unwrap(asEuint8(b)), false));\n }\n\n // Evaluate gt(a, b) and return the result.\n function gt(euint8 a, euint4 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint8(0);\n }\n if (!isInitialized(b)) {\n b = asEuint4(0);\n }\n return ebool.wrap(Impl.gt(euint8.unwrap(a), euint8.unwrap(asEuint8(b)), false));\n }\n\n // Evaluate le(a, b) and return the result.\n function le(euint8 a, euint4 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint8(0);\n }\n if (!isInitialized(b)) {\n b = asEuint4(0);\n }\n return ebool.wrap(Impl.le(euint8.unwrap(a), euint8.unwrap(asEuint8(b)), false));\n }\n\n // Evaluate lt(a, b) and return the result.\n function lt(euint8 a, euint4 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint8(0);\n }\n if (!isInitialized(b)) {\n b = asEuint4(0);\n }\n return ebool.wrap(Impl.lt(euint8.unwrap(a), euint8.unwrap(asEuint8(b)), false));\n }\n\n // Evaluate min(a, b) and return the result.\n function min(euint8 a, euint4 b) internal returns (euint8) {\n if (!isInitialized(a)) {\n a = asEuint8(0);\n }\n if (!isInitialized(b)) {\n b = asEuint4(0);\n }\n return euint8.wrap(Impl.min(euint8.unwrap(a), euint8.unwrap(asEuint8(b)), false));\n }\n\n // Evaluate max(a, b) and return the result.\n function max(euint8 a, euint4 b) internal returns (euint8) {\n if (!isInitialized(a)) {\n a = asEuint8(0);\n }\n if (!isInitialized(b)) {\n b = asEuint4(0);\n }\n return euint8.wrap(Impl.max(euint8.unwrap(a), euint8.unwrap(asEuint8(b)), false));\n }\n\n // Evaluate add(a, b) and return the result.\n function add(euint8 a, euint8 b) internal returns (euint8) {\n if (!isInitialized(a)) {\n a = asEuint8(0);\n }\n if (!isInitialized(b)) {\n b = asEuint8(0);\n }\n return euint8.wrap(Impl.add(euint8.unwrap(a), euint8.unwrap(b), false));\n }\n\n // Evaluate sub(a, b) and return the result.\n function sub(euint8 a, euint8 b) internal returns (euint8) {\n if (!isInitialized(a)) {\n a = asEuint8(0);\n }\n if (!isInitialized(b)) {\n b = asEuint8(0);\n }\n return euint8.wrap(Impl.sub(euint8.unwrap(a), euint8.unwrap(b), false));\n }\n\n // Evaluate mul(a, b) and return the result.\n function mul(euint8 a, euint8 b) internal returns (euint8) {\n if (!isInitialized(a)) {\n a = asEuint8(0);\n }\n if (!isInitialized(b)) {\n b = asEuint8(0);\n }\n return euint8.wrap(Impl.mul(euint8.unwrap(a), euint8.unwrap(b), false));\n }\n\n // Evaluate and(a, b) and return the result.\n function and(euint8 a, euint8 b) internal returns (euint8) {\n if (!isInitialized(a)) {\n a = asEuint8(0);\n }\n if (!isInitialized(b)) {\n b = asEuint8(0);\n }\n return euint8.wrap(Impl.and(euint8.unwrap(a), euint8.unwrap(b)));\n }\n\n // Evaluate or(a, b) and return the result.\n function or(euint8 a, euint8 b) internal returns (euint8) {\n if (!isInitialized(a)) {\n a = asEuint8(0);\n }\n if (!isInitialized(b)) {\n b = asEuint8(0);\n }\n return euint8.wrap(Impl.or(euint8.unwrap(a), euint8.unwrap(b)));\n }\n\n // Evaluate xor(a, b) and return the result.\n function xor(euint8 a, euint8 b) internal returns (euint8) {\n if (!isInitialized(a)) {\n a = asEuint8(0);\n }\n if (!isInitialized(b)) {\n b = asEuint8(0);\n }\n return euint8.wrap(Impl.xor(euint8.unwrap(a), euint8.unwrap(b)));\n }\n\n // Evaluate eq(a, b) and return the result.\n function eq(euint8 a, euint8 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint8(0);\n }\n if (!isInitialized(b)) {\n b = asEuint8(0);\n }\n return ebool.wrap(Impl.eq(euint8.unwrap(a), euint8.unwrap(b), false));\n }\n\n // Evaluate ne(a, b) and return the result.\n function ne(euint8 a, euint8 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint8(0);\n }\n if (!isInitialized(b)) {\n b = asEuint8(0);\n }\n return ebool.wrap(Impl.ne(euint8.unwrap(a), euint8.unwrap(b), false));\n }\n\n // Evaluate ge(a, b) and return the result.\n function ge(euint8 a, euint8 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint8(0);\n }\n if (!isInitialized(b)) {\n b = asEuint8(0);\n }\n return ebool.wrap(Impl.ge(euint8.unwrap(a), euint8.unwrap(b), false));\n }\n\n // Evaluate gt(a, b) and return the result.\n function gt(euint8 a, euint8 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint8(0);\n }\n if (!isInitialized(b)) {\n b = asEuint8(0);\n }\n return ebool.wrap(Impl.gt(euint8.unwrap(a), euint8.unwrap(b), false));\n }\n\n // Evaluate le(a, b) and return the result.\n function le(euint8 a, euint8 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint8(0);\n }\n if (!isInitialized(b)) {\n b = asEuint8(0);\n }\n return ebool.wrap(Impl.le(euint8.unwrap(a), euint8.unwrap(b), false));\n }\n\n // Evaluate lt(a, b) and return the result.\n function lt(euint8 a, euint8 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint8(0);\n }\n if (!isInitialized(b)) {\n b = asEuint8(0);\n }\n return ebool.wrap(Impl.lt(euint8.unwrap(a), euint8.unwrap(b), false));\n }\n\n // Evaluate min(a, b) and return the result.\n function min(euint8 a, euint8 b) internal returns (euint8) {\n if (!isInitialized(a)) {\n a = asEuint8(0);\n }\n if (!isInitialized(b)) {\n b = asEuint8(0);\n }\n return euint8.wrap(Impl.min(euint8.unwrap(a), euint8.unwrap(b), false));\n }\n\n // Evaluate max(a, b) and return the result.\n function max(euint8 a, euint8 b) internal returns (euint8) {\n if (!isInitialized(a)) {\n a = asEuint8(0);\n }\n if (!isInitialized(b)) {\n b = asEuint8(0);\n }\n return euint8.wrap(Impl.max(euint8.unwrap(a), euint8.unwrap(b), false));\n }\n\n // Evaluate add(a, b) and return the result.\n function add(euint8 a, euint16 b) internal returns (euint16) {\n if (!isInitialized(a)) {\n a = asEuint8(0);\n }\n if (!isInitialized(b)) {\n b = asEuint16(0);\n }\n return euint16.wrap(Impl.add(euint16.unwrap(asEuint16(a)), euint16.unwrap(b), false));\n }\n\n // Evaluate sub(a, b) and return the result.\n function sub(euint8 a, euint16 b) internal returns (euint16) {\n if (!isInitialized(a)) {\n a = asEuint8(0);\n }\n if (!isInitialized(b)) {\n b = asEuint16(0);\n }\n return euint16.wrap(Impl.sub(euint16.unwrap(asEuint16(a)), euint16.unwrap(b), false));\n }\n\n // Evaluate mul(a, b) and return the result.\n function mul(euint8 a, euint16 b) internal returns (euint16) {\n if (!isInitialized(a)) {\n a = asEuint8(0);\n }\n if (!isInitialized(b)) {\n b = asEuint16(0);\n }\n return euint16.wrap(Impl.mul(euint16.unwrap(asEuint16(a)), euint16.unwrap(b), false));\n }\n\n // Evaluate and(a, b) and return the result.\n function and(euint8 a, euint16 b) internal returns (euint16) {\n if (!isInitialized(a)) {\n a = asEuint8(0);\n }\n if (!isInitialized(b)) {\n b = asEuint16(0);\n }\n return euint16.wrap(Impl.and(euint16.unwrap(asEuint16(a)), euint16.unwrap(b)));\n }\n\n // Evaluate or(a, b) and return the result.\n function or(euint8 a, euint16 b) internal returns (euint16) {\n if (!isInitialized(a)) {\n a = asEuint8(0);\n }\n if (!isInitialized(b)) {\n b = asEuint16(0);\n }\n return euint16.wrap(Impl.or(euint16.unwrap(asEuint16(a)), euint16.unwrap(b)));\n }\n\n // Evaluate xor(a, b) and return the result.\n function xor(euint8 a, euint16 b) internal returns (euint16) {\n if (!isInitialized(a)) {\n a = asEuint8(0);\n }\n if (!isInitialized(b)) {\n b = asEuint16(0);\n }\n return euint16.wrap(Impl.xor(euint16.unwrap(asEuint16(a)), euint16.unwrap(b)));\n }\n\n // Evaluate eq(a, b) and return the result.\n function eq(euint8 a, euint16 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint8(0);\n }\n if (!isInitialized(b)) {\n b = asEuint16(0);\n }\n return ebool.wrap(Impl.eq(euint16.unwrap(asEuint16(a)), euint16.unwrap(b), false));\n }\n\n // Evaluate ne(a, b) and return the result.\n function ne(euint8 a, euint16 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint8(0);\n }\n if (!isInitialized(b)) {\n b = asEuint16(0);\n }\n return ebool.wrap(Impl.ne(euint16.unwrap(asEuint16(a)), euint16.unwrap(b), false));\n }\n\n // Evaluate ge(a, b) and return the result.\n function ge(euint8 a, euint16 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint8(0);\n }\n if (!isInitialized(b)) {\n b = asEuint16(0);\n }\n return ebool.wrap(Impl.ge(euint16.unwrap(asEuint16(a)), euint16.unwrap(b), false));\n }\n\n // Evaluate gt(a, b) and return the result.\n function gt(euint8 a, euint16 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint8(0);\n }\n if (!isInitialized(b)) {\n b = asEuint16(0);\n }\n return ebool.wrap(Impl.gt(euint16.unwrap(asEuint16(a)), euint16.unwrap(b), false));\n }\n\n // Evaluate le(a, b) and return the result.\n function le(euint8 a, euint16 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint8(0);\n }\n if (!isInitialized(b)) {\n b = asEuint16(0);\n }\n return ebool.wrap(Impl.le(euint16.unwrap(asEuint16(a)), euint16.unwrap(b), false));\n }\n\n // Evaluate lt(a, b) and return the result.\n function lt(euint8 a, euint16 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint8(0);\n }\n if (!isInitialized(b)) {\n b = asEuint16(0);\n }\n return ebool.wrap(Impl.lt(euint16.unwrap(asEuint16(a)), euint16.unwrap(b), false));\n }\n\n // Evaluate min(a, b) and return the result.\n function min(euint8 a, euint16 b) internal returns (euint16) {\n if (!isInitialized(a)) {\n a = asEuint8(0);\n }\n if (!isInitialized(b)) {\n b = asEuint16(0);\n }\n return euint16.wrap(Impl.min(euint16.unwrap(asEuint16(a)), euint16.unwrap(b), false));\n }\n\n // Evaluate max(a, b) and return the result.\n function max(euint8 a, euint16 b) internal returns (euint16) {\n if (!isInitialized(a)) {\n a = asEuint8(0);\n }\n if (!isInitialized(b)) {\n b = asEuint16(0);\n }\n return euint16.wrap(Impl.max(euint16.unwrap(asEuint16(a)), euint16.unwrap(b), false));\n }\n\n // Evaluate add(a, b) and return the result.\n function add(euint8 a, euint32 b) internal returns (euint32) {\n if (!isInitialized(a)) {\n a = asEuint8(0);\n }\n if (!isInitialized(b)) {\n b = asEuint32(0);\n }\n return euint32.wrap(Impl.add(euint32.unwrap(asEuint32(a)), euint32.unwrap(b), false));\n }\n\n // Evaluate sub(a, b) and return the result.\n function sub(euint8 a, euint32 b) internal returns (euint32) {\n if (!isInitialized(a)) {\n a = asEuint8(0);\n }\n if (!isInitialized(b)) {\n b = asEuint32(0);\n }\n return euint32.wrap(Impl.sub(euint32.unwrap(asEuint32(a)), euint32.unwrap(b), false));\n }\n\n // Evaluate mul(a, b) and return the result.\n function mul(euint8 a, euint32 b) internal returns (euint32) {\n if (!isInitialized(a)) {\n a = asEuint8(0);\n }\n if (!isInitialized(b)) {\n b = asEuint32(0);\n }\n return euint32.wrap(Impl.mul(euint32.unwrap(asEuint32(a)), euint32.unwrap(b), false));\n }\n\n // Evaluate and(a, b) and return the result.\n function and(euint8 a, euint32 b) internal returns (euint32) {\n if (!isInitialized(a)) {\n a = asEuint8(0);\n }\n if (!isInitialized(b)) {\n b = asEuint32(0);\n }\n return euint32.wrap(Impl.and(euint32.unwrap(asEuint32(a)), euint32.unwrap(b)));\n }\n\n // Evaluate or(a, b) and return the result.\n function or(euint8 a, euint32 b) internal returns (euint32) {\n if (!isInitialized(a)) {\n a = asEuint8(0);\n }\n if (!isInitialized(b)) {\n b = asEuint32(0);\n }\n return euint32.wrap(Impl.or(euint32.unwrap(asEuint32(a)), euint32.unwrap(b)));\n }\n\n // Evaluate xor(a, b) and return the result.\n function xor(euint8 a, euint32 b) internal returns (euint32) {\n if (!isInitialized(a)) {\n a = asEuint8(0);\n }\n if (!isInitialized(b)) {\n b = asEuint32(0);\n }\n return euint32.wrap(Impl.xor(euint32.unwrap(asEuint32(a)), euint32.unwrap(b)));\n }\n\n // Evaluate eq(a, b) and return the result.\n function eq(euint8 a, euint32 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint8(0);\n }\n if (!isInitialized(b)) {\n b = asEuint32(0);\n }\n return ebool.wrap(Impl.eq(euint32.unwrap(asEuint32(a)), euint32.unwrap(b), false));\n }\n\n // Evaluate ne(a, b) and return the result.\n function ne(euint8 a, euint32 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint8(0);\n }\n if (!isInitialized(b)) {\n b = asEuint32(0);\n }\n return ebool.wrap(Impl.ne(euint32.unwrap(asEuint32(a)), euint32.unwrap(b), false));\n }\n\n // Evaluate ge(a, b) and return the result.\n function ge(euint8 a, euint32 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint8(0);\n }\n if (!isInitialized(b)) {\n b = asEuint32(0);\n }\n return ebool.wrap(Impl.ge(euint32.unwrap(asEuint32(a)), euint32.unwrap(b), false));\n }\n\n // Evaluate gt(a, b) and return the result.\n function gt(euint8 a, euint32 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint8(0);\n }\n if (!isInitialized(b)) {\n b = asEuint32(0);\n }\n return ebool.wrap(Impl.gt(euint32.unwrap(asEuint32(a)), euint32.unwrap(b), false));\n }\n\n // Evaluate le(a, b) and return the result.\n function le(euint8 a, euint32 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint8(0);\n }\n if (!isInitialized(b)) {\n b = asEuint32(0);\n }\n return ebool.wrap(Impl.le(euint32.unwrap(asEuint32(a)), euint32.unwrap(b), false));\n }\n\n // Evaluate lt(a, b) and return the result.\n function lt(euint8 a, euint32 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint8(0);\n }\n if (!isInitialized(b)) {\n b = asEuint32(0);\n }\n return ebool.wrap(Impl.lt(euint32.unwrap(asEuint32(a)), euint32.unwrap(b), false));\n }\n\n // Evaluate min(a, b) and return the result.\n function min(euint8 a, euint32 b) internal returns (euint32) {\n if (!isInitialized(a)) {\n a = asEuint8(0);\n }\n if (!isInitialized(b)) {\n b = asEuint32(0);\n }\n return euint32.wrap(Impl.min(euint32.unwrap(asEuint32(a)), euint32.unwrap(b), false));\n }\n\n // Evaluate max(a, b) and return the result.\n function max(euint8 a, euint32 b) internal returns (euint32) {\n if (!isInitialized(a)) {\n a = asEuint8(0);\n }\n if (!isInitialized(b)) {\n b = asEuint32(0);\n }\n return euint32.wrap(Impl.max(euint32.unwrap(asEuint32(a)), euint32.unwrap(b), false));\n }\n\n // Evaluate add(a, b) and return the result.\n function add(euint8 a, euint64 b) internal returns (euint64) {\n if (!isInitialized(a)) {\n a = asEuint8(0);\n }\n if (!isInitialized(b)) {\n b = asEuint64(0);\n }\n return euint64.wrap(Impl.add(euint64.unwrap(asEuint64(a)), euint64.unwrap(b), false));\n }\n\n // Evaluate sub(a, b) and return the result.\n function sub(euint8 a, euint64 b) internal returns (euint64) {\n if (!isInitialized(a)) {\n a = asEuint8(0);\n }\n if (!isInitialized(b)) {\n b = asEuint64(0);\n }\n return euint64.wrap(Impl.sub(euint64.unwrap(asEuint64(a)), euint64.unwrap(b), false));\n }\n\n // Evaluate mul(a, b) and return the result.\n function mul(euint8 a, euint64 b) internal returns (euint64) {\n if (!isInitialized(a)) {\n a = asEuint8(0);\n }\n if (!isInitialized(b)) {\n b = asEuint64(0);\n }\n return euint64.wrap(Impl.mul(euint64.unwrap(asEuint64(a)), euint64.unwrap(b), false));\n }\n\n // Evaluate and(a, b) and return the result.\n function and(euint8 a, euint64 b) internal returns (euint64) {\n if (!isInitialized(a)) {\n a = asEuint8(0);\n }\n if (!isInitialized(b)) {\n b = asEuint64(0);\n }\n return euint64.wrap(Impl.and(euint64.unwrap(asEuint64(a)), euint64.unwrap(b)));\n }\n\n // Evaluate or(a, b) and return the result.\n function or(euint8 a, euint64 b) internal returns (euint64) {\n if (!isInitialized(a)) {\n a = asEuint8(0);\n }\n if (!isInitialized(b)) {\n b = asEuint64(0);\n }\n return euint64.wrap(Impl.or(euint64.unwrap(asEuint64(a)), euint64.unwrap(b)));\n }\n\n // Evaluate xor(a, b) and return the result.\n function xor(euint8 a, euint64 b) internal returns (euint64) {\n if (!isInitialized(a)) {\n a = asEuint8(0);\n }\n if (!isInitialized(b)) {\n b = asEuint64(0);\n }\n return euint64.wrap(Impl.xor(euint64.unwrap(asEuint64(a)), euint64.unwrap(b)));\n }\n\n // Evaluate eq(a, b) and return the result.\n function eq(euint8 a, euint64 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint8(0);\n }\n if (!isInitialized(b)) {\n b = asEuint64(0);\n }\n return ebool.wrap(Impl.eq(euint64.unwrap(asEuint64(a)), euint64.unwrap(b), false));\n }\n\n // Evaluate ne(a, b) and return the result.\n function ne(euint8 a, euint64 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint8(0);\n }\n if (!isInitialized(b)) {\n b = asEuint64(0);\n }\n return ebool.wrap(Impl.ne(euint64.unwrap(asEuint64(a)), euint64.unwrap(b), false));\n }\n\n // Evaluate ge(a, b) and return the result.\n function ge(euint8 a, euint64 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint8(0);\n }\n if (!isInitialized(b)) {\n b = asEuint64(0);\n }\n return ebool.wrap(Impl.ge(euint64.unwrap(asEuint64(a)), euint64.unwrap(b), false));\n }\n\n // Evaluate gt(a, b) and return the result.\n function gt(euint8 a, euint64 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint8(0);\n }\n if (!isInitialized(b)) {\n b = asEuint64(0);\n }\n return ebool.wrap(Impl.gt(euint64.unwrap(asEuint64(a)), euint64.unwrap(b), false));\n }\n\n // Evaluate le(a, b) and return the result.\n function le(euint8 a, euint64 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint8(0);\n }\n if (!isInitialized(b)) {\n b = asEuint64(0);\n }\n return ebool.wrap(Impl.le(euint64.unwrap(asEuint64(a)), euint64.unwrap(b), false));\n }\n\n // Evaluate lt(a, b) and return the result.\n function lt(euint8 a, euint64 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint8(0);\n }\n if (!isInitialized(b)) {\n b = asEuint64(0);\n }\n return ebool.wrap(Impl.lt(euint64.unwrap(asEuint64(a)), euint64.unwrap(b), false));\n }\n\n // Evaluate min(a, b) and return the result.\n function min(euint8 a, euint64 b) internal returns (euint64) {\n if (!isInitialized(a)) {\n a = asEuint8(0);\n }\n if (!isInitialized(b)) {\n b = asEuint64(0);\n }\n return euint64.wrap(Impl.min(euint64.unwrap(asEuint64(a)), euint64.unwrap(b), false));\n }\n\n // Evaluate max(a, b) and return the result.\n function max(euint8 a, euint64 b) internal returns (euint64) {\n if (!isInitialized(a)) {\n a = asEuint8(0);\n }\n if (!isInitialized(b)) {\n b = asEuint64(0);\n }\n return euint64.wrap(Impl.max(euint64.unwrap(asEuint64(a)), euint64.unwrap(b), false));\n }\n\n // Evaluate add(a, b) and return the result.\n function add(euint8 a, uint8 b) internal returns (euint8) {\n if (!isInitialized(a)) {\n a = asEuint8(0);\n }\n return euint8.wrap(Impl.add(euint8.unwrap(a), uint256(b), true));\n }\n\n // Evaluate add(a, b) and return the result.\n function add(uint8 a, euint8 b) internal returns (euint8) {\n if (!isInitialized(b)) {\n b = asEuint8(0);\n }\n return euint8.wrap(Impl.add(euint8.unwrap(b), uint256(a), true));\n }\n\n // Evaluate sub(a, b) and return the result.\n function sub(euint8 a, uint8 b) internal returns (euint8) {\n if (!isInitialized(a)) {\n a = asEuint8(0);\n }\n return euint8.wrap(Impl.sub(euint8.unwrap(a), uint256(b), true));\n }\n\n // Evaluate sub(a, b) and return the result.\n function sub(uint8 a, euint8 b) internal returns (euint8) {\n euint8 aEnc = asEuint8(a);\n if (!isInitialized(b)) {\n b = asEuint8(0);\n }\n return euint8.wrap(Impl.sub(euint8.unwrap(aEnc), euint8.unwrap(b), false));\n }\n\n // Evaluate mul(a, b) and return the result.\n function mul(euint8 a, uint8 b) internal returns (euint8) {\n if (!isInitialized(a)) {\n a = asEuint8(0);\n }\n return euint8.wrap(Impl.mul(euint8.unwrap(a), uint256(b), true));\n }\n\n // Evaluate mul(a, b) and return the result.\n function mul(uint8 a, euint8 b) internal returns (euint8) {\n if (!isInitialized(b)) {\n b = asEuint8(0);\n }\n return euint8.wrap(Impl.mul(euint8.unwrap(b), uint256(a), true));\n }\n\n // Evaluate div(a, b) and return the result.\n function div(euint8 a, uint8 b) internal returns (euint8) {\n if (!isInitialized(a)) {\n a = asEuint8(0);\n }\n return euint8.wrap(Impl.div(euint8.unwrap(a), uint256(b)));\n }\n\n // Evaluate rem(a, b) and return the result.\n function rem(euint8 a, uint8 b) internal returns (euint8) {\n if (!isInitialized(a)) {\n a = asEuint8(0);\n }\n return euint8.wrap(Impl.rem(euint8.unwrap(a), uint256(b)));\n }\n\n // Evaluate eq(a, b) and return the result.\n function eq(euint8 a, uint8 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint8(0);\n }\n return ebool.wrap(Impl.eq(euint8.unwrap(a), uint256(b), true));\n }\n\n // Evaluate eq(a, b) and return the result.\n function eq(uint8 a, euint8 b) internal returns (ebool) {\n if (!isInitialized(b)) {\n b = asEuint8(0);\n }\n return ebool.wrap(Impl.eq(euint8.unwrap(b), uint256(a), true));\n }\n\n // Evaluate ne(a, b) and return the result.\n function ne(euint8 a, uint8 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint8(0);\n }\n return ebool.wrap(Impl.ne(euint8.unwrap(a), uint256(b), true));\n }\n\n // Evaluate ne(a, b) and return the result.\n function ne(uint8 a, euint8 b) internal returns (ebool) {\n if (!isInitialized(b)) {\n b = asEuint8(0);\n }\n return ebool.wrap(Impl.ne(euint8.unwrap(b), uint256(a), true));\n }\n\n // Evaluate ge(a, b) and return the result.\n function ge(euint8 a, uint8 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint8(0);\n }\n return ebool.wrap(Impl.ge(euint8.unwrap(a), uint256(b), true));\n }\n\n // Evaluate ge(a, b) and return the result.\n function ge(uint8 a, euint8 b) internal returns (ebool) {\n if (!isInitialized(b)) {\n b = asEuint8(0);\n }\n return ebool.wrap(Impl.le(euint8.unwrap(b), uint256(a), true));\n }\n\n // Evaluate gt(a, b) and return the result.\n function gt(euint8 a, uint8 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint8(0);\n }\n return ebool.wrap(Impl.gt(euint8.unwrap(a), uint256(b), true));\n }\n\n // Evaluate gt(a, b) and return the result.\n function gt(uint8 a, euint8 b) internal returns (ebool) {\n if (!isInitialized(b)) {\n b = asEuint8(0);\n }\n return ebool.wrap(Impl.lt(euint8.unwrap(b), uint256(a), true));\n }\n\n // Evaluate le(a, b) and return the result.\n function le(euint8 a, uint8 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint8(0);\n }\n return ebool.wrap(Impl.le(euint8.unwrap(a), uint256(b), true));\n }\n\n // Evaluate le(a, b) and return the result.\n function le(uint8 a, euint8 b) internal returns (ebool) {\n if (!isInitialized(b)) {\n b = asEuint8(0);\n }\n return ebool.wrap(Impl.ge(euint8.unwrap(b), uint256(a), true));\n }\n\n // Evaluate lt(a, b) and return the result.\n function lt(euint8 a, uint8 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint8(0);\n }\n return ebool.wrap(Impl.lt(euint8.unwrap(a), uint256(b), true));\n }\n\n // Evaluate lt(a, b) and return the result.\n function lt(uint8 a, euint8 b) internal returns (ebool) {\n if (!isInitialized(b)) {\n b = asEuint8(0);\n }\n return ebool.wrap(Impl.gt(euint8.unwrap(b), uint256(a), true));\n }\n\n // Evaluate min(a, b) and return the result.\n function min(euint8 a, uint8 b) internal returns (euint8) {\n if (!isInitialized(a)) {\n a = asEuint8(0);\n }\n return euint8.wrap(Impl.min(euint8.unwrap(a), uint256(b), true));\n }\n\n // Evaluate min(a, b) and return the result.\n function min(uint8 a, euint8 b) internal returns (euint8) {\n if (!isInitialized(b)) {\n b = asEuint8(0);\n }\n return euint8.wrap(Impl.min(euint8.unwrap(b), uint256(a), true));\n }\n\n // Evaluate max(a, b) and return the result.\n function max(euint8 a, uint8 b) internal returns (euint8) {\n if (!isInitialized(a)) {\n a = asEuint8(0);\n }\n return euint8.wrap(Impl.max(euint8.unwrap(a), uint256(b), true));\n }\n\n // Evaluate max(a, b) and return the result.\n function max(uint8 a, euint8 b) internal returns (euint8) {\n if (!isInitialized(b)) {\n b = asEuint8(0);\n }\n return euint8.wrap(Impl.max(euint8.unwrap(b), uint256(a), true));\n }\n\n // Evaluate add(a, b) and return the result.\n function add(euint16 a, euint4 b) internal returns (euint16) {\n if (!isInitialized(a)) {\n a = asEuint16(0);\n }\n if (!isInitialized(b)) {\n b = asEuint4(0);\n }\n return euint16.wrap(Impl.add(euint16.unwrap(a), euint16.unwrap(asEuint16(b)), false));\n }\n\n // Evaluate sub(a, b) and return the result.\n function sub(euint16 a, euint4 b) internal returns (euint16) {\n if (!isInitialized(a)) {\n a = asEuint16(0);\n }\n if (!isInitialized(b)) {\n b = asEuint4(0);\n }\n return euint16.wrap(Impl.sub(euint16.unwrap(a), euint16.unwrap(asEuint16(b)), false));\n }\n\n // Evaluate mul(a, b) and return the result.\n function mul(euint16 a, euint4 b) internal returns (euint16) {\n if (!isInitialized(a)) {\n a = asEuint16(0);\n }\n if (!isInitialized(b)) {\n b = asEuint4(0);\n }\n return euint16.wrap(Impl.mul(euint16.unwrap(a), euint16.unwrap(asEuint16(b)), false));\n }\n\n // Evaluate and(a, b) and return the result.\n function and(euint16 a, euint4 b) internal returns (euint16) {\n if (!isInitialized(a)) {\n a = asEuint16(0);\n }\n if (!isInitialized(b)) {\n b = asEuint4(0);\n }\n return euint16.wrap(Impl.and(euint16.unwrap(a), euint16.unwrap(asEuint16(b))));\n }\n\n // Evaluate or(a, b) and return the result.\n function or(euint16 a, euint4 b) internal returns (euint16) {\n if (!isInitialized(a)) {\n a = asEuint16(0);\n }\n if (!isInitialized(b)) {\n b = asEuint4(0);\n }\n return euint16.wrap(Impl.or(euint16.unwrap(a), euint16.unwrap(asEuint16(b))));\n }\n\n // Evaluate xor(a, b) and return the result.\n function xor(euint16 a, euint4 b) internal returns (euint16) {\n if (!isInitialized(a)) {\n a = asEuint16(0);\n }\n if (!isInitialized(b)) {\n b = asEuint4(0);\n }\n return euint16.wrap(Impl.xor(euint16.unwrap(a), euint16.unwrap(asEuint16(b))));\n }\n\n // Evaluate eq(a, b) and return the result.\n function eq(euint16 a, euint4 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint16(0);\n }\n if (!isInitialized(b)) {\n b = asEuint4(0);\n }\n return ebool.wrap(Impl.eq(euint16.unwrap(a), euint16.unwrap(asEuint16(b)), false));\n }\n\n // Evaluate ne(a, b) and return the result.\n function ne(euint16 a, euint4 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint16(0);\n }\n if (!isInitialized(b)) {\n b = asEuint4(0);\n }\n return ebool.wrap(Impl.ne(euint16.unwrap(a), euint16.unwrap(asEuint16(b)), false));\n }\n\n // Evaluate ge(a, b) and return the result.\n function ge(euint16 a, euint4 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint16(0);\n }\n if (!isInitialized(b)) {\n b = asEuint4(0);\n }\n return ebool.wrap(Impl.ge(euint16.unwrap(a), euint16.unwrap(asEuint16(b)), false));\n }\n\n // Evaluate gt(a, b) and return the result.\n function gt(euint16 a, euint4 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint16(0);\n }\n if (!isInitialized(b)) {\n b = asEuint4(0);\n }\n return ebool.wrap(Impl.gt(euint16.unwrap(a), euint16.unwrap(asEuint16(b)), false));\n }\n\n // Evaluate le(a, b) and return the result.\n function le(euint16 a, euint4 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint16(0);\n }\n if (!isInitialized(b)) {\n b = asEuint4(0);\n }\n return ebool.wrap(Impl.le(euint16.unwrap(a), euint16.unwrap(asEuint16(b)), false));\n }\n\n // Evaluate lt(a, b) and return the result.\n function lt(euint16 a, euint4 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint16(0);\n }\n if (!isInitialized(b)) {\n b = asEuint4(0);\n }\n return ebool.wrap(Impl.lt(euint16.unwrap(a), euint16.unwrap(asEuint16(b)), false));\n }\n\n // Evaluate min(a, b) and return the result.\n function min(euint16 a, euint4 b) internal returns (euint16) {\n if (!isInitialized(a)) {\n a = asEuint16(0);\n }\n if (!isInitialized(b)) {\n b = asEuint4(0);\n }\n return euint16.wrap(Impl.min(euint16.unwrap(a), euint16.unwrap(asEuint16(b)), false));\n }\n\n // Evaluate max(a, b) and return the result.\n function max(euint16 a, euint4 b) internal returns (euint16) {\n if (!isInitialized(a)) {\n a = asEuint16(0);\n }\n if (!isInitialized(b)) {\n b = asEuint4(0);\n }\n return euint16.wrap(Impl.max(euint16.unwrap(a), euint16.unwrap(asEuint16(b)), false));\n }\n\n // Evaluate add(a, b) and return the result.\n function add(euint16 a, euint8 b) internal returns (euint16) {\n if (!isInitialized(a)) {\n a = asEuint16(0);\n }\n if (!isInitialized(b)) {\n b = asEuint8(0);\n }\n return euint16.wrap(Impl.add(euint16.unwrap(a), euint16.unwrap(asEuint16(b)), false));\n }\n\n // Evaluate sub(a, b) and return the result.\n function sub(euint16 a, euint8 b) internal returns (euint16) {\n if (!isInitialized(a)) {\n a = asEuint16(0);\n }\n if (!isInitialized(b)) {\n b = asEuint8(0);\n }\n return euint16.wrap(Impl.sub(euint16.unwrap(a), euint16.unwrap(asEuint16(b)), false));\n }\n\n // Evaluate mul(a, b) and return the result.\n function mul(euint16 a, euint8 b) internal returns (euint16) {\n if (!isInitialized(a)) {\n a = asEuint16(0);\n }\n if (!isInitialized(b)) {\n b = asEuint8(0);\n }\n return euint16.wrap(Impl.mul(euint16.unwrap(a), euint16.unwrap(asEuint16(b)), false));\n }\n\n // Evaluate and(a, b) and return the result.\n function and(euint16 a, euint8 b) internal returns (euint16) {\n if (!isInitialized(a)) {\n a = asEuint16(0);\n }\n if (!isInitialized(b)) {\n b = asEuint8(0);\n }\n return euint16.wrap(Impl.and(euint16.unwrap(a), euint16.unwrap(asEuint16(b))));\n }\n\n // Evaluate or(a, b) and return the result.\n function or(euint16 a, euint8 b) internal returns (euint16) {\n if (!isInitialized(a)) {\n a = asEuint16(0);\n }\n if (!isInitialized(b)) {\n b = asEuint8(0);\n }\n return euint16.wrap(Impl.or(euint16.unwrap(a), euint16.unwrap(asEuint16(b))));\n }\n\n // Evaluate xor(a, b) and return the result.\n function xor(euint16 a, euint8 b) internal returns (euint16) {\n if (!isInitialized(a)) {\n a = asEuint16(0);\n }\n if (!isInitialized(b)) {\n b = asEuint8(0);\n }\n return euint16.wrap(Impl.xor(euint16.unwrap(a), euint16.unwrap(asEuint16(b))));\n }\n\n // Evaluate eq(a, b) and return the result.\n function eq(euint16 a, euint8 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint16(0);\n }\n if (!isInitialized(b)) {\n b = asEuint8(0);\n }\n return ebool.wrap(Impl.eq(euint16.unwrap(a), euint16.unwrap(asEuint16(b)), false));\n }\n\n // Evaluate ne(a, b) and return the result.\n function ne(euint16 a, euint8 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint16(0);\n }\n if (!isInitialized(b)) {\n b = asEuint8(0);\n }\n return ebool.wrap(Impl.ne(euint16.unwrap(a), euint16.unwrap(asEuint16(b)), false));\n }\n\n // Evaluate ge(a, b) and return the result.\n function ge(euint16 a, euint8 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint16(0);\n }\n if (!isInitialized(b)) {\n b = asEuint8(0);\n }\n return ebool.wrap(Impl.ge(euint16.unwrap(a), euint16.unwrap(asEuint16(b)), false));\n }\n\n // Evaluate gt(a, b) and return the result.\n function gt(euint16 a, euint8 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint16(0);\n }\n if (!isInitialized(b)) {\n b = asEuint8(0);\n }\n return ebool.wrap(Impl.gt(euint16.unwrap(a), euint16.unwrap(asEuint16(b)), false));\n }\n\n // Evaluate le(a, b) and return the result.\n function le(euint16 a, euint8 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint16(0);\n }\n if (!isInitialized(b)) {\n b = asEuint8(0);\n }\n return ebool.wrap(Impl.le(euint16.unwrap(a), euint16.unwrap(asEuint16(b)), false));\n }\n\n // Evaluate lt(a, b) and return the result.\n function lt(euint16 a, euint8 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint16(0);\n }\n if (!isInitialized(b)) {\n b = asEuint8(0);\n }\n return ebool.wrap(Impl.lt(euint16.unwrap(a), euint16.unwrap(asEuint16(b)), false));\n }\n\n // Evaluate min(a, b) and return the result.\n function min(euint16 a, euint8 b) internal returns (euint16) {\n if (!isInitialized(a)) {\n a = asEuint16(0);\n }\n if (!isInitialized(b)) {\n b = asEuint8(0);\n }\n return euint16.wrap(Impl.min(euint16.unwrap(a), euint16.unwrap(asEuint16(b)), false));\n }\n\n // Evaluate max(a, b) and return the result.\n function max(euint16 a, euint8 b) internal returns (euint16) {\n if (!isInitialized(a)) {\n a = asEuint16(0);\n }\n if (!isInitialized(b)) {\n b = asEuint8(0);\n }\n return euint16.wrap(Impl.max(euint16.unwrap(a), euint16.unwrap(asEuint16(b)), false));\n }\n\n // Evaluate add(a, b) and return the result.\n function add(euint16 a, euint16 b) internal returns (euint16) {\n if (!isInitialized(a)) {\n a = asEuint16(0);\n }\n if (!isInitialized(b)) {\n b = asEuint16(0);\n }\n return euint16.wrap(Impl.add(euint16.unwrap(a), euint16.unwrap(b), false));\n }\n\n // Evaluate sub(a, b) and return the result.\n function sub(euint16 a, euint16 b) internal returns (euint16) {\n if (!isInitialized(a)) {\n a = asEuint16(0);\n }\n if (!isInitialized(b)) {\n b = asEuint16(0);\n }\n return euint16.wrap(Impl.sub(euint16.unwrap(a), euint16.unwrap(b), false));\n }\n\n // Evaluate mul(a, b) and return the result.\n function mul(euint16 a, euint16 b) internal returns (euint16) {\n if (!isInitialized(a)) {\n a = asEuint16(0);\n }\n if (!isInitialized(b)) {\n b = asEuint16(0);\n }\n return euint16.wrap(Impl.mul(euint16.unwrap(a), euint16.unwrap(b), false));\n }\n\n // Evaluate and(a, b) and return the result.\n function and(euint16 a, euint16 b) internal returns (euint16) {\n if (!isInitialized(a)) {\n a = asEuint16(0);\n }\n if (!isInitialized(b)) {\n b = asEuint16(0);\n }\n return euint16.wrap(Impl.and(euint16.unwrap(a), euint16.unwrap(b)));\n }\n\n // Evaluate or(a, b) and return the result.\n function or(euint16 a, euint16 b) internal returns (euint16) {\n if (!isInitialized(a)) {\n a = asEuint16(0);\n }\n if (!isInitialized(b)) {\n b = asEuint16(0);\n }\n return euint16.wrap(Impl.or(euint16.unwrap(a), euint16.unwrap(b)));\n }\n\n // Evaluate xor(a, b) and return the result.\n function xor(euint16 a, euint16 b) internal returns (euint16) {\n if (!isInitialized(a)) {\n a = asEuint16(0);\n }\n if (!isInitialized(b)) {\n b = asEuint16(0);\n }\n return euint16.wrap(Impl.xor(euint16.unwrap(a), euint16.unwrap(b)));\n }\n\n // Evaluate eq(a, b) and return the result.\n function eq(euint16 a, euint16 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint16(0);\n }\n if (!isInitialized(b)) {\n b = asEuint16(0);\n }\n return ebool.wrap(Impl.eq(euint16.unwrap(a), euint16.unwrap(b), false));\n }\n\n // Evaluate ne(a, b) and return the result.\n function ne(euint16 a, euint16 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint16(0);\n }\n if (!isInitialized(b)) {\n b = asEuint16(0);\n }\n return ebool.wrap(Impl.ne(euint16.unwrap(a), euint16.unwrap(b), false));\n }\n\n // Evaluate ge(a, b) and return the result.\n function ge(euint16 a, euint16 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint16(0);\n }\n if (!isInitialized(b)) {\n b = asEuint16(0);\n }\n return ebool.wrap(Impl.ge(euint16.unwrap(a), euint16.unwrap(b), false));\n }\n\n // Evaluate gt(a, b) and return the result.\n function gt(euint16 a, euint16 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint16(0);\n }\n if (!isInitialized(b)) {\n b = asEuint16(0);\n }\n return ebool.wrap(Impl.gt(euint16.unwrap(a), euint16.unwrap(b), false));\n }\n\n // Evaluate le(a, b) and return the result.\n function le(euint16 a, euint16 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint16(0);\n }\n if (!isInitialized(b)) {\n b = asEuint16(0);\n }\n return ebool.wrap(Impl.le(euint16.unwrap(a), euint16.unwrap(b), false));\n }\n\n // Evaluate lt(a, b) and return the result.\n function lt(euint16 a, euint16 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint16(0);\n }\n if (!isInitialized(b)) {\n b = asEuint16(0);\n }\n return ebool.wrap(Impl.lt(euint16.unwrap(a), euint16.unwrap(b), false));\n }\n\n // Evaluate min(a, b) and return the result.\n function min(euint16 a, euint16 b) internal returns (euint16) {\n if (!isInitialized(a)) {\n a = asEuint16(0);\n }\n if (!isInitialized(b)) {\n b = asEuint16(0);\n }\n return euint16.wrap(Impl.min(euint16.unwrap(a), euint16.unwrap(b), false));\n }\n\n // Evaluate max(a, b) and return the result.\n function max(euint16 a, euint16 b) internal returns (euint16) {\n if (!isInitialized(a)) {\n a = asEuint16(0);\n }\n if (!isInitialized(b)) {\n b = asEuint16(0);\n }\n return euint16.wrap(Impl.max(euint16.unwrap(a), euint16.unwrap(b), false));\n }\n\n // Evaluate add(a, b) and return the result.\n function add(euint16 a, euint32 b) internal returns (euint32) {\n if (!isInitialized(a)) {\n a = asEuint16(0);\n }\n if (!isInitialized(b)) {\n b = asEuint32(0);\n }\n return euint32.wrap(Impl.add(euint32.unwrap(asEuint32(a)), euint32.unwrap(b), false));\n }\n\n // Evaluate sub(a, b) and return the result.\n function sub(euint16 a, euint32 b) internal returns (euint32) {\n if (!isInitialized(a)) {\n a = asEuint16(0);\n }\n if (!isInitialized(b)) {\n b = asEuint32(0);\n }\n return euint32.wrap(Impl.sub(euint32.unwrap(asEuint32(a)), euint32.unwrap(b), false));\n }\n\n // Evaluate mul(a, b) and return the result.\n function mul(euint16 a, euint32 b) internal returns (euint32) {\n if (!isInitialized(a)) {\n a = asEuint16(0);\n }\n if (!isInitialized(b)) {\n b = asEuint32(0);\n }\n return euint32.wrap(Impl.mul(euint32.unwrap(asEuint32(a)), euint32.unwrap(b), false));\n }\n\n // Evaluate and(a, b) and return the result.\n function and(euint16 a, euint32 b) internal returns (euint32) {\n if (!isInitialized(a)) {\n a = asEuint16(0);\n }\n if (!isInitialized(b)) {\n b = asEuint32(0);\n }\n return euint32.wrap(Impl.and(euint32.unwrap(asEuint32(a)), euint32.unwrap(b)));\n }\n\n // Evaluate or(a, b) and return the result.\n function or(euint16 a, euint32 b) internal returns (euint32) {\n if (!isInitialized(a)) {\n a = asEuint16(0);\n }\n if (!isInitialized(b)) {\n b = asEuint32(0);\n }\n return euint32.wrap(Impl.or(euint32.unwrap(asEuint32(a)), euint32.unwrap(b)));\n }\n\n // Evaluate xor(a, b) and return the result.\n function xor(euint16 a, euint32 b) internal returns (euint32) {\n if (!isInitialized(a)) {\n a = asEuint16(0);\n }\n if (!isInitialized(b)) {\n b = asEuint32(0);\n }\n return euint32.wrap(Impl.xor(euint32.unwrap(asEuint32(a)), euint32.unwrap(b)));\n }\n\n // Evaluate eq(a, b) and return the result.\n function eq(euint16 a, euint32 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint16(0);\n }\n if (!isInitialized(b)) {\n b = asEuint32(0);\n }\n return ebool.wrap(Impl.eq(euint32.unwrap(asEuint32(a)), euint32.unwrap(b), false));\n }\n\n // Evaluate ne(a, b) and return the result.\n function ne(euint16 a, euint32 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint16(0);\n }\n if (!isInitialized(b)) {\n b = asEuint32(0);\n }\n return ebool.wrap(Impl.ne(euint32.unwrap(asEuint32(a)), euint32.unwrap(b), false));\n }\n\n // Evaluate ge(a, b) and return the result.\n function ge(euint16 a, euint32 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint16(0);\n }\n if (!isInitialized(b)) {\n b = asEuint32(0);\n }\n return ebool.wrap(Impl.ge(euint32.unwrap(asEuint32(a)), euint32.unwrap(b), false));\n }\n\n // Evaluate gt(a, b) and return the result.\n function gt(euint16 a, euint32 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint16(0);\n }\n if (!isInitialized(b)) {\n b = asEuint32(0);\n }\n return ebool.wrap(Impl.gt(euint32.unwrap(asEuint32(a)), euint32.unwrap(b), false));\n }\n\n // Evaluate le(a, b) and return the result.\n function le(euint16 a, euint32 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint16(0);\n }\n if (!isInitialized(b)) {\n b = asEuint32(0);\n }\n return ebool.wrap(Impl.le(euint32.unwrap(asEuint32(a)), euint32.unwrap(b), false));\n }\n\n // Evaluate lt(a, b) and return the result.\n function lt(euint16 a, euint32 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint16(0);\n }\n if (!isInitialized(b)) {\n b = asEuint32(0);\n }\n return ebool.wrap(Impl.lt(euint32.unwrap(asEuint32(a)), euint32.unwrap(b), false));\n }\n\n // Evaluate min(a, b) and return the result.\n function min(euint16 a, euint32 b) internal returns (euint32) {\n if (!isInitialized(a)) {\n a = asEuint16(0);\n }\n if (!isInitialized(b)) {\n b = asEuint32(0);\n }\n return euint32.wrap(Impl.min(euint32.unwrap(asEuint32(a)), euint32.unwrap(b), false));\n }\n\n // Evaluate max(a, b) and return the result.\n function max(euint16 a, euint32 b) internal returns (euint32) {\n if (!isInitialized(a)) {\n a = asEuint16(0);\n }\n if (!isInitialized(b)) {\n b = asEuint32(0);\n }\n return euint32.wrap(Impl.max(euint32.unwrap(asEuint32(a)), euint32.unwrap(b), false));\n }\n\n // Evaluate add(a, b) and return the result.\n function add(euint16 a, euint64 b) internal returns (euint64) {\n if (!isInitialized(a)) {\n a = asEuint16(0);\n }\n if (!isInitialized(b)) {\n b = asEuint64(0);\n }\n return euint64.wrap(Impl.add(euint64.unwrap(asEuint64(a)), euint64.unwrap(b), false));\n }\n\n // Evaluate sub(a, b) and return the result.\n function sub(euint16 a, euint64 b) internal returns (euint64) {\n if (!isInitialized(a)) {\n a = asEuint16(0);\n }\n if (!isInitialized(b)) {\n b = asEuint64(0);\n }\n return euint64.wrap(Impl.sub(euint64.unwrap(asEuint64(a)), euint64.unwrap(b), false));\n }\n\n // Evaluate mul(a, b) and return the result.\n function mul(euint16 a, euint64 b) internal returns (euint64) {\n if (!isInitialized(a)) {\n a = asEuint16(0);\n }\n if (!isInitialized(b)) {\n b = asEuint64(0);\n }\n return euint64.wrap(Impl.mul(euint64.unwrap(asEuint64(a)), euint64.unwrap(b), false));\n }\n\n // Evaluate and(a, b) and return the result.\n function and(euint16 a, euint64 b) internal returns (euint64) {\n if (!isInitialized(a)) {\n a = asEuint16(0);\n }\n if (!isInitialized(b)) {\n b = asEuint64(0);\n }\n return euint64.wrap(Impl.and(euint64.unwrap(asEuint64(a)), euint64.unwrap(b)));\n }\n\n // Evaluate or(a, b) and return the result.\n function or(euint16 a, euint64 b) internal returns (euint64) {\n if (!isInitialized(a)) {\n a = asEuint16(0);\n }\n if (!isInitialized(b)) {\n b = asEuint64(0);\n }\n return euint64.wrap(Impl.or(euint64.unwrap(asEuint64(a)), euint64.unwrap(b)));\n }\n\n // Evaluate xor(a, b) and return the result.\n function xor(euint16 a, euint64 b) internal returns (euint64) {\n if (!isInitialized(a)) {\n a = asEuint16(0);\n }\n if (!isInitialized(b)) {\n b = asEuint64(0);\n }\n return euint64.wrap(Impl.xor(euint64.unwrap(asEuint64(a)), euint64.unwrap(b)));\n }\n\n // Evaluate eq(a, b) and return the result.\n function eq(euint16 a, euint64 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint16(0);\n }\n if (!isInitialized(b)) {\n b = asEuint64(0);\n }\n return ebool.wrap(Impl.eq(euint64.unwrap(asEuint64(a)), euint64.unwrap(b), false));\n }\n\n // Evaluate ne(a, b) and return the result.\n function ne(euint16 a, euint64 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint16(0);\n }\n if (!isInitialized(b)) {\n b = asEuint64(0);\n }\n return ebool.wrap(Impl.ne(euint64.unwrap(asEuint64(a)), euint64.unwrap(b), false));\n }\n\n // Evaluate ge(a, b) and return the result.\n function ge(euint16 a, euint64 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint16(0);\n }\n if (!isInitialized(b)) {\n b = asEuint64(0);\n }\n return ebool.wrap(Impl.ge(euint64.unwrap(asEuint64(a)), euint64.unwrap(b), false));\n }\n\n // Evaluate gt(a, b) and return the result.\n function gt(euint16 a, euint64 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint16(0);\n }\n if (!isInitialized(b)) {\n b = asEuint64(0);\n }\n return ebool.wrap(Impl.gt(euint64.unwrap(asEuint64(a)), euint64.unwrap(b), false));\n }\n\n // Evaluate le(a, b) and return the result.\n function le(euint16 a, euint64 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint16(0);\n }\n if (!isInitialized(b)) {\n b = asEuint64(0);\n }\n return ebool.wrap(Impl.le(euint64.unwrap(asEuint64(a)), euint64.unwrap(b), false));\n }\n\n // Evaluate lt(a, b) and return the result.\n function lt(euint16 a, euint64 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint16(0);\n }\n if (!isInitialized(b)) {\n b = asEuint64(0);\n }\n return ebool.wrap(Impl.lt(euint64.unwrap(asEuint64(a)), euint64.unwrap(b), false));\n }\n\n // Evaluate min(a, b) and return the result.\n function min(euint16 a, euint64 b) internal returns (euint64) {\n if (!isInitialized(a)) {\n a = asEuint16(0);\n }\n if (!isInitialized(b)) {\n b = asEuint64(0);\n }\n return euint64.wrap(Impl.min(euint64.unwrap(asEuint64(a)), euint64.unwrap(b), false));\n }\n\n // Evaluate max(a, b) and return the result.\n function max(euint16 a, euint64 b) internal returns (euint64) {\n if (!isInitialized(a)) {\n a = asEuint16(0);\n }\n if (!isInitialized(b)) {\n b = asEuint64(0);\n }\n return euint64.wrap(Impl.max(euint64.unwrap(asEuint64(a)), euint64.unwrap(b), false));\n }\n\n // Evaluate add(a, b) and return the result.\n function add(euint16 a, uint16 b) internal returns (euint16) {\n if (!isInitialized(a)) {\n a = asEuint16(0);\n }\n return euint16.wrap(Impl.add(euint16.unwrap(a), uint256(b), true));\n }\n\n // Evaluate add(a, b) and return the result.\n function add(uint16 a, euint16 b) internal returns (euint16) {\n if (!isInitialized(b)) {\n b = asEuint16(0);\n }\n return euint16.wrap(Impl.add(euint16.unwrap(b), uint256(a), true));\n }\n\n // Evaluate sub(a, b) and return the result.\n function sub(euint16 a, uint16 b) internal returns (euint16) {\n if (!isInitialized(a)) {\n a = asEuint16(0);\n }\n return euint16.wrap(Impl.sub(euint16.unwrap(a), uint256(b), true));\n }\n\n // Evaluate sub(a, b) and return the result.\n function sub(uint16 a, euint16 b) internal returns (euint16) {\n euint16 aEnc = asEuint16(a);\n if (!isInitialized(b)) {\n b = asEuint16(0);\n }\n return euint16.wrap(Impl.sub(euint16.unwrap(aEnc), euint16.unwrap(b), false));\n }\n\n // Evaluate mul(a, b) and return the result.\n function mul(euint16 a, uint16 b) internal returns (euint16) {\n if (!isInitialized(a)) {\n a = asEuint16(0);\n }\n return euint16.wrap(Impl.mul(euint16.unwrap(a), uint256(b), true));\n }\n\n // Evaluate mul(a, b) and return the result.\n function mul(uint16 a, euint16 b) internal returns (euint16) {\n if (!isInitialized(b)) {\n b = asEuint16(0);\n }\n return euint16.wrap(Impl.mul(euint16.unwrap(b), uint256(a), true));\n }\n\n // Evaluate div(a, b) and return the result.\n function div(euint16 a, uint16 b) internal returns (euint16) {\n if (!isInitialized(a)) {\n a = asEuint16(0);\n }\n return euint16.wrap(Impl.div(euint16.unwrap(a), uint256(b)));\n }\n\n // Evaluate rem(a, b) and return the result.\n function rem(euint16 a, uint16 b) internal returns (euint16) {\n if (!isInitialized(a)) {\n a = asEuint16(0);\n }\n return euint16.wrap(Impl.rem(euint16.unwrap(a), uint256(b)));\n }\n\n // Evaluate eq(a, b) and return the result.\n function eq(euint16 a, uint16 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint16(0);\n }\n return ebool.wrap(Impl.eq(euint16.unwrap(a), uint256(b), true));\n }\n\n // Evaluate eq(a, b) and return the result.\n function eq(uint16 a, euint16 b) internal returns (ebool) {\n if (!isInitialized(b)) {\n b = asEuint16(0);\n }\n return ebool.wrap(Impl.eq(euint16.unwrap(b), uint256(a), true));\n }\n\n // Evaluate ne(a, b) and return the result.\n function ne(euint16 a, uint16 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint16(0);\n }\n return ebool.wrap(Impl.ne(euint16.unwrap(a), uint256(b), true));\n }\n\n // Evaluate ne(a, b) and return the result.\n function ne(uint16 a, euint16 b) internal returns (ebool) {\n if (!isInitialized(b)) {\n b = asEuint16(0);\n }\n return ebool.wrap(Impl.ne(euint16.unwrap(b), uint256(a), true));\n }\n\n // Evaluate ge(a, b) and return the result.\n function ge(euint16 a, uint16 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint16(0);\n }\n return ebool.wrap(Impl.ge(euint16.unwrap(a), uint256(b), true));\n }\n\n // Evaluate ge(a, b) and return the result.\n function ge(uint16 a, euint16 b) internal returns (ebool) {\n if (!isInitialized(b)) {\n b = asEuint16(0);\n }\n return ebool.wrap(Impl.le(euint16.unwrap(b), uint256(a), true));\n }\n\n // Evaluate gt(a, b) and return the result.\n function gt(euint16 a, uint16 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint16(0);\n }\n return ebool.wrap(Impl.gt(euint16.unwrap(a), uint256(b), true));\n }\n\n // Evaluate gt(a, b) and return the result.\n function gt(uint16 a, euint16 b) internal returns (ebool) {\n if (!isInitialized(b)) {\n b = asEuint16(0);\n }\n return ebool.wrap(Impl.lt(euint16.unwrap(b), uint256(a), true));\n }\n\n // Evaluate le(a, b) and return the result.\n function le(euint16 a, uint16 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint16(0);\n }\n return ebool.wrap(Impl.le(euint16.unwrap(a), uint256(b), true));\n }\n\n // Evaluate le(a, b) and return the result.\n function le(uint16 a, euint16 b) internal returns (ebool) {\n if (!isInitialized(b)) {\n b = asEuint16(0);\n }\n return ebool.wrap(Impl.ge(euint16.unwrap(b), uint256(a), true));\n }\n\n // Evaluate lt(a, b) and return the result.\n function lt(euint16 a, uint16 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint16(0);\n }\n return ebool.wrap(Impl.lt(euint16.unwrap(a), uint256(b), true));\n }\n\n // Evaluate lt(a, b) and return the result.\n function lt(uint16 a, euint16 b) internal returns (ebool) {\n if (!isInitialized(b)) {\n b = asEuint16(0);\n }\n return ebool.wrap(Impl.gt(euint16.unwrap(b), uint256(a), true));\n }\n\n // Evaluate min(a, b) and return the result.\n function min(euint16 a, uint16 b) internal returns (euint16) {\n if (!isInitialized(a)) {\n a = asEuint16(0);\n }\n return euint16.wrap(Impl.min(euint16.unwrap(a), uint256(b), true));\n }\n\n // Evaluate min(a, b) and return the result.\n function min(uint16 a, euint16 b) internal returns (euint16) {\n if (!isInitialized(b)) {\n b = asEuint16(0);\n }\n return euint16.wrap(Impl.min(euint16.unwrap(b), uint256(a), true));\n }\n\n // Evaluate max(a, b) and return the result.\n function max(euint16 a, uint16 b) internal returns (euint16) {\n if (!isInitialized(a)) {\n a = asEuint16(0);\n }\n return euint16.wrap(Impl.max(euint16.unwrap(a), uint256(b), true));\n }\n\n // Evaluate max(a, b) and return the result.\n function max(uint16 a, euint16 b) internal returns (euint16) {\n if (!isInitialized(b)) {\n b = asEuint16(0);\n }\n return euint16.wrap(Impl.max(euint16.unwrap(b), uint256(a), true));\n }\n\n // Evaluate add(a, b) and return the result.\n function add(euint32 a, euint4 b) internal returns (euint32) {\n if (!isInitialized(a)) {\n a = asEuint32(0);\n }\n if (!isInitialized(b)) {\n b = asEuint4(0);\n }\n return euint32.wrap(Impl.add(euint32.unwrap(a), euint32.unwrap(asEuint32(b)), false));\n }\n\n // Evaluate sub(a, b) and return the result.\n function sub(euint32 a, euint4 b) internal returns (euint32) {\n if (!isInitialized(a)) {\n a = asEuint32(0);\n }\n if (!isInitialized(b)) {\n b = asEuint4(0);\n }\n return euint32.wrap(Impl.sub(euint32.unwrap(a), euint32.unwrap(asEuint32(b)), false));\n }\n\n // Evaluate mul(a, b) and return the result.\n function mul(euint32 a, euint4 b) internal returns (euint32) {\n if (!isInitialized(a)) {\n a = asEuint32(0);\n }\n if (!isInitialized(b)) {\n b = asEuint4(0);\n }\n return euint32.wrap(Impl.mul(euint32.unwrap(a), euint32.unwrap(asEuint32(b)), false));\n }\n\n // Evaluate and(a, b) and return the result.\n function and(euint32 a, euint4 b) internal returns (euint32) {\n if (!isInitialized(a)) {\n a = asEuint32(0);\n }\n if (!isInitialized(b)) {\n b = asEuint4(0);\n }\n return euint32.wrap(Impl.and(euint32.unwrap(a), euint32.unwrap(asEuint32(b))));\n }\n\n // Evaluate or(a, b) and return the result.\n function or(euint32 a, euint4 b) internal returns (euint32) {\n if (!isInitialized(a)) {\n a = asEuint32(0);\n }\n if (!isInitialized(b)) {\n b = asEuint4(0);\n }\n return euint32.wrap(Impl.or(euint32.unwrap(a), euint32.unwrap(asEuint32(b))));\n }\n\n // Evaluate xor(a, b) and return the result.\n function xor(euint32 a, euint4 b) internal returns (euint32) {\n if (!isInitialized(a)) {\n a = asEuint32(0);\n }\n if (!isInitialized(b)) {\n b = asEuint4(0);\n }\n return euint32.wrap(Impl.xor(euint32.unwrap(a), euint32.unwrap(asEuint32(b))));\n }\n\n // Evaluate eq(a, b) and return the result.\n function eq(euint32 a, euint4 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint32(0);\n }\n if (!isInitialized(b)) {\n b = asEuint4(0);\n }\n return ebool.wrap(Impl.eq(euint32.unwrap(a), euint32.unwrap(asEuint32(b)), false));\n }\n\n // Evaluate ne(a, b) and return the result.\n function ne(euint32 a, euint4 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint32(0);\n }\n if (!isInitialized(b)) {\n b = asEuint4(0);\n }\n return ebool.wrap(Impl.ne(euint32.unwrap(a), euint32.unwrap(asEuint32(b)), false));\n }\n\n // Evaluate ge(a, b) and return the result.\n function ge(euint32 a, euint4 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint32(0);\n }\n if (!isInitialized(b)) {\n b = asEuint4(0);\n }\n return ebool.wrap(Impl.ge(euint32.unwrap(a), euint32.unwrap(asEuint32(b)), false));\n }\n\n // Evaluate gt(a, b) and return the result.\n function gt(euint32 a, euint4 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint32(0);\n }\n if (!isInitialized(b)) {\n b = asEuint4(0);\n }\n return ebool.wrap(Impl.gt(euint32.unwrap(a), euint32.unwrap(asEuint32(b)), false));\n }\n\n // Evaluate le(a, b) and return the result.\n function le(euint32 a, euint4 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint32(0);\n }\n if (!isInitialized(b)) {\n b = asEuint4(0);\n }\n return ebool.wrap(Impl.le(euint32.unwrap(a), euint32.unwrap(asEuint32(b)), false));\n }\n\n // Evaluate lt(a, b) and return the result.\n function lt(euint32 a, euint4 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint32(0);\n }\n if (!isInitialized(b)) {\n b = asEuint4(0);\n }\n return ebool.wrap(Impl.lt(euint32.unwrap(a), euint32.unwrap(asEuint32(b)), false));\n }\n\n // Evaluate min(a, b) and return the result.\n function min(euint32 a, euint4 b) internal returns (euint32) {\n if (!isInitialized(a)) {\n a = asEuint32(0);\n }\n if (!isInitialized(b)) {\n b = asEuint4(0);\n }\n return euint32.wrap(Impl.min(euint32.unwrap(a), euint32.unwrap(asEuint32(b)), false));\n }\n\n // Evaluate max(a, b) and return the result.\n function max(euint32 a, euint4 b) internal returns (euint32) {\n if (!isInitialized(a)) {\n a = asEuint32(0);\n }\n if (!isInitialized(b)) {\n b = asEuint4(0);\n }\n return euint32.wrap(Impl.max(euint32.unwrap(a), euint32.unwrap(asEuint32(b)), false));\n }\n\n // Evaluate add(a, b) and return the result.\n function add(euint32 a, euint8 b) internal returns (euint32) {\n if (!isInitialized(a)) {\n a = asEuint32(0);\n }\n if (!isInitialized(b)) {\n b = asEuint8(0);\n }\n return euint32.wrap(Impl.add(euint32.unwrap(a), euint32.unwrap(asEuint32(b)), false));\n }\n\n // Evaluate sub(a, b) and return the result.\n function sub(euint32 a, euint8 b) internal returns (euint32) {\n if (!isInitialized(a)) {\n a = asEuint32(0);\n }\n if (!isInitialized(b)) {\n b = asEuint8(0);\n }\n return euint32.wrap(Impl.sub(euint32.unwrap(a), euint32.unwrap(asEuint32(b)), false));\n }\n\n // Evaluate mul(a, b) and return the result.\n function mul(euint32 a, euint8 b) internal returns (euint32) {\n if (!isInitialized(a)) {\n a = asEuint32(0);\n }\n if (!isInitialized(b)) {\n b = asEuint8(0);\n }\n return euint32.wrap(Impl.mul(euint32.unwrap(a), euint32.unwrap(asEuint32(b)), false));\n }\n\n // Evaluate and(a, b) and return the result.\n function and(euint32 a, euint8 b) internal returns (euint32) {\n if (!isInitialized(a)) {\n a = asEuint32(0);\n }\n if (!isInitialized(b)) {\n b = asEuint8(0);\n }\n return euint32.wrap(Impl.and(euint32.unwrap(a), euint32.unwrap(asEuint32(b))));\n }\n\n // Evaluate or(a, b) and return the result.\n function or(euint32 a, euint8 b) internal returns (euint32) {\n if (!isInitialized(a)) {\n a = asEuint32(0);\n }\n if (!isInitialized(b)) {\n b = asEuint8(0);\n }\n return euint32.wrap(Impl.or(euint32.unwrap(a), euint32.unwrap(asEuint32(b))));\n }\n\n // Evaluate xor(a, b) and return the result.\n function xor(euint32 a, euint8 b) internal returns (euint32) {\n if (!isInitialized(a)) {\n a = asEuint32(0);\n }\n if (!isInitialized(b)) {\n b = asEuint8(0);\n }\n return euint32.wrap(Impl.xor(euint32.unwrap(a), euint32.unwrap(asEuint32(b))));\n }\n\n // Evaluate eq(a, b) and return the result.\n function eq(euint32 a, euint8 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint32(0);\n }\n if (!isInitialized(b)) {\n b = asEuint8(0);\n }\n return ebool.wrap(Impl.eq(euint32.unwrap(a), euint32.unwrap(asEuint32(b)), false));\n }\n\n // Evaluate ne(a, b) and return the result.\n function ne(euint32 a, euint8 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint32(0);\n }\n if (!isInitialized(b)) {\n b = asEuint8(0);\n }\n return ebool.wrap(Impl.ne(euint32.unwrap(a), euint32.unwrap(asEuint32(b)), false));\n }\n\n // Evaluate ge(a, b) and return the result.\n function ge(euint32 a, euint8 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint32(0);\n }\n if (!isInitialized(b)) {\n b = asEuint8(0);\n }\n return ebool.wrap(Impl.ge(euint32.unwrap(a), euint32.unwrap(asEuint32(b)), false));\n }\n\n // Evaluate gt(a, b) and return the result.\n function gt(euint32 a, euint8 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint32(0);\n }\n if (!isInitialized(b)) {\n b = asEuint8(0);\n }\n return ebool.wrap(Impl.gt(euint32.unwrap(a), euint32.unwrap(asEuint32(b)), false));\n }\n\n // Evaluate le(a, b) and return the result.\n function le(euint32 a, euint8 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint32(0);\n }\n if (!isInitialized(b)) {\n b = asEuint8(0);\n }\n return ebool.wrap(Impl.le(euint32.unwrap(a), euint32.unwrap(asEuint32(b)), false));\n }\n\n // Evaluate lt(a, b) and return the result.\n function lt(euint32 a, euint8 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint32(0);\n }\n if (!isInitialized(b)) {\n b = asEuint8(0);\n }\n return ebool.wrap(Impl.lt(euint32.unwrap(a), euint32.unwrap(asEuint32(b)), false));\n }\n\n // Evaluate min(a, b) and return the result.\n function min(euint32 a, euint8 b) internal returns (euint32) {\n if (!isInitialized(a)) {\n a = asEuint32(0);\n }\n if (!isInitialized(b)) {\n b = asEuint8(0);\n }\n return euint32.wrap(Impl.min(euint32.unwrap(a), euint32.unwrap(asEuint32(b)), false));\n }\n\n // Evaluate max(a, b) and return the result.\n function max(euint32 a, euint8 b) internal returns (euint32) {\n if (!isInitialized(a)) {\n a = asEuint32(0);\n }\n if (!isInitialized(b)) {\n b = asEuint8(0);\n }\n return euint32.wrap(Impl.max(euint32.unwrap(a), euint32.unwrap(asEuint32(b)), false));\n }\n\n // Evaluate add(a, b) and return the result.\n function add(euint32 a, euint16 b) internal returns (euint32) {\n if (!isInitialized(a)) {\n a = asEuint32(0);\n }\n if (!isInitialized(b)) {\n b = asEuint16(0);\n }\n return euint32.wrap(Impl.add(euint32.unwrap(a), euint32.unwrap(asEuint32(b)), false));\n }\n\n // Evaluate sub(a, b) and return the result.\n function sub(euint32 a, euint16 b) internal returns (euint32) {\n if (!isInitialized(a)) {\n a = asEuint32(0);\n }\n if (!isInitialized(b)) {\n b = asEuint16(0);\n }\n return euint32.wrap(Impl.sub(euint32.unwrap(a), euint32.unwrap(asEuint32(b)), false));\n }\n\n // Evaluate mul(a, b) and return the result.\n function mul(euint32 a, euint16 b) internal returns (euint32) {\n if (!isInitialized(a)) {\n a = asEuint32(0);\n }\n if (!isInitialized(b)) {\n b = asEuint16(0);\n }\n return euint32.wrap(Impl.mul(euint32.unwrap(a), euint32.unwrap(asEuint32(b)), false));\n }\n\n // Evaluate and(a, b) and return the result.\n function and(euint32 a, euint16 b) internal returns (euint32) {\n if (!isInitialized(a)) {\n a = asEuint32(0);\n }\n if (!isInitialized(b)) {\n b = asEuint16(0);\n }\n return euint32.wrap(Impl.and(euint32.unwrap(a), euint32.unwrap(asEuint32(b))));\n }\n\n // Evaluate or(a, b) and return the result.\n function or(euint32 a, euint16 b) internal returns (euint32) {\n if (!isInitialized(a)) {\n a = asEuint32(0);\n }\n if (!isInitialized(b)) {\n b = asEuint16(0);\n }\n return euint32.wrap(Impl.or(euint32.unwrap(a), euint32.unwrap(asEuint32(b))));\n }\n\n // Evaluate xor(a, b) and return the result.\n function xor(euint32 a, euint16 b) internal returns (euint32) {\n if (!isInitialized(a)) {\n a = asEuint32(0);\n }\n if (!isInitialized(b)) {\n b = asEuint16(0);\n }\n return euint32.wrap(Impl.xor(euint32.unwrap(a), euint32.unwrap(asEuint32(b))));\n }\n\n // Evaluate eq(a, b) and return the result.\n function eq(euint32 a, euint16 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint32(0);\n }\n if (!isInitialized(b)) {\n b = asEuint16(0);\n }\n return ebool.wrap(Impl.eq(euint32.unwrap(a), euint32.unwrap(asEuint32(b)), false));\n }\n\n // Evaluate ne(a, b) and return the result.\n function ne(euint32 a, euint16 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint32(0);\n }\n if (!isInitialized(b)) {\n b = asEuint16(0);\n }\n return ebool.wrap(Impl.ne(euint32.unwrap(a), euint32.unwrap(asEuint32(b)), false));\n }\n\n // Evaluate ge(a, b) and return the result.\n function ge(euint32 a, euint16 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint32(0);\n }\n if (!isInitialized(b)) {\n b = asEuint16(0);\n }\n return ebool.wrap(Impl.ge(euint32.unwrap(a), euint32.unwrap(asEuint32(b)), false));\n }\n\n // Evaluate gt(a, b) and return the result.\n function gt(euint32 a, euint16 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint32(0);\n }\n if (!isInitialized(b)) {\n b = asEuint16(0);\n }\n return ebool.wrap(Impl.gt(euint32.unwrap(a), euint32.unwrap(asEuint32(b)), false));\n }\n\n // Evaluate le(a, b) and return the result.\n function le(euint32 a, euint16 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint32(0);\n }\n if (!isInitialized(b)) {\n b = asEuint16(0);\n }\n return ebool.wrap(Impl.le(euint32.unwrap(a), euint32.unwrap(asEuint32(b)), false));\n }\n\n // Evaluate lt(a, b) and return the result.\n function lt(euint32 a, euint16 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint32(0);\n }\n if (!isInitialized(b)) {\n b = asEuint16(0);\n }\n return ebool.wrap(Impl.lt(euint32.unwrap(a), euint32.unwrap(asEuint32(b)), false));\n }\n\n // Evaluate min(a, b) and return the result.\n function min(euint32 a, euint16 b) internal returns (euint32) {\n if (!isInitialized(a)) {\n a = asEuint32(0);\n }\n if (!isInitialized(b)) {\n b = asEuint16(0);\n }\n return euint32.wrap(Impl.min(euint32.unwrap(a), euint32.unwrap(asEuint32(b)), false));\n }\n\n // Evaluate max(a, b) and return the result.\n function max(euint32 a, euint16 b) internal returns (euint32) {\n if (!isInitialized(a)) {\n a = asEuint32(0);\n }\n if (!isInitialized(b)) {\n b = asEuint16(0);\n }\n return euint32.wrap(Impl.max(euint32.unwrap(a), euint32.unwrap(asEuint32(b)), false));\n }\n\n // Evaluate add(a, b) and return the result.\n function add(euint32 a, euint32 b) internal returns (euint32) {\n if (!isInitialized(a)) {\n a = asEuint32(0);\n }\n if (!isInitialized(b)) {\n b = asEuint32(0);\n }\n return euint32.wrap(Impl.add(euint32.unwrap(a), euint32.unwrap(b), false));\n }\n\n // Evaluate sub(a, b) and return the result.\n function sub(euint32 a, euint32 b) internal returns (euint32) {\n if (!isInitialized(a)) {\n a = asEuint32(0);\n }\n if (!isInitialized(b)) {\n b = asEuint32(0);\n }\n return euint32.wrap(Impl.sub(euint32.unwrap(a), euint32.unwrap(b), false));\n }\n\n // Evaluate mul(a, b) and return the result.\n function mul(euint32 a, euint32 b) internal returns (euint32) {\n if (!isInitialized(a)) {\n a = asEuint32(0);\n }\n if (!isInitialized(b)) {\n b = asEuint32(0);\n }\n return euint32.wrap(Impl.mul(euint32.unwrap(a), euint32.unwrap(b), false));\n }\n\n // Evaluate and(a, b) and return the result.\n function and(euint32 a, euint32 b) internal returns (euint32) {\n if (!isInitialized(a)) {\n a = asEuint32(0);\n }\n if (!isInitialized(b)) {\n b = asEuint32(0);\n }\n return euint32.wrap(Impl.and(euint32.unwrap(a), euint32.unwrap(b)));\n }\n\n // Evaluate or(a, b) and return the result.\n function or(euint32 a, euint32 b) internal returns (euint32) {\n if (!isInitialized(a)) {\n a = asEuint32(0);\n }\n if (!isInitialized(b)) {\n b = asEuint32(0);\n }\n return euint32.wrap(Impl.or(euint32.unwrap(a), euint32.unwrap(b)));\n }\n\n // Evaluate xor(a, b) and return the result.\n function xor(euint32 a, euint32 b) internal returns (euint32) {\n if (!isInitialized(a)) {\n a = asEuint32(0);\n }\n if (!isInitialized(b)) {\n b = asEuint32(0);\n }\n return euint32.wrap(Impl.xor(euint32.unwrap(a), euint32.unwrap(b)));\n }\n\n // Evaluate eq(a, b) and return the result.\n function eq(euint32 a, euint32 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint32(0);\n }\n if (!isInitialized(b)) {\n b = asEuint32(0);\n }\n return ebool.wrap(Impl.eq(euint32.unwrap(a), euint32.unwrap(b), false));\n }\n\n // Evaluate ne(a, b) and return the result.\n function ne(euint32 a, euint32 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint32(0);\n }\n if (!isInitialized(b)) {\n b = asEuint32(0);\n }\n return ebool.wrap(Impl.ne(euint32.unwrap(a), euint32.unwrap(b), false));\n }\n\n // Evaluate ge(a, b) and return the result.\n function ge(euint32 a, euint32 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint32(0);\n }\n if (!isInitialized(b)) {\n b = asEuint32(0);\n }\n return ebool.wrap(Impl.ge(euint32.unwrap(a), euint32.unwrap(b), false));\n }\n\n // Evaluate gt(a, b) and return the result.\n function gt(euint32 a, euint32 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint32(0);\n }\n if (!isInitialized(b)) {\n b = asEuint32(0);\n }\n return ebool.wrap(Impl.gt(euint32.unwrap(a), euint32.unwrap(b), false));\n }\n\n // Evaluate le(a, b) and return the result.\n function le(euint32 a, euint32 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint32(0);\n }\n if (!isInitialized(b)) {\n b = asEuint32(0);\n }\n return ebool.wrap(Impl.le(euint32.unwrap(a), euint32.unwrap(b), false));\n }\n\n // Evaluate lt(a, b) and return the result.\n function lt(euint32 a, euint32 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint32(0);\n }\n if (!isInitialized(b)) {\n b = asEuint32(0);\n }\n return ebool.wrap(Impl.lt(euint32.unwrap(a), euint32.unwrap(b), false));\n }\n\n // Evaluate min(a, b) and return the result.\n function min(euint32 a, euint32 b) internal returns (euint32) {\n if (!isInitialized(a)) {\n a = asEuint32(0);\n }\n if (!isInitialized(b)) {\n b = asEuint32(0);\n }\n return euint32.wrap(Impl.min(euint32.unwrap(a), euint32.unwrap(b), false));\n }\n\n // Evaluate max(a, b) and return the result.\n function max(euint32 a, euint32 b) internal returns (euint32) {\n if (!isInitialized(a)) {\n a = asEuint32(0);\n }\n if (!isInitialized(b)) {\n b = asEuint32(0);\n }\n return euint32.wrap(Impl.max(euint32.unwrap(a), euint32.unwrap(b), false));\n }\n\n // Evaluate add(a, b) and return the result.\n function add(euint32 a, euint64 b) internal returns (euint64) {\n if (!isInitialized(a)) {\n a = asEuint32(0);\n }\n if (!isInitialized(b)) {\n b = asEuint64(0);\n }\n return euint64.wrap(Impl.add(euint64.unwrap(asEuint64(a)), euint64.unwrap(b), false));\n }\n\n // Evaluate sub(a, b) and return the result.\n function sub(euint32 a, euint64 b) internal returns (euint64) {\n if (!isInitialized(a)) {\n a = asEuint32(0);\n }\n if (!isInitialized(b)) {\n b = asEuint64(0);\n }\n return euint64.wrap(Impl.sub(euint64.unwrap(asEuint64(a)), euint64.unwrap(b), false));\n }\n\n // Evaluate mul(a, b) and return the result.\n function mul(euint32 a, euint64 b) internal returns (euint64) {\n if (!isInitialized(a)) {\n a = asEuint32(0);\n }\n if (!isInitialized(b)) {\n b = asEuint64(0);\n }\n return euint64.wrap(Impl.mul(euint64.unwrap(asEuint64(a)), euint64.unwrap(b), false));\n }\n\n // Evaluate and(a, b) and return the result.\n function and(euint32 a, euint64 b) internal returns (euint64) {\n if (!isInitialized(a)) {\n a = asEuint32(0);\n }\n if (!isInitialized(b)) {\n b = asEuint64(0);\n }\n return euint64.wrap(Impl.and(euint64.unwrap(asEuint64(a)), euint64.unwrap(b)));\n }\n\n // Evaluate or(a, b) and return the result.\n function or(euint32 a, euint64 b) internal returns (euint64) {\n if (!isInitialized(a)) {\n a = asEuint32(0);\n }\n if (!isInitialized(b)) {\n b = asEuint64(0);\n }\n return euint64.wrap(Impl.or(euint64.unwrap(asEuint64(a)), euint64.unwrap(b)));\n }\n\n // Evaluate xor(a, b) and return the result.\n function xor(euint32 a, euint64 b) internal returns (euint64) {\n if (!isInitialized(a)) {\n a = asEuint32(0);\n }\n if (!isInitialized(b)) {\n b = asEuint64(0);\n }\n return euint64.wrap(Impl.xor(euint64.unwrap(asEuint64(a)), euint64.unwrap(b)));\n }\n\n // Evaluate eq(a, b) and return the result.\n function eq(euint32 a, euint64 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint32(0);\n }\n if (!isInitialized(b)) {\n b = asEuint64(0);\n }\n return ebool.wrap(Impl.eq(euint64.unwrap(asEuint64(a)), euint64.unwrap(b), false));\n }\n\n // Evaluate ne(a, b) and return the result.\n function ne(euint32 a, euint64 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint32(0);\n }\n if (!isInitialized(b)) {\n b = asEuint64(0);\n }\n return ebool.wrap(Impl.ne(euint64.unwrap(asEuint64(a)), euint64.unwrap(b), false));\n }\n\n // Evaluate ge(a, b) and return the result.\n function ge(euint32 a, euint64 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint32(0);\n }\n if (!isInitialized(b)) {\n b = asEuint64(0);\n }\n return ebool.wrap(Impl.ge(euint64.unwrap(asEuint64(a)), euint64.unwrap(b), false));\n }\n\n // Evaluate gt(a, b) and return the result.\n function gt(euint32 a, euint64 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint32(0);\n }\n if (!isInitialized(b)) {\n b = asEuint64(0);\n }\n return ebool.wrap(Impl.gt(euint64.unwrap(asEuint64(a)), euint64.unwrap(b), false));\n }\n\n // Evaluate le(a, b) and return the result.\n function le(euint32 a, euint64 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint32(0);\n }\n if (!isInitialized(b)) {\n b = asEuint64(0);\n }\n return ebool.wrap(Impl.le(euint64.unwrap(asEuint64(a)), euint64.unwrap(b), false));\n }\n\n // Evaluate lt(a, b) and return the result.\n function lt(euint32 a, euint64 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint32(0);\n }\n if (!isInitialized(b)) {\n b = asEuint64(0);\n }\n return ebool.wrap(Impl.lt(euint64.unwrap(asEuint64(a)), euint64.unwrap(b), false));\n }\n\n // Evaluate min(a, b) and return the result.\n function min(euint32 a, euint64 b) internal returns (euint64) {\n if (!isInitialized(a)) {\n a = asEuint32(0);\n }\n if (!isInitialized(b)) {\n b = asEuint64(0);\n }\n return euint64.wrap(Impl.min(euint64.unwrap(asEuint64(a)), euint64.unwrap(b), false));\n }\n\n // Evaluate max(a, b) and return the result.\n function max(euint32 a, euint64 b) internal returns (euint64) {\n if (!isInitialized(a)) {\n a = asEuint32(0);\n }\n if (!isInitialized(b)) {\n b = asEuint64(0);\n }\n return euint64.wrap(Impl.max(euint64.unwrap(asEuint64(a)), euint64.unwrap(b), false));\n }\n\n // Evaluate add(a, b) and return the result.\n function add(euint32 a, uint32 b) internal returns (euint32) {\n if (!isInitialized(a)) {\n a = asEuint32(0);\n }\n return euint32.wrap(Impl.add(euint32.unwrap(a), uint256(b), true));\n }\n\n // Evaluate add(a, b) and return the result.\n function add(uint32 a, euint32 b) internal returns (euint32) {\n if (!isInitialized(b)) {\n b = asEuint32(0);\n }\n return euint32.wrap(Impl.add(euint32.unwrap(b), uint256(a), true));\n }\n\n // Evaluate sub(a, b) and return the result.\n function sub(euint32 a, uint32 b) internal returns (euint32) {\n if (!isInitialized(a)) {\n a = asEuint32(0);\n }\n return euint32.wrap(Impl.sub(euint32.unwrap(a), uint256(b), true));\n }\n\n // Evaluate sub(a, b) and return the result.\n function sub(uint32 a, euint32 b) internal returns (euint32) {\n euint32 aEnc = asEuint32(a);\n if (!isInitialized(b)) {\n b = asEuint32(0);\n }\n return euint32.wrap(Impl.sub(euint32.unwrap(aEnc), euint32.unwrap(b), false));\n }\n\n // Evaluate mul(a, b) and return the result.\n function mul(euint32 a, uint32 b) internal returns (euint32) {\n if (!isInitialized(a)) {\n a = asEuint32(0);\n }\n return euint32.wrap(Impl.mul(euint32.unwrap(a), uint256(b), true));\n }\n\n // Evaluate mul(a, b) and return the result.\n function mul(uint32 a, euint32 b) internal returns (euint32) {\n if (!isInitialized(b)) {\n b = asEuint32(0);\n }\n return euint32.wrap(Impl.mul(euint32.unwrap(b), uint256(a), true));\n }\n\n // Evaluate div(a, b) and return the result.\n function div(euint32 a, uint32 b) internal returns (euint32) {\n if (!isInitialized(a)) {\n a = asEuint32(0);\n }\n return euint32.wrap(Impl.div(euint32.unwrap(a), uint256(b)));\n }\n\n // Evaluate rem(a, b) and return the result.\n function rem(euint32 a, uint32 b) internal returns (euint32) {\n if (!isInitialized(a)) {\n a = asEuint32(0);\n }\n return euint32.wrap(Impl.rem(euint32.unwrap(a), uint256(b)));\n }\n\n // Evaluate eq(a, b) and return the result.\n function eq(euint32 a, uint32 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint32(0);\n }\n return ebool.wrap(Impl.eq(euint32.unwrap(a), uint256(b), true));\n }\n\n // Evaluate eq(a, b) and return the result.\n function eq(uint32 a, euint32 b) internal returns (ebool) {\n if (!isInitialized(b)) {\n b = asEuint32(0);\n }\n return ebool.wrap(Impl.eq(euint32.unwrap(b), uint256(a), true));\n }\n\n // Evaluate ne(a, b) and return the result.\n function ne(euint32 a, uint32 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint32(0);\n }\n return ebool.wrap(Impl.ne(euint32.unwrap(a), uint256(b), true));\n }\n\n // Evaluate ne(a, b) and return the result.\n function ne(uint32 a, euint32 b) internal returns (ebool) {\n if (!isInitialized(b)) {\n b = asEuint32(0);\n }\n return ebool.wrap(Impl.ne(euint32.unwrap(b), uint256(a), true));\n }\n\n // Evaluate ge(a, b) and return the result.\n function ge(euint32 a, uint32 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint32(0);\n }\n return ebool.wrap(Impl.ge(euint32.unwrap(a), uint256(b), true));\n }\n\n // Evaluate ge(a, b) and return the result.\n function ge(uint32 a, euint32 b) internal returns (ebool) {\n if (!isInitialized(b)) {\n b = asEuint32(0);\n }\n return ebool.wrap(Impl.le(euint32.unwrap(b), uint256(a), true));\n }\n\n // Evaluate gt(a, b) and return the result.\n function gt(euint32 a, uint32 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint32(0);\n }\n return ebool.wrap(Impl.gt(euint32.unwrap(a), uint256(b), true));\n }\n\n // Evaluate gt(a, b) and return the result.\n function gt(uint32 a, euint32 b) internal returns (ebool) {\n if (!isInitialized(b)) {\n b = asEuint32(0);\n }\n return ebool.wrap(Impl.lt(euint32.unwrap(b), uint256(a), true));\n }\n\n // Evaluate le(a, b) and return the result.\n function le(euint32 a, uint32 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint32(0);\n }\n return ebool.wrap(Impl.le(euint32.unwrap(a), uint256(b), true));\n }\n\n // Evaluate le(a, b) and return the result.\n function le(uint32 a, euint32 b) internal returns (ebool) {\n if (!isInitialized(b)) {\n b = asEuint32(0);\n }\n return ebool.wrap(Impl.ge(euint32.unwrap(b), uint256(a), true));\n }\n\n // Evaluate lt(a, b) and return the result.\n function lt(euint32 a, uint32 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint32(0);\n }\n return ebool.wrap(Impl.lt(euint32.unwrap(a), uint256(b), true));\n }\n\n // Evaluate lt(a, b) and return the result.\n function lt(uint32 a, euint32 b) internal returns (ebool) {\n if (!isInitialized(b)) {\n b = asEuint32(0);\n }\n return ebool.wrap(Impl.gt(euint32.unwrap(b), uint256(a), true));\n }\n\n // Evaluate min(a, b) and return the result.\n function min(euint32 a, uint32 b) internal returns (euint32) {\n if (!isInitialized(a)) {\n a = asEuint32(0);\n }\n return euint32.wrap(Impl.min(euint32.unwrap(a), uint256(b), true));\n }\n\n // Evaluate min(a, b) and return the result.\n function min(uint32 a, euint32 b) internal returns (euint32) {\n if (!isInitialized(b)) {\n b = asEuint32(0);\n }\n return euint32.wrap(Impl.min(euint32.unwrap(b), uint256(a), true));\n }\n\n // Evaluate max(a, b) and return the result.\n function max(euint32 a, uint32 b) internal returns (euint32) {\n if (!isInitialized(a)) {\n a = asEuint32(0);\n }\n return euint32.wrap(Impl.max(euint32.unwrap(a), uint256(b), true));\n }\n\n // Evaluate max(a, b) and return the result.\n function max(uint32 a, euint32 b) internal returns (euint32) {\n if (!isInitialized(b)) {\n b = asEuint32(0);\n }\n return euint32.wrap(Impl.max(euint32.unwrap(b), uint256(a), true));\n }\n\n // Evaluate add(a, b) and return the result.\n function add(euint64 a, euint4 b) internal returns (euint64) {\n if (!isInitialized(a)) {\n a = asEuint64(0);\n }\n if (!isInitialized(b)) {\n b = asEuint4(0);\n }\n return euint64.wrap(Impl.add(euint64.unwrap(a), euint64.unwrap(asEuint64(b)), false));\n }\n\n // Evaluate sub(a, b) and return the result.\n function sub(euint64 a, euint4 b) internal returns (euint64) {\n if (!isInitialized(a)) {\n a = asEuint64(0);\n }\n if (!isInitialized(b)) {\n b = asEuint4(0);\n }\n return euint64.wrap(Impl.sub(euint64.unwrap(a), euint64.unwrap(asEuint64(b)), false));\n }\n\n // Evaluate mul(a, b) and return the result.\n function mul(euint64 a, euint4 b) internal returns (euint64) {\n if (!isInitialized(a)) {\n a = asEuint64(0);\n }\n if (!isInitialized(b)) {\n b = asEuint4(0);\n }\n return euint64.wrap(Impl.mul(euint64.unwrap(a), euint64.unwrap(asEuint64(b)), false));\n }\n\n // Evaluate and(a, b) and return the result.\n function and(euint64 a, euint4 b) internal returns (euint64) {\n if (!isInitialized(a)) {\n a = asEuint64(0);\n }\n if (!isInitialized(b)) {\n b = asEuint4(0);\n }\n return euint64.wrap(Impl.and(euint64.unwrap(a), euint64.unwrap(asEuint64(b))));\n }\n\n // Evaluate or(a, b) and return the result.\n function or(euint64 a, euint4 b) internal returns (euint64) {\n if (!isInitialized(a)) {\n a = asEuint64(0);\n }\n if (!isInitialized(b)) {\n b = asEuint4(0);\n }\n return euint64.wrap(Impl.or(euint64.unwrap(a), euint64.unwrap(asEuint64(b))));\n }\n\n // Evaluate xor(a, b) and return the result.\n function xor(euint64 a, euint4 b) internal returns (euint64) {\n if (!isInitialized(a)) {\n a = asEuint64(0);\n }\n if (!isInitialized(b)) {\n b = asEuint4(0);\n }\n return euint64.wrap(Impl.xor(euint64.unwrap(a), euint64.unwrap(asEuint64(b))));\n }\n\n // Evaluate eq(a, b) and return the result.\n function eq(euint64 a, euint4 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint64(0);\n }\n if (!isInitialized(b)) {\n b = asEuint4(0);\n }\n return ebool.wrap(Impl.eq(euint64.unwrap(a), euint64.unwrap(asEuint64(b)), false));\n }\n\n // Evaluate ne(a, b) and return the result.\n function ne(euint64 a, euint4 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint64(0);\n }\n if (!isInitialized(b)) {\n b = asEuint4(0);\n }\n return ebool.wrap(Impl.ne(euint64.unwrap(a), euint64.unwrap(asEuint64(b)), false));\n }\n\n // Evaluate ge(a, b) and return the result.\n function ge(euint64 a, euint4 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint64(0);\n }\n if (!isInitialized(b)) {\n b = asEuint4(0);\n }\n return ebool.wrap(Impl.ge(euint64.unwrap(a), euint64.unwrap(asEuint64(b)), false));\n }\n\n // Evaluate gt(a, b) and return the result.\n function gt(euint64 a, euint4 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint64(0);\n }\n if (!isInitialized(b)) {\n b = asEuint4(0);\n }\n return ebool.wrap(Impl.gt(euint64.unwrap(a), euint64.unwrap(asEuint64(b)), false));\n }\n\n // Evaluate le(a, b) and return the result.\n function le(euint64 a, euint4 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint64(0);\n }\n if (!isInitialized(b)) {\n b = asEuint4(0);\n }\n return ebool.wrap(Impl.le(euint64.unwrap(a), euint64.unwrap(asEuint64(b)), false));\n }\n\n // Evaluate lt(a, b) and return the result.\n function lt(euint64 a, euint4 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint64(0);\n }\n if (!isInitialized(b)) {\n b = asEuint4(0);\n }\n return ebool.wrap(Impl.lt(euint64.unwrap(a), euint64.unwrap(asEuint64(b)), false));\n }\n\n // Evaluate min(a, b) and return the result.\n function min(euint64 a, euint4 b) internal returns (euint64) {\n if (!isInitialized(a)) {\n a = asEuint64(0);\n }\n if (!isInitialized(b)) {\n b = asEuint4(0);\n }\n return euint64.wrap(Impl.min(euint64.unwrap(a), euint64.unwrap(asEuint64(b)), false));\n }\n\n // Evaluate max(a, b) and return the result.\n function max(euint64 a, euint4 b) internal returns (euint64) {\n if (!isInitialized(a)) {\n a = asEuint64(0);\n }\n if (!isInitialized(b)) {\n b = asEuint4(0);\n }\n return euint64.wrap(Impl.max(euint64.unwrap(a), euint64.unwrap(asEuint64(b)), false));\n }\n\n // Evaluate add(a, b) and return the result.\n function add(euint64 a, euint8 b) internal returns (euint64) {\n if (!isInitialized(a)) {\n a = asEuint64(0);\n }\n if (!isInitialized(b)) {\n b = asEuint8(0);\n }\n return euint64.wrap(Impl.add(euint64.unwrap(a), euint64.unwrap(asEuint64(b)), false));\n }\n\n // Evaluate sub(a, b) and return the result.\n function sub(euint64 a, euint8 b) internal returns (euint64) {\n if (!isInitialized(a)) {\n a = asEuint64(0);\n }\n if (!isInitialized(b)) {\n b = asEuint8(0);\n }\n return euint64.wrap(Impl.sub(euint64.unwrap(a), euint64.unwrap(asEuint64(b)), false));\n }\n\n // Evaluate mul(a, b) and return the result.\n function mul(euint64 a, euint8 b) internal returns (euint64) {\n if (!isInitialized(a)) {\n a = asEuint64(0);\n }\n if (!isInitialized(b)) {\n b = asEuint8(0);\n }\n return euint64.wrap(Impl.mul(euint64.unwrap(a), euint64.unwrap(asEuint64(b)), false));\n }\n\n // Evaluate and(a, b) and return the result.\n function and(euint64 a, euint8 b) internal returns (euint64) {\n if (!isInitialized(a)) {\n a = asEuint64(0);\n }\n if (!isInitialized(b)) {\n b = asEuint8(0);\n }\n return euint64.wrap(Impl.and(euint64.unwrap(a), euint64.unwrap(asEuint64(b))));\n }\n\n // Evaluate or(a, b) and return the result.\n function or(euint64 a, euint8 b) internal returns (euint64) {\n if (!isInitialized(a)) {\n a = asEuint64(0);\n }\n if (!isInitialized(b)) {\n b = asEuint8(0);\n }\n return euint64.wrap(Impl.or(euint64.unwrap(a), euint64.unwrap(asEuint64(b))));\n }\n\n // Evaluate xor(a, b) and return the result.\n function xor(euint64 a, euint8 b) internal returns (euint64) {\n if (!isInitialized(a)) {\n a = asEuint64(0);\n }\n if (!isInitialized(b)) {\n b = asEuint8(0);\n }\n return euint64.wrap(Impl.xor(euint64.unwrap(a), euint64.unwrap(asEuint64(b))));\n }\n\n // Evaluate eq(a, b) and return the result.\n function eq(euint64 a, euint8 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint64(0);\n }\n if (!isInitialized(b)) {\n b = asEuint8(0);\n }\n return ebool.wrap(Impl.eq(euint64.unwrap(a), euint64.unwrap(asEuint64(b)), false));\n }\n\n // Evaluate ne(a, b) and return the result.\n function ne(euint64 a, euint8 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint64(0);\n }\n if (!isInitialized(b)) {\n b = asEuint8(0);\n }\n return ebool.wrap(Impl.ne(euint64.unwrap(a), euint64.unwrap(asEuint64(b)), false));\n }\n\n // Evaluate ge(a, b) and return the result.\n function ge(euint64 a, euint8 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint64(0);\n }\n if (!isInitialized(b)) {\n b = asEuint8(0);\n }\n return ebool.wrap(Impl.ge(euint64.unwrap(a), euint64.unwrap(asEuint64(b)), false));\n }\n\n // Evaluate gt(a, b) and return the result.\n function gt(euint64 a, euint8 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint64(0);\n }\n if (!isInitialized(b)) {\n b = asEuint8(0);\n }\n return ebool.wrap(Impl.gt(euint64.unwrap(a), euint64.unwrap(asEuint64(b)), false));\n }\n\n // Evaluate le(a, b) and return the result.\n function le(euint64 a, euint8 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint64(0);\n }\n if (!isInitialized(b)) {\n b = asEuint8(0);\n }\n return ebool.wrap(Impl.le(euint64.unwrap(a), euint64.unwrap(asEuint64(b)), false));\n }\n\n // Evaluate lt(a, b) and return the result.\n function lt(euint64 a, euint8 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint64(0);\n }\n if (!isInitialized(b)) {\n b = asEuint8(0);\n }\n return ebool.wrap(Impl.lt(euint64.unwrap(a), euint64.unwrap(asEuint64(b)), false));\n }\n\n // Evaluate min(a, b) and return the result.\n function min(euint64 a, euint8 b) internal returns (euint64) {\n if (!isInitialized(a)) {\n a = asEuint64(0);\n }\n if (!isInitialized(b)) {\n b = asEuint8(0);\n }\n return euint64.wrap(Impl.min(euint64.unwrap(a), euint64.unwrap(asEuint64(b)), false));\n }\n\n // Evaluate max(a, b) and return the result.\n function max(euint64 a, euint8 b) internal returns (euint64) {\n if (!isInitialized(a)) {\n a = asEuint64(0);\n }\n if (!isInitialized(b)) {\n b = asEuint8(0);\n }\n return euint64.wrap(Impl.max(euint64.unwrap(a), euint64.unwrap(asEuint64(b)), false));\n }\n\n // Evaluate add(a, b) and return the result.\n function add(euint64 a, euint16 b) internal returns (euint64) {\n if (!isInitialized(a)) {\n a = asEuint64(0);\n }\n if (!isInitialized(b)) {\n b = asEuint16(0);\n }\n return euint64.wrap(Impl.add(euint64.unwrap(a), euint64.unwrap(asEuint64(b)), false));\n }\n\n // Evaluate sub(a, b) and return the result.\n function sub(euint64 a, euint16 b) internal returns (euint64) {\n if (!isInitialized(a)) {\n a = asEuint64(0);\n }\n if (!isInitialized(b)) {\n b = asEuint16(0);\n }\n return euint64.wrap(Impl.sub(euint64.unwrap(a), euint64.unwrap(asEuint64(b)), false));\n }\n\n // Evaluate mul(a, b) and return the result.\n function mul(euint64 a, euint16 b) internal returns (euint64) {\n if (!isInitialized(a)) {\n a = asEuint64(0);\n }\n if (!isInitialized(b)) {\n b = asEuint16(0);\n }\n return euint64.wrap(Impl.mul(euint64.unwrap(a), euint64.unwrap(asEuint64(b)), false));\n }\n\n // Evaluate and(a, b) and return the result.\n function and(euint64 a, euint16 b) internal returns (euint64) {\n if (!isInitialized(a)) {\n a = asEuint64(0);\n }\n if (!isInitialized(b)) {\n b = asEuint16(0);\n }\n return euint64.wrap(Impl.and(euint64.unwrap(a), euint64.unwrap(asEuint64(b))));\n }\n\n // Evaluate or(a, b) and return the result.\n function or(euint64 a, euint16 b) internal returns (euint64) {\n if (!isInitialized(a)) {\n a = asEuint64(0);\n }\n if (!isInitialized(b)) {\n b = asEuint16(0);\n }\n return euint64.wrap(Impl.or(euint64.unwrap(a), euint64.unwrap(asEuint64(b))));\n }\n\n // Evaluate xor(a, b) and return the result.\n function xor(euint64 a, euint16 b) internal returns (euint64) {\n if (!isInitialized(a)) {\n a = asEuint64(0);\n }\n if (!isInitialized(b)) {\n b = asEuint16(0);\n }\n return euint64.wrap(Impl.xor(euint64.unwrap(a), euint64.unwrap(asEuint64(b))));\n }\n\n // Evaluate eq(a, b) and return the result.\n function eq(euint64 a, euint16 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint64(0);\n }\n if (!isInitialized(b)) {\n b = asEuint16(0);\n }\n return ebool.wrap(Impl.eq(euint64.unwrap(a), euint64.unwrap(asEuint64(b)), false));\n }\n\n // Evaluate ne(a, b) and return the result.\n function ne(euint64 a, euint16 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint64(0);\n }\n if (!isInitialized(b)) {\n b = asEuint16(0);\n }\n return ebool.wrap(Impl.ne(euint64.unwrap(a), euint64.unwrap(asEuint64(b)), false));\n }\n\n // Evaluate ge(a, b) and return the result.\n function ge(euint64 a, euint16 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint64(0);\n }\n if (!isInitialized(b)) {\n b = asEuint16(0);\n }\n return ebool.wrap(Impl.ge(euint64.unwrap(a), euint64.unwrap(asEuint64(b)), false));\n }\n\n // Evaluate gt(a, b) and return the result.\n function gt(euint64 a, euint16 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint64(0);\n }\n if (!isInitialized(b)) {\n b = asEuint16(0);\n }\n return ebool.wrap(Impl.gt(euint64.unwrap(a), euint64.unwrap(asEuint64(b)), false));\n }\n\n // Evaluate le(a, b) and return the result.\n function le(euint64 a, euint16 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint64(0);\n }\n if (!isInitialized(b)) {\n b = asEuint16(0);\n }\n return ebool.wrap(Impl.le(euint64.unwrap(a), euint64.unwrap(asEuint64(b)), false));\n }\n\n // Evaluate lt(a, b) and return the result.\n function lt(euint64 a, euint16 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint64(0);\n }\n if (!isInitialized(b)) {\n b = asEuint16(0);\n }\n return ebool.wrap(Impl.lt(euint64.unwrap(a), euint64.unwrap(asEuint64(b)), false));\n }\n\n // Evaluate min(a, b) and return the result.\n function min(euint64 a, euint16 b) internal returns (euint64) {\n if (!isInitialized(a)) {\n a = asEuint64(0);\n }\n if (!isInitialized(b)) {\n b = asEuint16(0);\n }\n return euint64.wrap(Impl.min(euint64.unwrap(a), euint64.unwrap(asEuint64(b)), false));\n }\n\n // Evaluate max(a, b) and return the result.\n function max(euint64 a, euint16 b) internal returns (euint64) {\n if (!isInitialized(a)) {\n a = asEuint64(0);\n }\n if (!isInitialized(b)) {\n b = asEuint16(0);\n }\n return euint64.wrap(Impl.max(euint64.unwrap(a), euint64.unwrap(asEuint64(b)), false));\n }\n\n // Evaluate add(a, b) and return the result.\n function add(euint64 a, euint32 b) internal returns (euint64) {\n if (!isInitialized(a)) {\n a = asEuint64(0);\n }\n if (!isInitialized(b)) {\n b = asEuint32(0);\n }\n return euint64.wrap(Impl.add(euint64.unwrap(a), euint64.unwrap(asEuint64(b)), false));\n }\n\n // Evaluate sub(a, b) and return the result.\n function sub(euint64 a, euint32 b) internal returns (euint64) {\n if (!isInitialized(a)) {\n a = asEuint64(0);\n }\n if (!isInitialized(b)) {\n b = asEuint32(0);\n }\n return euint64.wrap(Impl.sub(euint64.unwrap(a), euint64.unwrap(asEuint64(b)), false));\n }\n\n // Evaluate mul(a, b) and return the result.\n function mul(euint64 a, euint32 b) internal returns (euint64) {\n if (!isInitialized(a)) {\n a = asEuint64(0);\n }\n if (!isInitialized(b)) {\n b = asEuint32(0);\n }\n return euint64.wrap(Impl.mul(euint64.unwrap(a), euint64.unwrap(asEuint64(b)), false));\n }\n\n // Evaluate and(a, b) and return the result.\n function and(euint64 a, euint32 b) internal returns (euint64) {\n if (!isInitialized(a)) {\n a = asEuint64(0);\n }\n if (!isInitialized(b)) {\n b = asEuint32(0);\n }\n return euint64.wrap(Impl.and(euint64.unwrap(a), euint64.unwrap(asEuint64(b))));\n }\n\n // Evaluate or(a, b) and return the result.\n function or(euint64 a, euint32 b) internal returns (euint64) {\n if (!isInitialized(a)) {\n a = asEuint64(0);\n }\n if (!isInitialized(b)) {\n b = asEuint32(0);\n }\n return euint64.wrap(Impl.or(euint64.unwrap(a), euint64.unwrap(asEuint64(b))));\n }\n\n // Evaluate xor(a, b) and return the result.\n function xor(euint64 a, euint32 b) internal returns (euint64) {\n if (!isInitialized(a)) {\n a = asEuint64(0);\n }\n if (!isInitialized(b)) {\n b = asEuint32(0);\n }\n return euint64.wrap(Impl.xor(euint64.unwrap(a), euint64.unwrap(asEuint64(b))));\n }\n\n // Evaluate eq(a, b) and return the result.\n function eq(euint64 a, euint32 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint64(0);\n }\n if (!isInitialized(b)) {\n b = asEuint32(0);\n }\n return ebool.wrap(Impl.eq(euint64.unwrap(a), euint64.unwrap(asEuint64(b)), false));\n }\n\n // Evaluate ne(a, b) and return the result.\n function ne(euint64 a, euint32 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint64(0);\n }\n if (!isInitialized(b)) {\n b = asEuint32(0);\n }\n return ebool.wrap(Impl.ne(euint64.unwrap(a), euint64.unwrap(asEuint64(b)), false));\n }\n\n // Evaluate ge(a, b) and return the result.\n function ge(euint64 a, euint32 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint64(0);\n }\n if (!isInitialized(b)) {\n b = asEuint32(0);\n }\n return ebool.wrap(Impl.ge(euint64.unwrap(a), euint64.unwrap(asEuint64(b)), false));\n }\n\n // Evaluate gt(a, b) and return the result.\n function gt(euint64 a, euint32 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint64(0);\n }\n if (!isInitialized(b)) {\n b = asEuint32(0);\n }\n return ebool.wrap(Impl.gt(euint64.unwrap(a), euint64.unwrap(asEuint64(b)), false));\n }\n\n // Evaluate le(a, b) and return the result.\n function le(euint64 a, euint32 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint64(0);\n }\n if (!isInitialized(b)) {\n b = asEuint32(0);\n }\n return ebool.wrap(Impl.le(euint64.unwrap(a), euint64.unwrap(asEuint64(b)), false));\n }\n\n // Evaluate lt(a, b) and return the result.\n function lt(euint64 a, euint32 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint64(0);\n }\n if (!isInitialized(b)) {\n b = asEuint32(0);\n }\n return ebool.wrap(Impl.lt(euint64.unwrap(a), euint64.unwrap(asEuint64(b)), false));\n }\n\n // Evaluate min(a, b) and return the result.\n function min(euint64 a, euint32 b) internal returns (euint64) {\n if (!isInitialized(a)) {\n a = asEuint64(0);\n }\n if (!isInitialized(b)) {\n b = asEuint32(0);\n }\n return euint64.wrap(Impl.min(euint64.unwrap(a), euint64.unwrap(asEuint64(b)), false));\n }\n\n // Evaluate max(a, b) and return the result.\n function max(euint64 a, euint32 b) internal returns (euint64) {\n if (!isInitialized(a)) {\n a = asEuint64(0);\n }\n if (!isInitialized(b)) {\n b = asEuint32(0);\n }\n return euint64.wrap(Impl.max(euint64.unwrap(a), euint64.unwrap(asEuint64(b)), false));\n }\n\n // Evaluate add(a, b) and return the result.\n function add(euint64 a, euint64 b) internal returns (euint64) {\n if (!isInitialized(a)) {\n a = asEuint64(0);\n }\n if (!isInitialized(b)) {\n b = asEuint64(0);\n }\n return euint64.wrap(Impl.add(euint64.unwrap(a), euint64.unwrap(b), false));\n }\n\n // Evaluate sub(a, b) and return the result.\n function sub(euint64 a, euint64 b) internal returns (euint64) {\n if (!isInitialized(a)) {\n a = asEuint64(0);\n }\n if (!isInitialized(b)) {\n b = asEuint64(0);\n }\n return euint64.wrap(Impl.sub(euint64.unwrap(a), euint64.unwrap(b), false));\n }\n\n // Evaluate mul(a, b) and return the result.\n function mul(euint64 a, euint64 b) internal returns (euint64) {\n if (!isInitialized(a)) {\n a = asEuint64(0);\n }\n if (!isInitialized(b)) {\n b = asEuint64(0);\n }\n return euint64.wrap(Impl.mul(euint64.unwrap(a), euint64.unwrap(b), false));\n }\n\n // Evaluate and(a, b) and return the result.\n function and(euint64 a, euint64 b) internal returns (euint64) {\n if (!isInitialized(a)) {\n a = asEuint64(0);\n }\n if (!isInitialized(b)) {\n b = asEuint64(0);\n }\n return euint64.wrap(Impl.and(euint64.unwrap(a), euint64.unwrap(b)));\n }\n\n // Evaluate or(a, b) and return the result.\n function or(euint64 a, euint64 b) internal returns (euint64) {\n if (!isInitialized(a)) {\n a = asEuint64(0);\n }\n if (!isInitialized(b)) {\n b = asEuint64(0);\n }\n return euint64.wrap(Impl.or(euint64.unwrap(a), euint64.unwrap(b)));\n }\n\n // Evaluate xor(a, b) and return the result.\n function xor(euint64 a, euint64 b) internal returns (euint64) {\n if (!isInitialized(a)) {\n a = asEuint64(0);\n }\n if (!isInitialized(b)) {\n b = asEuint64(0);\n }\n return euint64.wrap(Impl.xor(euint64.unwrap(a), euint64.unwrap(b)));\n }\n\n // Evaluate eq(a, b) and return the result.\n function eq(euint64 a, euint64 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint64(0);\n }\n if (!isInitialized(b)) {\n b = asEuint64(0);\n }\n return ebool.wrap(Impl.eq(euint64.unwrap(a), euint64.unwrap(b), false));\n }\n\n // Evaluate ne(a, b) and return the result.\n function ne(euint64 a, euint64 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint64(0);\n }\n if (!isInitialized(b)) {\n b = asEuint64(0);\n }\n return ebool.wrap(Impl.ne(euint64.unwrap(a), euint64.unwrap(b), false));\n }\n\n // Evaluate ge(a, b) and return the result.\n function ge(euint64 a, euint64 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint64(0);\n }\n if (!isInitialized(b)) {\n b = asEuint64(0);\n }\n return ebool.wrap(Impl.ge(euint64.unwrap(a), euint64.unwrap(b), false));\n }\n\n // Evaluate gt(a, b) and return the result.\n function gt(euint64 a, euint64 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint64(0);\n }\n if (!isInitialized(b)) {\n b = asEuint64(0);\n }\n return ebool.wrap(Impl.gt(euint64.unwrap(a), euint64.unwrap(b), false));\n }\n\n // Evaluate le(a, b) and return the result.\n function le(euint64 a, euint64 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint64(0);\n }\n if (!isInitialized(b)) {\n b = asEuint64(0);\n }\n return ebool.wrap(Impl.le(euint64.unwrap(a), euint64.unwrap(b), false));\n }\n\n // Evaluate lt(a, b) and return the result.\n function lt(euint64 a, euint64 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint64(0);\n }\n if (!isInitialized(b)) {\n b = asEuint64(0);\n }\n return ebool.wrap(Impl.lt(euint64.unwrap(a), euint64.unwrap(b), false));\n }\n\n // Evaluate min(a, b) and return the result.\n function min(euint64 a, euint64 b) internal returns (euint64) {\n if (!isInitialized(a)) {\n a = asEuint64(0);\n }\n if (!isInitialized(b)) {\n b = asEuint64(0);\n }\n return euint64.wrap(Impl.min(euint64.unwrap(a), euint64.unwrap(b), false));\n }\n\n // Evaluate max(a, b) and return the result.\n function max(euint64 a, euint64 b) internal returns (euint64) {\n if (!isInitialized(a)) {\n a = asEuint64(0);\n }\n if (!isInitialized(b)) {\n b = asEuint64(0);\n }\n return euint64.wrap(Impl.max(euint64.unwrap(a), euint64.unwrap(b), false));\n }\n\n // Evaluate add(a, b) and return the result.\n function add(euint64 a, uint64 b) internal returns (euint64) {\n if (!isInitialized(a)) {\n a = asEuint64(0);\n }\n return euint64.wrap(Impl.add(euint64.unwrap(a), uint256(b), true));\n }\n\n // Evaluate add(a, b) and return the result.\n function add(uint64 a, euint64 b) internal returns (euint64) {\n if (!isInitialized(b)) {\n b = asEuint64(0);\n }\n return euint64.wrap(Impl.add(euint64.unwrap(b), uint256(a), true));\n }\n\n // Evaluate sub(a, b) and return the result.\n function sub(euint64 a, uint64 b) internal returns (euint64) {\n if (!isInitialized(a)) {\n a = asEuint64(0);\n }\n return euint64.wrap(Impl.sub(euint64.unwrap(a), uint256(b), true));\n }\n\n // Evaluate sub(a, b) and return the result.\n function sub(uint64 a, euint64 b) internal returns (euint64) {\n euint64 aEnc = asEuint64(a);\n if (!isInitialized(b)) {\n b = asEuint64(0);\n }\n return euint64.wrap(Impl.sub(euint64.unwrap(aEnc), euint64.unwrap(b), false));\n }\n\n // Evaluate mul(a, b) and return the result.\n function mul(euint64 a, uint64 b) internal returns (euint64) {\n if (!isInitialized(a)) {\n a = asEuint64(0);\n }\n return euint64.wrap(Impl.mul(euint64.unwrap(a), uint256(b), true));\n }\n\n // Evaluate mul(a, b) and return the result.\n function mul(uint64 a, euint64 b) internal returns (euint64) {\n if (!isInitialized(b)) {\n b = asEuint64(0);\n }\n return euint64.wrap(Impl.mul(euint64.unwrap(b), uint256(a), true));\n }\n\n // Evaluate div(a, b) and return the result.\n function div(euint64 a, uint64 b) internal returns (euint64) {\n if (!isInitialized(a)) {\n a = asEuint64(0);\n }\n return euint64.wrap(Impl.div(euint64.unwrap(a), uint256(b)));\n }\n\n // Evaluate rem(a, b) and return the result.\n function rem(euint64 a, uint64 b) internal returns (euint64) {\n if (!isInitialized(a)) {\n a = asEuint64(0);\n }\n return euint64.wrap(Impl.rem(euint64.unwrap(a), uint256(b)));\n }\n\n // Evaluate eq(a, b) and return the result.\n function eq(euint64 a, uint64 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint64(0);\n }\n return ebool.wrap(Impl.eq(euint64.unwrap(a), uint256(b), true));\n }\n\n // Evaluate eq(a, b) and return the result.\n function eq(uint64 a, euint64 b) internal returns (ebool) {\n if (!isInitialized(b)) {\n b = asEuint64(0);\n }\n return ebool.wrap(Impl.eq(euint64.unwrap(b), uint256(a), true));\n }\n\n // Evaluate ne(a, b) and return the result.\n function ne(euint64 a, uint64 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint64(0);\n }\n return ebool.wrap(Impl.ne(euint64.unwrap(a), uint256(b), true));\n }\n\n // Evaluate ne(a, b) and return the result.\n function ne(uint64 a, euint64 b) internal returns (ebool) {\n if (!isInitialized(b)) {\n b = asEuint64(0);\n }\n return ebool.wrap(Impl.ne(euint64.unwrap(b), uint256(a), true));\n }\n\n // Evaluate ge(a, b) and return the result.\n function ge(euint64 a, uint64 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint64(0);\n }\n return ebool.wrap(Impl.ge(euint64.unwrap(a), uint256(b), true));\n }\n\n // Evaluate ge(a, b) and return the result.\n function ge(uint64 a, euint64 b) internal returns (ebool) {\n if (!isInitialized(b)) {\n b = asEuint64(0);\n }\n return ebool.wrap(Impl.le(euint64.unwrap(b), uint256(a), true));\n }\n\n // Evaluate gt(a, b) and return the result.\n function gt(euint64 a, uint64 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint64(0);\n }\n return ebool.wrap(Impl.gt(euint64.unwrap(a), uint256(b), true));\n }\n\n // Evaluate gt(a, b) and return the result.\n function gt(uint64 a, euint64 b) internal returns (ebool) {\n if (!isInitialized(b)) {\n b = asEuint64(0);\n }\n return ebool.wrap(Impl.lt(euint64.unwrap(b), uint256(a), true));\n }\n\n // Evaluate le(a, b) and return the result.\n function le(euint64 a, uint64 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint64(0);\n }\n return ebool.wrap(Impl.le(euint64.unwrap(a), uint256(b), true));\n }\n\n // Evaluate le(a, b) and return the result.\n function le(uint64 a, euint64 b) internal returns (ebool) {\n if (!isInitialized(b)) {\n b = asEuint64(0);\n }\n return ebool.wrap(Impl.ge(euint64.unwrap(b), uint256(a), true));\n }\n\n // Evaluate lt(a, b) and return the result.\n function lt(euint64 a, uint64 b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEuint64(0);\n }\n return ebool.wrap(Impl.lt(euint64.unwrap(a), uint256(b), true));\n }\n\n // Evaluate lt(a, b) and return the result.\n function lt(uint64 a, euint64 b) internal returns (ebool) {\n if (!isInitialized(b)) {\n b = asEuint64(0);\n }\n return ebool.wrap(Impl.gt(euint64.unwrap(b), uint256(a), true));\n }\n\n // Evaluate min(a, b) and return the result.\n function min(euint64 a, uint64 b) internal returns (euint64) {\n if (!isInitialized(a)) {\n a = asEuint64(0);\n }\n return euint64.wrap(Impl.min(euint64.unwrap(a), uint256(b), true));\n }\n\n // Evaluate min(a, b) and return the result.\n function min(uint64 a, euint64 b) internal returns (euint64) {\n if (!isInitialized(b)) {\n b = asEuint64(0);\n }\n return euint64.wrap(Impl.min(euint64.unwrap(b), uint256(a), true));\n }\n\n // Evaluate max(a, b) and return the result.\n function max(euint64 a, uint64 b) internal returns (euint64) {\n if (!isInitialized(a)) {\n a = asEuint64(0);\n }\n return euint64.wrap(Impl.max(euint64.unwrap(a), uint256(b), true));\n }\n\n // Evaluate max(a, b) and return the result.\n function max(uint64 a, euint64 b) internal returns (euint64) {\n if (!isInitialized(b)) {\n b = asEuint64(0);\n }\n return euint64.wrap(Impl.max(euint64.unwrap(b), uint256(a), true));\n }\n\n // Evaluate shl(a, b) and return the result.\n function shl(euint4 a, uint8 b) internal returns (euint4) {\n if (!isInitialized(a)) {\n a = asEuint4(0);\n }\n return euint4.wrap(Impl.shl(euint4.unwrap(a), uint256(b), true));\n }\n\n // Evaluate shr(a, b) and return the result.\n function shr(euint4 a, uint8 b) internal returns (euint4) {\n if (!isInitialized(a)) {\n a = asEuint4(0);\n }\n return euint4.wrap(Impl.shr(euint4.unwrap(a), uint256(b), true));\n }\n\n // Evaluate rotl(a, b) and return the result.\n function rotl(euint4 a, uint8 b) internal returns (euint4) {\n if (!isInitialized(a)) {\n a = asEuint4(0);\n }\n return euint4.wrap(Impl.rotl(euint4.unwrap(a), uint256(b), true));\n }\n\n // Evaluate rotr(a, b) and return the result.\n function rotr(euint4 a, uint8 b) internal returns (euint4) {\n if (!isInitialized(a)) {\n a = asEuint4(0);\n }\n return euint4.wrap(Impl.rotr(euint4.unwrap(a), uint256(b), true));\n }\n\n // Evaluate shl(a, b) and return the result.\n function shl(euint8 a, euint8 b) internal returns (euint8) {\n if (!isInitialized(a)) {\n a = asEuint8(0);\n }\n if (!isInitialized(b)) {\n b = asEuint8(0);\n }\n return euint8.wrap(Impl.shl(euint8.unwrap(a), euint8.unwrap(b), false));\n }\n\n // Evaluate shl(a, b) and return the result.\n function shl(euint8 a, uint8 b) internal returns (euint8) {\n if (!isInitialized(a)) {\n a = asEuint8(0);\n }\n return euint8.wrap(Impl.shl(euint8.unwrap(a), uint256(b), true));\n }\n\n // Evaluate shr(a, b) and return the result.\n function shr(euint8 a, euint8 b) internal returns (euint8) {\n if (!isInitialized(a)) {\n a = asEuint8(0);\n }\n if (!isInitialized(b)) {\n b = asEuint8(0);\n }\n return euint8.wrap(Impl.shr(euint8.unwrap(a), euint8.unwrap(b), false));\n }\n\n // Evaluate shr(a, b) and return the result.\n function shr(euint8 a, uint8 b) internal returns (euint8) {\n if (!isInitialized(a)) {\n a = asEuint8(0);\n }\n return euint8.wrap(Impl.shr(euint8.unwrap(a), uint256(b), true));\n }\n\n // Evaluate rotl(a, b) and return the result.\n function rotl(euint8 a, euint8 b) internal returns (euint8) {\n if (!isInitialized(a)) {\n a = asEuint8(0);\n }\n if (!isInitialized(b)) {\n b = asEuint8(0);\n }\n return euint8.wrap(Impl.rotl(euint8.unwrap(a), euint8.unwrap(b), false));\n }\n\n // Evaluate rotl(a, b) and return the result.\n function rotl(euint8 a, uint8 b) internal returns (euint8) {\n if (!isInitialized(a)) {\n a = asEuint8(0);\n }\n return euint8.wrap(Impl.rotl(euint8.unwrap(a), uint256(b), true));\n }\n\n // Evaluate rotr(a, b) and return the result.\n function rotr(euint8 a, euint8 b) internal returns (euint8) {\n if (!isInitialized(a)) {\n a = asEuint8(0);\n }\n if (!isInitialized(b)) {\n b = asEuint8(0);\n }\n return euint8.wrap(Impl.rotr(euint8.unwrap(a), euint8.unwrap(b), false));\n }\n\n // Evaluate rotr(a, b) and return the result.\n function rotr(euint8 a, uint8 b) internal returns (euint8) {\n if (!isInitialized(a)) {\n a = asEuint8(0);\n }\n return euint8.wrap(Impl.rotr(euint8.unwrap(a), uint256(b), true));\n }\n\n // Evaluate shl(a, b) and return the result.\n function shl(euint16 a, euint8 b) internal returns (euint16) {\n if (!isInitialized(a)) {\n a = asEuint16(0);\n }\n if (!isInitialized(b)) {\n b = asEuint8(0);\n }\n return euint16.wrap(Impl.shl(euint16.unwrap(a), euint16.unwrap(asEuint16(b)), false));\n }\n\n // Evaluate shl(a, b) and return the result.\n function shl(euint16 a, uint8 b) internal returns (euint16) {\n if (!isInitialized(a)) {\n a = asEuint16(0);\n }\n return euint16.wrap(Impl.shl(euint16.unwrap(a), uint256(b), true));\n }\n\n // Evaluate shr(a, b) and return the result.\n function shr(euint16 a, euint8 b) internal returns (euint16) {\n if (!isInitialized(a)) {\n a = asEuint16(0);\n }\n if (!isInitialized(b)) {\n b = asEuint8(0);\n }\n return euint16.wrap(Impl.shr(euint16.unwrap(a), euint16.unwrap(asEuint16(b)), false));\n }\n\n // Evaluate shr(a, b) and return the result.\n function shr(euint16 a, uint8 b) internal returns (euint16) {\n if (!isInitialized(a)) {\n a = asEuint16(0);\n }\n return euint16.wrap(Impl.shr(euint16.unwrap(a), uint256(b), true));\n }\n\n // Evaluate rotl(a, b) and return the result.\n function rotl(euint16 a, euint8 b) internal returns (euint16) {\n if (!isInitialized(a)) {\n a = asEuint16(0);\n }\n if (!isInitialized(b)) {\n b = asEuint8(0);\n }\n return euint16.wrap(Impl.rotl(euint16.unwrap(a), euint16.unwrap(asEuint16(b)), false));\n }\n\n // Evaluate rotl(a, b) and return the result.\n function rotl(euint16 a, uint8 b) internal returns (euint16) {\n if (!isInitialized(a)) {\n a = asEuint16(0);\n }\n return euint16.wrap(Impl.rotl(euint16.unwrap(a), uint256(b), true));\n }\n\n // Evaluate rotr(a, b) and return the result.\n function rotr(euint16 a, euint8 b) internal returns (euint16) {\n if (!isInitialized(a)) {\n a = asEuint16(0);\n }\n if (!isInitialized(b)) {\n b = asEuint8(0);\n }\n return euint16.wrap(Impl.rotr(euint16.unwrap(a), euint16.unwrap(asEuint16(b)), false));\n }\n\n // Evaluate rotr(a, b) and return the result.\n function rotr(euint16 a, uint8 b) internal returns (euint16) {\n if (!isInitialized(a)) {\n a = asEuint16(0);\n }\n return euint16.wrap(Impl.rotr(euint16.unwrap(a), uint256(b), true));\n }\n\n // Evaluate shl(a, b) and return the result.\n function shl(euint32 a, euint8 b) internal returns (euint32) {\n if (!isInitialized(a)) {\n a = asEuint32(0);\n }\n if (!isInitialized(b)) {\n b = asEuint8(0);\n }\n return euint32.wrap(Impl.shl(euint32.unwrap(a), euint32.unwrap(asEuint32(b)), false));\n }\n\n // Evaluate shl(a, b) and return the result.\n function shl(euint32 a, uint8 b) internal returns (euint32) {\n if (!isInitialized(a)) {\n a = asEuint32(0);\n }\n return euint32.wrap(Impl.shl(euint32.unwrap(a), uint256(b), true));\n }\n\n // Evaluate shr(a, b) and return the result.\n function shr(euint32 a, euint8 b) internal returns (euint32) {\n if (!isInitialized(a)) {\n a = asEuint32(0);\n }\n if (!isInitialized(b)) {\n b = asEuint8(0);\n }\n return euint32.wrap(Impl.shr(euint32.unwrap(a), euint32.unwrap(asEuint32(b)), false));\n }\n\n // Evaluate shr(a, b) and return the result.\n function shr(euint32 a, uint8 b) internal returns (euint32) {\n if (!isInitialized(a)) {\n a = asEuint32(0);\n }\n return euint32.wrap(Impl.shr(euint32.unwrap(a), uint256(b), true));\n }\n\n // Evaluate rotl(a, b) and return the result.\n function rotl(euint32 a, euint8 b) internal returns (euint32) {\n if (!isInitialized(a)) {\n a = asEuint32(0);\n }\n if (!isInitialized(b)) {\n b = asEuint8(0);\n }\n return euint32.wrap(Impl.rotl(euint32.unwrap(a), euint32.unwrap(asEuint32(b)), false));\n }\n\n // Evaluate rotl(a, b) and return the result.\n function rotl(euint32 a, uint8 b) internal returns (euint32) {\n if (!isInitialized(a)) {\n a = asEuint32(0);\n }\n return euint32.wrap(Impl.rotl(euint32.unwrap(a), uint256(b), true));\n }\n\n // Evaluate rotr(a, b) and return the result.\n function rotr(euint32 a, euint8 b) internal returns (euint32) {\n if (!isInitialized(a)) {\n a = asEuint32(0);\n }\n if (!isInitialized(b)) {\n b = asEuint8(0);\n }\n return euint32.wrap(Impl.rotr(euint32.unwrap(a), euint32.unwrap(asEuint32(b)), false));\n }\n\n // Evaluate rotr(a, b) and return the result.\n function rotr(euint32 a, uint8 b) internal returns (euint32) {\n if (!isInitialized(a)) {\n a = asEuint32(0);\n }\n return euint32.wrap(Impl.rotr(euint32.unwrap(a), uint256(b), true));\n }\n\n // Evaluate shl(a, b) and return the result.\n function shl(euint64 a, euint8 b) internal returns (euint64) {\n if (!isInitialized(a)) {\n a = asEuint64(0);\n }\n if (!isInitialized(b)) {\n b = asEuint8(0);\n }\n return euint64.wrap(Impl.shl(euint64.unwrap(a), euint64.unwrap(asEuint64(b)), false));\n }\n\n // Evaluate shl(a, b) and return the result.\n function shl(euint64 a, uint8 b) internal returns (euint64) {\n if (!isInitialized(a)) {\n a = asEuint64(0);\n }\n return euint64.wrap(Impl.shl(euint64.unwrap(a), uint256(b), true));\n }\n\n // Evaluate shr(a, b) and return the result.\n function shr(euint64 a, euint8 b) internal returns (euint64) {\n if (!isInitialized(a)) {\n a = asEuint64(0);\n }\n if (!isInitialized(b)) {\n b = asEuint8(0);\n }\n return euint64.wrap(Impl.shr(euint64.unwrap(a), euint64.unwrap(asEuint64(b)), false));\n }\n\n // Evaluate shr(a, b) and return the result.\n function shr(euint64 a, uint8 b) internal returns (euint64) {\n if (!isInitialized(a)) {\n a = asEuint64(0);\n }\n return euint64.wrap(Impl.shr(euint64.unwrap(a), uint256(b), true));\n }\n\n // Evaluate rotl(a, b) and return the result.\n function rotl(euint64 a, euint8 b) internal returns (euint64) {\n if (!isInitialized(a)) {\n a = asEuint64(0);\n }\n if (!isInitialized(b)) {\n b = asEuint8(0);\n }\n return euint64.wrap(Impl.rotl(euint64.unwrap(a), euint64.unwrap(asEuint64(b)), false));\n }\n\n // Evaluate rotl(a, b) and return the result.\n function rotl(euint64 a, uint8 b) internal returns (euint64) {\n if (!isInitialized(a)) {\n a = asEuint64(0);\n }\n return euint64.wrap(Impl.rotl(euint64.unwrap(a), uint256(b), true));\n }\n\n // Evaluate rotr(a, b) and return the result.\n function rotr(euint64 a, euint8 b) internal returns (euint64) {\n if (!isInitialized(a)) {\n a = asEuint64(0);\n }\n if (!isInitialized(b)) {\n b = asEuint8(0);\n }\n return euint64.wrap(Impl.rotr(euint64.unwrap(a), euint64.unwrap(asEuint64(b)), false));\n }\n\n // Evaluate rotr(a, b) and return the result.\n function rotr(euint64 a, uint8 b) internal returns (euint64) {\n if (!isInitialized(a)) {\n a = asEuint64(0);\n }\n return euint64.wrap(Impl.rotr(euint64.unwrap(a), uint256(b), true));\n }\n\n // If 'control''s value is 'true', the result has the same value as 'a'.\n // If 'control''s value is 'false', the result has the same value as 'b'.\n function select(ebool control, euint4 a, euint4 b) internal returns (euint4) {\n return euint4.wrap(Impl.select(ebool.unwrap(control), euint4.unwrap(a), euint4.unwrap(b)));\n }\n // If 'control''s value is 'true', the result has the same value as 'a'.\n // If 'control''s value is 'false', the result has the same value as 'b'.\n function select(ebool control, euint8 a, euint8 b) internal returns (euint8) {\n return euint8.wrap(Impl.select(ebool.unwrap(control), euint8.unwrap(a), euint8.unwrap(b)));\n }\n // If 'control''s value is 'true', the result has the same value as 'a'.\n // If 'control''s value is 'false', the result has the same value as 'b'.\n function select(ebool control, euint16 a, euint16 b) internal returns (euint16) {\n return euint16.wrap(Impl.select(ebool.unwrap(control), euint16.unwrap(a), euint16.unwrap(b)));\n }\n // If 'control''s value is 'true', the result has the same value as 'a'.\n // If 'control''s value is 'false', the result has the same value as 'b'.\n function select(ebool control, euint32 a, euint32 b) internal returns (euint32) {\n return euint32.wrap(Impl.select(ebool.unwrap(control), euint32.unwrap(a), euint32.unwrap(b)));\n }\n // If 'control''s value is 'true', the result has the same value as 'a'.\n // If 'control''s value is 'false', the result has the same value as 'b'.\n function select(ebool control, euint64 a, euint64 b) internal returns (euint64) {\n return euint64.wrap(Impl.select(ebool.unwrap(control), euint64.unwrap(a), euint64.unwrap(b)));\n }\n // Cast an encrypted integer from euint8 to euint4.\n function asEuint4(euint8 value) internal returns (euint4) {\n return euint4.wrap(Impl.cast(euint8.unwrap(value), Common.euint4_t));\n }\n\n // Cast an encrypted integer from euint16 to euint4.\n function asEuint4(euint16 value) internal returns (euint4) {\n return euint4.wrap(Impl.cast(euint16.unwrap(value), Common.euint4_t));\n }\n\n // Cast an encrypted integer from euint32 to euint4.\n function asEuint4(euint32 value) internal returns (euint4) {\n return euint4.wrap(Impl.cast(euint32.unwrap(value), Common.euint4_t));\n }\n\n // Cast an encrypted integer from euint64 to euint4.\n function asEuint4(euint64 value) internal returns (euint4) {\n return euint4.wrap(Impl.cast(euint64.unwrap(value), Common.euint4_t));\n }\n\n // Cast an encrypted integer from euint4 to ebool.\n function asEbool(euint4 value) internal returns (ebool) {\n return ne(value, 0);\n }\n\n // Converts an 'ebool' to an 'euint4'.\n function asEuint4(ebool b) internal returns (euint4) {\n return euint4.wrap(Impl.cast(ebool.unwrap(b), Common.euint4_t));\n }\n\n // Cast an encrypted integer from euint4 to euint8.\n function asEuint8(euint4 value) internal returns (euint8) {\n return euint8.wrap(Impl.cast(euint4.unwrap(value), Common.euint8_t));\n }\n\n // Cast an encrypted integer from euint16 to euint8.\n function asEuint8(euint16 value) internal returns (euint8) {\n return euint8.wrap(Impl.cast(euint16.unwrap(value), Common.euint8_t));\n }\n\n // Cast an encrypted integer from euint32 to euint8.\n function asEuint8(euint32 value) internal returns (euint8) {\n return euint8.wrap(Impl.cast(euint32.unwrap(value), Common.euint8_t));\n }\n\n // Cast an encrypted integer from euint64 to euint8.\n function asEuint8(euint64 value) internal returns (euint8) {\n return euint8.wrap(Impl.cast(euint64.unwrap(value), Common.euint8_t));\n }\n\n // Cast an encrypted integer from euint8 to ebool.\n function asEbool(euint8 value) internal returns (ebool) {\n return ne(value, 0);\n }\n\n // Convert an inputHandle with corresponding inputProof to an encrypted boolean.\n function asEbool(einput inputHandle, bytes memory inputProof) internal returns (ebool) {\n return ebool.wrap(Impl.verify(einput.unwrap(inputHandle), inputProof, Common.ebool_t));\n }\n\n // Convert a plaintext value to an encrypted boolean.\n function asEbool(uint256 value) internal returns (ebool) {\n return ebool.wrap(Impl.trivialEncrypt(value, Common.ebool_t));\n }\n\n // Convert a plaintext boolean to an encrypted boolean.\n function asEbool(bool value) internal returns (ebool) {\n if (value) {\n return asEbool(1);\n } else {\n return asEbool(0);\n }\n }\n\n // Converts an 'ebool' to an 'euint8'.\n function asEuint8(ebool value) internal returns (euint8) {\n return euint8.wrap(Impl.cast(ebool.unwrap(value), Common.euint8_t));\n }\n\n // Evaluate and(a, b) and return the result.\n function and(ebool a, ebool b) internal returns (ebool) {\n return ebool.wrap(Impl.and(ebool.unwrap(a), ebool.unwrap(b)));\n }\n\n // Evaluate or(a, b) and return the result.\n function or(ebool a, ebool b) internal returns (ebool) {\n return ebool.wrap(Impl.or(ebool.unwrap(a), ebool.unwrap(b)));\n }\n\n // Evaluate xor(a, b) and return the result.\n function xor(ebool a, ebool b) internal returns (ebool) {\n return ebool.wrap(Impl.xor(ebool.unwrap(a), ebool.unwrap(b)));\n }\n\n function not(ebool a) internal returns (ebool) {\n return ebool.wrap(Impl.not(ebool.unwrap(a)));\n }\n\n // Cast an encrypted integer from euint4 to euint16.\n function asEuint16(euint4 value) internal returns (euint16) {\n return euint16.wrap(Impl.cast(euint4.unwrap(value), Common.euint16_t));\n }\n\n // Cast an encrypted integer from euint8 to euint16.\n function asEuint16(euint8 value) internal returns (euint16) {\n return euint16.wrap(Impl.cast(euint8.unwrap(value), Common.euint16_t));\n }\n\n // Cast an encrypted integer from euint32 to euint16.\n function asEuint16(euint32 value) internal returns (euint16) {\n return euint16.wrap(Impl.cast(euint32.unwrap(value), Common.euint16_t));\n }\n\n // Cast an encrypted integer from euint64 to euint16.\n function asEuint16(euint64 value) internal returns (euint16) {\n return euint16.wrap(Impl.cast(euint64.unwrap(value), Common.euint16_t));\n }\n\n // Cast an encrypted integer from euint16 to ebool.\n function asEbool(euint16 value) internal returns (ebool) {\n return ne(value, 0);\n }\n\n // Converts an 'ebool' to an 'euint16'.\n function asEuint16(ebool b) internal returns (euint16) {\n return euint16.wrap(Impl.cast(ebool.unwrap(b), Common.euint16_t));\n }\n\n // Cast an encrypted integer from euint4 to euint32.\n function asEuint32(euint4 value) internal returns (euint32) {\n return euint32.wrap(Impl.cast(euint4.unwrap(value), Common.euint32_t));\n }\n\n // Cast an encrypted integer from euint8 to euint32.\n function asEuint32(euint8 value) internal returns (euint32) {\n return euint32.wrap(Impl.cast(euint8.unwrap(value), Common.euint32_t));\n }\n\n // Cast an encrypted integer from euint16 to euint32.\n function asEuint32(euint16 value) internal returns (euint32) {\n return euint32.wrap(Impl.cast(euint16.unwrap(value), Common.euint32_t));\n }\n\n // Cast an encrypted integer from euint64 to euint32.\n function asEuint32(euint64 value) internal returns (euint32) {\n return euint32.wrap(Impl.cast(euint64.unwrap(value), Common.euint32_t));\n }\n\n // Cast an encrypted integer from euint32 to ebool.\n function asEbool(euint32 value) internal returns (ebool) {\n return ne(value, 0);\n }\n\n // Converts an 'ebool' to an 'euint32'.\n function asEuint32(ebool b) internal returns (euint32) {\n return euint32.wrap(Impl.cast(ebool.unwrap(b), Common.euint32_t));\n }\n\n // Cast an encrypted integer from euint4 to euint64.\n function asEuint64(euint4 value) internal returns (euint64) {\n return euint64.wrap(Impl.cast(euint4.unwrap(value), Common.euint64_t));\n }\n\n // Cast an encrypted integer from euint8 to euint64.\n function asEuint64(euint8 value) internal returns (euint64) {\n return euint64.wrap(Impl.cast(euint8.unwrap(value), Common.euint64_t));\n }\n\n // Cast an encrypted integer from euint16 to euint64.\n function asEuint64(euint16 value) internal returns (euint64) {\n return euint64.wrap(Impl.cast(euint16.unwrap(value), Common.euint64_t));\n }\n\n // Cast an encrypted integer from euint32 to euint64.\n function asEuint64(euint32 value) internal returns (euint64) {\n return euint64.wrap(Impl.cast(euint32.unwrap(value), Common.euint64_t));\n }\n\n // Cast an encrypted integer from euint64 to ebool.\n function asEbool(euint64 value) internal returns (ebool) {\n return ne(value, 0);\n }\n\n // Converts an 'ebool' to an 'euint64'.\n function asEuint64(ebool b) internal returns (euint64) {\n return euint64.wrap(Impl.cast(ebool.unwrap(b), Common.euint64_t));\n }\n\n function neg(euint4 value) internal returns (euint4) {\n return euint4.wrap(Impl.neg(euint4.unwrap(value)));\n }\n\n function not(euint4 value) internal returns (euint4) {\n return euint4.wrap(Impl.not(euint4.unwrap(value)));\n }\n\n function neg(euint8 value) internal returns (euint8) {\n return euint8.wrap(Impl.neg(euint8.unwrap(value)));\n }\n\n function not(euint8 value) internal returns (euint8) {\n return euint8.wrap(Impl.not(euint8.unwrap(value)));\n }\n\n function neg(euint16 value) internal returns (euint16) {\n return euint16.wrap(Impl.neg(euint16.unwrap(value)));\n }\n\n function not(euint16 value) internal returns (euint16) {\n return euint16.wrap(Impl.not(euint16.unwrap(value)));\n }\n\n function neg(euint32 value) internal returns (euint32) {\n return euint32.wrap(Impl.neg(euint32.unwrap(value)));\n }\n\n function not(euint32 value) internal returns (euint32) {\n return euint32.wrap(Impl.not(euint32.unwrap(value)));\n }\n\n function neg(euint64 value) internal returns (euint64) {\n return euint64.wrap(Impl.neg(euint64.unwrap(value)));\n }\n\n function not(euint64 value) internal returns (euint64) {\n return euint64.wrap(Impl.not(euint64.unwrap(value)));\n }\n\n // Convert an inputHandle with corresponding inputProof to an encrypted euint4 integer.\n function asEuint4(einput inputHandle, bytes memory inputProof) internal returns (euint4) {\n return euint4.wrap(Impl.verify(einput.unwrap(inputHandle), inputProof, Common.euint4_t));\n }\n\n // Convert a plaintext value to an encrypted euint4 integer.\n function asEuint4(uint256 value) internal returns (euint4) {\n return euint4.wrap(Impl.trivialEncrypt(value, Common.euint4_t));\n }\n\n // Convert an inputHandle with corresponding inputProof to an encrypted euint8 integer.\n function asEuint8(einput inputHandle, bytes memory inputProof) internal returns (euint8) {\n return euint8.wrap(Impl.verify(einput.unwrap(inputHandle), inputProof, Common.euint8_t));\n }\n\n // Convert a plaintext value to an encrypted euint8 integer.\n function asEuint8(uint256 value) internal returns (euint8) {\n return euint8.wrap(Impl.trivialEncrypt(value, Common.euint8_t));\n }\n\n // Convert an inputHandle with corresponding inputProof to an encrypted euint16 integer.\n function asEuint16(einput inputHandle, bytes memory inputProof) internal returns (euint16) {\n return euint16.wrap(Impl.verify(einput.unwrap(inputHandle), inputProof, Common.euint16_t));\n }\n\n // Convert a plaintext value to an encrypted euint16 integer.\n function asEuint16(uint256 value) internal returns (euint16) {\n return euint16.wrap(Impl.trivialEncrypt(value, Common.euint16_t));\n }\n\n // Convert an inputHandle with corresponding inputProof to an encrypted euint32 integer.\n function asEuint32(einput inputHandle, bytes memory inputProof) internal returns (euint32) {\n return euint32.wrap(Impl.verify(einput.unwrap(inputHandle), inputProof, Common.euint32_t));\n }\n\n // Convert a plaintext value to an encrypted euint32 integer.\n function asEuint32(uint256 value) internal returns (euint32) {\n return euint32.wrap(Impl.trivialEncrypt(value, Common.euint32_t));\n }\n\n // Convert an inputHandle with corresponding inputProof to an encrypted euint64 integer.\n function asEuint64(einput inputHandle, bytes memory inputProof) internal returns (euint64) {\n return euint64.wrap(Impl.verify(einput.unwrap(inputHandle), inputProof, Common.euint64_t));\n }\n\n // Convert a plaintext value to an encrypted euint64 integer.\n function asEuint64(uint256 value) internal returns (euint64) {\n return euint64.wrap(Impl.trivialEncrypt(value, Common.euint64_t));\n }\n\n // Generates a random encrypted 8-bit unsigned integer.\n // Important: The random integer is generated in the plain! An FHE-based version is coming soon.\n function randEuint8() internal returns (euint8) {\n return euint8.wrap(Impl.rand(Common.euint8_t));\n }\n\n // Generates a random encrypted 8-bit unsigned integer in the [0, upperBound) range.\n // The upperBound must be a power of 2.\n // Important: The random integer is generated in the plain! An FHE-based version is coming soon.\n function randEuint8(uint8 upperBound) internal returns (euint8) {\n return euint8.wrap(Impl.randBounded(upperBound, Common.euint8_t));\n }\n\n // Generates a random encrypted 16-bit unsigned integer.\n // Important: The random integer is generated in the plain! An FHE-based version is coming soon.\n function randEuint16() internal returns (euint16) {\n return euint16.wrap(Impl.rand(Common.euint16_t));\n }\n\n // Generates a random encrypted 16-bit unsigned integer in the [0, upperBound) range.\n // The upperBound must be a power of 2.\n // Important: The random integer is generated in the plain! An FHE-based version is coming soon.\n function randEuint16(uint16 upperBound) internal returns (euint16) {\n return euint16.wrap(Impl.randBounded(upperBound, Common.euint16_t));\n }\n\n // Generates a random encrypted 32-bit unsigned integer.\n // Important: The random integer is generated in the plain! An FHE-based version is coming soon.\n function randEuint32() internal returns (euint32) {\n return euint32.wrap(Impl.rand(Common.euint32_t));\n }\n\n // Generates a random encrypted 32-bit unsigned integer in the [0, upperBound) range.\n // The upperBound must be a power of 2.\n // Important: The random integer is generated in the plain! An FHE-based version is coming soon.\n function randEuint32(uint32 upperBound) internal returns (euint32) {\n return euint32.wrap(Impl.randBounded(upperBound, Common.euint32_t));\n }\n\n // Generates a random encrypted 64-bit unsigned integer.\n // Important: The random integer is generated in the plain! An FHE-based version is coming soon.\n function randEuint64() internal returns (euint64) {\n return euint64.wrap(Impl.rand(Common.euint64_t));\n }\n\n // Generates a random encrypted 64-bit unsigned integer in the [0, upperBound) range.\n // The upperBound must be a power of 2.\n // Important: The random integer is generated in the plain! An FHE-based version is coming soon.\n function randEuint64(uint64 upperBound) internal returns (euint64) {\n return euint64.wrap(Impl.randBounded(upperBound, Common.euint64_t));\n }\n\n // Convert an inputHandle with corresponding inputProof to an encrypted eaddress.\n function asEaddress(einput inputHandle, bytes memory inputProof) internal returns (eaddress) {\n return eaddress.wrap(Impl.verify(einput.unwrap(inputHandle), inputProof, Common.euint160_t));\n }\n\n // Convert a plaintext value to an encrypted asEaddress.\n function asEaddress(address value) internal returns (eaddress) {\n return eaddress.wrap(Impl.trivialEncrypt(uint160(value), Common.euint160_t));\n }\n\n // Convert the given inputHandle and inputProof to an encrypted ebytes256 value.\n function asEbytes256(einput inputHandle, bytes memory inputProof) internal returns (ebytes256) {\n return ebytes256.wrap(Impl.verify(einput.unwrap(inputHandle), inputProof, Common.ebytes256_t));\n }\n\n // Return true if the enrypted address is initialized and false otherwise.\n function isInitialized(eaddress v) internal pure returns (bool) {\n return eaddress.unwrap(v) != 0;\n }\n\n // Return true if the enrypted value is initialized and false otherwise.\n function isInitialized(ebytes256 v) internal pure returns (bool) {\n return ebytes256.unwrap(v) != 0;\n }\n\n // Evaluate eq(a, b) and return the result.\n function eq(eaddress a, eaddress b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEaddress(address(0));\n }\n if (!isInitialized(b)) {\n b = asEaddress(address(0));\n }\n return ebool.wrap(Impl.eq(eaddress.unwrap(a), eaddress.unwrap(b), false));\n }\n\n // Evaluate ne(a, b) and return the result.\n function ne(eaddress a, eaddress b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEaddress(address(0));\n }\n if (!isInitialized(b)) {\n b = asEaddress(address(0));\n }\n return ebool.wrap(Impl.ne(eaddress.unwrap(a), eaddress.unwrap(b), false));\n }\n\n // Evaluate eq(a, b) and return the result.\n function eq(eaddress a, address b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEaddress(address(0));\n }\n uint256 bProc = uint256(uint160(b));\n return ebool.wrap(Impl.eq(eaddress.unwrap(a), bProc, true));\n }\n\n // Evaluate eq(a, b) and return the result.\n function eq(address b, eaddress a) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEaddress(address(0));\n }\n uint256 bProc = uint256(uint160(b));\n return ebool.wrap(Impl.eq(eaddress.unwrap(a), bProc, true));\n }\n\n // Evaluate ne(a, b) and return the result.\n function ne(eaddress a, address b) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEaddress(address(0));\n }\n uint256 bProc = uint256(uint160(b));\n return ebool.wrap(Impl.ne(eaddress.unwrap(a), bProc, true));\n }\n\n // Evaluate ne(a, b) and return the result.\n function ne(address b, eaddress a) internal returns (ebool) {\n if (!isInitialized(a)) {\n a = asEaddress(address(0));\n }\n uint256 bProc = uint256(uint160(b));\n return ebool.wrap(Impl.ne(eaddress.unwrap(a), bProc, true));\n }\n\n // If 'control''s value is 'true', the result has the same value as 'a'.\n // If 'control''s value is 'false', the result has the same value as 'b'.\n function select(ebool control, eaddress a, eaddress b) internal returns (eaddress) {\n return eaddress.wrap(Impl.select(ebool.unwrap(control), eaddress.unwrap(a), eaddress.unwrap(b)));\n }\n\n // Evaluate eq(a, b) and return the result.\n function eq(ebytes256 a, ebytes256 b) internal returns (ebool) {\n require(isInitialized(a), \"a is uninitialized\");\n require(isInitialized(b), \"b is uninitialized\");\n return ebool.wrap(Impl.eq(ebytes256.unwrap(a), ebytes256.unwrap(b), false));\n }\n\n // Evaluate ne(a, b) and return the result.\n function ne(ebytes256 a, ebytes256 b) internal returns (ebool) {\n require(isInitialized(a), \"a is uninitialized\");\n require(isInitialized(b), \"b is uninitialized\");\n return ebool.wrap(Impl.ne(ebytes256.unwrap(a), ebytes256.unwrap(b), false));\n }\n\n // cleans the transient storage of ACL containing all the allowedTransient accounts\n // to be used for integration with Account Abstraction or when bundling UserOps calling the FHEVMCoprocessor\n function cleanTransientStorage() internal {\n return Impl.cleanTransientStorage();\n }\n\n function isAllowed(ebool value, address account) internal view returns (bool) {\n return Impl.isAllowed(ebool.unwrap(value), account);\n }\n function isAllowed(euint4 value, address account) internal view returns (bool) {\n return Impl.isAllowed(euint4.unwrap(value), account);\n }\n function isAllowed(euint8 value, address account) internal view returns (bool) {\n return Impl.isAllowed(euint8.unwrap(value), account);\n }\n function isAllowed(euint16 value, address account) internal view returns (bool) {\n return Impl.isAllowed(euint16.unwrap(value), account);\n }\n function isAllowed(euint32 value, address account) internal view returns (bool) {\n return Impl.isAllowed(euint32.unwrap(value), account);\n }\n function isAllowed(euint64 value, address account) internal view returns (bool) {\n return Impl.isAllowed(euint64.unwrap(value), account);\n }\n function isAllowed(eaddress value, address account) internal view returns (bool) {\n return Impl.isAllowed(eaddress.unwrap(value), account);\n }\n\n function isAllowed(ebytes256 value, address account) internal view returns (bool) {\n return Impl.isAllowed(ebytes256.unwrap(value), account);\n }\n\n function isSenderAllowed(ebool value) internal view returns (bool) {\n return Impl.isAllowed(ebool.unwrap(value), msg.sender);\n }\n\n function isSenderAllowed(euint4 value) internal view returns (bool) {\n return Impl.isAllowed(euint4.unwrap(value), msg.sender);\n }\n\n function isSenderAllowed(euint8 value) internal view returns (bool) {\n return Impl.isAllowed(euint8.unwrap(value), msg.sender);\n }\n\n function isSenderAllowed(euint16 value) internal view returns (bool) {\n return Impl.isAllowed(euint16.unwrap(value), msg.sender);\n }\n\n function isSenderAllowed(euint32 value) internal view returns (bool) {\n return Impl.isAllowed(euint32.unwrap(value), msg.sender);\n }\n\n function isSenderAllowed(euint64 value) internal view returns (bool) {\n return Impl.isAllowed(euint64.unwrap(value), msg.sender);\n }\n\n function isSenderAllowed(eaddress value) internal view returns (bool) {\n return Impl.isAllowed(eaddress.unwrap(value), msg.sender);\n }\n\n function isSenderAllowed(ebytes256 value) internal view returns (bool) {\n return Impl.isAllowed(ebytes256.unwrap(value), msg.sender);\n }\n\n function allow(ebool value, address account) internal {\n Impl.allow(ebool.unwrap(value), account);\n }\n\n function allow(euint4 value, address account) internal {\n Impl.allow(euint4.unwrap(value), account);\n }\n\n function allow(euint8 value, address account) internal {\n Impl.allow(euint8.unwrap(value), account);\n }\n\n function allow(euint16 value, address account) internal {\n Impl.allow(euint16.unwrap(value), account);\n }\n\n function allow(euint32 value, address account) internal {\n Impl.allow(euint32.unwrap(value), account);\n }\n\n function allow(euint64 value, address account) internal {\n Impl.allow(euint64.unwrap(value), account);\n }\n\n function allow(eaddress value, address account) internal {\n Impl.allow(eaddress.unwrap(value), account);\n }\n\n function allow(ebytes256 value, address account) internal {\n Impl.allow(ebytes256.unwrap(value), account);\n }\n\n function allowTransient(ebool value, address account) internal {\n Impl.allowTransient(ebool.unwrap(value), account);\n }\n\n function allowTransient(euint4 value, address account) internal {\n Impl.allowTransient(euint4.unwrap(value), account);\n }\n\n function allowTransient(euint8 value, address account) internal {\n Impl.allowTransient(euint8.unwrap(value), account);\n }\n\n function allowTransient(euint16 value, address account) internal {\n Impl.allowTransient(euint16.unwrap(value), account);\n }\n\n function allowTransient(euint32 value, address account) internal {\n Impl.allowTransient(euint32.unwrap(value), account);\n }\n\n function allowTransient(euint64 value, address account) internal {\n Impl.allowTransient(euint64.unwrap(value), account);\n }\n\n function allowTransient(eaddress value, address account) internal {\n Impl.allowTransient(eaddress.unwrap(value), account);\n }\n\n function allowTransient(ebytes256 value, address account) internal {\n Impl.allowTransient(ebytes256.unwrap(value), account);\n }\n}\n" + } + }, + "settings": { + "optimizer": { + "enabled": true, + "runs": 200 + }, + "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/deployments/helpers.ts b/contracts/deployments/helpers.ts index c23052712..7d74c6269 100644 --- a/contracts/deployments/helpers.ts +++ b/contracts/deployments/helpers.ts @@ -36,7 +36,8 @@ export async function addWritePermission( await hre.deployments.rawTx({ from: currentOwner, to: contract.address, - data + data, + nonce: await hre.ethers.provider.getTransactionCount(currentOwner, 'latest') }); } else { console.log( diff --git a/contracts/deployments/parameters.ts b/contracts/deployments/parameters.ts index ad0762e04..61fcc8419 100644 --- a/contracts/deployments/parameters.ts +++ b/contracts/deployments/parameters.ts @@ -49,6 +49,12 @@ export const ACCOUNT_TLS_PARAMS = { endpoint: "GET https://app.revolut.com/api/retail/user/current", host: "app.revolut.com", } as TLSParams, + "encifher": { + verifierSigningKey: "0x166338393593e85bfde8B65358Ec5801A3445D12", + notaryKeyHash: BigNumber.from("113116629262703480258914951290401242193028831780154554089583031844538369800942").toHexString(), + endpoint: "GET https://app.revolut.com/api/retail/user/current", + host: "app.revolut.com", + } as TLSParams, "sepolia": { verifierSigningKey: "0x166338393593e85bfde8B65358Ec5801A3445D12", notaryKeyHash: BigNumber.from("113116629262703480258914951290401242193028831780154554089583031844538369800942").toHexString(), @@ -99,6 +105,12 @@ export const SEND_TLS_PARAMS = { endpoint: "GET https://app.revolut.com/api/retail/transaction/*", host: "app.revolut.com", } as TLSParams, + "encifher": { + verifierSigningKey: "", // We don't pass this in for deploys + notaryKeyHash: ZERO.toHexString(), // We don't pass this in for deploys + endpoint: "GET https://app.revolut.com/api/retail/transaction/*", + host: "app.revolut.com", + } as TLSParams, "sepolia": { verifierSigningKey: "", // We don't pass this in for deploys notaryKeyHash: ZERO.toHexString(), // We don't pass this in for deploys @@ -135,6 +147,7 @@ export const MIN_DEPOSIT_AMOUNT: any = { "sepolia": usdc(20), "base": usdc(20), "base_staging": usdc(10), + "encifher": usdc(10), }, "hdfc": { "localhost": usdc(21), @@ -142,6 +155,7 @@ export const MIN_DEPOSIT_AMOUNT: any = { "sepolia": usdc(20), "base": usdc(20), "base_staging": usdc(10), + "encifher": usdc(10), }, "garanti": { "localhost": usdc(21), @@ -149,6 +163,7 @@ export const MIN_DEPOSIT_AMOUNT: any = { "sepolia": usdc(20), "base": usdc(20), "base_staging": usdc(10), + "encifher": usdc(10), }, "wise": { "localhost": usdc(21), @@ -156,6 +171,7 @@ export const MIN_DEPOSIT_AMOUNT: any = { "sepolia": usdc(20), "base": usdc(20), "base_staging": usdc(10), + "encifher": usdc(10), }, "revolut": { "localhost": usdc(22), @@ -163,6 +179,7 @@ export const MIN_DEPOSIT_AMOUNT: any = { "sepolia": usdc(20), "base": usdc(20), "base_staging": usdc(10), + "encifher": usdc(10), }, }; export const MAX_ONRAMP_AMOUNT: any = { @@ -172,6 +189,7 @@ export const MAX_ONRAMP_AMOUNT: any = { "sepolia": usdc(999), "base": usdc(500), "base_staging": usdc(999), + "encifher": usdc(999), }, "hdfc": { "localhost": usdc(998), @@ -179,6 +197,7 @@ export const MAX_ONRAMP_AMOUNT: any = { "sepolia": usdc(999), "base": usdc(100), "base_staging": usdc(100), + "encifher": usdc(999), }, "garanti": { "localhost": usdc(998), @@ -186,6 +205,7 @@ export const MAX_ONRAMP_AMOUNT: any = { "sepolia": usdc(999), "base": usdc(100), "base_staging": usdc(100), + "encifher": usdc(999), }, "wise": { "localhost": usdc(998), @@ -193,6 +213,7 @@ export const MAX_ONRAMP_AMOUNT: any = { "sepolia": usdc(999), "base": usdc(200), "base_staging": usdc(200), + "encifher": usdc(999), }, "revolut": { "localhost": usdc(22), @@ -200,6 +221,7 @@ export const MAX_ONRAMP_AMOUNT: any = { "sepolia": usdc(20), "base": usdc(250), "base_staging": usdc(10), + "encifher": usdc(999), }, }; export const INTENT_EXPIRATION_PERIOD: any = { @@ -209,6 +231,7 @@ export const INTENT_EXPIRATION_PERIOD: any = { "sepolia": THREE_MINUTES_IN_SECONDS, "base": ONE_DAY_IN_SECONDS, "base_staging": THREE_MINUTES_IN_SECONDS, + "encifher": THREE_MINUTES_IN_SECONDS, }, "hdfc": { "localhost": ONE_DAY_IN_SECONDS.sub(1), @@ -216,6 +239,7 @@ export const INTENT_EXPIRATION_PERIOD: any = { "sepolia": THREE_MINUTES_IN_SECONDS, "base": ONE_DAY_IN_SECONDS, "base_staging": THREE_MINUTES_IN_SECONDS, + "encifher": THREE_MINUTES_IN_SECONDS, }, "garanti": { "localhost": ONE_DAY_IN_SECONDS.sub(2), @@ -223,6 +247,7 @@ export const INTENT_EXPIRATION_PERIOD: any = { "sepolia": THREE_MINUTES_IN_SECONDS, "base": ONE_DAY_IN_SECONDS, "base_staging": THREE_MINUTES_IN_SECONDS, + "encifher": THREE_MINUTES_IN_SECONDS, }, "wise": { "localhost": ONE_DAY_IN_SECONDS.sub(2), @@ -230,6 +255,7 @@ export const INTENT_EXPIRATION_PERIOD: any = { "sepolia": THREE_MINUTES_IN_SECONDS, "base": ONE_DAY_IN_SECONDS, "base_staging": THREE_MINUTES_IN_SECONDS, + "encifher": THREE_MINUTES_IN_SECONDS, }, "revolut": { "localhost": ONE_DAY_IN_SECONDS.sub(3), @@ -237,6 +263,7 @@ export const INTENT_EXPIRATION_PERIOD: any = { "sepolia": THREE_MINUTES_IN_SECONDS, "base": ONE_DAY_IN_SECONDS, "base_staging": THREE_MINUTES_IN_SECONDS, + "encifher": THREE_MINUTES_IN_SECONDS, }, }; export const ONRAMP_COOL_DOWN_PERIOD: any = { @@ -246,6 +273,7 @@ export const ONRAMP_COOL_DOWN_PERIOD: any = { "sepolia": THREE_MINUTES_IN_SECONDS, "base": ONE_DAY_IN_SECONDS.div(2), "base_staging": THREE_MINUTES_IN_SECONDS, + "encifher": THREE_MINUTES_IN_SECONDS, }, "hdfc": { "localhost": THREE_MINUTES_IN_SECONDS.sub(1), @@ -253,6 +281,7 @@ export const ONRAMP_COOL_DOWN_PERIOD: any = { "sepolia": THREE_MINUTES_IN_SECONDS, "base": ONE_DAY_IN_SECONDS.div(2), "base_staging": THREE_MINUTES_IN_SECONDS, + "encifher": THREE_MINUTES_IN_SECONDS, }, "garanti": { "localhost": THREE_MINUTES_IN_SECONDS.sub(2), @@ -260,6 +289,7 @@ export const ONRAMP_COOL_DOWN_PERIOD: any = { "sepolia": THREE_MINUTES_IN_SECONDS, "base": ONE_DAY_IN_SECONDS.div(2), "base_staging": THREE_MINUTES_IN_SECONDS, + "encifher": THREE_MINUTES_IN_SECONDS, }, "wise": { "localhost": THREE_MINUTES_IN_SECONDS.sub(2), @@ -267,6 +297,7 @@ export const ONRAMP_COOL_DOWN_PERIOD: any = { "sepolia": THREE_MINUTES_IN_SECONDS, "base": ONE_DAY_IN_SECONDS.div(2), "base_staging": THREE_MINUTES_IN_SECONDS, + "encifher": THREE_MINUTES_IN_SECONDS, }, "revolut": { "localhost": THREE_MINUTES_IN_SECONDS.sub(3), @@ -274,6 +305,7 @@ export const ONRAMP_COOL_DOWN_PERIOD: any = { "sepolia": THREE_MINUTES_IN_SECONDS, "base": ONE_DAY_IN_SECONDS.div(2), "base_staging": THREE_MINUTES_IN_SECONDS, + "encifher": THREE_MINUTES_IN_SECONDS, }, }; export const SUSTAINABILITY_FEE: any = { @@ -283,6 +315,7 @@ export const SUSTAINABILITY_FEE: any = { "sepolia": ether(.001), "base": ZERO, "base_staging": ZERO, + "encifher": ether(.001), }, "hdfc": { "localhost": ether(.002), @@ -290,6 +323,7 @@ export const SUSTAINABILITY_FEE: any = { "sepolia": ether(.001), "base": ZERO, "base_staging": ZERO, + "encifher": ether(.001), }, "garanti": { "localhost": ether(.002), @@ -297,6 +331,7 @@ export const SUSTAINABILITY_FEE: any = { "sepolia": ether(.001), "base": ZERO, "base_staging": ZERO, + "encifher": ether(.001), }, "wise": { "localhost": ether(.002), @@ -304,6 +339,7 @@ export const SUSTAINABILITY_FEE: any = { "sepolia": ether(.001), "base": ZERO, "base_staging": ZERO, + "encifher": ether(.001), }, "revolut": { "localhost": ether(.003), @@ -311,6 +347,7 @@ export const SUSTAINABILITY_FEE: any = { "sepolia": ether(.001), "base": ZERO, "base_staging": ZERO, + "encifher": ether(.001), }, }; export const SUSTAINABILITY_FEE_RECIPIENT: any = { @@ -320,6 +357,7 @@ export const SUSTAINABILITY_FEE_RECIPIENT: any = { "sepolia": "", "base": "0x0bC26FF515411396DD588Abd6Ef6846E04470227", "base_staging": "0xdd93E0f5fC32c86A568d87Cb4f08598f55E980F3", + "encifher": "", }, "hdfc": { "localhost": "", @@ -327,6 +365,7 @@ export const SUSTAINABILITY_FEE_RECIPIENT: any = { "sepolia": "", "base": "0x0bC26FF515411396DD588Abd6Ef6846E04470227", "base_staging": "0xdd93E0f5fC32c86A568d87Cb4f08598f55E980F3", + "encifher": "", }, "garanti": { "localhost": "", @@ -334,6 +373,7 @@ export const SUSTAINABILITY_FEE_RECIPIENT: any = { "sepolia": "", "base": "0x0bC26FF515411396DD588Abd6Ef6846E04470227", "base_staging": "0xdd93E0f5fC32c86A568d87Cb4f08598f55E980F3", + "encifher": "", }, "wise": { "localhost": "", @@ -341,6 +381,7 @@ export const SUSTAINABILITY_FEE_RECIPIENT: any = { "sepolia": "", "base": "0x0bC26FF515411396DD588Abd6Ef6846E04470227", "base_staging": "0xdd93E0f5fC32c86A568d87Cb4f08598f55E980F3", + "encifher": "", }, "revolut": { "localhost": "", @@ -348,6 +389,7 @@ export const SUSTAINABILITY_FEE_RECIPIENT: any = { "sepolia": "", "base": "0x0bC26FF515411396DD588Abd6Ef6846E04470227", "base_staging": "0xdd93E0f5fC32c86A568d87Cb4f08598f55E980F3", + "encifher": "", }, }; @@ -358,6 +400,7 @@ export const MULTI_SIG: any = { "sepolia": "", "base": "0x0bC26FF515411396DD588Abd6Ef6846E04470227", "base_staging": "0xdd93E0f5fC32c86A568d87Cb4f08598f55E980F3", + "encifher": "", }; // USDC diff --git a/contracts/hardhat.config.ts b/contracts/hardhat.config.ts index 96df6a358..6688ff7c6 100644 --- a/contracts/hardhat.config.ts +++ b/contracts/hardhat.config.ts @@ -23,6 +23,15 @@ const config: HardhatUserConfig = { }, }, }, + { + version: "0.8.24", + settings: { + optimizer: { + enabled: true, + runs: 200, + }, + }, + }, ], }, networks: { @@ -69,6 +78,12 @@ const config: HardhatUserConfig = { } }, }, + encifher: { + url: "http://localhost:8545", + accounts: [ + `0x${process.env.ENCIFHER_DEPLOY_PRIVATE_KEY}`, + ] + }, base: { url: "https://developer-access-mainnet.base.org", // @ts-ignore diff --git a/contracts/package-lock.json b/contracts/package-lock.json new file mode 100644 index 000000000..1a31c1af0 --- /dev/null +++ b/contracts/package-lock.json @@ -0,0 +1,11233 @@ +{ + "name": "zkp2p-contracts", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "zkp2p-contracts", + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "@openzeppelin/contracts": "^4.9.2", + "@zk-email/contracts": "^3.2.0", + "circomlibjs": "^0.1.7", + "dotenv": "^16.3.1", + "ethereum-waffle": "^4.0.10", + "fhevm": "^0.5.8" + }, + "devDependencies": { + "@nomicfoundation/hardhat-chai-matchers": "^1.0.6", + "@nomicfoundation/hardhat-network-helpers": "^1.0.8", + "@nomicfoundation/hardhat-verify": "^1.1.1", + "@nomiclabs/hardhat-ethers": "^2.2.2", + "@nomiclabs/hardhat-etherscan": "^3.1.7", + "@typechain/ethers-v5": "^10.2.0", + "@typechain/hardhat": "^6.1.5", + "@types/chai": "^4.2.0", + "@types/mocha": ">=9.1.0", + "@types/node": ">=12.0.0", + "chai": "^4.2.0", + "ethers": "^5.7.2", + "hardhat": "^2.12.6", + "hardhat-deploy": "^0.11.34", + "hardhat-gas-reporter": "^1.0.8", + "module-alias": "^2.2.3", + "solidity-coverage": "^0.8.4", + "ts-node": ">=8.0.0", + "typechain": "^8.1.0", + "typescript": ">=4.5.0" + } + }, + "node_modules/@chainsafe/as-sha256": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@chainsafe/as-sha256/-/as-sha256-0.3.1.tgz", + "integrity": "sha512-hldFFYuf49ed7DAakWVXSJODuq3pzJEguD8tQ7h+sGkM18vja+OFoJI9krnGmgzyuZC2ETX0NOIcCTy31v2Mtg==", + "dev": true + }, + "node_modules/@chainsafe/persistent-merkle-tree": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@chainsafe/persistent-merkle-tree/-/persistent-merkle-tree-0.4.2.tgz", + "integrity": "sha512-lLO3ihKPngXLTus/L7WHKaw9PnNJWizlOF1H9NNzHP6Xvh82vzg9F2bzkXhYIFshMZ2gTCEz8tq6STe7r5NDfQ==", + "dev": true, + "dependencies": { + "@chainsafe/as-sha256": "^0.3.1" + } + }, + "node_modules/@chainsafe/ssz": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/@chainsafe/ssz/-/ssz-0.9.4.tgz", + "integrity": "sha512-77Qtg2N1ayqs4Bg/wvnWfg5Bta7iy7IRh8XqXh7oNMeP2HBbBwx8m6yTpA8p0EHItWPEBkgZd5S5/LSlp3GXuQ==", + "dev": true, + "dependencies": { + "@chainsafe/as-sha256": "^0.3.1", + "@chainsafe/persistent-merkle-tree": "^0.4.2", + "case": "^1.6.3" + } + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@ensdomains/ens": { + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/@ensdomains/ens/-/ens-0.4.5.tgz", + "integrity": "sha512-JSvpj1iNMFjK6K+uVl4unqMoa9rf5jopb8cya5UGBWz23Nw8hSNT7efgUx4BTlAPAgpNlEioUfeTyQ6J9ZvTVw==", + "deprecated": "Please use @ensdomains/ens-contracts", + "peer": true, + "dependencies": { + "bluebird": "^3.5.2", + "eth-ens-namehash": "^2.0.8", + "solc": "^0.4.20", + "testrpc": "0.0.1", + "web3-utils": "^1.0.0-beta.31" + } + }, + "node_modules/@ensdomains/ens/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@ensdomains/ens/node_modules/camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha512-4nhGqUkc4BqbBBB4Q6zLuD7lzzrHYrjKGeYaEji/3tFR5VdJu9v+LilhGIVe8wxEJPPOeWo7eg8dwY13TZ1BNg==", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@ensdomains/ens/node_modules/cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha512-0yayqDxWQbqk3ojkYqUKqaAQ6AfNKeKWRNA8kR0WXzAsdHpP4BIaOmMAG87JGuO6qcobyW4GjxHd9PmhEd+T9w==", + "peer": true, + "dependencies": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" + } + }, + "node_modules/@ensdomains/ens/node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@ensdomains/ens/node_modules/fs-extra": { + "version": "0.30.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", + "integrity": "sha512-UvSPKyhMn6LEd/WpUaV9C9t3zATuqoqfWc3QdPhPLb58prN9tqYPlPWi8Krxi44loBoUzlobqZ3+8tGpxxSzwA==", + "peer": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^2.1.0", + "klaw": "^1.0.0", + "path-is-absolute": "^1.0.0", + "rimraf": "^2.2.8" + } + }, + "node_modules/@ensdomains/ens/node_modules/get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", + "peer": true + }, + "node_modules/@ensdomains/ens/node_modules/is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==", + "peer": true, + "dependencies": { + "number-is-nan": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@ensdomains/ens/node_modules/jsonfile": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", + "integrity": "sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw==", + "peer": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@ensdomains/ens/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "peer": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/@ensdomains/ens/node_modules/solc": { + "version": "0.4.26", + "resolved": "https://registry.npmjs.org/solc/-/solc-0.4.26.tgz", + "integrity": "sha512-o+c6FpkiHd+HPjmjEVpQgH7fqZ14tJpXhho+/bQXlXbliLIS/xjXb42Vxh+qQY1WCSTMQ0+a5vR9vi0MfhU6mA==", + "peer": true, + "dependencies": { + "fs-extra": "^0.30.0", + "memorystream": "^0.3.1", + "require-from-string": "^1.1.0", + "semver": "^5.3.0", + "yargs": "^4.7.1" + }, + "bin": { + "solcjs": "solcjs" + } + }, + "node_modules/@ensdomains/ens/node_modules/string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==", + "peer": true, + "dependencies": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@ensdomains/ens/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "peer": true, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@ensdomains/ens/node_modules/wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha512-vAaEaDM946gbNpH5pLVNR+vX2ht6n0Bt3GXwVB1AuAqZosOvHNF3P7wDnh8KLkSqgUh0uh77le7Owgoz+Z9XBw==", + "peer": true, + "dependencies": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@ensdomains/ens/node_modules/y18n": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz", + "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==", + "peer": true + }, + "node_modules/@ensdomains/ens/node_modules/yargs": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-4.8.1.tgz", + "integrity": "sha512-LqodLrnIDM3IFT+Hf/5sxBnEGECrfdC1uIbgZeJmESCSo4HoCAaKEus8MylXHAkdacGc0ye+Qa+dpkuom8uVYA==", + "peer": true, + "dependencies": { + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "lodash.assign": "^4.0.3", + "os-locale": "^1.4.0", + "read-pkg-up": "^1.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^1.0.1", + "which-module": "^1.0.0", + "window-size": "^0.2.0", + "y18n": "^3.2.1", + "yargs-parser": "^2.4.1" + } + }, + "node_modules/@ensdomains/ens/node_modules/yargs-parser": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-2.4.1.tgz", + "integrity": "sha512-9pIKIJhnI5tonzG6OnCFlz/yln8xHYcGl+pn3xR0Vzff0vzN1PbNRaelgfgRUwZ3s4i3jvxT9WhmUGL4whnasA==", + "peer": true, + "dependencies": { + "camelcase": "^3.0.0", + "lodash.assign": "^4.0.6" + } + }, + "node_modules/@ensdomains/resolver": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/@ensdomains/resolver/-/resolver-0.2.4.tgz", + "integrity": "sha512-bvaTH34PMCbv6anRa9I/0zjLJgY4EuznbEMgbV77JBCQ9KNC46rzi0avuxpOfu+xDjPEtSFGqVEOr5GlUSGudA==", + "deprecated": "Please use @ensdomains/ens-contracts", + "peer": true + }, + "node_modules/@ethereum-waffle/chai": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/@ethereum-waffle/chai/-/chai-4.0.10.tgz", + "integrity": "sha512-X5RepE7Dn8KQLFO7HHAAe+KeGaX/by14hn90wePGBhzL54tq4Y8JscZFu+/LCwCl6TnkAAy5ebiMoqJ37sFtWw==", + "dependencies": { + "@ethereum-waffle/provider": "4.0.5", + "debug": "^4.3.4", + "json-bigint": "^1.0.0" + }, + "engines": { + "node": ">=10.0" + }, + "peerDependencies": { + "ethers": "*" + } + }, + "node_modules/@ethereum-waffle/compiler": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@ethereum-waffle/compiler/-/compiler-4.0.3.tgz", + "integrity": "sha512-5x5U52tSvEVJS6dpCeXXKvRKyf8GICDwiTwUvGD3/WD+DpvgvaoHOL82XqpTSUHgV3bBq6ma5/8gKUJUIAnJCw==", + "dependencies": { + "@resolver-engine/imports": "^0.3.3", + "@resolver-engine/imports-fs": "^0.3.3", + "@typechain/ethers-v5": "^10.0.0", + "@types/mkdirp": "^0.5.2", + "@types/node-fetch": "^2.6.1", + "mkdirp": "^0.5.1", + "node-fetch": "^2.6.7" + }, + "engines": { + "node": ">=10.0" + }, + "peerDependencies": { + "ethers": "*", + "solc": "*", + "typechain": "^8.0.0" + } + }, + "node_modules/@ethereum-waffle/ens": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@ethereum-waffle/ens/-/ens-4.0.3.tgz", + "integrity": "sha512-PVLcdnTbaTfCrfSOrvtlA9Fih73EeDvFS28JQnT5M5P4JMplqmchhcZB1yg/fCtx4cvgHlZXa0+rOCAk2Jk0Jw==", + "engines": { + "node": ">=10.0" + }, + "peerDependencies": { + "@ensdomains/ens": "^0.4.4", + "@ensdomains/resolver": "^0.2.4", + "ethers": "*" + } + }, + "node_modules/@ethereum-waffle/mock-contract": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-4.0.4.tgz", + "integrity": "sha512-LwEj5SIuEe9/gnrXgtqIkWbk2g15imM/qcJcxpLyAkOj981tQxXmtV4XmQMZsdedEsZ/D/rbUAOtZbgwqgUwQA==", + "engines": { + "node": ">=10.0" + }, + "peerDependencies": { + "ethers": "*" + } + }, + "node_modules/@ethereum-waffle/provider": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@ethereum-waffle/provider/-/provider-4.0.5.tgz", + "integrity": "sha512-40uzfyzcrPh+Gbdzv89JJTMBlZwzya1YLDyim8mVbEqYLP5VRYWoGp0JMyaizgV3hMoUFRqJKVmIUw4v7r3hYw==", + "dependencies": { + "@ethereum-waffle/ens": "4.0.3", + "@ganache/ethereum-options": "0.1.4", + "debug": "^4.3.4", + "ganache": "7.4.3" + }, + "engines": { + "node": ">=10.0" + }, + "peerDependencies": { + "ethers": "*" + } + }, + "node_modules/@ethereumjs/block": { + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/@ethereumjs/block/-/block-3.6.3.tgz", + "integrity": "sha512-CegDeryc2DVKnDkg5COQrE0bJfw/p0v3GBk2W5/Dj5dOVfEmb50Ux0GLnSPypooLnfqjwFaorGuT9FokWB3GRg==", + "dependencies": { + "@ethereumjs/common": "^2.6.5", + "@ethereumjs/tx": "^3.5.2", + "ethereumjs-util": "^7.1.5", + "merkle-patricia-tree": "^4.2.4" + } + }, + "node_modules/@ethereumjs/block/node_modules/@ethereumjs/common": { + "version": "2.6.5", + "resolved": "https://registry.npmjs.org/@ethereumjs/common/-/common-2.6.5.tgz", + "integrity": "sha512-lRyVQOeCDaIVtgfbowla32pzeDv2Obr8oR8Put5RdUBNRGr1VGPGQNGP6elWIpgK3YdpzqTOh4GyUGOureVeeA==", + "dependencies": { + "crc-32": "^1.2.0", + "ethereumjs-util": "^7.1.5" + } + }, + "node_modules/@ethereumjs/block/node_modules/@ethereumjs/tx": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/@ethereumjs/tx/-/tx-3.5.2.tgz", + "integrity": "sha512-gQDNJWKrSDGu2w7w0PzVXVBNMzb7wwdDOmOqczmhNjqFxFuIbhVJDwiGEnxFNC2/b8ifcZzY7MLcluizohRzNw==", + "dependencies": { + "@ethereumjs/common": "^2.6.4", + "ethereumjs-util": "^7.1.5" + } + }, + "node_modules/@ethereumjs/blockchain": { + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/@ethereumjs/blockchain/-/blockchain-5.5.3.tgz", + "integrity": "sha512-bi0wuNJ1gw4ByNCV56H0Z4Q7D+SxUbwyG12Wxzbvqc89PXLRNR20LBcSUZRKpN0+YCPo6m0XZL/JLio3B52LTw==", + "dependencies": { + "@ethereumjs/block": "^3.6.2", + "@ethereumjs/common": "^2.6.4", + "@ethereumjs/ethash": "^1.1.0", + "debug": "^4.3.3", + "ethereumjs-util": "^7.1.5", + "level-mem": "^5.0.1", + "lru-cache": "^5.1.1", + "semaphore-async-await": "^1.5.1" + } + }, + "node_modules/@ethereumjs/blockchain/node_modules/@ethereumjs/common": { + "version": "2.6.5", + "resolved": "https://registry.npmjs.org/@ethereumjs/common/-/common-2.6.5.tgz", + "integrity": "sha512-lRyVQOeCDaIVtgfbowla32pzeDv2Obr8oR8Put5RdUBNRGr1VGPGQNGP6elWIpgK3YdpzqTOh4GyUGOureVeeA==", + "dependencies": { + "crc-32": "^1.2.0", + "ethereumjs-util": "^7.1.5" + } + }, + "node_modules/@ethereumjs/common": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@ethereumjs/common/-/common-2.6.0.tgz", + "integrity": "sha512-Cq2qS0FTu6O2VU1sgg+WyU9Ps0M6j/BEMHN+hRaECXCV/r0aI78u4N6p52QW/BDVhwWZpCdrvG8X7NJdzlpNUA==", + "dependencies": { + "crc-32": "^1.2.0", + "ethereumjs-util": "^7.1.3" + } + }, + "node_modules/@ethereumjs/ethash": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@ethereumjs/ethash/-/ethash-1.1.0.tgz", + "integrity": "sha512-/U7UOKW6BzpA+Vt+kISAoeDie1vAvY4Zy2KF5JJb+So7+1yKmJeJEHOGSnQIj330e9Zyl3L5Nae6VZyh2TJnAA==", + "dependencies": { + "@ethereumjs/block": "^3.5.0", + "@types/levelup": "^4.3.0", + "buffer-xor": "^2.0.1", + "ethereumjs-util": "^7.1.1", + "miller-rabin": "^4.0.0" + } + }, + "node_modules/@ethereumjs/rlp": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@ethereumjs/rlp/-/rlp-4.0.1.tgz", + "integrity": "sha512-tqsQiBQDQdmPWE1xkkBq4rlSW5QZpLOUJ5RJh2/9fug+q9tnUhuZoVLk7s0scUIKTOzEtR72DFBXI4WiZcMpvw==", + "bin": { + "rlp": "bin/rlp" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@ethereumjs/tx": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@ethereumjs/tx/-/tx-3.4.0.tgz", + "integrity": "sha512-WWUwg1PdjHKZZxPPo274ZuPsJCWV3SqATrEKQP1n2DrVYVP1aZIYpo/mFaA0BDoE0tIQmBeimRCEA0Lgil+yYw==", + "dependencies": { + "@ethereumjs/common": "^2.6.0", + "ethereumjs-util": "^7.1.3" + } + }, + "node_modules/@ethereumjs/util": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@ethereumjs/util/-/util-8.1.0.tgz", + "integrity": "sha512-zQ0IqbdX8FZ9aw11vP+dZkKDkS+kgIvQPHnSAXzP9pLu+Rfu3D3XEeLbicvoXJTYnhZiPmsZUxgdzXwNKxRPbA==", + "dependencies": { + "@ethereumjs/rlp": "^4.0.1", + "ethereum-cryptography": "^2.0.0", + "micro-ftch": "^0.3.1" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@ethereumjs/util/node_modules/ethereum-cryptography": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-2.2.1.tgz", + "integrity": "sha512-r/W8lkHSiTLxUxW8Rf3u4HGB0xQweG2RyETjywylKZSzLWoWAijRz8WCuOtJ6wah+avllXBqZuk29HCCvhEIRg==", + "dependencies": { + "@noble/curves": "1.4.2", + "@noble/hashes": "1.4.0", + "@scure/bip32": "1.4.0", + "@scure/bip39": "1.3.0" + } + }, + "node_modules/@ethereumjs/vm": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/@ethereumjs/vm/-/vm-5.6.0.tgz", + "integrity": "sha512-J2m/OgjjiGdWF2P9bj/4LnZQ1zRoZhY8mRNVw/N3tXliGI8ai1sI1mlDPkLpeUUM4vq54gH6n0ZlSpz8U/qlYQ==", + "dependencies": { + "@ethereumjs/block": "^3.6.0", + "@ethereumjs/blockchain": "^5.5.0", + "@ethereumjs/common": "^2.6.0", + "@ethereumjs/tx": "^3.4.0", + "async-eventemitter": "^0.2.4", + "core-js-pure": "^3.0.1", + "debug": "^2.2.0", + "ethereumjs-util": "^7.1.3", + "functional-red-black-tree": "^1.0.1", + "mcl-wasm": "^0.7.1", + "merkle-patricia-tree": "^4.2.2", + "rustbn.js": "~0.2.0" + } + }, + "node_modules/@ethereumjs/vm/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/@ethereumjs/vm/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/@ethersproject/abi": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.7.0.tgz", + "integrity": "sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/address": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/constants": "^5.7.0", + "@ethersproject/hash": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/strings": "^5.7.0" + } + }, + "node_modules/@ethersproject/abstract-provider": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.7.0.tgz", + "integrity": "sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/networks": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/transactions": "^5.7.0", + "@ethersproject/web": "^5.7.0" + } + }, + "node_modules/@ethersproject/abstract-signer": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.7.0.tgz", + "integrity": "sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/abstract-provider": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0" + } + }, + "node_modules/@ethersproject/address": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz", + "integrity": "sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/rlp": "^5.7.0" + } + }, + "node_modules/@ethersproject/base64": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.7.0.tgz", + "integrity": "sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/bytes": "^5.7.0" + } + }, + "node_modules/@ethersproject/basex": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/basex/-/basex-5.7.0.tgz", + "integrity": "sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/properties": "^5.7.0" + } + }, + "node_modules/@ethersproject/bignumber": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.7.0.tgz", + "integrity": "sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "bn.js": "^5.2.1" + } + }, + "node_modules/@ethersproject/bytes": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.7.0.tgz", + "integrity": "sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/logger": "^5.7.0" + } + }, + "node_modules/@ethersproject/constants": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.7.0.tgz", + "integrity": "sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/bignumber": "^5.7.0" + } + }, + "node_modules/@ethersproject/contracts": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/contracts/-/contracts-5.7.0.tgz", + "integrity": "sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/abi": "^5.7.0", + "@ethersproject/abstract-provider": "^5.7.0", + "@ethersproject/abstract-signer": "^5.7.0", + "@ethersproject/address": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/constants": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/transactions": "^5.7.0" + } + }, + "node_modules/@ethersproject/hash": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.7.0.tgz", + "integrity": "sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/abstract-signer": "^5.7.0", + "@ethersproject/address": "^5.7.0", + "@ethersproject/base64": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/strings": "^5.7.0" + } + }, + "node_modules/@ethersproject/hdnode": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/hdnode/-/hdnode-5.7.0.tgz", + "integrity": "sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/abstract-signer": "^5.7.0", + "@ethersproject/basex": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/pbkdf2": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/sha2": "^5.7.0", + "@ethersproject/signing-key": "^5.7.0", + "@ethersproject/strings": "^5.7.0", + "@ethersproject/transactions": "^5.7.0", + "@ethersproject/wordlists": "^5.7.0" + } + }, + "node_modules/@ethersproject/json-wallets": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/json-wallets/-/json-wallets-5.7.0.tgz", + "integrity": "sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/abstract-signer": "^5.7.0", + "@ethersproject/address": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/hdnode": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/pbkdf2": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/random": "^5.7.0", + "@ethersproject/strings": "^5.7.0", + "@ethersproject/transactions": "^5.7.0", + "aes-js": "3.0.0", + "scrypt-js": "3.0.1" + } + }, + "node_modules/@ethersproject/keccak256": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.7.0.tgz", + "integrity": "sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/bytes": "^5.7.0", + "js-sha3": "0.8.0" + } + }, + "node_modules/@ethersproject/logger": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.7.0.tgz", + "integrity": "sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ] + }, + "node_modules/@ethersproject/networks": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.7.1.tgz", + "integrity": "sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/logger": "^5.7.0" + } + }, + "node_modules/@ethersproject/pbkdf2": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/pbkdf2/-/pbkdf2-5.7.0.tgz", + "integrity": "sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/sha2": "^5.7.0" + } + }, + "node_modules/@ethersproject/properties": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.7.0.tgz", + "integrity": "sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/logger": "^5.7.0" + } + }, + "node_modules/@ethersproject/providers": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/@ethersproject/providers/-/providers-5.7.2.tgz", + "integrity": "sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/abstract-provider": "^5.7.0", + "@ethersproject/abstract-signer": "^5.7.0", + "@ethersproject/address": "^5.7.0", + "@ethersproject/base64": "^5.7.0", + "@ethersproject/basex": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/constants": "^5.7.0", + "@ethersproject/hash": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/networks": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/random": "^5.7.0", + "@ethersproject/rlp": "^5.7.0", + "@ethersproject/sha2": "^5.7.0", + "@ethersproject/strings": "^5.7.0", + "@ethersproject/transactions": "^5.7.0", + "@ethersproject/web": "^5.7.0", + "bech32": "1.1.4", + "ws": "7.4.6" + } + }, + "node_modules/@ethersproject/random": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/random/-/random-5.7.0.tgz", + "integrity": "sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0" + } + }, + "node_modules/@ethersproject/rlp": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.7.0.tgz", + "integrity": "sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0" + } + }, + "node_modules/@ethersproject/sha2": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/sha2/-/sha2-5.7.0.tgz", + "integrity": "sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "hash.js": "1.1.7" + } + }, + "node_modules/@ethersproject/signing-key": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.7.0.tgz", + "integrity": "sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "bn.js": "^5.2.1", + "elliptic": "6.5.4", + "hash.js": "1.1.7" + } + }, + "node_modules/@ethersproject/solidity": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/solidity/-/solidity-5.7.0.tgz", + "integrity": "sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/sha2": "^5.7.0", + "@ethersproject/strings": "^5.7.0" + } + }, + "node_modules/@ethersproject/strings": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.7.0.tgz", + "integrity": "sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/constants": "^5.7.0", + "@ethersproject/logger": "^5.7.0" + } + }, + "node_modules/@ethersproject/transactions": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.7.0.tgz", + "integrity": "sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/address": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/constants": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/rlp": "^5.7.0", + "@ethersproject/signing-key": "^5.7.0" + } + }, + "node_modules/@ethersproject/units": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/units/-/units-5.7.0.tgz", + "integrity": "sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/constants": "^5.7.0", + "@ethersproject/logger": "^5.7.0" + } + }, + "node_modules/@ethersproject/wallet": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/wallet/-/wallet-5.7.0.tgz", + "integrity": "sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/abstract-provider": "^5.7.0", + "@ethersproject/abstract-signer": "^5.7.0", + "@ethersproject/address": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/hash": "^5.7.0", + "@ethersproject/hdnode": "^5.7.0", + "@ethersproject/json-wallets": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/random": "^5.7.0", + "@ethersproject/signing-key": "^5.7.0", + "@ethersproject/transactions": "^5.7.0", + "@ethersproject/wordlists": "^5.7.0" + } + }, + "node_modules/@ethersproject/web": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/@ethersproject/web/-/web-5.7.1.tgz", + "integrity": "sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/base64": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/strings": "^5.7.0" + } + }, + "node_modules/@ethersproject/wordlists": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/wordlists/-/wordlists-5.7.0.tgz", + "integrity": "sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/hash": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/strings": "^5.7.0" + } + }, + "node_modules/@ganache/ethereum-address": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/@ganache/ethereum-address/-/ethereum-address-0.1.4.tgz", + "integrity": "sha512-sTkU0M9z2nZUzDeHRzzGlW724xhMLXo2LeX1hixbnjHWY1Zg1hkqORywVfl+g5uOO8ht8T0v+34IxNxAhmWlbw==", + "dependencies": { + "@ganache/utils": "0.1.4" + } + }, + "node_modules/@ganache/ethereum-options": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/@ganache/ethereum-options/-/ethereum-options-0.1.4.tgz", + "integrity": "sha512-i4l46taoK2yC41FPkcoDlEVoqHS52wcbHPqJtYETRWqpOaoj9hAg/EJIHLb1t6Nhva2CdTO84bG+qlzlTxjAHw==", + "dependencies": { + "@ganache/ethereum-address": "0.1.4", + "@ganache/ethereum-utils": "0.1.4", + "@ganache/options": "0.1.4", + "@ganache/utils": "0.1.4", + "bip39": "3.0.4", + "seedrandom": "3.0.5" + } + }, + "node_modules/@ganache/ethereum-utils": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/@ganache/ethereum-utils/-/ethereum-utils-0.1.4.tgz", + "integrity": "sha512-FKXF3zcdDrIoCqovJmHLKZLrJ43234Em2sde/3urUT/10gSgnwlpFmrv2LUMAmSbX3lgZhW/aSs8krGhDevDAg==", + "dependencies": { + "@ethereumjs/common": "2.6.0", + "@ethereumjs/tx": "3.4.0", + "@ethereumjs/vm": "5.6.0", + "@ganache/ethereum-address": "0.1.4", + "@ganache/rlp": "0.1.4", + "@ganache/utils": "0.1.4", + "emittery": "0.10.0", + "ethereumjs-abi": "0.6.8", + "ethereumjs-util": "7.1.3" + } + }, + "node_modules/@ganache/ethereum-utils/node_modules/ethereumjs-util": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.3.tgz", + "integrity": "sha512-y+82tEbyASO0K0X1/SRhbJJoAlfcvq8JbrG4a5cjrOks7HS/36efU/0j2flxCPOUM++HFahk33kr/ZxyC4vNuw==", + "dependencies": { + "@types/bn.js": "^5.1.0", + "bn.js": "^5.1.2", + "create-hash": "^1.1.2", + "ethereum-cryptography": "^0.1.3", + "rlp": "^2.2.4" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@ganache/options": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/@ganache/options/-/options-0.1.4.tgz", + "integrity": "sha512-zAe/craqNuPz512XQY33MOAG6Si1Xp0hCvfzkBfj2qkuPcbJCq6W/eQ5MB6SbXHrICsHrZOaelyqjuhSEmjXRw==", + "dependencies": { + "@ganache/utils": "0.1.4", + "bip39": "3.0.4", + "seedrandom": "3.0.5" + } + }, + "node_modules/@ganache/rlp": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/@ganache/rlp/-/rlp-0.1.4.tgz", + "integrity": "sha512-Do3D1H6JmhikB+6rHviGqkrNywou/liVeFiKIpOBLynIpvZhRCgn3SEDxyy/JovcaozTo/BynHumfs5R085MFQ==", + "dependencies": { + "@ganache/utils": "0.1.4", + "rlp": "2.2.6" + } + }, + "node_modules/@ganache/utils": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/@ganache/utils/-/utils-0.1.4.tgz", + "integrity": "sha512-oatUueU3XuXbUbUlkyxeLLH3LzFZ4y5aSkNbx6tjSIhVTPeh+AuBKYt4eQ73FFcTB3nj/gZoslgAh5CN7O369w==", + "dependencies": { + "emittery": "0.10.0", + "keccak": "3.0.1", + "seedrandom": "3.0.5" + }, + "optionalDependencies": { + "@trufflesuite/bigint-buffer": "1.1.9" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@metamask/eth-sig-util": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@metamask/eth-sig-util/-/eth-sig-util-4.0.1.tgz", + "integrity": "sha512-tghyZKLHZjcdlDqCA3gNZmLeR0XvOE9U1qoQO9ohyAZT6Pya+H9vkBPcsyXytmYLNgVoin7CKCmweo/R43V+tQ==", + "dev": true, + "dependencies": { + "ethereumjs-abi": "^0.6.8", + "ethereumjs-util": "^6.2.1", + "ethjs-util": "^0.1.6", + "tweetnacl": "^1.0.3", + "tweetnacl-util": "^0.15.1" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/@metamask/eth-sig-util/node_modules/@types/bn.js": { + "version": "4.11.6", + "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-4.11.6.tgz", + "integrity": "sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@metamask/eth-sig-util/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "node_modules/@metamask/eth-sig-util/node_modules/ethereumjs-util": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz", + "integrity": "sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw==", + "dev": true, + "dependencies": { + "@types/bn.js": "^4.11.3", + "bn.js": "^4.11.0", + "create-hash": "^1.1.2", + "elliptic": "^6.5.2", + "ethereum-cryptography": "^0.1.3", + "ethjs-util": "0.1.6", + "rlp": "^2.2.3" + } + }, + "node_modules/@noble/curves": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.4.2.tgz", + "integrity": "sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw==", + "dependencies": { + "@noble/hashes": "1.4.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@noble/hashes": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz", + "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@noble/secp256k1": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@noble/secp256k1/-/secp256k1-1.7.1.tgz", + "integrity": "sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ] + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nomicfoundation/ethereumjs-block": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-block/-/ethereumjs-block-5.0.1.tgz", + "integrity": "sha512-u1Yioemi6Ckj3xspygu/SfFvm8vZEO8/Yx5a1QLzi6nVU0jz3Pg2OmHKJ5w+D9Ogk1vhwRiqEBAqcb0GVhCyHw==", + "dev": true, + "dependencies": { + "@nomicfoundation/ethereumjs-common": "4.0.1", + "@nomicfoundation/ethereumjs-rlp": "5.0.1", + "@nomicfoundation/ethereumjs-trie": "6.0.1", + "@nomicfoundation/ethereumjs-tx": "5.0.1", + "@nomicfoundation/ethereumjs-util": "9.0.1", + "ethereum-cryptography": "0.1.3", + "ethers": "^5.7.1" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@nomicfoundation/ethereumjs-blockchain": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-blockchain/-/ethereumjs-blockchain-7.0.1.tgz", + "integrity": "sha512-NhzndlGg829XXbqJEYrF1VeZhAwSPgsK/OB7TVrdzft3y918hW5KNd7gIZ85sn6peDZOdjBsAXIpXZ38oBYE5A==", + "dev": true, + "dependencies": { + "@nomicfoundation/ethereumjs-block": "5.0.1", + "@nomicfoundation/ethereumjs-common": "4.0.1", + "@nomicfoundation/ethereumjs-ethash": "3.0.1", + "@nomicfoundation/ethereumjs-rlp": "5.0.1", + "@nomicfoundation/ethereumjs-trie": "6.0.1", + "@nomicfoundation/ethereumjs-tx": "5.0.1", + "@nomicfoundation/ethereumjs-util": "9.0.1", + "abstract-level": "^1.0.3", + "debug": "^4.3.3", + "ethereum-cryptography": "0.1.3", + "level": "^8.0.0", + "lru-cache": "^5.1.1", + "memory-level": "^1.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@nomicfoundation/ethereumjs-common": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-common/-/ethereumjs-common-4.0.1.tgz", + "integrity": "sha512-OBErlkfp54GpeiE06brBW/TTbtbuBJV5YI5Nz/aB2evTDo+KawyEzPjBlSr84z/8MFfj8wS2wxzQX1o32cev5g==", + "dev": true, + "dependencies": { + "@nomicfoundation/ethereumjs-util": "9.0.1", + "crc-32": "^1.2.0" + } + }, + "node_modules/@nomicfoundation/ethereumjs-ethash": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-ethash/-/ethereumjs-ethash-3.0.1.tgz", + "integrity": "sha512-KDjGIB5igzWOp8Ik5I6QiRH5DH+XgILlplsHR7TEuWANZA759G6krQ6o8bvj+tRUz08YygMQu/sGd9mJ1DYT8w==", + "dev": true, + "dependencies": { + "@nomicfoundation/ethereumjs-block": "5.0.1", + "@nomicfoundation/ethereumjs-rlp": "5.0.1", + "@nomicfoundation/ethereumjs-util": "9.0.1", + "abstract-level": "^1.0.3", + "bigint-crypto-utils": "^3.0.23", + "ethereum-cryptography": "0.1.3" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@nomicfoundation/ethereumjs-evm": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-evm/-/ethereumjs-evm-2.0.1.tgz", + "integrity": "sha512-oL8vJcnk0Bx/onl+TgQOQ1t/534GKFaEG17fZmwtPFeH8S5soiBYPCLUrvANOl4sCp9elYxIMzIiTtMtNNN8EQ==", + "dev": true, + "dependencies": { + "@ethersproject/providers": "^5.7.1", + "@nomicfoundation/ethereumjs-common": "4.0.1", + "@nomicfoundation/ethereumjs-tx": "5.0.1", + "@nomicfoundation/ethereumjs-util": "9.0.1", + "debug": "^4.3.3", + "ethereum-cryptography": "0.1.3", + "mcl-wasm": "^0.7.1", + "rustbn.js": "~0.2.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@nomicfoundation/ethereumjs-rlp": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-rlp/-/ethereumjs-rlp-5.0.1.tgz", + "integrity": "sha512-xtxrMGa8kP4zF5ApBQBtjlSbN5E2HI8m8FYgVSYAnO6ssUoY5pVPGy2H8+xdf/bmMa22Ce8nWMH3aEW8CcqMeQ==", + "dev": true, + "bin": { + "rlp": "bin/rlp" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@nomicfoundation/ethereumjs-statemanager": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-statemanager/-/ethereumjs-statemanager-2.0.1.tgz", + "integrity": "sha512-B5ApMOnlruVOR7gisBaYwFX+L/AP7i/2oAahatssjPIBVDF6wTX1K7Qpa39E/nzsH8iYuL3krkYeUFIdO3EMUQ==", + "dev": true, + "dependencies": { + "@nomicfoundation/ethereumjs-common": "4.0.1", + "@nomicfoundation/ethereumjs-rlp": "5.0.1", + "debug": "^4.3.3", + "ethereum-cryptography": "0.1.3", + "ethers": "^5.7.1", + "js-sdsl": "^4.1.4" + } + }, + "node_modules/@nomicfoundation/ethereumjs-trie": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-trie/-/ethereumjs-trie-6.0.1.tgz", + "integrity": "sha512-A64It/IMpDVODzCgxDgAAla8jNjNtsoQZIzZUfIV5AY6Coi4nvn7+VReBn5itlxMiL2yaTlQr9TRWp3CSI6VoA==", + "dev": true, + "dependencies": { + "@nomicfoundation/ethereumjs-rlp": "5.0.1", + "@nomicfoundation/ethereumjs-util": "9.0.1", + "@types/readable-stream": "^2.3.13", + "ethereum-cryptography": "0.1.3", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@nomicfoundation/ethereumjs-tx": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-tx/-/ethereumjs-tx-5.0.1.tgz", + "integrity": "sha512-0HwxUF2u2hrsIM1fsasjXvlbDOq1ZHFV2dd1yGq8CA+MEYhaxZr8OTScpVkkxqMwBcc5y83FyPl0J9MZn3kY0w==", + "dev": true, + "dependencies": { + "@chainsafe/ssz": "^0.9.2", + "@ethersproject/providers": "^5.7.2", + "@nomicfoundation/ethereumjs-common": "4.0.1", + "@nomicfoundation/ethereumjs-rlp": "5.0.1", + "@nomicfoundation/ethereumjs-util": "9.0.1", + "ethereum-cryptography": "0.1.3" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@nomicfoundation/ethereumjs-util": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-util/-/ethereumjs-util-9.0.1.tgz", + "integrity": "sha512-TwbhOWQ8QoSCFhV/DDfSmyfFIHjPjFBj957219+V3jTZYZ2rf9PmDtNOeZWAE3p3vlp8xb02XGpd0v6nTUPbsA==", + "dev": true, + "dependencies": { + "@chainsafe/ssz": "^0.10.0", + "@nomicfoundation/ethereumjs-rlp": "5.0.1", + "ethereum-cryptography": "0.1.3" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@nomicfoundation/ethereumjs-util/node_modules/@chainsafe/persistent-merkle-tree": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@chainsafe/persistent-merkle-tree/-/persistent-merkle-tree-0.5.0.tgz", + "integrity": "sha512-l0V1b5clxA3iwQLXP40zYjyZYospQLZXzBVIhhr9kDg/1qHZfzzHw0jj4VPBijfYCArZDlPkRi1wZaV2POKeuw==", + "dev": true, + "dependencies": { + "@chainsafe/as-sha256": "^0.3.1" + } + }, + "node_modules/@nomicfoundation/ethereumjs-util/node_modules/@chainsafe/ssz": { + "version": "0.10.2", + "resolved": "https://registry.npmjs.org/@chainsafe/ssz/-/ssz-0.10.2.tgz", + "integrity": "sha512-/NL3Lh8K+0q7A3LsiFq09YXS9fPE+ead2rr7vM2QK8PLzrNsw3uqrif9bpRX5UxgeRjM+vYi+boCM3+GM4ovXg==", + "dev": true, + "dependencies": { + "@chainsafe/as-sha256": "^0.3.1", + "@chainsafe/persistent-merkle-tree": "^0.5.0" + } + }, + "node_modules/@nomicfoundation/ethereumjs-vm": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-vm/-/ethereumjs-vm-7.0.1.tgz", + "integrity": "sha512-rArhyn0jPsS/D+ApFsz3yVJMQ29+pVzNZ0VJgkzAZ+7FqXSRtThl1C1prhmlVr3YNUlfpZ69Ak+RUT4g7VoOuQ==", + "dev": true, + "dependencies": { + "@nomicfoundation/ethereumjs-block": "5.0.1", + "@nomicfoundation/ethereumjs-blockchain": "7.0.1", + "@nomicfoundation/ethereumjs-common": "4.0.1", + "@nomicfoundation/ethereumjs-evm": "2.0.1", + "@nomicfoundation/ethereumjs-rlp": "5.0.1", + "@nomicfoundation/ethereumjs-statemanager": "2.0.1", + "@nomicfoundation/ethereumjs-trie": "6.0.1", + "@nomicfoundation/ethereumjs-tx": "5.0.1", + "@nomicfoundation/ethereumjs-util": "9.0.1", + "debug": "^4.3.3", + "ethereum-cryptography": "0.1.3", + "mcl-wasm": "^0.7.1", + "rustbn.js": "~0.2.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@nomicfoundation/hardhat-chai-matchers": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-chai-matchers/-/hardhat-chai-matchers-1.0.6.tgz", + "integrity": "sha512-f5ZMNmabZeZegEfuxn/0kW+mm7+yV7VNDxLpMOMGXWFJ2l/Ct3QShujzDRF9cOkK9Ui/hbDeOWGZqyQALDXVCQ==", + "dev": true, + "dependencies": { + "@ethersproject/abi": "^5.1.2", + "@types/chai-as-promised": "^7.1.3", + "chai-as-promised": "^7.1.1", + "deep-eql": "^4.0.1", + "ordinal": "^1.0.3" + }, + "peerDependencies": { + "@nomiclabs/hardhat-ethers": "^2.0.0", + "chai": "^4.2.0", + "ethers": "^5.0.0", + "hardhat": "^2.9.4" + } + }, + "node_modules/@nomicfoundation/hardhat-network-helpers": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-network-helpers/-/hardhat-network-helpers-1.0.8.tgz", + "integrity": "sha512-MNqQbzUJZnCMIYvlniC3U+kcavz/PhhQSsY90tbEtUyMj/IQqsLwIRZa4ctjABh3Bz0KCh9OXUZ7Yk/d9hr45Q==", + "dev": true, + "dependencies": { + "ethereumjs-util": "^7.1.4" + }, + "peerDependencies": { + "hardhat": "^2.9.5" + } + }, + "node_modules/@nomicfoundation/hardhat-verify": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-verify/-/hardhat-verify-1.1.1.tgz", + "integrity": "sha512-9QsTYD7pcZaQFEA3tBb/D/oCStYDiEVDN7Dxeo/4SCyHRSm86APypxxdOMEPlGmXsAvd+p1j/dTODcpxb8aztA==", + "dev": true, + "dependencies": { + "@ethersproject/abi": "^5.1.2", + "@ethersproject/address": "^5.0.2", + "cbor": "^8.1.0", + "chalk": "^2.4.2", + "debug": "^4.1.1", + "lodash.clonedeep": "^4.5.0", + "semver": "^6.3.0", + "table": "^6.8.0", + "undici": "^5.14.0" + }, + "peerDependencies": { + "hardhat": "^2.0.4" + } + }, + "node_modules/@nomicfoundation/solidity-analyzer": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer/-/solidity-analyzer-0.1.1.tgz", + "integrity": "sha512-1LMtXj1puAxyFusBgUIy5pZk3073cNXYnXUpuNKFghHbIit/xZgbk0AokpUADbNm3gyD6bFWl3LRFh3dhVdREg==", + "dev": true, + "engines": { + "node": ">= 12" + }, + "optionalDependencies": { + "@nomicfoundation/solidity-analyzer-darwin-arm64": "0.1.1", + "@nomicfoundation/solidity-analyzer-darwin-x64": "0.1.1", + "@nomicfoundation/solidity-analyzer-freebsd-x64": "0.1.1", + "@nomicfoundation/solidity-analyzer-linux-arm64-gnu": "0.1.1", + "@nomicfoundation/solidity-analyzer-linux-arm64-musl": "0.1.1", + "@nomicfoundation/solidity-analyzer-linux-x64-gnu": "0.1.1", + "@nomicfoundation/solidity-analyzer-linux-x64-musl": "0.1.1", + "@nomicfoundation/solidity-analyzer-win32-arm64-msvc": "0.1.1", + "@nomicfoundation/solidity-analyzer-win32-ia32-msvc": "0.1.1", + "@nomicfoundation/solidity-analyzer-win32-x64-msvc": "0.1.1" + } + }, + "node_modules/@nomicfoundation/solidity-analyzer-darwin-arm64": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-darwin-arm64/-/solidity-analyzer-darwin-arm64-0.1.1.tgz", + "integrity": "sha512-KcTodaQw8ivDZyF+D76FokN/HdpgGpfjc/gFCImdLUyqB6eSWVaZPazMbeAjmfhx3R0zm/NYVzxwAokFKgrc0w==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nomicfoundation/solidity-analyzer-darwin-x64": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-darwin-x64/-/solidity-analyzer-darwin-x64-0.1.1.tgz", + "integrity": "sha512-XhQG4BaJE6cIbjAVtzGOGbK3sn1BO9W29uhk9J8y8fZF1DYz0Doj8QDMfpMu+A6TjPDs61lbsmeYodIDnfveSA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nomicfoundation/solidity-analyzer-freebsd-x64": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-freebsd-x64/-/solidity-analyzer-freebsd-x64-0.1.1.tgz", + "integrity": "sha512-GHF1VKRdHW3G8CndkwdaeLkVBi5A9u2jwtlS7SLhBc8b5U/GcoL39Q+1CSO3hYqePNP+eV5YI7Zgm0ea6kMHoA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nomicfoundation/solidity-analyzer-linux-arm64-gnu": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-arm64-gnu/-/solidity-analyzer-linux-arm64-gnu-0.1.1.tgz", + "integrity": "sha512-g4Cv2fO37ZsUENQ2vwPnZc2zRenHyAxHcyBjKcjaSmmkKrFr64yvzeNO8S3GBFCo90rfochLs99wFVGT/0owpg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nomicfoundation/solidity-analyzer-linux-arm64-musl": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-arm64-musl/-/solidity-analyzer-linux-arm64-musl-0.1.1.tgz", + "integrity": "sha512-WJ3CE5Oek25OGE3WwzK7oaopY8xMw9Lhb0mlYuJl/maZVo+WtP36XoQTb7bW/i8aAdHW5Z+BqrHMux23pvxG3w==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nomicfoundation/solidity-analyzer-linux-x64-gnu": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-x64-gnu/-/solidity-analyzer-linux-x64-gnu-0.1.1.tgz", + "integrity": "sha512-5WN7leSr5fkUBBjE4f3wKENUy9HQStu7HmWqbtknfXkkil+eNWiBV275IOlpXku7v3uLsXTOKpnnGHJYI2qsdA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nomicfoundation/solidity-analyzer-linux-x64-musl": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-x64-musl/-/solidity-analyzer-linux-x64-musl-0.1.1.tgz", + "integrity": "sha512-KdYMkJOq0SYPQMmErv/63CwGwMm5XHenEna9X9aB8mQmhDBrYrlAOSsIPgFCUSL0hjxE3xHP65/EPXR/InD2+w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nomicfoundation/solidity-analyzer-win32-arm64-msvc": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-arm64-msvc/-/solidity-analyzer-win32-arm64-msvc-0.1.1.tgz", + "integrity": "sha512-VFZASBfl4qiBYwW5xeY20exWhmv6ww9sWu/krWSesv3q5hA0o1JuzmPHR4LPN6SUZj5vcqci0O6JOL8BPw+APg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nomicfoundation/solidity-analyzer-win32-ia32-msvc": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-ia32-msvc/-/solidity-analyzer-win32-ia32-msvc-0.1.1.tgz", + "integrity": "sha512-JnFkYuyCSA70j6Si6cS1A9Gh1aHTEb8kOTBApp/c7NRTFGNMH8eaInKlyuuiIbvYFhlXW4LicqyYuWNNq9hkpQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nomicfoundation/solidity-analyzer-win32-x64-msvc": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-x64-msvc/-/solidity-analyzer-win32-x64-msvc-0.1.1.tgz", + "integrity": "sha512-HrVJr6+WjIXGnw3Q9u6KQcbZCtk0caVWhCdFADySvRyUxJ8PnzlaP+MhwNE8oyT8OZ6ejHBRrrgjSqDCFXGirw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nomiclabs/hardhat-ethers": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/@nomiclabs/hardhat-ethers/-/hardhat-ethers-2.2.3.tgz", + "integrity": "sha512-YhzPdzb612X591FOe68q+qXVXGG2ANZRvDo0RRUtimev85rCrAlv/TLMEZw5c+kq9AbzocLTVX/h2jVIFPL9Xg==", + "dev": true, + "peerDependencies": { + "ethers": "^5.0.0", + "hardhat": "^2.0.0" + } + }, + "node_modules/@nomiclabs/hardhat-etherscan": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/@nomiclabs/hardhat-etherscan/-/hardhat-etherscan-3.1.7.tgz", + "integrity": "sha512-tZ3TvSgpvsQ6B6OGmo1/Au6u8BrAkvs1mIC/eURA3xgIfznUZBhmpne8hv7BXUzw9xNL3fXdpOYgOQlVMTcoHQ==", + "deprecated": "The @nomiclabs/hardhat-etherscan package is deprecated, please use @nomicfoundation/hardhat-verify instead", + "dev": true, + "dependencies": { + "@ethersproject/abi": "^5.1.2", + "@ethersproject/address": "^5.0.2", + "cbor": "^8.1.0", + "chalk": "^2.4.2", + "debug": "^4.1.1", + "fs-extra": "^7.0.1", + "lodash": "^4.17.11", + "semver": "^6.3.0", + "table": "^6.8.0", + "undici": "^5.14.0" + }, + "peerDependencies": { + "hardhat": "^2.0.4" + } + }, + "node_modules/@openzeppelin/contracts": { + "version": "4.9.3", + "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-4.9.3.tgz", + "integrity": "sha512-He3LieZ1pP2TNt5JbkPA4PNT9WC3gOTOlDcFGJW4Le4QKqwmiNJCRt44APfxMxvq7OugU/cqYuPcSBzOw38DAg==" + }, + "node_modules/@resolver-engine/core": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@resolver-engine/core/-/core-0.3.3.tgz", + "integrity": "sha512-eB8nEbKDJJBi5p5SrvrvILn4a0h42bKtbCTri3ZxCGt6UvoQyp7HnGOfki944bUjBSHKK3RvgfViHn+kqdXtnQ==", + "dependencies": { + "debug": "^3.1.0", + "is-url": "^1.2.4", + "request": "^2.85.0" + } + }, + "node_modules/@resolver-engine/core/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/@resolver-engine/fs": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@resolver-engine/fs/-/fs-0.3.3.tgz", + "integrity": "sha512-wQ9RhPUcny02Wm0IuJwYMyAG8fXVeKdmhm8xizNByD4ryZlx6PP6kRen+t/haF43cMfmaV7T3Cx6ChOdHEhFUQ==", + "dependencies": { + "@resolver-engine/core": "^0.3.3", + "debug": "^3.1.0" + } + }, + "node_modules/@resolver-engine/fs/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/@resolver-engine/imports": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@resolver-engine/imports/-/imports-0.3.3.tgz", + "integrity": "sha512-anHpS4wN4sRMwsAbMXhMfOD/y4a4Oo0Cw/5+rue7hSwGWsDOQaAU1ClK1OxjUC35/peazxEl8JaSRRS+Xb8t3Q==", + "dependencies": { + "@resolver-engine/core": "^0.3.3", + "debug": "^3.1.0", + "hosted-git-info": "^2.6.0", + "path-browserify": "^1.0.0", + "url": "^0.11.0" + } + }, + "node_modules/@resolver-engine/imports-fs": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@resolver-engine/imports-fs/-/imports-fs-0.3.3.tgz", + "integrity": "sha512-7Pjg/ZAZtxpeyCFlZR5zqYkz+Wdo84ugB5LApwriT8XFeQoLwGUj4tZFFvvCuxaNCcqZzCYbonJgmGObYBzyCA==", + "dependencies": { + "@resolver-engine/fs": "^0.3.3", + "@resolver-engine/imports": "^0.3.3", + "debug": "^3.1.0" + } + }, + "node_modules/@resolver-engine/imports-fs/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/@resolver-engine/imports/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/@scure/base": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.7.tgz", + "integrity": "sha512-PPNYBslrLNNUQ/Yad37MHYsNQtK67EhWb6WtSvNLLPo7SdVZgkUjD6Dg+5On7zNwmskf8OX7I7Nx5oN+MIWE0g==", + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@scure/bip32": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.4.0.tgz", + "integrity": "sha512-sVUpc0Vq3tXCkDGYVWGIZTRfnvu8LoTDaev7vbwh0omSvVORONr960MQWdKqJDCReIEmTj3PAr73O3aoxz7OPg==", + "dependencies": { + "@noble/curves": "~1.4.0", + "@noble/hashes": "~1.4.0", + "@scure/base": "~1.1.6" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@scure/bip39": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.3.0.tgz", + "integrity": "sha512-disdg7gHuTDZtY+ZdkmLpPCk7fxZSu3gBiEGuoC1XYxv9cGx3Z6cpTggCgW6odSOOIXCiDjuGejW+aJKCY/pIQ==", + "dependencies": { + "@noble/hashes": "~1.4.0", + "@scure/base": "~1.1.6" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@sentry/core": { + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-5.30.0.tgz", + "integrity": "sha512-TmfrII8w1PQZSZgPpUESqjB+jC6MvZJZdLtE/0hZ+SrnKhW3x5WlYLvTXZpcWePYBku7rl2wn1RZu6uT0qCTeg==", + "dev": true, + "dependencies": { + "@sentry/hub": "5.30.0", + "@sentry/minimal": "5.30.0", + "@sentry/types": "5.30.0", + "@sentry/utils": "5.30.0", + "tslib": "^1.9.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@sentry/hub": { + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@sentry/hub/-/hub-5.30.0.tgz", + "integrity": "sha512-2tYrGnzb1gKz2EkMDQcfLrDTvmGcQPuWxLnJKXJvYTQDGLlEvi2tWz1VIHjunmOvJrB5aIQLhm+dcMRwFZDCqQ==", + "dev": true, + "dependencies": { + "@sentry/types": "5.30.0", + "@sentry/utils": "5.30.0", + "tslib": "^1.9.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@sentry/minimal": { + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@sentry/minimal/-/minimal-5.30.0.tgz", + "integrity": "sha512-BwWb/owZKtkDX+Sc4zCSTNcvZUq7YcH3uAVlmh/gtR9rmUvbzAA3ewLuB3myi4wWRAMEtny6+J/FN/x+2wn9Xw==", + "dev": true, + "dependencies": { + "@sentry/hub": "5.30.0", + "@sentry/types": "5.30.0", + "tslib": "^1.9.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@sentry/node": { + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@sentry/node/-/node-5.30.0.tgz", + "integrity": "sha512-Br5oyVBF0fZo6ZS9bxbJZG4ApAjRqAnqFFurMVJJdunNb80brh7a5Qva2kjhm+U6r9NJAB5OmDyPkA1Qnt+QVg==", + "dev": true, + "dependencies": { + "@sentry/core": "5.30.0", + "@sentry/hub": "5.30.0", + "@sentry/tracing": "5.30.0", + "@sentry/types": "5.30.0", + "@sentry/utils": "5.30.0", + "cookie": "^0.4.1", + "https-proxy-agent": "^5.0.0", + "lru_map": "^0.3.3", + "tslib": "^1.9.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@sentry/tracing": { + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@sentry/tracing/-/tracing-5.30.0.tgz", + "integrity": "sha512-dUFowCr0AIMwiLD7Fs314Mdzcug+gBVo/+NCMyDw8tFxJkwWAKl7Qa2OZxLQ0ZHjakcj1hNKfCQJ9rhyfOl4Aw==", + "dev": true, + "dependencies": { + "@sentry/hub": "5.30.0", + "@sentry/minimal": "5.30.0", + "@sentry/types": "5.30.0", + "@sentry/utils": "5.30.0", + "tslib": "^1.9.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@sentry/types": { + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-5.30.0.tgz", + "integrity": "sha512-R8xOqlSTZ+htqrfteCWU5Nk0CDN5ApUTvrlvBuiH1DyP6czDZ4ktbZB0hAgBlVcK0U+qpD3ag3Tqqpa5Q67rPw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@sentry/utils": { + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-5.30.0.tgz", + "integrity": "sha512-zaYmoH0NWWtvnJjC9/CBseXMtKHm/tm40sz3YfJRxeQjyzRqNQPgivpd9R/oDJCYj999mzdW382p/qi2ypjLww==", + "dev": true, + "dependencies": { + "@sentry/types": "5.30.0", + "tslib": "^1.9.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@solidity-parser/parser": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.14.5.tgz", + "integrity": "sha512-6dKnHZn7fg/iQATVEzqyUOyEidbn05q7YA2mQ9hC0MMXhhV3/JrsxmFSYZAcr7j1yUP700LLhTruvJ3MiQmjJg==", + "dev": true, + "dependencies": { + "antlr4ts": "^0.5.0-alpha.4" + } + }, + "node_modules/@trufflesuite/bigint-buffer": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/@trufflesuite/bigint-buffer/-/bigint-buffer-1.1.9.tgz", + "integrity": "sha512-bdM5cEGCOhDSwminryHJbRmXc1x7dPKg6Pqns3qyTwFlxsqUgxE29lsERS3PlIW1HTjoIGMUqsk1zQQwST1Yxw==", + "hasInstallScript": true, + "optional": true, + "dependencies": { + "node-gyp-build": "4.3.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@trufflesuite/bigint-buffer/node_modules/node-gyp-build": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.3.0.tgz", + "integrity": "sha512-iWjXZvmboq0ja1pUGULQBexmxq8CV4xBhX7VDOTbL7ZR4FOowwY/VOtRxBN/yKxmdGoIp4j5ysNT4u3S2pDQ3Q==", + "optional": true, + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" + } + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", + "dev": true + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "dev": true + }, + "node_modules/@typechain/ethers-v5": { + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/@typechain/ethers-v5/-/ethers-v5-10.2.1.tgz", + "integrity": "sha512-n3tQmCZjRE6IU4h6lqUGiQ1j866n5MTCBJreNEHHVWXa2u9GJTaeYyU1/k+1qLutkyw+sS6VAN+AbeiTqsxd/A==", + "dependencies": { + "lodash": "^4.17.15", + "ts-essentials": "^7.0.1" + }, + "peerDependencies": { + "@ethersproject/abi": "^5.0.0", + "@ethersproject/providers": "^5.0.0", + "ethers": "^5.1.3", + "typechain": "^8.1.1", + "typescript": ">=4.3.0" + } + }, + "node_modules/@typechain/hardhat": { + "version": "6.1.6", + "resolved": "https://registry.npmjs.org/@typechain/hardhat/-/hardhat-6.1.6.tgz", + "integrity": "sha512-BiVnegSs+ZHVymyidtK472syodx1sXYlYJJixZfRstHVGYTi8V1O7QG4nsjyb0PC/LORcq7sfBUcHto1y6UgJA==", + "dev": true, + "dependencies": { + "fs-extra": "^9.1.0" + }, + "peerDependencies": { + "@ethersproject/abi": "^5.4.7", + "@ethersproject/providers": "^5.4.7", + "@typechain/ethers-v5": "^10.2.1", + "ethers": "^5.4.7", + "hardhat": "^2.9.9", + "typechain": "^8.1.1" + } + }, + "node_modules/@typechain/hardhat/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typechain/hardhat/node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@typechain/hardhat/node_modules/universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@types/abstract-leveldown": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/@types/abstract-leveldown/-/abstract-leveldown-7.2.1.tgz", + "integrity": "sha512-YK8irIC+eMrrmtGx0H4ISn9GgzLd9dojZWJaMbjp1YHLl2VqqNFBNrL5Q3KjGf4VE3sf/4hmq6EhQZ7kZp1NoQ==" + }, + "node_modules/@types/bn.js": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.1.tgz", + "integrity": "sha512-qNrYbZqMx0uJAfKnKclPh+dTwK33KfLHYqtyODwd5HnXOjnkhc4qgn3BrK6RWyGZm5+sIFE7Q7Vz6QQtJB7w7g==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/chai": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.5.tgz", + "integrity": "sha512-mEo1sAde+UCE6b2hxn332f1g1E8WfYRu6p5SvTKr2ZKC1f7gFJXk4h5PyGP9Dt6gCaG8y8XhwnXWC6Iy2cmBng==", + "dev": true + }, + "node_modules/@types/chai-as-promised": { + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/@types/chai-as-promised/-/chai-as-promised-7.1.5.tgz", + "integrity": "sha512-jStwss93SITGBwt/niYrkf2C+/1KTeZCZl1LaeezTlqppAKeoQC7jxyqYuP72sxBGKCIbw7oHgbYssIRzT5FCQ==", + "dev": true, + "dependencies": { + "@types/chai": "*" + } + }, + "node_modules/@types/concat-stream": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-1.6.1.tgz", + "integrity": "sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/form-data": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-0.0.33.tgz", + "integrity": "sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", + "dev": true, + "dependencies": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "node_modules/@types/level-errors": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/level-errors/-/level-errors-3.0.0.tgz", + "integrity": "sha512-/lMtoq/Cf/2DVOm6zE6ORyOM+3ZVm/BvzEZVxUhf6bgh8ZHglXlBqxbxSlJeVp8FCbD3IVvk/VbsaNmDjrQvqQ==" + }, + "node_modules/@types/levelup": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@types/levelup/-/levelup-4.3.3.tgz", + "integrity": "sha512-K+OTIjJcZHVlZQN1HmU64VtrC0jC3dXWQozuEIR9zVvltIk90zaGPM2AgT+fIkChpzHhFE3YnvFLCbLtzAmexA==", + "dependencies": { + "@types/abstract-leveldown": "*", + "@types/level-errors": "*", + "@types/node": "*" + } + }, + "node_modules/@types/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@types/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw==", + "dev": true + }, + "node_modules/@types/minimatch": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", + "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==", + "dev": true + }, + "node_modules/@types/mkdirp": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/@types/mkdirp/-/mkdirp-0.5.2.tgz", + "integrity": "sha512-U5icWpv7YnZYGsN4/cmh3WD2onMY0aJIiTE6+51TwJCttdHvtCYmkBNOobHlXwrJRL0nkH9jH4kD+1FAdMN4Tg==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/mocha": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.1.tgz", + "integrity": "sha512-/fvYntiO1GeICvqbQ3doGDIP97vWmvFt83GKguJ6prmQM2iXZfFcq6YE8KteFyRtX2/h5Hf91BYvPodJKFYv5Q==", + "dev": true + }, + "node_modules/@types/node": { + "version": "20.3.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.3.1.tgz", + "integrity": "sha512-EhcH/wvidPy1WeML3TtYFGR83UzjxeWRen9V402T8aUGYsCHOmfoisV3ZSg03gAFIbLq8TnWOJ0f4cALtnSEUg==" + }, + "node_modules/@types/node-fetch": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.4.tgz", + "integrity": "sha512-1ZX9fcN4Rvkvgv4E6PAY5WXUFWFcRWxZa3EW83UjycOB9ljJCedb2CupIP4RZMEwF/M3eTcCihbBRgwtGbg5Rg==", + "dependencies": { + "@types/node": "*", + "form-data": "^3.0.0" + } + }, + "node_modules/@types/pbkdf2": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@types/pbkdf2/-/pbkdf2-3.1.0.tgz", + "integrity": "sha512-Cf63Rv7jCQ0LaL8tNXmEyqTHuIJxRdlS5vMh1mj5voN4+QFhVZnlZruezqpWYDiJ8UTzhP0VmeLXCmBk66YrMQ==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/prettier": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.3.tgz", + "integrity": "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==" + }, + "node_modules/@types/qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", + "dev": true + }, + "node_modules/@types/readable-stream": { + "version": "2.3.15", + "resolved": "https://registry.npmjs.org/@types/readable-stream/-/readable-stream-2.3.15.tgz", + "integrity": "sha512-oM5JSKQCcICF1wvGgmecmHldZ48OZamtMxcGGVICOJA8o8cahXC1zEVAif8iwoc5j8etxFaRFnf095+CDsuoFQ==", + "dev": true, + "dependencies": { + "@types/node": "*", + "safe-buffer": "~5.1.1" + } + }, + "node_modules/@types/readable-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/@types/secp256k1": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@types/secp256k1/-/secp256k1-4.0.3.tgz", + "integrity": "sha512-Da66lEIFeIz9ltsdMZcpQvmrmmoqrfju8pm1BH8WbYjZSwUgCwXLb9C+9XYogwBITnbsSaMdVPb2ekf7TV+03w==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@zk-email/contracts": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@zk-email/contracts/-/contracts-3.2.0.tgz", + "integrity": "sha512-ii9BOu39PPbwW3wPt/epaaXp3Ys9Tlhg50i+11Y9lbuiJq9h81iyLLt9Y5mpKyBQj0NiBvGrHAIVjB1sTitV2Q==", + "dependencies": { + "@openzeppelin/contracts": "^4.9.3" + } + }, + "node_modules/abbrev": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz", + "integrity": "sha512-LEyx4aLEC3x6T0UguF6YILf+ntvmOaWsVfENmIW0E9H09vKlLDGelMjjSm0jkDHALj8A8quZ/HapKNigzwge+Q==", + "dev": true + }, + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "dev": true, + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, + "node_modules/abstract-level": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/abstract-level/-/abstract-level-1.0.3.tgz", + "integrity": "sha512-t6jv+xHy+VYwc4xqZMn2Pa9DjcdzvzZmQGRjTFc8spIbRGHgBrEKbPq+rYXc7CCo0lxgYvSgKVg9qZAhpVQSjA==", + "dev": true, + "dependencies": { + "buffer": "^6.0.3", + "catering": "^2.1.0", + "is-buffer": "^2.0.5", + "level-supports": "^4.0.0", + "level-transcoder": "^1.0.1", + "module-error": "^1.0.1", + "queue-microtask": "^1.2.3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/abstract-leveldown": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-6.3.0.tgz", + "integrity": "sha512-TU5nlYgta8YrBMNpc9FwQzRbiXsj49gsALsXadbGHt9CROPzX5fB0rWDR5mtdpOOKa5XqRFpbj1QroPAoPzVjQ==", + "dependencies": { + "buffer": "^5.5.0", + "immediate": "^3.2.3", + "level-concat-iterator": "~2.0.0", + "level-supports": "~1.0.0", + "xtend": "~4.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/abstract-leveldown/node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/abstract-leveldown/node_modules/level-supports": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/level-supports/-/level-supports-1.0.1.tgz", + "integrity": "sha512-rXM7GYnW8gsl1vedTJIbzOrRv85c/2uCMpiiCzO2fndd06U/kUXEEU9evYn4zFggBOg36IsBW8LzqIpETwwQzg==", + "dependencies": { + "xtend": "^4.0.2" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/acorn": { + "version": "8.9.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.9.0.tgz", + "integrity": "sha512-jaVNAFBHNLXspO543WnNNPZFRtavh3skAkITqD0/2aeMkKZTN+254PyhwxFYrk3vQ1xfY+2wbesJMs/JC8/PwQ==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/address": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/address/-/address-1.2.2.tgz", + "integrity": "sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/adm-zip": { + "version": "0.4.16", + "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.16.tgz", + "integrity": "sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg==", + "dev": true, + "engines": { + "node": ">=0.3.0" + } + }, + "node_modules/aes-js": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz", + "integrity": "sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==" + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg==", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.4.2" + } + }, + "node_modules/ansi-colors": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", + "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/antlr4ts": { + "version": "0.5.0-alpha.4", + "resolved": "https://registry.npmjs.org/antlr4ts/-/antlr4ts-0.5.0-alpha.4.tgz", + "integrity": "sha512-WPQDt1B74OfPv/IMS2ekXAKkTZIHl88uMetg6q3OTqgFxZ/dxDXI0EWLyZid/1Pe6hTftyg5N7gel5wNAGxXyQ==", + "dev": true + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/array-back": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-3.1.0.tgz", + "integrity": "sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==", + "engines": { + "node": ">=6" + } + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", + "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "is-array-buffer": "^3.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array.prototype.reduce": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/array.prototype.reduce/-/array.prototype.reduce-1.0.5.tgz", + "integrity": "sha512-kDdugMl7id9COE8R7MHF5jWk7Dqt/fs4Pv+JXoICnYwqpjjjbUurz6w5fT5IG6brLdJhv6/VoHB0H7oyIBXd+Q==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-array-method-boxes-properly": "^1.0.0", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", + "dev": true + }, + "node_modules/asn1": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", + "dependencies": { + "safer-buffer": "~2.1.0" + } + }, + "node_modules/assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/async": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", + "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", + "dependencies": { + "lodash": "^4.17.14" + } + }, + "node_modules/async-eventemitter": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/async-eventemitter/-/async-eventemitter-0.2.4.tgz", + "integrity": "sha512-pd20BwL7Yt1zwDFy+8MX8F1+WCT8aQeKj0kQnTrH9WaeRETlRamVhD0JtRPmrV4GfOJ2F9CvdQkZeZhnh2TuHw==", + "dependencies": { + "async": "^2.4.0" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "node_modules/at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", + "engines": { + "node": "*" + } + }, + "node_modules/aws4": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz", + "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==" + }, + "node_modules/axios": { + "version": "0.21.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", + "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", + "dev": true, + "dependencies": { + "follow-redirects": "^1.14.0" + } + }, + "node_modules/b4a": { + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.4.tgz", + "integrity": "sha512-fpWrvyVHEKyeEvbKZTVOeZF3VSKKWtJxFIxX/jaVPf+cLbGUSitjb49pHLqPV2BUNNZ0LcoeEGfE/YCpyDYHIw==" + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/base-x": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.9.tgz", + "integrity": "sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", + "dependencies": { + "tweetnacl": "^0.14.3" + } + }, + "node_modules/bcrypt-pbkdf/node_modules/tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==" + }, + "node_modules/bech32": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz", + "integrity": "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==" + }, + "node_modules/bigint-crypto-utils": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/bigint-crypto-utils/-/bigint-crypto-utils-3.2.2.tgz", + "integrity": "sha512-U1RbE3aX9ayCUVcIPHuPDPKcK3SFOXf93J1UK/iHlJuQB7bhagPIX06/CLpLEsDThJ7KA4Dhrnzynl+d2weTiw==", + "dev": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/bignumber.js": { + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.1.tgz", + "integrity": "sha512-pHm4LsMJ6lzgNGVfZHjMoO8sdoRhOzOH4MLmY65Jg70bpxCKu5iOHNJyfF6OyvYw7t8Fpf35RuzUyqnQsj8Vig==", + "engines": { + "node": "*" + } + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/bip39": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/bip39/-/bip39-3.0.4.tgz", + "integrity": "sha512-YZKQlb752TrUWqHWj7XAwCSjYEgGAk+/Aas3V7NyjQeZYsztO8JnQUaCWhcnL4T+jL8nvB8typ2jRPzTlgugNw==", + "dependencies": { + "@types/node": "11.11.6", + "create-hash": "^1.1.0", + "pbkdf2": "^3.0.9", + "randombytes": "^2.0.1" + } + }, + "node_modules/bip39/node_modules/@types/node": { + "version": "11.11.6", + "resolved": "https://registry.npmjs.org/@types/node/-/node-11.11.6.tgz", + "integrity": "sha512-Exw4yUWMBXM3X+8oqzJNRqZSwUAaS4+7NdvHqQuFi/d+synz++xmX3QIf+BFqneW8N31R8Ky+sikfZUXq07ggQ==" + }, + "node_modules/blake-hash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/blake-hash/-/blake-hash-2.0.0.tgz", + "integrity": "sha512-Igj8YowDu1PRkRsxZA7NVkdFNxH5rKv5cpLxQ0CVXSIA77pVYwCPRQJ2sMew/oneUpfuYRyjG6r8SmmmnbZb1w==", + "hasInstallScript": true, + "dependencies": { + "node-addon-api": "^3.0.0", + "node-gyp-build": "^4.2.2", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/blake2b": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/blake2b/-/blake2b-2.1.4.tgz", + "integrity": "sha512-AyBuuJNI64gIvwx13qiICz6H6hpmjvYS5DGkG6jbXMOT8Z3WUJ3V1X0FlhIoT1b/5JtHE3ki+xjtMvu1nn+t9A==", + "dependencies": { + "blake2b-wasm": "^2.4.0", + "nanoassert": "^2.0.0" + } + }, + "node_modules/blake2b-wasm": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/blake2b-wasm/-/blake2b-wasm-2.4.0.tgz", + "integrity": "sha512-S1kwmW2ZhZFFFOghcx73+ZajEfKBqhP82JMssxtLVMxlaPea1p9uoLiUZ5WYyHn0KddwbLc+0vh4wR0KBNoT5w==", + "dependencies": { + "b4a": "^1.0.1", + "nanoassert": "^2.0.0" + } + }, + "node_modules/blakejs": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/blakejs/-/blakejs-1.2.1.tgz", + "integrity": "sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ==" + }, + "node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "peer": true + }, + "node_modules/bn.js": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==" + }, + "node_modules/browser-level": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browser-level/-/browser-level-1.0.1.tgz", + "integrity": "sha512-XECYKJ+Dbzw0lbydyQuJzwNXtOpbMSq737qxJN11sIRTErOMShvDpbzTlgju7orJKvx4epULolZAuJGLzCmWRQ==", + "dev": true, + "dependencies": { + "abstract-level": "^1.0.2", + "catering": "^2.1.1", + "module-error": "^1.0.2", + "run-parallel-limit": "^1.1.0" + } + }, + "node_modules/browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true + }, + "node_modules/browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "dependencies": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/browserify-aes/node_modules/buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==" + }, + "node_modules/bs58": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", + "integrity": "sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==", + "dependencies": { + "base-x": "^3.0.2" + } + }, + "node_modules/bs58check": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-2.1.2.tgz", + "integrity": "sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==", + "dependencies": { + "bs58": "^4.0.0", + "create-hash": "^1.1.0", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "node_modules/buffer-xor": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-2.0.2.tgz", + "integrity": "sha512-eHslX0bin3GB+Lx2p7lEYRShRewuNZL3fUl4qlVJGGiwoPGftmt8JQgk2Y9Ji5/01TnVDo33E5b5O3vUB1HdqQ==", + "dependencies": { + "safe-buffer": "^5.1.1" + } + }, + "node_modules/busboy": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", + "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", + "dev": true, + "dependencies": { + "streamsearch": "^1.1.0" + }, + "engines": { + "node": ">=10.16.0" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/case": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/case/-/case-1.6.3.tgz", + "integrity": "sha512-mzDSXIPaFwVDvZAHqZ9VlbyF4yyXRuX6IvB06WvPYkqJVO24kX1PPhv9bfpKNFZyxYFmmgo03HUiD8iklmJYRQ==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" + }, + "node_modules/catering": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/catering/-/catering-2.1.1.tgz", + "integrity": "sha512-K7Qy8O9p76sL3/3m7/zLKbRkyOlSZAgzEaLhyj2mXS8PsCud2Eo4hAb8aLtZqHh0QGqLcb9dlJSu6lHRVENm1w==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/cbor": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/cbor/-/cbor-8.1.0.tgz", + "integrity": "sha512-DwGjNW9omn6EwP70aXsn7FQJx5kO12tX0bZkaTjzdVFM6/7nhA4t0EENocKGx6D2Bch9PE2KzCUf5SceBdeijg==", + "dev": true, + "dependencies": { + "nofilter": "^3.1.0" + }, + "engines": { + "node": ">=12.19" + } + }, + "node_modules/chai": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.7.tgz", + "integrity": "sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==", + "dev": true, + "dependencies": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.2", + "deep-eql": "^4.1.2", + "get-func-name": "^2.0.0", + "loupe": "^2.3.1", + "pathval": "^1.1.1", + "type-detect": "^4.0.5" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chai-as-promised": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/chai-as-promised/-/chai-as-promised-7.1.1.tgz", + "integrity": "sha512-azL6xMoi+uxu6z4rhWQ1jbdUhOMhis2PvscD/xjLqNMkv3BPPp2JyyuTHOrf9BOosGpNQ11v6BKv/g57RXbiaA==", + "dev": true, + "dependencies": { + "check-error": "^1.0.2" + }, + "peerDependencies": { + "chai": ">= 2.1.2 < 5" + } + }, + "node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/charenc": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", + "integrity": "sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/check-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "dev": true + }, + "node_modules/cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/circomlibjs": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/circomlibjs/-/circomlibjs-0.1.7.tgz", + "integrity": "sha512-GRAUoAlKAsiiTa+PA725G9RmEmJJRc8tRFxw/zKktUxlQISGznT4hH4ESvW8FNTsrGg/nNd06sGP/Wlx0LUHVg==", + "dependencies": { + "blake-hash": "^2.0.0", + "blake2b": "^2.1.3", + "ethers": "^5.5.1", + "ffjavascript": "^0.2.45" + } + }, + "node_modules/classic-level": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/classic-level/-/classic-level-1.3.0.tgz", + "integrity": "sha512-iwFAJQYtqRTRM0F6L8h4JCt00ZSGdOyqh7yVrhhjrOpFhmBjNlRUey64MCiyo6UmQHMJ+No3c81nujPv+n9yrg==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "abstract-level": "^1.0.2", + "catering": "^2.1.0", + "module-error": "^1.0.1", + "napi-macros": "^2.2.2", + "node-gyp-build": "^4.3.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/cli-table3": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.5.1.tgz", + "integrity": "sha512-7Qg2Jrep1S/+Q3EceiZtQcDPWxhAvBw+ERf1162v4sikJrvojMHFqXt8QIVha8UlH9rgU0BeWPytZ9/TzYqlUw==", + "dev": true, + "dependencies": { + "object-assign": "^4.1.0", + "string-width": "^2.1.1" + }, + "engines": { + "node": ">=6" + }, + "optionalDependencies": { + "colors": "^1.1.2" + } + }, + "node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/cliui/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", + "dev": true, + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/command-exists": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/command-exists/-/command-exists-1.2.9.tgz", + "integrity": "sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==" + }, + "node_modules/command-line-args": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.2.1.tgz", + "integrity": "sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==", + "dependencies": { + "array-back": "^3.1.0", + "find-replace": "^3.0.0", + "lodash.camelcase": "^4.3.0", + "typical": "^4.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/command-line-usage": { + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-6.1.3.tgz", + "integrity": "sha512-sH5ZSPr+7UStsloltmDh7Ce5fb8XPlHyoPzTpyyMuYCtervL65+ubVZ6Q61cFtFl62UyJlc8/JwERRbAFPUqgw==", + "dependencies": { + "array-back": "^4.0.2", + "chalk": "^2.4.2", + "table-layout": "^1.0.2", + "typical": "^5.2.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/command-line-usage/node_modules/array-back": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz", + "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/command-line-usage/node_modules/typical": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", + "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "engines": { + "node": ">= 12" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "node_modules/concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "engines": [ + "node >= 0.8" + ], + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/concat-stream/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/concat-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/concat-stream/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/cookie": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/core-js-pure": { + "version": "3.31.0", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.31.0.tgz", + "integrity": "sha512-/AnE9Y4OsJZicCzIe97JP5XoPKQJfTuEG43aEVLFJGOJpyqELod+pE6LEl63DfG1Mp8wX97LDaDpy1GmLEUxlg==", + "hasInstallScript": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==" + }, + "node_modules/crc-32": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", + "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", + "bin": { + "crc32": "bin/crc32.njs" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "dependencies": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "node_modules/create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "dependencies": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, + "node_modules/crypt": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", + "integrity": "sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", + "dependencies": { + "assert-plus": "^1.0.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/death": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/death/-/death-1.1.0.tgz", + "integrity": "sha512-vsV6S4KVHvTGxbEcij7hkWRv0It+sGGWVOM67dQde/o5Xjnr+KmLjxWJii2uEObIrt1CcM9w0Yaovx+iOlIL+w==", + "dev": true + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decamelize": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/deep-eql": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", + "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", + "dev": true, + "dependencies": { + "type-detect": "^4.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "node_modules/deferred-leveldown": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/deferred-leveldown/-/deferred-leveldown-5.3.0.tgz", + "integrity": "sha512-a59VOT+oDy7vtAbLRCZwWgxu2BaCfd5Hk7wxJd48ei7I+nsg8Orlb9CLG0PMZienk9BSUKgeAqkO2+Lw+1+Ukw==", + "dependencies": { + "abstract-leveldown": "~6.2.1", + "inherits": "^2.0.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/deferred-leveldown/node_modules/abstract-leveldown": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-6.2.3.tgz", + "integrity": "sha512-BsLm5vFMRUrrLeCcRc+G0t2qOaTzpoJQLOubq2XM72eNpjF5UdU5o/5NvlNhx95XHcAvcl8OMXr4mlg/fRgUXQ==", + "dependencies": { + "buffer": "^5.5.0", + "immediate": "^3.2.3", + "level-concat-iterator": "~2.0.0", + "level-supports": "~1.0.0", + "xtend": "~4.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/deferred-leveldown/node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/deferred-leveldown/node_modules/level-supports": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/level-supports/-/level-supports-1.0.1.tgz", + "integrity": "sha512-rXM7GYnW8gsl1vedTJIbzOrRv85c/2uCMpiiCzO2fndd06U/kUXEEU9evYn4zFggBOg36IsBW8LzqIpETwwQzg==", + "dependencies": { + "xtend": "^4.0.2" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/define-properties": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", + "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", + "dev": true, + "dependencies": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/detect-port": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.5.1.tgz", + "integrity": "sha512-aBzdj76lueB6uUst5iAs7+0H/oOjqI5D16XUWxlWMIMROhcM0rfsNVk93zTngq1dDNpoXRr++Sus7ETAExppAQ==", + "dev": true, + "dependencies": { + "address": "^1.0.1", + "debug": "4" + }, + "bin": { + "detect": "bin/detect-port.js", + "detect-port": "bin/detect-port.js" + } + }, + "node_modules/diff": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", + "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/difflib": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/difflib/-/difflib-0.2.4.tgz", + "integrity": "sha512-9YVwmMb0wQHQNr5J9m6BSj6fk4pfGITGQOOs+D9Fl+INODWFOfvhIU1hNv6GgR1RBoC/9NJcwu77zShxV0kT7w==", + "dev": true, + "dependencies": { + "heap": ">= 0.2.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dotenv": { + "version": "16.3.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.3.1.tgz", + "integrity": "sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/motdotla/dotenv?sponsor=1" + } + }, + "node_modules/ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", + "dependencies": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "node_modules/elliptic": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", + "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", + "dependencies": { + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/elliptic/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + }, + "node_modules/emittery": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.10.0.tgz", + "integrity": "sha512-AGvFfs+d0JKCJQ4o01ASQLGPmSCxgfU9RFXvzPvZdjKK8oscynksuJhWrSTSw7j7Ep/sZct5b5ZhYCi8S/t0HQ==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/encode-utf8": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/encode-utf8/-/encode-utf8-1.0.3.tgz", + "integrity": "sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw==", + "dev": true + }, + "node_modules/encoding-down": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/encoding-down/-/encoding-down-6.3.0.tgz", + "integrity": "sha512-QKrV0iKR6MZVJV08QY0wp1e7vF6QbhnbQhb07bwpEyuz4uZiZgPlEGdkCROuFkUwdxlFaiPIhjyarH1ee/3vhw==", + "dependencies": { + "abstract-leveldown": "^6.2.1", + "inherits": "^2.0.3", + "level-codec": "^9.0.0", + "level-errors": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "dev": true, + "dependencies": { + "ansi-colors": "^4.1.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/errno": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", + "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", + "dependencies": { + "prr": "~1.0.1" + }, + "bin": { + "errno": "cli.js" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "peer": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-abstract": { + "version": "1.21.2", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.2.tgz", + "integrity": "sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "es-set-tostringtag": "^2.0.1", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.5", + "get-intrinsic": "^1.2.0", + "get-symbol-description": "^1.0.0", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.5", + "is-array-buffer": "^3.0.2", + "is-callable": "^1.2.7", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.10", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.3", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.4.3", + "safe-regex-test": "^1.0.0", + "string.prototype.trim": "^1.2.7", + "string.prototype.trimend": "^1.0.6", + "string.prototype.trimstart": "^1.0.6", + "typed-array-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-abstract/node_modules/object.assign": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-array-method-boxes-properly": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", + "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==", + "dev": true + }, + "node_modules/es-set-tostringtag": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", + "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3", + "has": "^1.0.3", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/escodegen": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.8.1.tgz", + "integrity": "sha512-yhi5S+mNTOuRvyW4gWlg5W1byMaQGWWSYHXsuFZ7GBo7tpyOwi2EdzMP/QWxh9hwkD2m+wDVHJsxhRIj+v/b/A==", + "dev": true, + "dependencies": { + "esprima": "^2.7.1", + "estraverse": "^1.9.1", + "esutils": "^2.0.2", + "optionator": "^0.8.1" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=0.12.0" + }, + "optionalDependencies": { + "source-map": "~0.2.0" + } + }, + "node_modules/esprima": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", + "integrity": "sha512-OarPfz0lFCiW4/AV2Oy1Rp9qu0iusTKqykwTspGCZtPxmF81JR4MmIebvF1F9+UOKth2ZubLQ4XGGaU+hSn99A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/estraverse": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz", + "integrity": "sha512-25w1fMXQrGdoquWnScXZGckOv+Wes+JDnuN/+7ex3SauFRS72r2lFDec0EKPt2YD1wUJ/IrfEex+9yp4hfSOJA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eth-ens-namehash": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/eth-ens-namehash/-/eth-ens-namehash-2.0.8.tgz", + "integrity": "sha512-VWEI1+KJfz4Km//dadyvBBoBeSQ0MHTXPvr8UIXiLW6IanxvAV+DmlZAijZwAyggqGUfwQBeHf7tc9wzc1piSw==", + "peer": true, + "dependencies": { + "idna-uts46-hx": "^2.3.1", + "js-sha3": "^0.5.7" + } + }, + "node_modules/eth-ens-namehash/node_modules/js-sha3": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", + "integrity": "sha512-GII20kjaPX0zJ8wzkTbNDYMY7msuZcTWk8S5UOh6806Jq/wz1J8/bnr8uGU0DAUmYDjj2Mr4X1cW8v/GLYnR+g==", + "peer": true + }, + "node_modules/eth-gas-reporter": { + "version": "0.2.25", + "resolved": "https://registry.npmjs.org/eth-gas-reporter/-/eth-gas-reporter-0.2.25.tgz", + "integrity": "sha512-1fRgyE4xUB8SoqLgN3eDfpDfwEfRxh2Sz1b7wzFbyQA+9TekMmvSjjoRu9SKcSVyK+vLkLIsVbJDsTWjw195OQ==", + "dev": true, + "dependencies": { + "@ethersproject/abi": "^5.0.0-beta.146", + "@solidity-parser/parser": "^0.14.0", + "cli-table3": "^0.5.0", + "colors": "1.4.0", + "ethereum-cryptography": "^1.0.3", + "ethers": "^4.0.40", + "fs-readdir-recursive": "^1.1.0", + "lodash": "^4.17.14", + "markdown-table": "^1.1.3", + "mocha": "^7.1.1", + "req-cwd": "^2.0.0", + "request": "^2.88.0", + "request-promise-native": "^1.0.5", + "sha1": "^1.1.1", + "sync-request": "^6.0.0" + }, + "peerDependencies": { + "@codechecks/client": "^0.1.0" + }, + "peerDependenciesMeta": { + "@codechecks/client": { + "optional": true + } + } + }, + "node_modules/eth-gas-reporter/node_modules/@noble/hashes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.2.0.tgz", + "integrity": "sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ] + }, + "node_modules/eth-gas-reporter/node_modules/@scure/bip32": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.1.5.tgz", + "integrity": "sha512-XyNh1rB0SkEqd3tXcXMi+Xe1fvg+kUIcoRIEujP1Jgv7DqW2r9lg3Ah0NkFaCs9sTkQAQA8kw7xiRXzENi9Rtw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "@noble/hashes": "~1.2.0", + "@noble/secp256k1": "~1.7.0", + "@scure/base": "~1.1.0" + } + }, + "node_modules/eth-gas-reporter/node_modules/@scure/bip39": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.1.1.tgz", + "integrity": "sha512-t+wDck2rVkh65Hmv280fYdVdY25J9YeEUIgn2LG1WM6gxFkGzcksoDiUkWVpVp3Oex9xGC68JU2dSbUfwZ2jPg==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "@noble/hashes": "~1.2.0", + "@scure/base": "~1.1.0" + } + }, + "node_modules/eth-gas-reporter/node_modules/ansi-colors": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz", + "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/eth-gas-reporter/node_modules/ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/eth-gas-reporter/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/eth-gas-reporter/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "node_modules/eth-gas-reporter/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/eth-gas-reporter/node_modules/chokidar": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.0.tgz", + "integrity": "sha512-dGmKLDdT3Gdl7fBUe8XK+gAtGmzy5Fn0XkkWQuYxGIgWVPPse2CxFA5mtrlD0TOHaHjEUqkWNyP1XdHoJES/4A==", + "dev": true, + "dependencies": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.2.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.1.1" + } + }, + "node_modules/eth-gas-reporter/node_modules/cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dev": true, + "dependencies": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "node_modules/eth-gas-reporter/node_modules/debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eth-gas-reporter/node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eth-gas-reporter/node_modules/diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/eth-gas-reporter/node_modules/emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "node_modules/eth-gas-reporter/node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eth-gas-reporter/node_modules/ethereum-cryptography": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-1.2.0.tgz", + "integrity": "sha512-6yFQC9b5ug6/17CQpCyE3k9eKBMdhyVjzUy1WkiuY/E4vj/SXDBbCw8QEIaXqf0Mf2SnY6RmpDcwlUmBSS0EJw==", + "dev": true, + "dependencies": { + "@noble/hashes": "1.2.0", + "@noble/secp256k1": "1.7.1", + "@scure/bip32": "1.1.5", + "@scure/bip39": "1.1.1" + } + }, + "node_modules/eth-gas-reporter/node_modules/ethers": { + "version": "4.0.49", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-4.0.49.tgz", + "integrity": "sha512-kPltTvWiyu+OktYy1IStSO16i2e7cS9D9OxZ81q2UUaiNPVrm/RTcbxamCXF9VUSKzJIdJV68EAIhTEVBalRWg==", + "dev": true, + "dependencies": { + "aes-js": "3.0.0", + "bn.js": "^4.11.9", + "elliptic": "6.5.4", + "hash.js": "1.1.3", + "js-sha3": "0.5.7", + "scrypt-js": "2.0.4", + "setimmediate": "1.0.4", + "uuid": "2.0.1", + "xmlhttprequest": "1.8.0" + } + }, + "node_modules/eth-gas-reporter/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/eth-gas-reporter/node_modules/flat": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.1.tgz", + "integrity": "sha512-FmTtBsHskrU6FJ2VxCnsDb84wu9zhmO3cUX2kGFb5tuwhfXxGciiT0oRY+cck35QmG+NmGh5eLz6lLCpWTqwpA==", + "dev": true, + "dependencies": { + "is-buffer": "~2.0.3" + }, + "bin": { + "flat": "cli.js" + } + }, + "node_modules/eth-gas-reporter/node_modules/fsevents": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", + "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "deprecated": "\"Please update to latest v2.3 or v2.2\"", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/eth-gas-reporter/node_modules/glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/eth-gas-reporter/node_modules/hash.js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz", + "integrity": "sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/eth-gas-reporter/node_modules/js-sha3": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", + "integrity": "sha512-GII20kjaPX0zJ8wzkTbNDYMY7msuZcTWk8S5UOh6806Jq/wz1J8/bnr8uGU0DAUmYDjj2Mr4X1cW8v/GLYnR+g==", + "dev": true + }, + "node_modules/eth-gas-reporter/node_modules/js-yaml": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/eth-gas-reporter/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/eth-gas-reporter/node_modules/log-symbols": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz", + "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/eth-gas-reporter/node_modules/minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/eth-gas-reporter/node_modules/mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "dependencies": { + "minimist": "^1.2.5" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/eth-gas-reporter/node_modules/mocha": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-7.2.0.tgz", + "integrity": "sha512-O9CIypScywTVpNaRrCAgoUnJgozpIofjKUYmJhiCIJMiuYnLI6otcb1/kpW9/n/tJODHGZ7i8aLQoDVsMtOKQQ==", + "dev": true, + "dependencies": { + "ansi-colors": "3.2.3", + "browser-stdout": "1.3.1", + "chokidar": "3.3.0", + "debug": "3.2.6", + "diff": "3.5.0", + "escape-string-regexp": "1.0.5", + "find-up": "3.0.0", + "glob": "7.1.3", + "growl": "1.10.5", + "he": "1.2.0", + "js-yaml": "3.13.1", + "log-symbols": "3.0.0", + "minimatch": "3.0.4", + "mkdirp": "0.5.5", + "ms": "2.1.1", + "node-environment-flags": "1.0.6", + "object.assign": "4.1.0", + "strip-json-comments": "2.0.1", + "supports-color": "6.0.0", + "which": "1.3.1", + "wide-align": "1.1.3", + "yargs": "13.3.2", + "yargs-parser": "13.1.2", + "yargs-unparser": "1.6.0" + }, + "bin": { + "_mocha": "bin/_mocha", + "mocha": "bin/mocha" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mochajs" + } + }, + "node_modules/eth-gas-reporter/node_modules/ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + }, + "node_modules/eth-gas-reporter/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eth-gas-reporter/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/eth-gas-reporter/node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/eth-gas-reporter/node_modules/readdirp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.2.0.tgz", + "integrity": "sha512-crk4Qu3pmXwgxdSgGhgA/eXiJAPQiX4GMOZZMXnqKxHX7TaoL+3gQVo/WeuAiogr07DpnfjIMpXXa+PAIvwPGQ==", + "dev": true, + "dependencies": { + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/eth-gas-reporter/node_modules/require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, + "node_modules/eth-gas-reporter/node_modules/scrypt-js": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-2.0.4.tgz", + "integrity": "sha512-4KsaGcPnuhtCZQCxFxN3GVYIhKFPTdLd8PLC552XwbMndtD0cjRFAhDuuydXQ0h08ZfPgzqe6EKHozpuH74iDw==", + "dev": true + }, + "node_modules/eth-gas-reporter/node_modules/setimmediate": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.4.tgz", + "integrity": "sha512-/TjEmXQVEzdod/FFskf3o7oOAsGhHf2j1dZqRFbDzq4F3mvvxflIIi4Hd3bLQE9y/CpwqfSQam5JakI/mi3Pog==", + "dev": true + }, + "node_modules/eth-gas-reporter/node_modules/string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "dependencies": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/eth-gas-reporter/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/eth-gas-reporter/node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eth-gas-reporter/node_modules/supports-color": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz", + "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/eth-gas-reporter/node_modules/uuid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.1.tgz", + "integrity": "sha512-nWg9+Oa3qD2CQzHIP4qKUqwNfzKn8P0LtFhotaCTFchsV7ZfDhAybeip/HZVeMIpZi9JgY1E3nUlwaCmZT1sEg==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "dev": true + }, + "node_modules/eth-gas-reporter/node_modules/which-module": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", + "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", + "dev": true + }, + "node_modules/eth-gas-reporter/node_modules/wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/eth-gas-reporter/node_modules/y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "dev": true + }, + "node_modules/eth-gas-reporter/node_modules/yargs": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "dev": true, + "dependencies": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.2" + } + }, + "node_modules/eth-gas-reporter/node_modules/yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "dev": true, + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + }, + "node_modules/eth-gas-reporter/node_modules/yargs-unparser": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.0.tgz", + "integrity": "sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw==", + "dev": true, + "dependencies": { + "flat": "^4.1.0", + "lodash": "^4.17.15", + "yargs": "^13.3.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/ethereum-bloom-filters": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/ethereum-bloom-filters/-/ethereum-bloom-filters-1.0.10.tgz", + "integrity": "sha512-rxJ5OFN3RwjQxDcFP2Z5+Q9ho4eIdEmSc2ht0fCu8Se9nbXjZ7/031uXoUYJ87KHCOdVeiUuwSnoS7hmYAGVHA==", + "dependencies": { + "js-sha3": "^0.8.0" + } + }, + "node_modules/ethereum-cryptography": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", + "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", + "dependencies": { + "@types/pbkdf2": "^3.0.0", + "@types/secp256k1": "^4.0.1", + "blakejs": "^1.1.0", + "browserify-aes": "^1.2.0", + "bs58check": "^2.1.2", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "hash.js": "^1.1.7", + "keccak": "^3.0.0", + "pbkdf2": "^3.0.17", + "randombytes": "^2.1.0", + "safe-buffer": "^5.1.2", + "scrypt-js": "^3.0.0", + "secp256k1": "^4.0.1", + "setimmediate": "^1.0.5" + } + }, + "node_modules/ethereum-waffle": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/ethereum-waffle/-/ethereum-waffle-4.0.10.tgz", + "integrity": "sha512-iw9z1otq7qNkGDNcMoeNeLIATF9yKl1M8AIeu42ElfNBplq0e+5PeasQmm8ybY/elkZ1XyRO0JBQxQdVRb8bqQ==", + "dependencies": { + "@ethereum-waffle/chai": "4.0.10", + "@ethereum-waffle/compiler": "4.0.3", + "@ethereum-waffle/mock-contract": "4.0.4", + "@ethereum-waffle/provider": "4.0.5", + "solc": "0.8.15", + "typechain": "^8.0.0" + }, + "bin": { + "waffle": "bin/waffle" + }, + "engines": { + "node": ">=10.0" + }, + "peerDependencies": { + "ethers": "*" + } + }, + "node_modules/ethereumjs-abi": { + "version": "0.6.8", + "resolved": "https://registry.npmjs.org/ethereumjs-abi/-/ethereumjs-abi-0.6.8.tgz", + "integrity": "sha512-Tx0r/iXI6r+lRsdvkFDlut0N08jWMnKRZ6Gkq+Nmw75lZe4e6o3EkSnkaBP5NF6+m5PTGAr9JP43N3LyeoglsA==", + "dependencies": { + "bn.js": "^4.11.8", + "ethereumjs-util": "^6.0.0" + } + }, + "node_modules/ethereumjs-abi/node_modules/@types/bn.js": { + "version": "4.11.6", + "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-4.11.6.tgz", + "integrity": "sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/ethereumjs-abi/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + }, + "node_modules/ethereumjs-abi/node_modules/ethereumjs-util": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz", + "integrity": "sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw==", + "dependencies": { + "@types/bn.js": "^4.11.3", + "bn.js": "^4.11.0", + "create-hash": "^1.1.2", + "elliptic": "^6.5.2", + "ethereum-cryptography": "^0.1.3", + "ethjs-util": "0.1.6", + "rlp": "^2.2.3" + } + }, + "node_modules/ethereumjs-util": { + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz", + "integrity": "sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==", + "dependencies": { + "@types/bn.js": "^5.1.0", + "bn.js": "^5.1.2", + "create-hash": "^1.1.2", + "ethereum-cryptography": "^0.1.3", + "rlp": "^2.2.4" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/ethers": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz", + "integrity": "sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/abi": "5.7.0", + "@ethersproject/abstract-provider": "5.7.0", + "@ethersproject/abstract-signer": "5.7.0", + "@ethersproject/address": "5.7.0", + "@ethersproject/base64": "5.7.0", + "@ethersproject/basex": "5.7.0", + "@ethersproject/bignumber": "5.7.0", + "@ethersproject/bytes": "5.7.0", + "@ethersproject/constants": "5.7.0", + "@ethersproject/contracts": "5.7.0", + "@ethersproject/hash": "5.7.0", + "@ethersproject/hdnode": "5.7.0", + "@ethersproject/json-wallets": "5.7.0", + "@ethersproject/keccak256": "5.7.0", + "@ethersproject/logger": "5.7.0", + "@ethersproject/networks": "5.7.1", + "@ethersproject/pbkdf2": "5.7.0", + "@ethersproject/properties": "5.7.0", + "@ethersproject/providers": "5.7.2", + "@ethersproject/random": "5.7.0", + "@ethersproject/rlp": "5.7.0", + "@ethersproject/sha2": "5.7.0", + "@ethersproject/signing-key": "5.7.0", + "@ethersproject/solidity": "5.7.0", + "@ethersproject/strings": "5.7.0", + "@ethersproject/transactions": "5.7.0", + "@ethersproject/units": "5.7.0", + "@ethersproject/wallet": "5.7.0", + "@ethersproject/web": "5.7.1", + "@ethersproject/wordlists": "5.7.0" + } + }, + "node_modules/ethjs-unit": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/ethjs-unit/-/ethjs-unit-0.1.6.tgz", + "integrity": "sha512-/Sn9Y0oKl0uqQuvgFk/zQgR7aw1g36qX/jzSQ5lSwlO0GigPymk4eGQfeNTD03w1dPOqfz8V77Cy43jH56pagw==", + "dependencies": { + "bn.js": "4.11.6", + "number-to-bn": "1.7.0" + }, + "engines": { + "node": ">=6.5.0", + "npm": ">=3" + } + }, + "node_modules/ethjs-unit/node_modules/bn.js": { + "version": "4.11.6", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", + "integrity": "sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA==" + }, + "node_modules/ethjs-util": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/ethjs-util/-/ethjs-util-0.1.6.tgz", + "integrity": "sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w==", + "dependencies": { + "is-hex-prefixed": "1.0.0", + "strip-hex-prefix": "1.0.0" + }, + "engines": { + "node": ">=6.5.0", + "npm": ">=3" + } + }, + "node_modules/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "dependencies": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "node_modules/extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", + "engines": [ + "node >=0.6.0" + ] + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "node_modules/fast-glob": { + "version": "3.2.12", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", + "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "node_modules/fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/ffjavascript": { + "version": "0.2.60", + "resolved": "https://registry.npmjs.org/ffjavascript/-/ffjavascript-0.2.60.tgz", + "integrity": "sha512-T/9bnEL5xAZRDbQoEMf+pM9nrhK+C3JyZNmqiWub26EQorW7Jt+jR54gpqDhceA4Nj0YctPQwYnl8xa52/A26A==", + "dependencies": { + "wasmbuilder": "0.0.16", + "wasmcurves": "0.2.2", + "web-worker": "^1.2.0" + } + }, + "node_modules/fhevm": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/fhevm/-/fhevm-0.5.8.tgz", + "integrity": "sha512-fzTQnnw/7EajQywXUfZyTEGlsPe2SmvcVLklsmHEeZ5YQRmbp9pGR2rFuRcXED+Ou76Miq9oExRKIhkcdPlySg==", + "dependencies": { + "@openzeppelin/contracts": "^5.0.1" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/fhevm/node_modules/@openzeppelin/contracts": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-5.0.2.tgz", + "integrity": "sha512-ytPc6eLGcHHnapAZ9S+5qsdomhjo6QBHTDRRBFfTxXIpsicMhVPouPgmUPebZZZGX7vt9USA+Z+0M0dSVtSUEA==" + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-replace": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-3.0.0.tgz", + "integrity": "sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==", + "dependencies": { + "array-back": "^3.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", + "dev": true, + "dependencies": { + "locate-path": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true, + "bin": { + "flat": "cli.js" + } + }, + "node_modules/fmix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/fmix/-/fmix-0.1.0.tgz", + "integrity": "sha512-Y6hyofImk9JdzU8k5INtTXX1cu8LDlePWDFU5sftm9H+zKCr5SGrVjdhkvsim646cw5zD0nADj8oHyXMZmCZ9w==", + "dev": true, + "dependencies": { + "imul": "^1.0.0" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.3" + } + }, + "node_modules/forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", + "engines": { + "node": "*" + } + }, + "node_modules/form-data": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", + "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fp-ts": { + "version": "1.19.3", + "resolved": "https://registry.npmjs.org/fp-ts/-/fp-ts-1.19.3.tgz", + "integrity": "sha512-H5KQDspykdHuztLTg+ajGN0Z2qUjcEf3Ybxc6hLt0k7/zPkn29XnKnxlBPyW2XIddWrGaJBzBl4VLYOtk39yZg==", + "dev": true + }, + "node_modules/fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/fs-readdir-recursive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz", + "integrity": "sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==", + "dev": true + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "node_modules/function.prototype.name": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", + "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0", + "functions-have-names": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==" + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ganache": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/ganache/-/ganache-7.4.3.tgz", + "integrity": "sha512-RpEDUiCkqbouyE7+NMXG26ynZ+7sGiODU84Kz+FVoXUnQ4qQM4M8wif3Y4qUCt+D/eM1RVeGq0my62FPD6Y1KA==", + "bundleDependencies": [ + "@trufflesuite/bigint-buffer", + "emittery", + "keccak", + "leveldown", + "secp256k1", + "@types/bn.js", + "@types/lru-cache", + "@types/seedrandom" + ], + "hasShrinkwrap": true, + "dependencies": { + "@trufflesuite/bigint-buffer": "1.1.10", + "@types/bn.js": "^5.1.0", + "@types/lru-cache": "5.1.1", + "@types/seedrandom": "3.0.1", + "emittery": "0.10.0", + "keccak": "3.0.2", + "leveldown": "6.1.0", + "secp256k1": "4.0.3" + }, + "bin": { + "ganache": "dist/node/cli.js", + "ganache-cli": "dist/node/cli.js" + }, + "optionalDependencies": { + "bufferutil": "4.0.5", + "utf-8-validate": "5.0.7" + } + }, + "node_modules/ganache/node_modules/@trufflesuite/bigint-buffer": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/@trufflesuite/bigint-buffer/-/bigint-buffer-1.1.10.tgz", + "integrity": "sha512-pYIQC5EcMmID74t26GCC67946mgTJFiLXOT/BYozgrd4UEY2JHEGLhWi9cMiQCt5BSqFEvKkCHNnoj82SRjiEw==", + "hasInstallScript": true, + "inBundle": true, + "license": "Apache-2.0", + "dependencies": { + "node-gyp-build": "4.4.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/ganache/node_modules/@trufflesuite/bigint-buffer/node_modules/node-gyp-build": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.4.0.tgz", + "integrity": "sha512-amJnQCcgtRVw9SvoebO3BKGESClrfXGCUTX9hSn1OuGQTQBOZmVd0Z0OlecpuRksKvbsUqALE8jls/ErClAPuQ==", + "inBundle": true, + "license": "MIT", + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" + } + }, + "node_modules/ganache/node_modules/@types/bn.js": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.0.tgz", + "integrity": "sha512-QSSVYj7pYFN49kW77o2s9xTCwZ8F2xLbjLLSEVh8D2F4JUhZtPAGOFLTD+ffqksBx/u4cE/KImFjyhqCjn/LIA==", + "inBundle": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/ganache/node_modules/@types/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@types/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw==", + "inBundle": true, + "license": "MIT" + }, + "node_modules/ganache/node_modules/@types/node": { + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.0.tgz", + "integrity": "sha512-eMhwJXc931Ihh4tkU+Y7GiLzT/y/DBNpNtr4yU9O2w3SYBsr9NaOPhQlLKRmoWtI54uNwuo0IOUFQjVOTZYRvw==", + "inBundle": true, + "license": "MIT" + }, + "node_modules/ganache/node_modules/@types/seedrandom": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/seedrandom/-/seedrandom-3.0.1.tgz", + "integrity": "sha512-giB9gzDeiCeloIXDgzFBCgjj1k4WxcDrZtGl6h1IqmUPlxF+Nx8Ve+96QCyDZ/HseB/uvDsKbpib9hU5cU53pw==", + "inBundle": true, + "license": "MIT" + }, + "node_modules/ganache/node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "inBundle": true, + "license": "MIT" + }, + "node_modules/ganache/node_modules/brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", + "inBundle": true, + "license": "MIT" + }, + "node_modules/ganache/node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "inBundle": true, + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/ganache/node_modules/bufferutil": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.5.tgz", + "integrity": "sha512-HTm14iMQKK2FjFLRTM5lAVcyaUzOnqbPtesFIvREgXpJHdQm8bWS+GkQgIkfaBYRHuCnea7w8UVNfwiAQhlr9A==", + "optional": true, + "dependencies": { + "node-gyp-build": "^4.3.0" + } + }, + "node_modules/ganache/node_modules/catering": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/catering/-/catering-2.1.0.tgz", + "integrity": "sha512-M5imwzQn6y+ODBfgi+cfgZv2hIUI6oYU/0f35Mdb1ujGeqeoI5tOnl9Q13DTH7LW+7er+NYq8stNOKZD/Z3U/A==", + "inBundle": true, + "license": "MIT", + "dependencies": { + "queue-tick": "^1.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/ganache/node_modules/elliptic": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", + "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", + "inBundle": true, + "license": "MIT", + "dependencies": { + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/ganache/node_modules/elliptic/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "inBundle": true, + "license": "MIT" + }, + "node_modules/ganache/node_modules/emittery": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.10.0.tgz", + "integrity": "sha512-AGvFfs+d0JKCJQ4o01ASQLGPmSCxgfU9RFXvzPvZdjKK8oscynksuJhWrSTSw7j7Ep/sZct5b5ZhYCi8S/t0HQ==", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "node_modules/ganache/node_modules/hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "inBundle": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "node_modules/ganache/node_modules/hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "inBundle": true, + "license": "MIT", + "dependencies": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/ganache/node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "inBundle": true, + "license": "BSD-3-Clause" + }, + "node_modules/ganache/node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "inBundle": true, + "license": "ISC" + }, + "node_modules/ganache/node_modules/is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/ganache/node_modules/keccak": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/keccak/-/keccak-3.0.2.tgz", + "integrity": "sha512-PyKKjkH53wDMLGrvmRGSNWgmSxZOUqbnXwKL9tmgbFYA1iAYqW21kfR7mZXV0MlESiefxQQE9X9fTa3X+2MPDQ==", + "hasInstallScript": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "node-addon-api": "^2.0.0", + "node-gyp-build": "^4.2.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/ganache/node_modules/leveldown": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/leveldown/-/leveldown-6.1.0.tgz", + "integrity": "sha512-8C7oJDT44JXxh04aSSsfcMI8YiaGRhOFI9/pMEL7nWJLVsWajDPTRxsSHTM2WcTVY5nXM+SuRHzPPi0GbnDX+w==", + "hasInstallScript": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "abstract-leveldown": "^7.2.0", + "napi-macros": "~2.0.0", + "node-gyp-build": "^4.3.0" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/ganache/node_modules/leveldown/node_modules/abstract-leveldown": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-7.2.0.tgz", + "integrity": "sha512-DnhQwcFEaYsvYDnACLZhMmCWd3rkOeEvglpa4q5i/5Jlm3UIsWaxVzuXvDLFCSCWRO3yy2/+V/G7FusFgejnfQ==", + "inBundle": true, + "license": "MIT", + "dependencies": { + "buffer": "^6.0.3", + "catering": "^2.0.0", + "is-buffer": "^2.0.5", + "level-concat-iterator": "^3.0.0", + "level-supports": "^2.0.1", + "queue-microtask": "^1.2.3" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ganache/node_modules/leveldown/node_modules/level-concat-iterator": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/level-concat-iterator/-/level-concat-iterator-3.1.0.tgz", + "integrity": "sha512-BWRCMHBxbIqPxJ8vHOvKUsaO0v1sLYZtjN3K2iZJsRBYtp+ONsY6Jfi6hy9K3+zolgQRryhIn2NRZjZnWJ9NmQ==", + "inBundle": true, + "license": "MIT", + "dependencies": { + "catering": "^2.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ganache/node_modules/leveldown/node_modules/level-supports": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/level-supports/-/level-supports-2.1.0.tgz", + "integrity": "sha512-E486g1NCjW5cF78KGPrMDRBYzPuueMZ6VBXHT6gC7A8UYWGiM14fGgp+s/L1oFfDWSPV/+SFkYCmZ0SiESkRKA==", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/ganache/node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "inBundle": true, + "license": "ISC" + }, + "node_modules/ganache/node_modules/minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", + "inBundle": true, + "license": "MIT" + }, + "node_modules/ganache/node_modules/napi-macros": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/napi-macros/-/napi-macros-2.0.0.tgz", + "integrity": "sha512-A0xLykHtARfueITVDernsAWdtIMbOJgKgcluwENp3AlsKN/PloyO10HtmoqnFAQAcxPkgZN7wdfPfEd0zNGxbg==", + "inBundle": true, + "license": "MIT" + }, + "node_modules/ganache/node_modules/node-addon-api": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz", + "integrity": "sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==", + "inBundle": true, + "license": "MIT" + }, + "node_modules/ganache/node_modules/node-gyp-build": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.3.0.tgz", + "integrity": "sha512-iWjXZvmboq0ja1pUGULQBexmxq8CV4xBhX7VDOTbL7ZR4FOowwY/VOtRxBN/yKxmdGoIp4j5ysNT4u3S2pDQ3Q==", + "inBundle": true, + "license": "MIT", + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" + } + }, + "node_modules/ganache/node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "inBundle": true, + "license": "MIT" + }, + "node_modules/ganache/node_modules/queue-tick": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/queue-tick/-/queue-tick-1.0.0.tgz", + "integrity": "sha512-ULWhjjE8BmiICGn3G8+1L9wFpERNxkf8ysxkAer4+TFdRefDaXOCV5m92aMB9FtBVmn/8sETXLXY6BfW7hyaWQ==", + "inBundle": true, + "license": "MIT" + }, + "node_modules/ganache/node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "inBundle": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/ganache/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "inBundle": true, + "license": "MIT" + }, + "node_modules/ganache/node_modules/secp256k1": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-4.0.3.tgz", + "integrity": "sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA==", + "hasInstallScript": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "elliptic": "^6.5.4", + "node-addon-api": "^2.0.0", + "node-gyp-build": "^4.2.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/ganache/node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "inBundle": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/ganache/node_modules/utf-8-validate": { + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.7.tgz", + "integrity": "sha512-vLt1O5Pp+flcArHGIyKEQq883nBt8nN8tVBcoL0qUXj2XT1n7p70yGIq2VK98I5FdZ1YHc0wk/koOnHjnXWk1Q==", + "optional": true, + "dependencies": { + "node-gyp-build": "^4.3.0" + } + }, + "node_modules/ganache/node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "inBundle": true, + "license": "MIT" + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-func-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", + "integrity": "sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-port": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", + "integrity": "sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", + "dependencies": { + "assert-plus": "^1.0.0" + } + }, + "node_modules/ghost-testrpc": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/ghost-testrpc/-/ghost-testrpc-0.0.2.tgz", + "integrity": "sha512-i08dAEgJ2g8z5buJIrCTduwPIhih3DP+hOCTyyryikfV8T0bNvHnGXO67i0DD1H4GBDETTclPy9njZbfluQYrQ==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "node-emoji": "^1.10.0" + }, + "bin": { + "testrpc-sc": "index.js" + } + }, + "node_modules/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/global-modules": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", + "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", + "dev": true, + "dependencies": { + "global-prefix": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/global-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", + "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", + "dev": true, + "dependencies": { + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/globalthis": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/globby": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.2.tgz", + "integrity": "sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==", + "dev": true, + "dependencies": { + "@types/glob": "^7.1.1", + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.0.3", + "glob": "^7.1.3", + "ignore": "^5.1.1", + "merge2": "^1.2.3", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + }, + "node_modules/growl": { + "version": "1.10.5", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", + "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", + "dev": true, + "engines": { + "node": ">=4.x" + } + }, + "node_modules/handlebars": { + "version": "4.7.7", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", + "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==", + "dev": true, + "dependencies": { + "minimist": "^1.2.5", + "neo-async": "^2.6.0", + "source-map": "^0.6.1", + "wordwrap": "^1.0.0" + }, + "bin": { + "handlebars": "bin/handlebars" + }, + "engines": { + "node": ">=0.4.7" + }, + "optionalDependencies": { + "uglify-js": "^3.1.4" + } + }, + "node_modules/handlebars/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", + "engines": { + "node": ">=4" + } + }, + "node_modules/har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "deprecated": "this library is no longer supported", + "dependencies": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/hardhat": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/hardhat/-/hardhat-2.16.1.tgz", + "integrity": "sha512-QpBjGXFhhSYoYBGEHyoau/A63crZOP+i3GbNxzLGkL6IklzT+piN14+wGnINNCg5BLSKisQI/RAySPzaWRcx/g==", + "dev": true, + "dependencies": { + "@ethersproject/abi": "^5.1.2", + "@metamask/eth-sig-util": "^4.0.0", + "@nomicfoundation/ethereumjs-block": "5.0.1", + "@nomicfoundation/ethereumjs-blockchain": "7.0.1", + "@nomicfoundation/ethereumjs-common": "4.0.1", + "@nomicfoundation/ethereumjs-evm": "2.0.1", + "@nomicfoundation/ethereumjs-rlp": "5.0.1", + "@nomicfoundation/ethereumjs-statemanager": "2.0.1", + "@nomicfoundation/ethereumjs-trie": "6.0.1", + "@nomicfoundation/ethereumjs-tx": "5.0.1", + "@nomicfoundation/ethereumjs-util": "9.0.1", + "@nomicfoundation/ethereumjs-vm": "7.0.1", + "@nomicfoundation/solidity-analyzer": "^0.1.0", + "@sentry/node": "^5.18.1", + "@types/bn.js": "^5.1.0", + "@types/lru-cache": "^5.1.0", + "abort-controller": "^3.0.0", + "adm-zip": "^0.4.16", + "aggregate-error": "^3.0.0", + "ansi-escapes": "^4.3.0", + "chalk": "^2.4.2", + "chokidar": "^3.4.0", + "ci-info": "^2.0.0", + "debug": "^4.1.1", + "enquirer": "^2.3.0", + "env-paths": "^2.2.0", + "ethereum-cryptography": "^1.0.3", + "ethereumjs-abi": "^0.6.8", + "find-up": "^2.1.0", + "fp-ts": "1.19.3", + "fs-extra": "^7.0.1", + "glob": "7.2.0", + "immutable": "^4.0.0-rc.12", + "io-ts": "1.10.4", + "keccak": "^3.0.2", + "lodash": "^4.17.11", + "mnemonist": "^0.38.0", + "mocha": "^10.0.0", + "p-map": "^4.0.0", + "raw-body": "^2.4.1", + "resolve": "1.17.0", + "semver": "^6.3.0", + "solc": "0.7.3", + "source-map-support": "^0.5.13", + "stacktrace-parser": "^0.1.10", + "tsort": "0.0.1", + "undici": "^5.14.0", + "uuid": "^8.3.2", + "ws": "^7.4.6" + }, + "bin": { + "hardhat": "internal/cli/bootstrap.js" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "ts-node": "*", + "typescript": "*" + }, + "peerDependenciesMeta": { + "ts-node": { + "optional": true + }, + "typescript": { + "optional": true + } + } + }, + "node_modules/hardhat-deploy": { + "version": "0.11.36", + "resolved": "https://registry.npmjs.org/hardhat-deploy/-/hardhat-deploy-0.11.36.tgz", + "integrity": "sha512-xsegyeI+zYo858rLB09tk/GqlJ4PV5Pr2zbncAhL60WntichKrtizxRchZUr/F7J6ljUYAzTDchNKb5wIYcQqg==", + "dev": true, + "dependencies": { + "@ethersproject/abi": "^5.7.0", + "@ethersproject/abstract-signer": "^5.7.0", + "@ethersproject/address": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/constants": "^5.7.0", + "@ethersproject/contracts": "^5.7.0", + "@ethersproject/providers": "^5.7.2", + "@ethersproject/solidity": "^5.7.0", + "@ethersproject/transactions": "^5.7.0", + "@ethersproject/wallet": "^5.7.0", + "@types/qs": "^6.9.7", + "axios": "^0.21.1", + "chalk": "^4.1.2", + "chokidar": "^3.5.2", + "debug": "^4.3.2", + "enquirer": "^2.3.6", + "ethers": "^5.5.3", + "form-data": "^4.0.0", + "fs-extra": "^10.0.0", + "match-all": "^1.2.6", + "murmur-128": "^0.2.1", + "qs": "^6.9.4", + "zksync-web3": "^0.14.3" + } + }, + "node_modules/hardhat-deploy/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/hardhat-deploy/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/hardhat-deploy/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/hardhat-deploy/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/hardhat-deploy/node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/hardhat-deploy/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/hardhat-deploy/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/hardhat-deploy/node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/hardhat-deploy/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/hardhat-deploy/node_modules/universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/hardhat-gas-reporter": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/hardhat-gas-reporter/-/hardhat-gas-reporter-1.0.9.tgz", + "integrity": "sha512-INN26G3EW43adGKBNzYWOlI3+rlLnasXTwW79YNnUhXPDa+yHESgt639dJEs37gCjhkbNKcRRJnomXEuMFBXJg==", + "dev": true, + "dependencies": { + "array-uniq": "1.0.3", + "eth-gas-reporter": "^0.2.25", + "sha1": "^1.1.1" + }, + "peerDependencies": { + "hardhat": "^2.0.2" + } + }, + "node_modules/hardhat/node_modules/@noble/hashes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.2.0.tgz", + "integrity": "sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ] + }, + "node_modules/hardhat/node_modules/@scure/bip32": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.1.5.tgz", + "integrity": "sha512-XyNh1rB0SkEqd3tXcXMi+Xe1fvg+kUIcoRIEujP1Jgv7DqW2r9lg3Ah0NkFaCs9sTkQAQA8kw7xiRXzENi9Rtw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "@noble/hashes": "~1.2.0", + "@noble/secp256k1": "~1.7.0", + "@scure/base": "~1.1.0" + } + }, + "node_modules/hardhat/node_modules/@scure/bip39": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.1.1.tgz", + "integrity": "sha512-t+wDck2rVkh65Hmv280fYdVdY25J9YeEUIgn2LG1WM6gxFkGzcksoDiUkWVpVp3Oex9xGC68JU2dSbUfwZ2jPg==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "@noble/hashes": "~1.2.0", + "@scure/base": "~1.1.0" + } + }, + "node_modules/hardhat/node_modules/commander": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/commander/-/commander-3.0.2.tgz", + "integrity": "sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow==", + "dev": true + }, + "node_modules/hardhat/node_modules/ethereum-cryptography": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-1.2.0.tgz", + "integrity": "sha512-6yFQC9b5ug6/17CQpCyE3k9eKBMdhyVjzUy1WkiuY/E4vj/SXDBbCw8QEIaXqf0Mf2SnY6RmpDcwlUmBSS0EJw==", + "dev": true, + "dependencies": { + "@noble/hashes": "1.2.0", + "@noble/secp256k1": "1.7.1", + "@scure/bip32": "1.1.5", + "@scure/bip39": "1.1.1" + } + }, + "node_modules/hardhat/node_modules/jsonfile": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", + "integrity": "sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw==", + "dev": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/hardhat/node_modules/keccak": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/keccak/-/keccak-3.0.3.tgz", + "integrity": "sha512-JZrLIAJWuZxKbCilMpNz5Vj7Vtb4scDG3dMXLOsbzBmQGyjwE61BbW7bJkfKKCShXiQZt3T6sBgALRtmd+nZaQ==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "node-addon-api": "^2.0.0", + "node-gyp-build": "^4.2.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/hardhat/node_modules/node-addon-api": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz", + "integrity": "sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==", + "dev": true + }, + "node_modules/hardhat/node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/hardhat/node_modules/solc": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/solc/-/solc-0.7.3.tgz", + "integrity": "sha512-GAsWNAjGzIDg7VxzP6mPjdurby3IkGCjQcM8GFYZT6RyaoUZKmMU6Y7YwG+tFGhv7dwZ8rmR4iwFDrrD99JwqA==", + "dev": true, + "dependencies": { + "command-exists": "^1.2.8", + "commander": "3.0.2", + "follow-redirects": "^1.12.1", + "fs-extra": "^0.30.0", + "js-sha3": "0.8.0", + "memorystream": "^0.3.1", + "require-from-string": "^2.0.0", + "semver": "^5.5.0", + "tmp": "0.0.33" + }, + "bin": { + "solcjs": "solcjs" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/hardhat/node_modules/solc/node_modules/fs-extra": { + "version": "0.30.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", + "integrity": "sha512-UvSPKyhMn6LEd/WpUaV9C9t3zATuqoqfWc3QdPhPLb58prN9tqYPlPWi8Krxi44loBoUzlobqZ3+8tGpxxSzwA==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^2.1.0", + "klaw": "^1.0.0", + "path-is-absolute": "^1.0.0", + "rimraf": "^2.2.8" + } + }, + "node_modules/hardhat/node_modules/solc/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hash-base": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", + "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", + "dependencies": { + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "dependencies": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "bin": { + "he": "bin/he" + } + }, + "node_modules/heap": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/heap/-/heap-0.2.7.tgz", + "integrity": "sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==", + "dev": true + }, + "node_modules/hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", + "dependencies": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==" + }, + "node_modules/http-basic": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/http-basic/-/http-basic-8.1.3.tgz", + "integrity": "sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==", + "dev": true, + "dependencies": { + "caseless": "^0.12.0", + "concat-stream": "^1.6.2", + "http-response-object": "^3.0.1", + "parse-cache-control": "^1.0.1" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dev": true, + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-response-object": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz", + "integrity": "sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==", + "dev": true, + "dependencies": { + "@types/node": "^10.0.3" + } + }, + "node_modules/http-response-object/node_modules/@types/node": { + "version": "10.17.60", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", + "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==", + "dev": true + }, + "node_modules/http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", + "dependencies": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + }, + "engines": { + "node": ">=0.8", + "npm": ">=1.3.7" + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dev": true, + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/idna-uts46-hx": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/idna-uts46-hx/-/idna-uts46-hx-2.3.1.tgz", + "integrity": "sha512-PWoF9Keq6laYdIRwwCdhTPl60xRqAloYNMQLiyUnG42VjT53oW07BXIRM+NK7eQjzXjAk2gUvX9caRxlnF9TAA==", + "peer": true, + "dependencies": { + "punycode": "2.1.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/immediate": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.3.0.tgz", + "integrity": "sha512-HR7EVodfFUdQCTIeySw+WDRFJlPcLOJbXfwwZ7Oom6tjsvZ3bOkCDJHehQC3nxJrv7+f9XecwazynjU8e4Vw3Q==" + }, + "node_modules/immutable": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.0.tgz", + "integrity": "sha512-0AOCmOip+xgJwEVTQj1EfiDDOkPmuyllDuTuEX+DDXUgapLAsBIfkg3sxCYyCEA8mQqZrrxPUGjcOQ2JS3WLkg==", + "dev": true + }, + "node_modules/imul": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/imul/-/imul-1.0.1.tgz", + "integrity": "sha512-WFAgfwPLAjU66EKt6vRdTlKj4nAgIDQzh29JonLa4Bqtl6D8JrIMvWjCnx7xEjVNmP3U0fM5o8ZObk7d0f62bA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + }, + "node_modules/internal-slot": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", + "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha512-xgs2NH9AE66ucSq4cNG1nhSFghr5l6tdL15Pk+jl46bmmBapgoaY/AacXyaDznAqmGL99TiLSQgO/XazFSKYeQ==", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/io-ts": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/io-ts/-/io-ts-1.10.4.tgz", + "integrity": "sha512-b23PteSnYXSONJ6JQXRAlvJhuw8KOtkqa87W4wDtvMrud/DTJd5X+NpOOI+O/zZwVq6v0VLAaJ+1EDViKEuN9g==", + "dev": true, + "dependencies": { + "fp-ts": "^1.0.0" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", + "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "is-typed-array": "^1.1.10" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "peer": true + }, + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "engines": { + "node": ">=4" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-hex-prefixed": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz", + "integrity": "sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA==", + "engines": { + "node": ">=6.5.0", + "npm": ">=3" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", + "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" + }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-url": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/is-url/-/is-url-1.2.4.tgz", + "integrity": "sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==" + }, + "node_modules/is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==", + "peer": true + }, + "node_modules/is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==" + }, + "node_modules/js-sdsl": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.4.1.tgz", + "integrity": "sha512-6Gsx8R0RucyePbWqPssR8DyfuXmLBooYN5cZFZKjHGnQuaf7pEzhtpceagJxVu4LqhYY5EYA7nko3FmeHZ1KbA==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/js-sdsl" + } + }, + "node_modules/js-sha3": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz", + "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==" + }, + "node_modules/json-bigint": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", + "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", + "dependencies": { + "bignumber.js": "^9.0.0" + } + }, + "node_modules/json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==" + }, + "node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsonschema": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.4.1.tgz", + "integrity": "sha512-S6cATIPVv1z0IlxdN+zUk5EPjkGCdnhN4wVSBlvoUO1tOLJootbo9CquNJmbIh4yikWHiUedhRYrNPn1arpEmQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/jsprim": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", + "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", + "dependencies": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.4.0", + "verror": "1.10.0" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/keccak": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/keccak/-/keccak-3.0.1.tgz", + "integrity": "sha512-epq90L9jlFWCW7+pQa6JOnKn2Xgl2mtI664seYR6MHskvI9agt7AnDqmAlp9TqU4/caMYbA08Hi5DMZAl5zdkA==", + "hasInstallScript": true, + "dependencies": { + "node-addon-api": "^2.0.0", + "node-gyp-build": "^4.2.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/keccak/node_modules/node-addon-api": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz", + "integrity": "sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==" + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/klaw": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", + "integrity": "sha512-TED5xi9gGQjGpNnvRWknrwAB1eL5GciPfVFOt3Vk1OJCVDQbzuSfrF3hkUQKlsgKrG1F+0t5W0m+Fje1jIt8rw==", + "optionalDependencies": { + "graceful-fs": "^4.1.9" + } + }, + "node_modules/lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha512-YiGkH6EnGrDGqLMITnGjXtGmNtjoXw9SVUzcaos8RBi7Ps0VBylkq+vOcY9QE5poLasPCR849ucFUkl0UzUyOw==", + "peer": true, + "dependencies": { + "invert-kv": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/level": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/level/-/level-8.0.0.tgz", + "integrity": "sha512-ypf0jjAk2BWI33yzEaaotpq7fkOPALKAgDBxggO6Q9HGX2MRXn0wbP1Jn/tJv1gtL867+YOjOB49WaUF3UoJNQ==", + "dev": true, + "dependencies": { + "browser-level": "^1.0.1", + "classic-level": "^1.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/level" + } + }, + "node_modules/level-codec": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/level-codec/-/level-codec-9.0.2.tgz", + "integrity": "sha512-UyIwNb1lJBChJnGfjmO0OR+ezh2iVu1Kas3nvBS/BzGnx79dv6g7unpKIDNPMhfdTEGoc7mC8uAu51XEtX+FHQ==", + "dependencies": { + "buffer": "^5.6.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/level-codec/node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/level-concat-iterator": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/level-concat-iterator/-/level-concat-iterator-2.0.1.tgz", + "integrity": "sha512-OTKKOqeav2QWcERMJR7IS9CUo1sHnke2C0gkSmcR7QuEtFNLLzHQAvnMw8ykvEcv0Qtkg0p7FOwP1v9e5Smdcw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/level-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/level-errors/-/level-errors-2.0.1.tgz", + "integrity": "sha512-UVprBJXite4gPS+3VznfgDSU8PTRuVX0NXwoWW50KLxd2yw4Y1t2JUR5In1itQnudZqRMT9DlAM3Q//9NCjCFw==", + "dependencies": { + "errno": "~0.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/level-iterator-stream": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/level-iterator-stream/-/level-iterator-stream-4.0.2.tgz", + "integrity": "sha512-ZSthfEqzGSOMWoUGhTXdX9jv26d32XJuHz/5YnuHZzH6wldfWMOVwI9TBtKcya4BKTyTt3XVA0A3cF3q5CY30Q==", + "dependencies": { + "inherits": "^2.0.4", + "readable-stream": "^3.4.0", + "xtend": "^4.0.2" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/level-mem": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/level-mem/-/level-mem-5.0.1.tgz", + "integrity": "sha512-qd+qUJHXsGSFoHTziptAKXoLX87QjR7v2KMbqncDXPxQuCdsQlzmyX+gwrEHhlzn08vkf8TyipYyMmiC6Gobzg==", + "dependencies": { + "level-packager": "^5.0.3", + "memdown": "^5.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/level-packager": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/level-packager/-/level-packager-5.1.1.tgz", + "integrity": "sha512-HMwMaQPlTC1IlcwT3+swhqf/NUO+ZhXVz6TY1zZIIZlIR0YSn8GtAAWmIvKjNY16ZkEg/JcpAuQskxsXqC0yOQ==", + "dependencies": { + "encoding-down": "^6.3.0", + "levelup": "^4.3.2" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/level-supports": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/level-supports/-/level-supports-4.0.1.tgz", + "integrity": "sha512-PbXpve8rKeNcZ9C1mUicC9auIYFyGpkV9/i6g76tLgANwWhtG2v7I4xNBUlkn3lE2/dZF3Pi0ygYGtLc4RXXdA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/level-transcoder": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/level-transcoder/-/level-transcoder-1.0.1.tgz", + "integrity": "sha512-t7bFwFtsQeD8cl8NIoQ2iwxA0CL/9IFw7/9gAjOonH0PWTTiRfY7Hq+Ejbsxh86tXobDQ6IOiddjNYIfOBs06w==", + "dev": true, + "dependencies": { + "buffer": "^6.0.3", + "module-error": "^1.0.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/level-ws": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/level-ws/-/level-ws-2.0.0.tgz", + "integrity": "sha512-1iv7VXx0G9ec1isqQZ7y5LmoZo/ewAsyDHNA8EFDW5hqH2Kqovm33nSFkSdnLLAK+I5FlT+lo5Cw9itGe+CpQA==", + "dependencies": { + "inherits": "^2.0.3", + "readable-stream": "^3.1.0", + "xtend": "^4.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/levelup": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/levelup/-/levelup-4.4.0.tgz", + "integrity": "sha512-94++VFO3qN95cM/d6eBXvd894oJE0w3cInq9USsyQzzoJxmiYzPAocNcuGCPGGjoXqDVJcr3C1jzt1TSjyaiLQ==", + "dependencies": { + "deferred-leveldown": "~5.3.0", + "level-errors": "~2.0.0", + "level-iterator-stream": "~4.0.0", + "level-supports": "~1.0.0", + "xtend": "~4.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/levelup/node_modules/level-supports": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/level-supports/-/level-supports-1.0.1.tgz", + "integrity": "sha512-rXM7GYnW8gsl1vedTJIbzOrRv85c/2uCMpiiCzO2fndd06U/kUXEEU9evYn4zFggBOg36IsBW8LzqIpETwwQzg==", + "dependencies": { + "xtend": "^4.0.2" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", + "dev": true, + "dependencies": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A==", + "peer": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/load-json-file/node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", + "dev": true, + "dependencies": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/lodash.assign": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", + "integrity": "sha512-hFuH8TY+Yji7Eja3mGiuAxBqLagejScbG8GbG0j6o9vzn0YL14My+ktnqtZgFTosKymC9/44wP6s7xyuLfnClw==", + "peer": true + }, + "node_modules/lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==" + }, + "node_modules/lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==", + "dev": true + }, + "node_modules/lodash.truncate": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", + "dev": true + }, + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-symbols/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/log-symbols/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/log-symbols/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/log-symbols/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/log-symbols/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/log-symbols/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/loupe": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.6.tgz", + "integrity": "sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==", + "deprecated": "Please upgrade to 2.3.7 which fixes GHSA-4q6p-r6v2-jvc5", + "dev": true, + "dependencies": { + "get-func-name": "^2.0.0" + } + }, + "node_modules/lru_map": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/lru_map/-/lru_map-0.3.3.tgz", + "integrity": "sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ==", + "dev": true + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/ltgt": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ltgt/-/ltgt-2.2.1.tgz", + "integrity": "sha512-AI2r85+4MquTw9ZYqabu4nMwy9Oftlfa/e/52t9IjtfG+mGBbTNdAoZ3RQKLHR6r0wQnwZnPIEh/Ya6XTWAKNA==" + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "node_modules/markdown-table": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-1.1.3.tgz", + "integrity": "sha512-1RUZVgQlpJSPWYbFSpmudq5nHY1doEIv89gBtF0s4gW1GF2XorxcA/70M5vq7rLv0a6mhOUccRsqkwhwLCIQ2Q==", + "dev": true + }, + "node_modules/match-all": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/match-all/-/match-all-1.2.6.tgz", + "integrity": "sha512-0EESkXiTkWzrQQntBu2uzKvLu6vVkUGz40nGPbSZuegcfE5UuSzNjLaIu76zJWuaT/2I3Z/8M06OlUOZLGwLlQ==", + "dev": true + }, + "node_modules/mcl-wasm": { + "version": "0.7.9", + "resolved": "https://registry.npmjs.org/mcl-wasm/-/mcl-wasm-0.7.9.tgz", + "integrity": "sha512-iJIUcQWA88IJB/5L15GnJVnSQJmf/YaxxV6zRavv83HILHaJQb6y0iFyDMdDO0gN8X37tdxmAOrH/P8B6RB8sQ==", + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/memdown": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/memdown/-/memdown-5.1.0.tgz", + "integrity": "sha512-B3J+UizMRAlEArDjWHTMmadet+UKwHd3UjMgGBkZcKAxAYVPS9o0Yeiha4qvz7iGiL2Sb3igUft6p7nbFWctpw==", + "dependencies": { + "abstract-leveldown": "~6.2.1", + "functional-red-black-tree": "~1.0.1", + "immediate": "~3.2.3", + "inherits": "~2.0.1", + "ltgt": "~2.2.0", + "safe-buffer": "~5.2.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/memdown/node_modules/abstract-leveldown": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-6.2.3.tgz", + "integrity": "sha512-BsLm5vFMRUrrLeCcRc+G0t2qOaTzpoJQLOubq2XM72eNpjF5UdU5o/5NvlNhx95XHcAvcl8OMXr4mlg/fRgUXQ==", + "dependencies": { + "buffer": "^5.5.0", + "immediate": "^3.2.3", + "level-concat-iterator": "~2.0.0", + "level-supports": "~1.0.0", + "xtend": "~4.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/memdown/node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/memdown/node_modules/immediate": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.2.3.tgz", + "integrity": "sha512-RrGCXRm/fRVqMIhqXrGEX9rRADavPiDFSoMb/k64i9XMk8uH4r/Omi5Ctierj6XzNecwDbO4WuFbDD1zmpl3Tg==" + }, + "node_modules/memdown/node_modules/level-supports": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/level-supports/-/level-supports-1.0.1.tgz", + "integrity": "sha512-rXM7GYnW8gsl1vedTJIbzOrRv85c/2uCMpiiCzO2fndd06U/kUXEEU9evYn4zFggBOg36IsBW8LzqIpETwwQzg==", + "dependencies": { + "xtend": "^4.0.2" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/memory-level": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/memory-level/-/memory-level-1.0.0.tgz", + "integrity": "sha512-UXzwewuWeHBz5krr7EvehKcmLFNoXxGcvuYhC41tRnkrTbJohtS7kVn9akmgirtRygg+f7Yjsfi8Uu5SGSQ4Og==", + "dev": true, + "dependencies": { + "abstract-level": "^1.0.0", + "functional-red-black-tree": "^1.0.1", + "module-error": "^1.0.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/memorystream": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", + "integrity": "sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==", + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/merkle-patricia-tree": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/merkle-patricia-tree/-/merkle-patricia-tree-4.2.4.tgz", + "integrity": "sha512-eHbf/BG6eGNsqqfbLED9rIqbsF4+sykEaBn6OLNs71tjclbMcMOk1tEPmJKcNcNCLkvbpY/lwyOlizWsqPNo8w==", + "dependencies": { + "@types/levelup": "^4.3.0", + "ethereumjs-util": "^7.1.4", + "level-mem": "^5.0.1", + "level-ws": "^2.0.0", + "readable-stream": "^3.6.0", + "semaphore-async-await": "^1.5.1" + } + }, + "node_modules/micro-ftch": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/micro-ftch/-/micro-ftch-0.3.1.tgz", + "integrity": "sha512-/0LLxhzP0tfiR5hcQebtudP56gUurs2CLkGarnCiB/OqEyUFQ6U3paQi/tgLv0hBJYt2rnr9MNpxz4fiiugstg==" + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "dependencies": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + }, + "bin": { + "miller-rabin": "bin/miller-rabin" + } + }, + "node_modules/miller-rabin/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" + }, + "node_modules/minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==" + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/mnemonist": { + "version": "0.38.5", + "resolved": "https://registry.npmjs.org/mnemonist/-/mnemonist-0.38.5.tgz", + "integrity": "sha512-bZTFT5rrPKtPJxj8KSV0WkPyNxl72vQepqqVUAW2ARUpUSF2qXMB6jZj7hW5/k7C1rtpzqbD/IIbJwLXUjCHeg==", + "dev": true, + "dependencies": { + "obliterator": "^2.0.0" + } + }, + "node_modules/mocha": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz", + "integrity": "sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==", + "dev": true, + "dependencies": { + "ansi-colors": "4.1.1", + "browser-stdout": "1.3.1", + "chokidar": "3.5.3", + "debug": "4.3.4", + "diff": "5.0.0", + "escape-string-regexp": "4.0.0", + "find-up": "5.0.0", + "glob": "7.2.0", + "he": "1.2.0", + "js-yaml": "4.1.0", + "log-symbols": "4.1.0", + "minimatch": "5.0.1", + "ms": "2.1.3", + "nanoid": "3.3.3", + "serialize-javascript": "6.0.0", + "strip-json-comments": "3.1.1", + "supports-color": "8.1.1", + "workerpool": "6.2.1", + "yargs": "16.2.0", + "yargs-parser": "20.2.4", + "yargs-unparser": "2.0.0" + }, + "bin": { + "_mocha": "bin/_mocha", + "mocha": "bin/mocha.js" + }, + "engines": { + "node": ">= 14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mochajs" + } + }, + "node_modules/mocha/node_modules/ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/mocha/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/mocha/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mocha/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mocha/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/mocha/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mocha/node_modules/minimatch": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", + "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mocha/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/mocha/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mocha/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mocha/node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/mocha/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/module-alias": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/module-alias/-/module-alias-2.2.3.tgz", + "integrity": "sha512-23g5BFj4zdQL/b6tor7Ji+QY4pEfNH784BMslY9Qb0UnJWRAt+lQGLYmRaM0KDBwIG23ffEBELhZDP2rhi9f/Q==", + "dev": true + }, + "node_modules/module-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/module-error/-/module-error-1.0.2.tgz", + "integrity": "sha512-0yuvsqSCv8LbaOKhnsQ/T5JhyFlCYLPXK3U2sgV10zoKQwzs/MyfuQUOZQ1V/6OCOJsK/TRgNVrPuPDqtdMFtA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/murmur-128": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/murmur-128/-/murmur-128-0.2.1.tgz", + "integrity": "sha512-WseEgiRkI6aMFBbj8Cg9yBj/y+OdipwVC7zUo3W2W1JAJITwouUOtpqsmGSg67EQmwwSyod7hsVsWY5LsrfQVg==", + "dev": true, + "dependencies": { + "encode-utf8": "^1.0.2", + "fmix": "^0.1.0", + "imul": "^1.0.0" + } + }, + "node_modules/nanoassert": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/nanoassert/-/nanoassert-2.0.0.tgz", + "integrity": "sha512-7vO7n28+aYO4J+8w96AzhmU8G+Y/xpPDJz/se19ICsqj/momRbb9mh9ZUtkoJ5X3nTnPdhEJyc0qnM6yAsHBaA==" + }, + "node_modules/nanoid": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz", + "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==", + "dev": true, + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/napi-macros": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/napi-macros/-/napi-macros-2.2.2.tgz", + "integrity": "sha512-hmEVtAGYzVQpCKdbQea4skABsdXW4RUh5t5mJ2zzqowJS2OyXZTU1KhDVFhx+NlWZ4ap9mqR9TcDO3LTTttd+g==", + "dev": true + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true + }, + "node_modules/node-addon-api": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz", + "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==" + }, + "node_modules/node-emoji": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz", + "integrity": "sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==", + "dev": true, + "dependencies": { + "lodash": "^4.17.21" + } + }, + "node_modules/node-environment-flags": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.6.tgz", + "integrity": "sha512-5Evy2epuL+6TM0lCQGpFIj6KwiEsGh1SrHUhTbNX+sLbBtjidPZFAnVK9y5yU1+h//RitLbRHTIMyxQPtxMdHw==", + "dev": true, + "dependencies": { + "object.getownpropertydescriptors": "^2.0.3", + "semver": "^5.7.0" + } + }, + "node_modules/node-environment-flags/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/node-fetch": { + "version": "2.6.11", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.11.tgz", + "integrity": "sha512-4I6pdBY1EthSqDmJkiNk3JIT8cswwR9nfeW/cPdUagJYEQG7R95WRH74wpz7ma8Gh/9dI9FP+OU+0E4FvtA55w==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-gyp-build": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.6.1.tgz", + "integrity": "sha512-24vnklJmyRS8ViBNI8KbtK/r/DmXQMRiOMXTNz2nrTnAYUwjmEEbnnpB/+kt+yWRv73bPsSPRFddrcIbAxSiMQ==", + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" + } + }, + "node_modules/nofilter": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/nofilter/-/nofilter-3.1.0.tgz", + "integrity": "sha512-l2NNj07e9afPnhAhvgVrCD/oy2Ai1yfLpuo3EpiO1jFTsB4sFz6oIfAfSZyQzVpkZQ9xS8ZS5g1jCBgq4Hwo0g==", + "dev": true, + "engines": { + "node": ">=12.19" + } + }, + "node_modules/nopt": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "integrity": "sha512-4GUt3kSEYmk4ITxzB/b9vaIDfUVWN/Ml1Fwl11IlnIG2iaJ9O6WXZ9SrYM9NLI8OCBieN2Y8SWC2oJV0RQ7qYg==", + "dev": true, + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + } + }, + "node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "peer": true, + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/normalize-package-data/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "peer": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/number-to-bn": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/number-to-bn/-/number-to-bn-1.7.0.tgz", + "integrity": "sha512-wsJ9gfSz1/s4ZsJN01lyonwuxA1tml6X1yBDnfpMglypcBRFZZkus26EdPSlqS5GJfYddVZa22p3VNb3z5m5Ig==", + "dependencies": { + "bn.js": "4.11.6", + "strip-hex-prefix": "1.0.0" + }, + "engines": { + "node": ">=6.5.0", + "npm": ">=3" + } + }, + "node_modules/number-to-bn/node_modules/bn.js": { + "version": "4.11.6", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", + "integrity": "sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA==" + }, + "node_modules/oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "engines": { + "node": "*" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.getownpropertydescriptors": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.6.tgz", + "integrity": "sha512-lq+61g26E/BgHv0ZTFgRvi7NMEPuAxLkFU7rukXjc/AlwH4Am5xXVnIXy3un1bg/JPbXHrixRkK1itUzzPiIjQ==", + "dev": true, + "dependencies": { + "array.prototype.reduce": "^1.0.5", + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.21.2", + "safe-array-concat": "^1.0.0" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/obliterator": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/obliterator/-/obliterator-2.0.4.tgz", + "integrity": "sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ==", + "dev": true + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dev": true, + "dependencies": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/ordinal": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/ordinal/-/ordinal-1.0.3.tgz", + "integrity": "sha512-cMddMgb2QElm8G7vdaa02jhUNbTSrhsgAGUz1OokD83uJTwSUn+nKoNoKVVaRa08yF6sgfO7Maou1+bgLd9rdQ==", + "dev": true + }, + "node_modules/os-locale": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha512-PRT7ZORmwu2MEFt4/fv3Q+mEfN4zetKxufQrkShY2oGvUms9r8otu5HfdyIFHkYXjO7laNsoVGmM2MANfuTA8g==", + "peer": true, + "dependencies": { + "lcid": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "dependencies": { + "p-try": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", + "dev": true, + "dependencies": { + "p-limit": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/parse-cache-control": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz", + "integrity": "sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==", + "dev": true + }, + "node_modules/parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==", + "peer": true, + "dependencies": { + "error-ex": "^1.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==" + }, + "node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/pathval": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/pbkdf2": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", + "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", + "dependencies": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==", + "peer": true, + "dependencies": { + "pinkie": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", + "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "node_modules/promise": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", + "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", + "dev": true, + "dependencies": { + "asap": "~2.0.6" + } + }, + "node_modules/prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==" + }, + "node_modules/psl": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==" + }, + "node_modules/punycode": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.0.tgz", + "integrity": "sha512-Yxz2kRwT90aPiWEMHVYnEf4+rhwF1tBmmZ4KepCP+Wkium9JxtWnUm1nqGwpiAHr/tnTSeHqr3wb++jgSkXjhA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/qs": { + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", + "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "dev": true, + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ==", + "peer": true, + "dependencies": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha512-WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A==", + "peer": true, + "dependencies": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/read-pkg-up/node_modules/find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA==", + "peer": true, + "dependencies": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/read-pkg-up/node_modules/path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ==", + "peer": true, + "dependencies": { + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/read-pkg/node_modules/path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg==", + "peer": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/read-pkg/node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "dev": true, + "dependencies": { + "resolve": "^1.1.6" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/recursive-readdir": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.3.tgz", + "integrity": "sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==", + "dev": true, + "dependencies": { + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/reduce-flatten": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-2.0.0.tgz", + "integrity": "sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w==", + "engines": { + "node": ">=6" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", + "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "functions-have-names": "^1.2.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/req-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/req-cwd/-/req-cwd-2.0.0.tgz", + "integrity": "sha512-ueoIoLo1OfB6b05COxAA9UpeoscNpYyM+BqYlA7H6LVF4hKGPXQQSSaD2YmvDVJMkk4UDpAHIeU1zG53IqjvlQ==", + "dev": true, + "dependencies": { + "req-from": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/req-from": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/req-from/-/req-from-2.0.0.tgz", + "integrity": "sha512-LzTfEVDVQHBRfjOUMgNBA+V6DWsSnoeKzf42J7l0xa/B4jyPOuuF5MlNSmomLNGemWTnV2TIdjSSLnEn95fOQA==", + "dev": true, + "dependencies": { + "resolve-from": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", + "dependencies": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/request-promise-core": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz", + "integrity": "sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==", + "dev": true, + "dependencies": { + "lodash": "^4.17.19" + }, + "engines": { + "node": ">=0.10.0" + }, + "peerDependencies": { + "request": "^2.34" + } + }, + "node_modules/request-promise-native": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.9.tgz", + "integrity": "sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==", + "deprecated": "request-promise-native has been deprecated because it extends the now deprecated request package, see https://github.com/request/request/issues/3142", + "dev": true, + "dependencies": { + "request-promise-core": "1.1.4", + "stealthy-require": "^1.1.1", + "tough-cookie": "^2.3.3" + }, + "engines": { + "node": ">=0.12.0" + }, + "peerDependencies": { + "request": "^2.34" + } + }, + "node_modules/request/node_modules/form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 0.12" + } + }, + "node_modules/request/node_modules/qs": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", + "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/request/node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-1.2.1.tgz", + "integrity": "sha512-H7AkJWMobeskkttHyhTVtS0fxpFLjxhbfMa6Bk3wimP7sdPRGL3EyCg3sAQenFfAe+xQ+oAc85Nmtvq0ROM83Q==", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha512-IqSUtOVP4ksd1C/ej5zeEh/BIP2ajqpn8c5x+q99gvcIG/Qf0cud5raVnE/Dwd0ua9TXYDoDc0RE5hBSdz22Ug==", + "peer": true + }, + "node_modules/resolve": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", + "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", + "dependencies": { + "path-parse": "^1.0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "node_modules/rlp": { + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/rlp/-/rlp-2.2.6.tgz", + "integrity": "sha512-HAfAmL6SDYNWPUOJNrM500x4Thn4PZsEy5pijPh40U9WfNk0z15hUYzO9xVIMAdIHdFtD8CBDHd75Td1g36Mjg==", + "dependencies": { + "bn.js": "^4.11.1" + }, + "bin": { + "rlp": "bin/rlp" + } + }, + "node_modules/rlp/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/run-parallel-limit": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/run-parallel-limit/-/run-parallel-limit-1.1.0.tgz", + "integrity": "sha512-jJA7irRNM91jaKc3Hcl1npHsFLOXOoTkPCUL1JEa1R82O2miplXXRaGdjW/KM/98YQWDhJLiSs793CnXfblJUw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/rustbn.js": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/rustbn.js/-/rustbn.js-0.2.0.tgz", + "integrity": "sha512-4VlvkRUuCJvr2J6Y0ImW7NvTCriMi7ErOAqWk1y69vAdoNIzCF3yPmgeNzx+RQTLEDFq5sHfscn1MwHxP9hNfA==" + }, + "node_modules/safe-array-concat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.0.tgz", + "integrity": "sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-array-concat/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safe-regex-test": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", + "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-regex": "^1.1.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/sc-istanbul": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/sc-istanbul/-/sc-istanbul-0.4.6.tgz", + "integrity": "sha512-qJFF/8tW/zJsbyfh/iT/ZM5QNHE3CXxtLJbZsL+CzdJLBsPD7SedJZoUA4d8iAcN2IoMp/Dx80shOOd2x96X/g==", + "dev": true, + "dependencies": { + "abbrev": "1.0.x", + "async": "1.x", + "escodegen": "1.8.x", + "esprima": "2.7.x", + "glob": "^5.0.15", + "handlebars": "^4.0.1", + "js-yaml": "3.x", + "mkdirp": "0.5.x", + "nopt": "3.x", + "once": "1.x", + "resolve": "1.1.x", + "supports-color": "^3.1.0", + "which": "^1.1.1", + "wordwrap": "^1.0.0" + }, + "bin": { + "istanbul": "lib/cli.js" + } + }, + "node_modules/sc-istanbul/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/sc-istanbul/node_modules/async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w==", + "dev": true + }, + "node_modules/sc-istanbul/node_modules/glob": { + "version": "5.0.15", + "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", + "integrity": "sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "dependencies": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/sc-istanbul/node_modules/has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sc-istanbul/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/sc-istanbul/node_modules/js-yaml/node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/sc-istanbul/node_modules/resolve": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha512-9znBF0vBcaSN3W2j7wKvdERPwqTxSpCq+if5C0WoTCyV9n24rua28jeuQ2pL/HOf+yUe/Mef+H/5p60K0Id3bg==", + "dev": true + }, + "node_modules/sc-istanbul/node_modules/supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==", + "dev": true, + "dependencies": { + "has-flag": "^1.0.0" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/scrypt-js": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz", + "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==" + }, + "node_modules/secp256k1": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-4.0.3.tgz", + "integrity": "sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA==", + "hasInstallScript": true, + "dependencies": { + "elliptic": "^6.5.4", + "node-addon-api": "^2.0.0", + "node-gyp-build": "^4.2.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/secp256k1/node_modules/node-addon-api": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz", + "integrity": "sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==" + }, + "node_modules/seedrandom": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/seedrandom/-/seedrandom-3.0.5.tgz", + "integrity": "sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg==" + }, + "node_modules/semaphore-async-await": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/semaphore-async-await/-/semaphore-async-await-1.5.1.tgz", + "integrity": "sha512-b/ptP11hETwYWpeilHXXQiV5UJNJl7ZWWooKRE5eBIYWoom6dZ0SluCIdCtKycsMtZgKWE01/qAw6jblw1YVhg==", + "engines": { + "node": ">=4.1" + } + }, + "node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/serialize-javascript": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", + "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "dev": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" + }, + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==" + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dev": true + }, + "node_modules/sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + }, + "bin": { + "sha.js": "bin.js" + } + }, + "node_modules/sha1": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/sha1/-/sha1-1.1.1.tgz", + "integrity": "sha512-dZBS6OrMjtgVkopB1Gmo4RQCDKiZsqcpAQpkV/aaj+FCrCg8r4I4qMkDPQjBgLIxlmu9k4nUbWq6ohXahOneYA==", + "dev": true, + "dependencies": { + "charenc": ">= 0.0.1", + "crypt": ">= 0.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/shelljs": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "dev": true, + "dependencies": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + }, + "bin": { + "shjs": "bin/shjs" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/slice-ansi/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/slice-ansi/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/slice-ansi/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/slice-ansi/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/solc": { + "version": "0.8.15", + "resolved": "https://registry.npmjs.org/solc/-/solc-0.8.15.tgz", + "integrity": "sha512-Riv0GNHNk/SddN/JyEuFKwbcWcEeho15iyupTSHw5Np6WuXA5D8kEHbyzDHi6sqmvLzu2l+8b1YmL8Ytple+8w==", + "dependencies": { + "command-exists": "^1.2.8", + "commander": "^8.1.0", + "follow-redirects": "^1.12.1", + "js-sha3": "0.8.0", + "memorystream": "^0.3.1", + "semver": "^5.5.0", + "tmp": "0.0.33" + }, + "bin": { + "solcjs": "solc.js" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/solc/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/solidity-coverage": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/solidity-coverage/-/solidity-coverage-0.8.4.tgz", + "integrity": "sha512-xeHOfBOjdMF6hWTbt42iH4x+7j1Atmrf5OldDPMxI+i/COdExUxszOswD9qqvcBTaLGiOrrpnh9UZjSpt4rBsg==", + "dev": true, + "dependencies": { + "@ethersproject/abi": "^5.0.9", + "@solidity-parser/parser": "^0.16.0", + "chalk": "^2.4.2", + "death": "^1.1.0", + "detect-port": "^1.3.0", + "difflib": "^0.2.4", + "fs-extra": "^8.1.0", + "ghost-testrpc": "^0.0.2", + "global-modules": "^2.0.0", + "globby": "^10.0.1", + "jsonschema": "^1.2.4", + "lodash": "^4.17.15", + "mocha": "7.1.2", + "node-emoji": "^1.10.0", + "pify": "^4.0.1", + "recursive-readdir": "^2.2.2", + "sc-istanbul": "^0.4.5", + "semver": "^7.3.4", + "shelljs": "^0.8.3", + "web3-utils": "^1.3.6" + }, + "bin": { + "solidity-coverage": "plugins/bin.js" + }, + "peerDependencies": { + "hardhat": "^2.11.0" + } + }, + "node_modules/solidity-coverage/node_modules/@solidity-parser/parser": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.16.1.tgz", + "integrity": "sha512-PdhRFNhbTtu3x8Axm0uYpqOy/lODYQK+MlYSgqIsq2L8SFYEHJPHNUiOTAJbDGzNjjr1/n9AcIayxafR/fWmYw==", + "dev": true, + "dependencies": { + "antlr4ts": "^0.5.0-alpha.4" + } + }, + "node_modules/solidity-coverage/node_modules/ansi-colors": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz", + "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/solidity-coverage/node_modules/ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/solidity-coverage/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/solidity-coverage/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/solidity-coverage/node_modules/chokidar": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.0.tgz", + "integrity": "sha512-dGmKLDdT3Gdl7fBUe8XK+gAtGmzy5Fn0XkkWQuYxGIgWVPPse2CxFA5mtrlD0TOHaHjEUqkWNyP1XdHoJES/4A==", + "dev": true, + "dependencies": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.2.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.1.1" + } + }, + "node_modules/solidity-coverage/node_modules/cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dev": true, + "dependencies": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "node_modules/solidity-coverage/node_modules/debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/solidity-coverage/node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/solidity-coverage/node_modules/diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/solidity-coverage/node_modules/emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "node_modules/solidity-coverage/node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/solidity-coverage/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/solidity-coverage/node_modules/flat": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.1.tgz", + "integrity": "sha512-FmTtBsHskrU6FJ2VxCnsDb84wu9zhmO3cUX2kGFb5tuwhfXxGciiT0oRY+cck35QmG+NmGh5eLz6lLCpWTqwpA==", + "dev": true, + "dependencies": { + "is-buffer": "~2.0.3" + }, + "bin": { + "flat": "cli.js" + } + }, + "node_modules/solidity-coverage/node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/solidity-coverage/node_modules/fsevents": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", + "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "deprecated": "\"Please update to latest v2.3 or v2.2\"", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/solidity-coverage/node_modules/glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/solidity-coverage/node_modules/js-yaml": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/solidity-coverage/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/solidity-coverage/node_modules/log-symbols": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz", + "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/solidity-coverage/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/solidity-coverage/node_modules/minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/solidity-coverage/node_modules/mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "dependencies": { + "minimist": "^1.2.5" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/solidity-coverage/node_modules/mocha": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-7.1.2.tgz", + "integrity": "sha512-o96kdRKMKI3E8U0bjnfqW4QMk12MwZ4mhdBTf+B5a1q9+aq2HRnj+3ZdJu0B/ZhJeK78MgYuv6L8d/rA5AeBJA==", + "dev": true, + "dependencies": { + "ansi-colors": "3.2.3", + "browser-stdout": "1.3.1", + "chokidar": "3.3.0", + "debug": "3.2.6", + "diff": "3.5.0", + "escape-string-regexp": "1.0.5", + "find-up": "3.0.0", + "glob": "7.1.3", + "growl": "1.10.5", + "he": "1.2.0", + "js-yaml": "3.13.1", + "log-symbols": "3.0.0", + "minimatch": "3.0.4", + "mkdirp": "0.5.5", + "ms": "2.1.1", + "node-environment-flags": "1.0.6", + "object.assign": "4.1.0", + "strip-json-comments": "2.0.1", + "supports-color": "6.0.0", + "which": "1.3.1", + "wide-align": "1.1.3", + "yargs": "13.3.2", + "yargs-parser": "13.1.2", + "yargs-unparser": "1.6.0" + }, + "bin": { + "_mocha": "bin/_mocha", + "mocha": "bin/mocha" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mochajs" + } + }, + "node_modules/solidity-coverage/node_modules/ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + }, + "node_modules/solidity-coverage/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/solidity-coverage/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/solidity-coverage/node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/solidity-coverage/node_modules/readdirp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.2.0.tgz", + "integrity": "sha512-crk4Qu3pmXwgxdSgGhgA/eXiJAPQiX4GMOZZMXnqKxHX7TaoL+3gQVo/WeuAiogr07DpnfjIMpXXa+PAIvwPGQ==", + "dev": true, + "dependencies": { + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/solidity-coverage/node_modules/require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, + "node_modules/solidity-coverage/node_modules/semver": { + "version": "7.5.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.2.tgz", + "integrity": "sha512-SoftuTROv/cRjCze/scjGyiDtcUyxw1rgYQSZY7XTmtR5hX+dm76iDbTH8TkLPHCQmlbQVSSbNZCPM2hb0knnQ==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/solidity-coverage/node_modules/string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "dependencies": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/solidity-coverage/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/solidity-coverage/node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/solidity-coverage/node_modules/supports-color": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz", + "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/solidity-coverage/node_modules/which-module": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", + "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", + "dev": true + }, + "node_modules/solidity-coverage/node_modules/wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/solidity-coverage/node_modules/y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "dev": true + }, + "node_modules/solidity-coverage/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/solidity-coverage/node_modules/yargs": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "dev": true, + "dependencies": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.2" + } + }, + "node_modules/solidity-coverage/node_modules/yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "dev": true, + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + }, + "node_modules/solidity-coverage/node_modules/yargs-unparser": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.0.tgz", + "integrity": "sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw==", + "dev": true, + "dependencies": { + "flat": "^4.1.0", + "lodash": "^4.17.15", + "yargs": "^13.3.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/source-map": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz", + "integrity": "sha512-CBdZ2oa/BHhS4xj5DlhjWNHcan57/5YuvfdLf17iVmIpd9KRm+DFLmC6nBNj+6Ua7Kt3TmOjDpQT1aTYOQtoUA==", + "dev": true, + "optional": true, + "dependencies": { + "amdefine": ">=0.0.4" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-support/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "peer": true, + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", + "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", + "peer": true + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "peer": true, + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.20", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.20.tgz", + "integrity": "sha512-jg25NiDV/1fLtSgEgyvVyDunvaNHbuwF9lfNV17gSmPFAlYzdfNBlLtLzXTevwkPj7DhGbmN9VnmJIgLnhvaBw==", + "peer": true + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + }, + "node_modules/sshpk": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", + "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", + "dependencies": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + }, + "bin": { + "sshpk-conv": "bin/sshpk-conv", + "sshpk-sign": "bin/sshpk-sign", + "sshpk-verify": "bin/sshpk-verify" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sshpk/node_modules/tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==" + }, + "node_modules/stacktrace-parser": { + "version": "0.1.10", + "resolved": "https://registry.npmjs.org/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz", + "integrity": "sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg==", + "dev": true, + "dependencies": { + "type-fest": "^0.7.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/stacktrace-parser/node_modules/type-fest": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.7.1.tgz", + "integrity": "sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/stealthy-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", + "integrity": "sha512-ZnWpYnYugiOVEY5GkcuJK1io5V8QmNYChG62gSit9pQVGErXtrKuPC55ITaVSukmMta5qpMU7vqLt2Lnni4f/g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/streamsearch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", + "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", + "dev": true, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-format": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/string-format/-/string-format-2.0.0.tgz", + "integrity": "sha512-bbEs3scLeYNXLecRRuk6uJxdXUSj6le/8rNPHChIJTn2V79aXVTR1EH2OH5zLKKoz0V02fOUKZZcw01pLUShZA==" + }, + "node_modules/string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "dependencies": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", + "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", + "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", + "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", + "dev": true, + "dependencies": { + "ansi-regex": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==", + "peer": true, + "dependencies": { + "is-utf8": "^0.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-hex-prefix": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz", + "integrity": "sha512-q8d4ue7JGEiVcypji1bALTos+0pWtyGlivAWyPuTkHzuTCJqrK9sWxYQZUq6Nq3cuyv3bm734IhHvHtGGURU6A==", + "dependencies": { + "is-hex-prefixed": "1.0.0" + }, + "engines": { + "node": ">=6.5.0", + "npm": ">=3" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/sync-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/sync-request/-/sync-request-6.1.0.tgz", + "integrity": "sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw==", + "dev": true, + "dependencies": { + "http-response-object": "^3.0.1", + "sync-rpc": "^1.2.1", + "then-request": "^6.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/sync-rpc": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/sync-rpc/-/sync-rpc-1.3.6.tgz", + "integrity": "sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw==", + "dev": true, + "dependencies": { + "get-port": "^3.1.0" + } + }, + "node_modules/table": { + "version": "6.8.1", + "resolved": "https://registry.npmjs.org/table/-/table-6.8.1.tgz", + "integrity": "sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==", + "dev": true, + "dependencies": { + "ajv": "^8.0.1", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/table-layout": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-1.0.2.tgz", + "integrity": "sha512-qd/R7n5rQTRFi+Zf2sk5XVVd9UQl6ZkduPFC3S7WEGJAmetDTjY3qPN50eSKzwuzEyQKy5TN2TiZdkIjos2L6A==", + "dependencies": { + "array-back": "^4.0.1", + "deep-extend": "~0.6.0", + "typical": "^5.2.0", + "wordwrapjs": "^4.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/table-layout/node_modules/array-back": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz", + "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/table-layout/node_modules/typical": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", + "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/table/node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/table/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/table/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/table/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/table/node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/table/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/table/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/testrpc": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/testrpc/-/testrpc-0.0.1.tgz", + "integrity": "sha512-afH1hO+SQ/VPlmaLUFj2636QMeDvPCeQMc/9RBMW0IfjNe9gFD9Ra3ShqYkB7py0do1ZcCna/9acHyzTJ+GcNA==", + "deprecated": "testrpc has been renamed to ganache-cli, please use this package from now on.", + "peer": true + }, + "node_modules/then-request": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/then-request/-/then-request-6.0.2.tgz", + "integrity": "sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA==", + "dev": true, + "dependencies": { + "@types/concat-stream": "^1.6.0", + "@types/form-data": "0.0.33", + "@types/node": "^8.0.0", + "@types/qs": "^6.2.31", + "caseless": "~0.12.0", + "concat-stream": "^1.6.0", + "form-data": "^2.2.0", + "http-basic": "^8.1.1", + "http-response-object": "^3.0.1", + "promise": "^8.0.0", + "qs": "^6.4.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/then-request/node_modules/@types/node": { + "version": "8.10.66", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.66.tgz", + "integrity": "sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==", + "dev": true + }, + "node_modules/then-request/node_modules/form-data": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", + "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 0.12" + } + }, + "node_modules/tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dependencies": { + "os-tmpdir": "~1.0.2" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dependencies": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/tough-cookie/node_modules/punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "node_modules/ts-command-line-args": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/ts-command-line-args/-/ts-command-line-args-2.5.1.tgz", + "integrity": "sha512-H69ZwTw3rFHb5WYpQya40YAX2/w7Ut75uUECbgBIsLmM+BNuYnxsltfyyLMxy6sEeKxgijLTnQtLd0nKd6+IYw==", + "dependencies": { + "chalk": "^4.1.0", + "command-line-args": "^5.1.1", + "command-line-usage": "^6.1.0", + "string-format": "^2.0.0" + }, + "bin": { + "write-markdown": "dist/write-markdown.js" + } + }, + "node_modules/ts-command-line-args/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/ts-command-line-args/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/ts-command-line-args/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/ts-command-line-args/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/ts-command-line-args/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ts-command-line-args/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ts-essentials": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/ts-essentials/-/ts-essentials-7.0.3.tgz", + "integrity": "sha512-8+gr5+lqO3G84KdiTSMRLtuyJ+nTBVRKuCrK4lidMPdVeEp0uqC875uE5NMcaA7YYMN7XsNiFQuMvasF8HT/xQ==", + "peerDependencies": { + "typescript": ">=3.7.0" + } + }, + "node_modules/ts-node": { + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", + "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", + "dev": true, + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, + "node_modules/ts-node/node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "node_modules/tsort": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/tsort/-/tsort-0.0.1.tgz", + "integrity": "sha512-Tyrf5mxF8Ofs1tNoxA13lFeZ2Zrbd6cKbuH3V+MQ5sb6DtBj5FjrXVsRWT8YvNAQTqNoz66dz1WsbigI22aEnw==", + "dev": true + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/tweetnacl": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", + "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==", + "dev": true + }, + "node_modules/tweetnacl-util": { + "version": "0.15.1", + "resolved": "https://registry.npmjs.org/tweetnacl-util/-/tweetnacl-util-0.15.1.tgz", + "integrity": "sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw==", + "dev": true + }, + "node_modules/type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", + "dev": true, + "dependencies": { + "prelude-ls": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typechain": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/typechain/-/typechain-8.2.0.tgz", + "integrity": "sha512-tZqhqjxJ9xAS/Lh32jccTjMkpx7sTdUVVHAy5Bf0TIer5QFNYXotiX74oCvoVYjyxUKDK3MXHtMFzMyD3kE+jg==", + "dependencies": { + "@types/prettier": "^2.1.1", + "debug": "^4.3.1", + "fs-extra": "^7.0.0", + "glob": "7.1.7", + "js-sha3": "^0.8.0", + "lodash": "^4.17.15", + "mkdirp": "^1.0.4", + "prettier": "^2.3.1", + "ts-command-line-args": "^2.2.0", + "ts-essentials": "^7.0.1" + }, + "bin": { + "typechain": "dist/cli/cli.js" + }, + "peerDependencies": { + "typescript": ">=4.3.0" + } + }, + "node_modules/typechain/node_modules/glob": { + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", + "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/typechain/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", + "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "is-typed-array": "^1.1.9" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", + "dev": true + }, + "node_modules/typescript": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.3.tgz", + "integrity": "sha512-XH627E9vkeqhlZFQuL+UsyAXEnibT0kWR2FWONlr4sTjvxyJYnyefgrkyECLzM5NenmKzRAy2rR/OlYLA1HkZw==", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/typical": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/typical/-/typical-4.0.0.tgz", + "integrity": "sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/uglify-js": { + "version": "3.17.4", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz", + "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==", + "dev": true, + "optional": true, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/undici": { + "version": "5.22.1", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.22.1.tgz", + "integrity": "sha512-Ji2IJhFXZY0x/0tVBXeQwgPlLWw13GVzpsWPQ3rV50IFMMof2I55PZZxtm4P6iNq+L5znYN9nSTAq0ZyE6lSJw==", + "dev": true, + "dependencies": { + "busboy": "^1.6.0" + }, + "engines": { + "node": ">=14.0" + } + }, + "node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/url": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.1.tgz", + "integrity": "sha512-rWS3H04/+mzzJkv0eZ7vEDGiQbgquI1fGfOad6zKvgYQi1SzMmhl7c/DdRGxhaWrVH6z0qWITo8rpnxK/RfEhA==", + "dependencies": { + "punycode": "^1.4.1", + "qs": "^6.11.0" + } + }, + "node_modules/url/node_modules/punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==" + }, + "node_modules/utf8": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/utf8/-/utf8-3.0.0.tgz", + "integrity": "sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ==" + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "peer": true, + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", + "engines": [ + "node >=0.6.0" + ], + "dependencies": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "node_modules/wasmbuilder": { + "version": "0.0.16", + "resolved": "https://registry.npmjs.org/wasmbuilder/-/wasmbuilder-0.0.16.tgz", + "integrity": "sha512-Qx3lEFqaVvp1cEYW7Bfi+ebRJrOiwz2Ieu7ZG2l7YyeSJIok/reEQCQCuicj/Y32ITIJuGIM9xZQppGx5LrQdA==" + }, + "node_modules/wasmcurves": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/wasmcurves/-/wasmcurves-0.2.2.tgz", + "integrity": "sha512-JRY908NkmKjFl4ytnTu5ED6AwPD+8VJ9oc94kdq7h5bIwbj0L4TDJ69mG+2aLs2SoCmGfqIesMWTEJjtYsoQXQ==", + "dependencies": { + "wasmbuilder": "0.0.16" + } + }, + "node_modules/web-worker": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/web-worker/-/web-worker-1.2.0.tgz", + "integrity": "sha512-PgF341avzqyx60neE9DD+XS26MMNMoUQRz9NOZwW32nPQrF6p77f1htcnjBSEV8BGMKZ16choqUG4hyI0Hx7mA==" + }, + "node_modules/web3-utils": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.10.4.tgz", + "integrity": "sha512-tsu8FiKJLk2PzhDl9fXbGUWTkkVXYhtTA+SmEFkKft+9BgwLxfCRpU96sWv7ICC8zixBNd3JURVoiR3dUXgP8A==", + "dependencies": { + "@ethereumjs/util": "^8.1.0", + "bn.js": "^5.2.1", + "ethereum-bloom-filters": "^1.0.6", + "ethereum-cryptography": "^2.1.2", + "ethjs-unit": "0.1.6", + "number-to-bn": "1.7.0", + "randombytes": "^2.1.0", + "utf8": "3.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/web3-utils/node_modules/ethereum-cryptography": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-2.2.1.tgz", + "integrity": "sha512-r/W8lkHSiTLxUxW8Rf3u4HGB0xQweG2RyETjywylKZSzLWoWAijRz8WCuOtJ6wah+avllXBqZuk29HCCvhEIRg==", + "dependencies": { + "@noble/curves": "1.4.2", + "@noble/hashes": "1.4.0", + "@scure/bip32": "1.4.0", + "@scure/bip39": "1.3.0" + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", + "integrity": "sha512-F6+WgncZi/mJDrammbTuHe1q0R5hOXv/mBaiNA2TCNT/LTHusX0V+CJnj9XT8ki5ln2UZyyddDgHfCzyrOH7MQ==", + "peer": true + }, + "node_modules/which-typed-array": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", + "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/wide-align": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "dev": true, + "dependencies": { + "string-width": "^1.0.2 || 2" + } + }, + "node_modules/window-size": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.2.0.tgz", + "integrity": "sha512-UD7d8HFA2+PZsbKyaOCEy8gMh1oDtHgJh1LfgjQ4zVXmYjAT/kvz3PueITKuqDiIXQe7yzpPnxX3lNc+AhQMyw==", + "peer": true, + "bin": { + "window-size": "cli.js" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", + "dev": true + }, + "node_modules/wordwrapjs": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-4.0.1.tgz", + "integrity": "sha512-kKlNACbvHrkpIw6oPeYDSmdCTu2hdMHoyXLTcUKala++lx5Y+wjJ/e474Jqv5abnVmwxw08DiTuHmw69lJGksA==", + "dependencies": { + "reduce-flatten": "^2.0.0", + "typical": "^5.2.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/wordwrapjs/node_modules/typical": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", + "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/workerpool": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", + "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==", + "dev": true + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/wrap-ansi/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "node_modules/ws": { + "version": "7.4.6", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", + "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xmlhttprequest": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz", + "integrity": "sha512-58Im/U0mlVBLM38NdZjHyhuMtCqa61469k2YP/AaPbvCoV9aQGUpbJBj1QRm2ytRiVQBD/fsw7L2bJGDVQswBA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + }, + "node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-parser": { + "version": "20.2.4", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", + "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-unparser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", + "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", + "dev": true, + "dependencies": { + "camelcase": "^6.0.0", + "decamelize": "^4.0.0", + "flat": "^5.0.2", + "is-plain-obj": "^2.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zksync-web3": { + "version": "0.14.3", + "resolved": "https://registry.npmjs.org/zksync-web3/-/zksync-web3-0.14.3.tgz", + "integrity": "sha512-hT72th4AnqyLW1d5Jlv8N2B/qhEnl2NePK2A3org7tAa24niem/UAaHMkEvmWI3SF9waYUPtqAtjpf+yvQ9zvQ==", + "deprecated": "This package has been deprecated in favor of zksync-ethers@5.0.0", + "dev": true, + "peerDependencies": { + "ethers": "^5.7.0" + } + } + } +} diff --git a/contracts/package.json b/contracts/package.json index 385443ae2..0420157d5 100644 --- a/contracts/package.json +++ b/contracts/package.json @@ -56,7 +56,8 @@ "@zk-email/contracts": "^3.2.0", "circomlibjs": "^0.1.7", "dotenv": "^16.3.1", - "ethereum-waffle": "^4.0.10" + "ethereum-waffle": "^4.0.10", + "fhevm": "^0.5.8" }, "_moduleAliases": { "@utils": "utils", diff --git a/contracts/test/ramps/hdfc/hdfcRamp.spec.ts b/contracts/test/ramps/hdfc/hdfcRamp.spec.ts index 353a1cf4f..5b4a38a6b 100644 --- a/contracts/test/ramps/hdfc/hdfcRamp.spec.ts +++ b/contracts/test/ramps/hdfc/hdfcRamp.spec.ts @@ -9,6 +9,7 @@ import { Account } from "@utils/test/types"; import { HDFCRamp, USDCMock, + EncryptedERC20, HDFCRegistrationProcessorMock, HDFCSendProcessorMock } from "@utils/contracts"; @@ -42,6 +43,7 @@ describe("HDFCRamp", () => { let ramp: HDFCRamp; let usdcToken: USDCMock; + let encryptedERC20Token: EncryptedERC20; let registrationProcessor: HDFCRegistrationProcessorMock; let sendProcessor: HDFCSendProcessorMock; @@ -67,10 +69,14 @@ describe("HDFCRamp", () => { const poseidonContract6 = await deployer.deployPoseidon6(); usdcToken = await deployer.deployUSDCMock(usdc(1000000000), "USDC", "USDC"); + encryptedERC20Token = await deployer.deployEncryptedERC20("ET", "EncryptedToken"); registrationProcessor = await deployer.deployHDFCRegistrationProcessorMock(); sendProcessor = await deployer.deployHDFCSendProcessorMock(); await usdcToken.transfer(offRamper.address, usdc(10000)); + // amount will be minted corresponding to 1000 encrypted token + await encryptedERC20Token.mint(usdc(10000)); + // await encryptedERC20Token["transfer(address,bytes32,by ramp = await deployer.deployHDFCRamp( owner.address, diff --git a/contracts/utils/contracts.ts b/contracts/utils/contracts.ts index fa5ea2b15..7040960c5 100644 --- a/contracts/utils/contracts.ts +++ b/contracts/utils/contracts.ts @@ -1,4 +1,6 @@ export { + EncryptedERC20, + EncryptedERC20__factory, GarantiRamp, GarantiRegistrationProcessor, GarantiRegistrationProcessorMock, diff --git a/contracts/utils/deploys.ts b/contracts/utils/deploys.ts index 584fef19f..fc026d967 100644 --- a/contracts/utils/deploys.ts +++ b/contracts/utils/deploys.ts @@ -5,6 +5,8 @@ import { Address, TLSParams } from "@utils/types"; const circom = require("circomlibjs"); import { + EncryptedERC20, + EncryptedERC20__factory, GarantiBodyHashVerifier, GarantiRamp, GarantiRegistrationProcessor, @@ -107,6 +109,10 @@ export default class DeployHelper { return await new USDCMock__factory(this._deployerSigner).deploy(mintAmount.toString(), name, symbol); } + public async deployEncryptedERC20(name: string, symbol: string): Promise { + return await new EncryptedERC20__factory(this._deployerSigner).deploy(name, symbol) + } + // Venmo-V1 Contracts public async deployRamp( owner: Address, diff --git a/contracts/yarn.lock b/contracts/yarn.lock index 30c3abc1b..6307a3a2a 100644 --- a/contracts/yarn.lock +++ b/contracts/yarn.lock @@ -4,26 +4,26 @@ "@chainsafe/as-sha256@^0.3.1": version "0.3.1" - resolved "https://registry.yarnpkg.com/@chainsafe/as-sha256/-/as-sha256-0.3.1.tgz#3639df0e1435cab03f4d9870cc3ac079e57a6fc9" + resolved "https://registry.npmjs.org/@chainsafe/as-sha256/-/as-sha256-0.3.1.tgz" integrity sha512-hldFFYuf49ed7DAakWVXSJODuq3pzJEguD8tQ7h+sGkM18vja+OFoJI9krnGmgzyuZC2ETX0NOIcCTy31v2Mtg== "@chainsafe/persistent-merkle-tree@^0.4.2": version "0.4.2" - resolved "https://registry.yarnpkg.com/@chainsafe/persistent-merkle-tree/-/persistent-merkle-tree-0.4.2.tgz#4c9ee80cc57cd3be7208d98c40014ad38f36f7ff" + resolved "https://registry.npmjs.org/@chainsafe/persistent-merkle-tree/-/persistent-merkle-tree-0.4.2.tgz" integrity sha512-lLO3ihKPngXLTus/L7WHKaw9PnNJWizlOF1H9NNzHP6Xvh82vzg9F2bzkXhYIFshMZ2gTCEz8tq6STe7r5NDfQ== dependencies: "@chainsafe/as-sha256" "^0.3.1" "@chainsafe/persistent-merkle-tree@^0.5.0": version "0.5.0" - resolved "https://registry.yarnpkg.com/@chainsafe/persistent-merkle-tree/-/persistent-merkle-tree-0.5.0.tgz#2b4a62c9489a5739dedd197250d8d2f5427e9f63" + resolved "https://registry.npmjs.org/@chainsafe/persistent-merkle-tree/-/persistent-merkle-tree-0.5.0.tgz" integrity sha512-l0V1b5clxA3iwQLXP40zYjyZYospQLZXzBVIhhr9kDg/1qHZfzzHw0jj4VPBijfYCArZDlPkRi1wZaV2POKeuw== dependencies: "@chainsafe/as-sha256" "^0.3.1" "@chainsafe/ssz@^0.10.0": version "0.10.2" - resolved "https://registry.yarnpkg.com/@chainsafe/ssz/-/ssz-0.10.2.tgz#c782929e1bb25fec66ba72e75934b31fd087579e" + resolved "https://registry.npmjs.org/@chainsafe/ssz/-/ssz-0.10.2.tgz" integrity sha512-/NL3Lh8K+0q7A3LsiFq09YXS9fPE+ead2rr7vM2QK8PLzrNsw3uqrif9bpRX5UxgeRjM+vYi+boCM3+GM4ovXg== dependencies: "@chainsafe/as-sha256" "^0.3.1" @@ -31,7 +31,7 @@ "@chainsafe/ssz@^0.9.2": version "0.9.4" - resolved "https://registry.yarnpkg.com/@chainsafe/ssz/-/ssz-0.9.4.tgz#696a8db46d6975b600f8309ad3a12f7c0e310497" + resolved "https://registry.npmjs.org/@chainsafe/ssz/-/ssz-0.9.4.tgz" integrity sha512-77Qtg2N1ayqs4Bg/wvnWfg5Bta7iy7IRh8XqXh7oNMeP2HBbBwx8m6yTpA8p0EHItWPEBkgZd5S5/LSlp3GXuQ== dependencies: "@chainsafe/as-sha256" "^0.3.1" @@ -40,14 +40,30 @@ "@cspotcode/source-map-support@^0.8.0": version "0.8.1" - resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" + resolved "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz" integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== dependencies: "@jridgewell/trace-mapping" "0.3.9" +"@ensdomains/ens@^0.4.4": + version "0.4.5" + resolved "https://registry.npmjs.org/@ensdomains/ens/-/ens-0.4.5.tgz" + integrity sha512-JSvpj1iNMFjK6K+uVl4unqMoa9rf5jopb8cya5UGBWz23Nw8hSNT7efgUx4BTlAPAgpNlEioUfeTyQ6J9ZvTVw== + dependencies: + bluebird "^3.5.2" + eth-ens-namehash "^2.0.8" + solc "^0.4.20" + testrpc "0.0.1" + web3-utils "^1.0.0-beta.31" + +"@ensdomains/resolver@^0.2.4": + version "0.2.4" + resolved "https://registry.npmjs.org/@ensdomains/resolver/-/resolver-0.2.4.tgz" + integrity sha512-bvaTH34PMCbv6anRa9I/0zjLJgY4EuznbEMgbV77JBCQ9KNC46rzi0avuxpOfu+xDjPEtSFGqVEOr5GlUSGudA== + "@ethereum-waffle/chai@4.0.10": version "4.0.10" - resolved "https://registry.yarnpkg.com/@ethereum-waffle/chai/-/chai-4.0.10.tgz#6f600a40b6fdaed331eba42b8625ff23f3a0e59a" + resolved "https://registry.npmjs.org/@ethereum-waffle/chai/-/chai-4.0.10.tgz" integrity sha512-X5RepE7Dn8KQLFO7HHAAe+KeGaX/by14hn90wePGBhzL54tq4Y8JscZFu+/LCwCl6TnkAAy5ebiMoqJ37sFtWw== dependencies: "@ethereum-waffle/provider" "4.0.5" @@ -56,7 +72,7 @@ "@ethereum-waffle/compiler@4.0.3": version "4.0.3" - resolved "https://registry.yarnpkg.com/@ethereum-waffle/compiler/-/compiler-4.0.3.tgz#069e2df24b879b8a7b78857bad6f8bf6ebc8a5b1" + resolved "https://registry.npmjs.org/@ethereum-waffle/compiler/-/compiler-4.0.3.tgz" integrity sha512-5x5U52tSvEVJS6dpCeXXKvRKyf8GICDwiTwUvGD3/WD+DpvgvaoHOL82XqpTSUHgV3bBq6ma5/8gKUJUIAnJCw== dependencies: "@resolver-engine/imports" "^0.3.3" @@ -69,17 +85,17 @@ "@ethereum-waffle/ens@4.0.3": version "4.0.3" - resolved "https://registry.yarnpkg.com/@ethereum-waffle/ens/-/ens-4.0.3.tgz#4a46ac926414f3c83b4e8cc2562c8e2aee06377a" + resolved "https://registry.npmjs.org/@ethereum-waffle/ens/-/ens-4.0.3.tgz" integrity sha512-PVLcdnTbaTfCrfSOrvtlA9Fih73EeDvFS28JQnT5M5P4JMplqmchhcZB1yg/fCtx4cvgHlZXa0+rOCAk2Jk0Jw== "@ethereum-waffle/mock-contract@4.0.4": version "4.0.4" - resolved "https://registry.yarnpkg.com/@ethereum-waffle/mock-contract/-/mock-contract-4.0.4.tgz#f13fea29922d87a4d2e7c4fc8fe72ea04d2c13de" + resolved "https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-4.0.4.tgz" integrity sha512-LwEj5SIuEe9/gnrXgtqIkWbk2g15imM/qcJcxpLyAkOj981tQxXmtV4XmQMZsdedEsZ/D/rbUAOtZbgwqgUwQA== "@ethereum-waffle/provider@4.0.5": version "4.0.5" - resolved "https://registry.yarnpkg.com/@ethereum-waffle/provider/-/provider-4.0.5.tgz#8a65dbf0263f4162c9209608205dee1c960e716b" + resolved "https://registry.npmjs.org/@ethereum-waffle/provider/-/provider-4.0.5.tgz" integrity sha512-40uzfyzcrPh+Gbdzv89JJTMBlZwzya1YLDyim8mVbEqYLP5VRYWoGp0JMyaizgV3hMoUFRqJKVmIUw4v7r3hYw== dependencies: "@ethereum-waffle/ens" "4.0.3" @@ -89,7 +105,7 @@ "@ethereumjs/block@^3.5.0", "@ethereumjs/block@^3.6.0", "@ethereumjs/block@^3.6.2": version "3.6.3" - resolved "https://registry.yarnpkg.com/@ethereumjs/block/-/block-3.6.3.tgz#d96cbd7af38b92ebb3424223dbf773f5ccd27f84" + resolved "https://registry.npmjs.org/@ethereumjs/block/-/block-3.6.3.tgz" integrity sha512-CegDeryc2DVKnDkg5COQrE0bJfw/p0v3GBk2W5/Dj5dOVfEmb50Ux0GLnSPypooLnfqjwFaorGuT9FokWB3GRg== dependencies: "@ethereumjs/common" "^2.6.5" @@ -99,7 +115,7 @@ "@ethereumjs/blockchain@^5.5.0": version "5.5.3" - resolved "https://registry.yarnpkg.com/@ethereumjs/blockchain/-/blockchain-5.5.3.tgz#aa49a6a04789da6b66b5bcbb0d0b98efc369f640" + resolved "https://registry.npmjs.org/@ethereumjs/blockchain/-/blockchain-5.5.3.tgz" integrity sha512-bi0wuNJ1gw4ByNCV56H0Z4Q7D+SxUbwyG12Wxzbvqc89PXLRNR20LBcSUZRKpN0+YCPo6m0XZL/JLio3B52LTw== dependencies: "@ethereumjs/block" "^3.6.2" @@ -111,17 +127,17 @@ lru-cache "^5.1.1" semaphore-async-await "^1.5.1" -"@ethereumjs/common@2.6.0": +"@ethereumjs/common@^2.6.0", "@ethereumjs/common@2.6.0": version "2.6.0" - resolved "https://registry.yarnpkg.com/@ethereumjs/common/-/common-2.6.0.tgz#feb96fb154da41ee2cc2c5df667621a440f36348" + resolved "https://registry.npmjs.org/@ethereumjs/common/-/common-2.6.0.tgz" integrity sha512-Cq2qS0FTu6O2VU1sgg+WyU9Ps0M6j/BEMHN+hRaECXCV/r0aI78u4N6p52QW/BDVhwWZpCdrvG8X7NJdzlpNUA== dependencies: crc-32 "^1.2.0" ethereumjs-util "^7.1.3" -"@ethereumjs/common@^2.6.0", "@ethereumjs/common@^2.6.4", "@ethereumjs/common@^2.6.5": +"@ethereumjs/common@^2.6.4", "@ethereumjs/common@^2.6.5": version "2.6.5" - resolved "https://registry.yarnpkg.com/@ethereumjs/common/-/common-2.6.5.tgz#0a75a22a046272579d91919cb12d84f2756e8d30" + resolved "https://registry.npmjs.org/@ethereumjs/common/-/common-2.6.5.tgz" integrity sha512-lRyVQOeCDaIVtgfbowla32pzeDv2Obr8oR8Put5RdUBNRGr1VGPGQNGP6elWIpgK3YdpzqTOh4GyUGOureVeeA== dependencies: crc-32 "^1.2.0" @@ -129,7 +145,7 @@ "@ethereumjs/ethash@^1.1.0": version "1.1.0" - resolved "https://registry.yarnpkg.com/@ethereumjs/ethash/-/ethash-1.1.0.tgz#7c5918ffcaa9cb9c1dc7d12f77ef038c11fb83fb" + resolved "https://registry.npmjs.org/@ethereumjs/ethash/-/ethash-1.1.0.tgz" integrity sha512-/U7UOKW6BzpA+Vt+kISAoeDie1vAvY4Zy2KF5JJb+So7+1yKmJeJEHOGSnQIj330e9Zyl3L5Nae6VZyh2TJnAA== dependencies: "@ethereumjs/block" "^3.5.0" @@ -138,25 +154,39 @@ ethereumjs-util "^7.1.1" miller-rabin "^4.0.0" -"@ethereumjs/tx@3.4.0": +"@ethereumjs/rlp@^4.0.1": + version "4.0.1" + resolved "https://registry.npmjs.org/@ethereumjs/rlp/-/rlp-4.0.1.tgz" + integrity sha512-tqsQiBQDQdmPWE1xkkBq4rlSW5QZpLOUJ5RJh2/9fug+q9tnUhuZoVLk7s0scUIKTOzEtR72DFBXI4WiZcMpvw== + +"@ethereumjs/tx@^3.4.0", "@ethereumjs/tx@3.4.0": version "3.4.0" - resolved "https://registry.yarnpkg.com/@ethereumjs/tx/-/tx-3.4.0.tgz#7eb1947eefa55eb9cf05b3ca116fb7a3dbd0bce7" + resolved "https://registry.npmjs.org/@ethereumjs/tx/-/tx-3.4.0.tgz" integrity sha512-WWUwg1PdjHKZZxPPo274ZuPsJCWV3SqATrEKQP1n2DrVYVP1aZIYpo/mFaA0BDoE0tIQmBeimRCEA0Lgil+yYw== dependencies: "@ethereumjs/common" "^2.6.0" ethereumjs-util "^7.1.3" -"@ethereumjs/tx@^3.4.0", "@ethereumjs/tx@^3.5.2": +"@ethereumjs/tx@^3.5.2": version "3.5.2" - resolved "https://registry.yarnpkg.com/@ethereumjs/tx/-/tx-3.5.2.tgz#197b9b6299582ad84f9527ca961466fce2296c1c" + resolved "https://registry.npmjs.org/@ethereumjs/tx/-/tx-3.5.2.tgz" integrity sha512-gQDNJWKrSDGu2w7w0PzVXVBNMzb7wwdDOmOqczmhNjqFxFuIbhVJDwiGEnxFNC2/b8ifcZzY7MLcluizohRzNw== dependencies: "@ethereumjs/common" "^2.6.4" ethereumjs-util "^7.1.5" +"@ethereumjs/util@^8.1.0": + version "8.1.0" + resolved "https://registry.npmjs.org/@ethereumjs/util/-/util-8.1.0.tgz" + integrity sha512-zQ0IqbdX8FZ9aw11vP+dZkKDkS+kgIvQPHnSAXzP9pLu+Rfu3D3XEeLbicvoXJTYnhZiPmsZUxgdzXwNKxRPbA== + dependencies: + "@ethereumjs/rlp" "^4.0.1" + ethereum-cryptography "^2.0.0" + micro-ftch "^0.3.1" + "@ethereumjs/vm@5.6.0": version "5.6.0" - resolved "https://registry.yarnpkg.com/@ethereumjs/vm/-/vm-5.6.0.tgz#e0ca62af07de820143674c30b776b86c1983a464" + resolved "https://registry.npmjs.org/@ethereumjs/vm/-/vm-5.6.0.tgz" integrity sha512-J2m/OgjjiGdWF2P9bj/4LnZQ1zRoZhY8mRNVw/N3tXliGI8ai1sI1mlDPkLpeUUM4vq54gH6n0ZlSpz8U/qlYQ== dependencies: "@ethereumjs/block" "^3.6.0" @@ -172,9 +202,9 @@ merkle-patricia-tree "^4.2.2" rustbn.js "~0.2.0" -"@ethersproject/abi@5.7.0", "@ethersproject/abi@^5.0.0-beta.146", "@ethersproject/abi@^5.0.9", "@ethersproject/abi@^5.1.2", "@ethersproject/abi@^5.7.0": +"@ethersproject/abi@^5.0.0", "@ethersproject/abi@^5.0.0-beta.146", "@ethersproject/abi@^5.0.9", "@ethersproject/abi@^5.1.2", "@ethersproject/abi@^5.4.7", "@ethersproject/abi@^5.7.0", "@ethersproject/abi@5.7.0": version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.7.0.tgz#b3f3e045bbbeed1af3947335c247ad625a44e449" + resolved "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.7.0.tgz" integrity sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA== dependencies: "@ethersproject/address" "^5.7.0" @@ -187,9 +217,9 @@ "@ethersproject/properties" "^5.7.0" "@ethersproject/strings" "^5.7.0" -"@ethersproject/abstract-provider@5.7.0", "@ethersproject/abstract-provider@^5.7.0": +"@ethersproject/abstract-provider@^5.7.0", "@ethersproject/abstract-provider@5.7.0": version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/abstract-provider/-/abstract-provider-5.7.0.tgz#b0a8550f88b6bf9d51f90e4795d48294630cb9ef" + resolved "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.7.0.tgz" integrity sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw== dependencies: "@ethersproject/bignumber" "^5.7.0" @@ -200,9 +230,9 @@ "@ethersproject/transactions" "^5.7.0" "@ethersproject/web" "^5.7.0" -"@ethersproject/abstract-signer@5.7.0", "@ethersproject/abstract-signer@^5.7.0": +"@ethersproject/abstract-signer@^5.7.0", "@ethersproject/abstract-signer@5.7.0": version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/abstract-signer/-/abstract-signer-5.7.0.tgz#13f4f32117868452191a4649723cb086d2b596b2" + resolved "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.7.0.tgz" integrity sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ== dependencies: "@ethersproject/abstract-provider" "^5.7.0" @@ -211,9 +241,9 @@ "@ethersproject/logger" "^5.7.0" "@ethersproject/properties" "^5.7.0" -"@ethersproject/address@5.7.0", "@ethersproject/address@^5.0.2", "@ethersproject/address@^5.7.0": +"@ethersproject/address@^5.0.2", "@ethersproject/address@^5.7.0", "@ethersproject/address@5.7.0": version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.7.0.tgz#19b56c4d74a3b0a46bfdbb6cfcc0a153fc697f37" + resolved "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz" integrity sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA== dependencies: "@ethersproject/bignumber" "^5.7.0" @@ -222,47 +252,47 @@ "@ethersproject/logger" "^5.7.0" "@ethersproject/rlp" "^5.7.0" -"@ethersproject/base64@5.7.0", "@ethersproject/base64@^5.7.0": +"@ethersproject/base64@^5.7.0", "@ethersproject/base64@5.7.0": version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/base64/-/base64-5.7.0.tgz#ac4ee92aa36c1628173e221d0d01f53692059e1c" + resolved "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.7.0.tgz" integrity sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ== dependencies: "@ethersproject/bytes" "^5.7.0" -"@ethersproject/basex@5.7.0", "@ethersproject/basex@^5.7.0": +"@ethersproject/basex@^5.7.0", "@ethersproject/basex@5.7.0": version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/basex/-/basex-5.7.0.tgz#97034dc7e8938a8ca943ab20f8a5e492ece4020b" + resolved "https://registry.npmjs.org/@ethersproject/basex/-/basex-5.7.0.tgz" integrity sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw== dependencies: "@ethersproject/bytes" "^5.7.0" "@ethersproject/properties" "^5.7.0" -"@ethersproject/bignumber@5.7.0", "@ethersproject/bignumber@^5.7.0": +"@ethersproject/bignumber@^5.7.0", "@ethersproject/bignumber@5.7.0": version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.7.0.tgz#e2f03837f268ba655ffba03a57853e18a18dc9c2" + resolved "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.7.0.tgz" integrity sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw== dependencies: "@ethersproject/bytes" "^5.7.0" "@ethersproject/logger" "^5.7.0" bn.js "^5.2.1" -"@ethersproject/bytes@5.7.0", "@ethersproject/bytes@^5.7.0": +"@ethersproject/bytes@^5.7.0", "@ethersproject/bytes@5.7.0": version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.7.0.tgz#a00f6ea8d7e7534d6d87f47188af1148d71f155d" + resolved "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.7.0.tgz" integrity sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A== dependencies: "@ethersproject/logger" "^5.7.0" -"@ethersproject/constants@5.7.0", "@ethersproject/constants@^5.7.0": +"@ethersproject/constants@^5.7.0", "@ethersproject/constants@5.7.0": version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.7.0.tgz#df80a9705a7e08984161f09014ea012d1c75295e" + resolved "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.7.0.tgz" integrity sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA== dependencies: "@ethersproject/bignumber" "^5.7.0" -"@ethersproject/contracts@5.7.0", "@ethersproject/contracts@^5.7.0": +"@ethersproject/contracts@^5.7.0", "@ethersproject/contracts@5.7.0": version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/contracts/-/contracts-5.7.0.tgz#c305e775abd07e48aa590e1a877ed5c316f8bd1e" + resolved "https://registry.npmjs.org/@ethersproject/contracts/-/contracts-5.7.0.tgz" integrity sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg== dependencies: "@ethersproject/abi" "^5.7.0" @@ -276,9 +306,9 @@ "@ethersproject/properties" "^5.7.0" "@ethersproject/transactions" "^5.7.0" -"@ethersproject/hash@5.7.0", "@ethersproject/hash@^5.7.0": +"@ethersproject/hash@^5.7.0", "@ethersproject/hash@5.7.0": version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/hash/-/hash-5.7.0.tgz#eb7aca84a588508369562e16e514b539ba5240a7" + resolved "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.7.0.tgz" integrity sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g== dependencies: "@ethersproject/abstract-signer" "^5.7.0" @@ -291,9 +321,9 @@ "@ethersproject/properties" "^5.7.0" "@ethersproject/strings" "^5.7.0" -"@ethersproject/hdnode@5.7.0", "@ethersproject/hdnode@^5.7.0": +"@ethersproject/hdnode@^5.7.0", "@ethersproject/hdnode@5.7.0": version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/hdnode/-/hdnode-5.7.0.tgz#e627ddc6b466bc77aebf1a6b9e47405ca5aef9cf" + resolved "https://registry.npmjs.org/@ethersproject/hdnode/-/hdnode-5.7.0.tgz" integrity sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg== dependencies: "@ethersproject/abstract-signer" "^5.7.0" @@ -309,9 +339,9 @@ "@ethersproject/transactions" "^5.7.0" "@ethersproject/wordlists" "^5.7.0" -"@ethersproject/json-wallets@5.7.0", "@ethersproject/json-wallets@^5.7.0": +"@ethersproject/json-wallets@^5.7.0", "@ethersproject/json-wallets@5.7.0": version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/json-wallets/-/json-wallets-5.7.0.tgz#5e3355287b548c32b368d91014919ebebddd5360" + resolved "https://registry.npmjs.org/@ethersproject/json-wallets/-/json-wallets-5.7.0.tgz" integrity sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g== dependencies: "@ethersproject/abstract-signer" "^5.7.0" @@ -328,44 +358,44 @@ aes-js "3.0.0" scrypt-js "3.0.1" -"@ethersproject/keccak256@5.7.0", "@ethersproject/keccak256@^5.7.0": +"@ethersproject/keccak256@^5.7.0", "@ethersproject/keccak256@5.7.0": version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.7.0.tgz#3186350c6e1cd6aba7940384ec7d6d9db01f335a" + resolved "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.7.0.tgz" integrity sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg== dependencies: "@ethersproject/bytes" "^5.7.0" js-sha3 "0.8.0" -"@ethersproject/logger@5.7.0", "@ethersproject/logger@^5.7.0": +"@ethersproject/logger@^5.7.0", "@ethersproject/logger@5.7.0": version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.7.0.tgz#6ce9ae168e74fecf287be17062b590852c311892" + resolved "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.7.0.tgz" integrity sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig== -"@ethersproject/networks@5.7.1", "@ethersproject/networks@^5.7.0": +"@ethersproject/networks@^5.7.0", "@ethersproject/networks@5.7.1": version "5.7.1" - resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.7.1.tgz#118e1a981d757d45ccea6bb58d9fd3d9db14ead6" + resolved "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.7.1.tgz" integrity sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ== dependencies: "@ethersproject/logger" "^5.7.0" -"@ethersproject/pbkdf2@5.7.0", "@ethersproject/pbkdf2@^5.7.0": +"@ethersproject/pbkdf2@^5.7.0", "@ethersproject/pbkdf2@5.7.0": version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/pbkdf2/-/pbkdf2-5.7.0.tgz#d2267d0a1f6e123f3771007338c47cccd83d3102" + resolved "https://registry.npmjs.org/@ethersproject/pbkdf2/-/pbkdf2-5.7.0.tgz" integrity sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw== dependencies: "@ethersproject/bytes" "^5.7.0" "@ethersproject/sha2" "^5.7.0" -"@ethersproject/properties@5.7.0", "@ethersproject/properties@^5.7.0": +"@ethersproject/properties@^5.7.0", "@ethersproject/properties@5.7.0": version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.7.0.tgz#a6e12cb0439b878aaf470f1902a176033067ed30" + resolved "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.7.0.tgz" integrity sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw== dependencies: "@ethersproject/logger" "^5.7.0" -"@ethersproject/providers@5.7.2", "@ethersproject/providers@^5.7.1", "@ethersproject/providers@^5.7.2": +"@ethersproject/providers@^5.0.0", "@ethersproject/providers@^5.4.7", "@ethersproject/providers@^5.7.1", "@ethersproject/providers@^5.7.2", "@ethersproject/providers@5.7.2": version "5.7.2" - resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.7.2.tgz#f8b1a4f275d7ce58cf0a2eec222269a08beb18cb" + resolved "https://registry.npmjs.org/@ethersproject/providers/-/providers-5.7.2.tgz" integrity sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg== dependencies: "@ethersproject/abstract-provider" "^5.7.0" @@ -389,34 +419,34 @@ bech32 "1.1.4" ws "7.4.6" -"@ethersproject/random@5.7.0", "@ethersproject/random@^5.7.0": +"@ethersproject/random@^5.7.0", "@ethersproject/random@5.7.0": version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/random/-/random-5.7.0.tgz#af19dcbc2484aae078bb03656ec05df66253280c" + resolved "https://registry.npmjs.org/@ethersproject/random/-/random-5.7.0.tgz" integrity sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ== dependencies: "@ethersproject/bytes" "^5.7.0" "@ethersproject/logger" "^5.7.0" -"@ethersproject/rlp@5.7.0", "@ethersproject/rlp@^5.7.0": +"@ethersproject/rlp@^5.7.0", "@ethersproject/rlp@5.7.0": version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/rlp/-/rlp-5.7.0.tgz#de39e4d5918b9d74d46de93af80b7685a9c21304" + resolved "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.7.0.tgz" integrity sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w== dependencies: "@ethersproject/bytes" "^5.7.0" "@ethersproject/logger" "^5.7.0" -"@ethersproject/sha2@5.7.0", "@ethersproject/sha2@^5.7.0": +"@ethersproject/sha2@^5.7.0", "@ethersproject/sha2@5.7.0": version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/sha2/-/sha2-5.7.0.tgz#9a5f7a7824ef784f7f7680984e593a800480c9fb" + resolved "https://registry.npmjs.org/@ethersproject/sha2/-/sha2-5.7.0.tgz" integrity sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw== dependencies: "@ethersproject/bytes" "^5.7.0" "@ethersproject/logger" "^5.7.0" hash.js "1.1.7" -"@ethersproject/signing-key@5.7.0", "@ethersproject/signing-key@^5.7.0": +"@ethersproject/signing-key@^5.7.0", "@ethersproject/signing-key@5.7.0": version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/signing-key/-/signing-key-5.7.0.tgz#06b2df39411b00bc57c7c09b01d1e41cf1b16ab3" + resolved "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.7.0.tgz" integrity sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q== dependencies: "@ethersproject/bytes" "^5.7.0" @@ -426,9 +456,9 @@ elliptic "6.5.4" hash.js "1.1.7" -"@ethersproject/solidity@5.7.0", "@ethersproject/solidity@^5.7.0": +"@ethersproject/solidity@^5.7.0", "@ethersproject/solidity@5.7.0": version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/solidity/-/solidity-5.7.0.tgz#5e9c911d8a2acce2a5ebb48a5e2e0af20b631cb8" + resolved "https://registry.npmjs.org/@ethersproject/solidity/-/solidity-5.7.0.tgz" integrity sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA== dependencies: "@ethersproject/bignumber" "^5.7.0" @@ -438,18 +468,18 @@ "@ethersproject/sha2" "^5.7.0" "@ethersproject/strings" "^5.7.0" -"@ethersproject/strings@5.7.0", "@ethersproject/strings@^5.7.0": +"@ethersproject/strings@^5.7.0", "@ethersproject/strings@5.7.0": version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.7.0.tgz#54c9d2a7c57ae8f1205c88a9d3a56471e14d5ed2" + resolved "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.7.0.tgz" integrity sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg== dependencies: "@ethersproject/bytes" "^5.7.0" "@ethersproject/constants" "^5.7.0" "@ethersproject/logger" "^5.7.0" -"@ethersproject/transactions@5.7.0", "@ethersproject/transactions@^5.7.0": +"@ethersproject/transactions@^5.7.0", "@ethersproject/transactions@5.7.0": version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.7.0.tgz#91318fc24063e057885a6af13fdb703e1f993d3b" + resolved "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.7.0.tgz" integrity sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ== dependencies: "@ethersproject/address" "^5.7.0" @@ -464,16 +494,16 @@ "@ethersproject/units@5.7.0": version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/units/-/units-5.7.0.tgz#637b563d7e14f42deeee39245275d477aae1d8b1" + resolved "https://registry.npmjs.org/@ethersproject/units/-/units-5.7.0.tgz" integrity sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg== dependencies: "@ethersproject/bignumber" "^5.7.0" "@ethersproject/constants" "^5.7.0" "@ethersproject/logger" "^5.7.0" -"@ethersproject/wallet@5.7.0", "@ethersproject/wallet@^5.7.0": +"@ethersproject/wallet@^5.7.0", "@ethersproject/wallet@5.7.0": version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/wallet/-/wallet-5.7.0.tgz#4e5d0790d96fe21d61d38fb40324e6c7ef350b2d" + resolved "https://registry.npmjs.org/@ethersproject/wallet/-/wallet-5.7.0.tgz" integrity sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA== dependencies: "@ethersproject/abstract-provider" "^5.7.0" @@ -492,9 +522,9 @@ "@ethersproject/transactions" "^5.7.0" "@ethersproject/wordlists" "^5.7.0" -"@ethersproject/web@5.7.1", "@ethersproject/web@^5.7.0": +"@ethersproject/web@^5.7.0", "@ethersproject/web@5.7.1": version "5.7.1" - resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.7.1.tgz#de1f285b373149bee5928f4eb7bcb87ee5fbb4ae" + resolved "https://registry.npmjs.org/@ethersproject/web/-/web-5.7.1.tgz" integrity sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w== dependencies: "@ethersproject/base64" "^5.7.0" @@ -503,9 +533,9 @@ "@ethersproject/properties" "^5.7.0" "@ethersproject/strings" "^5.7.0" -"@ethersproject/wordlists@5.7.0", "@ethersproject/wordlists@^5.7.0": +"@ethersproject/wordlists@^5.7.0", "@ethersproject/wordlists@5.7.0": version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/wordlists/-/wordlists-5.7.0.tgz#8fb2c07185d68c3e09eb3bfd6e779ba2774627f5" + resolved "https://registry.npmjs.org/@ethersproject/wordlists/-/wordlists-5.7.0.tgz" integrity sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA== dependencies: "@ethersproject/bytes" "^5.7.0" @@ -516,14 +546,14 @@ "@ganache/ethereum-address@0.1.4": version "0.1.4" - resolved "https://registry.yarnpkg.com/@ganache/ethereum-address/-/ethereum-address-0.1.4.tgz#0e6d66f4a24f64bf687cb3ff7358fb85b9d9005e" + resolved "https://registry.npmjs.org/@ganache/ethereum-address/-/ethereum-address-0.1.4.tgz" integrity sha512-sTkU0M9z2nZUzDeHRzzGlW724xhMLXo2LeX1hixbnjHWY1Zg1hkqORywVfl+g5uOO8ht8T0v+34IxNxAhmWlbw== dependencies: "@ganache/utils" "0.1.4" "@ganache/ethereum-options@0.1.4": version "0.1.4" - resolved "https://registry.yarnpkg.com/@ganache/ethereum-options/-/ethereum-options-0.1.4.tgz#6a559abb44225e2b8741a8f78a19a46714a71cd6" + resolved "https://registry.npmjs.org/@ganache/ethereum-options/-/ethereum-options-0.1.4.tgz" integrity sha512-i4l46taoK2yC41FPkcoDlEVoqHS52wcbHPqJtYETRWqpOaoj9hAg/EJIHLb1t6Nhva2CdTO84bG+qlzlTxjAHw== dependencies: "@ganache/ethereum-address" "0.1.4" @@ -535,7 +565,7 @@ "@ganache/ethereum-utils@0.1.4": version "0.1.4" - resolved "https://registry.yarnpkg.com/@ganache/ethereum-utils/-/ethereum-utils-0.1.4.tgz#fae4b5b9e642e751ff1fa0cd7316c92996317257" + resolved "https://registry.npmjs.org/@ganache/ethereum-utils/-/ethereum-utils-0.1.4.tgz" integrity sha512-FKXF3zcdDrIoCqovJmHLKZLrJ43234Em2sde/3urUT/10gSgnwlpFmrv2LUMAmSbX3lgZhW/aSs8krGhDevDAg== dependencies: "@ethereumjs/common" "2.6.0" @@ -550,7 +580,7 @@ "@ganache/options@0.1.4": version "0.1.4" - resolved "https://registry.yarnpkg.com/@ganache/options/-/options-0.1.4.tgz#325b07e6de85094667aaaaf3d653e32404a04b78" + resolved "https://registry.npmjs.org/@ganache/options/-/options-0.1.4.tgz" integrity sha512-zAe/craqNuPz512XQY33MOAG6Si1Xp0hCvfzkBfj2qkuPcbJCq6W/eQ5MB6SbXHrICsHrZOaelyqjuhSEmjXRw== dependencies: "@ganache/utils" "0.1.4" @@ -559,7 +589,7 @@ "@ganache/rlp@0.1.4": version "0.1.4" - resolved "https://registry.yarnpkg.com/@ganache/rlp/-/rlp-0.1.4.tgz#f4043afda83e1a14a4f80607b103daf166a9b374" + resolved "https://registry.npmjs.org/@ganache/rlp/-/rlp-0.1.4.tgz" integrity sha512-Do3D1H6JmhikB+6rHviGqkrNywou/liVeFiKIpOBLynIpvZhRCgn3SEDxyy/JovcaozTo/BynHumfs5R085MFQ== dependencies: "@ganache/utils" "0.1.4" @@ -567,7 +597,7 @@ "@ganache/utils@0.1.4": version "0.1.4" - resolved "https://registry.yarnpkg.com/@ganache/utils/-/utils-0.1.4.tgz#25d60d7689e3dda6a8a7ad70e3646f07c2c39a1f" + resolved "https://registry.npmjs.org/@ganache/utils/-/utils-0.1.4.tgz" integrity sha512-oatUueU3XuXbUbUlkyxeLLH3LzFZ4y5aSkNbx6tjSIhVTPeh+AuBKYt4eQ73FFcTB3nj/gZoslgAh5CN7O369w== dependencies: emittery "0.10.0" @@ -578,17 +608,17 @@ "@jridgewell/resolve-uri@^3.0.3": version "3.1.1" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz#c08679063f279615a3326583ba3a90d1d82cc721" + resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz" integrity sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA== "@jridgewell/sourcemap-codec@^1.4.10": version "1.4.15" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" + resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz" integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== "@jridgewell/trace-mapping@0.3.9": version "0.3.9" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" + resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz" integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== dependencies: "@jridgewell/resolve-uri" "^3.0.3" @@ -596,7 +626,7 @@ "@metamask/eth-sig-util@^4.0.0": version "4.0.1" - resolved "https://registry.yarnpkg.com/@metamask/eth-sig-util/-/eth-sig-util-4.0.1.tgz#3ad61f6ea9ad73ba5b19db780d40d9aae5157088" + resolved "https://registry.npmjs.org/@metamask/eth-sig-util/-/eth-sig-util-4.0.1.tgz" integrity sha512-tghyZKLHZjcdlDqCA3gNZmLeR0XvOE9U1qoQO9ohyAZT6Pya+H9vkBPcsyXytmYLNgVoin7CKCmweo/R43V+tQ== dependencies: ethereumjs-abi "^0.6.8" @@ -605,32 +635,44 @@ tweetnacl "^1.0.3" tweetnacl-util "^0.15.1" -"@noble/hashes@1.2.0", "@noble/hashes@~1.2.0": +"@noble/curves@~1.4.0", "@noble/curves@1.4.2": + version "1.4.2" + resolved "https://registry.npmjs.org/@noble/curves/-/curves-1.4.2.tgz" + integrity sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw== + dependencies: + "@noble/hashes" "1.4.0" + +"@noble/hashes@~1.2.0", "@noble/hashes@1.2.0": version "1.2.0" - resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.2.0.tgz#a3150eeb09cc7ab207ebf6d7b9ad311a9bdbed12" + resolved "https://registry.npmjs.org/@noble/hashes/-/hashes-1.2.0.tgz" integrity sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ== -"@noble/secp256k1@1.7.1", "@noble/secp256k1@~1.7.0": +"@noble/hashes@~1.4.0", "@noble/hashes@1.4.0": + version "1.4.0" + resolved "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz" + integrity sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg== + +"@noble/secp256k1@~1.7.0", "@noble/secp256k1@1.7.1": version "1.7.1" - resolved "https://registry.yarnpkg.com/@noble/secp256k1/-/secp256k1-1.7.1.tgz#b251c70f824ce3ca7f8dc3df08d58f005cc0507c" + resolved "https://registry.npmjs.org/@noble/secp256k1/-/secp256k1-1.7.1.tgz" integrity sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw== "@nodelib/fs.scandir@2.1.5": version "2.1.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz" integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== dependencies: "@nodelib/fs.stat" "2.0.5" run-parallel "^1.1.9" -"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": +"@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.5": version "2.0.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== "@nodelib/fs.walk@^1.2.3": version "1.2.8" - resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + resolved "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz" integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== dependencies: "@nodelib/fs.scandir" "2.1.5" @@ -638,7 +680,7 @@ "@nomicfoundation/ethereumjs-block@5.0.1": version "5.0.1" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-block/-/ethereumjs-block-5.0.1.tgz#6f89664f55febbd723195b6d0974773d29ee133d" + resolved "https://registry.npmjs.org/@nomicfoundation/ethereumjs-block/-/ethereumjs-block-5.0.1.tgz" integrity sha512-u1Yioemi6Ckj3xspygu/SfFvm8vZEO8/Yx5a1QLzi6nVU0jz3Pg2OmHKJ5w+D9Ogk1vhwRiqEBAqcb0GVhCyHw== dependencies: "@nomicfoundation/ethereumjs-common" "4.0.1" @@ -651,7 +693,7 @@ "@nomicfoundation/ethereumjs-blockchain@7.0.1": version "7.0.1" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-blockchain/-/ethereumjs-blockchain-7.0.1.tgz#80e0bd3535bfeb9baa29836b6f25123dab06a726" + resolved "https://registry.npmjs.org/@nomicfoundation/ethereumjs-blockchain/-/ethereumjs-blockchain-7.0.1.tgz" integrity sha512-NhzndlGg829XXbqJEYrF1VeZhAwSPgsK/OB7TVrdzft3y918hW5KNd7gIZ85sn6peDZOdjBsAXIpXZ38oBYE5A== dependencies: "@nomicfoundation/ethereumjs-block" "5.0.1" @@ -670,7 +712,7 @@ "@nomicfoundation/ethereumjs-common@4.0.1": version "4.0.1" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-common/-/ethereumjs-common-4.0.1.tgz#4702d82df35b07b5407583b54a45bf728e46a2f0" + resolved "https://registry.npmjs.org/@nomicfoundation/ethereumjs-common/-/ethereumjs-common-4.0.1.tgz" integrity sha512-OBErlkfp54GpeiE06brBW/TTbtbuBJV5YI5Nz/aB2evTDo+KawyEzPjBlSr84z/8MFfj8wS2wxzQX1o32cev5g== dependencies: "@nomicfoundation/ethereumjs-util" "9.0.1" @@ -678,7 +720,7 @@ "@nomicfoundation/ethereumjs-ethash@3.0.1": version "3.0.1" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-ethash/-/ethereumjs-ethash-3.0.1.tgz#65ca494d53e71e8415c9a49ef48bc921c538fc41" + resolved "https://registry.npmjs.org/@nomicfoundation/ethereumjs-ethash/-/ethereumjs-ethash-3.0.1.tgz" integrity sha512-KDjGIB5igzWOp8Ik5I6QiRH5DH+XgILlplsHR7TEuWANZA759G6krQ6o8bvj+tRUz08YygMQu/sGd9mJ1DYT8w== dependencies: "@nomicfoundation/ethereumjs-block" "5.0.1" @@ -690,7 +732,7 @@ "@nomicfoundation/ethereumjs-evm@2.0.1": version "2.0.1" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-evm/-/ethereumjs-evm-2.0.1.tgz#f35681e203363f69ce2b3d3bf9f44d4e883ca1f1" + resolved "https://registry.npmjs.org/@nomicfoundation/ethereumjs-evm/-/ethereumjs-evm-2.0.1.tgz" integrity sha512-oL8vJcnk0Bx/onl+TgQOQ1t/534GKFaEG17fZmwtPFeH8S5soiBYPCLUrvANOl4sCp9elYxIMzIiTtMtNNN8EQ== dependencies: "@ethersproject/providers" "^5.7.1" @@ -704,12 +746,12 @@ "@nomicfoundation/ethereumjs-rlp@5.0.1": version "5.0.1" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-rlp/-/ethereumjs-rlp-5.0.1.tgz#0b30c1cf77d125d390408e391c4bb5291ef43c28" + resolved "https://registry.npmjs.org/@nomicfoundation/ethereumjs-rlp/-/ethereumjs-rlp-5.0.1.tgz" integrity sha512-xtxrMGa8kP4zF5ApBQBtjlSbN5E2HI8m8FYgVSYAnO6ssUoY5pVPGy2H8+xdf/bmMa22Ce8nWMH3aEW8CcqMeQ== "@nomicfoundation/ethereumjs-statemanager@2.0.1": version "2.0.1" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-statemanager/-/ethereumjs-statemanager-2.0.1.tgz#8824a97938db4471911e2d2f140f79195def5935" + resolved "https://registry.npmjs.org/@nomicfoundation/ethereumjs-statemanager/-/ethereumjs-statemanager-2.0.1.tgz" integrity sha512-B5ApMOnlruVOR7gisBaYwFX+L/AP7i/2oAahatssjPIBVDF6wTX1K7Qpa39E/nzsH8iYuL3krkYeUFIdO3EMUQ== dependencies: "@nomicfoundation/ethereumjs-common" "4.0.1" @@ -721,7 +763,7 @@ "@nomicfoundation/ethereumjs-trie@6.0.1": version "6.0.1" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-trie/-/ethereumjs-trie-6.0.1.tgz#662c55f6b50659fd4b22ea9f806a7401cafb7717" + resolved "https://registry.npmjs.org/@nomicfoundation/ethereumjs-trie/-/ethereumjs-trie-6.0.1.tgz" integrity sha512-A64It/IMpDVODzCgxDgAAla8jNjNtsoQZIzZUfIV5AY6Coi4nvn7+VReBn5itlxMiL2yaTlQr9TRWp3CSI6VoA== dependencies: "@nomicfoundation/ethereumjs-rlp" "5.0.1" @@ -732,7 +774,7 @@ "@nomicfoundation/ethereumjs-tx@5.0.1": version "5.0.1" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-tx/-/ethereumjs-tx-5.0.1.tgz#7629dc2036b4a33c34e9f0a592b43227ef4f0c7d" + resolved "https://registry.npmjs.org/@nomicfoundation/ethereumjs-tx/-/ethereumjs-tx-5.0.1.tgz" integrity sha512-0HwxUF2u2hrsIM1fsasjXvlbDOq1ZHFV2dd1yGq8CA+MEYhaxZr8OTScpVkkxqMwBcc5y83FyPl0J9MZn3kY0w== dependencies: "@chainsafe/ssz" "^0.9.2" @@ -744,7 +786,7 @@ "@nomicfoundation/ethereumjs-util@9.0.1": version "9.0.1" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-util/-/ethereumjs-util-9.0.1.tgz#530cda8bae33f8b5020a8f199ed1d0a2ce48ec89" + resolved "https://registry.npmjs.org/@nomicfoundation/ethereumjs-util/-/ethereumjs-util-9.0.1.tgz" integrity sha512-TwbhOWQ8QoSCFhV/DDfSmyfFIHjPjFBj957219+V3jTZYZ2rf9PmDtNOeZWAE3p3vlp8xb02XGpd0v6nTUPbsA== dependencies: "@chainsafe/ssz" "^0.10.0" @@ -753,7 +795,7 @@ "@nomicfoundation/ethereumjs-vm@7.0.1": version "7.0.1" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-vm/-/ethereumjs-vm-7.0.1.tgz#7d035e0993bcad10716c8b36e61dfb87fa3ca05f" + resolved "https://registry.npmjs.org/@nomicfoundation/ethereumjs-vm/-/ethereumjs-vm-7.0.1.tgz" integrity sha512-rArhyn0jPsS/D+ApFsz3yVJMQ29+pVzNZ0VJgkzAZ+7FqXSRtThl1C1prhmlVr3YNUlfpZ69Ak+RUT4g7VoOuQ== dependencies: "@nomicfoundation/ethereumjs-block" "5.0.1" @@ -772,7 +814,7 @@ "@nomicfoundation/hardhat-chai-matchers@^1.0.6": version "1.0.6" - resolved "https://registry.yarnpkg.com/@nomicfoundation/hardhat-chai-matchers/-/hardhat-chai-matchers-1.0.6.tgz#72a2e312e1504ee5dd73fe302932736432ba96bc" + resolved "https://registry.npmjs.org/@nomicfoundation/hardhat-chai-matchers/-/hardhat-chai-matchers-1.0.6.tgz" integrity sha512-f5ZMNmabZeZegEfuxn/0kW+mm7+yV7VNDxLpMOMGXWFJ2l/Ct3QShujzDRF9cOkK9Ui/hbDeOWGZqyQALDXVCQ== dependencies: "@ethersproject/abi" "^5.1.2" @@ -783,14 +825,14 @@ "@nomicfoundation/hardhat-network-helpers@^1.0.8": version "1.0.8" - resolved "https://registry.yarnpkg.com/@nomicfoundation/hardhat-network-helpers/-/hardhat-network-helpers-1.0.8.tgz#e4fe1be93e8a65508c46d73c41fa26c7e9f84931" + resolved "https://registry.npmjs.org/@nomicfoundation/hardhat-network-helpers/-/hardhat-network-helpers-1.0.8.tgz" integrity sha512-MNqQbzUJZnCMIYvlniC3U+kcavz/PhhQSsY90tbEtUyMj/IQqsLwIRZa4ctjABh3Bz0KCh9OXUZ7Yk/d9hr45Q== dependencies: ethereumjs-util "^7.1.4" "@nomicfoundation/hardhat-verify@^1.1.1": version "1.1.1" - resolved "https://registry.yarnpkg.com/@nomicfoundation/hardhat-verify/-/hardhat-verify-1.1.1.tgz#6a433d777ce0172d1f0edf7f2d3e1df14b3ecfc1" + resolved "https://registry.npmjs.org/@nomicfoundation/hardhat-verify/-/hardhat-verify-1.1.1.tgz" integrity sha512-9QsTYD7pcZaQFEA3tBb/D/oCStYDiEVDN7Dxeo/4SCyHRSm86APypxxdOMEPlGmXsAvd+p1j/dTODcpxb8aztA== dependencies: "@ethersproject/abi" "^5.1.2" @@ -805,57 +847,12 @@ "@nomicfoundation/solidity-analyzer-darwin-arm64@0.1.1": version "0.1.1" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-darwin-arm64/-/solidity-analyzer-darwin-arm64-0.1.1.tgz#4c858096b1c17fe58a474fe81b46815f93645c15" + resolved "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-darwin-arm64/-/solidity-analyzer-darwin-arm64-0.1.1.tgz" integrity sha512-KcTodaQw8ivDZyF+D76FokN/HdpgGpfjc/gFCImdLUyqB6eSWVaZPazMbeAjmfhx3R0zm/NYVzxwAokFKgrc0w== -"@nomicfoundation/solidity-analyzer-darwin-x64@0.1.1": - version "0.1.1" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-darwin-x64/-/solidity-analyzer-darwin-x64-0.1.1.tgz#6e25ccdf6e2d22389c35553b64fe6f3fdaec432c" - integrity sha512-XhQG4BaJE6cIbjAVtzGOGbK3sn1BO9W29uhk9J8y8fZF1DYz0Doj8QDMfpMu+A6TjPDs61lbsmeYodIDnfveSA== - -"@nomicfoundation/solidity-analyzer-freebsd-x64@0.1.1": - version "0.1.1" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-freebsd-x64/-/solidity-analyzer-freebsd-x64-0.1.1.tgz#0a224ea50317139caeebcdedd435c28a039d169c" - integrity sha512-GHF1VKRdHW3G8CndkwdaeLkVBi5A9u2jwtlS7SLhBc8b5U/GcoL39Q+1CSO3hYqePNP+eV5YI7Zgm0ea6kMHoA== - -"@nomicfoundation/solidity-analyzer-linux-arm64-gnu@0.1.1": - version "0.1.1" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-arm64-gnu/-/solidity-analyzer-linux-arm64-gnu-0.1.1.tgz#dfa085d9ffab9efb2e7b383aed3f557f7687ac2b" - integrity sha512-g4Cv2fO37ZsUENQ2vwPnZc2zRenHyAxHcyBjKcjaSmmkKrFr64yvzeNO8S3GBFCo90rfochLs99wFVGT/0owpg== - -"@nomicfoundation/solidity-analyzer-linux-arm64-musl@0.1.1": - version "0.1.1" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-arm64-musl/-/solidity-analyzer-linux-arm64-musl-0.1.1.tgz#c9e06b5d513dd3ab02a7ac069c160051675889a4" - integrity sha512-WJ3CE5Oek25OGE3WwzK7oaopY8xMw9Lhb0mlYuJl/maZVo+WtP36XoQTb7bW/i8aAdHW5Z+BqrHMux23pvxG3w== - -"@nomicfoundation/solidity-analyzer-linux-x64-gnu@0.1.1": - version "0.1.1" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-x64-gnu/-/solidity-analyzer-linux-x64-gnu-0.1.1.tgz#8d328d16839e52571f72f2998c81e46bf320f893" - integrity sha512-5WN7leSr5fkUBBjE4f3wKENUy9HQStu7HmWqbtknfXkkil+eNWiBV275IOlpXku7v3uLsXTOKpnnGHJYI2qsdA== - -"@nomicfoundation/solidity-analyzer-linux-x64-musl@0.1.1": - version "0.1.1" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-x64-musl/-/solidity-analyzer-linux-x64-musl-0.1.1.tgz#9b49d0634b5976bb5ed1604a1e1b736f390959bb" - integrity sha512-KdYMkJOq0SYPQMmErv/63CwGwMm5XHenEna9X9aB8mQmhDBrYrlAOSsIPgFCUSL0hjxE3xHP65/EPXR/InD2+w== - -"@nomicfoundation/solidity-analyzer-win32-arm64-msvc@0.1.1": - version "0.1.1" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-win32-arm64-msvc/-/solidity-analyzer-win32-arm64-msvc-0.1.1.tgz#e2867af7264ebbcc3131ef837878955dd6a3676f" - integrity sha512-VFZASBfl4qiBYwW5xeY20exWhmv6ww9sWu/krWSesv3q5hA0o1JuzmPHR4LPN6SUZj5vcqci0O6JOL8BPw+APg== - -"@nomicfoundation/solidity-analyzer-win32-ia32-msvc@0.1.1": - version "0.1.1" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-win32-ia32-msvc/-/solidity-analyzer-win32-ia32-msvc-0.1.1.tgz#0685f78608dd516c8cdfb4896ed451317e559585" - integrity sha512-JnFkYuyCSA70j6Si6cS1A9Gh1aHTEb8kOTBApp/c7NRTFGNMH8eaInKlyuuiIbvYFhlXW4LicqyYuWNNq9hkpQ== - -"@nomicfoundation/solidity-analyzer-win32-x64-msvc@0.1.1": - version "0.1.1" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-win32-x64-msvc/-/solidity-analyzer-win32-x64-msvc-0.1.1.tgz#c9a44f7108646f083b82e851486e0f6aeb785836" - integrity sha512-HrVJr6+WjIXGnw3Q9u6KQcbZCtk0caVWhCdFADySvRyUxJ8PnzlaP+MhwNE8oyT8OZ6ejHBRrrgjSqDCFXGirw== - "@nomicfoundation/solidity-analyzer@^0.1.0": version "0.1.1" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer/-/solidity-analyzer-0.1.1.tgz#f5f4d36d3f66752f59a57e7208cd856f3ddf6f2d" + resolved "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer/-/solidity-analyzer-0.1.1.tgz" integrity sha512-1LMtXj1puAxyFusBgUIy5pZk3073cNXYnXUpuNKFghHbIit/xZgbk0AokpUADbNm3gyD6bFWl3LRFh3dhVdREg== optionalDependencies: "@nomicfoundation/solidity-analyzer-darwin-arm64" "0.1.1" @@ -869,14 +866,14 @@ "@nomicfoundation/solidity-analyzer-win32-ia32-msvc" "0.1.1" "@nomicfoundation/solidity-analyzer-win32-x64-msvc" "0.1.1" -"@nomiclabs/hardhat-ethers@^2.2.2": +"@nomiclabs/hardhat-ethers@^2.0.0", "@nomiclabs/hardhat-ethers@^2.2.2": version "2.2.3" - resolved "https://registry.yarnpkg.com/@nomiclabs/hardhat-ethers/-/hardhat-ethers-2.2.3.tgz#b41053e360c31a32c2640c9a45ee981a7e603fe0" + resolved "https://registry.npmjs.org/@nomiclabs/hardhat-ethers/-/hardhat-ethers-2.2.3.tgz" integrity sha512-YhzPdzb612X591FOe68q+qXVXGG2ANZRvDo0RRUtimev85rCrAlv/TLMEZw5c+kq9AbzocLTVX/h2jVIFPL9Xg== "@nomiclabs/hardhat-etherscan@^3.1.7": version "3.1.7" - resolved "https://registry.yarnpkg.com/@nomiclabs/hardhat-etherscan/-/hardhat-etherscan-3.1.7.tgz#72e3d5bd5d0ceb695e097a7f6f5ff6fcbf062b9a" + resolved "https://registry.npmjs.org/@nomiclabs/hardhat-etherscan/-/hardhat-etherscan-3.1.7.tgz" integrity sha512-tZ3TvSgpvsQ6B6OGmo1/Au6u8BrAkvs1mIC/eURA3xgIfznUZBhmpne8hv7BXUzw9xNL3fXdpOYgOQlVMTcoHQ== dependencies: "@ethersproject/abi" "^5.1.2" @@ -890,19 +887,19 @@ table "^6.8.0" undici "^5.14.0" -"@openzeppelin/contracts@^4.9.2": - version "4.9.2" - resolved "https://registry.yarnpkg.com/@openzeppelin/contracts/-/contracts-4.9.2.tgz#1cb2d5e4d3360141a17dbc45094a8cad6aac16c1" - integrity sha512-mO+y6JaqXjWeMh9glYVzVu8HYPGknAAnWyxTRhGeckOruyXQMNnlcW6w/Dx9ftLeIQk6N+ZJFuVmTwF7lEIFrg== - -"@openzeppelin/contracts@^4.9.3": +"@openzeppelin/contracts@^4.9.2", "@openzeppelin/contracts@^4.9.3": version "4.9.3" - resolved "https://registry.yarnpkg.com/@openzeppelin/contracts/-/contracts-4.9.3.tgz#00d7a8cf35a475b160b3f0293a6403c511099364" + resolved "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-4.9.3.tgz" integrity sha512-He3LieZ1pP2TNt5JbkPA4PNT9WC3gOTOlDcFGJW4Le4QKqwmiNJCRt44APfxMxvq7OugU/cqYuPcSBzOw38DAg== +"@openzeppelin/contracts@^5.0.1": + version "5.0.2" + resolved "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-5.0.2.tgz" + integrity sha512-ytPc6eLGcHHnapAZ9S+5qsdomhjo6QBHTDRRBFfTxXIpsicMhVPouPgmUPebZZZGX7vt9USA+Z+0M0dSVtSUEA== + "@resolver-engine/core@^0.3.3": version "0.3.3" - resolved "https://registry.yarnpkg.com/@resolver-engine/core/-/core-0.3.3.tgz#590f77d85d45bc7ecc4e06c654f41345db6ca967" + resolved "https://registry.npmjs.org/@resolver-engine/core/-/core-0.3.3.tgz" integrity sha512-eB8nEbKDJJBi5p5SrvrvILn4a0h42bKtbCTri3ZxCGt6UvoQyp7HnGOfki944bUjBSHKK3RvgfViHn+kqdXtnQ== dependencies: debug "^3.1.0" @@ -911,7 +908,7 @@ "@resolver-engine/fs@^0.3.3": version "0.3.3" - resolved "https://registry.yarnpkg.com/@resolver-engine/fs/-/fs-0.3.3.tgz#fbf83fa0c4f60154a82c817d2fe3f3b0c049a973" + resolved "https://registry.npmjs.org/@resolver-engine/fs/-/fs-0.3.3.tgz" integrity sha512-wQ9RhPUcny02Wm0IuJwYMyAG8fXVeKdmhm8xizNByD4ryZlx6PP6kRen+t/haF43cMfmaV7T3Cx6ChOdHEhFUQ== dependencies: "@resolver-engine/core" "^0.3.3" @@ -919,7 +916,7 @@ "@resolver-engine/imports-fs@^0.3.3": version "0.3.3" - resolved "https://registry.yarnpkg.com/@resolver-engine/imports-fs/-/imports-fs-0.3.3.tgz#4085db4b8d3c03feb7a425fbfcf5325c0d1e6c1b" + resolved "https://registry.npmjs.org/@resolver-engine/imports-fs/-/imports-fs-0.3.3.tgz" integrity sha512-7Pjg/ZAZtxpeyCFlZR5zqYkz+Wdo84ugB5LApwriT8XFeQoLwGUj4tZFFvvCuxaNCcqZzCYbonJgmGObYBzyCA== dependencies: "@resolver-engine/fs" "^0.3.3" @@ -928,7 +925,7 @@ "@resolver-engine/imports@^0.3.3": version "0.3.3" - resolved "https://registry.yarnpkg.com/@resolver-engine/imports/-/imports-0.3.3.tgz#badfb513bb3ff3c1ee9fd56073e3144245588bcc" + resolved "https://registry.npmjs.org/@resolver-engine/imports/-/imports-0.3.3.tgz" integrity sha512-anHpS4wN4sRMwsAbMXhMfOD/y4a4Oo0Cw/5+rue7hSwGWsDOQaAU1ClK1OxjUC35/peazxEl8JaSRRS+Xb8t3Q== dependencies: "@resolver-engine/core" "^0.3.3" @@ -937,31 +934,48 @@ path-browserify "^1.0.0" url "^0.11.0" -"@scure/base@~1.1.0": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@scure/base/-/base-1.1.1.tgz#ebb651ee52ff84f420097055f4bf46cfba403938" - integrity sha512-ZxOhsSyxYwLJj3pLZCefNitxsj093tb2vq90mp2txoYeBqbcjDjqFhyM8eUjq/uFm6zJ+mUuqxlS2FkuSY1MTA== +"@scure/base@~1.1.0", "@scure/base@~1.1.6": + version "1.1.7" + resolved "https://registry.npmjs.org/@scure/base/-/base-1.1.7.tgz" + integrity sha512-PPNYBslrLNNUQ/Yad37MHYsNQtK67EhWb6WtSvNLLPo7SdVZgkUjD6Dg+5On7zNwmskf8OX7I7Nx5oN+MIWE0g== "@scure/bip32@1.1.5": version "1.1.5" - resolved "https://registry.yarnpkg.com/@scure/bip32/-/bip32-1.1.5.tgz#d2ccae16dcc2e75bc1d75f5ef3c66a338d1ba300" + resolved "https://registry.npmjs.org/@scure/bip32/-/bip32-1.1.5.tgz" integrity sha512-XyNh1rB0SkEqd3tXcXMi+Xe1fvg+kUIcoRIEujP1Jgv7DqW2r9lg3Ah0NkFaCs9sTkQAQA8kw7xiRXzENi9Rtw== dependencies: "@noble/hashes" "~1.2.0" "@noble/secp256k1" "~1.7.0" "@scure/base" "~1.1.0" +"@scure/bip32@1.4.0": + version "1.4.0" + resolved "https://registry.npmjs.org/@scure/bip32/-/bip32-1.4.0.tgz" + integrity sha512-sVUpc0Vq3tXCkDGYVWGIZTRfnvu8LoTDaev7vbwh0omSvVORONr960MQWdKqJDCReIEmTj3PAr73O3aoxz7OPg== + dependencies: + "@noble/curves" "~1.4.0" + "@noble/hashes" "~1.4.0" + "@scure/base" "~1.1.6" + "@scure/bip39@1.1.1": version "1.1.1" - resolved "https://registry.yarnpkg.com/@scure/bip39/-/bip39-1.1.1.tgz#b54557b2e86214319405db819c4b6a370cf340c5" + resolved "https://registry.npmjs.org/@scure/bip39/-/bip39-1.1.1.tgz" integrity sha512-t+wDck2rVkh65Hmv280fYdVdY25J9YeEUIgn2LG1WM6gxFkGzcksoDiUkWVpVp3Oex9xGC68JU2dSbUfwZ2jPg== dependencies: "@noble/hashes" "~1.2.0" "@scure/base" "~1.1.0" +"@scure/bip39@1.3.0": + version "1.3.0" + resolved "https://registry.npmjs.org/@scure/bip39/-/bip39-1.3.0.tgz" + integrity sha512-disdg7gHuTDZtY+ZdkmLpPCk7fxZSu3gBiEGuoC1XYxv9cGx3Z6cpTggCgW6odSOOIXCiDjuGejW+aJKCY/pIQ== + dependencies: + "@noble/hashes" "~1.4.0" + "@scure/base" "~1.1.6" + "@sentry/core@5.30.0": version "5.30.0" - resolved "https://registry.yarnpkg.com/@sentry/core/-/core-5.30.0.tgz#6b203664f69e75106ee8b5a2fe1d717379b331f3" + resolved "https://registry.npmjs.org/@sentry/core/-/core-5.30.0.tgz" integrity sha512-TmfrII8w1PQZSZgPpUESqjB+jC6MvZJZdLtE/0hZ+SrnKhW3x5WlYLvTXZpcWePYBku7rl2wn1RZu6uT0qCTeg== dependencies: "@sentry/hub" "5.30.0" @@ -972,7 +986,7 @@ "@sentry/hub@5.30.0": version "5.30.0" - resolved "https://registry.yarnpkg.com/@sentry/hub/-/hub-5.30.0.tgz#2453be9b9cb903404366e198bd30c7ca74cdc100" + resolved "https://registry.npmjs.org/@sentry/hub/-/hub-5.30.0.tgz" integrity sha512-2tYrGnzb1gKz2EkMDQcfLrDTvmGcQPuWxLnJKXJvYTQDGLlEvi2tWz1VIHjunmOvJrB5aIQLhm+dcMRwFZDCqQ== dependencies: "@sentry/types" "5.30.0" @@ -981,7 +995,7 @@ "@sentry/minimal@5.30.0": version "5.30.0" - resolved "https://registry.yarnpkg.com/@sentry/minimal/-/minimal-5.30.0.tgz#ce3d3a6a273428e0084adcb800bc12e72d34637b" + resolved "https://registry.npmjs.org/@sentry/minimal/-/minimal-5.30.0.tgz" integrity sha512-BwWb/owZKtkDX+Sc4zCSTNcvZUq7YcH3uAVlmh/gtR9rmUvbzAA3ewLuB3myi4wWRAMEtny6+J/FN/x+2wn9Xw== dependencies: "@sentry/hub" "5.30.0" @@ -990,7 +1004,7 @@ "@sentry/node@^5.18.1": version "5.30.0" - resolved "https://registry.yarnpkg.com/@sentry/node/-/node-5.30.0.tgz#4ca479e799b1021285d7fe12ac0858951c11cd48" + resolved "https://registry.npmjs.org/@sentry/node/-/node-5.30.0.tgz" integrity sha512-Br5oyVBF0fZo6ZS9bxbJZG4ApAjRqAnqFFurMVJJdunNb80brh7a5Qva2kjhm+U6r9NJAB5OmDyPkA1Qnt+QVg== dependencies: "@sentry/core" "5.30.0" @@ -1005,7 +1019,7 @@ "@sentry/tracing@5.30.0": version "5.30.0" - resolved "https://registry.yarnpkg.com/@sentry/tracing/-/tracing-5.30.0.tgz#501d21f00c3f3be7f7635d8710da70d9419d4e1f" + resolved "https://registry.npmjs.org/@sentry/tracing/-/tracing-5.30.0.tgz" integrity sha512-dUFowCr0AIMwiLD7Fs314Mdzcug+gBVo/+NCMyDw8tFxJkwWAKl7Qa2OZxLQ0ZHjakcj1hNKfCQJ9rhyfOl4Aw== dependencies: "@sentry/hub" "5.30.0" @@ -1016,12 +1030,12 @@ "@sentry/types@5.30.0": version "5.30.0" - resolved "https://registry.yarnpkg.com/@sentry/types/-/types-5.30.0.tgz#19709bbe12a1a0115bc790b8942917da5636f402" + resolved "https://registry.npmjs.org/@sentry/types/-/types-5.30.0.tgz" integrity sha512-R8xOqlSTZ+htqrfteCWU5Nk0CDN5ApUTvrlvBuiH1DyP6czDZ4ktbZB0hAgBlVcK0U+qpD3ag3Tqqpa5Q67rPw== "@sentry/utils@5.30.0": version "5.30.0" - resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-5.30.0.tgz#9a5bd7ccff85ccfe7856d493bffa64cabc41e980" + resolved "https://registry.npmjs.org/@sentry/utils/-/utils-5.30.0.tgz" integrity sha512-zaYmoH0NWWtvnJjC9/CBseXMtKHm/tm40sz3YfJRxeQjyzRqNQPgivpd9R/oDJCYj999mzdW382p/qi2ypjLww== dependencies: "@sentry/types" "5.30.0" @@ -1029,55 +1043,55 @@ "@solidity-parser/parser@^0.14.0": version "0.14.5" - resolved "https://registry.yarnpkg.com/@solidity-parser/parser/-/parser-0.14.5.tgz#87bc3cc7b068e08195c219c91cd8ddff5ef1a804" + resolved "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.14.5.tgz" integrity sha512-6dKnHZn7fg/iQATVEzqyUOyEidbn05q7YA2mQ9hC0MMXhhV3/JrsxmFSYZAcr7j1yUP700LLhTruvJ3MiQmjJg== dependencies: antlr4ts "^0.5.0-alpha.4" "@solidity-parser/parser@^0.16.0": version "0.16.1" - resolved "https://registry.yarnpkg.com/@solidity-parser/parser/-/parser-0.16.1.tgz#f7c8a686974e1536da0105466c4db6727311253c" + resolved "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.16.1.tgz" integrity sha512-PdhRFNhbTtu3x8Axm0uYpqOy/lODYQK+MlYSgqIsq2L8SFYEHJPHNUiOTAJbDGzNjjr1/n9AcIayxafR/fWmYw== dependencies: antlr4ts "^0.5.0-alpha.4" "@trufflesuite/bigint-buffer@1.1.10": version "1.1.10" - resolved "https://registry.yarnpkg.com/@trufflesuite/bigint-buffer/-/bigint-buffer-1.1.10.tgz#a1d9ca22d3cad1a138b78baaf15543637a3e1692" + resolved "https://registry.npmjs.org/@trufflesuite/bigint-buffer/-/bigint-buffer-1.1.10.tgz" integrity sha512-pYIQC5EcMmID74t26GCC67946mgTJFiLXOT/BYozgrd4UEY2JHEGLhWi9cMiQCt5BSqFEvKkCHNnoj82SRjiEw== dependencies: node-gyp-build "4.4.0" "@trufflesuite/bigint-buffer@1.1.9": version "1.1.9" - resolved "https://registry.yarnpkg.com/@trufflesuite/bigint-buffer/-/bigint-buffer-1.1.9.tgz#e2604d76e1e4747b74376d68f1312f9944d0d75d" + resolved "https://registry.npmjs.org/@trufflesuite/bigint-buffer/-/bigint-buffer-1.1.9.tgz" integrity sha512-bdM5cEGCOhDSwminryHJbRmXc1x7dPKg6Pqns3qyTwFlxsqUgxE29lsERS3PlIW1HTjoIGMUqsk1zQQwST1Yxw== dependencies: node-gyp-build "4.3.0" "@tsconfig/node10@^1.0.7": version "1.0.9" - resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.9.tgz#df4907fc07a886922637b15e02d4cebc4c0021b2" + resolved "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz" integrity sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA== "@tsconfig/node12@^1.0.7": version "1.0.11" - resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.11.tgz#ee3def1f27d9ed66dac6e46a295cffb0152e058d" + resolved "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz" integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== "@tsconfig/node14@^1.0.0": version "1.0.3" - resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.3.tgz#e4386316284f00b98435bf40f72f75a09dabf6c1" + resolved "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz" integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== "@tsconfig/node16@^1.0.2": version "1.0.4" - resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.4.tgz#0b92dcc0cc1c81f6f306a381f28e31b1a56536e9" + resolved "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz" integrity sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA== -"@typechain/ethers-v5@^10.0.0", "@typechain/ethers-v5@^10.2.0": +"@typechain/ethers-v5@^10.0.0", "@typechain/ethers-v5@^10.2.0", "@typechain/ethers-v5@^10.2.1": version "10.2.1" - resolved "https://registry.yarnpkg.com/@typechain/ethers-v5/-/ethers-v5-10.2.1.tgz#50241e6957683281ecfa03fb5a6724d8a3ce2391" + resolved "https://registry.npmjs.org/@typechain/ethers-v5/-/ethers-v5-10.2.1.tgz" integrity sha512-n3tQmCZjRE6IU4h6lqUGiQ1j866n5MTCBJreNEHHVWXa2u9GJTaeYyU1/k+1qLutkyw+sS6VAN+AbeiTqsxd/A== dependencies: lodash "^4.17.15" @@ -1085,59 +1099,59 @@ "@typechain/hardhat@^6.1.5": version "6.1.6" - resolved "https://registry.yarnpkg.com/@typechain/hardhat/-/hardhat-6.1.6.tgz#1a749eb35e5054c80df531cf440819cb347c62ea" + resolved "https://registry.npmjs.org/@typechain/hardhat/-/hardhat-6.1.6.tgz" integrity sha512-BiVnegSs+ZHVymyidtK472syodx1sXYlYJJixZfRstHVGYTi8V1O7QG4nsjyb0PC/LORcq7sfBUcHto1y6UgJA== dependencies: fs-extra "^9.1.0" "@types/abstract-leveldown@*": version "7.2.1" - resolved "https://registry.yarnpkg.com/@types/abstract-leveldown/-/abstract-leveldown-7.2.1.tgz#bb16403c17754b0c4d5772d71d03b924a03d4c80" + resolved "https://registry.npmjs.org/@types/abstract-leveldown/-/abstract-leveldown-7.2.1.tgz" integrity sha512-YK8irIC+eMrrmtGx0H4ISn9GgzLd9dojZWJaMbjp1YHLl2VqqNFBNrL5Q3KjGf4VE3sf/4hmq6EhQZ7kZp1NoQ== "@types/bn.js@^4.11.3": version "4.11.6" - resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-4.11.6.tgz#c306c70d9358aaea33cd4eda092a742b9505967c" + resolved "https://registry.npmjs.org/@types/bn.js/-/bn.js-4.11.6.tgz" integrity sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg== dependencies: "@types/node" "*" "@types/bn.js@^5.1.0": version "5.1.1" - resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-5.1.1.tgz#b51e1b55920a4ca26e9285ff79936bbdec910682" + resolved "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.1.tgz" integrity sha512-qNrYbZqMx0uJAfKnKclPh+dTwK33KfLHYqtyODwd5HnXOjnkhc4qgn3BrK6RWyGZm5+sIFE7Q7Vz6QQtJB7w7g== dependencies: "@types/node" "*" "@types/chai-as-promised@^7.1.3": version "7.1.5" - resolved "https://registry.yarnpkg.com/@types/chai-as-promised/-/chai-as-promised-7.1.5.tgz#6e016811f6c7a64f2eed823191c3a6955094e255" + resolved "https://registry.npmjs.org/@types/chai-as-promised/-/chai-as-promised-7.1.5.tgz" integrity sha512-jStwss93SITGBwt/niYrkf2C+/1KTeZCZl1LaeezTlqppAKeoQC7jxyqYuP72sxBGKCIbw7oHgbYssIRzT5FCQ== dependencies: "@types/chai" "*" "@types/chai@*", "@types/chai@^4.2.0": version "4.3.5" - resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.3.5.tgz#ae69bcbb1bebb68c4ac0b11e9d8ed04526b3562b" + resolved "https://registry.npmjs.org/@types/chai/-/chai-4.3.5.tgz" integrity sha512-mEo1sAde+UCE6b2hxn332f1g1E8WfYRu6p5SvTKr2ZKC1f7gFJXk4h5PyGP9Dt6gCaG8y8XhwnXWC6Iy2cmBng== "@types/concat-stream@^1.6.0": version "1.6.1" - resolved "https://registry.yarnpkg.com/@types/concat-stream/-/concat-stream-1.6.1.tgz#24bcfc101ecf68e886aaedce60dfd74b632a1b74" + resolved "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-1.6.1.tgz" integrity sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA== dependencies: "@types/node" "*" "@types/form-data@0.0.33": version "0.0.33" - resolved "https://registry.yarnpkg.com/@types/form-data/-/form-data-0.0.33.tgz#c9ac85b2a5fd18435b8c85d9ecb50e6d6c893ff8" + resolved "https://registry.npmjs.org/@types/form-data/-/form-data-0.0.33.tgz" integrity sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw== dependencies: "@types/node" "*" "@types/glob@^7.1.1": version "7.2.0" - resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.2.0.tgz#bc1b5bf3aa92f25bd5dd39f35c57361bdce5b2eb" + resolved "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz" integrity sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA== dependencies: "@types/minimatch" "*" @@ -1145,43 +1159,48 @@ "@types/level-errors@*": version "3.0.0" - resolved "https://registry.yarnpkg.com/@types/level-errors/-/level-errors-3.0.0.tgz#15c1f4915a5ef763b51651b15e90f6dc081b96a8" + resolved "https://registry.npmjs.org/@types/level-errors/-/level-errors-3.0.0.tgz" integrity sha512-/lMtoq/Cf/2DVOm6zE6ORyOM+3ZVm/BvzEZVxUhf6bgh8ZHglXlBqxbxSlJeVp8FCbD3IVvk/VbsaNmDjrQvqQ== "@types/levelup@^4.3.0": version "4.3.3" - resolved "https://registry.yarnpkg.com/@types/levelup/-/levelup-4.3.3.tgz#4dc2b77db079b1cf855562ad52321aa4241b8ef4" + resolved "https://registry.npmjs.org/@types/levelup/-/levelup-4.3.3.tgz" integrity sha512-K+OTIjJcZHVlZQN1HmU64VtrC0jC3dXWQozuEIR9zVvltIk90zaGPM2AgT+fIkChpzHhFE3YnvFLCbLtzAmexA== dependencies: "@types/abstract-leveldown" "*" "@types/level-errors" "*" "@types/node" "*" -"@types/lru-cache@5.1.1", "@types/lru-cache@^5.1.0": +"@types/lru-cache@^5.1.0": + version "5.1.1" + resolved "https://registry.npmjs.org/@types/lru-cache/-/lru-cache-5.1.1.tgz" + integrity sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw== + +"@types/lru-cache@5.1.1": version "5.1.1" - resolved "https://registry.yarnpkg.com/@types/lru-cache/-/lru-cache-5.1.1.tgz#c48c2e27b65d2a153b19bfc1a317e30872e01eef" + resolved "https://registry.npmjs.org/@types/lru-cache/-/lru-cache-5.1.1.tgz" integrity sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw== "@types/minimatch@*": version "5.1.2" - resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-5.1.2.tgz#07508b45797cb81ec3f273011b054cd0755eddca" + resolved "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz" integrity sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA== "@types/mkdirp@^0.5.2": version "0.5.2" - resolved "https://registry.yarnpkg.com/@types/mkdirp/-/mkdirp-0.5.2.tgz#503aacfe5cc2703d5484326b1b27efa67a339c1f" + resolved "https://registry.npmjs.org/@types/mkdirp/-/mkdirp-0.5.2.tgz" integrity sha512-U5icWpv7YnZYGsN4/cmh3WD2onMY0aJIiTE6+51TwJCttdHvtCYmkBNOobHlXwrJRL0nkH9jH4kD+1FAdMN4Tg== dependencies: "@types/node" "*" "@types/mocha@>=9.1.0": version "10.0.1" - resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-10.0.1.tgz#2f4f65bb08bc368ac39c96da7b2f09140b26851b" + resolved "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.1.tgz" integrity sha512-/fvYntiO1GeICvqbQ3doGDIP97vWmvFt83GKguJ6prmQM2iXZfFcq6YE8KteFyRtX2/h5Hf91BYvPodJKFYv5Q== "@types/node-fetch@^2.6.1": version "2.6.4" - resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.6.4.tgz#1bc3a26de814f6bf466b25aeb1473fa1afe6a660" + resolved "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.4.tgz" integrity sha512-1ZX9fcN4Rvkvgv4E6PAY5WXUFWFcRWxZa3EW83UjycOB9ljJCedb2CupIP4RZMEwF/M3eTcCihbBRgwtGbg5Rg== dependencies: "@types/node" "*" @@ -1189,44 +1208,44 @@ "@types/node@*", "@types/node@>=12.0.0": version "20.3.1" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.3.1.tgz#e8a83f1aa8b649377bb1fb5d7bac5cb90e784dfe" + resolved "https://registry.npmjs.org/@types/node/-/node-20.3.1.tgz" integrity sha512-EhcH/wvidPy1WeML3TtYFGR83UzjxeWRen9V402T8aUGYsCHOmfoisV3ZSg03gAFIbLq8TnWOJ0f4cALtnSEUg== -"@types/node@11.11.6": - version "11.11.6" - resolved "https://registry.yarnpkg.com/@types/node/-/node-11.11.6.tgz#df929d1bb2eee5afdda598a41930fe50b43eaa6a" - integrity sha512-Exw4yUWMBXM3X+8oqzJNRqZSwUAaS4+7NdvHqQuFi/d+synz++xmX3QIf+BFqneW8N31R8Ky+sikfZUXq07ggQ== - "@types/node@^10.0.3": version "10.17.60" - resolved "https://registry.yarnpkg.com/@types/node/-/node-10.17.60.tgz#35f3d6213daed95da7f0f73e75bcc6980e90597b" + resolved "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz" integrity sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw== "@types/node@^8.0.0": version "8.10.66" - resolved "https://registry.yarnpkg.com/@types/node/-/node-8.10.66.tgz#dd035d409df322acc83dff62a602f12a5783bbb3" + resolved "https://registry.npmjs.org/@types/node/-/node-8.10.66.tgz" integrity sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw== +"@types/node@11.11.6": + version "11.11.6" + resolved "https://registry.npmjs.org/@types/node/-/node-11.11.6.tgz" + integrity sha512-Exw4yUWMBXM3X+8oqzJNRqZSwUAaS4+7NdvHqQuFi/d+synz++xmX3QIf+BFqneW8N31R8Ky+sikfZUXq07ggQ== + "@types/pbkdf2@^3.0.0": version "3.1.0" - resolved "https://registry.yarnpkg.com/@types/pbkdf2/-/pbkdf2-3.1.0.tgz#039a0e9b67da0cdc4ee5dab865caa6b267bb66b1" + resolved "https://registry.npmjs.org/@types/pbkdf2/-/pbkdf2-3.1.0.tgz" integrity sha512-Cf63Rv7jCQ0LaL8tNXmEyqTHuIJxRdlS5vMh1mj5voN4+QFhVZnlZruezqpWYDiJ8UTzhP0VmeLXCmBk66YrMQ== dependencies: "@types/node" "*" "@types/prettier@^2.1.1": version "2.7.3" - resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.7.3.tgz#3e51a17e291d01d17d3fc61422015a933af7a08f" + resolved "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.3.tgz" integrity sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA== "@types/qs@^6.2.31", "@types/qs@^6.9.7": version "6.9.7" - resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.7.tgz#63bb7d067db107cc1e457c303bc25d511febf6cb" + resolved "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz" integrity sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw== "@types/readable-stream@^2.3.13": version "2.3.15" - resolved "https://registry.yarnpkg.com/@types/readable-stream/-/readable-stream-2.3.15.tgz#3d79c9ceb1b6a57d5f6e6976f489b9b5384321ae" + resolved "https://registry.npmjs.org/@types/readable-stream/-/readable-stream-2.3.15.tgz" integrity sha512-oM5JSKQCcICF1wvGgmecmHldZ48OZamtMxcGGVICOJA8o8cahXC1zEVAif8iwoc5j8etxFaRFnf095+CDsuoFQ== dependencies: "@types/node" "*" @@ -1234,43 +1253,38 @@ "@types/secp256k1@^4.0.1": version "4.0.3" - resolved "https://registry.yarnpkg.com/@types/secp256k1/-/secp256k1-4.0.3.tgz#1b8e55d8e00f08ee7220b4d59a6abe89c37a901c" + resolved "https://registry.npmjs.org/@types/secp256k1/-/secp256k1-4.0.3.tgz" integrity sha512-Da66lEIFeIz9ltsdMZcpQvmrmmoqrfju8pm1BH8WbYjZSwUgCwXLb9C+9XYogwBITnbsSaMdVPb2ekf7TV+03w== dependencies: "@types/node" "*" "@types/seedrandom@3.0.1": version "3.0.1" - resolved "https://registry.yarnpkg.com/@types/seedrandom/-/seedrandom-3.0.1.tgz#1254750a4fec4aff2ebec088ccd0bb02e91fedb4" + resolved "https://registry.npmjs.org/@types/seedrandom/-/seedrandom-3.0.1.tgz" integrity sha512-giB9gzDeiCeloIXDgzFBCgjj1k4WxcDrZtGl6h1IqmUPlxF+Nx8Ve+96QCyDZ/HseB/uvDsKbpib9hU5cU53pw== "@zk-email/contracts@^3.2.0": version "3.2.0" - resolved "https://registry.yarnpkg.com/@zk-email/contracts/-/contracts-3.2.0.tgz#85a9bbb77ae3fc65e09f8f54c3ddf2f70a85bc46" + resolved "https://registry.npmjs.org/@zk-email/contracts/-/contracts-3.2.0.tgz" integrity sha512-ii9BOu39PPbwW3wPt/epaaXp3Ys9Tlhg50i+11Y9lbuiJq9h81iyLLt9Y5mpKyBQj0NiBvGrHAIVjB1sTitV2Q== dependencies: "@openzeppelin/contracts" "^4.9.3" -abbrev@1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" - integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== - -abbrev@1.0.x: +abbrev@1, abbrev@1.0.x: version "1.0.9" - resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.0.9.tgz#91b4792588a7738c25f35dd6f63752a2f8776135" + resolved "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz" integrity sha512-LEyx4aLEC3x6T0UguF6YILf+ntvmOaWsVfENmIW0E9H09vKlLDGelMjjSm0jkDHALj8A8quZ/HapKNigzwge+Q== abort-controller@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392" + resolved "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz" integrity sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg== dependencies: event-target-shim "^5.0.0" abstract-level@^1.0.0, abstract-level@^1.0.2, abstract-level@^1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/abstract-level/-/abstract-level-1.0.3.tgz#78a67d3d84da55ee15201486ab44c09560070741" + resolved "https://registry.npmjs.org/abstract-level/-/abstract-level-1.0.3.tgz" integrity sha512-t6jv+xHy+VYwc4xqZMn2Pa9DjcdzvzZmQGRjTFc8spIbRGHgBrEKbPq+rYXc7CCo0lxgYvSgKVg9qZAhpVQSjA== dependencies: buffer "^6.0.3" @@ -1283,7 +1297,7 @@ abstract-level@^1.0.0, abstract-level@^1.0.2, abstract-level@^1.0.3: abstract-leveldown@^6.2.1: version "6.3.0" - resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-6.3.0.tgz#d25221d1e6612f820c35963ba4bd739928f6026a" + resolved "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-6.3.0.tgz" integrity sha512-TU5nlYgta8YrBMNpc9FwQzRbiXsj49gsALsXadbGHt9CROPzX5fB0rWDR5mtdpOOKa5XqRFpbj1QroPAoPzVjQ== dependencies: buffer "^5.5.0" @@ -1294,7 +1308,7 @@ abstract-leveldown@^6.2.1: abstract-leveldown@^7.2.0: version "7.2.0" - resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-7.2.0.tgz#08d19d4e26fb5be426f7a57004851b39e1795a2e" + resolved "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-7.2.0.tgz" integrity sha512-DnhQwcFEaYsvYDnACLZhMmCWd3rkOeEvglpa4q5i/5Jlm3UIsWaxVzuXvDLFCSCWRO3yy2/+V/G7FusFgejnfQ== dependencies: buffer "^6.0.3" @@ -1306,7 +1320,7 @@ abstract-leveldown@^7.2.0: abstract-leveldown@~6.2.1: version "6.2.3" - resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-6.2.3.tgz#036543d87e3710f2528e47040bc3261b77a9a8eb" + resolved "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-6.2.3.tgz" integrity sha512-BsLm5vFMRUrrLeCcRc+G0t2qOaTzpoJQLOubq2XM72eNpjF5UdU5o/5NvlNhx95XHcAvcl8OMXr4mlg/fRgUXQ== dependencies: buffer "^5.5.0" @@ -1317,39 +1331,39 @@ abstract-leveldown@~6.2.1: acorn-walk@^8.1.1: version "8.2.0" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" + resolved "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz" integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== acorn@^8.4.1: version "8.9.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.9.0.tgz#78a16e3b2bcc198c10822786fa6679e245db5b59" + resolved "https://registry.npmjs.org/acorn/-/acorn-8.9.0.tgz" integrity sha512-jaVNAFBHNLXspO543WnNNPZFRtavh3skAkITqD0/2aeMkKZTN+254PyhwxFYrk3vQ1xfY+2wbesJMs/JC8/PwQ== address@^1.0.1: version "1.2.2" - resolved "https://registry.yarnpkg.com/address/-/address-1.2.2.tgz#2b5248dac5485a6390532c6a517fda2e3faac89e" + resolved "https://registry.npmjs.org/address/-/address-1.2.2.tgz" integrity sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA== adm-zip@^0.4.16: version "0.4.16" - resolved "https://registry.yarnpkg.com/adm-zip/-/adm-zip-0.4.16.tgz#cf4c508fdffab02c269cbc7f471a875f05570365" + resolved "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.16.tgz" integrity sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg== aes-js@3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/aes-js/-/aes-js-3.0.0.tgz#e21df10ad6c2053295bcbb8dab40b09dbea87e4d" + resolved "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz" integrity sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw== agent-base@6: version "6.0.2" - resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" + resolved "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz" integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== dependencies: debug "4" aggregate-error@^3.0.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" + resolved "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz" integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== dependencies: clean-stack "^2.0.0" @@ -1357,7 +1371,7 @@ aggregate-error@^3.0.0: ajv@^6.12.3: version "6.12.6" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== dependencies: fast-deep-equal "^3.1.1" @@ -1367,7 +1381,7 @@ ajv@^6.12.3: ajv@^8.0.1: version "8.12.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.12.0.tgz#d1a0527323e22f53562c567c00991577dfbe19d1" + resolved "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz" integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== dependencies: fast-deep-equal "^3.1.1" @@ -1377,68 +1391,80 @@ ajv@^8.0.1: amdefine@>=0.0.4: version "1.0.1" - resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" + resolved "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz" integrity sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg== +ansi-colors@^4.1.1: + version "4.1.3" + resolved "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz" + integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== + ansi-colors@3.2.3: version "3.2.3" - resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.3.tgz#57d35b8686e851e2cc04c403f1c00203976a1813" + resolved "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz" integrity sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw== ansi-colors@4.1.1: version "4.1.1" - resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" + resolved "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz" integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== -ansi-colors@^4.1.1: - version "4.1.3" - resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b" - integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== - ansi-escapes@^4.3.0: version "4.3.2" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" + resolved "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz" integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== dependencies: type-fest "^0.21.3" +ansi-regex@^2.0.0: + version "2.1.1" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz" + integrity sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA== + ansi-regex@^3.0.0: version "3.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.1.tgz#123d6479e92ad45ad897d4054e3c7ca7db4944e1" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz" integrity sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw== ansi-regex@^4.1.0: version "4.1.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.1.tgz#164daac87ab2d6f6db3a29875e2d1766582dabed" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz" integrity sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g== ansi-regex@^5.0.1: version "5.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== ansi-styles@^3.2.0, ansi-styles@^3.2.1: version "3.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz" integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== dependencies: color-convert "^1.9.0" -ansi-styles@^4.0.0, ansi-styles@^4.1.0: +ansi-styles@^4.0.0: + version "4.3.0" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +ansi-styles@^4.1.0: version "4.3.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== dependencies: color-convert "^2.0.1" antlr4ts@^0.5.0-alpha.4: version "0.5.0-alpha.4" - resolved "https://registry.yarnpkg.com/antlr4ts/-/antlr4ts-0.5.0-alpha.4.tgz#71702865a87478ed0b40c0709f422cf14d51652a" + resolved "https://registry.npmjs.org/antlr4ts/-/antlr4ts-0.5.0-alpha.4.tgz" integrity sha512-WPQDt1B74OfPv/IMS2ekXAKkTZIHl88uMetg6q3OTqgFxZ/dxDXI0EWLyZid/1Pe6hTftyg5N7gel5wNAGxXyQ== anymatch@~3.1.1, anymatch@~3.1.2: version "3.1.3" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz" integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== dependencies: normalize-path "^3.0.0" @@ -1446,34 +1472,39 @@ anymatch@~3.1.1, anymatch@~3.1.2: arg@^4.1.0: version "4.1.3" - resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" + resolved "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz" integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== argparse@^1.0.7: version "1.0.10" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + resolved "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz" integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== dependencies: sprintf-js "~1.0.2" argparse@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== array-back@^3.0.1, array-back@^3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/array-back/-/array-back-3.1.0.tgz#b8859d7a508871c9a7b2cf42f99428f65e96bfb0" + resolved "https://registry.npmjs.org/array-back/-/array-back-3.1.0.tgz" integrity sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q== -array-back@^4.0.1, array-back@^4.0.2: +array-back@^4.0.1: + version "4.0.2" + resolved "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz" + integrity sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg== + +array-back@^4.0.2: version "4.0.2" - resolved "https://registry.yarnpkg.com/array-back/-/array-back-4.0.2.tgz#8004e999a6274586beeb27342168652fdb89fa1e" + resolved "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz" integrity sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg== array-buffer-byte-length@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz#fabe8bc193fea865f317fe7807085ee0dee5aead" + resolved "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz" integrity sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A== dependencies: call-bind "^1.0.2" @@ -1481,17 +1512,17 @@ array-buffer-byte-length@^1.0.0: array-union@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" + resolved "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz" integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== array-uniq@1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" + resolved "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz" integrity sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q== array.prototype.reduce@^1.0.5: version "1.0.5" - resolved "https://registry.yarnpkg.com/array.prototype.reduce/-/array.prototype.reduce-1.0.5.tgz#6b20b0daa9d9734dd6bc7ea66b5bbce395471eac" + resolved "https://registry.npmjs.org/array.prototype.reduce/-/array.prototype.reduce-1.0.5.tgz" integrity sha512-kDdugMl7id9COE8R7MHF5jWk7Dqt/fs4Pv+JXoICnYwqpjjjbUurz6w5fT5IG6brLdJhv6/VoHB0H7oyIBXd+Q== dependencies: call-bind "^1.0.2" @@ -1502,134 +1533,134 @@ array.prototype.reduce@^1.0.5: asap@~2.0.6: version "2.0.6" - resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" + resolved "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz" integrity sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA== asn1@~0.2.3: version "0.2.6" - resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.6.tgz#0d3a7bb6e64e02a90c0303b31f292868ea09a08d" + resolved "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz" integrity sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ== dependencies: safer-buffer "~2.1.0" -assert-plus@1.0.0, assert-plus@^1.0.0: +assert-plus@^1.0.0, assert-plus@1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + resolved "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz" integrity sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw== assertion-error@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" + resolved "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz" integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== astral-regex@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" + resolved "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz" integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== async-eventemitter@^0.2.4: version "0.2.4" - resolved "https://registry.yarnpkg.com/async-eventemitter/-/async-eventemitter-0.2.4.tgz#f5e7c8ca7d3e46aab9ec40a292baf686a0bafaca" + resolved "https://registry.npmjs.org/async-eventemitter/-/async-eventemitter-0.2.4.tgz" integrity sha512-pd20BwL7Yt1zwDFy+8MX8F1+WCT8aQeKj0kQnTrH9WaeRETlRamVhD0JtRPmrV4GfOJ2F9CvdQkZeZhnh2TuHw== dependencies: async "^2.4.0" -async@1.x: - version "1.5.2" - resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" - integrity sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w== - async@^2.4.0: version "2.6.4" - resolved "https://registry.yarnpkg.com/async/-/async-2.6.4.tgz#706b7ff6084664cd7eae713f6f965433b5504221" + resolved "https://registry.npmjs.org/async/-/async-2.6.4.tgz" integrity sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA== dependencies: lodash "^4.17.14" +async@1.x: + version "1.5.2" + resolved "https://registry.npmjs.org/async/-/async-1.5.2.tgz" + integrity sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w== + asynckit@^0.4.0: version "0.4.0" - resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + resolved "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz" integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== at-least-node@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" + resolved "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz" integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== available-typed-arrays@^1.0.5: version "1.0.5" - resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" + resolved "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz" integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== aws-sign2@~0.7.0: version "0.7.0" - resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" + resolved "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz" integrity sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA== aws4@^1.8.0: version "1.12.0" - resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.12.0.tgz#ce1c9d143389679e253b314241ea9aa5cec980d3" + resolved "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz" integrity sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg== axios@^0.21.1: version "0.21.4" - resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.4.tgz#c67b90dc0568e5c1cf2b0b858c43ba28e2eda575" + resolved "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz" integrity sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg== dependencies: follow-redirects "^1.14.0" b4a@^1.0.1: version "1.6.4" - resolved "https://registry.yarnpkg.com/b4a/-/b4a-1.6.4.tgz#ef1c1422cae5ce6535ec191baeed7567443f36c9" + resolved "https://registry.npmjs.org/b4a/-/b4a-1.6.4.tgz" integrity sha512-fpWrvyVHEKyeEvbKZTVOeZF3VSKKWtJxFIxX/jaVPf+cLbGUSitjb49pHLqPV2BUNNZ0LcoeEGfE/YCpyDYHIw== balanced-match@^1.0.0: version "1.0.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== base-x@^3.0.2: version "3.0.9" - resolved "https://registry.yarnpkg.com/base-x/-/base-x-3.0.9.tgz#6349aaabb58526332de9f60995e548a53fe21320" + resolved "https://registry.npmjs.org/base-x/-/base-x-3.0.9.tgz" integrity sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ== dependencies: safe-buffer "^5.0.1" base64-js@^1.3.1: version "1.5.1" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + resolved "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== bcrypt-pbkdf@^1.0.0: version "1.0.2" - resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" + resolved "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz" integrity sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w== dependencies: tweetnacl "^0.14.3" bech32@1.1.4: version "1.1.4" - resolved "https://registry.yarnpkg.com/bech32/-/bech32-1.1.4.tgz#e38c9f37bf179b8eb16ae3a772b40c356d4832e9" + resolved "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz" integrity sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ== bigint-crypto-utils@^3.0.23: version "3.2.2" - resolved "https://registry.yarnpkg.com/bigint-crypto-utils/-/bigint-crypto-utils-3.2.2.tgz#e30a49ec38357c6981cd3da5aaa6480b1f752ee4" + resolved "https://registry.npmjs.org/bigint-crypto-utils/-/bigint-crypto-utils-3.2.2.tgz" integrity sha512-U1RbE3aX9ayCUVcIPHuPDPKcK3SFOXf93J1UK/iHlJuQB7bhagPIX06/CLpLEsDThJ7KA4Dhrnzynl+d2weTiw== bignumber.js@^9.0.0: version "9.1.1" - resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.1.1.tgz#c4df7dc496bd849d4c9464344c1aa74228b4dac6" + resolved "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.1.tgz" integrity sha512-pHm4LsMJ6lzgNGVfZHjMoO8sdoRhOzOH4MLmY65Jg70bpxCKu5iOHNJyfF6OyvYw7t8Fpf35RuzUyqnQsj8Vig== binary-extensions@^2.0.0: version "2.2.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" + resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz" integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== bip39@3.0.4: version "3.0.4" - resolved "https://registry.yarnpkg.com/bip39/-/bip39-3.0.4.tgz#5b11fed966840b5e1b8539f0f54ab6392969b2a0" + resolved "https://registry.npmjs.org/bip39/-/bip39-3.0.4.tgz" integrity sha512-YZKQlb752TrUWqHWj7XAwCSjYEgGAk+/Aas3V7NyjQeZYsztO8JnQUaCWhcnL4T+jL8nvB8typ2jRPzTlgugNw== dependencies: "@types/node" "11.11.6" @@ -1639,7 +1670,7 @@ bip39@3.0.4: blake-hash@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/blake-hash/-/blake-hash-2.0.0.tgz#af184dce641951126d05b7d1c3de3224f538d66e" + resolved "https://registry.npmjs.org/blake-hash/-/blake-hash-2.0.0.tgz" integrity sha512-Igj8YowDu1PRkRsxZA7NVkdFNxH5rKv5cpLxQ0CVXSIA77pVYwCPRQJ2sMew/oneUpfuYRyjG6r8SmmmnbZb1w== dependencies: node-addon-api "^3.0.0" @@ -1648,7 +1679,7 @@ blake-hash@^2.0.0: blake2b-wasm@^2.4.0: version "2.4.0" - resolved "https://registry.yarnpkg.com/blake2b-wasm/-/blake2b-wasm-2.4.0.tgz#9115649111edbbd87eb24ce7c04b427e4e2be5be" + resolved "https://registry.npmjs.org/blake2b-wasm/-/blake2b-wasm-2.4.0.tgz" integrity sha512-S1kwmW2ZhZFFFOghcx73+ZajEfKBqhP82JMssxtLVMxlaPea1p9uoLiUZ5WYyHn0KddwbLc+0vh4wR0KBNoT5w== dependencies: b4a "^1.0.1" @@ -1656,7 +1687,7 @@ blake2b-wasm@^2.4.0: blake2b@^2.1.3: version "2.1.4" - resolved "https://registry.yarnpkg.com/blake2b/-/blake2b-2.1.4.tgz#817d278526ddb4cd673bfb1af16d1ad61e393ba3" + resolved "https://registry.npmjs.org/blake2b/-/blake2b-2.1.4.tgz" integrity sha512-AyBuuJNI64gIvwx13qiICz6H6hpmjvYS5DGkG6jbXMOT8Z3WUJ3V1X0FlhIoT1b/5JtHE3ki+xjtMvu1nn+t9A== dependencies: blake2b-wasm "^2.4.0" @@ -1664,27 +1695,47 @@ blake2b@^2.1.3: blakejs@^1.1.0: version "1.2.1" - resolved "https://registry.yarnpkg.com/blakejs/-/blakejs-1.2.1.tgz#5057e4206eadb4a97f7c0b6e197a505042fc3814" + resolved "https://registry.npmjs.org/blakejs/-/blakejs-1.2.1.tgz" integrity sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ== -bn.js@4.11.6: - version "4.11.6" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.6.tgz#53344adb14617a13f6e8dd2ce28905d1c0ba3215" - integrity sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA== +bluebird@^3.5.2: + version "3.7.2" + resolved "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz" + integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== + +bn.js@^4.0.0: + version "4.12.0" + resolved "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz" + integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== -bn.js@^4.0.0, bn.js@^4.11.0, bn.js@^4.11.1, bn.js@^4.11.8, bn.js@^4.11.9: +bn.js@^4.11.0, bn.js@^4.11.8: version "4.12.0" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" + resolved "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz" integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== -bn.js@^5.1.2, bn.js@^5.2.0, bn.js@^5.2.1: +bn.js@^4.11.1: + version "4.12.0" + resolved "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz" + integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== + +bn.js@^4.11.9: + version "4.12.0" + resolved "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz" + integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== + +bn.js@^5.1.2, bn.js@^5.2.1: version "5.2.1" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.1.tgz#0bc527a6a0d18d0aa8d5b0538ce4a77dccfa7b70" + resolved "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz" integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ== +bn.js@4.11.6: + version "4.11.6" + resolved "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz" + integrity sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA== + brace-expansion@^1.1.7: version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== dependencies: balanced-match "^1.0.0" @@ -1692,26 +1743,26 @@ brace-expansion@^1.1.7: brace-expansion@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz" integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== dependencies: balanced-match "^1.0.0" braces@^3.0.2, braces@~3.0.2: version "3.0.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + resolved "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz" integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== dependencies: fill-range "^7.0.1" brorand@^1.0.1, brorand@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" + resolved "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz" integrity sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w== browser-level@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/browser-level/-/browser-level-1.0.1.tgz#36e8c3183d0fe1c405239792faaab5f315871011" + resolved "https://registry.npmjs.org/browser-level/-/browser-level-1.0.1.tgz" integrity sha512-XECYKJ+Dbzw0lbydyQuJzwNXtOpbMSq737qxJN11sIRTErOMShvDpbzTlgju7orJKvx4epULolZAuJGLzCmWRQ== dependencies: abstract-level "^1.0.2" @@ -1721,12 +1772,12 @@ browser-level@^1.0.1: browser-stdout@1.3.1: version "1.3.1" - resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" + resolved "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz" integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== browserify-aes@^1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" + resolved "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz" integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== dependencies: buffer-xor "^1.0.3" @@ -1738,14 +1789,14 @@ browserify-aes@^1.2.0: bs58@^4.0.0: version "4.0.1" - resolved "https://registry.yarnpkg.com/bs58/-/bs58-4.0.1.tgz#be161e76c354f6f788ae4071f63f34e8c4f0a42a" + resolved "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz" integrity sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw== dependencies: base-x "^3.0.2" bs58check@^2.1.2: version "2.1.2" - resolved "https://registry.yarnpkg.com/bs58check/-/bs58check-2.1.2.tgz#53b018291228d82a5aa08e7d796fdafda54aebfc" + resolved "https://registry.npmjs.org/bs58check/-/bs58check-2.1.2.tgz" integrity sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA== dependencies: bs58 "^4.0.0" @@ -1754,24 +1805,32 @@ bs58check@^2.1.2: buffer-from@^1.0.0: version "1.1.2" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" + resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz" integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== buffer-xor@^1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" + resolved "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz" integrity sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ== buffer-xor@^2.0.1: version "2.0.2" - resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-2.0.2.tgz#34f7c64f04c777a1f8aac5e661273bb9dd320289" + resolved "https://registry.npmjs.org/buffer-xor/-/buffer-xor-2.0.2.tgz" integrity sha512-eHslX0bin3GB+Lx2p7lEYRShRewuNZL3fUl4qlVJGGiwoPGftmt8JQgk2Y9Ji5/01TnVDo33E5b5O3vUB1HdqQ== dependencies: safe-buffer "^5.1.1" -buffer@^5.5.0, buffer@^5.6.0: +buffer@^5.5.0: + version "5.7.1" + resolved "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz" + integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.1.13" + +buffer@^5.6.0: version "5.7.1" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" + resolved "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz" integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== dependencies: base64-js "^1.3.1" @@ -1779,7 +1838,7 @@ buffer@^5.5.0, buffer@^5.6.0: buffer@^6.0.3: version "6.0.3" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" + resolved "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz" integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== dependencies: base64-js "^1.3.1" @@ -1787,73 +1846,85 @@ buffer@^6.0.3: bufferutil@4.0.5: version "4.0.5" - resolved "https://registry.yarnpkg.com/bufferutil/-/bufferutil-4.0.5.tgz#da9ea8166911cc276bf677b8aed2d02d31f59028" + resolved "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.5.tgz" integrity sha512-HTm14iMQKK2FjFLRTM5lAVcyaUzOnqbPtesFIvREgXpJHdQm8bWS+GkQgIkfaBYRHuCnea7w8UVNfwiAQhlr9A== dependencies: node-gyp-build "^4.3.0" busboy@^1.6.0: version "1.6.0" - resolved "https://registry.yarnpkg.com/busboy/-/busboy-1.6.0.tgz#966ea36a9502e43cdb9146962523b92f531f6893" + resolved "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz" integrity sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA== dependencies: streamsearch "^1.1.0" bytes@3.1.2: version "3.1.2" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" + resolved "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz" integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== call-bind@^1.0.0, call-bind@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" + resolved "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz" integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== dependencies: function-bind "^1.1.1" get-intrinsic "^1.0.2" +camelcase@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz" + integrity sha512-4nhGqUkc4BqbBBB4Q6zLuD7lzzrHYrjKGeYaEji/3tFR5VdJu9v+LilhGIVe8wxEJPPOeWo7eg8dwY13TZ1BNg== + camelcase@^5.0.0: version "5.3.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" + resolved "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== camelcase@^6.0.0: version "6.3.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" + resolved "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz" integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== case@^1.6.3: version "1.6.3" - resolved "https://registry.yarnpkg.com/case/-/case-1.6.3.tgz#0a4386e3e9825351ca2e6216c60467ff5f1ea1c9" + resolved "https://registry.npmjs.org/case/-/case-1.6.3.tgz" integrity sha512-mzDSXIPaFwVDvZAHqZ9VlbyF4yyXRuX6IvB06WvPYkqJVO24kX1PPhv9bfpKNFZyxYFmmgo03HUiD8iklmJYRQ== caseless@^0.12.0, caseless@~0.12.0: version "0.12.0" - resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" + resolved "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz" integrity sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw== -catering@^2.0.0, catering@^2.1.0, catering@^2.1.1: +catering@^2.0.0: + version "2.1.0" + resolved "https://registry.npmjs.org/catering/-/catering-2.1.0.tgz" + integrity sha512-M5imwzQn6y+ODBfgi+cfgZv2hIUI6oYU/0f35Mdb1ujGeqeoI5tOnl9Q13DTH7LW+7er+NYq8stNOKZD/Z3U/A== + dependencies: + queue-tick "^1.0.0" + +catering@^2.1.0, catering@^2.1.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/catering/-/catering-2.1.1.tgz#66acba06ed5ee28d5286133982a927de9a04b510" + resolved "https://registry.npmjs.org/catering/-/catering-2.1.1.tgz" integrity sha512-K7Qy8O9p76sL3/3m7/zLKbRkyOlSZAgzEaLhyj2mXS8PsCud2Eo4hAb8aLtZqHh0QGqLcb9dlJSu6lHRVENm1w== cbor@^8.1.0: version "8.1.0" - resolved "https://registry.yarnpkg.com/cbor/-/cbor-8.1.0.tgz#cfc56437e770b73417a2ecbfc9caf6b771af60d5" + resolved "https://registry.npmjs.org/cbor/-/cbor-8.1.0.tgz" integrity sha512-DwGjNW9omn6EwP70aXsn7FQJx5kO12tX0bZkaTjzdVFM6/7nhA4t0EENocKGx6D2Bch9PE2KzCUf5SceBdeijg== dependencies: nofilter "^3.1.0" chai-as-promised@^7.1.1: version "7.1.1" - resolved "https://registry.yarnpkg.com/chai-as-promised/-/chai-as-promised-7.1.1.tgz#08645d825deb8696ee61725dbf590c012eb00ca0" + resolved "https://registry.npmjs.org/chai-as-promised/-/chai-as-promised-7.1.1.tgz" integrity sha512-azL6xMoi+uxu6z4rhWQ1jbdUhOMhis2PvscD/xjLqNMkv3BPPp2JyyuTHOrf9BOosGpNQ11v6BKv/g57RXbiaA== dependencies: check-error "^1.0.2" -chai@^4.2.0: +chai@^4.2.0, "chai@>= 2.1.2 < 5": version "4.3.7" - resolved "https://registry.yarnpkg.com/chai/-/chai-4.3.7.tgz#ec63f6df01829088e8bf55fca839bcd464a8ec51" + resolved "https://registry.npmjs.org/chai/-/chai-4.3.7.tgz" integrity sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A== dependencies: assertion-error "^1.1.0" @@ -1866,16 +1937,24 @@ chai@^4.2.0: chalk@^2.4.2: version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== dependencies: ansi-styles "^3.2.1" escape-string-regexp "^1.0.5" supports-color "^5.3.0" -chalk@^4.1.0, chalk@^4.1.2: +chalk@^4.1.0: + version "4.1.2" + resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chalk@^4.1.2: version "4.1.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== dependencies: ansi-styles "^4.1.0" @@ -1883,52 +1962,52 @@ chalk@^4.1.0, chalk@^4.1.2: "charenc@>= 0.0.1": version "0.0.2" - resolved "https://registry.yarnpkg.com/charenc/-/charenc-0.0.2.tgz#c0a1d2f3a7092e03774bfa83f14c0fc5790a8667" + resolved "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz" integrity sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA== check-error@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82" + resolved "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz" integrity sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA== -chokidar@3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.3.0.tgz#12c0714668c55800f659e262d4962a97faf554a6" - integrity sha512-dGmKLDdT3Gdl7fBUe8XK+gAtGmzy5Fn0XkkWQuYxGIgWVPPse2CxFA5mtrlD0TOHaHjEUqkWNyP1XdHoJES/4A== +chokidar@^3.4.0, chokidar@^3.5.2, chokidar@3.5.3: + version "3.5.3" + resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz" + integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== dependencies: - anymatch "~3.1.1" + anymatch "~3.1.2" braces "~3.0.2" - glob-parent "~5.1.0" + glob-parent "~5.1.2" is-binary-path "~2.1.0" is-glob "~4.0.1" normalize-path "~3.0.0" - readdirp "~3.2.0" + readdirp "~3.6.0" optionalDependencies: - fsevents "~2.1.1" + fsevents "~2.3.2" -chokidar@3.5.3, chokidar@^3.4.0, chokidar@^3.5.2: - version "3.5.3" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" - integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== +chokidar@3.3.0: + version "3.3.0" + resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.3.0.tgz" + integrity sha512-dGmKLDdT3Gdl7fBUe8XK+gAtGmzy5Fn0XkkWQuYxGIgWVPPse2CxFA5mtrlD0TOHaHjEUqkWNyP1XdHoJES/4A== dependencies: - anymatch "~3.1.2" + anymatch "~3.1.1" braces "~3.0.2" - glob-parent "~5.1.2" + glob-parent "~5.1.0" is-binary-path "~2.1.0" is-glob "~4.0.1" normalize-path "~3.0.0" - readdirp "~3.6.0" + readdirp "~3.2.0" optionalDependencies: - fsevents "~2.3.2" + fsevents "~2.1.1" ci-info@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" + resolved "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz" integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: version "1.0.4" - resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" + resolved "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz" integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q== dependencies: inherits "^2.0.1" @@ -1936,7 +2015,7 @@ cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: circomlibjs@^0.1.7: version "0.1.7" - resolved "https://registry.yarnpkg.com/circomlibjs/-/circomlibjs-0.1.7.tgz#9f5a7d9a23323744b11ee456b05b0cd81f48b554" + resolved "https://registry.npmjs.org/circomlibjs/-/circomlibjs-0.1.7.tgz" integrity sha512-GRAUoAlKAsiiTa+PA725G9RmEmJJRc8tRFxw/zKktUxlQISGznT4hH4ESvW8FNTsrGg/nNd06sGP/Wlx0LUHVg== dependencies: blake-hash "^2.0.0" @@ -1946,7 +2025,7 @@ circomlibjs@^0.1.7: classic-level@^1.2.0: version "1.3.0" - resolved "https://registry.yarnpkg.com/classic-level/-/classic-level-1.3.0.tgz#5e36680e01dc6b271775c093f2150844c5edd5c8" + resolved "https://registry.npmjs.org/classic-level/-/classic-level-1.3.0.tgz" integrity sha512-iwFAJQYtqRTRM0F6L8h4JCt00ZSGdOyqh7yVrhhjrOpFhmBjNlRUey64MCiyo6UmQHMJ+No3c81nujPv+n9yrg== dependencies: abstract-level "^1.0.2" @@ -1957,12 +2036,12 @@ classic-level@^1.2.0: clean-stack@^2.0.0: version "2.2.0" - resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" + resolved "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz" integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== cli-table3@^0.5.0: version "0.5.1" - resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.5.1.tgz#0252372d94dfc40dbd8df06005f48f31f656f202" + resolved "https://registry.npmjs.org/cli-table3/-/cli-table3-0.5.1.tgz" integrity sha512-7Qg2Jrep1S/+Q3EceiZtQcDPWxhAvBw+ERf1162v4sikJrvojMHFqXt8QIVha8UlH9rgU0BeWPytZ9/TzYqlUw== dependencies: object-assign "^4.1.0" @@ -1970,9 +2049,18 @@ cli-table3@^0.5.0: optionalDependencies: colors "^1.1.2" +cliui@^3.2.0: + version "3.2.0" + resolved "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz" + integrity sha512-0yayqDxWQbqk3ojkYqUKqaAQ6AfNKeKWRNA8kR0WXzAsdHpP4BIaOmMAG87JGuO6qcobyW4GjxHd9PmhEd+T9w== + dependencies: + string-width "^1.0.1" + strip-ansi "^3.0.1" + wrap-ansi "^2.0.0" + cliui@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" + resolved "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz" integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA== dependencies: string-width "^3.1.0" @@ -1981,57 +2069,62 @@ cliui@^5.0.0: cliui@^7.0.2: version "7.0.4" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" + resolved "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz" integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== dependencies: string-width "^4.2.0" strip-ansi "^6.0.0" wrap-ansi "^7.0.0" +code-point-at@^1.0.0: + version "1.1.0" + resolved "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz" + integrity sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA== + color-convert@^1.9.0: version "1.9.3" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz" integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== dependencies: color-name "1.1.3" color-convert@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== dependencies: color-name "~1.1.4" -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== - color-name@~1.1.4: version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== -colors@1.4.0, colors@^1.1.2: +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" + integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== + +colors@^1.1.2, colors@1.4.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78" + resolved "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz" integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA== combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.6: version "1.0.8" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + resolved "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz" integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== dependencies: delayed-stream "~1.0.0" command-exists@^1.2.8: version "1.2.9" - resolved "https://registry.yarnpkg.com/command-exists/-/command-exists-1.2.9.tgz#c50725af3808c8ab0260fd60b01fbfa25b954f69" + resolved "https://registry.npmjs.org/command-exists/-/command-exists-1.2.9.tgz" integrity sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w== command-line-args@^5.1.1: version "5.2.1" - resolved "https://registry.yarnpkg.com/command-line-args/-/command-line-args-5.2.1.tgz#c44c32e437a57d7c51157696893c5909e9cec42e" + resolved "https://registry.npmjs.org/command-line-args/-/command-line-args-5.2.1.tgz" integrity sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg== dependencies: array-back "^3.1.0" @@ -2041,7 +2134,7 @@ command-line-args@^5.1.1: command-line-usage@^6.1.0: version "6.1.3" - resolved "https://registry.yarnpkg.com/command-line-usage/-/command-line-usage-6.1.3.tgz#428fa5acde6a838779dfa30e44686f4b6761d957" + resolved "https://registry.npmjs.org/command-line-usage/-/command-line-usage-6.1.3.tgz" integrity sha512-sH5ZSPr+7UStsloltmDh7Ce5fb8XPlHyoPzTpyyMuYCtervL65+ubVZ6Q61cFtFl62UyJlc8/JwERRbAFPUqgw== dependencies: array-back "^4.0.2" @@ -2049,24 +2142,24 @@ command-line-usage@^6.1.0: table-layout "^1.0.2" typical "^5.2.0" -commander@3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/commander/-/commander-3.0.2.tgz#6837c3fb677ad9933d1cfba42dd14d5117d6b39e" - integrity sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow== - commander@^8.1.0: version "8.3.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66" + resolved "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz" integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== +commander@3.0.2: + version "3.0.2" + resolved "https://registry.npmjs.org/commander/-/commander-3.0.2.tgz" + integrity sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow== + concat-map@0.0.1: version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== concat-stream@^1.6.0, concat-stream@^1.6.2: version "1.6.2" - resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" + resolved "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz" integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== dependencies: buffer-from "^1.0.0" @@ -2076,32 +2169,27 @@ concat-stream@^1.6.0, concat-stream@^1.6.2: cookie@^0.4.1: version "0.4.2" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.2.tgz#0e41f24de5ecf317947c82fc789e06a884824432" + resolved "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz" integrity sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA== core-js-pure@^3.0.1: version "3.31.0" - resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.31.0.tgz#052fd9e82fbaaf86457f5db1fadcd06f15966ff2" + resolved "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.31.0.tgz" integrity sha512-/AnE9Y4OsJZicCzIe97JP5XoPKQJfTuEG43aEVLFJGOJpyqELod+pE6LEl63DfG1Mp8wX97LDaDpy1GmLEUxlg== -core-util-is@1.0.2: +core-util-is@~1.0.0, core-util-is@1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + resolved "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz" integrity sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ== -core-util-is@~1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" - integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== - crc-32@^1.2.0: version "1.2.2" - resolved "https://registry.yarnpkg.com/crc-32/-/crc-32-1.2.2.tgz#3cad35a934b8bf71f25ca524b6da51fb7eace2ff" + resolved "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz" integrity sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ== create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" + resolved "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz" integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== dependencies: cipher-base "^1.0.1" @@ -2112,7 +2200,7 @@ create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: create-hmac@^1.1.4, create-hmac@^1.1.7: version "1.1.7" - resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" + resolved "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz" integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== dependencies: cipher-base "^1.0.3" @@ -2124,84 +2212,89 @@ create-hmac@^1.1.4, create-hmac@^1.1.7: create-require@^1.1.0: version "1.1.1" - resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" + resolved "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz" integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== "crypt@>= 0.0.1": version "0.0.2" - resolved "https://registry.yarnpkg.com/crypt/-/crypt-0.0.2.tgz#88d7ff7ec0dfb86f713dc87bbb42d044d3e6c41b" + resolved "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz" integrity sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow== dashdash@^1.12.0: version "1.14.1" - resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" + resolved "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz" integrity sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g== dependencies: assert-plus "^1.0.0" death@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/death/-/death-1.1.0.tgz#01aa9c401edd92750514470b8266390c66c67318" + resolved "https://registry.npmjs.org/death/-/death-1.1.0.tgz" integrity sha512-vsV6S4KVHvTGxbEcij7hkWRv0It+sGGWVOM67dQde/o5Xjnr+KmLjxWJii2uEObIrt1CcM9w0Yaovx+iOlIL+w== -debug@3.2.6: - version "3.2.6" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" - integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== - dependencies: - ms "^2.1.1" - -debug@4, debug@4.3.4, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4: - version "4.3.4" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" - integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== - dependencies: - ms "2.1.2" - debug@^2.2.0: version "2.6.9" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz" integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== dependencies: ms "2.0.0" debug@^3.1.0: version "3.2.7" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" + resolved "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz" integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== dependencies: ms "^2.1.1" +debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4, debug@4, debug@4.3.4: + version "4.3.4" + resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + +debug@3.2.6: + version "3.2.6" + resolved "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz" + integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== + dependencies: + ms "^2.1.1" + +decamelize@^1.1.1: + version "1.2.0" + resolved "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz" + integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== + decamelize@^1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + resolved "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz" integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== decamelize@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837" + resolved "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz" integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== deep-eql@^4.0.1, deep-eql@^4.1.2: version "4.1.3" - resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-4.1.3.tgz#7c7775513092f7df98d8df9996dd085eb668cc6d" + resolved "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz" integrity sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw== dependencies: type-detect "^4.0.0" deep-extend@~0.6.0: version "0.6.0" - resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" + resolved "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz" integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== deep-is@~0.1.3: version "0.1.4" - resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" + resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz" integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== deferred-leveldown@~5.3.0: version "5.3.0" - resolved "https://registry.yarnpkg.com/deferred-leveldown/-/deferred-leveldown-5.3.0.tgz#27a997ad95408b61161aa69bd489b86c71b78058" + resolved "https://registry.npmjs.org/deferred-leveldown/-/deferred-leveldown-5.3.0.tgz" integrity sha512-a59VOT+oDy7vtAbLRCZwWgxu2BaCfd5Hk7wxJd48ei7I+nsg8Orlb9CLG0PMZienk9BSUKgeAqkO2+Lw+1+Ukw== dependencies: abstract-leveldown "~6.2.1" @@ -2209,7 +2302,7 @@ deferred-leveldown@~5.3.0: define-properties@^1.1.2, define-properties@^1.1.3, define-properties@^1.1.4, define-properties@^1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.0.tgz#52988570670c9eacedd8064f4a990f2405849bd5" + resolved "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz" integrity sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA== dependencies: has-property-descriptors "^1.0.0" @@ -2217,67 +2310,67 @@ define-properties@^1.1.2, define-properties@^1.1.3, define-properties@^1.1.4, de delayed-stream@~1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + resolved "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== depd@2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" + resolved "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz" integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== detect-port@^1.3.0: version "1.5.1" - resolved "https://registry.yarnpkg.com/detect-port/-/detect-port-1.5.1.tgz#451ca9b6eaf20451acb0799b8ab40dff7718727b" + resolved "https://registry.npmjs.org/detect-port/-/detect-port-1.5.1.tgz" integrity sha512-aBzdj76lueB6uUst5iAs7+0H/oOjqI5D16XUWxlWMIMROhcM0rfsNVk93zTngq1dDNpoXRr++Sus7ETAExppAQ== dependencies: address "^1.0.1" debug "4" +diff@^4.0.1: + version "4.0.2" + resolved "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz" + integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== + diff@3.5.0: version "3.5.0" - resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" + resolved "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz" integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA== diff@5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/diff/-/diff-5.0.0.tgz#7ed6ad76d859d030787ec35855f5b1daf31d852b" + resolved "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz" integrity sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w== -diff@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" - integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== - difflib@^0.2.4: version "0.2.4" - resolved "https://registry.yarnpkg.com/difflib/-/difflib-0.2.4.tgz#b5e30361a6db023176d562892db85940a718f47e" + resolved "https://registry.npmjs.org/difflib/-/difflib-0.2.4.tgz" integrity sha512-9YVwmMb0wQHQNr5J9m6BSj6fk4pfGITGQOOs+D9Fl+INODWFOfvhIU1hNv6GgR1RBoC/9NJcwu77zShxV0kT7w== dependencies: heap ">= 0.2.0" dir-glob@^3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + resolved "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz" integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== dependencies: path-type "^4.0.0" dotenv@^16.3.1: version "16.3.1" - resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.3.1.tgz#369034de7d7e5b120972693352a3bf112172cc3e" + resolved "https://registry.npmjs.org/dotenv/-/dotenv-16.3.1.tgz" integrity sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ== ecc-jsbn@~0.1.1: version "0.1.2" - resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" + resolved "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz" integrity sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw== dependencies: jsbn "~0.1.0" safer-buffer "^2.1.0" -elliptic@6.5.4, elliptic@^6.5.2, elliptic@^6.5.4: +elliptic@^6.5.2, elliptic@^6.5.4, elliptic@6.5.4: version "6.5.4" - resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" + resolved "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz" integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== dependencies: bn.js "^4.11.9" @@ -2290,27 +2383,27 @@ elliptic@6.5.4, elliptic@^6.5.2, elliptic@^6.5.4: emittery@0.10.0: version "0.10.0" - resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.10.0.tgz#bb373c660a9d421bb44706ec4967ed50c02a8026" + resolved "https://registry.npmjs.org/emittery/-/emittery-0.10.0.tgz" integrity sha512-AGvFfs+d0JKCJQ4o01ASQLGPmSCxgfU9RFXvzPvZdjKK8oscynksuJhWrSTSw7j7Ep/sZct5b5ZhYCi8S/t0HQ== emoji-regex@^7.0.1: version "7.0.3" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" + resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz" integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== emoji-regex@^8.0.0: version "8.0.0" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz" integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== encode-utf8@^1.0.2: version "1.0.3" - resolved "https://registry.yarnpkg.com/encode-utf8/-/encode-utf8-1.0.3.tgz#f30fdd31da07fb596f281beb2f6b027851994cda" + resolved "https://registry.npmjs.org/encode-utf8/-/encode-utf8-1.0.3.tgz" integrity sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw== encoding-down@^6.3.0: version "6.3.0" - resolved "https://registry.yarnpkg.com/encoding-down/-/encoding-down-6.3.0.tgz#b1c4eb0e1728c146ecaef8e32963c549e76d082b" + resolved "https://registry.npmjs.org/encoding-down/-/encoding-down-6.3.0.tgz" integrity sha512-QKrV0iKR6MZVJV08QY0wp1e7vF6QbhnbQhb07bwpEyuz4uZiZgPlEGdkCROuFkUwdxlFaiPIhjyarH1ee/3vhw== dependencies: abstract-leveldown "^6.2.1" @@ -2318,36 +2411,35 @@ encoding-down@^6.3.0: level-codec "^9.0.0" level-errors "^2.0.0" -enquirer@^2.3.0: +enquirer@^2.3.0, enquirer@^2.3.6: version "2.3.6" - resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" + resolved "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz" integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== dependencies: ansi-colors "^4.1.1" -enquirer@^2.3.6: - version "2.4.1" - resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.4.1.tgz#93334b3fbd74fc7097b224ab4a8fb7e40bf4ae56" - integrity sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ== - dependencies: - ansi-colors "^4.1.1" - strip-ansi "^6.0.1" - env-paths@^2.2.0: version "2.2.1" - resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2" + resolved "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz" integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== errno@~0.1.1: version "0.1.8" - resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.8.tgz#8bb3e9c7d463be4976ff888f76b4809ebc2e811f" + resolved "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz" integrity sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A== dependencies: prr "~1.0.1" +error-ex@^1.2.0: + version "1.3.2" + resolved "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + es-abstract@^1.19.0, es-abstract@^1.20.4, es-abstract@^1.21.2: version "1.21.2" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.21.2.tgz#a56b9695322c8a185dc25975aa3b8ec31d0e7eff" + resolved "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.2.tgz" integrity sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg== dependencies: array-buffer-byte-length "^1.0.0" @@ -2387,12 +2479,12 @@ es-abstract@^1.19.0, es-abstract@^1.20.4, es-abstract@^1.21.2: es-array-method-boxes-properly@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz#873f3e84418de4ee19c5be752990b2e44718d09e" + resolved "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz" integrity sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA== es-set-tostringtag@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz#338d502f6f674301d710b80c8592de8a15f09cd8" + resolved "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz" integrity sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg== dependencies: get-intrinsic "^1.1.3" @@ -2401,7 +2493,7 @@ es-set-tostringtag@^2.0.1: es-to-primitive@^1.2.1: version "1.2.1" - resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" + resolved "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz" integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== dependencies: is-callable "^1.1.4" @@ -2410,22 +2502,22 @@ es-to-primitive@^1.2.1: escalade@^3.1.1: version "3.1.1" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" + resolved "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz" integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== -escape-string-regexp@1.0.5, escape-string-regexp@^1.0.5: +escape-string-regexp@^1.0.5, escape-string-regexp@1.0.5: version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== escape-string-regexp@4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== escodegen@1.8.x: version "1.8.1" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.8.1.tgz#5a5b53af4693110bebb0867aa3430dd3b70a1018" + resolved "https://registry.npmjs.org/escodegen/-/escodegen-1.8.1.tgz" integrity sha512-yhi5S+mNTOuRvyW4gWlg5W1byMaQGWWSYHXsuFZ7GBo7tpyOwi2EdzMP/QWxh9hwkD2m+wDVHJsxhRIj+v/b/A== dependencies: esprima "^2.7.1" @@ -2435,29 +2527,37 @@ escodegen@1.8.x: optionalDependencies: source-map "~0.2.0" -esprima@2.7.x, esprima@^2.7.1: +esprima@^2.7.1, esprima@2.7.x: version "2.7.3" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" + resolved "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz" integrity sha512-OarPfz0lFCiW4/AV2Oy1Rp9qu0iusTKqykwTspGCZtPxmF81JR4MmIebvF1F9+UOKth2ZubLQ4XGGaU+hSn99A== esprima@^4.0.0: version "4.0.1" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + resolved "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== estraverse@^1.9.1: version "1.9.3" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-1.9.3.tgz#af67f2dc922582415950926091a4005d29c9bb44" + resolved "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz" integrity sha512-25w1fMXQrGdoquWnScXZGckOv+Wes+JDnuN/+7ex3SauFRS72r2lFDec0EKPt2YD1wUJ/IrfEex+9yp4hfSOJA== esutils@^2.0.2: version "2.0.3" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== +eth-ens-namehash@^2.0.8: + version "2.0.8" + resolved "https://registry.npmjs.org/eth-ens-namehash/-/eth-ens-namehash-2.0.8.tgz" + integrity sha512-VWEI1+KJfz4Km//dadyvBBoBeSQ0MHTXPvr8UIXiLW6IanxvAV+DmlZAijZwAyggqGUfwQBeHf7tc9wzc1piSw== + dependencies: + idna-uts46-hx "^2.3.1" + js-sha3 "^0.5.7" + eth-gas-reporter@^0.2.25: version "0.2.25" - resolved "https://registry.yarnpkg.com/eth-gas-reporter/-/eth-gas-reporter-0.2.25.tgz#546dfa946c1acee93cb1a94c2a1162292d6ff566" + resolved "https://registry.npmjs.org/eth-gas-reporter/-/eth-gas-reporter-0.2.25.tgz" integrity sha512-1fRgyE4xUB8SoqLgN3eDfpDfwEfRxh2Sz1b7wzFbyQA+9TekMmvSjjoRu9SKcSVyK+vLkLIsVbJDsTWjw195OQ== dependencies: "@ethersproject/abi" "^5.0.0-beta.146" @@ -2478,14 +2578,14 @@ eth-gas-reporter@^0.2.25: ethereum-bloom-filters@^1.0.6: version "1.0.10" - resolved "https://registry.yarnpkg.com/ethereum-bloom-filters/-/ethereum-bloom-filters-1.0.10.tgz#3ca07f4aed698e75bd134584850260246a5fed8a" + resolved "https://registry.npmjs.org/ethereum-bloom-filters/-/ethereum-bloom-filters-1.0.10.tgz" integrity sha512-rxJ5OFN3RwjQxDcFP2Z5+Q9ho4eIdEmSc2ht0fCu8Se9nbXjZ7/031uXoUYJ87KHCOdVeiUuwSnoS7hmYAGVHA== dependencies: js-sha3 "^0.8.0" -ethereum-cryptography@0.1.3, ethereum-cryptography@^0.1.3: +ethereum-cryptography@^0.1.3, ethereum-cryptography@0.1.3: version "0.1.3" - resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz#8d6143cfc3d74bf79bbd8edecdf29e4ae20dd191" + resolved "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz" integrity sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ== dependencies: "@types/pbkdf2" "^3.0.0" @@ -2506,7 +2606,7 @@ ethereum-cryptography@0.1.3, ethereum-cryptography@^0.1.3: ethereum-cryptography@^1.0.3: version "1.2.0" - resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-1.2.0.tgz#5ccfa183e85fdaf9f9b299a79430c044268c9b3a" + resolved "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-1.2.0.tgz" integrity sha512-6yFQC9b5ug6/17CQpCyE3k9eKBMdhyVjzUy1WkiuY/E4vj/SXDBbCw8QEIaXqf0Mf2SnY6RmpDcwlUmBSS0EJw== dependencies: "@noble/hashes" "1.2.0" @@ -2514,9 +2614,29 @@ ethereum-cryptography@^1.0.3: "@scure/bip32" "1.1.5" "@scure/bip39" "1.1.1" +ethereum-cryptography@^2.0.0: + version "2.2.1" + resolved "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-2.2.1.tgz" + integrity sha512-r/W8lkHSiTLxUxW8Rf3u4HGB0xQweG2RyETjywylKZSzLWoWAijRz8WCuOtJ6wah+avllXBqZuk29HCCvhEIRg== + dependencies: + "@noble/curves" "1.4.2" + "@noble/hashes" "1.4.0" + "@scure/bip32" "1.4.0" + "@scure/bip39" "1.3.0" + +ethereum-cryptography@^2.1.2: + version "2.2.1" + resolved "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-2.2.1.tgz" + integrity sha512-r/W8lkHSiTLxUxW8Rf3u4HGB0xQweG2RyETjywylKZSzLWoWAijRz8WCuOtJ6wah+avllXBqZuk29HCCvhEIRg== + dependencies: + "@noble/curves" "1.4.2" + "@noble/hashes" "1.4.0" + "@scure/bip32" "1.4.0" + "@scure/bip39" "1.3.0" + ethereum-waffle@^4.0.10: version "4.0.10" - resolved "https://registry.yarnpkg.com/ethereum-waffle/-/ethereum-waffle-4.0.10.tgz#f1ef1564c0155236f1a66c6eae362a5d67c9f64c" + resolved "https://registry.npmjs.org/ethereum-waffle/-/ethereum-waffle-4.0.10.tgz" integrity sha512-iw9z1otq7qNkGDNcMoeNeLIATF9yKl1M8AIeu42ElfNBplq0e+5PeasQmm8ybY/elkZ1XyRO0JBQxQdVRb8bqQ== dependencies: "@ethereum-waffle/chai" "4.0.10" @@ -2526,28 +2646,30 @@ ethereum-waffle@^4.0.10: solc "0.8.15" typechain "^8.0.0" -ethereumjs-abi@0.6.8, ethereumjs-abi@^0.6.8: +ethereumjs-abi@^0.6.8, ethereumjs-abi@0.6.8: version "0.6.8" - resolved "https://registry.yarnpkg.com/ethereumjs-abi/-/ethereumjs-abi-0.6.8.tgz#71bc152db099f70e62f108b7cdfca1b362c6fcae" + resolved "https://registry.npmjs.org/ethereumjs-abi/-/ethereumjs-abi-0.6.8.tgz" integrity sha512-Tx0r/iXI6r+lRsdvkFDlut0N08jWMnKRZ6Gkq+Nmw75lZe4e6o3EkSnkaBP5NF6+m5PTGAr9JP43N3LyeoglsA== dependencies: bn.js "^4.11.8" ethereumjs-util "^6.0.0" -ethereumjs-util@7.1.3: - version "7.1.3" - resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-7.1.3.tgz#b55d7b64dde3e3e45749e4c41288238edec32d23" - integrity sha512-y+82tEbyASO0K0X1/SRhbJJoAlfcvq8JbrG4a5cjrOks7HS/36efU/0j2flxCPOUM++HFahk33kr/ZxyC4vNuw== +ethereumjs-util@^6.0.0: + version "6.2.1" + resolved "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz" + integrity sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw== dependencies: - "@types/bn.js" "^5.1.0" - bn.js "^5.1.2" + "@types/bn.js" "^4.11.3" + bn.js "^4.11.0" create-hash "^1.1.2" + elliptic "^6.5.2" ethereum-cryptography "^0.1.3" - rlp "^2.2.4" + ethjs-util "0.1.6" + rlp "^2.2.3" -ethereumjs-util@^6.0.0, ethereumjs-util@^6.2.1: +ethereumjs-util@^6.2.1: version "6.2.1" - resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz#fcb4e4dd5ceacb9d2305426ab1a5cd93e3163b69" + resolved "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz" integrity sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw== dependencies: "@types/bn.js" "^4.11.3" @@ -2558,9 +2680,9 @@ ethereumjs-util@^6.0.0, ethereumjs-util@^6.2.1: ethjs-util "0.1.6" rlp "^2.2.3" -ethereumjs-util@^7.1.0, ethereumjs-util@^7.1.1, ethereumjs-util@^7.1.3, ethereumjs-util@^7.1.4, ethereumjs-util@^7.1.5: +ethereumjs-util@^7.1.1, ethereumjs-util@^7.1.3, ethereumjs-util@^7.1.4, ethereumjs-util@^7.1.5: version "7.1.5" - resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz#9ecf04861e4fbbeed7465ece5f23317ad1129181" + resolved "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz" integrity sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg== dependencies: "@types/bn.js" "^5.1.0" @@ -2569,24 +2691,20 @@ ethereumjs-util@^7.1.0, ethereumjs-util@^7.1.1, ethereumjs-util@^7.1.3, ethereum ethereum-cryptography "^0.1.3" rlp "^2.2.4" -ethers@^4.0.40: - version "4.0.49" - resolved "https://registry.yarnpkg.com/ethers/-/ethers-4.0.49.tgz#0eb0e9161a0c8b4761be547396bbe2fb121a8894" - integrity sha512-kPltTvWiyu+OktYy1IStSO16i2e7cS9D9OxZ81q2UUaiNPVrm/RTcbxamCXF9VUSKzJIdJV68EAIhTEVBalRWg== +ethereumjs-util@7.1.3: + version "7.1.3" + resolved "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.3.tgz" + integrity sha512-y+82tEbyASO0K0X1/SRhbJJoAlfcvq8JbrG4a5cjrOks7HS/36efU/0j2flxCPOUM++HFahk33kr/ZxyC4vNuw== dependencies: - aes-js "3.0.0" - bn.js "^4.11.9" - elliptic "6.5.4" - hash.js "1.1.3" - js-sha3 "0.5.7" - scrypt-js "2.0.4" - setimmediate "1.0.4" - uuid "2.0.1" - xmlhttprequest "1.8.0" + "@types/bn.js" "^5.1.0" + bn.js "^5.1.2" + create-hash "^1.1.2" + ethereum-cryptography "^0.1.3" + rlp "^2.2.4" -ethers@^5.5.1, ethers@^5.5.3, ethers@^5.7.1, ethers@^5.7.2: +ethers@*, ethers@^5.0.0, ethers@^5.1.3, ethers@^5.4.7, ethers@^5.5.1, ethers@^5.5.3, ethers@^5.7.0, ethers@^5.7.1, ethers@^5.7.2: version "5.7.2" - resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.7.2.tgz#3a7deeabbb8c030d4126b24f84e525466145872e" + resolved "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz" integrity sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg== dependencies: "@ethersproject/abi" "5.7.0" @@ -2620,30 +2738,45 @@ ethers@^5.5.1, ethers@^5.5.3, ethers@^5.7.1, ethers@^5.7.2: "@ethersproject/web" "5.7.1" "@ethersproject/wordlists" "5.7.0" -ethjs-unit@0.1.6: - version "0.1.6" - resolved "https://registry.yarnpkg.com/ethjs-unit/-/ethjs-unit-0.1.6.tgz#c665921e476e87bce2a9d588a6fe0405b2c41699" - integrity sha512-/Sn9Y0oKl0uqQuvgFk/zQgR7aw1g36qX/jzSQ5lSwlO0GigPymk4eGQfeNTD03w1dPOqfz8V77Cy43jH56pagw== +ethers@^4.0.40: + version "4.0.49" + resolved "https://registry.npmjs.org/ethers/-/ethers-4.0.49.tgz" + integrity sha512-kPltTvWiyu+OktYy1IStSO16i2e7cS9D9OxZ81q2UUaiNPVrm/RTcbxamCXF9VUSKzJIdJV68EAIhTEVBalRWg== dependencies: - bn.js "4.11.6" - number-to-bn "1.7.0" - -ethjs-util@0.1.6, ethjs-util@^0.1.6: - version "0.1.6" - resolved "https://registry.yarnpkg.com/ethjs-util/-/ethjs-util-0.1.6.tgz#f308b62f185f9fe6237132fb2a9818866a5cd536" - integrity sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w== + aes-js "3.0.0" + bn.js "^4.11.9" + elliptic "6.5.4" + hash.js "1.1.3" + js-sha3 "0.5.7" + scrypt-js "2.0.4" + setimmediate "1.0.4" + uuid "2.0.1" + xmlhttprequest "1.8.0" + +ethjs-unit@0.1.6: + version "0.1.6" + resolved "https://registry.npmjs.org/ethjs-unit/-/ethjs-unit-0.1.6.tgz" + integrity sha512-/Sn9Y0oKl0uqQuvgFk/zQgR7aw1g36qX/jzSQ5lSwlO0GigPymk4eGQfeNTD03w1dPOqfz8V77Cy43jH56pagw== + dependencies: + bn.js "4.11.6" + number-to-bn "1.7.0" + +ethjs-util@^0.1.6, ethjs-util@0.1.6: + version "0.1.6" + resolved "https://registry.npmjs.org/ethjs-util/-/ethjs-util-0.1.6.tgz" + integrity sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w== dependencies: is-hex-prefixed "1.0.0" strip-hex-prefix "1.0.0" event-target-shim@^5.0.0: version "5.0.1" - resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789" + resolved "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz" integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== evp_bytestokey@^1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" + resolved "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz" integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== dependencies: md5.js "^1.3.4" @@ -2651,27 +2784,22 @@ evp_bytestokey@^1.0.3: extend@~3.0.2: version "3.0.2" - resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + resolved "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz" integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== -extsprintf@1.3.0: +extsprintf@^1.2.0, extsprintf@1.3.0: version "1.3.0" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" + resolved "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz" integrity sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g== -extsprintf@^1.2.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.1.tgz#8d172c064867f235c0c84a596806d279bf4bcc07" - integrity sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA== - fast-deep-equal@^3.1.1: version "3.1.3" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== fast-glob@^3.0.3: version "3.2.12" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.12.tgz#7f39ec99c2e6ab030337142da9e0c18f37afae80" + resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz" integrity sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w== dependencies: "@nodelib/fs.stat" "^2.0.2" @@ -2682,105 +2810,120 @@ fast-glob@^3.0.3: fast-json-stable-stringify@^2.0.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== fast-levenshtein@~2.0.6: version "2.0.6" - resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + resolved "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz" integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== fastq@^1.6.0: version "1.15.0" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.15.0.tgz#d04d07c6a2a68fe4599fea8d2e103a937fae6b3a" + resolved "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz" integrity sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw== dependencies: reusify "^1.0.4" ffjavascript@^0.2.45: version "0.2.60" - resolved "https://registry.yarnpkg.com/ffjavascript/-/ffjavascript-0.2.60.tgz#4d8ae613d6bf4e98b3cc29ba10c626f5853854cf" + resolved "https://registry.npmjs.org/ffjavascript/-/ffjavascript-0.2.60.tgz" integrity sha512-T/9bnEL5xAZRDbQoEMf+pM9nrhK+C3JyZNmqiWub26EQorW7Jt+jR54gpqDhceA4Nj0YctPQwYnl8xa52/A26A== dependencies: wasmbuilder "0.0.16" wasmcurves "0.2.2" web-worker "^1.2.0" +fhevm@^0.5.8: + version "0.5.8" + resolved "https://registry.npmjs.org/fhevm/-/fhevm-0.5.8.tgz" + integrity sha512-fzTQnnw/7EajQywXUfZyTEGlsPe2SmvcVLklsmHEeZ5YQRmbp9pGR2rFuRcXED+Ou76Miq9oExRKIhkcdPlySg== + dependencies: + "@openzeppelin/contracts" "^5.0.1" + fill-range@^7.0.1: version "7.0.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz" integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== dependencies: to-regex-range "^5.0.1" find-replace@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/find-replace/-/find-replace-3.0.0.tgz#3e7e23d3b05167a76f770c9fbd5258b0def68c38" + resolved "https://registry.npmjs.org/find-replace/-/find-replace-3.0.0.tgz" integrity sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ== dependencies: array-back "^3.0.1" -find-up@3.0.0, find-up@^3.0.0: +find-up@^1.0.0: + version "1.1.2" + resolved "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz" + integrity sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA== + dependencies: + path-exists "^2.0.0" + pinkie-promise "^2.0.0" + +find-up@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz" + integrity sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ== + dependencies: + locate-path "^2.0.0" + +find-up@^3.0.0, find-up@3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" + resolved "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz" integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== dependencies: locate-path "^3.0.0" find-up@5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + resolved "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz" integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== dependencies: locate-path "^6.0.0" path-exists "^4.0.0" -find-up@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" - integrity sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ== - dependencies: - locate-path "^2.0.0" - flat@^4.1.0: version "4.1.1" - resolved "https://registry.yarnpkg.com/flat/-/flat-4.1.1.tgz#a392059cc382881ff98642f5da4dde0a959f309b" + resolved "https://registry.npmjs.org/flat/-/flat-4.1.1.tgz" integrity sha512-FmTtBsHskrU6FJ2VxCnsDb84wu9zhmO3cUX2kGFb5tuwhfXxGciiT0oRY+cck35QmG+NmGh5eLz6lLCpWTqwpA== dependencies: is-buffer "~2.0.3" flat@^5.0.2: version "5.0.2" - resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" + resolved "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz" integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== fmix@^0.1.0: version "0.1.0" - resolved "https://registry.yarnpkg.com/fmix/-/fmix-0.1.0.tgz#c7bbf124dec42c9d191cfb947d0a9778dd986c0c" + resolved "https://registry.npmjs.org/fmix/-/fmix-0.1.0.tgz" integrity sha512-Y6hyofImk9JdzU8k5INtTXX1cu8LDlePWDFU5sftm9H+zKCr5SGrVjdhkvsim646cw5zD0nADj8oHyXMZmCZ9w== dependencies: imul "^1.0.0" follow-redirects@^1.12.1, follow-redirects@^1.14.0: version "1.15.2" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13" + resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz" integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== for-each@^0.3.3: version "0.3.3" - resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" + resolved "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz" integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== dependencies: is-callable "^1.1.3" forever-agent@~0.6.1: version "0.6.1" - resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" + resolved "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz" integrity sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw== form-data@^2.2.0: version "2.5.1" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.5.1.tgz#f2cbec57b5e59e23716e128fe44d4e5dd23895f4" + resolved "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz" integrity sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA== dependencies: asynckit "^0.4.0" @@ -2789,7 +2932,7 @@ form-data@^2.2.0: form-data@^3.0.0: version "3.0.1" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.1.tgz#ebd53791b78356a99af9a300d4282c4d5eb9755f" + resolved "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz" integrity sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg== dependencies: asynckit "^0.4.0" @@ -2798,7 +2941,7 @@ form-data@^3.0.0: form-data@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" + resolved "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz" integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== dependencies: asynckit "^0.4.0" @@ -2807,26 +2950,21 @@ form-data@^4.0.0: form-data@~2.3.2: version "2.3.3" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" + resolved "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz" integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== dependencies: asynckit "^0.4.0" combined-stream "^1.0.6" mime-types "^2.1.12" -fp-ts@1.19.3: +fp-ts@^1.0.0, fp-ts@1.19.3: version "1.19.3" - resolved "https://registry.yarnpkg.com/fp-ts/-/fp-ts-1.19.3.tgz#261a60d1088fbff01f91256f91d21d0caaaaa96f" + resolved "https://registry.npmjs.org/fp-ts/-/fp-ts-1.19.3.tgz" integrity sha512-H5KQDspykdHuztLTg+ajGN0Z2qUjcEf3Ybxc6hLt0k7/zPkn29XnKnxlBPyW2XIddWrGaJBzBl4VLYOtk39yZg== -fp-ts@^1.0.0: - version "1.19.5" - resolved "https://registry.yarnpkg.com/fp-ts/-/fp-ts-1.19.5.tgz#3da865e585dfa1fdfd51785417357ac50afc520a" - integrity sha512-wDNqTimnzs8QqpldiId9OavWK2NptormjXnRJTQecNjzwfyp6P/8s/zG8e4h3ja3oqkKaY72UlTjQYt/1yXf9A== - fs-extra@^0.30.0: version "0.30.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-0.30.0.tgz#f233ffcc08d4da7d432daa449776989db1df93f0" + resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz" integrity sha512-UvSPKyhMn6LEd/WpUaV9C9t3zATuqoqfWc3QdPhPLb58prN9tqYPlPWi8Krxi44loBoUzlobqZ3+8tGpxxSzwA== dependencies: graceful-fs "^4.1.2" @@ -2837,7 +2975,7 @@ fs-extra@^0.30.0: fs-extra@^10.0.0: version "10.1.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf" + resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz" integrity sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ== dependencies: graceful-fs "^4.2.0" @@ -2846,7 +2984,7 @@ fs-extra@^10.0.0: fs-extra@^7.0.0, fs-extra@^7.0.1: version "7.0.1" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" + resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz" integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw== dependencies: graceful-fs "^4.1.2" @@ -2855,7 +2993,7 @@ fs-extra@^7.0.0, fs-extra@^7.0.1: fs-extra@^8.1.0: version "8.1.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" + resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz" integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== dependencies: graceful-fs "^4.2.0" @@ -2864,7 +3002,7 @@ fs-extra@^8.1.0: fs-extra@^9.1.0: version "9.1.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" + resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz" integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== dependencies: at-least-node "^1.0.0" @@ -2874,32 +3012,32 @@ fs-extra@^9.1.0: fs-readdir-recursive@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz#e32fc030a2ccee44a6b5371308da54be0b397d27" + resolved "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz" integrity sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA== fs.realpath@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== fsevents@~2.1.1: version "2.1.3" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.3.tgz#fb738703ae8d2f9fe900c33836ddebee8b97f23e" + resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz" integrity sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ== fsevents@~2.3.2: version "2.3.2" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" + resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz" integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== function-bind@^1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz" integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== function.prototype.name@^1.1.5: version "1.1.5" - resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.5.tgz#cce0505fe1ffb80503e6f9e46cc64e46a12a9621" + resolved "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz" integrity sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA== dependencies: call-bind "^1.0.2" @@ -2909,17 +3047,17 @@ function.prototype.name@^1.1.5: functional-red-black-tree@^1.0.1, functional-red-black-tree@~1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" + resolved "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz" integrity sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g== functions-have-names@^1.2.2, functions-have-names@^1.2.3: version "1.2.3" - resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" + resolved "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz" integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== ganache@7.4.3: version "7.4.3" - resolved "https://registry.yarnpkg.com/ganache/-/ganache-7.4.3.tgz#e995f1250697264efbb34d4241c374a2b0271415" + resolved "https://registry.npmjs.org/ganache/-/ganache-7.4.3.tgz" integrity sha512-RpEDUiCkqbouyE7+NMXG26ynZ+7sGiODU84Kz+FVoXUnQ4qQM4M8wif3Y4qUCt+D/eM1RVeGq0my62FPD6Y1KA== dependencies: "@trufflesuite/bigint-buffer" "1.1.10" @@ -2934,19 +3072,24 @@ ganache@7.4.3: bufferutil "4.0.5" utf-8-validate "5.0.7" +get-caller-file@^1.0.1: + version "1.0.3" + resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz" + integrity sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w== + get-caller-file@^2.0.1, get-caller-file@^2.0.5: version "2.0.5" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== get-func-name@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41" + resolved "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz" integrity sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig== get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.0: version "1.2.1" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.1.tgz#d295644fed4505fc9cde952c37ee12b477a83d82" + resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz" integrity sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw== dependencies: function-bind "^1.1.1" @@ -2956,12 +3099,12 @@ get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@ get-port@^3.1.0: version "3.2.0" - resolved "https://registry.yarnpkg.com/get-port/-/get-port-3.2.0.tgz#dd7ce7de187c06c8bf353796ac71e099f0980ebc" + resolved "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz" integrity sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg== get-symbol-description@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" + resolved "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz" integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== dependencies: call-bind "^1.0.2" @@ -2969,14 +3112,14 @@ get-symbol-description@^1.0.0: getpass@^0.1.1: version "0.1.7" - resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" + resolved "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz" integrity sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng== dependencies: assert-plus "^1.0.0" ghost-testrpc@^0.0.2: version "0.0.2" - resolved "https://registry.yarnpkg.com/ghost-testrpc/-/ghost-testrpc-0.0.2.tgz#c4de9557b1d1ae7b2d20bbe474a91378ca90ce92" + resolved "https://registry.npmjs.org/ghost-testrpc/-/ghost-testrpc-0.0.2.tgz" integrity sha512-i08dAEgJ2g8z5buJIrCTduwPIhih3DP+hOCTyyryikfV8T0bNvHnGXO67i0DD1H4GBDETTclPy9njZbfluQYrQ== dependencies: chalk "^2.4.2" @@ -2984,38 +3127,25 @@ ghost-testrpc@^0.0.2: glob-parent@^5.1.2, glob-parent@~5.1.0, glob-parent@~5.1.2: version "5.1.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== dependencies: is-glob "^4.0.1" -glob@7.1.3: - version "7.1.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" - integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - -glob@7.1.7: - version "7.1.7" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90" - integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ== +glob@^5.0.15: + version "5.0.15" + resolved "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz" + integrity sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA== dependencies: - fs.realpath "^1.0.0" inflight "^1.0.4" inherits "2" - minimatch "^3.0.4" + minimatch "2 || 3" once "^1.3.0" path-is-absolute "^1.0.0" -glob@7.2.0: +glob@^7.0.0, glob@^7.1.3, glob@7.2.0: version "7.2.0" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" + resolved "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz" integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== dependencies: fs.realpath "^1.0.0" @@ -3025,39 +3155,40 @@ glob@7.2.0: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^5.0.15: - version "5.0.15" - resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1" - integrity sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA== +glob@7.1.3: + version "7.1.3" + resolved "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz" + integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ== dependencies: + fs.realpath "^1.0.0" inflight "^1.0.4" inherits "2" - minimatch "2 || 3" + minimatch "^3.0.4" once "^1.3.0" path-is-absolute "^1.0.0" -glob@^7.0.0, glob@^7.1.3: - version "7.2.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" - integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== +glob@7.1.7: + version "7.1.7" + resolved "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz" + integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ== dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" inherits "2" - minimatch "^3.1.1" + minimatch "^3.0.4" once "^1.3.0" path-is-absolute "^1.0.0" global-modules@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-2.0.0.tgz#997605ad2345f27f51539bea26574421215c7780" + resolved "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz" integrity sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A== dependencies: global-prefix "^3.0.0" global-prefix@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-3.0.0.tgz#fc85f73064df69f50421f47f883fe5b913ba9b97" + resolved "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz" integrity sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg== dependencies: ini "^1.3.5" @@ -3066,14 +3197,14 @@ global-prefix@^3.0.0: globalthis@^1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.3.tgz#5852882a52b80dc301b0660273e1ed082f0b6ccf" + resolved "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz" integrity sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA== dependencies: define-properties "^1.1.3" globby@^10.0.1: version "10.0.2" - resolved "https://registry.yarnpkg.com/globby/-/globby-10.0.2.tgz#277593e745acaa4646c3ab411289ec47a0392543" + resolved "https://registry.npmjs.org/globby/-/globby-10.0.2.tgz" integrity sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg== dependencies: "@types/glob" "^7.1.1" @@ -3087,24 +3218,24 @@ globby@^10.0.1: gopd@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" + resolved "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz" integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== dependencies: get-intrinsic "^1.1.3" graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@^4.2.0: version "4.2.11" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz" integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== growl@1.10.5: version "1.10.5" - resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" + resolved "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz" integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA== handlebars@^4.0.1: version "4.7.7" - resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.7.tgz#9ce33416aad02dbd6c8fafa8240d5d98004945a1" + resolved "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz" integrity sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA== dependencies: minimist "^1.2.5" @@ -3116,12 +3247,12 @@ handlebars@^4.0.1: har-schema@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" + resolved "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz" integrity sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q== har-validator@~5.1.3: version "5.1.5" - resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.5.tgz#1f0803b9f8cb20c0fa13822df1ecddb36bde1efd" + resolved "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz" integrity sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w== dependencies: ajv "^6.12.3" @@ -3129,7 +3260,7 @@ har-validator@~5.1.3: hardhat-deploy@^0.11.34: version "0.11.36" - resolved "https://registry.yarnpkg.com/hardhat-deploy/-/hardhat-deploy-0.11.36.tgz#a0514267edb0b1405139487d889d17e7a91a9dce" + resolved "https://registry.npmjs.org/hardhat-deploy/-/hardhat-deploy-0.11.36.tgz" integrity sha512-xsegyeI+zYo858rLB09tk/GqlJ4PV5Pr2zbncAhL60WntichKrtizxRchZUr/F7J6ljUYAzTDchNKb5wIYcQqg== dependencies: "@ethersproject/abi" "^5.7.0" @@ -3159,16 +3290,16 @@ hardhat-deploy@^0.11.34: hardhat-gas-reporter@^1.0.8: version "1.0.9" - resolved "https://registry.yarnpkg.com/hardhat-gas-reporter/-/hardhat-gas-reporter-1.0.9.tgz#9a2afb354bc3b6346aab55b1c02ca556d0e16450" + resolved "https://registry.npmjs.org/hardhat-gas-reporter/-/hardhat-gas-reporter-1.0.9.tgz" integrity sha512-INN26G3EW43adGKBNzYWOlI3+rlLnasXTwW79YNnUhXPDa+yHESgt639dJEs37gCjhkbNKcRRJnomXEuMFBXJg== dependencies: array-uniq "1.0.3" eth-gas-reporter "^0.2.25" sha1 "^1.1.1" -hardhat@^2.12.6: +hardhat@^2.0.0, hardhat@^2.0.2, hardhat@^2.0.4, hardhat@^2.11.0, hardhat@^2.12.6, hardhat@^2.9.4, hardhat@^2.9.5, hardhat@^2.9.9: version "2.16.1" - resolved "https://registry.yarnpkg.com/hardhat/-/hardhat-2.16.1.tgz#fd2288ce44f6846a70ba332b3d8158522447262a" + resolved "https://registry.npmjs.org/hardhat/-/hardhat-2.16.1.tgz" integrity sha512-QpBjGXFhhSYoYBGEHyoau/A63crZOP+i3GbNxzLGkL6IklzT+piN14+wGnINNCg5BLSKisQI/RAySPzaWRcx/g== dependencies: "@ethersproject/abi" "^5.1.2" @@ -3223,107 +3354,107 @@ hardhat@^2.12.6: has-bigints@^1.0.1, has-bigints@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" + resolved "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz" integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== has-flag@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz" integrity sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA== has-flag@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz" integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== has-flag@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== has-property-descriptors@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz#610708600606d36961ed04c196193b6a607fa861" + resolved "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz" integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ== dependencies: get-intrinsic "^1.1.1" has-proto@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.1.tgz#1885c1305538958aff469fef37937c22795408e0" + resolved "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz" integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg== has-symbols@^1.0.0, has-symbols@^1.0.2, has-symbols@^1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" + resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz" integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== has-tostringtag@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" + resolved "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz" integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== dependencies: has-symbols "^1.0.2" has@^1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + resolved "https://registry.npmjs.org/has/-/has-1.0.3.tgz" integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== dependencies: function-bind "^1.1.1" hash-base@^3.0.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.1.0.tgz#55c381d9e06e1d2997a883b4a3fddfe7f0d3af33" + resolved "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz" integrity sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA== dependencies: inherits "^2.0.4" readable-stream "^3.6.0" safe-buffer "^5.2.0" +hash.js@^1.0.0, hash.js@^1.0.3, hash.js@^1.1.7, hash.js@1.1.7: + version "1.1.7" + resolved "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz" + integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== + dependencies: + inherits "^2.0.3" + minimalistic-assert "^1.0.1" + hash.js@1.1.3: version "1.1.3" - resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.3.tgz#340dedbe6290187151c1ea1d777a3448935df846" + resolved "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz" integrity sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA== dependencies: inherits "^2.0.3" minimalistic-assert "^1.0.0" -hash.js@1.1.7, hash.js@^1.0.0, hash.js@^1.0.3, hash.js@^1.1.7: - version "1.1.7" - resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" - integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== - dependencies: - inherits "^2.0.3" - minimalistic-assert "^1.0.1" - he@1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" + resolved "https://registry.npmjs.org/he/-/he-1.2.0.tgz" integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== "heap@>= 0.2.0": version "0.2.7" - resolved "https://registry.yarnpkg.com/heap/-/heap-0.2.7.tgz#1e6adf711d3f27ce35a81fe3b7bd576c2260a8fc" + resolved "https://registry.npmjs.org/heap/-/heap-0.2.7.tgz" integrity sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg== hmac-drbg@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" + resolved "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz" integrity sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg== dependencies: hash.js "^1.0.3" minimalistic-assert "^1.0.0" minimalistic-crypto-utils "^1.0.1" -hosted-git-info@^2.6.0: +hosted-git-info@^2.1.4, hosted-git-info@^2.6.0: version "2.8.9" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" + resolved "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz" integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== http-basic@^8.1.1: version "8.1.3" - resolved "https://registry.yarnpkg.com/http-basic/-/http-basic-8.1.3.tgz#a7cabee7526869b9b710136970805b1004261bbf" + resolved "https://registry.npmjs.org/http-basic/-/http-basic-8.1.3.tgz" integrity sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw== dependencies: caseless "^0.12.0" @@ -3333,7 +3464,7 @@ http-basic@^8.1.1: http-errors@2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" + resolved "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz" integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== dependencies: depd "2.0.0" @@ -3344,14 +3475,14 @@ http-errors@2.0.0: http-response-object@^3.0.1: version "3.0.2" - resolved "https://registry.yarnpkg.com/http-response-object/-/http-response-object-3.0.2.tgz#7f435bb210454e4360d074ef1f989d5ea8aa9810" + resolved "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz" integrity sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA== dependencies: "@types/node" "^10.0.3" http-signature@~1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" + resolved "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz" integrity sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ== dependencies: assert-plus "^1.0.0" @@ -3360,7 +3491,7 @@ http-signature@~1.2.0: https-proxy-agent@^5.0.0: version "5.0.1" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" + resolved "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz" integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== dependencies: agent-base "6" @@ -3368,67 +3499,74 @@ https-proxy-agent@^5.0.0: iconv-lite@0.4.24: version "0.4.24" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz" integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== dependencies: safer-buffer ">= 2.1.2 < 3" +idna-uts46-hx@^2.3.1: + version "2.3.1" + resolved "https://registry.npmjs.org/idna-uts46-hx/-/idna-uts46-hx-2.3.1.tgz" + integrity sha512-PWoF9Keq6laYdIRwwCdhTPl60xRqAloYNMQLiyUnG42VjT53oW07BXIRM+NK7eQjzXjAk2gUvX9caRxlnF9TAA== + dependencies: + punycode "2.1.0" + ieee754@^1.1.13, ieee754@^1.2.1: version "1.2.1" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + resolved "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== ignore@^5.1.1: version "5.2.4" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324" + resolved "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz" integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== immediate@^3.2.3: version "3.3.0" - resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.3.0.tgz#1aef225517836bcdf7f2a2de2600c79ff0269266" + resolved "https://registry.npmjs.org/immediate/-/immediate-3.3.0.tgz" integrity sha512-HR7EVodfFUdQCTIeySw+WDRFJlPcLOJbXfwwZ7Oom6tjsvZ3bOkCDJHehQC3nxJrv7+f9XecwazynjU8e4Vw3Q== immediate@~3.2.3: version "3.2.3" - resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.2.3.tgz#d140fa8f614659bd6541233097ddaac25cdd991c" + resolved "https://registry.npmjs.org/immediate/-/immediate-3.2.3.tgz" integrity sha512-RrGCXRm/fRVqMIhqXrGEX9rRADavPiDFSoMb/k64i9XMk8uH4r/Omi5Ctierj6XzNecwDbO4WuFbDD1zmpl3Tg== immutable@^4.0.0-rc.12: version "4.3.0" - resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.3.0.tgz#eb1738f14ffb39fd068b1dbe1296117484dd34be" + resolved "https://registry.npmjs.org/immutable/-/immutable-4.3.0.tgz" integrity sha512-0AOCmOip+xgJwEVTQj1EfiDDOkPmuyllDuTuEX+DDXUgapLAsBIfkg3sxCYyCEA8mQqZrrxPUGjcOQ2JS3WLkg== imul@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/imul/-/imul-1.0.1.tgz#9d5867161e8b3de96c2c38d5dc7cb102f35e2ac9" + resolved "https://registry.npmjs.org/imul/-/imul-1.0.1.tgz" integrity sha512-WFAgfwPLAjU66EKt6vRdTlKj4nAgIDQzh29JonLa4Bqtl6D8JrIMvWjCnx7xEjVNmP3U0fM5o8ZObk7d0f62bA== indent-string@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" + resolved "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz" integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== inflight@^1.0.4: version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== dependencies: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3: +inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3, inherits@2, inherits@2.0.4: version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== ini@^1.3.5: version "1.3.8" - resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" + resolved "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz" integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== internal-slot@^1.0.5: version "1.0.5" - resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.5.tgz#f2a2ee21f668f8627a4667f309dc0f4fb6674986" + resolved "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz" integrity sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ== dependencies: get-intrinsic "^1.2.0" @@ -3437,42 +3575,52 @@ internal-slot@^1.0.5: interpret@^1.0.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e" + resolved "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz" integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA== +invert-kv@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz" + integrity sha512-xgs2NH9AE66ucSq4cNG1nhSFghr5l6tdL15Pk+jl46bmmBapgoaY/AacXyaDznAqmGL99TiLSQgO/XazFSKYeQ== + io-ts@1.10.4: version "1.10.4" - resolved "https://registry.yarnpkg.com/io-ts/-/io-ts-1.10.4.tgz#cd5401b138de88e4f920adbcb7026e2d1967e6e2" + resolved "https://registry.npmjs.org/io-ts/-/io-ts-1.10.4.tgz" integrity sha512-b23PteSnYXSONJ6JQXRAlvJhuw8KOtkqa87W4wDtvMrud/DTJd5X+NpOOI+O/zZwVq6v0VLAaJ+1EDViKEuN9g== dependencies: fp-ts "^1.0.0" is-array-buffer@^3.0.1, is-array-buffer@^3.0.2: version "3.0.2" - resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.2.tgz#f2653ced8412081638ecb0ebbd0c41c6e0aecbbe" + resolved "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz" integrity sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w== dependencies: call-bind "^1.0.2" get-intrinsic "^1.2.0" is-typed-array "^1.1.10" +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz" + integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== + is-bigint@^1.0.1: version "1.0.4" - resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" + resolved "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz" integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== dependencies: has-bigints "^1.0.1" is-binary-path@~2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + resolved "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz" integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== dependencies: binary-extensions "^2.0.0" is-boolean-object@^1.1.0: version "1.1.2" - resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" + resolved "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz" integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== dependencies: call-bind "^1.0.2" @@ -3480,80 +3628,80 @@ is-boolean-object@^1.1.0: is-buffer@^2.0.5, is-buffer@~2.0.3: version "2.0.5" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191" + resolved "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz" integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: version "1.2.7" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" + resolved "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz" integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== -is-core-module@^2.11.0: - version "2.12.1" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.12.1.tgz#0c0b6885b6f80011c71541ce15c8d66cf5a4f9fd" - integrity sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg== - dependencies: - has "^1.0.3" - is-date-object@^1.0.1: version "1.0.5" - resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" + resolved "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz" integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== dependencies: has-tostringtag "^1.0.0" is-extglob@^2.1.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== +is-fullwidth-code-point@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz" + integrity sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw== + dependencies: + number-is-nan "^1.0.0" + is-fullwidth-code-point@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz" integrity sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w== is-fullwidth-code-point@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz" integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== is-glob@^4.0.1, is-glob@~4.0.1: version "4.0.3" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== dependencies: is-extglob "^2.1.1" is-hex-prefixed@1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz#7d8d37e6ad77e5d127148913c573e082d777f554" + resolved "https://registry.npmjs.org/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz" integrity sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA== is-negative-zero@^2.0.2: version "2.0.2" - resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" + resolved "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz" integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== is-number-object@^1.0.4: version "1.0.7" - resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" + resolved "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz" integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== dependencies: has-tostringtag "^1.0.0" is-number@^7.0.0: version "7.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== is-plain-obj@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" + resolved "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz" integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== is-regex@^1.1.4: version "1.1.4" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" + resolved "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz" integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== dependencies: call-bind "^1.0.2" @@ -3561,28 +3709,28 @@ is-regex@^1.1.4: is-shared-array-buffer@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz#8f259c573b60b6a32d4058a1a07430c0a7344c79" + resolved "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz" integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA== dependencies: call-bind "^1.0.2" is-string@^1.0.5, is-string@^1.0.7: version "1.0.7" - resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" + resolved "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz" integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== dependencies: has-tostringtag "^1.0.0" is-symbol@^1.0.2, is-symbol@^1.0.3: version "1.0.4" - resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" + resolved "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz" integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== dependencies: has-symbols "^1.0.2" is-typed-array@^1.1.10, is-typed-array@^1.1.9: version "1.1.10" - resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.10.tgz#36a5b5cb4189b575d1a3e4b08536bfb485801e3f" + resolved "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz" integrity sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A== dependencies: available-typed-arrays "^1.0.5" @@ -3593,64 +3741,74 @@ is-typed-array@^1.1.10, is-typed-array@^1.1.9: is-typedarray@~1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + resolved "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz" integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA== is-unicode-supported@^0.1.0: version "0.1.0" - resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" + resolved "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz" integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== is-url@^1.2.4: version "1.2.4" - resolved "https://registry.yarnpkg.com/is-url/-/is-url-1.2.4.tgz#04a4df46d28c4cff3d73d01ff06abeb318a1aa52" + resolved "https://registry.npmjs.org/is-url/-/is-url-1.2.4.tgz" integrity sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww== +is-utf8@^0.2.0: + version "0.2.1" + resolved "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz" + integrity sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q== + is-weakref@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" + resolved "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz" integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== dependencies: call-bind "^1.0.2" isarray@^2.0.5: version "2.0.5" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" + resolved "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz" integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== isarray@~1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + resolved "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== isexe@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== isstream@~0.1.2: version "0.1.2" - resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + resolved "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz" integrity sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g== js-sdsl@^4.1.4: version "4.4.1" - resolved "https://registry.yarnpkg.com/js-sdsl/-/js-sdsl-4.4.1.tgz#9e3c7b566d8d9a7e1fe8fc26d00b5ab0f8918ab3" + resolved "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.4.1.tgz" integrity sha512-6Gsx8R0RucyePbWqPssR8DyfuXmLBooYN5cZFZKjHGnQuaf7pEzhtpceagJxVu4LqhYY5EYA7nko3FmeHZ1KbA== -js-sha3@0.5.7: +js-sha3@^0.5.7: version "0.5.7" - resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.5.7.tgz#0d4ffd8002d5333aabaf4a23eed2f6374c9f28e7" + resolved "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz" integrity sha512-GII20kjaPX0zJ8wzkTbNDYMY7msuZcTWk8S5UOh6806Jq/wz1J8/bnr8uGU0DAUmYDjj2Mr4X1cW8v/GLYnR+g== -js-sha3@0.8.0, js-sha3@^0.8.0: +js-sha3@^0.8.0, js-sha3@0.8.0: version "0.8.0" - resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.8.0.tgz#b9b7a5da73afad7dedd0f8c463954cbde6818840" + resolved "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz" integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q== +js-sha3@0.5.7: + version "0.5.7" + resolved "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz" + integrity sha512-GII20kjaPX0zJ8wzkTbNDYMY7msuZcTWk8S5UOh6806Jq/wz1J8/bnr8uGU0DAUmYDjj2Mr4X1cW8v/GLYnR+g== + js-yaml@3.13.1: version "3.13.1" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" + resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz" integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== dependencies: argparse "^1.0.7" @@ -3658,7 +3816,7 @@ js-yaml@3.13.1: js-yaml@3.x: version "3.14.1" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" + resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz" integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== dependencies: argparse "^1.0.7" @@ -3666,60 +3824,60 @@ js-yaml@3.x: js-yaml@4.1.0: version "4.1.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz" integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== dependencies: argparse "^2.0.1" jsbn@~0.1.0: version "0.1.1" - resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" + resolved "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz" integrity sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg== json-bigint@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/json-bigint/-/json-bigint-1.0.0.tgz#ae547823ac0cad8398667f8cd9ef4730f5b01ff1" + resolved "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz" integrity sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ== dependencies: bignumber.js "^9.0.0" json-schema-traverse@^0.4.1: version "0.4.1" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz" integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== json-schema-traverse@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" + resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz" integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== json-schema@0.4.0: version "0.4.0" - resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.4.0.tgz#f7de4cf6efab838ebaeb3236474cbba5a1930ab5" + resolved "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz" integrity sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA== json-stringify-safe@~5.0.1: version "5.0.1" - resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + resolved "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz" integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA== jsonfile@^2.1.0: version "2.4.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8" + resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz" integrity sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw== optionalDependencies: graceful-fs "^4.1.6" jsonfile@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" + resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz" integrity sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg== optionalDependencies: graceful-fs "^4.1.6" jsonfile@^6.0.1: version "6.1.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" + resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz" integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== dependencies: universalify "^2.0.0" @@ -3728,12 +3886,12 @@ jsonfile@^6.0.1: jsonschema@^1.2.4: version "1.4.1" - resolved "https://registry.yarnpkg.com/jsonschema/-/jsonschema-1.4.1.tgz#cc4c3f0077fb4542982973d8a083b6b34f482dab" + resolved "https://registry.npmjs.org/jsonschema/-/jsonschema-1.4.1.tgz" integrity sha512-S6cATIPVv1z0IlxdN+zUk5EPjkGCdnhN4wVSBlvoUO1tOLJootbo9CquNJmbIh4yikWHiUedhRYrNPn1arpEmQ== jsprim@^1.2.2: version "1.4.2" - resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.2.tgz#712c65533a15c878ba59e9ed5f0e26d5b77c5feb" + resolved "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz" integrity sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw== dependencies: assert-plus "1.0.0" @@ -3741,27 +3899,27 @@ jsprim@^1.2.2: json-schema "0.4.0" verror "1.10.0" -keccak@3.0.1: +keccak@^3.0.0, keccak@3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/keccak/-/keccak-3.0.1.tgz#ae30a0e94dbe43414f741375cff6d64c8bea0bff" + resolved "https://registry.npmjs.org/keccak/-/keccak-3.0.1.tgz" integrity sha512-epq90L9jlFWCW7+pQa6JOnKn2Xgl2mtI664seYR6MHskvI9agt7AnDqmAlp9TqU4/caMYbA08Hi5DMZAl5zdkA== dependencies: node-addon-api "^2.0.0" node-gyp-build "^4.2.0" -keccak@3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/keccak/-/keccak-3.0.2.tgz#4c2c6e8c54e04f2670ee49fa734eb9da152206e0" - integrity sha512-PyKKjkH53wDMLGrvmRGSNWgmSxZOUqbnXwKL9tmgbFYA1iAYqW21kfR7mZXV0MlESiefxQQE9X9fTa3X+2MPDQ== +keccak@^3.0.2: + version "3.0.3" + resolved "https://registry.npmjs.org/keccak/-/keccak-3.0.3.tgz" + integrity sha512-JZrLIAJWuZxKbCilMpNz5Vj7Vtb4scDG3dMXLOsbzBmQGyjwE61BbW7bJkfKKCShXiQZt3T6sBgALRtmd+nZaQ== dependencies: node-addon-api "^2.0.0" node-gyp-build "^4.2.0" readable-stream "^3.6.0" -keccak@^3.0.0, keccak@^3.0.2: - version "3.0.3" - resolved "https://registry.yarnpkg.com/keccak/-/keccak-3.0.3.tgz#4bc35ad917be1ef54ff246f904c2bbbf9ac61276" - integrity sha512-JZrLIAJWuZxKbCilMpNz5Vj7Vtb4scDG3dMXLOsbzBmQGyjwE61BbW7bJkfKKCShXiQZt3T6sBgALRtmd+nZaQ== +keccak@3.0.2: + version "3.0.2" + resolved "https://registry.npmjs.org/keccak/-/keccak-3.0.2.tgz" + integrity sha512-PyKKjkH53wDMLGrvmRGSNWgmSxZOUqbnXwKL9tmgbFYA1iAYqW21kfR7mZXV0MlESiefxQQE9X9fTa3X+2MPDQ== dependencies: node-addon-api "^2.0.0" node-gyp-build "^4.2.0" @@ -3769,45 +3927,52 @@ keccak@^3.0.0, keccak@^3.0.2: kind-of@^6.0.2: version "6.0.3" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" + resolved "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz" integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== klaw@^1.0.0: version "1.3.1" - resolved "https://registry.yarnpkg.com/klaw/-/klaw-1.3.1.tgz#4088433b46b3b1ba259d78785d8e96f73ba02439" + resolved "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz" integrity sha512-TED5xi9gGQjGpNnvRWknrwAB1eL5GciPfVFOt3Vk1OJCVDQbzuSfrF3hkUQKlsgKrG1F+0t5W0m+Fje1jIt8rw== optionalDependencies: graceful-fs "^4.1.9" +lcid@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz" + integrity sha512-YiGkH6EnGrDGqLMITnGjXtGmNtjoXw9SVUzcaos8RBi7Ps0VBylkq+vOcY9QE5poLasPCR849ucFUkl0UzUyOw== + dependencies: + invert-kv "^1.0.0" + level-codec@^9.0.0: version "9.0.2" - resolved "https://registry.yarnpkg.com/level-codec/-/level-codec-9.0.2.tgz#fd60df8c64786a80d44e63423096ffead63d8cbc" + resolved "https://registry.npmjs.org/level-codec/-/level-codec-9.0.2.tgz" integrity sha512-UyIwNb1lJBChJnGfjmO0OR+ezh2iVu1Kas3nvBS/BzGnx79dv6g7unpKIDNPMhfdTEGoc7mC8uAu51XEtX+FHQ== dependencies: buffer "^5.6.0" level-concat-iterator@^3.0.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/level-concat-iterator/-/level-concat-iterator-3.1.0.tgz#5235b1f744bc34847ed65a50548aa88d22e881cf" + resolved "https://registry.npmjs.org/level-concat-iterator/-/level-concat-iterator-3.1.0.tgz" integrity sha512-BWRCMHBxbIqPxJ8vHOvKUsaO0v1sLYZtjN3K2iZJsRBYtp+ONsY6Jfi6hy9K3+zolgQRryhIn2NRZjZnWJ9NmQ== dependencies: catering "^2.1.0" level-concat-iterator@~2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/level-concat-iterator/-/level-concat-iterator-2.0.1.tgz#1d1009cf108340252cb38c51f9727311193e6263" + resolved "https://registry.npmjs.org/level-concat-iterator/-/level-concat-iterator-2.0.1.tgz" integrity sha512-OTKKOqeav2QWcERMJR7IS9CUo1sHnke2C0gkSmcR7QuEtFNLLzHQAvnMw8ykvEcv0Qtkg0p7FOwP1v9e5Smdcw== level-errors@^2.0.0, level-errors@~2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/level-errors/-/level-errors-2.0.1.tgz#2132a677bf4e679ce029f517c2f17432800c05c8" + resolved "https://registry.npmjs.org/level-errors/-/level-errors-2.0.1.tgz" integrity sha512-UVprBJXite4gPS+3VznfgDSU8PTRuVX0NXwoWW50KLxd2yw4Y1t2JUR5In1itQnudZqRMT9DlAM3Q//9NCjCFw== dependencies: errno "~0.1.1" level-iterator-stream@~4.0.0: version "4.0.2" - resolved "https://registry.yarnpkg.com/level-iterator-stream/-/level-iterator-stream-4.0.2.tgz#7ceba69b713b0d7e22fcc0d1f128ccdc8a24f79c" + resolved "https://registry.npmjs.org/level-iterator-stream/-/level-iterator-stream-4.0.2.tgz" integrity sha512-ZSthfEqzGSOMWoUGhTXdX9jv26d32XJuHz/5YnuHZzH6wldfWMOVwI9TBtKcya4BKTyTt3XVA0A3cF3q5CY30Q== dependencies: inherits "^2.0.4" @@ -3816,7 +3981,7 @@ level-iterator-stream@~4.0.0: level-mem@^5.0.1: version "5.0.1" - resolved "https://registry.yarnpkg.com/level-mem/-/level-mem-5.0.1.tgz#c345126b74f5b8aa376dc77d36813a177ef8251d" + resolved "https://registry.npmjs.org/level-mem/-/level-mem-5.0.1.tgz" integrity sha512-qd+qUJHXsGSFoHTziptAKXoLX87QjR7v2KMbqncDXPxQuCdsQlzmyX+gwrEHhlzn08vkf8TyipYyMmiC6Gobzg== dependencies: level-packager "^5.0.3" @@ -3824,7 +3989,7 @@ level-mem@^5.0.1: level-packager@^5.0.3: version "5.1.1" - resolved "https://registry.yarnpkg.com/level-packager/-/level-packager-5.1.1.tgz#323ec842d6babe7336f70299c14df2e329c18939" + resolved "https://registry.npmjs.org/level-packager/-/level-packager-5.1.1.tgz" integrity sha512-HMwMaQPlTC1IlcwT3+swhqf/NUO+ZhXVz6TY1zZIIZlIR0YSn8GtAAWmIvKjNY16ZkEg/JcpAuQskxsXqC0yOQ== dependencies: encoding-down "^6.3.0" @@ -3832,24 +3997,24 @@ level-packager@^5.0.3: level-supports@^2.0.1: version "2.1.0" - resolved "https://registry.yarnpkg.com/level-supports/-/level-supports-2.1.0.tgz#9af908d853597ecd592293b2fad124375be79c5f" + resolved "https://registry.npmjs.org/level-supports/-/level-supports-2.1.0.tgz" integrity sha512-E486g1NCjW5cF78KGPrMDRBYzPuueMZ6VBXHT6gC7A8UYWGiM14fGgp+s/L1oFfDWSPV/+SFkYCmZ0SiESkRKA== level-supports@^4.0.0: version "4.0.1" - resolved "https://registry.yarnpkg.com/level-supports/-/level-supports-4.0.1.tgz#431546f9d81f10ff0fea0e74533a0e875c08c66a" + resolved "https://registry.npmjs.org/level-supports/-/level-supports-4.0.1.tgz" integrity sha512-PbXpve8rKeNcZ9C1mUicC9auIYFyGpkV9/i6g76tLgANwWhtG2v7I4xNBUlkn3lE2/dZF3Pi0ygYGtLc4RXXdA== level-supports@~1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/level-supports/-/level-supports-1.0.1.tgz#2f530a596834c7301622521988e2c36bb77d122d" + resolved "https://registry.npmjs.org/level-supports/-/level-supports-1.0.1.tgz" integrity sha512-rXM7GYnW8gsl1vedTJIbzOrRv85c/2uCMpiiCzO2fndd06U/kUXEEU9evYn4zFggBOg36IsBW8LzqIpETwwQzg== dependencies: xtend "^4.0.2" level-transcoder@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/level-transcoder/-/level-transcoder-1.0.1.tgz#f8cef5990c4f1283d4c86d949e73631b0bc8ba9c" + resolved "https://registry.npmjs.org/level-transcoder/-/level-transcoder-1.0.1.tgz" integrity sha512-t7bFwFtsQeD8cl8NIoQ2iwxA0CL/9IFw7/9gAjOonH0PWTTiRfY7Hq+Ejbsxh86tXobDQ6IOiddjNYIfOBs06w== dependencies: buffer "^6.0.3" @@ -3857,7 +4022,7 @@ level-transcoder@^1.0.1: level-ws@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/level-ws/-/level-ws-2.0.0.tgz#207a07bcd0164a0ec5d62c304b4615c54436d339" + resolved "https://registry.npmjs.org/level-ws/-/level-ws-2.0.0.tgz" integrity sha512-1iv7VXx0G9ec1isqQZ7y5LmoZo/ewAsyDHNA8EFDW5hqH2Kqovm33nSFkSdnLLAK+I5FlT+lo5Cw9itGe+CpQA== dependencies: inherits "^2.0.3" @@ -3866,7 +4031,7 @@ level-ws@^2.0.0: level@^8.0.0: version "8.0.0" - resolved "https://registry.yarnpkg.com/level/-/level-8.0.0.tgz#41b4c515dabe28212a3e881b61c161ffead14394" + resolved "https://registry.npmjs.org/level/-/level-8.0.0.tgz" integrity sha512-ypf0jjAk2BWI33yzEaaotpq7fkOPALKAgDBxggO6Q9HGX2MRXn0wbP1Jn/tJv1gtL867+YOjOB49WaUF3UoJNQ== dependencies: browser-level "^1.0.1" @@ -3874,7 +4039,7 @@ level@^8.0.0: leveldown@6.1.0: version "6.1.0" - resolved "https://registry.yarnpkg.com/leveldown/-/leveldown-6.1.0.tgz#7ab1297706f70c657d1a72b31b40323aa612b9ee" + resolved "https://registry.npmjs.org/leveldown/-/leveldown-6.1.0.tgz" integrity sha512-8C7oJDT44JXxh04aSSsfcMI8YiaGRhOFI9/pMEL7nWJLVsWajDPTRxsSHTM2WcTVY5nXM+SuRHzPPi0GbnDX+w== dependencies: abstract-leveldown "^7.2.0" @@ -3883,7 +4048,7 @@ leveldown@6.1.0: levelup@^4.3.2: version "4.4.0" - resolved "https://registry.yarnpkg.com/levelup/-/levelup-4.4.0.tgz#f89da3a228c38deb49c48f88a70fb71f01cafed6" + resolved "https://registry.npmjs.org/levelup/-/levelup-4.4.0.tgz" integrity sha512-94++VFO3qN95cM/d6eBXvd894oJE0w3cInq9USsyQzzoJxmiYzPAocNcuGCPGGjoXqDVJcr3C1jzt1TSjyaiLQ== dependencies: deferred-leveldown "~5.3.0" @@ -3894,15 +4059,26 @@ levelup@^4.3.2: levn@~0.3.0: version "0.3.0" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" + resolved "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz" integrity sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA== dependencies: prelude-ls "~1.1.2" type-check "~0.3.2" +load-json-file@^1.0.0: + version "1.1.0" + resolved "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz" + integrity sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A== + dependencies: + graceful-fs "^4.1.2" + parse-json "^2.2.0" + pify "^2.0.0" + pinkie-promise "^2.0.0" + strip-bom "^2.0.0" + locate-path@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz" integrity sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA== dependencies: p-locate "^2.0.0" @@ -3910,7 +4086,7 @@ locate-path@^2.0.0: locate-path@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz" integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== dependencies: p-locate "^3.0.0" @@ -3918,41 +4094,46 @@ locate-path@^3.0.0: locate-path@^6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz" integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== dependencies: p-locate "^5.0.0" +lodash.assign@^4.0.3, lodash.assign@^4.0.6: + version "4.2.0" + resolved "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz" + integrity sha512-hFuH8TY+Yji7Eja3mGiuAxBqLagejScbG8GbG0j6o9vzn0YL14My+ktnqtZgFTosKymC9/44wP6s7xyuLfnClw== + lodash.camelcase@^4.3.0: version "4.3.0" - resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" + resolved "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz" integrity sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA== lodash.clonedeep@^4.5.0: version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" + resolved "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz" integrity sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ== lodash.truncate@^4.4.2: version "4.4.2" - resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193" + resolved "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz" integrity sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw== lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.21: version "4.17.21" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== log-symbols@3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-3.0.0.tgz#f3a08516a5dea893336a7dee14d18a1cfdab77c4" + resolved "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz" integrity sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ== dependencies: chalk "^2.4.2" log-symbols@4.1.0: version "4.1.0" - resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" + resolved "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz" integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== dependencies: chalk "^4.1.0" @@ -3960,58 +4141,58 @@ log-symbols@4.1.0: loupe@^2.3.1: version "2.3.6" - resolved "https://registry.yarnpkg.com/loupe/-/loupe-2.3.6.tgz#76e4af498103c532d1ecc9be102036a21f787b53" + resolved "https://registry.npmjs.org/loupe/-/loupe-2.3.6.tgz" integrity sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA== dependencies: get-func-name "^2.0.0" +lru_map@^0.3.3: + version "0.3.3" + resolved "https://registry.npmjs.org/lru_map/-/lru_map-0.3.3.tgz" + integrity sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ== + lru-cache@^5.1.1: version "5.1.1" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz" integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== dependencies: yallist "^3.0.2" lru-cache@^6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz" integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== dependencies: yallist "^4.0.0" -lru_map@^0.3.3: - version "0.3.3" - resolved "https://registry.yarnpkg.com/lru_map/-/lru_map-0.3.3.tgz#b5c8351b9464cbd750335a79650a0ec0e56118dd" - integrity sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ== - ltgt@~2.2.0: version "2.2.1" - resolved "https://registry.yarnpkg.com/ltgt/-/ltgt-2.2.1.tgz#f35ca91c493f7b73da0e07495304f17b31f87ee5" + resolved "https://registry.npmjs.org/ltgt/-/ltgt-2.2.1.tgz" integrity sha512-AI2r85+4MquTw9ZYqabu4nMwy9Oftlfa/e/52t9IjtfG+mGBbTNdAoZ3RQKLHR6r0wQnwZnPIEh/Ya6XTWAKNA== make-error@^1.1.1: version "1.3.6" - resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" + resolved "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz" integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== markdown-table@^1.1.3: version "1.1.3" - resolved "https://registry.yarnpkg.com/markdown-table/-/markdown-table-1.1.3.tgz#9fcb69bcfdb8717bfd0398c6ec2d93036ef8de60" + resolved "https://registry.npmjs.org/markdown-table/-/markdown-table-1.1.3.tgz" integrity sha512-1RUZVgQlpJSPWYbFSpmudq5nHY1doEIv89gBtF0s4gW1GF2XorxcA/70M5vq7rLv0a6mhOUccRsqkwhwLCIQ2Q== match-all@^1.2.6: version "1.2.6" - resolved "https://registry.yarnpkg.com/match-all/-/match-all-1.2.6.tgz#66d276ad6b49655551e63d3a6ee53e8be0566f8d" + resolved "https://registry.npmjs.org/match-all/-/match-all-1.2.6.tgz" integrity sha512-0EESkXiTkWzrQQntBu2uzKvLu6vVkUGz40nGPbSZuegcfE5UuSzNjLaIu76zJWuaT/2I3Z/8M06OlUOZLGwLlQ== mcl-wasm@^0.7.1: version "0.7.9" - resolved "https://registry.yarnpkg.com/mcl-wasm/-/mcl-wasm-0.7.9.tgz#c1588ce90042a8700c3b60e40efb339fc07ab87f" + resolved "https://registry.npmjs.org/mcl-wasm/-/mcl-wasm-0.7.9.tgz" integrity sha512-iJIUcQWA88IJB/5L15GnJVnSQJmf/YaxxV6zRavv83HILHaJQb6y0iFyDMdDO0gN8X37tdxmAOrH/P8B6RB8sQ== md5.js@^1.3.4: version "1.3.5" - resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" + resolved "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz" integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== dependencies: hash-base "^3.0.0" @@ -4020,7 +4201,7 @@ md5.js@^1.3.4: memdown@^5.0.0: version "5.1.0" - resolved "https://registry.yarnpkg.com/memdown/-/memdown-5.1.0.tgz#608e91a9f10f37f5b5fe767667a8674129a833cb" + resolved "https://registry.npmjs.org/memdown/-/memdown-5.1.0.tgz" integrity sha512-B3J+UizMRAlEArDjWHTMmadet+UKwHd3UjMgGBkZcKAxAYVPS9o0Yeiha4qvz7iGiL2Sb3igUft6p7nbFWctpw== dependencies: abstract-leveldown "~6.2.1" @@ -4032,7 +4213,7 @@ memdown@^5.0.0: memory-level@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/memory-level/-/memory-level-1.0.0.tgz#7323c3fd368f9af2f71c3cd76ba403a17ac41692" + resolved "https://registry.npmjs.org/memory-level/-/memory-level-1.0.0.tgz" integrity sha512-UXzwewuWeHBz5krr7EvehKcmLFNoXxGcvuYhC41tRnkrTbJohtS7kVn9akmgirtRygg+f7Yjsfi8Uu5SGSQ4Og== dependencies: abstract-level "^1.0.0" @@ -4041,17 +4222,17 @@ memory-level@^1.0.0: memorystream@^0.3.1: version "0.3.1" - resolved "https://registry.yarnpkg.com/memorystream/-/memorystream-0.3.1.tgz#86d7090b30ce455d63fbae12dda51a47ddcaf9b2" + resolved "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz" integrity sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw== merge2@^1.2.3, merge2@^1.3.0: version "1.4.1" - resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + resolved "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== merkle-patricia-tree@^4.2.2, merkle-patricia-tree@^4.2.4: version "4.2.4" - resolved "https://registry.yarnpkg.com/merkle-patricia-tree/-/merkle-patricia-tree-4.2.4.tgz#ff988d045e2bf3dfa2239f7fabe2d59618d57413" + resolved "https://registry.npmjs.org/merkle-patricia-tree/-/merkle-patricia-tree-4.2.4.tgz" integrity sha512-eHbf/BG6eGNsqqfbLED9rIqbsF4+sykEaBn6OLNs71tjclbMcMOk1tEPmJKcNcNCLkvbpY/lwyOlizWsqPNo8w== dependencies: "@types/levelup" "^4.3.0" @@ -4061,9 +4242,14 @@ merkle-patricia-tree@^4.2.2, merkle-patricia-tree@^4.2.4: readable-stream "^3.6.0" semaphore-async-await "^1.5.1" +micro-ftch@^0.3.1: + version "0.3.1" + resolved "https://registry.npmjs.org/micro-ftch/-/micro-ftch-0.3.1.tgz" + integrity sha512-/0LLxhzP0tfiR5hcQebtudP56gUurs2CLkGarnCiB/OqEyUFQ6U3paQi/tgLv0hBJYt2rnr9MNpxz4fiiugstg== + micromatch@^4.0.4: version "4.0.5" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" + resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz" integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== dependencies: braces "^3.0.2" @@ -4071,7 +4257,7 @@ micromatch@^4.0.4: miller-rabin@^4.0.0: version "4.0.1" - resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" + resolved "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz" integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA== dependencies: bn.js "^4.0.0" @@ -4079,111 +4265,81 @@ miller-rabin@^4.0.0: mime-db@1.52.0: version "1.52.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== mime-types@^2.1.12, mime-types@~2.1.19: version "2.1.35" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz" integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== dependencies: mime-db "1.52.0" minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" + resolved "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz" integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== minimalistic-crypto-utils@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" + resolved "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz" integrity sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg== -"minimatch@2 || 3", minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1: +minimatch@^3.0.4, minimatch@^3.0.5, "minimatch@2 || 3": version "3.1.2" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== dependencies: brace-expansion "^1.1.7" minimatch@3.0.4: version "3.0.4" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz" integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== dependencies: brace-expansion "^1.1.7" minimatch@5.0.1: version "5.0.1" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.0.1.tgz#fb9022f7528125187c92bd9e9b6366be1cf3415b" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz" integrity sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g== dependencies: brace-expansion "^2.0.1" minimist@^1.2.5, minimist@^1.2.6: version "1.2.8" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" + resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz" integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== -mkdirp@0.5.5: - version "0.5.5" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" - integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== - dependencies: - minimist "^1.2.5" - -mkdirp@0.5.x, mkdirp@^0.5.1: +mkdirp@^0.5.1, mkdirp@0.5.x: version "0.5.6" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" + resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz" integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== dependencies: minimist "^1.2.6" mkdirp@^1.0.4: version "1.0.4" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" + resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz" integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== +mkdirp@0.5.5: + version "0.5.5" + resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz" + integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== + dependencies: + minimist "^1.2.5" + mnemonist@^0.38.0: version "0.38.5" - resolved "https://registry.yarnpkg.com/mnemonist/-/mnemonist-0.38.5.tgz#4adc7f4200491237fe0fa689ac0b86539685cade" + resolved "https://registry.npmjs.org/mnemonist/-/mnemonist-0.38.5.tgz" integrity sha512-bZTFT5rrPKtPJxj8KSV0WkPyNxl72vQepqqVUAW2ARUpUSF2qXMB6jZj7hW5/k7C1rtpzqbD/IIbJwLXUjCHeg== dependencies: obliterator "^2.0.0" -mocha@7.1.2: - version "7.1.2" - resolved "https://registry.yarnpkg.com/mocha/-/mocha-7.1.2.tgz#8e40d198acf91a52ace122cd7599c9ab857b29e6" - integrity sha512-o96kdRKMKI3E8U0bjnfqW4QMk12MwZ4mhdBTf+B5a1q9+aq2HRnj+3ZdJu0B/ZhJeK78MgYuv6L8d/rA5AeBJA== - dependencies: - ansi-colors "3.2.3" - browser-stdout "1.3.1" - chokidar "3.3.0" - debug "3.2.6" - diff "3.5.0" - escape-string-regexp "1.0.5" - find-up "3.0.0" - glob "7.1.3" - growl "1.10.5" - he "1.2.0" - js-yaml "3.13.1" - log-symbols "3.0.0" - minimatch "3.0.4" - mkdirp "0.5.5" - ms "2.1.1" - node-environment-flags "1.0.6" - object.assign "4.1.0" - strip-json-comments "2.0.1" - supports-color "6.0.0" - which "1.3.1" - wide-align "1.1.3" - yargs "13.3.2" - yargs-parser "13.1.2" - yargs-unparser "1.6.0" - mocha@^10.0.0: version "10.2.0" - resolved "https://registry.yarnpkg.com/mocha/-/mocha-10.2.0.tgz#1fd4a7c32ba5ac372e03a17eef435bd00e5c68b8" + resolved "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz" integrity sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg== dependencies: ansi-colors "4.1.1" @@ -4210,7 +4366,7 @@ mocha@^10.0.0: mocha@^7.1.1: version "7.2.0" - resolved "https://registry.yarnpkg.com/mocha/-/mocha-7.2.0.tgz#01cc227b00d875ab1eed03a75106689cfed5a604" + resolved "https://registry.npmjs.org/mocha/-/mocha-7.2.0.tgz" integrity sha512-O9CIypScywTVpNaRrCAgoUnJgozpIofjKUYmJhiCIJMiuYnLI6otcb1/kpW9/n/tJODHGZ7i8aLQoDVsMtOKQQ== dependencies: ansi-colors "3.2.3" @@ -4238,39 +4394,69 @@ mocha@^7.1.1: yargs-parser "13.1.2" yargs-unparser "1.6.0" +mocha@7.1.2: + version "7.1.2" + resolved "https://registry.npmjs.org/mocha/-/mocha-7.1.2.tgz" + integrity sha512-o96kdRKMKI3E8U0bjnfqW4QMk12MwZ4mhdBTf+B5a1q9+aq2HRnj+3ZdJu0B/ZhJeK78MgYuv6L8d/rA5AeBJA== + dependencies: + ansi-colors "3.2.3" + browser-stdout "1.3.1" + chokidar "3.3.0" + debug "3.2.6" + diff "3.5.0" + escape-string-regexp "1.0.5" + find-up "3.0.0" + glob "7.1.3" + growl "1.10.5" + he "1.2.0" + js-yaml "3.13.1" + log-symbols "3.0.0" + minimatch "3.0.4" + mkdirp "0.5.5" + ms "2.1.1" + node-environment-flags "1.0.6" + object.assign "4.1.0" + strip-json-comments "2.0.1" + supports-color "6.0.0" + which "1.3.1" + wide-align "1.1.3" + yargs "13.3.2" + yargs-parser "13.1.2" + yargs-unparser "1.6.0" + module-alias@^2.2.3: version "2.2.3" - resolved "https://registry.yarnpkg.com/module-alias/-/module-alias-2.2.3.tgz#ec2e85c68973bda6ab71ce7c93b763ec96053221" + resolved "https://registry.npmjs.org/module-alias/-/module-alias-2.2.3.tgz" integrity sha512-23g5BFj4zdQL/b6tor7Ji+QY4pEfNH784BMslY9Qb0UnJWRAt+lQGLYmRaM0KDBwIG23ffEBELhZDP2rhi9f/Q== module-error@^1.0.1, module-error@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/module-error/-/module-error-1.0.2.tgz#8d1a48897ca883f47a45816d4fb3e3c6ba404d86" + resolved "https://registry.npmjs.org/module-error/-/module-error-1.0.2.tgz" integrity sha512-0yuvsqSCv8LbaOKhnsQ/T5JhyFlCYLPXK3U2sgV10zoKQwzs/MyfuQUOZQ1V/6OCOJsK/TRgNVrPuPDqtdMFtA== +ms@^2.1.1, ms@2.1.2: + version "2.1.2" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + ms@2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + resolved "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz" integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== ms@2.1.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz" integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== -ms@2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - -ms@2.1.3, ms@^2.1.1: +ms@2.1.3: version "2.1.3" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== murmur-128@^0.2.1: version "0.2.1" - resolved "https://registry.yarnpkg.com/murmur-128/-/murmur-128-0.2.1.tgz#a9f6568781d2350ecb1bf80c14968cadbeaa4b4d" + resolved "https://registry.npmjs.org/murmur-128/-/murmur-128-0.2.1.tgz" integrity sha512-WseEgiRkI6aMFBbj8Cg9yBj/y+OdipwVC7zUo3W2W1JAJITwouUOtpqsmGSg67EQmwwSyod7hsVsWY5LsrfQVg== dependencies: encode-utf8 "^1.0.2" @@ -4279,49 +4465,49 @@ murmur-128@^0.2.1: nanoassert@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/nanoassert/-/nanoassert-2.0.0.tgz#a05f86de6c7a51618038a620f88878ed1e490c09" + resolved "https://registry.npmjs.org/nanoassert/-/nanoassert-2.0.0.tgz" integrity sha512-7vO7n28+aYO4J+8w96AzhmU8G+Y/xpPDJz/se19ICsqj/momRbb9mh9ZUtkoJ5X3nTnPdhEJyc0qnM6yAsHBaA== nanoid@3.3.3: version "3.3.3" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.3.tgz#fd8e8b7aa761fe807dba2d1b98fb7241bb724a25" + resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz" integrity sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w== napi-macros@^2.2.2: version "2.2.2" - resolved "https://registry.yarnpkg.com/napi-macros/-/napi-macros-2.2.2.tgz#817fef20c3e0e40a963fbf7b37d1600bd0201044" + resolved "https://registry.npmjs.org/napi-macros/-/napi-macros-2.2.2.tgz" integrity sha512-hmEVtAGYzVQpCKdbQea4skABsdXW4RUh5t5mJ2zzqowJS2OyXZTU1KhDVFhx+NlWZ4ap9mqR9TcDO3LTTttd+g== napi-macros@~2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/napi-macros/-/napi-macros-2.0.0.tgz#2b6bae421e7b96eb687aa6c77a7858640670001b" + resolved "https://registry.npmjs.org/napi-macros/-/napi-macros-2.0.0.tgz" integrity sha512-A0xLykHtARfueITVDernsAWdtIMbOJgKgcluwENp3AlsKN/PloyO10HtmoqnFAQAcxPkgZN7wdfPfEd0zNGxbg== neo-async@^2.6.0: version "2.6.2" - resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" + resolved "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz" integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== node-addon-api@^2.0.0: version "2.0.2" - resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-2.0.2.tgz#432cfa82962ce494b132e9d72a15b29f71ff5d32" + resolved "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz" integrity sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA== node-addon-api@^3.0.0: version "3.2.1" - resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-3.2.1.tgz#81325e0a2117789c0128dab65e7e38f07ceba161" + resolved "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz" integrity sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A== node-emoji@^1.10.0: version "1.11.0" - resolved "https://registry.yarnpkg.com/node-emoji/-/node-emoji-1.11.0.tgz#69a0150e6946e2f115e9d7ea4df7971e2628301c" + resolved "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz" integrity sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A== dependencies: lodash "^4.17.21" node-environment-flags@1.0.6: version "1.0.6" - resolved "https://registry.yarnpkg.com/node-environment-flags/-/node-environment-flags-1.0.6.tgz#a30ac13621f6f7d674260a54dede048c3982c088" + resolved "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.6.tgz" integrity sha512-5Evy2epuL+6TM0lCQGpFIj6KwiEsGh1SrHUhTbNX+sLbBtjidPZFAnVK9y5yU1+h//RitLbRHTIMyxQPtxMdHw== dependencies: object.getownpropertydescriptors "^2.0.3" @@ -4329,51 +4515,61 @@ node-environment-flags@1.0.6: node-fetch@^2.6.7: version "2.6.11" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.11.tgz#cde7fc71deef3131ef80a738919f999e6edfff25" + resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.11.tgz" integrity sha512-4I6pdBY1EthSqDmJkiNk3JIT8cswwR9nfeW/cPdUagJYEQG7R95WRH74wpz7ma8Gh/9dI9FP+OU+0E4FvtA55w== dependencies: whatwg-url "^5.0.0" +node-gyp-build@^4.2.0, node-gyp-build@^4.2.2, node-gyp-build@^4.3.0: + version "4.6.1" + resolved "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.6.1.tgz" + integrity sha512-24vnklJmyRS8ViBNI8KbtK/r/DmXQMRiOMXTNz2nrTnAYUwjmEEbnnpB/+kt+yWRv73bPsSPRFddrcIbAxSiMQ== + node-gyp-build@4.3.0: version "4.3.0" - resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.3.0.tgz#9f256b03e5826150be39c764bf51e993946d71a3" + resolved "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.3.0.tgz" integrity sha512-iWjXZvmboq0ja1pUGULQBexmxq8CV4xBhX7VDOTbL7ZR4FOowwY/VOtRxBN/yKxmdGoIp4j5ysNT4u3S2pDQ3Q== node-gyp-build@4.4.0: version "4.4.0" - resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.4.0.tgz#42e99687ce87ddeaf3a10b99dc06abc11021f3f4" + resolved "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.4.0.tgz" integrity sha512-amJnQCcgtRVw9SvoebO3BKGESClrfXGCUTX9hSn1OuGQTQBOZmVd0Z0OlecpuRksKvbsUqALE8jls/ErClAPuQ== -node-gyp-build@^4.2.0, node-gyp-build@^4.3.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.6.0.tgz#0c52e4cbf54bbd28b709820ef7b6a3c2d6209055" - integrity sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ== - -node-gyp-build@^4.2.2: - version "4.6.1" - resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.6.1.tgz#24b6d075e5e391b8d5539d98c7fc5c210cac8a3e" - integrity sha512-24vnklJmyRS8ViBNI8KbtK/r/DmXQMRiOMXTNz2nrTnAYUwjmEEbnnpB/+kt+yWRv73bPsSPRFddrcIbAxSiMQ== - nofilter@^3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/nofilter/-/nofilter-3.1.0.tgz#c757ba68801d41ff930ba2ec55bab52ca184aa66" + resolved "https://registry.npmjs.org/nofilter/-/nofilter-3.1.0.tgz" integrity sha512-l2NNj07e9afPnhAhvgVrCD/oy2Ai1yfLpuo3EpiO1jFTsB4sFz6oIfAfSZyQzVpkZQ9xS8ZS5g1jCBgq4Hwo0g== nopt@3.x: version "3.0.6" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" + resolved "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz" integrity sha512-4GUt3kSEYmk4ITxzB/b9vaIDfUVWN/Ml1Fwl11IlnIG2iaJ9O6WXZ9SrYM9NLI8OCBieN2Y8SWC2oJV0RQ7qYg== dependencies: abbrev "1" +normalize-package-data@^2.3.2: + version "2.5.0" + resolved "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz" + integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== + dependencies: + hosted-git-info "^2.1.4" + resolve "^1.10.0" + semver "2 || 3 || 4 || 5" + validate-npm-package-license "^3.0.1" + normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== +number-is-nan@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz" + integrity sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ== + number-to-bn@1.7.0: version "1.7.0" - resolved "https://registry.yarnpkg.com/number-to-bn/-/number-to-bn-1.7.0.tgz#bb3623592f7e5f9e0030b1977bd41a0c53fe1ea0" + resolved "https://registry.npmjs.org/number-to-bn/-/number-to-bn-1.7.0.tgz" integrity sha512-wsJ9gfSz1/s4ZsJN01lyonwuxA1tml6X1yBDnfpMglypcBRFZZkus26EdPSlqS5GJfYddVZa22p3VNb3z5m5Ig== dependencies: bn.js "4.11.6" @@ -4381,37 +4577,27 @@ number-to-bn@1.7.0: oauth-sign@~0.9.0: version "0.9.0" - resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" + resolved "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz" integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== object-assign@^4.1.0: version "4.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== object-inspect@^1.12.3, object-inspect@^1.9.0: version "1.12.3" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.3.tgz#ba62dffd67ee256c8c086dfae69e016cd1f198b9" + resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz" integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g== object-keys@^1.0.11, object-keys@^1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + resolved "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== -object.assign@4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da" - integrity sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w== - dependencies: - define-properties "^1.1.2" - function-bind "^1.1.1" - has-symbols "^1.0.0" - object-keys "^1.0.11" - object.assign@^4.1.4: version "4.1.4" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.4.tgz#9673c7c7c351ab8c4d0b516f4343ebf4dfb7799f" + resolved "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz" integrity sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ== dependencies: call-bind "^1.0.2" @@ -4419,9 +4605,19 @@ object.assign@^4.1.4: has-symbols "^1.0.3" object-keys "^1.1.1" +object.assign@4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz" + integrity sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w== + dependencies: + define-properties "^1.1.2" + function-bind "^1.1.1" + has-symbols "^1.0.0" + object-keys "^1.0.11" + object.getownpropertydescriptors@^2.0.3: version "2.1.6" - resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.6.tgz#5e5c384dd209fa4efffead39e3a0512770ccc312" + resolved "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.6.tgz" integrity sha512-lq+61g26E/BgHv0ZTFgRvi7NMEPuAxLkFU7rukXjc/AlwH4Am5xXVnIXy3un1bg/JPbXHrixRkK1itUzzPiIjQ== dependencies: array.prototype.reduce "^1.0.5" @@ -4432,19 +4628,19 @@ object.getownpropertydescriptors@^2.0.3: obliterator@^2.0.0: version "2.0.4" - resolved "https://registry.yarnpkg.com/obliterator/-/obliterator-2.0.4.tgz#fa650e019b2d075d745e44f1effeb13a2adbe816" + resolved "https://registry.npmjs.org/obliterator/-/obliterator-2.0.4.tgz" integrity sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ== -once@1.x, once@^1.3.0: +once@^1.3.0, once@1.x: version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz" integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== dependencies: wrappy "1" optionator@^0.8.1: version "0.8.3" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" + resolved "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz" integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== dependencies: deep-is "~0.1.3" @@ -4456,116 +4652,146 @@ optionator@^0.8.1: ordinal@^1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/ordinal/-/ordinal-1.0.3.tgz#1a3c7726a61728112f50944ad7c35c06ae3a0d4d" + resolved "https://registry.npmjs.org/ordinal/-/ordinal-1.0.3.tgz" integrity sha512-cMddMgb2QElm8G7vdaa02jhUNbTSrhsgAGUz1OokD83uJTwSUn+nKoNoKVVaRa08yF6sgfO7Maou1+bgLd9rdQ== +os-locale@^1.4.0: + version "1.4.0" + resolved "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz" + integrity sha512-PRT7ZORmwu2MEFt4/fv3Q+mEfN4zetKxufQrkShY2oGvUms9r8otu5HfdyIFHkYXjO7laNsoVGmM2MANfuTA8g== + dependencies: + lcid "^1.0.0" + os-tmpdir@~1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + resolved "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz" integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g== p-limit@^1.1.0: version "1.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz" integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== dependencies: p-try "^1.0.0" p-limit@^2.0.0: version "2.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz" integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== dependencies: p-try "^2.0.0" p-limit@^3.0.2: version "3.1.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz" integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== dependencies: yocto-queue "^0.1.0" p-locate@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" + resolved "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz" integrity sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg== dependencies: p-limit "^1.1.0" p-locate@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" + resolved "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz" integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== dependencies: p-limit "^2.0.0" p-locate@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + resolved "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz" integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== dependencies: p-limit "^3.0.2" p-map@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" + resolved "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz" integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== dependencies: aggregate-error "^3.0.0" p-try@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" + resolved "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz" integrity sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww== p-try@^2.0.0: version "2.2.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + resolved "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz" integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== parse-cache-control@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/parse-cache-control/-/parse-cache-control-1.0.1.tgz#8eeab3e54fa56920fe16ba38f77fa21aacc2d74e" + resolved "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz" integrity sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg== +parse-json@^2.2.0: + version "2.2.0" + resolved "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz" + integrity sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ== + dependencies: + error-ex "^1.2.0" + path-browserify@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-1.0.1.tgz#d98454a9c3753d5790860f16f68867b9e46be1fd" + resolved "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz" integrity sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g== +path-exists@^2.0.0: + version "2.1.0" + resolved "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz" + integrity sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ== + dependencies: + pinkie-promise "^2.0.0" + path-exists@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + resolved "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz" integrity sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ== path-exists@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz" integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== path-is-absolute@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== -path-parse@^1.0.6, path-parse@^1.0.7: +path-parse@^1.0.6: version "1.0.7" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== +path-type@^1.0.0: + version "1.1.0" + resolved "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz" + integrity sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg== + dependencies: + graceful-fs "^4.1.2" + pify "^2.0.0" + pinkie-promise "^2.0.0" + path-type@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + resolved "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== pathval@^1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.1.tgz#8534e77a77ce7ac5a2512ea21e0fdb8fcf6c3d8d" + resolved "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz" integrity sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ== pbkdf2@^3.0.17, pbkdf2@^3.0.9: version "3.1.2" - resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.2.tgz#dd822aa0887580e52f1a039dc3eda108efae3075" + resolved "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz" integrity sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA== dependencies: create-hash "^1.1.2" @@ -4576,88 +4802,115 @@ pbkdf2@^3.0.17, pbkdf2@^3.0.9: performance-now@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" + resolved "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz" integrity sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow== picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: version "2.3.1" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== +pify@^2.0.0: + version "2.3.0" + resolved "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz" + integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== + pify@^4.0.1: version "4.0.1" - resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" + resolved "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz" integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== +pinkie-promise@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz" + integrity sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw== + dependencies: + pinkie "^2.0.0" + +pinkie@^2.0.0: + version "2.0.4" + resolved "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz" + integrity sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg== + prelude-ls@~1.1.2: version "1.1.2" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" + resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz" integrity sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w== prettier@^2.3.1: version "2.8.8" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.8.tgz#e8c5d7e98a4305ffe3de2e1fc4aca1a71c28b1da" + resolved "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz" integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q== process-nextick-args@~2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + resolved "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz" integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== promise@^8.0.0: version "8.3.0" - resolved "https://registry.yarnpkg.com/promise/-/promise-8.3.0.tgz#8cb333d1edeb61ef23869fbb8a4ea0279ab60e0a" + resolved "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz" integrity sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg== dependencies: asap "~2.0.6" prr@~1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" + resolved "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz" integrity sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw== psl@^1.1.28: version "1.9.0" - resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7" + resolved "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz" integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== punycode@^1.4.1: version "1.4.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + resolved "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz" integrity sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ== -punycode@^2.1.0, punycode@^2.1.1: +punycode@^2.1.0, punycode@2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/punycode/-/punycode-2.1.0.tgz" + integrity sha512-Yxz2kRwT90aPiWEMHVYnEf4+rhwF1tBmmZ4KepCP+Wkium9JxtWnUm1nqGwpiAHr/tnTSeHqr3wb++jgSkXjhA== + +punycode@^2.1.1: version "2.3.0" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f" + resolved "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz" integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== qs@^6.11.0, qs@^6.4.0, qs@^6.9.4: version "6.11.2" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.2.tgz#64bea51f12c1f5da1bc01496f48ffcff7c69d7d9" + resolved "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz" integrity sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA== dependencies: side-channel "^1.0.4" qs@~6.5.2: version "6.5.3" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.3.tgz#3aeeffc91967ef6e35c0e488ef46fb296ab76aad" + resolved "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz" integrity sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA== queue-microtask@^1.2.2, queue-microtask@^1.2.3: version "1.2.3" - resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== +queue-tick@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/queue-tick/-/queue-tick-1.0.0.tgz" + integrity sha512-ULWhjjE8BmiICGn3G8+1L9wFpERNxkf8ysxkAer4+TFdRefDaXOCV5m92aMB9FtBVmn/8sETXLXY6BfW7hyaWQ== + randombytes@^2.0.1, randombytes@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + resolved "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz" integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== dependencies: safe-buffer "^5.1.0" raw-body@^2.4.1: version "2.5.2" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.2.tgz#99febd83b90e08975087e8f1f9419a149366b68a" + resolved "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz" integrity sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA== dependencies: bytes "3.1.2" @@ -4665,9 +4918,26 @@ raw-body@^2.4.1: iconv-lite "0.4.24" unpipe "1.0.0" +read-pkg-up@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz" + integrity sha512-WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A== + dependencies: + find-up "^1.0.0" + read-pkg "^1.0.0" + +read-pkg@^1.0.0: + version "1.1.0" + resolved "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz" + integrity sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ== + dependencies: + load-json-file "^1.0.0" + normalize-package-data "^2.3.2" + path-type "^1.0.0" + readable-stream@^2.2.2: version "2.3.8" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" + resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz" integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== dependencies: core-util-is "~1.0.0" @@ -4680,7 +4950,7 @@ readable-stream@^2.2.2: readable-stream@^3.1.0, readable-stream@^3.4.0, readable-stream@^3.6.0: version "3.6.2" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" + resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz" integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== dependencies: inherits "^2.0.3" @@ -4689,40 +4959,40 @@ readable-stream@^3.1.0, readable-stream@^3.4.0, readable-stream@^3.6.0: readdirp@~3.2.0: version "3.2.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.2.0.tgz#c30c33352b12c96dfb4b895421a49fd5a9593839" + resolved "https://registry.npmjs.org/readdirp/-/readdirp-3.2.0.tgz" integrity sha512-crk4Qu3pmXwgxdSgGhgA/eXiJAPQiX4GMOZZMXnqKxHX7TaoL+3gQVo/WeuAiogr07DpnfjIMpXXa+PAIvwPGQ== dependencies: picomatch "^2.0.4" readdirp@~3.6.0: version "3.6.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + resolved "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz" integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== dependencies: picomatch "^2.2.1" rechoir@^0.6.2: version "0.6.2" - resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" + resolved "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz" integrity sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw== dependencies: resolve "^1.1.6" recursive-readdir@^2.2.2: version "2.2.3" - resolved "https://registry.yarnpkg.com/recursive-readdir/-/recursive-readdir-2.2.3.tgz#e726f328c0d69153bcabd5c322d3195252379372" + resolved "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.3.tgz" integrity sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA== dependencies: minimatch "^3.0.5" reduce-flatten@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/reduce-flatten/-/reduce-flatten-2.0.0.tgz#734fd84e65f375d7ca4465c69798c25c9d10ae27" + resolved "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-2.0.0.tgz" integrity sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w== regexp.prototype.flags@^1.4.3: version "1.5.0" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz#fe7ce25e7e4cca8db37b6634c8a2c7009199b9cb" + resolved "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz" integrity sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA== dependencies: call-bind "^1.0.2" @@ -4731,37 +5001,37 @@ regexp.prototype.flags@^1.4.3: req-cwd@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/req-cwd/-/req-cwd-2.0.0.tgz#d4082b4d44598036640fb73ddea01ed53db49ebc" + resolved "https://registry.npmjs.org/req-cwd/-/req-cwd-2.0.0.tgz" integrity sha512-ueoIoLo1OfB6b05COxAA9UpeoscNpYyM+BqYlA7H6LVF4hKGPXQQSSaD2YmvDVJMkk4UDpAHIeU1zG53IqjvlQ== dependencies: req-from "^2.0.0" req-from@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/req-from/-/req-from-2.0.0.tgz#d74188e47f93796f4aa71df6ee35ae689f3e0e70" + resolved "https://registry.npmjs.org/req-from/-/req-from-2.0.0.tgz" integrity sha512-LzTfEVDVQHBRfjOUMgNBA+V6DWsSnoeKzf42J7l0xa/B4jyPOuuF5MlNSmomLNGemWTnV2TIdjSSLnEn95fOQA== dependencies: resolve-from "^3.0.0" request-promise-core@1.1.4: version "1.1.4" - resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.4.tgz#3eedd4223208d419867b78ce815167d10593a22f" + resolved "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz" integrity sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw== dependencies: lodash "^4.17.19" request-promise-native@^1.0.5: version "1.0.9" - resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.9.tgz#e407120526a5efdc9a39b28a5679bf47b9d9dc28" + resolved "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.9.tgz" integrity sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g== dependencies: request-promise-core "1.1.4" stealthy-require "^1.1.1" tough-cookie "^2.3.3" -request@^2.85.0, request@^2.88.0: +request@^2.34, request@^2.85.0, request@^2.88.0: version "2.88.2" - resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" + resolved "https://registry.npmjs.org/request/-/request-2.88.2.tgz" integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== dependencies: aws-sign2 "~0.7.0" @@ -4787,101 +5057,100 @@ request@^2.85.0, request@^2.88.0: require-directory@^2.1.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + resolved "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz" integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== -require-from-string@^2.0.0, require-from-string@^2.0.2: +require-from-string@^1.1.0: + version "1.2.1" + resolved "https://registry.npmjs.org/require-from-string/-/require-from-string-1.2.1.tgz" + integrity sha512-H7AkJWMobeskkttHyhTVtS0fxpFLjxhbfMa6Bk3wimP7sdPRGL3EyCg3sAQenFfAe+xQ+oAc85Nmtvq0ROM83Q== + +require-from-string@^2.0.0: + version "2.0.2" + resolved "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz" + integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== + +require-from-string@^2.0.2: version "2.0.2" - resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" + resolved "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz" integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== +require-main-filename@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz" + integrity sha512-IqSUtOVP4ksd1C/ej5zeEh/BIP2ajqpn8c5x+q99gvcIG/Qf0cud5raVnE/Dwd0ua9TXYDoDc0RE5hBSdz22Ug== + require-main-filename@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" + resolved "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz" integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== resolve-from@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" + resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz" integrity sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw== -resolve@1.1.x: - version "1.1.7" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" - integrity sha512-9znBF0vBcaSN3W2j7wKvdERPwqTxSpCq+if5C0WoTCyV9n24rua28jeuQ2pL/HOf+yUe/Mef+H/5p60K0Id3bg== - -resolve@1.17.0: +resolve@^1.1.6, resolve@^1.10.0, resolve@1.17.0: version "1.17.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444" + resolved "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz" integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w== dependencies: path-parse "^1.0.6" -resolve@^1.1.6: - version "1.22.2" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.2.tgz#0ed0943d4e301867955766c9f3e1ae6d01c6845f" - integrity sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g== - dependencies: - is-core-module "^2.11.0" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" +resolve@1.1.x: + version "1.1.7" + resolved "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz" + integrity sha512-9znBF0vBcaSN3W2j7wKvdERPwqTxSpCq+if5C0WoTCyV9n24rua28jeuQ2pL/HOf+yUe/Mef+H/5p60K0Id3bg== reusify@^1.0.4: version "1.0.4" - resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + resolved "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz" integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== rimraf@^2.2.8: version "2.7.1" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" + resolved "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz" integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== dependencies: glob "^7.1.3" ripemd160@^2.0.0, ripemd160@^2.0.1: version "2.0.2" - resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" + resolved "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz" integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== dependencies: hash-base "^3.0.0" inherits "^2.0.1" -rlp@2.2.6: +rlp@^2.2.3, rlp@^2.2.4, rlp@2.2.6: version "2.2.6" - resolved "https://registry.yarnpkg.com/rlp/-/rlp-2.2.6.tgz#c80ba6266ac7a483ef1e69e8e2f056656de2fb2c" + resolved "https://registry.npmjs.org/rlp/-/rlp-2.2.6.tgz" integrity sha512-HAfAmL6SDYNWPUOJNrM500x4Thn4PZsEy5pijPh40U9WfNk0z15hUYzO9xVIMAdIHdFtD8CBDHd75Td1g36Mjg== dependencies: bn.js "^4.11.1" -rlp@^2.2.3, rlp@^2.2.4: - version "2.2.7" - resolved "https://registry.yarnpkg.com/rlp/-/rlp-2.2.7.tgz#33f31c4afac81124ac4b283e2bd4d9720b30beaf" - integrity sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ== - dependencies: - bn.js "^5.2.0" - run-parallel-limit@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/run-parallel-limit/-/run-parallel-limit-1.1.0.tgz#be80e936f5768623a38a963262d6bef8ff11e7ba" + resolved "https://registry.npmjs.org/run-parallel-limit/-/run-parallel-limit-1.1.0.tgz" integrity sha512-jJA7irRNM91jaKc3Hcl1npHsFLOXOoTkPCUL1JEa1R82O2miplXXRaGdjW/KM/98YQWDhJLiSs793CnXfblJUw== dependencies: queue-microtask "^1.2.2" run-parallel@^1.1.9: version "1.2.0" - resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + resolved "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz" integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== dependencies: queue-microtask "^1.2.2" rustbn.js@~0.2.0: version "0.2.0" - resolved "https://registry.yarnpkg.com/rustbn.js/-/rustbn.js-0.2.0.tgz#8082cb886e707155fd1cb6f23bd591ab8d55d0ca" + resolved "https://registry.npmjs.org/rustbn.js/-/rustbn.js-0.2.0.tgz" integrity sha512-4VlvkRUuCJvr2J6Y0ImW7NvTCriMi7ErOAqWk1y69vAdoNIzCF3yPmgeNzx+RQTLEDFq5sHfscn1MwHxP9hNfA== safe-array-concat@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.0.0.tgz#2064223cba3c08d2ee05148eedbc563cd6d84060" + resolved "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.0.tgz" integrity sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ== dependencies: call-bind "^1.0.2" @@ -4891,31 +5160,31 @@ safe-array-concat@^1.0.0: safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0: version "5.2.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== safe-regex-test@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.0.tgz#793b874d524eb3640d1873aad03596db2d4f2295" + resolved "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz" integrity sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA== dependencies: call-bind "^1.0.2" get-intrinsic "^1.1.3" is-regex "^1.1.4" -"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: +safer-buffer@^2.0.2, safer-buffer@^2.1.0, "safer-buffer@>= 2.1.2 < 3", safer-buffer@~2.1.0: version "2.1.2" - resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== sc-istanbul@^0.4.5: version "0.4.6" - resolved "https://registry.yarnpkg.com/sc-istanbul/-/sc-istanbul-0.4.6.tgz#cf6784355ff2076f92d70d59047d71c13703e839" + resolved "https://registry.npmjs.org/sc-istanbul/-/sc-istanbul-0.4.6.tgz" integrity sha512-qJFF/8tW/zJsbyfh/iT/ZM5QNHE3CXxtLJbZsL+CzdJLBsPD7SedJZoUA4d8iAcN2IoMp/Dx80shOOd2x96X/g== dependencies: abbrev "1.0.x" @@ -4933,19 +5202,28 @@ sc-istanbul@^0.4.5: which "^1.1.1" wordwrap "^1.0.0" +scrypt-js@^3.0.0, scrypt-js@3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz" + integrity sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA== + scrypt-js@2.0.4: version "2.0.4" - resolved "https://registry.yarnpkg.com/scrypt-js/-/scrypt-js-2.0.4.tgz#32f8c5149f0797672e551c07e230f834b6af5f16" + resolved "https://registry.npmjs.org/scrypt-js/-/scrypt-js-2.0.4.tgz" integrity sha512-4KsaGcPnuhtCZQCxFxN3GVYIhKFPTdLd8PLC552XwbMndtD0cjRFAhDuuydXQ0h08ZfPgzqe6EKHozpuH74iDw== -scrypt-js@3.0.1, scrypt-js@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/scrypt-js/-/scrypt-js-3.0.1.tgz#d314a57c2aef69d1ad98a138a21fe9eafa9ee312" - integrity sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA== +secp256k1@^4.0.1: + version "4.0.3" + resolved "https://registry.npmjs.org/secp256k1/-/secp256k1-4.0.3.tgz" + integrity sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA== + dependencies: + elliptic "^6.5.4" + node-addon-api "^2.0.0" + node-gyp-build "^4.2.0" -secp256k1@4.0.3, secp256k1@^4.0.1: +secp256k1@4.0.3: version "4.0.3" - resolved "https://registry.yarnpkg.com/secp256k1/-/secp256k1-4.0.3.tgz#c4559ecd1b8d3c1827ed2d1b94190d69ce267303" + resolved "https://registry.npmjs.org/secp256k1/-/secp256k1-4.0.3.tgz" integrity sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA== dependencies: elliptic "^6.5.4" @@ -4954,61 +5232,76 @@ secp256k1@4.0.3, secp256k1@^4.0.1: seedrandom@3.0.5: version "3.0.5" - resolved "https://registry.yarnpkg.com/seedrandom/-/seedrandom-3.0.5.tgz#54edc85c95222525b0c7a6f6b3543d8e0b3aa0a7" + resolved "https://registry.npmjs.org/seedrandom/-/seedrandom-3.0.5.tgz" integrity sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg== semaphore-async-await@^1.5.1: version "1.5.1" - resolved "https://registry.yarnpkg.com/semaphore-async-await/-/semaphore-async-await-1.5.1.tgz#857bef5e3644601ca4b9570b87e9df5ca12974fa" + resolved "https://registry.npmjs.org/semaphore-async-await/-/semaphore-async-await-1.5.1.tgz" integrity sha512-b/ptP11hETwYWpeilHXXQiV5UJNJl7ZWWooKRE5eBIYWoom6dZ0SluCIdCtKycsMtZgKWE01/qAw6jblw1YVhg== -semver@^5.5.0, semver@^5.7.0: +semver@^5.3.0: + version "5.7.2" + resolved "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz" + integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== + +semver@^5.5.0: + version "5.7.1" + resolved "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz" + integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + +semver@^5.7.0: version "5.7.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" + resolved "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== semver@^6.3.0: version "6.3.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" + resolved "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== semver@^7.3.4: version "7.5.2" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.2.tgz#5b851e66d1be07c1cdaf37dfc856f543325a2beb" + resolved "https://registry.npmjs.org/semver/-/semver-7.5.2.tgz" integrity sha512-SoftuTROv/cRjCze/scjGyiDtcUyxw1rgYQSZY7XTmtR5hX+dm76iDbTH8TkLPHCQmlbQVSSbNZCPM2hb0knnQ== dependencies: lru-cache "^6.0.0" +"semver@2 || 3 || 4 || 5": + version "5.7.2" + resolved "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz" + integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== + serialize-javascript@6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8" + resolved "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz" integrity sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag== dependencies: randombytes "^2.1.0" set-blocking@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + resolved "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz" integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== -setimmediate@1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.4.tgz#20e81de622d4a02588ce0c8da8973cbcf1d3138f" - integrity sha512-/TjEmXQVEzdod/FFskf3o7oOAsGhHf2j1dZqRFbDzq4F3mvvxflIIi4Hd3bLQE9y/CpwqfSQam5JakI/mi3Pog== - setimmediate@^1.0.5: version "1.0.5" - resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" + resolved "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz" integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA== +setimmediate@1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.4.tgz" + integrity sha512-/TjEmXQVEzdod/FFskf3o7oOAsGhHf2j1dZqRFbDzq4F3mvvxflIIi4Hd3bLQE9y/CpwqfSQam5JakI/mi3Pog== + setprototypeof@1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" + resolved "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz" integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== sha.js@^2.4.0, sha.js@^2.4.8: version "2.4.11" - resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" + resolved "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz" integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== dependencies: inherits "^2.0.1" @@ -5016,7 +5309,7 @@ sha.js@^2.4.0, sha.js@^2.4.8: sha1@^1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/sha1/-/sha1-1.1.1.tgz#addaa7a93168f393f19eb2b15091618e2700f848" + resolved "https://registry.npmjs.org/sha1/-/sha1-1.1.1.tgz" integrity sha512-dZBS6OrMjtgVkopB1Gmo4RQCDKiZsqcpAQpkV/aaj+FCrCg8r4I4qMkDPQjBgLIxlmu9k4nUbWq6ohXahOneYA== dependencies: charenc ">= 0.0.1" @@ -5024,7 +5317,7 @@ sha1@^1.1.1: shelljs@^0.8.3: version "0.8.5" - resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.8.5.tgz#de055408d8361bed66c669d2f000538ced8ee20c" + resolved "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz" integrity sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow== dependencies: glob "^7.0.0" @@ -5033,7 +5326,7 @@ shelljs@^0.8.3: side-channel@^1.0.4: version "1.0.4" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" + resolved "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz" integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== dependencies: call-bind "^1.0.0" @@ -5042,49 +5335,60 @@ side-channel@^1.0.4: slash@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + resolved "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz" integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== slice-ansi@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" + resolved "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz" integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== dependencies: ansi-styles "^4.0.0" astral-regex "^2.0.0" is-fullwidth-code-point "^3.0.0" -solc@0.7.3: - version "0.7.3" - resolved "https://registry.yarnpkg.com/solc/-/solc-0.7.3.tgz#04646961bd867a744f63d2b4e3c0701ffdc7d78a" - integrity sha512-GAsWNAjGzIDg7VxzP6mPjdurby3IkGCjQcM8GFYZT6RyaoUZKmMU6Y7YwG+tFGhv7dwZ8rmR4iwFDrrD99JwqA== +solc@*, solc@0.8.15: + version "0.8.15" + resolved "https://registry.npmjs.org/solc/-/solc-0.8.15.tgz" + integrity sha512-Riv0GNHNk/SddN/JyEuFKwbcWcEeho15iyupTSHw5Np6WuXA5D8kEHbyzDHi6sqmvLzu2l+8b1YmL8Ytple+8w== dependencies: command-exists "^1.2.8" - commander "3.0.2" + commander "^8.1.0" follow-redirects "^1.12.1" - fs-extra "^0.30.0" js-sha3 "0.8.0" memorystream "^0.3.1" - require-from-string "^2.0.0" semver "^5.5.0" tmp "0.0.33" -solc@0.8.15: - version "0.8.15" - resolved "https://registry.yarnpkg.com/solc/-/solc-0.8.15.tgz#d274dca4d5a8b7d3c9295d4cbdc9291ee1c52152" - integrity sha512-Riv0GNHNk/SddN/JyEuFKwbcWcEeho15iyupTSHw5Np6WuXA5D8kEHbyzDHi6sqmvLzu2l+8b1YmL8Ytple+8w== +solc@^0.4.20: + version "0.4.26" + resolved "https://registry.npmjs.org/solc/-/solc-0.4.26.tgz" + integrity sha512-o+c6FpkiHd+HPjmjEVpQgH7fqZ14tJpXhho+/bQXlXbliLIS/xjXb42Vxh+qQY1WCSTMQ0+a5vR9vi0MfhU6mA== + dependencies: + fs-extra "^0.30.0" + memorystream "^0.3.1" + require-from-string "^1.1.0" + semver "^5.3.0" + yargs "^4.7.1" + +solc@0.7.3: + version "0.7.3" + resolved "https://registry.npmjs.org/solc/-/solc-0.7.3.tgz" + integrity sha512-GAsWNAjGzIDg7VxzP6mPjdurby3IkGCjQcM8GFYZT6RyaoUZKmMU6Y7YwG+tFGhv7dwZ8rmR4iwFDrrD99JwqA== dependencies: command-exists "^1.2.8" - commander "^8.1.0" + commander "3.0.2" follow-redirects "^1.12.1" + fs-extra "^0.30.0" js-sha3 "0.8.0" memorystream "^0.3.1" + require-from-string "^2.0.0" semver "^5.5.0" tmp "0.0.33" solidity-coverage@^0.8.4: version "0.8.4" - resolved "https://registry.yarnpkg.com/solidity-coverage/-/solidity-coverage-0.8.4.tgz#c57a21979f5e86859c5198de9fbae2d3bc6324a5" + resolved "https://registry.npmjs.org/solidity-coverage/-/solidity-coverage-0.8.4.tgz" integrity sha512-xeHOfBOjdMF6hWTbt42iH4x+7j1Atmrf5OldDPMxI+i/COdExUxszOswD9qqvcBTaLGiOrrpnh9UZjSpt4rBsg== dependencies: "@ethersproject/abi" "^5.0.9" @@ -5110,32 +5414,63 @@ solidity-coverage@^0.8.4: source-map-support@^0.5.13: version "0.5.21" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" + resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz" integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== dependencies: buffer-from "^1.0.0" source-map "^0.6.0" -source-map@^0.6.0, source-map@^0.6.1: +source-map@^0.6.0: + version "0.6.1" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +source-map@^0.6.1: version "0.6.1" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== source-map@~0.2.0: version "0.2.0" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.2.0.tgz#dab73fbcfc2ba819b4de03bd6f6eaa48164b3f9d" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz" integrity sha512-CBdZ2oa/BHhS4xj5DlhjWNHcan57/5YuvfdLf17iVmIpd9KRm+DFLmC6nBNj+6Ua7Kt3TmOjDpQT1aTYOQtoUA== dependencies: amdefine ">=0.0.4" +spdx-correct@^3.0.0: + version "3.2.0" + resolved "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz" + integrity sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA== + dependencies: + spdx-expression-parse "^3.0.0" + spdx-license-ids "^3.0.0" + +spdx-exceptions@^2.1.0: + version "2.5.0" + resolved "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz" + integrity sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w== + +spdx-expression-parse@^3.0.0: + version "3.0.1" + resolved "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz" + integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== + dependencies: + spdx-exceptions "^2.1.0" + spdx-license-ids "^3.0.0" + +spdx-license-ids@^3.0.0: + version "3.0.20" + resolved "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.20.tgz" + integrity sha512-jg25NiDV/1fLtSgEgyvVyDunvaNHbuwF9lfNV17gSmPFAlYzdfNBlLtLzXTevwkPj7DhGbmN9VnmJIgLnhvaBw== + sprintf-js@~1.0.2: version "1.0.3" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + resolved "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz" integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== sshpk@^1.7.0: version "1.17.0" - resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.17.0.tgz#578082d92d4fe612b13007496e543fa0fbcbe4c5" + resolved "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz" integrity sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ== dependencies: asn1 "~0.2.3" @@ -5150,34 +5485,57 @@ sshpk@^1.7.0: stacktrace-parser@^0.1.10: version "0.1.10" - resolved "https://registry.yarnpkg.com/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz#29fb0cae4e0d0b85155879402857a1639eb6051a" + resolved "https://registry.npmjs.org/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz" integrity sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg== dependencies: type-fest "^0.7.1" statuses@2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" + resolved "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz" integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== stealthy-require@^1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" + resolved "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz" integrity sha512-ZnWpYnYugiOVEY5GkcuJK1io5V8QmNYChG62gSit9pQVGErXtrKuPC55ITaVSukmMta5qpMU7vqLt2Lnni4f/g== streamsearch@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-1.1.0.tgz#404dd1e2247ca94af554e841a8ef0eaa238da764" + resolved "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz" integrity sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg== +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + string-format@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/string-format/-/string-format-2.0.0.tgz#f2df2e7097440d3b65de31b6d40d54c96eaffb9b" + resolved "https://registry.npmjs.org/string-format/-/string-format-2.0.0.tgz" integrity sha512-bbEs3scLeYNXLecRRuk6uJxdXUSj6le/8rNPHChIJTn2V79aXVTR1EH2OH5zLKKoz0V02fOUKZZcw01pLUShZA== +string-width@^1.0.1: + version "1.0.2" + resolved "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz" + integrity sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw== + dependencies: + code-point-at "^1.0.0" + is-fullwidth-code-point "^1.0.0" + strip-ansi "^3.0.0" + "string-width@^1.0.2 || 2", string-width@^2.1.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" + resolved "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz" integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== dependencies: is-fullwidth-code-point "^2.0.0" @@ -5185,16 +5543,34 @@ string-format@^2.0.0: string-width@^3.0.0, string-width@^3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" + resolved "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz" integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== dependencies: emoji-regex "^7.0.1" is-fullwidth-code-point "^2.0.0" strip-ansi "^5.1.0" -string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: +string-width@^4.1.0: + version "4.2.3" + resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string-width@^4.2.0: + version "4.2.3" + resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string-width@^4.2.3: version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== dependencies: emoji-regex "^8.0.0" @@ -5203,7 +5579,7 @@ string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: string.prototype.trim@^1.2.7: version "1.2.7" - resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz#a68352740859f6893f14ce3ef1bb3037f7a90533" + resolved "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz" integrity sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg== dependencies: call-bind "^1.0.2" @@ -5212,7 +5588,7 @@ string.prototype.trim@^1.2.7: string.prototype.trimend@^1.0.6: version "1.0.6" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz#c4a27fa026d979d79c04f17397f250a462944533" + resolved "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz" integrity sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ== dependencies: call-bind "^1.0.2" @@ -5221,108 +5597,103 @@ string.prototype.trimend@^1.0.6: string.prototype.trimstart@^1.0.6: version "1.0.6" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz#e90ab66aa8e4007d92ef591bbf3cd422c56bdcf4" + resolved "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz" integrity sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA== dependencies: call-bind "^1.0.2" define-properties "^1.1.4" es-abstract "^1.20.4" -string_decoder@^1.1.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" - integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== - dependencies: - safe-buffer "~5.2.0" - -string_decoder@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" - integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== +strip-ansi@^3.0.0, strip-ansi@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz" + integrity sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg== dependencies: - safe-buffer "~5.1.0" + ansi-regex "^2.0.0" strip-ansi@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz" integrity sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow== dependencies: ansi-regex "^3.0.0" strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: version "5.2.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz" integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== dependencies: ansi-regex "^4.1.0" strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== dependencies: ansi-regex "^5.0.1" +strip-bom@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz" + integrity sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g== + dependencies: + is-utf8 "^0.2.0" + strip-hex-prefix@1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz#0c5f155fef1151373377de9dbb588da05500e36f" + resolved "https://registry.npmjs.org/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz" integrity sha512-q8d4ue7JGEiVcypji1bALTos+0pWtyGlivAWyPuTkHzuTCJqrK9sWxYQZUq6Nq3cuyv3bm734IhHvHtGGURU6A== dependencies: is-hex-prefixed "1.0.0" strip-json-comments@2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz" integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== strip-json-comments@3.1.1: version "3.1.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== -supports-color@6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.0.0.tgz#76cfe742cf1f41bb9b1c29ad03068c05b4c0e40a" - integrity sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg== - dependencies: - has-flag "^3.0.0" - -supports-color@8.1.1: - version "8.1.1" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" - integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== - dependencies: - has-flag "^4.0.0" - supports-color@^3.1.0: version "3.2.3" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz" integrity sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A== dependencies: has-flag "^1.0.0" supports-color@^5.3.0: version "5.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz" integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== dependencies: has-flag "^3.0.0" supports-color@^7.1.0: version "7.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== dependencies: has-flag "^4.0.0" -supports-preserve-symlinks-flag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" - integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== +supports-color@6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz" + integrity sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg== + dependencies: + has-flag "^3.0.0" + +supports-color@8.1.1: + version "8.1.1" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" sync-request@^6.0.0: version "6.1.0" - resolved "https://registry.yarnpkg.com/sync-request/-/sync-request-6.1.0.tgz#e96217565b5e50bbffe179868ba75532fb597e68" + resolved "https://registry.npmjs.org/sync-request/-/sync-request-6.1.0.tgz" integrity sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw== dependencies: http-response-object "^3.0.1" @@ -5331,14 +5702,14 @@ sync-request@^6.0.0: sync-rpc@^1.2.1: version "1.3.6" - resolved "https://registry.yarnpkg.com/sync-rpc/-/sync-rpc-1.3.6.tgz#b2e8b2550a12ccbc71df8644810529deb68665a7" + resolved "https://registry.npmjs.org/sync-rpc/-/sync-rpc-1.3.6.tgz" integrity sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw== dependencies: get-port "^3.1.0" table-layout@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/table-layout/-/table-layout-1.0.2.tgz#c4038a1853b0136d63365a734b6931cf4fad4a04" + resolved "https://registry.npmjs.org/table-layout/-/table-layout-1.0.2.tgz" integrity sha512-qd/R7n5rQTRFi+Zf2sk5XVVd9UQl6ZkduPFC3S7WEGJAmetDTjY3qPN50eSKzwuzEyQKy5TN2TiZdkIjos2L6A== dependencies: array-back "^4.0.1" @@ -5348,7 +5719,7 @@ table-layout@^1.0.2: table@^6.8.0: version "6.8.1" - resolved "https://registry.yarnpkg.com/table/-/table-6.8.1.tgz#ea2b71359fe03b017a5fbc296204471158080bdf" + resolved "https://registry.npmjs.org/table/-/table-6.8.1.tgz" integrity sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA== dependencies: ajv "^8.0.1" @@ -5357,9 +5728,14 @@ table@^6.8.0: string-width "^4.2.3" strip-ansi "^6.0.1" +testrpc@0.0.1: + version "0.0.1" + resolved "https://registry.npmjs.org/testrpc/-/testrpc-0.0.1.tgz" + integrity sha512-afH1hO+SQ/VPlmaLUFj2636QMeDvPCeQMc/9RBMW0IfjNe9gFD9Ra3ShqYkB7py0do1ZcCna/9acHyzTJ+GcNA== + then-request@^6.0.0: version "6.0.2" - resolved "https://registry.yarnpkg.com/then-request/-/then-request-6.0.2.tgz#ec18dd8b5ca43aaee5cb92f7e4c1630e950d4f0c" + resolved "https://registry.npmjs.org/then-request/-/then-request-6.0.2.tgz" integrity sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA== dependencies: "@types/concat-stream" "^1.6.0" @@ -5376,26 +5752,26 @@ then-request@^6.0.0: tmp@0.0.33: version "0.0.33" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" + resolved "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz" integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== dependencies: os-tmpdir "~1.0.2" to-regex-range@^5.0.1: version "5.0.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== dependencies: is-number "^7.0.0" toidentifier@1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" + resolved "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz" integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== tough-cookie@^2.3.3, tough-cookie@~2.5.0: version "2.5.0" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" + resolved "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz" integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== dependencies: psl "^1.1.28" @@ -5403,12 +5779,12 @@ tough-cookie@^2.3.3, tough-cookie@~2.5.0: tr46@~0.0.3: version "0.0.3" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + resolved "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz" integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== ts-command-line-args@^2.2.0: version "2.5.1" - resolved "https://registry.yarnpkg.com/ts-command-line-args/-/ts-command-line-args-2.5.1.tgz#e64456b580d1d4f6d948824c274cf6fa5f45f7f0" + resolved "https://registry.npmjs.org/ts-command-line-args/-/ts-command-line-args-2.5.1.tgz" integrity sha512-H69ZwTw3rFHb5WYpQya40YAX2/w7Ut75uUECbgBIsLmM+BNuYnxsltfyyLMxy6sEeKxgijLTnQtLd0nKd6+IYw== dependencies: chalk "^4.1.0" @@ -5418,12 +5794,12 @@ ts-command-line-args@^2.2.0: ts-essentials@^7.0.1: version "7.0.3" - resolved "https://registry.yarnpkg.com/ts-essentials/-/ts-essentials-7.0.3.tgz#686fd155a02133eedcc5362dc8b5056cde3e5a38" + resolved "https://registry.npmjs.org/ts-essentials/-/ts-essentials-7.0.3.tgz" integrity sha512-8+gr5+lqO3G84KdiTSMRLtuyJ+nTBVRKuCrK4lidMPdVeEp0uqC875uE5NMcaA7YYMN7XsNiFQuMvasF8HT/xQ== -ts-node@>=8.0.0: +ts-node@*, ts-node@>=8.0.0: version "10.9.1" - resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.1.tgz#e73de9102958af9e1f0b168a6ff320e25adcff4b" + resolved "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz" integrity sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw== dependencies: "@cspotcode/source-map-support" "^0.8.0" @@ -5442,61 +5818,66 @@ ts-node@>=8.0.0: tslib@^1.9.3: version "1.14.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" + resolved "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== tsort@0.0.1: version "0.0.1" - resolved "https://registry.yarnpkg.com/tsort/-/tsort-0.0.1.tgz#e2280f5e817f8bf4275657fd0f9aebd44f5a2786" + resolved "https://registry.npmjs.org/tsort/-/tsort-0.0.1.tgz" integrity sha512-Tyrf5mxF8Ofs1tNoxA13lFeZ2Zrbd6cKbuH3V+MQ5sb6DtBj5FjrXVsRWT8YvNAQTqNoz66dz1WsbigI22aEnw== tunnel-agent@^0.6.0: version "0.6.0" - resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + resolved "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz" integrity sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w== dependencies: safe-buffer "^5.0.1" tweetnacl-util@^0.15.1: version "0.15.1" - resolved "https://registry.yarnpkg.com/tweetnacl-util/-/tweetnacl-util-0.15.1.tgz#b80fcdb5c97bcc508be18c44a4be50f022eea00b" + resolved "https://registry.npmjs.org/tweetnacl-util/-/tweetnacl-util-0.15.1.tgz" integrity sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw== -tweetnacl@^0.14.3, tweetnacl@~0.14.0: +tweetnacl@^0.14.3: version "0.14.5" - resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" + resolved "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz" integrity sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA== tweetnacl@^1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-1.0.3.tgz#ac0af71680458d8a6378d0d0d050ab1407d35596" + resolved "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz" integrity sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw== +tweetnacl@~0.14.0: + version "0.14.5" + resolved "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz" + integrity sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA== + type-check@~0.3.2: version "0.3.2" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" + resolved "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz" integrity sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg== dependencies: prelude-ls "~1.1.2" type-detect@^4.0.0, type-detect@^4.0.5: version "4.0.8" - resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" + resolved "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz" integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== type-fest@^0.21.3: version "0.21.3" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz" integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== type-fest@^0.7.1: version "0.7.1" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.7.1.tgz#8dda65feaf03ed78f0a3f9678f1869147f7c5c48" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.7.1.tgz" integrity sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg== -typechain@^8.0.0, typechain@^8.1.0: +typechain@^8.0.0, typechain@^8.1.0, typechain@^8.1.1: version "8.2.0" - resolved "https://registry.yarnpkg.com/typechain/-/typechain-8.2.0.tgz#bd4fc8f111d4405e36858bae6f744604617b60f3" + resolved "https://registry.npmjs.org/typechain/-/typechain-8.2.0.tgz" integrity sha512-tZqhqjxJ9xAS/Lh32jccTjMkpx7sTdUVVHAy5Bf0TIer5QFNYXotiX74oCvoVYjyxUKDK3MXHtMFzMyD3kE+jg== dependencies: "@types/prettier" "^2.1.1" @@ -5512,7 +5893,7 @@ typechain@^8.0.0, typechain@^8.1.0: typed-array-length@^1.0.4: version "1.0.4" - resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.4.tgz#89d83785e5c4098bec72e08b319651f0eac9c1bb" + resolved "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz" integrity sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng== dependencies: call-bind "^1.0.2" @@ -5521,32 +5902,32 @@ typed-array-length@^1.0.4: typedarray@^0.0.6: version "0.0.6" - resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" + resolved "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz" integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA== -typescript@>=4.5.0: +typescript@*, typescript@>=2.7, typescript@>=3.7.0, typescript@>=4.3.0, typescript@>=4.5.0: version "5.1.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.1.3.tgz#8d84219244a6b40b6fb2b33cc1c062f715b9e826" + resolved "https://registry.npmjs.org/typescript/-/typescript-5.1.3.tgz" integrity sha512-XH627E9vkeqhlZFQuL+UsyAXEnibT0kWR2FWONlr4sTjvxyJYnyefgrkyECLzM5NenmKzRAy2rR/OlYLA1HkZw== typical@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/typical/-/typical-4.0.0.tgz#cbeaff3b9d7ae1e2bbfaf5a4e6f11eccfde94fc4" + resolved "https://registry.npmjs.org/typical/-/typical-4.0.0.tgz" integrity sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw== typical@^5.2.0: version "5.2.0" - resolved "https://registry.yarnpkg.com/typical/-/typical-5.2.0.tgz#4daaac4f2b5315460804f0acf6cb69c52bb93066" + resolved "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz" integrity sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg== uglify-js@^3.1.4: version "3.17.4" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.17.4.tgz#61678cf5fa3f5b7eb789bb345df29afb8257c22c" + resolved "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz" integrity sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g== unbox-primitive@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" + resolved "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz" integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== dependencies: call-bind "^1.0.2" @@ -5556,36 +5937,36 @@ unbox-primitive@^1.0.2: undici@^5.14.0: version "5.22.1" - resolved "https://registry.yarnpkg.com/undici/-/undici-5.22.1.tgz#877d512effef2ac8be65e695f3586922e1a57d7b" + resolved "https://registry.npmjs.org/undici/-/undici-5.22.1.tgz" integrity sha512-Ji2IJhFXZY0x/0tVBXeQwgPlLWw13GVzpsWPQ3rV50IFMMof2I55PZZxtm4P6iNq+L5znYN9nSTAq0ZyE6lSJw== dependencies: busboy "^1.6.0" universalify@^0.1.0: version "0.1.2" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" + resolved "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz" integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== universalify@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" + resolved "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz" integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== unpipe@1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + resolved "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz" integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== uri-js@^4.2.2: version "4.4.1" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + resolved "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz" integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== dependencies: punycode "^2.1.0" url@^0.11.0: version "0.11.1" - resolved "https://registry.yarnpkg.com/url/-/url-0.11.1.tgz#26f90f615427eca1b9f4d6a28288c147e2302a32" + resolved "https://registry.npmjs.org/url/-/url-0.11.1.tgz" integrity sha512-rWS3H04/+mzzJkv0eZ7vEDGiQbgquI1fGfOad6zKvgYQi1SzMmhl7c/DdRGxhaWrVH6z0qWITo8rpnxK/RfEhA== dependencies: punycode "^1.4.1" @@ -5593,44 +5974,52 @@ url@^0.11.0: utf-8-validate@5.0.7: version "5.0.7" - resolved "https://registry.yarnpkg.com/utf-8-validate/-/utf-8-validate-5.0.7.tgz#c15a19a6af1f7ad9ec7ddc425747ca28c3644922" + resolved "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.7.tgz" integrity sha512-vLt1O5Pp+flcArHGIyKEQq883nBt8nN8tVBcoL0qUXj2XT1n7p70yGIq2VK98I5FdZ1YHc0wk/koOnHjnXWk1Q== dependencies: node-gyp-build "^4.3.0" utf8@3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/utf8/-/utf8-3.0.0.tgz#f052eed1364d696e769ef058b183df88c87f69d1" + resolved "https://registry.npmjs.org/utf8/-/utf8-3.0.0.tgz" integrity sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ== util-deprecate@^1.0.1, util-deprecate@~1.0.1: version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== -uuid@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-2.0.1.tgz#c2a30dedb3e535d72ccf82e343941a50ba8533ac" - integrity sha512-nWg9+Oa3qD2CQzHIP4qKUqwNfzKn8P0LtFhotaCTFchsV7ZfDhAybeip/HZVeMIpZi9JgY1E3nUlwaCmZT1sEg== - uuid@^3.3.2: version "3.4.0" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" + resolved "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz" integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== uuid@^8.3.2: version "8.3.2" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" + resolved "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz" integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== +uuid@2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/uuid/-/uuid-2.0.1.tgz" + integrity sha512-nWg9+Oa3qD2CQzHIP4qKUqwNfzKn8P0LtFhotaCTFchsV7ZfDhAybeip/HZVeMIpZi9JgY1E3nUlwaCmZT1sEg== + v8-compile-cache-lib@^3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" + resolved "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz" integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== +validate-npm-package-license@^3.0.1: + version "3.0.4" + resolved "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz" + integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== + dependencies: + spdx-correct "^3.0.0" + spdx-expression-parse "^3.0.0" + verror@1.10.0: version "1.10.0" - resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" + resolved "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz" integrity sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw== dependencies: assert-plus "^1.0.0" @@ -5639,29 +6028,30 @@ verror@1.10.0: wasmbuilder@0.0.16: version "0.0.16" - resolved "https://registry.yarnpkg.com/wasmbuilder/-/wasmbuilder-0.0.16.tgz#f34c1f2c047d2f6e1065cbfec5603988f16d8549" + resolved "https://registry.npmjs.org/wasmbuilder/-/wasmbuilder-0.0.16.tgz" integrity sha512-Qx3lEFqaVvp1cEYW7Bfi+ebRJrOiwz2Ieu7ZG2l7YyeSJIok/reEQCQCuicj/Y32ITIJuGIM9xZQppGx5LrQdA== wasmcurves@0.2.2: version "0.2.2" - resolved "https://registry.yarnpkg.com/wasmcurves/-/wasmcurves-0.2.2.tgz#ca444f6a6f6e2a5cbe6629d98ff478a62b4ccb2b" + resolved "https://registry.npmjs.org/wasmcurves/-/wasmcurves-0.2.2.tgz" integrity sha512-JRY908NkmKjFl4ytnTu5ED6AwPD+8VJ9oc94kdq7h5bIwbj0L4TDJ69mG+2aLs2SoCmGfqIesMWTEJjtYsoQXQ== dependencies: wasmbuilder "0.0.16" web-worker@^1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/web-worker/-/web-worker-1.2.0.tgz#5d85a04a7fbc1e7db58f66595d7a3ac7c9c180da" + resolved "https://registry.npmjs.org/web-worker/-/web-worker-1.2.0.tgz" integrity sha512-PgF341avzqyx60neE9DD+XS26MMNMoUQRz9NOZwW32nPQrF6p77f1htcnjBSEV8BGMKZ16choqUG4hyI0Hx7mA== -web3-utils@^1.3.6: - version "1.10.0" - resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.10.0.tgz#ca4c1b431a765c14ac7f773e92e0fd9377ccf578" - integrity sha512-kSaCM0uMcZTNUSmn5vMEhlo02RObGNRRCkdX0V9UTAU0+lrvn0HSaudyCo6CQzuXUsnuY2ERJGCGPfeWmv19Rg== +web3-utils@^1.0.0-beta.31, web3-utils@^1.3.6: + version "1.10.4" + resolved "https://registry.npmjs.org/web3-utils/-/web3-utils-1.10.4.tgz" + integrity sha512-tsu8FiKJLk2PzhDl9fXbGUWTkkVXYhtTA+SmEFkKft+9BgwLxfCRpU96sWv7ICC8zixBNd3JURVoiR3dUXgP8A== dependencies: + "@ethereumjs/util" "^8.1.0" bn.js "^5.2.1" ethereum-bloom-filters "^1.0.6" - ethereumjs-util "^7.1.0" + ethereum-cryptography "^2.1.2" ethjs-unit "0.1.6" number-to-bn "1.7.0" randombytes "^2.1.0" @@ -5669,12 +6059,12 @@ web3-utils@^1.3.6: webidl-conversions@^3.0.0: version "3.0.1" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" + resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz" integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== whatwg-url@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" + resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz" integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== dependencies: tr46 "~0.0.3" @@ -5682,7 +6072,7 @@ whatwg-url@^5.0.0: which-boxed-primitive@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" + resolved "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz" integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== dependencies: is-bigint "^1.0.1" @@ -5691,14 +6081,19 @@ which-boxed-primitive@^1.0.2: is-string "^1.0.5" is-symbol "^1.0.3" +which-module@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz" + integrity sha512-F6+WgncZi/mJDrammbTuHe1q0R5hOXv/mBaiNA2TCNT/LTHusX0V+CJnj9XT8ki5ln2UZyyddDgHfCzyrOH7MQ== + which-module@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.1.tgz#776b1fe35d90aebe99e8ac15eb24093389a4a409" + resolved "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz" integrity sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ== which-typed-array@^1.1.9: version "1.1.9" - resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.9.tgz#307cf898025848cf995e795e8423c7f337efbde6" + resolved "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz" integrity sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA== dependencies: available-typed-arrays "^1.0.5" @@ -5708,33 +6103,38 @@ which-typed-array@^1.1.9: has-tostringtag "^1.0.0" is-typed-array "^1.1.10" -which@1.3.1, which@^1.1.1, which@^1.3.1: +which@^1.1.1, which@^1.3.1, which@1.3.1: version "1.3.1" - resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + resolved "https://registry.npmjs.org/which/-/which-1.3.1.tgz" integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== dependencies: isexe "^2.0.0" wide-align@1.1.3: version "1.1.3" - resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" + resolved "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz" integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== dependencies: string-width "^1.0.2 || 2" +window-size@^0.2.0: + version "0.2.0" + resolved "https://registry.npmjs.org/window-size/-/window-size-0.2.0.tgz" + integrity sha512-UD7d8HFA2+PZsbKyaOCEy8gMh1oDtHgJh1LfgjQ4zVXmYjAT/kvz3PueITKuqDiIXQe7yzpPnxX3lNc+AhQMyw== + word-wrap@~1.2.3: version "1.2.3" - resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" + resolved "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz" integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== wordwrap@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" + resolved "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz" integrity sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q== wordwrapjs@^4.0.0: version "4.0.1" - resolved "https://registry.yarnpkg.com/wordwrapjs/-/wordwrapjs-4.0.1.tgz#d9790bccfb110a0fc7836b5ebce0937b37a8b98f" + resolved "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-4.0.1.tgz" integrity sha512-kKlNACbvHrkpIw6oPeYDSmdCTu2hdMHoyXLTcUKala++lx5Y+wjJ/e474Jqv5abnVmwxw08DiTuHmw69lJGksA== dependencies: reduce-flatten "^2.0.0" @@ -5742,12 +6142,20 @@ wordwrapjs@^4.0.0: workerpool@6.2.1: version "6.2.1" - resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.2.1.tgz#46fc150c17d826b86a008e5a4508656777e9c343" + resolved "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz" integrity sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw== +wrap-ansi@^2.0.0: + version "2.1.0" + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz" + integrity sha512-vAaEaDM946gbNpH5pLVNR+vX2ht6n0Bt3GXwVB1AuAqZosOvHNF3P7wDnh8KLkSqgUh0uh77le7Owgoz+Z9XBw== + dependencies: + string-width "^1.0.1" + strip-ansi "^3.0.1" + wrap-ansi@^5.1.0: version "5.1.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz" integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q== dependencies: ansi-styles "^3.2.0" @@ -5756,7 +6164,7 @@ wrap-ansi@^5.1.0: wrap-ansi@^7.0.0: version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== dependencies: ansi-styles "^4.0.0" @@ -5765,70 +6173,73 @@ wrap-ansi@^7.0.0: wrappy@1: version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== -ws@7.4.6: +ws@^7.4.6, ws@7.4.6: version "7.4.6" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.6.tgz#5654ca8ecdeee47c33a9a4bf6d28e2be2980377c" + resolved "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz" integrity sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A== -ws@^7.4.6: - version "7.5.9" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591" - integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== - xmlhttprequest@1.8.0: version "1.8.0" - resolved "https://registry.yarnpkg.com/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz#67fe075c5c24fef39f9d65f5f7b7fe75171968fc" + resolved "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz" integrity sha512-58Im/U0mlVBLM38NdZjHyhuMtCqa61469k2YP/AaPbvCoV9aQGUpbJBj1QRm2ytRiVQBD/fsw7L2bJGDVQswBA== xtend@^4.0.1, xtend@^4.0.2, xtend@~4.0.0: version "4.0.2" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" + resolved "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz" integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== +y18n@^3.2.1: + version "3.2.2" + resolved "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz" + integrity sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ== + y18n@^4.0.0: version "4.0.3" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf" + resolved "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz" integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ== y18n@^5.0.5: version "5.0.8" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" + resolved "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz" integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== yallist@^3.0.2: version "3.1.1" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + resolved "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz" integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== yallist@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + resolved "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz" integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== -yargs-parser@13.1.2, yargs-parser@^13.1.2: +yargs-parser@^13.1.2, yargs-parser@13.1.2: version "13.1.2" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38" + resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz" integrity sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg== dependencies: camelcase "^5.0.0" decamelize "^1.2.0" -yargs-parser@20.2.4: +yargs-parser@^2.4.1: + version "2.4.1" + resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-2.4.1.tgz" + integrity sha512-9pIKIJhnI5tonzG6OnCFlz/yln8xHYcGl+pn3xR0Vzff0vzN1PbNRaelgfgRUwZ3s4i3jvxT9WhmUGL4whnasA== + dependencies: + camelcase "^3.0.0" + lodash.assign "^4.0.6" + +yargs-parser@^20.2.2, yargs-parser@20.2.4: version "20.2.4" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54" + resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz" integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA== -yargs-parser@^20.2.2: - version "20.2.9" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" - integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== - yargs-unparser@1.6.0: version "1.6.0" - resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-1.6.0.tgz#ef25c2c769ff6bd09e4b0f9d7c605fb27846ea9f" + resolved "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.0.tgz" integrity sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw== dependencies: flat "^4.1.0" @@ -5837,7 +6248,7 @@ yargs-unparser@1.6.0: yargs-unparser@2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz#f131f9226911ae5d9ad38c432fe809366c2325eb" + resolved "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz" integrity sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA== dependencies: camelcase "^6.0.0" @@ -5845,9 +6256,9 @@ yargs-unparser@2.0.0: flat "^5.0.2" is-plain-obj "^2.1.0" -yargs@13.3.2, yargs@^13.3.0: +yargs@^13.3.0, yargs@13.3.2: version "13.3.2" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd" + resolved "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz" integrity sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw== dependencies: cliui "^5.0.0" @@ -5861,9 +6272,29 @@ yargs@13.3.2, yargs@^13.3.0: y18n "^4.0.0" yargs-parser "^13.1.2" +yargs@^4.7.1: + version "4.8.1" + resolved "https://registry.npmjs.org/yargs/-/yargs-4.8.1.tgz" + integrity sha512-LqodLrnIDM3IFT+Hf/5sxBnEGECrfdC1uIbgZeJmESCSo4HoCAaKEus8MylXHAkdacGc0ye+Qa+dpkuom8uVYA== + dependencies: + cliui "^3.2.0" + decamelize "^1.1.1" + get-caller-file "^1.0.1" + lodash.assign "^4.0.3" + os-locale "^1.4.0" + read-pkg-up "^1.0.1" + require-directory "^2.1.1" + require-main-filename "^1.0.1" + set-blocking "^2.0.0" + string-width "^1.0.1" + which-module "^1.0.0" + window-size "^0.2.0" + y18n "^3.2.1" + yargs-parser "^2.4.1" + yargs@16.2.0: version "16.2.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" + resolved "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz" integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== dependencies: cliui "^7.0.2" @@ -5876,15 +6307,15 @@ yargs@16.2.0: yn@3.1.1: version "3.1.1" - resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" + resolved "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz" integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== yocto-queue@^0.1.0: version "0.1.0" - resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz" integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== zksync-web3@^0.14.3: version "0.14.3" - resolved "https://registry.yarnpkg.com/zksync-web3/-/zksync-web3-0.14.3.tgz#64ac2a16d597464c3fc4ae07447a8007631c57c9" + resolved "https://registry.npmjs.org/zksync-web3/-/zksync-web3-0.14.3.tgz" integrity sha512-hT72th4AnqyLW1d5Jlv8N2B/qhEnl2NePK2A3org7tAa24niem/UAaHMkEvmWI3SF9waYUPtqAtjpf+yvQ9zvQ==