From f2f2c43b3ff9b02e588f21658872a7813933cb8e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Federico=20Mart=C3=ADn=20Alconada=20Verzini?= Date: Mon, 15 Jan 2024 09:42:04 -0300 Subject: [PATCH 01/13] feat: add faucet deploy migration --- script/migrations/14-factory_v3.sol | 4 +- script/migrations/15-faucet_v2.sol | 70 +++++++++++++++++++++++++++++ test/artifacts/7887/addresses.json | 2 +- 3 files changed, 74 insertions(+), 2 deletions(-) create mode 100644 script/migrations/15-faucet_v2.sol diff --git a/script/migrations/14-factory_v3.sol b/script/migrations/14-factory_v3.sol index 50aa8b31e..671dee66d 100644 --- a/script/migrations/14-factory_v3.sol +++ b/script/migrations/14-factory_v3.sol @@ -54,7 +54,9 @@ contract KintoMigration14DeployScript is Create2Helper, ArtifactsReader { ); // 1) Deploy new wallet factory - _factoryImpl = KintoWalletFactoryV3(payable(_walletFactory.deployContract(vm.envAddress("LEDGER_ADMIN"), 0, bytecode, bytes32(0)))); + _factoryImpl = KintoWalletFactoryV3( + payable(_walletFactory.deployContract(vm.envAddress("LEDGER_ADMIN"), 0, bytecode, bytes32(0))) + ); vm.stopBroadcast(); // Start admin vm.startBroadcast(); diff --git a/script/migrations/15-faucet_v2.sol b/script/migrations/15-faucet_v2.sol new file mode 100644 index 000000000..8c855e89a --- /dev/null +++ b/script/migrations/15-faucet_v2.sol @@ -0,0 +1,70 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.18; + +import "../../src/Faucet.sol"; + +import "../../test/helpers/Create2Helper.sol"; +import "../../test/helpers/ArtifactsReader.sol"; +import "../../test/helpers/UUPSProxy.sol"; + +import "forge-std/Script.sol"; +import "forge-std/console.sol"; + +contract KintoMigration15DeployScript is Create2Helper, ArtifactsReader { + using ECDSAUpgradeable for bytes32; + + Faucet _implementation; + Faucet _faucet; + UUPSProxy _proxy; + + function setUp() public {} + + function run() public { + console.log("Chain ID", vm.toString(block.chainid)); + + uint256 deployerPrivateKey = vm.envUint("PRIVATE_KEY"); + console.log("Executing with address", msg.sender); + + address faucetAddr = payable(_getChainDeployment("Faucet")); + if (faucetAddr != address(0)) { + console.log("Already deployed faucet", faucetAddr); + return; + } + + // make sure wallet factory is deployed + address factory = _getChainDeployment("KintoWalletFactory"); + require(factory != address(0), "Need to deploy the wallet factory first"); + + // Faucet + faucetAddr = computeAddress(0, abi.encodePacked(type(Faucet).creationCode)); + if (isContract(faucetAddr)) { + _implementation = Faucet(payable(faucetAddr)); + console.log("Already deployed faucet implementation at", address(faucetAddr)); + } else { + // Deploy Faucet implementation + vm.broadcast(deployerPrivateKey); + _implementation = new Faucet{salt: 0}(factory); + console.log("Faucet implementation deployed at", address(_implementation)); + } + address faucetProxyAddr = + computeAddress(0, abi.encodePacked(type(UUPSProxy).creationCode, abi.encode(address(_implementation), ""))); + if (isContract(faucetProxyAddr)) { + _proxy = UUPSProxy(payable(faucetProxyAddr)); + _faucet = Faucet(payable(address(_proxy))); + console.log("Already deployed Faucet proxy at", address(faucetProxyAddr)); + } else { + // deploy proxy contract and point it to implementation + vm.broadcast(deployerPrivateKey); + _proxy = new UUPSProxy{salt: 0}(address(_implementation), ""); + console.log("Faucet proxy deployed at ", address(_proxy)); + + // initialize proxy + vm.broadcast(deployerPrivateKey); + Faucet(payable(address(_proxy))).initialize(); + } + + // Writes the addresses to a file + console.log(string.concat("Faucet-impl: ", vm.toString(address(_implementation)))); + console.log(string.concat("Faucet: ", vm.toString(address(_proxy)))); + } +} diff --git a/test/artifacts/7887/addresses.json b/test/artifacts/7887/addresses.json index 7330f0fcd..a691ca3f2 100644 --- a/test/artifacts/7887/addresses.json +++ b/test/artifacts/7887/addresses.json @@ -18,7 +18,7 @@ "EngenCredits-impl": "0xd128059962F92e7f19318EB03D5Bfd64EF9c5DA3", "EngenCredits": "0xb2F2BF932105A192566b56643BCa738eec06b3f1", "KintoWallet-admin": "0x2e2B1c42E38f5af81771e65D87729E57ABD1337a", -"Faucet": "0xa62Bf9b53044885CddFcbC4cA52f51f8ae39eCFE", +"Faucet-old": "0xa62Bf9b53044885CddFcbC4cA52f51f8ae39eCFE", "Counter": "0xdb791AF345A21588957E4e45596411b2Be2BD4cd", "KintoAppRegistry": "0x5A2b641b84b0230C8e75F55d5afd27f4Dbd59d5b", "KintoAppRegistry-impl": "0xEDA88D4810E14aE4C384369CbC6F1510787Dc4fB" From b98a59f082731a72e235720a9828a870d59c5085 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Federico=20Mart=C3=ADn=20Alconada=20Verzini?= Date: Mon, 15 Jan 2024 10:15:31 -0300 Subject: [PATCH 02/13] chore: do deployments through factory --- script/migrations/15-faucet_v2.sol | 57 +++++++++++++----------------- 1 file changed, 24 insertions(+), 33 deletions(-) diff --git a/script/migrations/15-faucet_v2.sol b/script/migrations/15-faucet_v2.sol index 8c855e89a..b39526264 100644 --- a/script/migrations/15-faucet_v2.sol +++ b/script/migrations/15-faucet_v2.sol @@ -2,6 +2,7 @@ pragma solidity ^0.8.18; import "../../src/Faucet.sol"; +import "../../src/wallet/KintoWalletFactory.sol"; import "../../test/helpers/Create2Helper.sol"; import "../../test/helpers/ArtifactsReader.sol"; @@ -14,7 +15,6 @@ contract KintoMigration15DeployScript is Create2Helper, ArtifactsReader { using ECDSAUpgradeable for bytes32; Faucet _implementation; - Faucet _faucet; UUPSProxy _proxy; function setUp() public {} @@ -25,43 +25,34 @@ contract KintoMigration15DeployScript is Create2Helper, ArtifactsReader { uint256 deployerPrivateKey = vm.envUint("PRIVATE_KEY"); console.log("Executing with address", msg.sender); - address faucetAddr = payable(_getChainDeployment("Faucet")); - if (faucetAddr != address(0)) { - console.log("Already deployed faucet", faucetAddr); - return; - } + vm.startBroadcast(deployerPrivateKey); + + // make sure faucet proxy is not already deployed + address faucetProxy = payable(_getChainDeployment("Faucet")); + require(faucetProxy == address(0), "Faucet proxy is already deployed"); // make sure wallet factory is deployed address factory = _getChainDeployment("KintoWalletFactory"); require(factory != address(0), "Need to deploy the wallet factory first"); - // Faucet - faucetAddr = computeAddress(0, abi.encodePacked(type(Faucet).creationCode)); - if (isContract(faucetAddr)) { - _implementation = Faucet(payable(faucetAddr)); - console.log("Already deployed faucet implementation at", address(faucetAddr)); - } else { - // Deploy Faucet implementation - vm.broadcast(deployerPrivateKey); - _implementation = new Faucet{salt: 0}(factory); - console.log("Faucet implementation deployed at", address(_implementation)); - } - address faucetProxyAddr = - computeAddress(0, abi.encodePacked(type(UUPSProxy).creationCode, abi.encode(address(_implementation), ""))); - if (isContract(faucetProxyAddr)) { - _proxy = UUPSProxy(payable(faucetProxyAddr)); - _faucet = Faucet(payable(address(_proxy))); - console.log("Already deployed Faucet proxy at", address(faucetProxyAddr)); - } else { - // deploy proxy contract and point it to implementation - vm.broadcast(deployerPrivateKey); - _proxy = new UUPSProxy{salt: 0}(address(_implementation), ""); - console.log("Faucet proxy deployed at ", address(_proxy)); - - // initialize proxy - vm.broadcast(deployerPrivateKey); - Faucet(payable(address(_proxy))).initialize(); - } + // use wallet factory to deploy Faucet implementation & proxy + KintoWalletFactory walletFactory = KintoWalletFactory(payable(factory)); + + // deploy Faucet implementation + bytes memory bytecode = abi.encodePacked(type(Faucet).creationCode, abi.encode(factory)); + _implementation = Faucet(payable(walletFactory.deployContract(msg.sender, 0, bytecode, bytes32(0)))); + + // deploy Faucet proxy + bytecode = abi.encodePacked(type(UUPSProxy).creationCode, abi.encode(address(_implementation), "")); + _proxy = UUPSProxy(payable(walletFactory.deployContract(msg.sender, 0, bytecode, bytes32(0)))); + + // initialize proxy + Faucet(payable(address(_proxy))).initialize(); + + vm.stopBroadcast(); + + // sanity check: faucet has the new claim amount + require(Faucet(payable(address(_proxy))).CLAIM_AMOUNT() == 1 ether / 2500, "Claim amount is not correct"); // Writes the addresses to a file console.log(string.concat("Faucet-impl: ", vm.toString(address(_implementation)))); From 908130e7c83586992e97279797f00f99370601e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Federico=20Mart=C3=ADn=20Alconada=20Verzini?= Date: Mon, 15 Jan 2024 10:16:27 -0300 Subject: [PATCH 03/13] refactor: polish export.js --- utils/export.js | 152 +++++++++++++++++++++++++++++++++--------------- 1 file changed, 105 insertions(+), 47 deletions(-) diff --git a/utils/export.js b/utils/export.js index 3238c38d2..c286547f0 100644 --- a/utils/export.js +++ b/utils/export.js @@ -3,63 +3,121 @@ const path = require('path'); const execSync = require('child_process').execSync; const dirPath = './src'; // Replace with your actual directory path -const files = fs.readdirSync(dirPath); +const network = process.argv[2]; +console.log(`Exporting contracts for network: ${network}\n`); +const addresses = JSON.parse(fs.readFileSync(`./test/artifacts/${network}/addresses.json`, 'utf-8')); let contracts = {}; -const network = process.argv[2]; -console.log('Exporting contracts for network:', network); -const addresses = JSON.parse(fs.readFileSync(`./test/artifacts/${network}/addresses.json`, 'utf-8')); +/** + * Processes a single .sol to extract its ABI and address. + * @param {string} filePath - path of the Solidity file. + * @param {string} contractName - name of the contract. + */ +function processSolidityFile(filePath, contractName) { + const cmd = `forge inspect ${contractName} abi`; + const result = execSync(cmd).toString(); + console.log(`Exported: ${contractName} ABI`); + + const jsonObject = JSON.parse(result); + let address = addresses[contractName]; + if (!address || address.length < 8) console.error(`* Missing address for ${contractName}`); + contracts[contractName] = { abi: jsonObject, address: address }; +} + +/** + * Processes a directory containing .sol files. + * @param {string} dir - directory to process. + */ +function processDirectory(dir) { + const dirFiles = fs.readdirSync(dir); + dirFiles.forEach(file => { + const filePath = path.join(dir, file); + const fileExt = path.extname(filePath); + + if (fileExt === '.sol') { + const contractName = path.basename(filePath, '.sol'); + processSolidityFile(filePath, contractName); + } + }); +} -// Loop through all directories in src -for (let i = 0; i < files.length; i++) { - const filePath = path.join(dirPath, files[i]); - const fileExt = path.extname(filePath); - if (fileExt === '' && !filePath.includes('interfaces') && !filePath.includes('libraries')) { // Ensure we only process directories - const dirFiles = fs.readdirSync(filePath); - for (let j = 0; j < dirFiles.length; j++) { - const dirFilePath = path.join(filePath, dirFiles[j]); - const dirFileExt = path.extname(dirFilePath); - - if (dirFileExt === '.sol') { // Ensure we only process .sol files - const contractName = path.basename(dirFilePath, '.sol'); - const cmd = `forge inspect ${contractName} abi`; - const result = execSync(cmd).toString(); - console.log('Exported:', contractName, 'ABI'); - const jsonObject = JSON.parse(result); - let address = addresses[contractName]; - if (!address || address.length < 8) { - address = "0x0000000000000000000000000000000000000000"; - console.error('MISSING ADDRESS FOR', contractName); - } - contracts[contractName] = {"abi": jsonObject, "address": address}; - } +/** + * Processes all .sol files in the specified directory and its subdirectories. + */ +function processFiles() { + const files = fs.readdirSync(dirPath); + files.forEach(file => { + const filePath = path.join(dirPath, file); + const fileExt = path.extname(filePath); + + if (fileExt === '' && !filePath.includes('interfaces') && !filePath.includes('libraries')) { + processDirectory(filePath); + } else if (fileExt === '.sol') { + const contractName = path.basename(filePath, '.sol'); + processSolidityFile(filePath, contractName); } - } + }); } +processFiles(); + +const jsonString = JSON.stringify({ contracts: contracts }, null, 2); +fs.writeFileSync(`./artifacts/${network}.json`, jsonString); + + +// const files = fs.readdirSync(dirPath); + -for (let i = 0; i < files.length; i++) { - const filePath = path.join(dirPath, files[i]); - const fileExt = path.extname(filePath); +// // Loop through all directories in src +// for (let i = 0; i < files.length; i++) { +// const filePath = path.join(dirPath, files[i]); +// const fileExt = path.extname(filePath); +// if (fileExt === '' && !filePath.includes('interfaces') && !filePath.includes('libraries')) { // Ensure we only process directories +// const dirFiles = fs.readdirSync(filePath); +// for (let j = 0; j < dirFiles.length; j++) { +// const dirFilePath = path.join(filePath, dirFiles[j]); +// const dirFileExt = path.extname(dirFilePath); + +// if (dirFileExt === '.sol') { // Ensure we only process .sol files +// const contractName = path.basename(dirFilePath, '.sol'); +// const cmd = `forge inspect ${contractName} abi`; +// const result = execSync(cmd).toString(); +// console.log('Exported:', contractName, 'ABI'); +// const jsonObject = JSON.parse(result); +// let address = addresses[contractName]; +// if (!address || address.length < 8) { +// address = "0x0000000000000000000000000000000000000000"; +// console.error('MISSING ADDRESS FOR', contractName); +// } +// contracts[contractName] = {"abi": jsonObject, "address": address}; +// } +// } +// } +// } + + +// for (let i = 0; i < files.length; i++) { +// const filePath = path.join(dirPath, files[i]); +// const fileExt = path.extname(filePath); - if (fileExt === '.sol') { // Ensure we only process .sol files - const contractName = path.basename(filePath, '.sol'); - const cmd = `forge inspect ${contractName} abi`; - const result = execSync(cmd).toString(); +// if (fileExt === '.sol') { // Ensure we only process .sol files +// const contractName = path.basename(filePath, '.sol'); +// const cmd = `forge inspect ${contractName} abi`; +// const result = execSync(cmd).toString(); - console.log('Exported:', contractName, 'ABI'); +// console.log('Exported:', contractName, 'ABI'); - const jsonObject = JSON.parse(result); - let address = addresses[contractName]; - if (!address || address.length < 8) { - address = '0x0000000000000000000000000000000000000000'; - console.error('MISSING ADDRESS FOR', contractName); - } - contracts[contractName] = {"abi": jsonObject, "address": address}; - } -} +// const jsonObject = JSON.parse(result); +// let address = addresses[contractName]; +// if (!address || address.length < 8) { +// address = '0x0000000000000000000000000000000000000000'; +// console.error('MISSING ADDRESS FOR', contractName); +// } +// contracts[contractName] = {"abi": jsonObject, "address": address}; +// } +// } -const jsonString = JSON.stringify({"contracts": contracts}); -fs.writeFileSync(`./artifacts/${network}.json`, jsonString); \ No newline at end of file +// const jsonString = JSON.stringify({"contracts": contracts}); +// fs.writeFileSync(`./artifacts/${network}.json`, jsonString); \ No newline at end of file From e3670b0cb87c415af36f1ba3d57ef40d3c67dbe6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Federico=20Mart=C3=ADn=20Alconada=20Verzini?= Date: Mon, 15 Jan 2024 10:46:05 -0300 Subject: [PATCH 04/13] test: increase coverage for Faucet.sol --- codecov.yml | 1 + test/Faucet.t.sol | 54 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 55 insertions(+) diff --git a/codecov.yml b/codecov.yml index 23ca894d8..3964ad93b 100644 --- a/codecov.yml +++ b/codecov.yml @@ -3,6 +3,7 @@ ignore: - "script" # ignore scripts/ folder - "lib" # ignore libs/ folder - "src/libraries" # ignore src/libraries/ folder since coverage is not yet supported + - "src/sample" # ignore src/sample/ folder comment: layout: " diff, flags, files" diff --git a/test/Faucet.t.sol b/test/Faucet.t.sol index b9e506450..e3ffa71ae 100644 --- a/test/Faucet.t.sol +++ b/test/Faucet.t.sol @@ -136,12 +136,66 @@ contract FaucetTest is UserOp, AATestScaffolding { function testClaimOnBehalf() public { IFaucet.SignatureData memory sigdata = _auxCreateSignature(_user, 3, block.timestamp + 1000); vm.startPrank(_owner); + _faucet.startFaucet{value: 1 ether}(); assertEq(_faucet.claimed(_user), false); assertEq(_faucet.nonces(_user), 0); + _walletFactory.claimFromFaucet(address(_faucet), sigdata); assertEq(_faucet.claimed(_user), true); assertEq(_faucet.nonces(_user), 1); + vm.stopPrank(); } + + function testClaimOnBehalf_RevertWhen_CallerIsNotFactory() public { + vm.prank(_owner); + _faucet.startFaucet{value: 1 ether}(); + + IFaucet.SignatureData memory sigdata = _auxCreateSignature(_user, 3, block.timestamp + 1000); + vm.expectRevert("Only wallet factory can call this"); + _faucet.claimOnBehalf(sigdata); + } + + function testClaim_RevertWhen_FaucerIsNotActive() public { + vm.prank(_owner); + vm.expectRevert("Faucet is not active"); + _faucet.claimKintoETH(); + } + + function testClaim_DeactivatesWhenNotEnoughBalanceForNextClaim() public { + vm.prank(_owner); + _faucet.startFaucet{value: 1 ether}(); + + for (uint256 i = 1; i <= 2500; i++) { + vm.prank(vm.addr(i)); + _faucet.claimKintoETH(); + } + // assert faucet is deactivated + assertEq(address(_faucet).balance, 0); + assertEq(_faucet.active(), false); + } + + /* ============ Withdraw Tests ============ */ + + function testWithdrawAll() public { + vm.startPrank(_owner); + + _faucet.startFaucet{value: 1 ether}(); + assertEq(address(_faucet).balance, 1 ether); + + _faucet.withdrawAll(); + assertEq(address(_faucet).balance, 0); + + vm.stopPrank(); + } + + function testWithdrawAll_RevertWhen_CallerIsNotOwner() public { + vm.prank(_owner); + _faucet.startFaucet{value: 1 ether}(); + assertEq(address(_faucet).balance, 1 ether); + + vm.expectRevert("Ownable: caller is not the owner"); + _faucet.withdrawAll(); + } } From 8c302521d976f136dce1fca8df7ed0a21e631883 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Federico=20Mart=C3=ADn=20Alconada=20Verzini?= Date: Mon, 15 Jan 2024 12:03:09 -0300 Subject: [PATCH 05/13] test: comment test --- test/Faucet.t.sol | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/test/Faucet.t.sol b/test/Faucet.t.sol index e3ffa71ae..f8fa684a5 100644 --- a/test/Faucet.t.sol +++ b/test/Faucet.t.sol @@ -163,18 +163,19 @@ contract FaucetTest is UserOp, AATestScaffolding { _faucet.claimKintoETH(); } - function testClaim_DeactivatesWhenNotEnoughBalanceForNextClaim() public { - vm.prank(_owner); - _faucet.startFaucet{value: 1 ether}(); - - for (uint256 i = 1; i <= 2500; i++) { - vm.prank(vm.addr(i)); - _faucet.claimKintoETH(); - } - // assert faucet is deactivated - assertEq(address(_faucet).balance, 0); - assertEq(_faucet.active(), false); - } + // fixme: makes foundry to hang + // function testClaim_DeactivatesWhenNotEnoughBalanceForNextClaim() public { + // vm.prank(_owner); + // _faucet.startFaucet{value: 1 ether}(); + + // for (uint256 i = 1; i <= 2500; i++) { + // vm.prank(vm.addr(i)); + // _faucet.claimKintoETH(); + // } + // // assert faucet is deactivated + // assertEq(address(_faucet).balance, 0); + // assertEq(_faucet.active(), false); + // } /* ============ Withdraw Tests ============ */ From d4d44f05dd49c936f40fe5630cb6f9599d525c60 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Federico=20Mart=C3=ADn=20Alconada=20Verzini?= Date: Mon, 15 Jan 2024 12:03:28 -0300 Subject: [PATCH 06/13] test: increase coverage for KintoID --- src/KintoID.sol | 67 +++++++++++----------- test/KintoID.t.sol | 138 +++++++++++++++++++++++++++++++++++---------- 2 files changed, 143 insertions(+), 62 deletions(-) diff --git a/src/KintoID.sol b/src/KintoID.sol index fe93e8a0b..2208eeb49 100644 --- a/src/KintoID.sol +++ b/src/KintoID.sol @@ -168,32 +168,21 @@ contract KintoID is /* ============ Burn ============ */ - /** - * @dev Burns a KYC token. - * @param _signatureData Signature data - */ - function burnKYC(SignatureData calldata _signatureData) external override { - require(balanceOf(_signatureData.signer) > 0, "Nothing to burn"); - - _burnp(tokenOfOwnerByIndex(_signatureData.signer, 0), _signatureData); - } - function burn(uint256 /* tokenId */ ) public pure override { require(false, "Use burnKYC instead"); } /** - * @dev Burns a token. - * @param _tokenId Token ID to be burned + * @dev Burns a KYC token. * @param _signatureData Signature data */ - function _burnp(uint256 _tokenId, SignatureData calldata _signatureData) - private - onlySignerVerified(_signatureData) - { + function burnKYC(SignatureData calldata _signatureData) external override onlySignerVerified(_signatureData) { + require(balanceOf(_signatureData.signer) > 0, "Nothing to burn"); + nonces[_signatureData.signer] += 1; - _burn(_tokenId); + _burn(tokenOfOwnerByIndex(_signatureData.signer, 0)); require(balanceOf(_signatureData.signer) == 0, "Balance after burn must be 0"); + // Update metadata after burning the token Metadata storage meta = _kycmetas[_signatureData.signer]; meta.mintedAt = 0; @@ -218,27 +207,39 @@ contract KintoID is { require(_accounts.length == _traitsAndSanctions.length, "Length mismatch"); require(_accounts.length <= 200, "Too many accounts to monitor at once"); + + uint256 time = block.timestamp; + for (uint256 i = 0; i < _accounts.length; i += 1) { + address account = _accounts[i]; Metadata storage meta = _kycmetas[_accounts[i]]; - if (balanceOf(_accounts[i]) == 0) { - continue; - } - meta.updatedAt = block.timestamp; - for (uint256 j = 0; j < _traitsAndSanctions[i].length; j += 1) { - IKintoID.MonitorUpdateData memory updateData = _traitsAndSanctions[i][j]; - if (updateData.isTrait && updateData.isSet) { - addTrait(_accounts[i], uint8(updateData.index)); - } else if (updateData.isTrait && !updateData.isSet) { - removeTrait(_accounts[i], uint8(updateData.index)); - } else if (!updateData.isTrait && updateData.isSet) { - addSanction(_accounts[i], updateData.index); - } else { - removeSanction(_accounts[i], updateData.index); + + if (balanceOf(_accounts[i]) > 0) { + meta.updatedAt = time; + IKintoID.MonitorUpdateData[] memory updates = _traitsAndSanctions[i]; + + for (uint256 j = 0; j < updates.length; j += 1) { + IKintoID.MonitorUpdateData memory updateData = updates[j]; + + if (updateData.isTrait) { + if (updateData.isSet) { + addTrait(account, uint8(updateData.index)); + } else { + removeTrait(account, uint8(updateData.index)); + } + } else { + if (updateData.isSet) { + addSanction(account, updateData.index); + } else { + removeSanction(account, updateData.index); + } + } } } } - lastMonitoredAt = block.timestamp; - emit AccountsMonitoredAt(msg.sender, _accounts.length, block.timestamp); + + lastMonitoredAt = time; + emit AccountsMonitoredAt(msg.sender, _accounts.length, time); } /** diff --git a/test/KintoID.t.sol b/test/KintoID.t.sol index 8fb5ca05b..6b0b409d0 100644 --- a/test/KintoID.t.sol +++ b/test/KintoID.t.sol @@ -47,8 +47,7 @@ contract KintoIDTest is KYCSignature, AATestScaffolding, UserOp { assertEq(_kintoIDv1.name(), "Kinto ID"); assertEq(_kintoIDv1.symbol(), "KINTOID"); } - - // Upgrade Tests + /* ============ Upgrade tests ============ */ function testOwnerCanUpgrade() public { vm.startPrank(_owner); @@ -93,7 +92,7 @@ contract KintoIDTest is KYCSignature, AATestScaffolding, UserOp { assertEq(_kintoIDv2.newFunction(), 1); } - // Mint Tests + /* ============ Mint tests ============ */ function testMintIndividualKYC() public { IKintoID.SignatureData memory sigdata = _auxCreateSignature(_kintoIDv1, _user, _user, 3, block.timestamp + 1000); @@ -162,7 +161,34 @@ contract KintoIDTest is KYCSignature, AATestScaffolding, UserOp { _kintoIDv1.mintIndividualKyc(sigdata, traits); } - // Burn Tests + function testMintIndividualKYC_RevertWhen_AlreadyMinted() public { + IKintoID.SignatureData memory sigdata = _auxCreateSignature(_kintoIDv1, _user, _user, 3, block.timestamp + 1000); + uint8[] memory traits = new uint8[](0); + + vm.prank(_kycProvider); + _kintoIDv1.mintIndividualKyc(sigdata, traits); + + // try minting again should revert + sigdata = _auxCreateSignature(_kintoIDv1, _user, _user, 3, block.timestamp + 1000); + vm.expectRevert("Balance before mint must be 0"); + vm.prank(_kycProvider); + _kintoIDv1.mintIndividualKyc(sigdata, traits); + } + + /* ============ Burn tests ============ */ + + function testBurnKYC_RevertWhen_UsingBurn() public { + vm.expectRevert("Use burnKYC instead"); + _kintoIDv1.burn(1); + } + + function test_RevertWhen_BurnIsCalled() public { + approveKYC(_kycProvider, _user, _userPk); + uint256 tokenIdx = _kintoIDv1.tokenOfOwnerByIndex(_user, 0); + vm.prank(_user); + vm.expectRevert("Use burnKYC instead"); + _kintoIDv1.burn(tokenIdx); + } function testBurnKYC() public { IKintoID.SignatureData memory sigdata = _auxCreateSignature(_kintoIDv1, _user, _user, 3, block.timestamp + 1000); @@ -211,14 +237,27 @@ contract KintoIDTest is KYCSignature, AATestScaffolding, UserOp { _kintoIDv1.burnKYC(sigdata); } - // Monitor Tests + /* ============ Monitor tests ============ */ + function testMonitorNoChanges() public { vm.startPrank(_kycProvider); _kintoIDv1.monitor(new address[](0), new IKintoID.MonitorUpdateData[][](0)); assertEq(_kintoIDv1.lastMonitoredAt(), block.timestamp); } - function test_RevertWhen_OnlyProviderCanMonitor(address someone) public { + function test_RevertWhen_LenghtMismatch() public { + vm.expectRevert("Length mismatch"); + vm.prank(_kycProvider); + _kintoIDv1.monitor(new address[](2), new IKintoID.MonitorUpdateData[][](1)); + } + + function test_RevertWhen_TooManyAccounts() public { + vm.expectRevert("Too many accounts to monitor at once"); + vm.prank(_kycProvider); + _kintoIDv1.monitor(new address[](201), new IKintoID.MonitorUpdateData[][](201)); + } + + function test_RevertWhen_CallerIsNotProvider(address someone) public { vm.assume(someone != _kycProvider); bytes memory err = abi.encodePacked( "AccessControl: account ", @@ -241,16 +280,19 @@ contract KintoIDTest is KYCSignature, AATestScaffolding, UserOp { assertEq(_kintoIDv1.isSanctionsMonitored(6), false); } - function testSettingTraitsAndSanctions() public { + function testMonitor_WhenPassingTraitsAndSactions() public { approveKYC(_kycProvider, _user, _userPk); // monitor address[] memory accounts = new address[](1); accounts[0] = _user; + IKintoID.MonitorUpdateData[][] memory updates = new IKintoID.MonitorUpdateData[][](1); - updates[0] = new IKintoID.MonitorUpdateData[](2); - updates[0][0] = IKintoID.MonitorUpdateData(true, true, 5); - updates[0][1] = IKintoID.MonitorUpdateData(true, false, 1); // remove 1 + updates[0] = new IKintoID.MonitorUpdateData[](4); + updates[0][0] = IKintoID.MonitorUpdateData(true, true, 5); // add trait 5 + updates[0][1] = IKintoID.MonitorUpdateData(true, false, 1); // remove trait 1 + updates[0][2] = IKintoID.MonitorUpdateData(false, true, 6); // add sanction 6 + updates[0][3] = IKintoID.MonitorUpdateData(false, false, 2); // remove sanction 2 vm.prank(_kycProvider); _kintoIDv1.monitor(accounts, updates); @@ -259,11 +301,13 @@ contract KintoIDTest is KYCSignature, AATestScaffolding, UserOp { assertEq(_kintoIDv1.hasTrait(_user, 1), false); assertEq(_kintoIDv1.isSanctionsSafeIn(_user, 5), true); assertEq(_kintoIDv1.isSanctionsSafeIn(_user, 1), true); + assertEq(_kintoIDv1.isSanctionsSafeIn(_user, 6), false); + assertEq(_kintoIDv1.isSanctionsSafeIn(_user, 2), true); } /* ============ Trait Tests ============ */ - function testAddTrait_WhenCallerIsProvider() public { + function testAddTrait() public { approveKYC(_kycProvider, _user, _userPk); vm.prank(_kycProvider); _kintoIDv1.addTrait(_user, 1); @@ -290,7 +334,7 @@ contract KintoIDTest is KYCSignature, AATestScaffolding, UserOp { _kintoIDv1.addTrait(_user, 1); } - function testRemoveTrait_WhenCallerIsProvider() public { + function testRemoveTrait() public { vm.startPrank(_kycProvider); IKintoID.SignatureData memory sigdata = _auxCreateSignature(_kintoIDv1, _user, _user, 3, block.timestamp + 1000); uint8[] memory traits = new uint8[](1); @@ -304,10 +348,7 @@ contract KintoIDTest is KYCSignature, AATestScaffolding, UserOp { } function testRemoveTrait_RevertWhen_CallerIsNotProvider() public { - uint8[] memory traits = new uint8[](1); - traits[0] = 1; - approveKYC(_kycProvider, _user, _userPk, traits); - assertEq(_kintoIDv1.hasTrait(_user, 1), true); + approveKYC(_kycProvider, _user, _userPk); bytes memory err = abi.encodePacked( "AccessControl: account ", @@ -320,9 +361,33 @@ contract KintoIDTest is KYCSignature, AATestScaffolding, UserOp { _kintoIDv1.removeTrait(_user, 1); } + function testRemoveTrait_RevertWhen_AccountIsNotKYCd() public { + vm.expectRevert("Account must have a KYC token"); + vm.prank(_kycProvider); + _kintoIDv1.removeTrait(_user, 1); + } + + function testTrais() public { + approveKYC(_kycProvider, _user, _userPk); + + vm.startPrank(_kycProvider); + + _kintoIDv1.addTrait(_user, 0); + _kintoIDv1.addTrait(_user, 1); + _kintoIDv1.addTrait(_user, 2); + + vm.stopPrank(); + + bool[] memory traits = _kintoIDv1.traits(_user); + assertEq(traits[0], true); + assertEq(traits[1], true); + assertEq(traits[2], true); + assertEq(traits[3], false); + } + /* ============ Sanction Tests ============ */ - function testProviderCanAddSanction() public { + function testAddSanction() public { vm.startPrank(_kycProvider); IKintoID.SignatureData memory sigdata = _auxCreateSignature(_kintoIDv1, _user, _user, 3, block.timestamp + 1000); uint8[] memory traits = new uint8[](1); @@ -334,7 +399,7 @@ contract KintoIDTest is KYCSignature, AATestScaffolding, UserOp { assertEq(_kintoIDv1.lastMonitoredAt(), block.timestamp); } - function testProviderCanRemoveSancion() public { + function testRemoveSancion() public { vm.startPrank(_kycProvider); IKintoID.SignatureData memory sigdata = _auxCreateSignature(_kintoIDv1, _user, _user, 3, block.timestamp + 1000); uint8[] memory traits = new uint8[](1); @@ -349,9 +414,7 @@ contract KintoIDTest is KYCSignature, AATestScaffolding, UserOp { } function testAddSanction_RevertWhen_CallerIsNotKYCProvider() public { - uint8[] memory traits = new uint8[](1); - traits[0] = 1; - approveKYC(_kycProvider, _user, _userPk, traits); + approveKYC(_kycProvider, _user, _userPk, new uint8[](1)); bytes memory err = abi.encodePacked( "AccessControl: account ", @@ -382,6 +445,18 @@ contract KintoIDTest is KYCSignature, AATestScaffolding, UserOp { _kintoIDv1.removeSanction(_user2, 1); } + function testAddSanction_RevertWhen_AccountIsNotKYCd() public { + vm.expectRevert("Account must have a KYC token"); + vm.prank(_kycProvider); + _kintoIDv1.addSanction(_user, 1); + } + + function testRemoveSanction_RevertWhen_AccountIsNotKYCd() public { + vm.expectRevert("Account must have a KYC token"); + vm.prank(_kycProvider); + _kintoIDv1.removeSanction(_user, 1); + } + /* ============ Transfer Tests ============ */ function test_RevertWhen_TransfersAreDisabled() public { @@ -392,14 +467,6 @@ contract KintoIDTest is KYCSignature, AATestScaffolding, UserOp { _kintoIDv1.safeTransferFrom(_user, _user2, tokenIdx); } - function test_RevertWhen_BurnIsCalled() public { - approveKYC(_kycProvider, _user, _userPk); - uint256 tokenIdx = _kintoIDv1.tokenOfOwnerByIndex(_user, 0); - vm.prank(_user); - vm.expectRevert("Use burnKYC instead"); - _kintoIDv1.burn(tokenIdx); - } - function testDappSignature() public { // vm.startPrank(_kycProvider); // bytes memory sig = hex"0fcafa82e64fcfd3c38209e23270274132e88061f1718c7ff45e8c0ddbbe7cdd59b5af57e10a5d8221baa6ae37b57d02acace7e25fc29cb4025f15269e0939aa1b"; @@ -414,4 +481,17 @@ contract KintoIDTest is KYCSignature, AATestScaffolding, UserOp { // ); // assertEq(valid, true); } + + /* ============ Supports Interface tests ============ */ + + function testSupportsInterface() public { + bytes4 InterfaceERC721Upgradeable = bytes4(keccak256("balanceOf(address)")) + ^ bytes4(keccak256("ownerOf(uint256)")) ^ bytes4(keccak256("safeTransferFrom(address,address,uint256,bytes)")) + ^ bytes4(keccak256("safeTransferFrom(address,address,uint256)")) + ^ bytes4(keccak256("transferFrom(address,address,uint256)")) ^ bytes4(keccak256("approve(address,uint256)")) + ^ bytes4(keccak256("setApprovalForAll(address,bool)")) ^ bytes4(keccak256("getApproved(uint256)")) + ^ bytes4(keccak256("isApprovedForAll(address,address)")); + + assertTrue(_kintoIDv1.supportsInterface(InterfaceERC721Upgradeable)); + } } From e74ceac12dfb13438b4c7bd2186387c3ef4416d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Federico=20Mart=C3=ADn=20Alconada=20Verzini?= Date: Tue, 16 Jan 2024 11:58:03 -0300 Subject: [PATCH 07/13] Merge branch 'main' into increase-coverage --- artifacts/7887.json | 2 +- .../7887/run-1705336600.json | 207 +++++++++++ .../14-factory_v3.sol/7887/run-latest.json | 207 +++++++++++ .../15-faucet_v2.sol/7887/run-1705342190.json | 337 ++++++++++++++++++ .../15-faucet_v2.sol/7887/run-latest.json | 337 ++++++++++++++++++ .../7887/run-1705346386.json | 110 ++++++ .../16-factory_v4.sol/7887/run-latest.json | 110 ++++++ .../17-faucet_v3.sol/7887/run-1705353451.json | 141 ++++++++ .../17-faucet_v3.sol/7887/run-latest.json | 141 ++++++++ script/migrations/03-mint_nft_admin.sol | 2 +- .../migrations/13-upgrade_id_paymasterv3.sol | 2 + script/migrations/14-factory_v3.sol | 37 +- script/migrations/15-faucet_v2.sol | 87 ++++- script/migrations/16-factory_v4.sol | 69 ++++ script/migrations/17-faucet_v3.sol | 80 +++++ script/test.sol | 2 +- src/Faucet.sol | 31 +- src/KintoID.sol | 49 ++- src/interfaces/IFaucet.sol | 2 +- src/interfaces/IKintoID.sol | 10 +- src/wallet/KintoWalletFactory.sol | 18 +- test/Faucet.t.sol | 29 +- test/KintoID.t.sol | 28 +- test/KintoWallet.t.sol | 2 +- test/artifacts/7887/addresses.json | 8 +- test/helpers/AATestScaffolding.sol | 6 +- 26 files changed, 1936 insertions(+), 118 deletions(-) create mode 100644 broadcast/14-factory_v3.sol/7887/run-1705336600.json create mode 100644 broadcast/14-factory_v3.sol/7887/run-latest.json create mode 100644 broadcast/15-faucet_v2.sol/7887/run-1705342190.json create mode 100644 broadcast/15-faucet_v2.sol/7887/run-latest.json create mode 100644 broadcast/16-factory_v4.sol/7887/run-1705346386.json create mode 100644 broadcast/16-factory_v4.sol/7887/run-latest.json create mode 100644 broadcast/17-faucet_v3.sol/7887/run-1705353451.json create mode 100644 broadcast/17-faucet_v3.sol/7887/run-latest.json create mode 100644 script/migrations/16-factory_v4.sol create mode 100644 script/migrations/17-faucet_v3.sol diff --git a/artifacts/7887.json b/artifacts/7887.json index 955c734cd..1f86b9fa1 100644 --- a/artifacts/7887.json +++ b/artifacts/7887.json @@ -1 +1 @@ -{"contracts":{"KintoAppRegistry":{"abi":[{"type":"constructor","inputs":[{"name":"_walletFactory","type":"address","internalType":"contract IKintoWalletFactory"}],"stateMutability":"nonpayable"},{"type":"function","name":"GAS_LIMIT_PERIOD","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"GAS_LIMIT_THRESHOLD","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"RATE_LIMIT_PERIOD","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"RATE_LIMIT_THRESHOLD","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"appCount","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"approve","inputs":[{"name":"to","type":"address","internalType":"address"},{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"balanceOf","inputs":[{"name":"owner","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"childToParentContract","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"enableDSA","inputs":[{"name":"app","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"getAppMetadata","inputs":[{"name":"_contract","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"tuple","internalType":"struct IKintoAppRegistry.Metadata","components":[{"name":"tokenId","type":"uint256","internalType":"uint256"},{"name":"dsaEnabled","type":"bool","internalType":"bool"},{"name":"rateLimitPeriod","type":"uint256","internalType":"uint256"},{"name":"rateLimitNumber","type":"uint256","internalType":"uint256"},{"name":"gasLimitPeriod","type":"uint256","internalType":"uint256"},{"name":"gasLimitCost","type":"uint256","internalType":"uint256"},{"name":"name","type":"string","internalType":"string"}]}],"stateMutability":"view"},{"type":"function","name":"getApproved","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"getContractLimits","inputs":[{"name":"_contract","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256[4]","internalType":"uint256[4]"}],"stateMutability":"view"},{"type":"function","name":"getSponsor","inputs":[{"name":"_contract","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"initialize","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"isApprovedForAll","inputs":[{"name":"owner","type":"address","internalType":"address"},{"name":"operator","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"isContractSponsored","inputs":[{"name":"_app","type":"address","internalType":"address"},{"name":"_contract","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"name","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"pure"},{"type":"function","name":"owner","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"ownerOf","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"proxiableUUID","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"registerApp","inputs":[{"name":"_name","type":"string","internalType":"string"},{"name":"parentContract","type":"address","internalType":"address"},{"name":"appContracts","type":"address[]","internalType":"address[]"},{"name":"appLimits","type":"uint256[4]","internalType":"uint256[4]"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"renounceOwnership","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"safeTransferFrom","inputs":[{"name":"from","type":"address","internalType":"address"},{"name":"to","type":"address","internalType":"address"},{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"safeTransferFrom","inputs":[{"name":"from","type":"address","internalType":"address"},{"name":"to","type":"address","internalType":"address"},{"name":"tokenId","type":"uint256","internalType":"uint256"},{"name":"data","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setApprovalForAll","inputs":[{"name":"operator","type":"address","internalType":"address"},{"name":"approved","type":"bool","internalType":"bool"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setSponsoredContracts","inputs":[{"name":"_app","type":"address","internalType":"address"},{"name":"_contracts","type":"address[]","internalType":"address[]"},{"name":"_flags","type":"bool[]","internalType":"bool[]"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"supportsInterface","inputs":[{"name":"interfaceId","type":"bytes4","internalType":"bytes4"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"symbol","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"pure"},{"type":"function","name":"tokenByIndex","inputs":[{"name":"index","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"tokenIdToApp","inputs":[{"name":"","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"tokenOfOwnerByIndex","inputs":[{"name":"owner","type":"address","internalType":"address"},{"name":"index","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"tokenURI","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"type":"function","name":"totalSupply","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"transferFrom","inputs":[{"name":"from","type":"address","internalType":"address"},{"name":"to","type":"address","internalType":"address"},{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"transferOwnership","inputs":[{"name":"newOwner","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"updateMetadata","inputs":[{"name":"_name","type":"string","internalType":"string"},{"name":"parentContract","type":"address","internalType":"address"},{"name":"appContracts","type":"address[]","internalType":"address[]"},{"name":"appLimits","type":"uint256[4]","internalType":"uint256[4]"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"upgradeTo","inputs":[{"name":"newImplementation","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"upgradeToAndCall","inputs":[{"name":"newImplementation","type":"address","internalType":"address"},{"name":"data","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"payable"},{"type":"function","name":"walletFactory","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract IKintoWalletFactory"}],"stateMutability":"view"},{"type":"event","name":"AdminChanged","inputs":[{"name":"previousAdmin","type":"address","indexed":false,"internalType":"address"},{"name":"newAdmin","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"type":"event","name":"AppCreated","inputs":[{"name":"_app","type":"address","indexed":true,"internalType":"address"},{"name":"_owner","type":"address","indexed":false,"internalType":"address"},{"name":"_timestamp","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"AppDSAEnabled","inputs":[{"name":"_app","type":"address","indexed":true,"internalType":"address"},{"name":"_timestamp","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"AppUpdated","inputs":[{"name":"_app","type":"address","indexed":true,"internalType":"address"},{"name":"_owner","type":"address","indexed":false,"internalType":"address"},{"name":"_timestamp","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"Approval","inputs":[{"name":"owner","type":"address","indexed":true,"internalType":"address"},{"name":"approved","type":"address","indexed":true,"internalType":"address"},{"name":"tokenId","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"ApprovalForAll","inputs":[{"name":"owner","type":"address","indexed":true,"internalType":"address"},{"name":"operator","type":"address","indexed":true,"internalType":"address"},{"name":"approved","type":"bool","indexed":false,"internalType":"bool"}],"anonymous":false},{"type":"event","name":"BeaconUpgraded","inputs":[{"name":"beacon","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"Initialized","inputs":[{"name":"version","type":"uint8","indexed":false,"internalType":"uint8"}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"name":"previousOwner","type":"address","indexed":true,"internalType":"address"},{"name":"newOwner","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"Transfer","inputs":[{"name":"from","type":"address","indexed":true,"internalType":"address"},{"name":"to","type":"address","indexed":true,"internalType":"address"},{"name":"tokenId","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"Upgraded","inputs":[{"name":"implementation","type":"address","indexed":true,"internalType":"address"}],"anonymous":false}],"address":"0x5A2b641b84b0230C8e75F55d5afd27f4Dbd59d5b"},"SponsorPaymaster":{"abi":[{"type":"constructor","inputs":[{"name":"__entryPoint","type":"address","internalType":"contract IEntryPoint"}],"stateMutability":"nonpayable"},{"type":"function","name":"COST_OF_POST","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"MAX_COST_OF_PREVERIFICATION","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"MAX_COST_OF_USEROP","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"MAX_COST_OF_VERIFICATION","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"RATE_LIMIT_PERIOD","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"RATE_LIMIT_THRESHOLD_TOTAL","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"addDepositFor","inputs":[{"name":"account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"payable"},{"type":"function","name":"addStake","inputs":[{"name":"unstakeDelaySec","type":"uint32","internalType":"uint32"}],"outputs":[],"stateMutability":"payable"},{"type":"function","name":"appRegistry","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract IKintoAppRegistry"}],"stateMutability":"view"},{"type":"function","name":"appUserLimit","inputs":[{"name":"user","type":"address","internalType":"address"},{"name":"app","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"},{"name":"","type":"uint256","internalType":"uint256"},{"name":"","type":"uint256","internalType":"uint256"},{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"balances","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"contractSpent","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"costLimit","inputs":[{"name":"","type":"address","internalType":"address"},{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"lastOperationTime","type":"uint256","internalType":"uint256"},{"name":"operationCount","type":"uint256","internalType":"uint256"},{"name":"ethCostCount","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"deposit","inputs":[],"outputs":[],"stateMutability":"payable"},{"type":"function","name":"depositInfo","inputs":[{"name":"account","type":"address","internalType":"address"}],"outputs":[{"name":"amount","type":"uint256","internalType":"uint256"},{"name":"_unlockBlock","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"entryPoint","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract IEntryPoint"}],"stateMutability":"view"},{"type":"function","name":"getDeposit","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"globalRateLimit","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"lastOperationTime","type":"uint256","internalType":"uint256"},{"name":"operationCount","type":"uint256","internalType":"uint256"},{"name":"ethCostCount","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"initialize","inputs":[{"name":"_owner","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"lockTokenDeposit","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"owner","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"postOp","inputs":[{"name":"mode","type":"uint8","internalType":"enum IPaymaster.PostOpMode"},{"name":"context","type":"bytes","internalType":"bytes"},{"name":"actualGasCost","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"proxiableUUID","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"rateLimit","inputs":[{"name":"","type":"address","internalType":"address"},{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"lastOperationTime","type":"uint256","internalType":"uint256"},{"name":"operationCount","type":"uint256","internalType":"uint256"},{"name":"ethCostCount","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"renounceOwnership","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setAppRegistry","inputs":[{"name":"_appRegistry","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"transferOwnership","inputs":[{"name":"newOwner","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"unlockBlock","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"unlockStake","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"unlockTokenDeposit","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"upgradeTo","inputs":[{"name":"newImplementation","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"upgradeToAndCall","inputs":[{"name":"newImplementation","type":"address","internalType":"address"},{"name":"data","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"payable"},{"type":"function","name":"validatePaymasterUserOp","inputs":[{"name":"userOp","type":"tuple","internalType":"struct UserOperation","components":[{"name":"sender","type":"address","internalType":"address"},{"name":"nonce","type":"uint256","internalType":"uint256"},{"name":"initCode","type":"bytes","internalType":"bytes"},{"name":"callData","type":"bytes","internalType":"bytes"},{"name":"callGasLimit","type":"uint256","internalType":"uint256"},{"name":"verificationGasLimit","type":"uint256","internalType":"uint256"},{"name":"preVerificationGas","type":"uint256","internalType":"uint256"},{"name":"maxFeePerGas","type":"uint256","internalType":"uint256"},{"name":"maxPriorityFeePerGas","type":"uint256","internalType":"uint256"},{"name":"paymasterAndData","type":"bytes","internalType":"bytes"},{"name":"signature","type":"bytes","internalType":"bytes"}]},{"name":"userOpHash","type":"bytes32","internalType":"bytes32"},{"name":"maxCost","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"context","type":"bytes","internalType":"bytes"},{"name":"validationData","type":"uint256","internalType":"uint256"}],"stateMutability":"nonpayable"},{"type":"function","name":"withdrawStake","inputs":[{"name":"withdrawAddress","type":"address","internalType":"address payable"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"withdrawTo","inputs":[{"name":"withdrawAddress","type":"address","internalType":"address payable"},{"name":"amount","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"withdrawTokensTo","inputs":[{"name":"target","type":"address","internalType":"address"},{"name":"amount","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"event","name":"AdminChanged","inputs":[{"name":"previousAdmin","type":"address","indexed":false,"internalType":"address"},{"name":"newAdmin","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"type":"event","name":"AppRegistrySet","inputs":[{"name":"appRegistry","type":"address","indexed":false,"internalType":"address"},{"name":"_oldRegistry","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"type":"event","name":"BeaconUpgraded","inputs":[{"name":"beacon","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"Initialized","inputs":[{"name":"version","type":"uint8","indexed":false,"internalType":"uint8"}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"name":"previousOwner","type":"address","indexed":true,"internalType":"address"},{"name":"newOwner","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"Upgraded","inputs":[{"name":"implementation","type":"address","indexed":true,"internalType":"address"}],"anonymous":false}],"address":"0x1842a4EFf3eFd24c50B63c3CF89cECEe245Fc2bd"},"SafeBeaconProxy":{"abi":[{"type":"constructor","inputs":[{"name":"beacon","type":"address","internalType":"address"},{"name":"data","type":"bytes","internalType":"bytes"}],"stateMutability":"payable"},{"type":"fallback","stateMutability":"payable"},{"type":"receive","stateMutability":"payable"},{"type":"event","name":"AdminChanged","inputs":[{"name":"previousAdmin","type":"address","indexed":false,"internalType":"address"},{"name":"newAdmin","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"type":"event","name":"BeaconUpgraded","inputs":[{"name":"beacon","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"Upgraded","inputs":[{"name":"implementation","type":"address","indexed":true,"internalType":"address"}],"anonymous":false}],"address":"0x0000000000000000000000000000000000000000"},"Counter":{"abi":[{"type":"constructor","inputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"count","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"increment","inputs":[],"outputs":[],"stateMutability":"nonpayable"}],"address":"0xdb791AF345A21588957E4e45596411b2Be2BD4cd"},"CounterInitializable":{"abi":[{"type":"constructor","inputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"initialize","inputs":[{"name":"initialOwner","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"owner","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"proxiableUUID","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"renounceOwnership","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"transferOwnership","inputs":[{"name":"newOwner","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"upgradeTo","inputs":[{"name":"newImplementation","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"upgradeToAndCall","inputs":[{"name":"newImplementation","type":"address","internalType":"address"},{"name":"data","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"payable"},{"type":"event","name":"AdminChanged","inputs":[{"name":"previousAdmin","type":"address","indexed":false,"internalType":"address"},{"name":"newAdmin","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"type":"event","name":"BeaconUpgraded","inputs":[{"name":"beacon","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"Initialized","inputs":[{"name":"version","type":"uint8","indexed":false,"internalType":"uint8"}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"name":"previousOwner","type":"address","indexed":true,"internalType":"address"},{"name":"newOwner","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"Upgraded","inputs":[{"name":"implementation","type":"address","indexed":true,"internalType":"address"}],"anonymous":false}],"address":"0x0000000000000000000000000000000000000000"},"ETHPriceIsRight":{"abi":[{"type":"constructor","inputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"END_ENTER_TIMESTAMP","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"avgGuess","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"enterGuess","inputs":[{"name":"guess","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"guessCount","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"guesses","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"maxGuess","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"minGuess","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"owner","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"renounceOwnership","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"transferOwnership","inputs":[{"name":"newOwner","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"event","name":"Guess","inputs":[{"name":"_to","type":"address","indexed":true,"internalType":"address"},{"name":"_guess","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"_timestamp","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"name":"previousOwner","type":"address","indexed":true,"internalType":"address"},{"name":"newOwner","type":"address","indexed":true,"internalType":"address"}],"anonymous":false}],"address":"0x0000000000000000000000000000000000000000"},"OwnableCounter":{"abi":[{"type":"constructor","inputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"count","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"increment","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"owner","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"renounceOwnership","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"transferOwnership","inputs":[{"name":"newOwner","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"event","name":"OwnershipTransferred","inputs":[{"name":"previousOwner","type":"address","indexed":true,"internalType":"address"},{"name":"newOwner","type":"address","indexed":true,"internalType":"address"}],"anonymous":false}],"address":"0x0000000000000000000000000000000000000000"},"EngenCredits":{"abi":[{"type":"constructor","inputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"DOMAIN_SEPARATOR","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"allowance","inputs":[{"name":"owner","type":"address","internalType":"address"},{"name":"spender","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"approve","inputs":[{"name":"spender","type":"address","internalType":"address"},{"name":"amount","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"nonpayable"},{"type":"function","name":"balanceOf","inputs":[{"name":"account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"burn","inputs":[{"name":"amount","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"burnFrom","inputs":[{"name":"account","type":"address","internalType":"address"},{"name":"amount","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"burnsEnabled","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"calculatePoints","inputs":[{"name":"_wallet","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"decimals","inputs":[],"outputs":[{"name":"","type":"uint8","internalType":"uint8"}],"stateMutability":"view"},{"type":"function","name":"decreaseAllowance","inputs":[{"name":"spender","type":"address","internalType":"address"},{"name":"subtractedValue","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"nonpayable"},{"type":"function","name":"increaseAllowance","inputs":[{"name":"spender","type":"address","internalType":"address"},{"name":"addedValue","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"nonpayable"},{"type":"function","name":"initialize","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"mint","inputs":[{"name":"to","type":"address","internalType":"address"},{"name":"amount","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"mintCredits","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"name","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"type":"function","name":"nonces","inputs":[{"name":"owner","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"owner","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"permit","inputs":[{"name":"owner","type":"address","internalType":"address"},{"name":"spender","type":"address","internalType":"address"},{"name":"value","type":"uint256","internalType":"uint256"},{"name":"deadline","type":"uint256","internalType":"uint256"},{"name":"v","type":"uint8","internalType":"uint8"},{"name":"r","type":"bytes32","internalType":"bytes32"},{"name":"s","type":"bytes32","internalType":"bytes32"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"phase1Override","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"proxiableUUID","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"renounceOwnership","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setBurnsEnabled","inputs":[{"name":"_burnsEnabled","type":"bool","internalType":"bool"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setPhase1Override","inputs":[{"name":"_wallets","type":"address[]","internalType":"address[]"},{"name":"_points","type":"uint256[]","internalType":"uint256[]"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setTransfersEnabled","inputs":[{"name":"_transfersEnabled","type":"bool","internalType":"bool"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"symbol","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"type":"function","name":"totalSupply","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"transfer","inputs":[{"name":"to","type":"address","internalType":"address"},{"name":"amount","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"nonpayable"},{"type":"function","name":"transferFrom","inputs":[{"name":"from","type":"address","internalType":"address"},{"name":"to","type":"address","internalType":"address"},{"name":"amount","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"nonpayable"},{"type":"function","name":"transferOwnership","inputs":[{"name":"newOwner","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"transfersEnabled","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"upgradeTo","inputs":[{"name":"newImplementation","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"upgradeToAndCall","inputs":[{"name":"newImplementation","type":"address","internalType":"address"},{"name":"data","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"payable"},{"type":"event","name":"AdminChanged","inputs":[{"name":"previousAdmin","type":"address","indexed":false,"internalType":"address"},{"name":"newAdmin","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"type":"event","name":"Approval","inputs":[{"name":"owner","type":"address","indexed":true,"internalType":"address"},{"name":"spender","type":"address","indexed":true,"internalType":"address"},{"name":"value","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"BeaconUpgraded","inputs":[{"name":"beacon","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"Initialized","inputs":[{"name":"version","type":"uint8","indexed":false,"internalType":"uint8"}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"name":"previousOwner","type":"address","indexed":true,"internalType":"address"},{"name":"newOwner","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"Transfer","inputs":[{"name":"from","type":"address","indexed":true,"internalType":"address"},{"name":"to","type":"address","indexed":true,"internalType":"address"},{"name":"value","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"Upgraded","inputs":[{"name":"implementation","type":"address","indexed":true,"internalType":"address"}],"anonymous":false}],"address":"0xb2F2BF932105A192566b56643BCa738eec06b3f1"},"KYCViewer":{"abi":[{"type":"constructor","inputs":[{"name":"_kintoWalletFactory","type":"address","internalType":"address"}],"stateMutability":"nonpayable"},{"type":"function","name":"hasTrait","inputs":[{"name":"_account","type":"address","internalType":"address"},{"name":"_traitId","type":"uint8","internalType":"uint8"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"initialize","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"isCompany","inputs":[{"name":"_account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"isIndividual","inputs":[{"name":"_account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"isKYC","inputs":[{"name":"_address","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"isSanctionsSafe","inputs":[{"name":"_account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"isSanctionsSafeIn","inputs":[{"name":"_account","type":"address","internalType":"address"},{"name":"_countryId","type":"uint16","internalType":"uint16"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"kintoID","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract IKintoID"}],"stateMutability":"view"},{"type":"function","name":"owner","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"proxiableUUID","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"renounceOwnership","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"transferOwnership","inputs":[{"name":"newOwner","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"upgradeTo","inputs":[{"name":"newImplementation","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"upgradeToAndCall","inputs":[{"name":"newImplementation","type":"address","internalType":"address"},{"name":"data","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"payable"},{"type":"function","name":"walletFactory","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract IKintoWalletFactory"}],"stateMutability":"view"},{"type":"event","name":"AdminChanged","inputs":[{"name":"previousAdmin","type":"address","indexed":false,"internalType":"address"},{"name":"newAdmin","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"type":"event","name":"BeaconUpgraded","inputs":[{"name":"beacon","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"Initialized","inputs":[{"name":"version","type":"uint8","indexed":false,"internalType":"uint8"}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"name":"previousOwner","type":"address","indexed":true,"internalType":"address"},{"name":"newOwner","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"Upgraded","inputs":[{"name":"implementation","type":"address","indexed":true,"internalType":"address"}],"anonymous":false}],"address":"0xC81102B63DCF419C65295EbbFddCb4EBDec4b2Ab"},"KintoWallet":{"abi":[{"type":"constructor","inputs":[{"name":"__entryPoint","type":"address","internalType":"contract IEntryPoint"},{"name":"_kintoID","type":"address","internalType":"contract IKintoID"},{"name":"_kintoApp","type":"address","internalType":"contract IKintoAppRegistry"}],"stateMutability":"nonpayable"},{"type":"receive","stateMutability":"payable"},{"type":"function","name":"ALL_SIGNERS","inputs":[],"outputs":[{"name":"","type":"uint8","internalType":"uint8"}],"stateMutability":"view"},{"type":"function","name":"MAX_SIGNERS","inputs":[],"outputs":[{"name":"","type":"uint8","internalType":"uint8"}],"stateMutability":"view"},{"type":"function","name":"MINUS_ONE_SIGNER","inputs":[],"outputs":[{"name":"","type":"uint8","internalType":"uint8"}],"stateMutability":"view"},{"type":"function","name":"RECOVERY_TIME","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"SINGLE_SIGNER","inputs":[],"outputs":[{"name":"","type":"uint8","internalType":"uint8"}],"stateMutability":"view"},{"type":"function","name":"appRegistry","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract IKintoAppRegistry"}],"stateMutability":"view"},{"type":"function","name":"appSigner","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"appWhitelist","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"cancelRecovery","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"changeRecoverer","inputs":[{"name":"newRecoverer","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"entryPoint","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract IEntryPoint"}],"stateMutability":"view"},{"type":"function","name":"execute","inputs":[{"name":"dest","type":"address","internalType":"address"},{"name":"value","type":"uint256","internalType":"uint256"},{"name":"func","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"executeBatch","inputs":[{"name":"dest","type":"address[]","internalType":"address[]"},{"name":"values","type":"uint256[]","internalType":"uint256[]"},{"name":"func","type":"bytes[]","internalType":"bytes[]"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"finishRecovery","inputs":[{"name":"newSigners","type":"address[]","internalType":"address[]"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"funderWhitelist","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"getNonce","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"getOwnersCount","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"inRecovery","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"initialize","inputs":[{"name":"anOwner","type":"address","internalType":"address"},{"name":"_recoverer","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"isFunderWhitelisted","inputs":[{"name":"funder","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"kintoID","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract IKintoID"}],"stateMutability":"view"},{"type":"function","name":"onERC1155BatchReceived","inputs":[{"name":"","type":"address","internalType":"address"},{"name":"","type":"address","internalType":"address"},{"name":"","type":"uint256[]","internalType":"uint256[]"},{"name":"","type":"uint256[]","internalType":"uint256[]"},{"name":"","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"","type":"bytes4","internalType":"bytes4"}],"stateMutability":"pure"},{"type":"function","name":"onERC1155Received","inputs":[{"name":"","type":"address","internalType":"address"},{"name":"","type":"address","internalType":"address"},{"name":"","type":"uint256","internalType":"uint256"},{"name":"","type":"uint256","internalType":"uint256"},{"name":"","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"","type":"bytes4","internalType":"bytes4"}],"stateMutability":"pure"},{"type":"function","name":"onERC721Received","inputs":[{"name":"","type":"address","internalType":"address"},{"name":"","type":"address","internalType":"address"},{"name":"","type":"uint256","internalType":"uint256"},{"name":"","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"","type":"bytes4","internalType":"bytes4"}],"stateMutability":"pure"},{"type":"function","name":"owners","inputs":[{"name":"","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"recoverer","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"resetSigners","inputs":[{"name":"newSigners","type":"address[]","internalType":"address[]"},{"name":"policy","type":"uint8","internalType":"uint8"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setAppKey","inputs":[{"name":"app","type":"address","internalType":"address"},{"name":"signer","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setFunderWhitelist","inputs":[{"name":"newWhitelist","type":"address[]","internalType":"address[]"},{"name":"flags","type":"bool[]","internalType":"bool[]"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setSignerPolicy","inputs":[{"name":"policy","type":"uint8","internalType":"uint8"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"signerPolicy","inputs":[],"outputs":[{"name":"","type":"uint8","internalType":"uint8"}],"stateMutability":"view"},{"type":"function","name":"startRecovery","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"supportsInterface","inputs":[{"name":"interfaceId","type":"bytes4","internalType":"bytes4"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"tokensReceived","inputs":[{"name":"","type":"address","internalType":"address"},{"name":"","type":"address","internalType":"address"},{"name":"","type":"address","internalType":"address"},{"name":"","type":"uint256","internalType":"uint256"},{"name":"","type":"bytes","internalType":"bytes"},{"name":"","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"pure"},{"type":"function","name":"validateUserOp","inputs":[{"name":"userOp","type":"tuple","internalType":"struct UserOperation","components":[{"name":"sender","type":"address","internalType":"address"},{"name":"nonce","type":"uint256","internalType":"uint256"},{"name":"initCode","type":"bytes","internalType":"bytes"},{"name":"callData","type":"bytes","internalType":"bytes"},{"name":"callGasLimit","type":"uint256","internalType":"uint256"},{"name":"verificationGasLimit","type":"uint256","internalType":"uint256"},{"name":"preVerificationGas","type":"uint256","internalType":"uint256"},{"name":"maxFeePerGas","type":"uint256","internalType":"uint256"},{"name":"maxPriorityFeePerGas","type":"uint256","internalType":"uint256"},{"name":"paymasterAndData","type":"bytes","internalType":"bytes"},{"name":"signature","type":"bytes","internalType":"bytes"}]},{"name":"userOpHash","type":"bytes32","internalType":"bytes32"},{"name":"missingAccountFunds","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"validationData","type":"uint256","internalType":"uint256"}],"stateMutability":"nonpayable"},{"type":"function","name":"whitelistApp","inputs":[{"name":"apps","type":"address[]","internalType":"address[]"},{"name":"flags","type":"bool[]","internalType":"bool[]"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"event","name":"Initialized","inputs":[{"name":"version","type":"uint8","indexed":false,"internalType":"uint8"}],"anonymous":false},{"type":"event","name":"KintoWalletInitialized","inputs":[{"name":"entryPoint","type":"address","indexed":true,"internalType":"contract IEntryPoint"},{"name":"owner","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"RecovererChanged","inputs":[{"name":"newRecoverer","type":"address","indexed":true,"internalType":"address"},{"name":"recoverer","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"SignersChanged","inputs":[{"name":"newSigners","type":"address[]","indexed":false,"internalType":"address[]"},{"name":"oldSigners","type":"address[]","indexed":false,"internalType":"address[]"}],"anonymous":false},{"type":"event","name":"WalletPolicyChanged","inputs":[{"name":"newPolicy","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"oldPolicy","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false}],"address":"0x0000000000000000000000000000000000000000"},"KintoWalletFactory":{"abi":[{"type":"constructor","inputs":[{"name":"_implAddressP","type":"address","internalType":"contract IKintoWallet"}],"stateMutability":"nonpayable"},{"type":"function","name":"beacon","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract UpgradeableBeacon"}],"stateMutability":"view"},{"type":"function","name":"changeWalletRecoverer","inputs":[{"name":"wallet","type":"address","internalType":"address payable"},{"name":"_newRecoverer","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"claimFromFaucet","inputs":[{"name":"_faucet","type":"address","internalType":"address"},{"name":"_signatureData","type":"tuple","internalType":"struct IFaucet.SignatureData","components":[{"name":"signer","type":"address","internalType":"address"},{"name":"nonce","type":"uint256","internalType":"uint256"},{"name":"expiresAt","type":"uint256","internalType":"uint256"},{"name":"signature","type":"bytes","internalType":"bytes"}]}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"completeWalletRecovery","inputs":[{"name":"wallet","type":"address","internalType":"address payable"},{"name":"newSigners","type":"address[]","internalType":"address[]"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"createAccount","inputs":[{"name":"owner","type":"address","internalType":"address"},{"name":"recoverer","type":"address","internalType":"address"},{"name":"salt","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"ret","type":"address","internalType":"contract IKintoWallet"}],"stateMutability":"nonpayable"},{"type":"function","name":"deployContract","inputs":[{"name":"contractOwner","type":"address","internalType":"address"},{"name":"amount","type":"uint256","internalType":"uint256"},{"name":"bytecode","type":"bytes","internalType":"bytes"},{"name":"salt","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"payable"},{"type":"function","name":"factoryWalletVersion","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"fundWallet","inputs":[{"name":"wallet","type":"address","internalType":"address payable"}],"outputs":[],"stateMutability":"payable"},{"type":"function","name":"getAddress","inputs":[{"name":"owner","type":"address","internalType":"address"},{"name":"recoverer","type":"address","internalType":"address"},{"name":"salt","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"getContractAddress","inputs":[{"name":"salt","type":"bytes32","internalType":"bytes32"},{"name":"byteCodeHash","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"getWalletTimestamp","inputs":[{"name":"wallet","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"initialize","inputs":[{"name":"_kintoID","type":"address","internalType":"contract IKintoID"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"kintoID","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract IKintoID"}],"stateMutability":"view"},{"type":"function","name":"owner","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"proxiableUUID","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"renounceOwnership","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"startWalletRecovery","inputs":[{"name":"wallet","type":"address","internalType":"address payable"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"totalWallets","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"transferOwnership","inputs":[{"name":"newOwner","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"upgradeAllWalletImplementations","inputs":[{"name":"newImplementationWallet","type":"address","internalType":"contract IKintoWallet"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"upgradeTo","inputs":[{"name":"newImplementation","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"upgradeToAndCall","inputs":[{"name":"newImplementation","type":"address","internalType":"address"},{"name":"data","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"payable"},{"type":"function","name":"walletTs","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"event","name":"AdminChanged","inputs":[{"name":"previousAdmin","type":"address","indexed":false,"internalType":"address"},{"name":"newAdmin","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"type":"event","name":"BeaconUpgraded","inputs":[{"name":"beacon","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"Initialized","inputs":[{"name":"version","type":"uint8","indexed":false,"internalType":"uint8"}],"anonymous":false},{"type":"event","name":"KintoWalletFactoryCreation","inputs":[{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"owner","type":"address","indexed":true,"internalType":"address"},{"name":"version","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"KintoWalletFactoryUpgraded","inputs":[{"name":"oldImplementation","type":"address","indexed":true,"internalType":"address"},{"name":"newImplementation","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"name":"previousOwner","type":"address","indexed":true,"internalType":"address"},{"name":"newOwner","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"Upgraded","inputs":[{"name":"implementation","type":"address","indexed":true,"internalType":"address"}],"anonymous":false}],"address":"0x8a4720488CA32f1223ccFE5A087e250fE3BC5D75"},"Faucet":{"abi":[{"type":"constructor","inputs":[{"name":"_kintoWalletFactory","type":"address","internalType":"address"}],"stateMutability":"nonpayable"},{"type":"receive","stateMutability":"payable"},{"type":"function","name":"CLAIM_AMOUNT","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"FAUCET_AMOUNT","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"active","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"claimKintoETH","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"claimOnBehalf","inputs":[{"name":"_signatureData","type":"tuple","internalType":"struct IFaucet.SignatureData","components":[{"name":"signer","type":"address","internalType":"address"},{"name":"nonce","type":"uint256","internalType":"uint256"},{"name":"expiresAt","type":"uint256","internalType":"uint256"},{"name":"signature","type":"bytes","internalType":"bytes"}]}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"claimed","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"initialize","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"nonces","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"owner","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"proxiableUUID","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"renounceOwnership","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"startFaucet","inputs":[],"outputs":[],"stateMutability":"payable"},{"type":"function","name":"transferOwnership","inputs":[{"name":"newOwner","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"upgradeTo","inputs":[{"name":"newImplementation","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"upgradeToAndCall","inputs":[{"name":"newImplementation","type":"address","internalType":"address"},{"name":"data","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"payable"},{"type":"function","name":"walletFactory","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract IKintoWalletFactory"}],"stateMutability":"view"},{"type":"function","name":"withdrawAll","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"event","name":"AdminChanged","inputs":[{"name":"previousAdmin","type":"address","indexed":false,"internalType":"address"},{"name":"newAdmin","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"type":"event","name":"BeaconUpgraded","inputs":[{"name":"beacon","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"Claim","inputs":[{"name":"_to","type":"address","indexed":true,"internalType":"address"},{"name":"_timestamp","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"Initialized","inputs":[{"name":"version","type":"uint8","indexed":false,"internalType":"uint8"}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"name":"previousOwner","type":"address","indexed":true,"internalType":"address"},{"name":"newOwner","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"Upgraded","inputs":[{"name":"implementation","type":"address","indexed":true,"internalType":"address"}],"anonymous":false}],"address":"0xa62Bf9b53044885CddFcbC4cA52f51f8ae39eCFE"},"KintoID":{"abi":[{"type":"constructor","inputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"DEFAULT_ADMIN_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"KYC_PROVIDER_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"UPGRADER_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"addSanction","inputs":[{"name":"_account","type":"address","internalType":"address"},{"name":"_countryId","type":"uint16","internalType":"uint16"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"addTrait","inputs":[{"name":"_account","type":"address","internalType":"address"},{"name":"_traitId","type":"uint8","internalType":"uint8"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"approve","inputs":[{"name":"to","type":"address","internalType":"address"},{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"balanceOf","inputs":[{"name":"owner","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"burn","inputs":[{"name":"","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"pure"},{"type":"function","name":"burnKYC","inputs":[{"name":"_signatureData","type":"tuple","internalType":"struct IKintoID.SignatureData","components":[{"name":"signer","type":"address","internalType":"address"},{"name":"nonce","type":"uint256","internalType":"uint256"},{"name":"expiresAt","type":"uint256","internalType":"uint256"},{"name":"signature","type":"bytes","internalType":"bytes"}]}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"getApproved","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"getRoleAdmin","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"grantRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"hasRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"hasTrait","inputs":[{"name":"_account","type":"address","internalType":"address"},{"name":"index","type":"uint8","internalType":"uint8"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"initialize","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"isApprovedForAll","inputs":[{"name":"owner","type":"address","internalType":"address"},{"name":"operator","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"isCompany","inputs":[{"name":"_account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"isIndividual","inputs":[{"name":"_account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"isKYC","inputs":[{"name":"_account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"isSanctionsMonitored","inputs":[{"name":"_days","type":"uint32","internalType":"uint32"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"isSanctionsSafe","inputs":[{"name":"_account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"isSanctionsSafeIn","inputs":[{"name":"_account","type":"address","internalType":"address"},{"name":"_countryId","type":"uint16","internalType":"uint16"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"lastMonitoredAt","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"mintCompanyKyc","inputs":[{"name":"_signatureData","type":"tuple","internalType":"struct IKintoID.SignatureData","components":[{"name":"signer","type":"address","internalType":"address"},{"name":"nonce","type":"uint256","internalType":"uint256"},{"name":"expiresAt","type":"uint256","internalType":"uint256"},{"name":"signature","type":"bytes","internalType":"bytes"}]},{"name":"_traits","type":"uint8[]","internalType":"uint8[]"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"mintIndividualKyc","inputs":[{"name":"_signatureData","type":"tuple","internalType":"struct IKintoID.SignatureData","components":[{"name":"signer","type":"address","internalType":"address"},{"name":"nonce","type":"uint256","internalType":"uint256"},{"name":"expiresAt","type":"uint256","internalType":"uint256"},{"name":"signature","type":"bytes","internalType":"bytes"}]},{"name":"_traits","type":"uint8[]","internalType":"uint8[]"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"mintedAt","inputs":[{"name":"_account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"monitor","inputs":[{"name":"_accounts","type":"address[]","internalType":"address[]"},{"name":"_traitsAndSanctions","type":"tuple[][]","internalType":"struct IKintoID.MonitorUpdateData[][]","components":[{"name":"isTrait","type":"bool","internalType":"bool"},{"name":"isSet","type":"bool","internalType":"bool"},{"name":"index","type":"uint16","internalType":"uint16"}]}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"name","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"pure"},{"type":"function","name":"nonces","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"ownerOf","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"proxiableUUID","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"removeSanction","inputs":[{"name":"_account","type":"address","internalType":"address"},{"name":"_countryId","type":"uint16","internalType":"uint16"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"removeTrait","inputs":[{"name":"_account","type":"address","internalType":"address"},{"name":"_traitId","type":"uint8","internalType":"uint8"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"renounceRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"revokeRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"safeTransferFrom","inputs":[{"name":"from","type":"address","internalType":"address"},{"name":"to","type":"address","internalType":"address"},{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"safeTransferFrom","inputs":[{"name":"from","type":"address","internalType":"address"},{"name":"to","type":"address","internalType":"address"},{"name":"tokenId","type":"uint256","internalType":"uint256"},{"name":"data","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setApprovalForAll","inputs":[{"name":"operator","type":"address","internalType":"address"},{"name":"approved","type":"bool","internalType":"bool"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"supportsInterface","inputs":[{"name":"interfaceId","type":"bytes4","internalType":"bytes4"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"symbol","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"pure"},{"type":"function","name":"tokenByIndex","inputs":[{"name":"index","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"tokenOfOwnerByIndex","inputs":[{"name":"owner","type":"address","internalType":"address"},{"name":"index","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"tokenURI","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"type":"function","name":"totalSupply","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"traits","inputs":[{"name":"_account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool[]","internalType":"bool[]"}],"stateMutability":"view"},{"type":"function","name":"transferFrom","inputs":[{"name":"from","type":"address","internalType":"address"},{"name":"to","type":"address","internalType":"address"},{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"upgradeTo","inputs":[{"name":"newImplementation","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"upgradeToAndCall","inputs":[{"name":"newImplementation","type":"address","internalType":"address"},{"name":"data","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"payable"},{"type":"event","name":"AccountsMonitoredAt","inputs":[{"name":"_signer","type":"address","indexed":true,"internalType":"address"},{"name":"_accountsCount","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"_timestamp","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"AdminChanged","inputs":[{"name":"previousAdmin","type":"address","indexed":false,"internalType":"address"},{"name":"newAdmin","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"type":"event","name":"Approval","inputs":[{"name":"owner","type":"address","indexed":true,"internalType":"address"},{"name":"approved","type":"address","indexed":true,"internalType":"address"},{"name":"tokenId","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"ApprovalForAll","inputs":[{"name":"owner","type":"address","indexed":true,"internalType":"address"},{"name":"operator","type":"address","indexed":true,"internalType":"address"},{"name":"approved","type":"bool","indexed":false,"internalType":"bool"}],"anonymous":false},{"type":"event","name":"BeaconUpgraded","inputs":[{"name":"beacon","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"Initialized","inputs":[{"name":"version","type":"uint8","indexed":false,"internalType":"uint8"}],"anonymous":false},{"type":"event","name":"RoleAdminChanged","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"previousAdminRole","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"newAdminRole","type":"bytes32","indexed":true,"internalType":"bytes32"}],"anonymous":false},{"type":"event","name":"RoleGranted","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"sender","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"RoleRevoked","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"sender","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"SanctionAdded","inputs":[{"name":"_to","type":"address","indexed":true,"internalType":"address"},{"name":"_sanctionIndex","type":"uint16","indexed":false,"internalType":"uint16"},{"name":"_timestamp","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"SanctionRemoved","inputs":[{"name":"_to","type":"address","indexed":true,"internalType":"address"},{"name":"_sanctionIndex","type":"uint16","indexed":false,"internalType":"uint16"},{"name":"_timestamp","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"TraitAdded","inputs":[{"name":"_to","type":"address","indexed":true,"internalType":"address"},{"name":"_traitIndex","type":"uint16","indexed":false,"internalType":"uint16"},{"name":"_timestamp","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"TraitRemoved","inputs":[{"name":"_to","type":"address","indexed":true,"internalType":"address"},{"name":"_traitIndex","type":"uint16","indexed":false,"internalType":"uint16"},{"name":"_timestamp","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"Transfer","inputs":[{"name":"from","type":"address","indexed":true,"internalType":"address"},{"name":"to","type":"address","indexed":true,"internalType":"address"},{"name":"tokenId","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"Upgraded","inputs":[{"name":"implementation","type":"address","indexed":true,"internalType":"address"}],"anonymous":false}],"address":"0xf369f78E3A0492CC4e96a90dae0728A38498e9c7"}}} \ No newline at end of file +{"contracts":{"KintoAppRegistry":{"abi":[{"type":"constructor","inputs":[{"name":"_walletFactory","type":"address","internalType":"contract IKintoWalletFactory"}],"stateMutability":"nonpayable"},{"type":"function","name":"GAS_LIMIT_PERIOD","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"GAS_LIMIT_THRESHOLD","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"RATE_LIMIT_PERIOD","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"RATE_LIMIT_THRESHOLD","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"appCount","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"approve","inputs":[{"name":"to","type":"address","internalType":"address"},{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"balanceOf","inputs":[{"name":"owner","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"childToParentContract","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"enableDSA","inputs":[{"name":"app","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"getAppMetadata","inputs":[{"name":"_contract","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"tuple","internalType":"struct IKintoAppRegistry.Metadata","components":[{"name":"tokenId","type":"uint256","internalType":"uint256"},{"name":"dsaEnabled","type":"bool","internalType":"bool"},{"name":"rateLimitPeriod","type":"uint256","internalType":"uint256"},{"name":"rateLimitNumber","type":"uint256","internalType":"uint256"},{"name":"gasLimitPeriod","type":"uint256","internalType":"uint256"},{"name":"gasLimitCost","type":"uint256","internalType":"uint256"},{"name":"name","type":"string","internalType":"string"}]}],"stateMutability":"view"},{"type":"function","name":"getApproved","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"getContractLimits","inputs":[{"name":"_contract","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256[4]","internalType":"uint256[4]"}],"stateMutability":"view"},{"type":"function","name":"getSponsor","inputs":[{"name":"_contract","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"initialize","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"isApprovedForAll","inputs":[{"name":"owner","type":"address","internalType":"address"},{"name":"operator","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"isContractSponsored","inputs":[{"name":"_app","type":"address","internalType":"address"},{"name":"_contract","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"name","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"pure"},{"type":"function","name":"owner","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"ownerOf","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"proxiableUUID","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"registerApp","inputs":[{"name":"_name","type":"string","internalType":"string"},{"name":"parentContract","type":"address","internalType":"address"},{"name":"appContracts","type":"address[]","internalType":"address[]"},{"name":"appLimits","type":"uint256[4]","internalType":"uint256[4]"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"renounceOwnership","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"safeTransferFrom","inputs":[{"name":"from","type":"address","internalType":"address"},{"name":"to","type":"address","internalType":"address"},{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"safeTransferFrom","inputs":[{"name":"from","type":"address","internalType":"address"},{"name":"to","type":"address","internalType":"address"},{"name":"tokenId","type":"uint256","internalType":"uint256"},{"name":"data","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setApprovalForAll","inputs":[{"name":"operator","type":"address","internalType":"address"},{"name":"approved","type":"bool","internalType":"bool"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setSponsoredContracts","inputs":[{"name":"_app","type":"address","internalType":"address"},{"name":"_contracts","type":"address[]","internalType":"address[]"},{"name":"_flags","type":"bool[]","internalType":"bool[]"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"supportsInterface","inputs":[{"name":"interfaceId","type":"bytes4","internalType":"bytes4"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"symbol","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"pure"},{"type":"function","name":"tokenByIndex","inputs":[{"name":"index","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"tokenIdToApp","inputs":[{"name":"","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"tokenOfOwnerByIndex","inputs":[{"name":"owner","type":"address","internalType":"address"},{"name":"index","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"tokenURI","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"type":"function","name":"totalSupply","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"transferFrom","inputs":[{"name":"from","type":"address","internalType":"address"},{"name":"to","type":"address","internalType":"address"},{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"transferOwnership","inputs":[{"name":"newOwner","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"updateMetadata","inputs":[{"name":"_name","type":"string","internalType":"string"},{"name":"parentContract","type":"address","internalType":"address"},{"name":"appContracts","type":"address[]","internalType":"address[]"},{"name":"appLimits","type":"uint256[4]","internalType":"uint256[4]"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"upgradeTo","inputs":[{"name":"newImplementation","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"upgradeToAndCall","inputs":[{"name":"newImplementation","type":"address","internalType":"address"},{"name":"data","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"payable"},{"type":"function","name":"walletFactory","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract IKintoWalletFactory"}],"stateMutability":"view"},{"type":"event","name":"AdminChanged","inputs":[{"name":"previousAdmin","type":"address","indexed":false,"internalType":"address"},{"name":"newAdmin","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"type":"event","name":"AppCreated","inputs":[{"name":"_app","type":"address","indexed":true,"internalType":"address"},{"name":"_owner","type":"address","indexed":false,"internalType":"address"},{"name":"_timestamp","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"AppDSAEnabled","inputs":[{"name":"_app","type":"address","indexed":true,"internalType":"address"},{"name":"_timestamp","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"AppUpdated","inputs":[{"name":"_app","type":"address","indexed":true,"internalType":"address"},{"name":"_owner","type":"address","indexed":false,"internalType":"address"},{"name":"_timestamp","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"Approval","inputs":[{"name":"owner","type":"address","indexed":true,"internalType":"address"},{"name":"approved","type":"address","indexed":true,"internalType":"address"},{"name":"tokenId","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"ApprovalForAll","inputs":[{"name":"owner","type":"address","indexed":true,"internalType":"address"},{"name":"operator","type":"address","indexed":true,"internalType":"address"},{"name":"approved","type":"bool","indexed":false,"internalType":"bool"}],"anonymous":false},{"type":"event","name":"BeaconUpgraded","inputs":[{"name":"beacon","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"Initialized","inputs":[{"name":"version","type":"uint8","indexed":false,"internalType":"uint8"}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"name":"previousOwner","type":"address","indexed":true,"internalType":"address"},{"name":"newOwner","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"Transfer","inputs":[{"name":"from","type":"address","indexed":true,"internalType":"address"},{"name":"to","type":"address","indexed":true,"internalType":"address"},{"name":"tokenId","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"Upgraded","inputs":[{"name":"implementation","type":"address","indexed":true,"internalType":"address"}],"anonymous":false}],"address":"0x5A2b641b84b0230C8e75F55d5afd27f4Dbd59d5b"},"SponsorPaymaster":{"abi":[{"type":"constructor","inputs":[{"name":"__entryPoint","type":"address","internalType":"contract IEntryPoint"}],"stateMutability":"nonpayable"},{"type":"function","name":"COST_OF_POST","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"MAX_COST_OF_PREVERIFICATION","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"MAX_COST_OF_USEROP","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"MAX_COST_OF_VERIFICATION","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"RATE_LIMIT_PERIOD","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"RATE_LIMIT_THRESHOLD_TOTAL","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"addDepositFor","inputs":[{"name":"account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"payable"},{"type":"function","name":"addStake","inputs":[{"name":"unstakeDelaySec","type":"uint32","internalType":"uint32"}],"outputs":[],"stateMutability":"payable"},{"type":"function","name":"appRegistry","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract IKintoAppRegistry"}],"stateMutability":"view"},{"type":"function","name":"appUserLimit","inputs":[{"name":"user","type":"address","internalType":"address"},{"name":"app","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"},{"name":"","type":"uint256","internalType":"uint256"},{"name":"","type":"uint256","internalType":"uint256"},{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"balances","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"contractSpent","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"costLimit","inputs":[{"name":"","type":"address","internalType":"address"},{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"lastOperationTime","type":"uint256","internalType":"uint256"},{"name":"operationCount","type":"uint256","internalType":"uint256"},{"name":"ethCostCount","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"deposit","inputs":[],"outputs":[],"stateMutability":"payable"},{"type":"function","name":"depositInfo","inputs":[{"name":"account","type":"address","internalType":"address"}],"outputs":[{"name":"amount","type":"uint256","internalType":"uint256"},{"name":"_unlockBlock","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"entryPoint","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract IEntryPoint"}],"stateMutability":"view"},{"type":"function","name":"getDeposit","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"globalRateLimit","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"lastOperationTime","type":"uint256","internalType":"uint256"},{"name":"operationCount","type":"uint256","internalType":"uint256"},{"name":"ethCostCount","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"initialize","inputs":[{"name":"_owner","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"lockTokenDeposit","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"owner","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"postOp","inputs":[{"name":"mode","type":"uint8","internalType":"enum IPaymaster.PostOpMode"},{"name":"context","type":"bytes","internalType":"bytes"},{"name":"actualGasCost","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"proxiableUUID","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"rateLimit","inputs":[{"name":"","type":"address","internalType":"address"},{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"lastOperationTime","type":"uint256","internalType":"uint256"},{"name":"operationCount","type":"uint256","internalType":"uint256"},{"name":"ethCostCount","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"renounceOwnership","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setAppRegistry","inputs":[{"name":"_appRegistry","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"transferOwnership","inputs":[{"name":"newOwner","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"unlockBlock","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"unlockStake","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"unlockTokenDeposit","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"upgradeTo","inputs":[{"name":"newImplementation","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"upgradeToAndCall","inputs":[{"name":"newImplementation","type":"address","internalType":"address"},{"name":"data","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"payable"},{"type":"function","name":"validatePaymasterUserOp","inputs":[{"name":"userOp","type":"tuple","internalType":"struct UserOperation","components":[{"name":"sender","type":"address","internalType":"address"},{"name":"nonce","type":"uint256","internalType":"uint256"},{"name":"initCode","type":"bytes","internalType":"bytes"},{"name":"callData","type":"bytes","internalType":"bytes"},{"name":"callGasLimit","type":"uint256","internalType":"uint256"},{"name":"verificationGasLimit","type":"uint256","internalType":"uint256"},{"name":"preVerificationGas","type":"uint256","internalType":"uint256"},{"name":"maxFeePerGas","type":"uint256","internalType":"uint256"},{"name":"maxPriorityFeePerGas","type":"uint256","internalType":"uint256"},{"name":"paymasterAndData","type":"bytes","internalType":"bytes"},{"name":"signature","type":"bytes","internalType":"bytes"}]},{"name":"userOpHash","type":"bytes32","internalType":"bytes32"},{"name":"maxCost","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"context","type":"bytes","internalType":"bytes"},{"name":"validationData","type":"uint256","internalType":"uint256"}],"stateMutability":"nonpayable"},{"type":"function","name":"withdrawStake","inputs":[{"name":"withdrawAddress","type":"address","internalType":"address payable"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"withdrawTo","inputs":[{"name":"withdrawAddress","type":"address","internalType":"address payable"},{"name":"amount","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"withdrawTokensTo","inputs":[{"name":"target","type":"address","internalType":"address"},{"name":"amount","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"event","name":"AdminChanged","inputs":[{"name":"previousAdmin","type":"address","indexed":false,"internalType":"address"},{"name":"newAdmin","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"type":"event","name":"AppRegistrySet","inputs":[{"name":"appRegistry","type":"address","indexed":false,"internalType":"address"},{"name":"_oldRegistry","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"type":"event","name":"BeaconUpgraded","inputs":[{"name":"beacon","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"Initialized","inputs":[{"name":"version","type":"uint8","indexed":false,"internalType":"uint8"}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"name":"previousOwner","type":"address","indexed":true,"internalType":"address"},{"name":"newOwner","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"Upgraded","inputs":[{"name":"implementation","type":"address","indexed":true,"internalType":"address"}],"anonymous":false}],"address":"0x1842a4EFf3eFd24c50B63c3CF89cECEe245Fc2bd"},"SafeBeaconProxy":{"abi":[{"type":"constructor","inputs":[{"name":"beacon","type":"address","internalType":"address"},{"name":"data","type":"bytes","internalType":"bytes"}],"stateMutability":"payable"},{"type":"fallback","stateMutability":"payable"},{"type":"receive","stateMutability":"payable"},{"type":"event","name":"AdminChanged","inputs":[{"name":"previousAdmin","type":"address","indexed":false,"internalType":"address"},{"name":"newAdmin","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"type":"event","name":"BeaconUpgraded","inputs":[{"name":"beacon","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"Upgraded","inputs":[{"name":"implementation","type":"address","indexed":true,"internalType":"address"}],"anonymous":false}],"address":"0x0000000000000000000000000000000000000000"},"Counter":{"abi":[{"type":"constructor","inputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"count","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"increment","inputs":[],"outputs":[],"stateMutability":"nonpayable"}],"address":"0xdb791AF345A21588957E4e45596411b2Be2BD4cd"},"CounterInitializable":{"abi":[{"type":"constructor","inputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"initialize","inputs":[{"name":"initialOwner","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"owner","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"proxiableUUID","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"renounceOwnership","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"transferOwnership","inputs":[{"name":"newOwner","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"upgradeTo","inputs":[{"name":"newImplementation","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"upgradeToAndCall","inputs":[{"name":"newImplementation","type":"address","internalType":"address"},{"name":"data","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"payable"},{"type":"event","name":"AdminChanged","inputs":[{"name":"previousAdmin","type":"address","indexed":false,"internalType":"address"},{"name":"newAdmin","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"type":"event","name":"BeaconUpgraded","inputs":[{"name":"beacon","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"Initialized","inputs":[{"name":"version","type":"uint8","indexed":false,"internalType":"uint8"}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"name":"previousOwner","type":"address","indexed":true,"internalType":"address"},{"name":"newOwner","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"Upgraded","inputs":[{"name":"implementation","type":"address","indexed":true,"internalType":"address"}],"anonymous":false}],"address":"0x0000000000000000000000000000000000000000"},"ETHPriceIsRight":{"abi":[{"type":"constructor","inputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"END_ENTER_TIMESTAMP","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"avgGuess","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"enterGuess","inputs":[{"name":"guess","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"guessCount","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"guesses","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"maxGuess","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"minGuess","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"owner","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"renounceOwnership","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"transferOwnership","inputs":[{"name":"newOwner","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"event","name":"Guess","inputs":[{"name":"_to","type":"address","indexed":true,"internalType":"address"},{"name":"_guess","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"_timestamp","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"name":"previousOwner","type":"address","indexed":true,"internalType":"address"},{"name":"newOwner","type":"address","indexed":true,"internalType":"address"}],"anonymous":false}],"address":"0x0000000000000000000000000000000000000000"},"OwnableCounter":{"abi":[{"type":"constructor","inputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"count","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"increment","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"owner","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"renounceOwnership","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"transferOwnership","inputs":[{"name":"newOwner","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"event","name":"OwnershipTransferred","inputs":[{"name":"previousOwner","type":"address","indexed":true,"internalType":"address"},{"name":"newOwner","type":"address","indexed":true,"internalType":"address"}],"anonymous":false}],"address":"0x0000000000000000000000000000000000000000"},"EngenCredits":{"abi":[{"type":"constructor","inputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"DOMAIN_SEPARATOR","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"allowance","inputs":[{"name":"owner","type":"address","internalType":"address"},{"name":"spender","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"approve","inputs":[{"name":"spender","type":"address","internalType":"address"},{"name":"amount","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"nonpayable"},{"type":"function","name":"balanceOf","inputs":[{"name":"account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"burn","inputs":[{"name":"amount","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"burnFrom","inputs":[{"name":"account","type":"address","internalType":"address"},{"name":"amount","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"burnsEnabled","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"calculatePoints","inputs":[{"name":"_wallet","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"decimals","inputs":[],"outputs":[{"name":"","type":"uint8","internalType":"uint8"}],"stateMutability":"view"},{"type":"function","name":"decreaseAllowance","inputs":[{"name":"spender","type":"address","internalType":"address"},{"name":"subtractedValue","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"nonpayable"},{"type":"function","name":"increaseAllowance","inputs":[{"name":"spender","type":"address","internalType":"address"},{"name":"addedValue","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"nonpayable"},{"type":"function","name":"initialize","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"mint","inputs":[{"name":"to","type":"address","internalType":"address"},{"name":"amount","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"mintCredits","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"name","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"type":"function","name":"nonces","inputs":[{"name":"owner","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"owner","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"permit","inputs":[{"name":"owner","type":"address","internalType":"address"},{"name":"spender","type":"address","internalType":"address"},{"name":"value","type":"uint256","internalType":"uint256"},{"name":"deadline","type":"uint256","internalType":"uint256"},{"name":"v","type":"uint8","internalType":"uint8"},{"name":"r","type":"bytes32","internalType":"bytes32"},{"name":"s","type":"bytes32","internalType":"bytes32"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"phase1Override","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"proxiableUUID","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"renounceOwnership","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setBurnsEnabled","inputs":[{"name":"_burnsEnabled","type":"bool","internalType":"bool"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setPhase1Override","inputs":[{"name":"_wallets","type":"address[]","internalType":"address[]"},{"name":"_points","type":"uint256[]","internalType":"uint256[]"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setTransfersEnabled","inputs":[{"name":"_transfersEnabled","type":"bool","internalType":"bool"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"symbol","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"type":"function","name":"totalSupply","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"transfer","inputs":[{"name":"to","type":"address","internalType":"address"},{"name":"amount","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"nonpayable"},{"type":"function","name":"transferFrom","inputs":[{"name":"from","type":"address","internalType":"address"},{"name":"to","type":"address","internalType":"address"},{"name":"amount","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"nonpayable"},{"type":"function","name":"transferOwnership","inputs":[{"name":"newOwner","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"transfersEnabled","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"upgradeTo","inputs":[{"name":"newImplementation","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"upgradeToAndCall","inputs":[{"name":"newImplementation","type":"address","internalType":"address"},{"name":"data","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"payable"},{"type":"event","name":"AdminChanged","inputs":[{"name":"previousAdmin","type":"address","indexed":false,"internalType":"address"},{"name":"newAdmin","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"type":"event","name":"Approval","inputs":[{"name":"owner","type":"address","indexed":true,"internalType":"address"},{"name":"spender","type":"address","indexed":true,"internalType":"address"},{"name":"value","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"BeaconUpgraded","inputs":[{"name":"beacon","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"Initialized","inputs":[{"name":"version","type":"uint8","indexed":false,"internalType":"uint8"}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"name":"previousOwner","type":"address","indexed":true,"internalType":"address"},{"name":"newOwner","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"Transfer","inputs":[{"name":"from","type":"address","indexed":true,"internalType":"address"},{"name":"to","type":"address","indexed":true,"internalType":"address"},{"name":"value","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"Upgraded","inputs":[{"name":"implementation","type":"address","indexed":true,"internalType":"address"}],"anonymous":false}],"address":"0xb2F2BF932105A192566b56643BCa738eec06b3f1"},"KYCViewer":{"abi":[{"type":"constructor","inputs":[{"name":"_kintoWalletFactory","type":"address","internalType":"address"}],"stateMutability":"nonpayable"},{"type":"function","name":"hasTrait","inputs":[{"name":"_account","type":"address","internalType":"address"},{"name":"_traitId","type":"uint8","internalType":"uint8"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"initialize","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"isCompany","inputs":[{"name":"_account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"isIndividual","inputs":[{"name":"_account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"isKYC","inputs":[{"name":"_address","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"isSanctionsSafe","inputs":[{"name":"_account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"isSanctionsSafeIn","inputs":[{"name":"_account","type":"address","internalType":"address"},{"name":"_countryId","type":"uint16","internalType":"uint16"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"kintoID","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract IKintoID"}],"stateMutability":"view"},{"type":"function","name":"owner","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"proxiableUUID","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"renounceOwnership","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"transferOwnership","inputs":[{"name":"newOwner","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"upgradeTo","inputs":[{"name":"newImplementation","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"upgradeToAndCall","inputs":[{"name":"newImplementation","type":"address","internalType":"address"},{"name":"data","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"payable"},{"type":"function","name":"walletFactory","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract IKintoWalletFactory"}],"stateMutability":"view"},{"type":"event","name":"AdminChanged","inputs":[{"name":"previousAdmin","type":"address","indexed":false,"internalType":"address"},{"name":"newAdmin","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"type":"event","name":"BeaconUpgraded","inputs":[{"name":"beacon","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"Initialized","inputs":[{"name":"version","type":"uint8","indexed":false,"internalType":"uint8"}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"name":"previousOwner","type":"address","indexed":true,"internalType":"address"},{"name":"newOwner","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"Upgraded","inputs":[{"name":"implementation","type":"address","indexed":true,"internalType":"address"}],"anonymous":false}],"address":"0xC81102B63DCF419C65295EbbFddCb4EBDec4b2Ab"},"KintoWallet":{"abi":[{"type":"constructor","inputs":[{"name":"__entryPoint","type":"address","internalType":"contract IEntryPoint"},{"name":"_kintoID","type":"address","internalType":"contract IKintoID"},{"name":"_kintoApp","type":"address","internalType":"contract IKintoAppRegistry"}],"stateMutability":"nonpayable"},{"type":"receive","stateMutability":"payable"},{"type":"function","name":"ALL_SIGNERS","inputs":[],"outputs":[{"name":"","type":"uint8","internalType":"uint8"}],"stateMutability":"view"},{"type":"function","name":"MAX_SIGNERS","inputs":[],"outputs":[{"name":"","type":"uint8","internalType":"uint8"}],"stateMutability":"view"},{"type":"function","name":"MINUS_ONE_SIGNER","inputs":[],"outputs":[{"name":"","type":"uint8","internalType":"uint8"}],"stateMutability":"view"},{"type":"function","name":"RECOVERY_TIME","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"SINGLE_SIGNER","inputs":[],"outputs":[{"name":"","type":"uint8","internalType":"uint8"}],"stateMutability":"view"},{"type":"function","name":"appRegistry","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract IKintoAppRegistry"}],"stateMutability":"view"},{"type":"function","name":"appSigner","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"appWhitelist","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"cancelRecovery","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"changeRecoverer","inputs":[{"name":"newRecoverer","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"entryPoint","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract IEntryPoint"}],"stateMutability":"view"},{"type":"function","name":"execute","inputs":[{"name":"dest","type":"address","internalType":"address"},{"name":"value","type":"uint256","internalType":"uint256"},{"name":"func","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"executeBatch","inputs":[{"name":"dest","type":"address[]","internalType":"address[]"},{"name":"values","type":"uint256[]","internalType":"uint256[]"},{"name":"func","type":"bytes[]","internalType":"bytes[]"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"finishRecovery","inputs":[{"name":"newSigners","type":"address[]","internalType":"address[]"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"funderWhitelist","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"getNonce","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"getOwnersCount","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"inRecovery","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"initialize","inputs":[{"name":"anOwner","type":"address","internalType":"address"},{"name":"_recoverer","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"isFunderWhitelisted","inputs":[{"name":"funder","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"kintoID","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract IKintoID"}],"stateMutability":"view"},{"type":"function","name":"onERC1155BatchReceived","inputs":[{"name":"","type":"address","internalType":"address"},{"name":"","type":"address","internalType":"address"},{"name":"","type":"uint256[]","internalType":"uint256[]"},{"name":"","type":"uint256[]","internalType":"uint256[]"},{"name":"","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"","type":"bytes4","internalType":"bytes4"}],"stateMutability":"pure"},{"type":"function","name":"onERC1155Received","inputs":[{"name":"","type":"address","internalType":"address"},{"name":"","type":"address","internalType":"address"},{"name":"","type":"uint256","internalType":"uint256"},{"name":"","type":"uint256","internalType":"uint256"},{"name":"","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"","type":"bytes4","internalType":"bytes4"}],"stateMutability":"pure"},{"type":"function","name":"onERC721Received","inputs":[{"name":"","type":"address","internalType":"address"},{"name":"","type":"address","internalType":"address"},{"name":"","type":"uint256","internalType":"uint256"},{"name":"","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"","type":"bytes4","internalType":"bytes4"}],"stateMutability":"pure"},{"type":"function","name":"owners","inputs":[{"name":"","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"recoverer","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"resetSigners","inputs":[{"name":"newSigners","type":"address[]","internalType":"address[]"},{"name":"policy","type":"uint8","internalType":"uint8"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setAppKey","inputs":[{"name":"app","type":"address","internalType":"address"},{"name":"signer","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setFunderWhitelist","inputs":[{"name":"newWhitelist","type":"address[]","internalType":"address[]"},{"name":"flags","type":"bool[]","internalType":"bool[]"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setSignerPolicy","inputs":[{"name":"policy","type":"uint8","internalType":"uint8"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"signerPolicy","inputs":[],"outputs":[{"name":"","type":"uint8","internalType":"uint8"}],"stateMutability":"view"},{"type":"function","name":"startRecovery","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"supportsInterface","inputs":[{"name":"interfaceId","type":"bytes4","internalType":"bytes4"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"tokensReceived","inputs":[{"name":"","type":"address","internalType":"address"},{"name":"","type":"address","internalType":"address"},{"name":"","type":"address","internalType":"address"},{"name":"","type":"uint256","internalType":"uint256"},{"name":"","type":"bytes","internalType":"bytes"},{"name":"","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"pure"},{"type":"function","name":"validateUserOp","inputs":[{"name":"userOp","type":"tuple","internalType":"struct UserOperation","components":[{"name":"sender","type":"address","internalType":"address"},{"name":"nonce","type":"uint256","internalType":"uint256"},{"name":"initCode","type":"bytes","internalType":"bytes"},{"name":"callData","type":"bytes","internalType":"bytes"},{"name":"callGasLimit","type":"uint256","internalType":"uint256"},{"name":"verificationGasLimit","type":"uint256","internalType":"uint256"},{"name":"preVerificationGas","type":"uint256","internalType":"uint256"},{"name":"maxFeePerGas","type":"uint256","internalType":"uint256"},{"name":"maxPriorityFeePerGas","type":"uint256","internalType":"uint256"},{"name":"paymasterAndData","type":"bytes","internalType":"bytes"},{"name":"signature","type":"bytes","internalType":"bytes"}]},{"name":"userOpHash","type":"bytes32","internalType":"bytes32"},{"name":"missingAccountFunds","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"validationData","type":"uint256","internalType":"uint256"}],"stateMutability":"nonpayable"},{"type":"function","name":"whitelistApp","inputs":[{"name":"apps","type":"address[]","internalType":"address[]"},{"name":"flags","type":"bool[]","internalType":"bool[]"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"event","name":"Initialized","inputs":[{"name":"version","type":"uint8","indexed":false,"internalType":"uint8"}],"anonymous":false},{"type":"event","name":"KintoWalletInitialized","inputs":[{"name":"entryPoint","type":"address","indexed":true,"internalType":"contract IEntryPoint"},{"name":"owner","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"RecovererChanged","inputs":[{"name":"newRecoverer","type":"address","indexed":true,"internalType":"address"},{"name":"recoverer","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"SignersChanged","inputs":[{"name":"newSigners","type":"address[]","indexed":false,"internalType":"address[]"},{"name":"oldSigners","type":"address[]","indexed":false,"internalType":"address[]"}],"anonymous":false},{"type":"event","name":"WalletPolicyChanged","inputs":[{"name":"newPolicy","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"oldPolicy","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false}],"address":"0x0000000000000000000000000000000000000000"},"KintoWalletFactory":{"abi":[{"type":"constructor","inputs":[{"name":"_implAddressP","type":"address","internalType":"contract IKintoWallet"}],"stateMutability":"nonpayable"},{"type":"function","name":"beacon","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract UpgradeableBeacon"}],"stateMutability":"view"},{"type":"function","name":"changeWalletRecoverer","inputs":[{"name":"wallet","type":"address","internalType":"address payable"},{"name":"_newRecoverer","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"claimFromFaucet","inputs":[{"name":"_faucet","type":"address","internalType":"address"},{"name":"_signatureData","type":"tuple","internalType":"struct IFaucet.SignatureData","components":[{"name":"signer","type":"address","internalType":"address"},{"name":"nonce","type":"uint256","internalType":"uint256"},{"name":"expiresAt","type":"uint256","internalType":"uint256"},{"name":"signature","type":"bytes","internalType":"bytes"}]}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"completeWalletRecovery","inputs":[{"name":"wallet","type":"address","internalType":"address payable"},{"name":"newSigners","type":"address[]","internalType":"address[]"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"createAccount","inputs":[{"name":"owner","type":"address","internalType":"address"},{"name":"recoverer","type":"address","internalType":"address"},{"name":"salt","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"ret","type":"address","internalType":"contract IKintoWallet"}],"stateMutability":"nonpayable"},{"type":"function","name":"deployContract","inputs":[{"name":"contractOwner","type":"address","internalType":"address"},{"name":"amount","type":"uint256","internalType":"uint256"},{"name":"bytecode","type":"bytes","internalType":"bytes"},{"name":"salt","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"payable"},{"type":"function","name":"factoryWalletVersion","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"fundWallet","inputs":[{"name":"wallet","type":"address","internalType":"address payable"}],"outputs":[],"stateMutability":"payable"},{"type":"function","name":"getAddress","inputs":[{"name":"owner","type":"address","internalType":"address"},{"name":"recoverer","type":"address","internalType":"address"},{"name":"salt","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"getContractAddress","inputs":[{"name":"salt","type":"bytes32","internalType":"bytes32"},{"name":"byteCodeHash","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"getWalletTimestamp","inputs":[{"name":"wallet","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"initialize","inputs":[{"name":"_kintoID","type":"address","internalType":"contract IKintoID"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"kintoID","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract IKintoID"}],"stateMutability":"view"},{"type":"function","name":"owner","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"proxiableUUID","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"renounceOwnership","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"startWalletRecovery","inputs":[{"name":"wallet","type":"address","internalType":"address payable"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"totalWallets","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"transferOwnership","inputs":[{"name":"newOwner","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"upgradeAllWalletImplementations","inputs":[{"name":"newImplementationWallet","type":"address","internalType":"contract IKintoWallet"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"upgradeTo","inputs":[{"name":"newImplementation","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"upgradeToAndCall","inputs":[{"name":"newImplementation","type":"address","internalType":"address"},{"name":"data","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"payable"},{"type":"function","name":"walletTs","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"event","name":"AdminChanged","inputs":[{"name":"previousAdmin","type":"address","indexed":false,"internalType":"address"},{"name":"newAdmin","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"type":"event","name":"BeaconUpgraded","inputs":[{"name":"beacon","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"Initialized","inputs":[{"name":"version","type":"uint8","indexed":false,"internalType":"uint8"}],"anonymous":false},{"type":"event","name":"KintoWalletFactoryCreation","inputs":[{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"owner","type":"address","indexed":true,"internalType":"address"},{"name":"version","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"KintoWalletFactoryUpgraded","inputs":[{"name":"oldImplementation","type":"address","indexed":true,"internalType":"address"},{"name":"newImplementation","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"name":"previousOwner","type":"address","indexed":true,"internalType":"address"},{"name":"newOwner","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"Upgraded","inputs":[{"name":"implementation","type":"address","indexed":true,"internalType":"address"}],"anonymous":false}],"address":"0x8a4720488CA32f1223ccFE5A087e250fE3BC5D75"},"Faucet":{"abi":[{"type":"constructor","inputs":[{"name":"_kintoWalletFactory","type":"address","internalType":"address"}],"stateMutability":"nonpayable"},{"type":"receive","stateMutability":"payable"},{"type":"function","name":"CLAIM_AMOUNT","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"FAUCET_AMOUNT","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"active","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"claimKintoETH","inputs":[{"name":"_signatureData","type":"tuple","internalType":"struct IFaucet.SignatureData","components":[{"name":"signer","type":"address","internalType":"address"},{"name":"nonce","type":"uint256","internalType":"uint256"},{"name":"expiresAt","type":"uint256","internalType":"uint256"},{"name":"signature","type":"bytes","internalType":"bytes"}]}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"claimKintoETH","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"claimed","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"initialize","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"nonces","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"owner","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"proxiableUUID","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"renounceOwnership","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"startFaucet","inputs":[],"outputs":[],"stateMutability":"payable"},{"type":"function","name":"transferOwnership","inputs":[{"name":"newOwner","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"upgradeTo","inputs":[{"name":"newImplementation","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"upgradeToAndCall","inputs":[{"name":"newImplementation","type":"address","internalType":"address"},{"name":"data","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"payable"},{"type":"function","name":"walletFactory","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract IKintoWalletFactory"}],"stateMutability":"view"},{"type":"function","name":"withdrawAll","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"event","name":"AdminChanged","inputs":[{"name":"previousAdmin","type":"address","indexed":false,"internalType":"address"},{"name":"newAdmin","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"type":"event","name":"BeaconUpgraded","inputs":[{"name":"beacon","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"Claim","inputs":[{"name":"_to","type":"address","indexed":true,"internalType":"address"},{"name":"_timestamp","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"Initialized","inputs":[{"name":"version","type":"uint8","indexed":false,"internalType":"uint8"}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"name":"previousOwner","type":"address","indexed":true,"internalType":"address"},{"name":"newOwner","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"Upgraded","inputs":[{"name":"implementation","type":"address","indexed":true,"internalType":"address"}],"anonymous":false}],"address":"0x0719D47A213149E2Ef8d3f5afDaDA8a8E22dfc03"},"KintoID":{"abi":[{"type":"constructor","inputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"DEFAULT_ADMIN_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"KYC_PROVIDER_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"UPGRADER_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"addSanction","inputs":[{"name":"_account","type":"address","internalType":"address"},{"name":"_countryId","type":"uint16","internalType":"uint16"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"addTrait","inputs":[{"name":"_account","type":"address","internalType":"address"},{"name":"_traitId","type":"uint16","internalType":"uint16"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"approve","inputs":[{"name":"to","type":"address","internalType":"address"},{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"balanceOf","inputs":[{"name":"owner","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"burn","inputs":[{"name":"","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"pure"},{"type":"function","name":"burnKYC","inputs":[{"name":"_signatureData","type":"tuple","internalType":"struct IKintoID.SignatureData","components":[{"name":"signer","type":"address","internalType":"address"},{"name":"nonce","type":"uint256","internalType":"uint256"},{"name":"expiresAt","type":"uint256","internalType":"uint256"},{"name":"signature","type":"bytes","internalType":"bytes"}]}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"getApproved","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"getRoleAdmin","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"grantRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"hasRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"hasTrait","inputs":[{"name":"_account","type":"address","internalType":"address"},{"name":"index","type":"uint16","internalType":"uint16"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"initialize","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"isApprovedForAll","inputs":[{"name":"owner","type":"address","internalType":"address"},{"name":"operator","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"isCompany","inputs":[{"name":"_account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"isIndividual","inputs":[{"name":"_account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"isKYC","inputs":[{"name":"_account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"isSanctionsMonitored","inputs":[{"name":"_days","type":"uint32","internalType":"uint32"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"isSanctionsSafe","inputs":[{"name":"_account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"isSanctionsSafeIn","inputs":[{"name":"_account","type":"address","internalType":"address"},{"name":"_countryId","type":"uint16","internalType":"uint16"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"lastMonitoredAt","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"mintCompanyKyc","inputs":[{"name":"_signatureData","type":"tuple","internalType":"struct IKintoID.SignatureData","components":[{"name":"signer","type":"address","internalType":"address"},{"name":"nonce","type":"uint256","internalType":"uint256"},{"name":"expiresAt","type":"uint256","internalType":"uint256"},{"name":"signature","type":"bytes","internalType":"bytes"}]},{"name":"_traits","type":"uint16[]","internalType":"uint16[]"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"mintIndividualKyc","inputs":[{"name":"_signatureData","type":"tuple","internalType":"struct IKintoID.SignatureData","components":[{"name":"signer","type":"address","internalType":"address"},{"name":"nonce","type":"uint256","internalType":"uint256"},{"name":"expiresAt","type":"uint256","internalType":"uint256"},{"name":"signature","type":"bytes","internalType":"bytes"}]},{"name":"_traits","type":"uint16[]","internalType":"uint16[]"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"mintedAt","inputs":[{"name":"_account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"monitor","inputs":[{"name":"_accounts","type":"address[]","internalType":"address[]"},{"name":"_traitsAndSanctions","type":"tuple[][]","internalType":"struct IKintoID.MonitorUpdateData[][]","components":[{"name":"isTrait","type":"bool","internalType":"bool"},{"name":"isSet","type":"bool","internalType":"bool"},{"name":"index","type":"uint16","internalType":"uint16"}]}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"name","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"pure"},{"type":"function","name":"nonces","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"ownerOf","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"proxiableUUID","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"removeSanction","inputs":[{"name":"_account","type":"address","internalType":"address"},{"name":"_countryId","type":"uint16","internalType":"uint16"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"removeTrait","inputs":[{"name":"_account","type":"address","internalType":"address"},{"name":"_traitId","type":"uint16","internalType":"uint16"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"renounceRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"revokeRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"safeTransferFrom","inputs":[{"name":"from","type":"address","internalType":"address"},{"name":"to","type":"address","internalType":"address"},{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"safeTransferFrom","inputs":[{"name":"from","type":"address","internalType":"address"},{"name":"to","type":"address","internalType":"address"},{"name":"tokenId","type":"uint256","internalType":"uint256"},{"name":"data","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setApprovalForAll","inputs":[{"name":"operator","type":"address","internalType":"address"},{"name":"approved","type":"bool","internalType":"bool"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"supportsInterface","inputs":[{"name":"interfaceId","type":"bytes4","internalType":"bytes4"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"symbol","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"pure"},{"type":"function","name":"tokenByIndex","inputs":[{"name":"index","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"tokenOfOwnerByIndex","inputs":[{"name":"owner","type":"address","internalType":"address"},{"name":"index","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"tokenURI","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"type":"function","name":"totalSupply","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"traits","inputs":[{"name":"_account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool[]","internalType":"bool[]"}],"stateMutability":"view"},{"type":"function","name":"transferFrom","inputs":[{"name":"from","type":"address","internalType":"address"},{"name":"to","type":"address","internalType":"address"},{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"upgradeTo","inputs":[{"name":"newImplementation","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"upgradeToAndCall","inputs":[{"name":"newImplementation","type":"address","internalType":"address"},{"name":"data","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"payable"},{"type":"event","name":"AccountsMonitoredAt","inputs":[{"name":"_signer","type":"address","indexed":true,"internalType":"address"},{"name":"_accountsCount","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"_timestamp","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"AdminChanged","inputs":[{"name":"previousAdmin","type":"address","indexed":false,"internalType":"address"},{"name":"newAdmin","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"type":"event","name":"Approval","inputs":[{"name":"owner","type":"address","indexed":true,"internalType":"address"},{"name":"approved","type":"address","indexed":true,"internalType":"address"},{"name":"tokenId","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"ApprovalForAll","inputs":[{"name":"owner","type":"address","indexed":true,"internalType":"address"},{"name":"operator","type":"address","indexed":true,"internalType":"address"},{"name":"approved","type":"bool","indexed":false,"internalType":"bool"}],"anonymous":false},{"type":"event","name":"BeaconUpgraded","inputs":[{"name":"beacon","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"Initialized","inputs":[{"name":"version","type":"uint8","indexed":false,"internalType":"uint8"}],"anonymous":false},{"type":"event","name":"RoleAdminChanged","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"previousAdminRole","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"newAdminRole","type":"bytes32","indexed":true,"internalType":"bytes32"}],"anonymous":false},{"type":"event","name":"RoleGranted","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"sender","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"RoleRevoked","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"sender","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"SanctionAdded","inputs":[{"name":"_to","type":"address","indexed":true,"internalType":"address"},{"name":"_sanctionIndex","type":"uint16","indexed":false,"internalType":"uint16"},{"name":"_timestamp","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"SanctionRemoved","inputs":[{"name":"_to","type":"address","indexed":true,"internalType":"address"},{"name":"_sanctionIndex","type":"uint16","indexed":false,"internalType":"uint16"},{"name":"_timestamp","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"TraitAdded","inputs":[{"name":"_to","type":"address","indexed":true,"internalType":"address"},{"name":"_traitIndex","type":"uint16","indexed":false,"internalType":"uint16"},{"name":"_timestamp","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"TraitRemoved","inputs":[{"name":"_to","type":"address","indexed":true,"internalType":"address"},{"name":"_traitIndex","type":"uint16","indexed":false,"internalType":"uint16"},{"name":"_timestamp","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"Transfer","inputs":[{"name":"from","type":"address","indexed":true,"internalType":"address"},{"name":"to","type":"address","indexed":true,"internalType":"address"},{"name":"tokenId","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"Upgraded","inputs":[{"name":"implementation","type":"address","indexed":true,"internalType":"address"}],"anonymous":false}],"address":"0xf369f78E3A0492CC4e96a90dae0728A38498e9c7"}}} \ No newline at end of file diff --git a/broadcast/14-factory_v3.sol/7887/run-1705336600.json b/broadcast/14-factory_v3.sol/7887/run-1705336600.json new file mode 100644 index 000000000..35df2489b --- /dev/null +++ b/broadcast/14-factory_v3.sol/7887/run-1705336600.json @@ -0,0 +1,207 @@ +{ + "transactions": [ + { + "hash": "0x1aef06ade0c6712c96d108dc0f0d72053c1948a306e597624a3ca346b0a0e4a9", + "transactionType": "CALL", + "contractName": null, + "contractAddress": null, + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0x660ad4b5a74130a4796b4d54bc6750ae93c86e6c", + "to": "0x8a4720488ca32f1223ccfe5a087e250fe3bc5d75", + "value": "0x0", + "data": "0x66d6e19b000000000000000000000000c1f4d15c16a1f3555e0a5f7aefd1e17ad4aaf40b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000376a60c0604052306080523480156200001557600080fd5b506040516200374a3803806200374a833981016040819052620000389162000117565b806200004362000056565b6001600160a01b031660a0525062000149565b600054610100900460ff1615620000c35760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff9081161462000115576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6000602082840312156200012a57600080fd5b81516001600160a01b03811681146200014257600080fd5b9392505050565b60805160a0516135bf6200018b6000396000610f9001526000818161090301528181610946015281816109ee01528181610a310152610acd01526135bf6000f3fe6080604052600436106200015b5760003560e01c8063778c271d11620000c5578063daba3eac1162000078578063daba3eac14620003b4578063ea372fce14620003d9578063ed97bab31462000413578063f2fde38b146200042a578063f4f4b03a146200044f578063f662e6e2146200047457600080fd5b8063778c271d14620002f85780638da5cb5b146200031d578063977d2c45146200033d57806399a6cddd1462000355578063bae7b5d31462000377578063c4d66de8146200038f57600080fd5b80634f1ef286116200011e5780634f1ef286146200025357806352d1902d146200026a57806359659e9014620002825780635fd6656f14620002a457806366d6e19b14620002c9578063715018a614620002e057600080fd5b806308a6354e1462000160578063097e9dd414620001a25780631230aea214620001c95780632098fe4814620001ee5780633659cfe6146200022e575b600080fd5b3480156200016d57600080fd5b50620001856200017f3660046200202a565b62000499565b6040516001600160a01b0390911681526020015b60405180910390f35b348015620001af57600080fd5b50620001c7620001c136600462002070565b6200056b565b005b348015620001d657600080fd5b5062000185620001e83660046200202a565b620006ad565b348015620001fb57600080fd5b506200021f6200020d366004620020ff565b60cb6020526000908152604090205481565b60405190815260200162000199565b3480156200023b57600080fd5b50620001c76200024d366004620020ff565b620008f9565b620001c76200026436600462002135565b620009e4565b3480156200027757600080fd5b506200021f62000ac0565b3480156200028f57600080fd5b5060c95462000185906001600160a01b031681565b348015620002b157600080fd5b50620001c7620002c336600462002205565b62000b76565b62000185620002da36600462002261565b62000ddc565b348015620002ed57600080fd5b50620001c762000e84565b3480156200030557600080fd5b506200018562000317366004620022f9565b62000e9c565b3480156200032a57600080fd5b506097546001600160a01b031662000185565b3480156200034a57600080fd5b506200021f60cd5481565b3480156200036257600080fd5b5060ca5462000185906001600160a01b031681565b3480156200038457600080fd5b506200021f60cc5481565b3480156200039c57600080fd5b50620001c7620003ae366004620020ff565b62000eb4565b348015620003c157600080fd5b50620001c7620003d33660046200231c565b62001069565b348015620003e657600080fd5b506200021f620003f8366004620020ff565b6001600160a01b0316600090815260cb602052604090205490565b620001c762000424366004620020ff565b62001168565b3480156200043757600080fd5b50620001c762000449366004620020ff565b62001374565b3480156200045c57600080fd5b50620001c76200046e366004620020ff565b620013f0565b3480156200048157600080fd5b50620001c762000493366004620020ff565b62001600565b6000620005618260001b60405180602001620004b59062001ff8565b601f1982820381018352601f90910116604081905260c9546001600160a01b0389811660248401528881166044840152169060640160408051601f19818403018152918152602080830180516001600160e01b031663485cc95560e01b17905290516200052593929101620023a3565b60408051601f1981840301815290829052620005459291602001620023c9565b6040516020818303038152906040528051906020012062000e9c565b90505b9392505050565b6001600160a01b038316600090815260cb6020526040902054620005ac5760405162461bcd60e51b8152600401620005a390620023fc565b60405180910390fd5b826001600160a01b031663b808dce86040518163ffffffff1660e01b8152600401602060405180830381865afa158015620005eb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000611919062002424565b6001600160a01b0316336001600160a01b031614620006445760405162461bcd60e51b8152600401620005a39062002444565b60405163182e75b360e01b81526001600160a01b0384169063182e75b3906200067490859085906004016200246c565b600060405180830381600087803b1580156200068f57600080fd5b505af1158015620006a4573d6000803e3d6000fd5b50505050505050565b60006001600160a01b03841615801590620006d057506001600160a01b03831615155b620007125760405162461bcd60e51b8152602060048201526011602482015270696e76616c69642061646472657373657360781b6044820152606401620005a3565b60ca546040516313289ea360e31b81526001600160a01b03868116600483015290911690639944f51890602401602060405180830381865afa1580156200075d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620007839190620024b3565b80156200079857506001600160a01b03841633145b620007b75760405162461bcd60e51b8152600401620005a390620024d7565b6000620007c685858562000499565b90506001600160a01b0381163b8015620007e35750905062000564565b60c9546040516001600160a01b03888116602483015287811660448301528692169060640160408051601f198184030181529181526020820180516001600160e01b031663485cc95560e01b179052516200083e9062001ff8565b6200084b929190620023a3565b8190604051809103906000f59050801580156200086c573d6000803e3d6000fd5b506001600160a01b038116600090815260cb6020526040812042905560cd8054929550906200089b8362002513565b9190505550856001600160a01b0316836001600160a01b03167fa097b826e61d0ee46c6b3b1596580ed60bd21801826a88e23c919724e6f8f21360cc54604051620008e891815260200190565b60405180910390a350509392505050565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163003620009445760405162461bcd60e51b8152600401620005a3906200252f565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166200098f60008051602062003543833981519152546001600160a01b031690565b6001600160a01b031614620009b85760405162461bcd60e51b8152600401620005a3906200257b565b620009c3816200170c565b60408051600080825260208201909252620009e19183919062001716565b50565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016300362000a2f5760405162461bcd60e51b8152600401620005a3906200252f565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031662000a7a60008051602062003543833981519152546001600160a01b031690565b6001600160a01b03161462000aa35760405162461bcd60e51b8152600401620005a3906200257b565b62000aae826200170c565b62000abc8282600162001716565b5050565b6000306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161462000b625760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c00000000000000006064820152608401620005a3565b506000805160206200354383398151915290565b60ca546040516313289ea360e31b81523360048201526001600160a01b0390911690639944f51890602401602060405180830381865afa15801562000bbf573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000be59190620024b3565b62000c045760405162461bcd60e51b8152600401620005a390620024d7565b60ca546040805163d9e1063d60e01b815290516001600160a01b03909216916391d1485491839163d9e1063d916004808201926020929091908290030181865afa15801562000c57573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000c7d9190620025c7565b6040516001600160e01b031960e084901b1681526004810191909152336024820152604401602060405180830381865afa15801562000cc0573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000ce69190620024b3565b62000d255760405162461bcd60e51b815260206004820152600e60248201526d24b73b30b634b21039b2b73232b960911b6044820152606401620005a3565b6001600160a01b03821662000d765760405162461bcd60e51b8152602060048201526016602482015275496e76616c696420666175636574206164647265737360501b6044820152606401620005a3565b60405163064a7ecf60e31b81526001600160a01b03831690633253f6789062000da49084906004016200260a565b600060405180830381600087803b15801562000dbf57600080fd5b505af115801562000dd4573d6000803e3d6000fd5b505050505050565b60ca546040516313289ea360e31b81523360048201526000916001600160a01b031690639944f51890602401602060405180830381865afa15801562000e26573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000e4c9190620024b3565b62000e6b5760405162461bcd60e51b8152600401620005a390620024d7565b62000e7a868686868662001893565b9695505050505050565b62000e8e62001a08565b62000e9a600062001a64565b565b600062000eab83833062001ab6565b90505b92915050565b600054610100900460ff161580801562000ed55750600054600160ff909116105b8062000ef15750303b15801562000ef1575060005460ff166001145b62000f565760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401620005a3565b6000805460ff19166001179055801562000f7a576000805461ff0019166101001790555b62000f8462001ae0565b62000f8e62001b14565b7f000000000000000000000000000000000000000000000000000000000000000060405162000fbd9062002006565b6001600160a01b039091168152602001604051809103906000f08015801562000fea573d6000803e3d6000fd5b5060c980546001600160a01b03199081166001600160a01b0393841617909155600160cc5560ca8054909116918416919091179055801562000abc576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050565b6001600160a01b038216600090815260cb6020526040902054620010a15760405162461bcd60e51b8152600401620005a390620023fc565b816001600160a01b031663b808dce86040518163ffffffff1660e01b8152600401602060405180830381865afa158015620010e0573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001106919062002424565b6001600160a01b0316336001600160a01b031614620011395760405162461bcd60e51b8152600401620005a39062002444565b60405163bd53457b60e01b81526001600160a01b03828116600483015283169063bd53457b9060240162000da4565b6000341180156200119057506001600160a01b038116600090815260cb602052604090205415155b80156200127d575060ca5460405163025e7c2760e01b8152600060048201526001600160a01b0391821691639944f518919084169063025e7c2790602401602060405180830381865afa158015620011ec573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001212919062002424565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa15801562001257573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200127d9190620024b3565b8015620012f05750604051631c7a34ef60e31b81523360048201526001600160a01b0382169063e3d1a77890602401602060405180830381865afa158015620012ca573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620012f09190620024b3565b6200133e5760405162461bcd60e51b815260206004820152601860248201527f496e76616c69642077616c6c6574206f722066756e64657200000000000000006044820152606401620005a3565b6040516001600160a01b038216903480156108fc02916000818181858888f1935050505015801562000abc573d6000803e3d6000fd5b6200137e62001a08565b6001600160a01b038116620013e55760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401620005a3565b620009e18162001a64565b620013fa62001a08565b6001600160a01b038116158015906200149e575060c960009054906101000a90046001600160a01b03166001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801562001462573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001488919062002424565b6001600160a01b0316816001600160a01b031614155b620014de5760405162461bcd60e51b815260206004820152600f60248201526e696e76616c6964206164647265737360881b6044820152606401620005a3565b60cc8054906000620014f08362002513565b909155505060c95460408051635c60da1b60e01b815290516001600160a01b03808516931691635c60da1b9160048083019260209291908290030181865afa15801562001541573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001567919062002424565b6001600160a01b03167f5678caf9f87c5a77571c317ab0f4cc76826bfa201760aaf54273c13333de40f660405160405180910390a360c954604051631b2ce7f360e11b81526001600160a01b03838116600483015290911690633659cfe690602401600060405180830381600087803b158015620015e457600080fd5b505af1158015620015f9573d6000803e3d6000fd5b5050505050565b6001600160a01b038116600090815260cb6020526040902054620016385760405162461bcd60e51b8152600401620005a390620023fc565b806001600160a01b031663b808dce86040518163ffffffff1660e01b8152600401602060405180830381865afa15801562001677573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200169d919062002424565b6001600160a01b0316336001600160a01b031614620016d05760405162461bcd60e51b8152600401620005a39062002444565b806001600160a01b031663923689e46040518163ffffffff1660e01b8152600401600060405180830381600087803b158015620015e457600080fd5b620009e162001a08565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff161562001751576200174c8362001b3e565b505050565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015620017ae575060408051601f3d908101601f19168201909252620017ab91810190620025c7565b60015b620018135760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b6064820152608401620005a3565b600080516020620035438339815191528114620018855760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b6064820152608401620005a3565b506200174c83838362001bdd565b6000348514620018d85760405162461bcd60e51b815260206004820152600f60248201526e0c2dadeeadce840dad2e6dac2e8c6d608b1b6044820152606401620005a3565b620018e4848462001c0e565b600062001929868487878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525062001d3692505050565b9050806001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa92505050801562001988575060408051601f3d908101601f19168201909252620019859181019062002424565b60015b1562000e7a57306001600160a01b03821603620019fd5760405163f2fde38b60e01b81526001600160a01b03898116600483015283169063f2fde38b90602401600060405180830381600087803b158015620019e357600080fd5b505af1158015620019f8573d6000803e3d6000fd5b505050505b509695505050505050565b6097546001600160a01b0316331462000e9a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401620005a3565b609780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b600054610100900460ff1662001b0a5760405162461bcd60e51b8152600401620005a3906200269c565b62000e9a62001e40565b600054610100900460ff1662000e9a5760405162461bcd60e51b8152600401620005a3906200269c565b6001600160a01b0381163b62001bad5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401620005a3565b6000805160206200354383398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b62001be88362001e75565b60008251118062001bf65750805b156200174c5762001c08838362001eb7565b50505050565b60006040518060200162001c229062001ff8565b601f1982820381018352601f90910116604052805190915062001c47906020620026e7565b8211156200174c5760008151600c62001c619190620026e7565b905060008085838662001c76826014620026e7565b9262001c8593929190620026fd565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050601482015160c954909450919250506001600160a01b039081169083160362000dd45760405162461bcd60e51b815260206004820152602960248201527f446972656374204b696e746f57616c6c6574206465706c6f796d656e74206e6f6044820152681d08185b1b1bddd95960ba1b6064820152608401620005a3565b60008347101562001d8a5760405162461bcd60e51b815260206004820152601d60248201527f437265617465323a20696e73756666696369656e742062616c616e63650000006044820152606401620005a3565b815160000362001ddd5760405162461bcd60e51b815260206004820181905260248201527f437265617465323a2062797465636f6465206c656e677468206973207a65726f6044820152606401620005a3565b8282516020840186f590506001600160a01b038116620005645760405162461bcd60e51b815260206004820152601960248201527f437265617465323a204661696c6564206f6e206465706c6f79000000000000006044820152606401620005a3565b600054610100900460ff1662001e6a5760405162461bcd60e51b8152600401620005a3906200269c565b62000e9a3362001a64565b62001e808162001b3e565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606001600160a01b0383163b62001f215760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b6064820152608401620005a3565b600080846001600160a01b03168460405162001f3e919062002729565b600060405180830381855af49150503d806000811462001f7b576040519150601f19603f3d011682016040523d82523d6000602084013e62001f80565b606091505b509150915062001fab8282604051806060016040528060278152602001620035636027913962001fb4565b95945050505050565b6060831562001fc557508162000564565b62000564838381511562001fdc5781518083602001fd5b8060405162461bcd60e51b8152600401620005a3919062002747565b610902806200275d83390190565b6104e4806200305f83390190565b6001600160a01b0381168114620009e157600080fd5b6000806000606084860312156200204057600080fd5b83356200204d8162002014565b925060208401356200205f8162002014565b929592945050506040919091013590565b6000806000604084860312156200208657600080fd5b8335620020938162002014565b9250602084013567ffffffffffffffff80821115620020b157600080fd5b818601915086601f830112620020c657600080fd5b813581811115620020d657600080fd5b8760208260051b8501011115620020ec57600080fd5b6020830194508093505050509250925092565b6000602082840312156200211257600080fd5b8135620005648162002014565b634e487b7160e01b600052604160045260246000fd5b600080604083850312156200214957600080fd5b8235620021568162002014565b9150602083013567ffffffffffffffff808211156200217457600080fd5b818501915085601f8301126200218957600080fd5b8135818111156200219e576200219e6200211f565b604051601f8201601f19908116603f01168101908382118183101715620021c957620021c96200211f565b81604052828152886020848701011115620021e357600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b600080604083850312156200221957600080fd5b8235620022268162002014565b9150602083013567ffffffffffffffff8111156200224357600080fd5b8301608081860312156200225657600080fd5b809150509250929050565b6000806000806000608086880312156200227a57600080fd5b8535620022878162002014565b945060208601359350604086013567ffffffffffffffff80821115620022ac57600080fd5b818801915088601f830112620022c157600080fd5b813581811115620022d157600080fd5b896020828501011115620022e457600080fd5b96999598505060200195606001359392505050565b600080604083850312156200230d57600080fd5b50508035926020909101359150565b600080604083850312156200233057600080fd5b82356200233d8162002014565b91506020830135620022568162002014565b60005b838110156200236c57818101518382015260200162002352565b50506000910152565b600081518084526200238f8160208601602086016200234f565b601f01601f19169290920160200192915050565b6001600160a01b0383168152604060208201819052600090620005619083018462002375565b60008351620023dd8184602088016200234f565b835190830190620023f38183602088016200234f565b01949350505050565b6020808252600e908201526d1a5b9d985b1a59081dd85b1b195d60921b604082015260600190565b6000602082840312156200243757600080fd5b8151620005648162002014565b6020808252600e908201526d37b7363c903932b1b7bb32b932b960911b604082015260600190565b60208082528181018390526000908460408401835b86811015620019fd578235620024978162002014565b6001600160a01b03168252918301919083019060010162002481565b600060208284031215620024c657600080fd5b815180151581146200056457600080fd5b6020808252600c908201526b12d650c81c995c5d5a5c995960a21b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b600060018201620025285762002528620024fd565b5060010190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b6163746976652070726f787960a01b606082015260800190565b600060208284031215620025da57600080fd5b5051919050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60208152600082356200261d8162002014565b60018060a01b03811660208401525060208301356040830152604083013560608301526060830135601e198436030181126200265857600080fd5b830160208101903567ffffffffffffffff8111156200267657600080fd5b8036038213156200268657600080fd5b60808085015262001fab60a085018284620025e1565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b8082018082111562000eae5762000eae620024fd565b600080858511156200270e57600080fd5b838611156200271c57600080fd5b5050820193919092039150565b600082516200273d8184602087016200234f565b9190910192915050565b60208152600062000eab60208301846200237556fe60806040526040516109023803806109028339810160408190526100229161045f565b818161003082826000610039565b50505050610589565b61004283610104565b6040516001600160a01b038416907f1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e90600090a26000825111806100835750805b156100ff576100fd836001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100ed919061051f565b836102a760201b6100271760201c565b505b505050565b610117816102d360201b6100531760201c565b6101765760405162461bcd60e51b815260206004820152602560248201527f455243313936373a206e657720626561636f6e206973206e6f74206120636f6e6044820152641d1c9858dd60da1b60648201526084015b60405180910390fd5b6101ea816001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156101b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101db919061051f565b6102d360201b6100531760201c565b61024f5760405162461bcd60e51b815260206004820152603060248201527f455243313936373a20626561636f6e20696d706c656d656e746174696f6e206960448201526f1cc81b9bdd08184818dbdb9d1c9858dd60821b606482015260840161016d565b806102867fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d5060001b6102e260201b6100621760201c565b80546001600160a01b0319166001600160a01b039290921691909117905550565b60606102cc83836040518060600160405280602781526020016108db602791396102e5565b9392505050565b6001600160a01b03163b151590565b90565b6060600080856001600160a01b031685604051610302919061053a565b600060405180830381855af49150503d806000811461033d576040519150601f19603f3d011682016040523d82523d6000602084013e610342565b606091505b5090925090506103548683838761035e565b9695505050505050565b606083156103cd5782516000036103c6576001600160a01b0385163b6103c65760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161016d565b50816103d7565b6103d783836103df565b949350505050565b8151156103ef5781518083602001fd5b8060405162461bcd60e51b815260040161016d9190610556565b80516001600160a01b038116811461042057600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b8381101561045657818101518382015260200161043e565b50506000910152565b6000806040838503121561047257600080fd5b61047b83610409565b60208401519092506001600160401b038082111561049857600080fd5b818501915085601f8301126104ac57600080fd5b8151818111156104be576104be610425565b604051601f8201601f19908116603f011681019083821181831017156104e6576104e6610425565b816040528281528860208487010111156104ff57600080fd5b61051083602083016020880161043b565b80955050505050509250929050565b60006020828403121561053157600080fd5b6102cc82610409565b6000825161054c81846020870161043b565b9190910192915050565b602081526000825180602084015261057581604085016020870161043b565b601f01601f19169190910160400192915050565b610343806105986000396000f3fe60806040523661000b57005b610013610015565b005b610025610020610065565b6100fe565b565b606061004c83836040518060600160405280602781526020016102e760279139610122565b9392505050565b6001600160a01b03163b151590565b90565b60006100987fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50546001600160a01b031690565b6001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100f9919061024a565b905090565b3660008037600080366000845af43d6000803e80801561011d573d6000f35b3d6000fd5b6060600080856001600160a01b03168560405161013f9190610297565b600060405180830381855af49150503d806000811461017a576040519150601f19603f3d011682016040523d82523d6000602084013e61017f565b606091505b50915091506101908683838761019a565b9695505050505050565b6060831561020e578251600003610207576001600160a01b0385163b6102075760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064015b60405180910390fd5b5081610218565b6102188383610220565b949350505050565b8151156102305781518083602001fd5b8060405162461bcd60e51b81526004016101fe91906102b3565b60006020828403121561025c57600080fd5b81516001600160a01b038116811461004c57600080fd5b60005b8381101561028e578181015183820152602001610276565b50506000910152565b600082516102a9818460208701610273565b9190910192915050565b60208152600082518060208401526102d2816040850160208701610273565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220f0e3ef2d2445c27cb092c3417e9d772e131fc2383995e0d0d9ee96165dd0ab0b64736f6c63430008120033416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564608060405234801561001057600080fd5b506040516104e43803806104e483398101604081905261002f91610151565b61003833610047565b61004181610097565b50610181565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6100aa8161014260201b6101a01760201c565b6101205760405162461bcd60e51b815260206004820152603360248201527f5570677261646561626c65426561636f6e3a20696d706c656d656e746174696f60448201527f6e206973206e6f74206120636f6e747261637400000000000000000000000000606482015260840160405180910390fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b03163b151590565b60006020828403121561016357600080fd5b81516001600160a01b038116811461017a57600080fd5b9392505050565b610354806101906000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80633659cfe61461005c5780635c60da1b14610071578063715018a61461009a5780638da5cb5b146100a2578063f2fde38b146100b3575b600080fd5b61006f61006a3660046102ee565b6100c6565b005b6001546001600160a01b03165b6040516001600160a01b03909116815260200160405180910390f35b61006f61010e565b6000546001600160a01b031661007e565b61006f6100c13660046102ee565b610122565b6100ce6101af565b6100d781610209565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6101166101af565b610120600061029e565b565b61012a6101af565b6001600160a01b0381166101945760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b61019d8161029e565b50565b6001600160a01b03163b151590565b6000546001600160a01b031633146101205760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161018b565b6001600160a01b0381163b61027c5760405162461bcd60e51b815260206004820152603360248201527f5570677261646561626c65426561636f6e3a20696d706c656d656e746174696f6044820152721b881a5cc81b9bdd08184818dbdb9d1c9858dd606a1b606482015260840161018b565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60006020828403121561030057600080fd5b81356001600160a01b038116811461031757600080fd5b939250505056fea26469706673582212209f2075bb08aacaa7585daf8bbb94ff2d4da0d3e0654263dbde3f0bbbb81f211c64736f6c63430008120033360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220a8a73ad628f04f8207326aada973ff18641485bc88eb48c3bf942a0e3fbb04c564736f6c63430008120033000000000000000000000000893b0aea9c45fa8d3b0fbbebd03d4220b951459900000000000000000000000000000000000000000000", + "nonce": "0xf" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xe776c20bd6ff45148cf4e430bfc0065ce64768dd86280875bcce04f5a02566ab", + "transactionType": "CALL", + "contractName": null, + "contractAddress": null, + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0x660ad4b5a74130a4796b4d54bc6750ae93c86e6c", + "to": "0x8a4720488ca32f1223ccfe5a087e250fe3bc5d75", + "value": "0x0", + "data": "0x66d6e19b000000000000000000000000c1f4d15c16a1f3555e0a5f7aefd1e17ad4aaf40b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004af760a0604052306080523480156200001557600080fd5b506200002062000026565b620000e7565b600054610100900460ff1615620000935760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff90811614620000e5576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6080516149d86200011f60003960008181610fbb01528181610ffb015281816110f301528181611133015261125501526149d86000f3fe6080604052600436106102935760003560e01c80636d7cdf6c1161015a578063b0a77c61116100c1578063d9e1063d1161007a578063d9e1063d14610880578063e985e9c5146108a2578063ead15596146108eb578063ef3b49031461090b578063efdbfaee1461092b578063f72c0d8b1461094b57600080fd5b8063b0a77c61146107bc578063b61f5515146107d3578063b75a3e4e14610800578063b88d4fde14610820578063c87b56dd14610840578063d547741f1461086057600080fd5b806391d148541161011357806391d14854146106d457806395d89b41146106f45780639944f51814610724578063a0406ce214610744578063a217fddf14610787578063a22cb4651461079c57600080fd5b80636d7cdf6c146106115780636ed1f4a31461063157806370a08231146106515780637ecebe00146106715780638129fc1c1461069f57806386823a2c146106b457600080fd5b80632f2ff15d116101fe57806342966c68116101b757806342966c68146105695780634f1ef286146105895780634f6ccce71461059c57806352d1902d146105bc5780636352211e146105d15780636d785f3b146105f157600080fd5b80632f2ff15d146104875780632f745c59146104a757806336568abe146104c75780633659cfe6146104e7578063390c11ae1461050757806342842e0e1461054957600080fd5b806311c0154e1161025057806311c0154e146103a157806318160ddd146103c15780631fbd4041146103e057806321442ec91461040057806323b872dd14610437578063248a9ca31461045757600080fd5b806301ffc9a71461029857806305bdaabb146102cd57806306fdde03146102ef578063081812fc14610329578063095ea7b3146103615780630add9f7f14610381575b600080fd5b3480156102a457600080fd5b506102b86102b3366004613cb5565b61097f565b60405190151581526020015b60405180910390f35b3480156102d957600080fd5b506102ed6102e8366004613d00565b610990565b005b3480156102fb57600080fd5b5060408051808201909152600881526712da5b9d1bc8125160c21b60208201525b6040516102c49190613d83565b34801561033557600080fd5b50610349610344366004613d96565b610aa0565b6040516001600160a01b0390911681526020016102c4565b34801561036d57600080fd5b506102ed61037c366004613daf565b610ac7565b34801561038d57600080fd5b506102b861039c366004613dd9565b610bdc565b3480156103ad57600080fd5b506102ed6103bc366004613d00565b610c13565b3480156103cd57600080fd5b506099545b6040519081526020016102c4565b3480156103ec57600080fd5b506102ed6103fb366004613d00565b610d11565b34801561040c57600080fd5b506103d261041b366004613dd9565b6001600160a01b03166000908152610193602052604090205490565b34801561044357600080fd5b506102ed610452366004613df4565b610e47565b34801561046357600080fd5b506103d2610472366004613d96565b600090815260fb602052604090206001015490565b34801561049357600080fd5b506102ed6104a2366004613e30565b610e78565b3480156104b357600080fd5b506103d26104c2366004613daf565b610e9d565b3480156104d357600080fd5b506102ed6104e2366004613e30565b610f33565b3480156104f357600080fd5b506102ed610502366004613dd9565b610fb1565b34801561051357600080fd5b506102b8610522366004613dd9565b6001600160a01b031660009081526101936020526040902060020154610100900460ff1690565b34801561055557600080fd5b506102ed610564366004613df4565b611090565b34801561057557600080fd5b506102ed610584366004613d96565b6110ab565b6102ed610597366004613ef5565b6110e9565b3480156105a857600080fd5b506103d26105b7366004613d96565b6111b5565b3480156105c857600080fd5b506103d2611248565b3480156105dd57600080fd5b506103496105ec366004613d96565b6112fb565b3480156105fd57600080fd5b506102ed61060c366004613f9e565b61135b565b34801561061d57600080fd5b506102ed61062c366004613f9e565b611382565b34801561063d57600080fd5b506102ed61064c366004614006565b6113a9565b34801561065d57600080fd5b506103d261066c366004613dd9565b611701565b34801561067d57600080fd5b506103d261068c366004613dd9565b6101946020526000908152604090205481565b3480156106ab57600080fd5b506102ed611787565b3480156106c057600080fd5b506102b86106cf366004613d00565b61194a565b3480156106e057600080fd5b506102b86106ef366004613e30565b6119af565b34801561070057600080fd5b5060408051808201909152600781526612d2539513d25160ca1b602082015261031c565b34801561073057600080fd5b506102b861073f366004613dd9565b6119da565b34801561075057600080fd5b506102b861075f366004613dd9565b6001600160a01b031660009081526101936020526040902060020154610100900460ff161590565b34801561079357600080fd5b506103d2600081565b3480156107a857600080fd5b506102ed6107b7366004614081565b6119f7565b3480156107c857600080fd5b506103d26101925481565b3480156107df57600080fd5b506107f36107ee366004613dd9565b611a02565b6040516102c491906140ab565b34801561080c57600080fd5b506102b861081b366004613d00565b611aae565b34801561082c57600080fd5b506102ed61083b3660046140f1565b611af1565b34801561084c57600080fd5b5061031c61085b366004613d96565b611b23565b34801561086c57600080fd5b506102ed61087b366004613e30565b611b89565b34801561088c57600080fd5b506103d260008051602061491683398151915281565b3480156108ae57600080fd5b506102b86108bd366004614158565b6001600160a01b039182166000908152606a6020908152604080832093909416825291909152205460ff1690565b3480156108f757600080fd5b506102b8610906366004614182565b611bae565b34801561091757600080fd5b506102ed610926366004613d00565b611bd9565b34801561093757600080fd5b506102ed6109463660046141a8565b611d11565b34801561095757600080fd5b506103d27f189ab7a9244df0848122154315af71fe140f3db0fe014031783b0946b8c9d2e381565b600061098a82611d82565b92915050565b6000805160206149168339815191526109a881611da7565b60006109b384611701565b116109d95760405162461bcd60e51b81526004016109d0906141dc565b60405180910390fd5b6001600160a01b03831660009081526101936020908152604080832060ff600887901c811685526003820190935292205460019185169190911b16610a9a5760ff600884901c811660009081526003830160205260409020805460019286169290921b909117905542600182018190556101928190556040805161ffff8616815260208101929092526001600160a01b038616917f364b7a2e1762fd5d9cdeda6c0ea8e1be396892c015c5c917f4d164cd4968ac7691015b60405180910390a25b50505050565b6000610aab82611db1565b506000908152606960205260409020546001600160a01b031690565b6000610ad2826112fb565b9050806001600160a01b0316836001600160a01b031603610b3f5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016109d0565b336001600160a01b0382161480610b5b5750610b5b81336108bd565b610bcd5760405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c00000060648201526084016109d0565b610bd78383611e10565b505050565b6000610be86007611bae565b801561098a5750506001600160a01b03166000908152610193602052604090206002015460ff161590565b600080516020614916833981519152610c2b81611da7565b6000610c3684611701565b11610c535760405162461bcd60e51b81526004016109d0906141dc565b6001600160a01b03831660009081526101936020908152604080832060ff600887901c811685526003820190935292205460019185169190911b1615610a9a5760ff600884901c811660009081526003830160205260409020805460019286169290921b19909116905542600182018190556101928190556040805161ffff8616815260208101929092526001600160a01b038616917fdaf71d6bfd7a93506c86e0e5c5725808f99fe27f13af711f321edf92511e609b9101610a91565b600080516020614916833981519152610d2981611da7565b6000610d3484611701565b11610d515760405162461bcd60e51b81526004016109d0906141dc565b6001600160a01b03831660009081526101936020908152604080832060ff600887901c811685526004820190935292205460019185169190911b16610a9a5760ff600884901c811660009081526004830160205260409020805460019286169290921b909117905560028101805460019190600090610dd490849060ff16614229565b92506101000a81548160ff021916908360ff1602179055504281600101819055504261019281905550836001600160a01b03167f87d7acad3a8fb00ded1ae0aeaed871a89b621b17d6cd6ff8fd5c00b63394f94a8442604051610a9192919061ffff929092168252602082015260400190565b610e513382611e7e565b610e6d5760405162461bcd60e51b81526004016109d090614242565b610bd7838383611efd565b600082815260fb6020526040902060010154610e9381611da7565b610bd7838361206e565b6000610ea883611701565b8210610f0a5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b60648201526084016109d0565b506001600160a01b03919091166000908152609760209081526040808320938352929052205490565b6001600160a01b0381163314610fa35760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b60648201526084016109d0565b610fad82826120f4565b5050565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163003610ff95760405162461bcd60e51b81526004016109d09061428f565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031661104260008051602061495c833981519152546001600160a01b031690565b6001600160a01b0316146110685760405162461bcd60e51b81526004016109d0906142db565b6110718161215b565b6040805160008082526020820190925261108d91839190612185565b50565b610bd783838360405180602001604052806000815250611af1565b60405162461bcd60e51b8152602060048201526013602482015272155cd948189d5c9b92d650c81a5b9cdd195859606a1b60448201526064016109d0565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001630036111315760405162461bcd60e51b81526004016109d09061428f565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031661117a60008051602061495c833981519152546001600160a01b031690565b6001600160a01b0316146111a05760405162461bcd60e51b81526004016109d0906142db565b6111a98261215b565b610fad82826001612185565b60006111c060995490565b82106112235760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b60648201526084016109d0565b6099828154811061123657611236614327565b90600052602060002001549050919050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146112e85760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c000000000000000060648201526084016109d0565b5060008051602061495c83398151915290565b6000818152606760205260408120546001600160a01b03168061098a5760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b60448201526064016109d0565b610191805490600061136c8361433d565b9190505550610bd76101915484848460016122f0565b61019180549060006113938361433d565b9190505550610bd76101915484848460006122f0565b6000805160206149168339815191526113c181611da7565b8382146114025760405162461bcd60e51b815260206004820152600f60248201526e098cadccee8d040dad2e6dac2e8c6d608b1b60448201526064016109d0565b60c884111561145f5760405162461bcd60e51b8152602060048201526024808201527f546f6f206d616e79206163636f756e747320746f206d6f6e69746f72206174206044820152636f6e636560e01b60648201526084016109d0565b60005b848110156116b1576000610193600088888581811061148357611483614327565b90506020020160208101906114989190613dd9565b6001600160a01b03166001600160a01b0316815260200190815260200160002090506114e48787848181106114cf576114cf614327565b905060200201602081019061066c9190613dd9565b6000036114f1575061169f565b42600182015560005b85858481811061150c5761150c614327565b905060200281019061151e9190614356565b905081101561169c57600086868581811061153b5761153b614327565b905060200281019061154d9190614356565b8381811061155d5761155d614327565b905060600201803603810190611573919061439e565b80519091508015611585575080602001515b156115c3576115be89898681811061159f5761159f614327565b90506020020160208101906115b49190613dd9565b8260400151610990565b611689565b805180156115d357508060200151155b1561160c576115be8989868181106115ed576115ed614327565b90506020020160208101906116029190613dd9565b8260400151610c13565b805115801561161c575080602001515b15611655576115be89898681811061163657611636614327565b905060200201602081019061164b9190613dd9565b8260400151610d11565b61168989898681811061166a5761166a614327565b905060200201602081019061167f9190613dd9565b8260400151611bd9565b50611695600182614409565b90506114fa565b50505b6116aa600182614409565b9050611462565b504261019281905560405133917f18fb8b1f79749f3894ec6b996ad0503b2dbcf19585865dba3df7683953fc450d916116f291888252602082015260400190565b60405180910390a25050505050565b60006001600160a01b03821661176b5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b60648201526084016109d0565b506001600160a01b031660009081526068602052604090205490565b600054610100900460ff16158080156117a75750600054600160ff909116105b806117c15750303b1580156117c1575060005460ff166001145b6118245760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016109d0565b6000805460ff191660011790558015611847576000805461ff0019166101001790555b6118906040518060400160405280600881526020016712da5b9d1bc8125160c21b8152506040518060400160405280600781526020016612d2539513d25160ca1b815250612697565b6118986126c8565b6118a06126c8565b6118a86126c8565b6118b06126c8565b6118bb60003361206e565b6118d36000805160206149168339815191523361206e565b6118fd7f189ab7a9244df0848122154315af71fe140f3db0fe014031783b0946b8c9d2e33361206e565b4261019255801561108d576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150565b60006119566007611bae565b80156119a857506001600160a01b0383166000908152610193602052604090206119a69060040161ffff8416600881901c600090815260208390526040902054600160ff83161b16151592915050565b155b9392505050565b600091825260fb602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6000806119e683611701565b11801561098a575061098a82610bdc565b610fad3383836126f1565b6001600160a01b038116600090815261019360205260408082208151610100808252612020820190935260609360039092019281602001602082028036833701905050905060005b610100811015611aa657600881901c600090815260208490526040902054600160ff83161b161515828281518110611a8457611a84614327565b9115156020928302919091019091015280611a9e8161433d565b915050611a4a565b509392505050565b6001600160a01b03821660009081526101936020908152604080832060ff600886901c81168552600390910190925282205460019184169190911b1615156119a8565b611afb3383611e7e565b611b175760405162461bcd60e51b81526004016109d090614242565b610a9a848484846127bf565b6060611b2e82611db1565b6000611b386127f2565b90506000815111611b5857604051806020016040528060008152506119a8565b80611b6284612812565b604051602001611b7392919061441c565b6040516020818303038152906040529392505050565b600082815260fb6020526040902060010154611ba481611da7565b610bd783836120f4565b6000611bbd826201518061444b565b63ffffffff166101925442611bd29190614473565b1092915050565b600080516020614916833981519152611bf181611da7565b6000611bfc84611701565b11611c195760405162461bcd60e51b81526004016109d0906141dc565b6001600160a01b03831660009081526101936020908152604080832060ff600887901c811685526004820190935292205460019185169190911b1615610a9a5760ff600884901c811660009081526004830160205260409020805460019286169290921b19909116905560028101805460019190600090611c9e90849060ff16614486565b92506101000a81548160ff021916908360ff1602179055504281600101819055504261019281905550836001600160a01b03167fe307a82882b02537e8254556f85aa0ae942a060782f1f076028687f1fd7dba188442604051610a9192919061ffff929092168252602082015260400190565b6000611d2361066c6020840184613dd9565b11611d625760405162461bcd60e51b815260206004820152600f60248201526e2737ba3434b733903a3790313ab93760891b60448201526064016109d0565b61108d611d7c611d756020840184613dd9565b6000610e9d565b826128a4565b60006001600160e01b03198216637965db0b60e01b148061098a575061098a82612b64565b61108d8133612b89565b6000818152606760205260409020546001600160a01b031661108d5760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b60448201526064016109d0565b600081815260696020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611e45826112fb565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080611e8a836112fb565b9050806001600160a01b0316846001600160a01b03161480611ed157506001600160a01b038082166000908152606a602090815260408083209388168352929052205460ff165b80611ef55750836001600160a01b0316611eea84610aa0565b6001600160a01b0316145b949350505050565b826001600160a01b0316611f10826112fb565b6001600160a01b031614611f365760405162461bcd60e51b81526004016109d09061449f565b6001600160a01b038216611f985760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016109d0565b611fa58383836001612be2565b826001600160a01b0316611fb8826112fb565b6001600160a01b031614611fde5760405162461bcd60e51b81526004016109d09061449f565b600081815260696020908152604080832080546001600160a01b03199081169091556001600160a01b0387811680865260688552838620805460001901905590871680865283862080546001019055868652606790945282852080549092168417909155905184937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b61207882826119af565b610fad57600082815260fb602090815260408083206001600160a01b03851684529091529020805460ff191660011790556120b03390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6120fe82826119af565b15610fad57600082815260fb602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b7f189ab7a9244df0848122154315af71fe140f3db0fe014031783b0946b8c9d2e3610fad81611da7565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff16156121b857610bd783612c8e565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015612212575060408051601f3d908101601f1916820190925261220f918101906144e4565b60015b6122755760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b60648201526084016109d0565b60008051602061495c83398151915281146122e45760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b60648201526084016109d0565b50610bd7838383612d2a565b838060400135421061233c5760405162461bcd60e51b815260206004820152601560248201527414da59db985d1d5c99481a185cc8195e1c1a5c9959605a1b60448201526064016109d0565b60208101803590610194906000906123549085613dd9565b6001600160a01b03166001600160a01b0316815260200190815260200160002054146123b25760405162461bcd60e51b815260206004820152600d60248201526c496e76616c6964204e6f6e636560981b60448201526064016109d0565b6123ca600080516020614916833981519152336119af565b6124095760405162461bcd60e51b815260206004820152601060248201526f24b73b30b634b210283937bb34b232b960811b60448201526064016109d0565b6000806124196020840184613dd9565b803b9250905081156124655760405162461bcd60e51b81526020600482015260156024820152745369676e6572206d75737420626520616e20454f4160581b60448201526064016109d0565b6000612478612473856144fd565b612d4f565b90506124dd8161248b6060870187614582565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506124cd925050506020880188613dd9565b6001600160a01b03169190612edb565b61251a5760405162461bcd60e51b815260206004820152600e60248201526d24b73b30b634b21029b4b3b732b960911b60448201526064016109d0565b61252a61066c60208a018a613dd9565b156125775760405162461bcd60e51b815260206004820152601d60248201527f42616c616e6365206265666f7265206d696e74206d757374206265203000000060448201526064016109d0565b60006101938161258a60208c018c613dd9565b6001600160a01b031681526020810191909152604001600090812042808255600182015560028101805461ff0019166101008a15150217905591505b87811015612635576126238989838181106125e3576125e3614327565b90506020020160208101906125f891906145c8565b600881901c60ff9081166000908152600386016020526040902080546001939092169290921b179055565b8061262d8161433d565b9150506125c6565b50610194600061264860208c018c613dd9565b6001600160a01b031681526020810191909152604001600090812080549161266f8361433d565b9091555061268b905061268560208b018b613dd9565b8b612f3c565b50505050505050505050565b600054610100900460ff166126be5760405162461bcd60e51b81526004016109d0906145e3565b610fad8282612f56565b600054610100900460ff166126ef5760405162461bcd60e51b81526004016109d0906145e3565b565b816001600160a01b0316836001600160a01b0316036127525760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016109d0565b6001600160a01b038381166000818152606a6020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6127ca848484611efd565b6127d684848484612f96565b610a9a5760405162461bcd60e51b81526004016109d09061462e565b606060405180606001604052806026815260200161493660269139905090565b6060600061281f83613097565b60010190506000816001600160401b0381111561283e5761283e613e53565b6040519080825280601f01601f191660200182016040528015612868576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a850494508461287257509392505050565b80806040013542106128f05760405162461bcd60e51b815260206004820152601560248201527414da59db985d1d5c99481a185cc8195e1c1a5c9959605a1b60448201526064016109d0565b60208101803590610194906000906129089085613dd9565b6001600160a01b03166001600160a01b0316815260200190815260200160002054146129665760405162461bcd60e51b815260206004820152600d60248201526c496e76616c6964204e6f6e636560981b60448201526064016109d0565b61297e600080516020614916833981519152336119af565b6129bd5760405162461bcd60e51b815260206004820152601060248201526f24b73b30b634b210283937bb34b232b960811b60448201526064016109d0565b6000806129cd6020840184613dd9565b803b925090508115612a195760405162461bcd60e51b81526020600482015260156024820152745369676e6572206d75737420626520616e20454f4160581b60448201526064016109d0565b6000612a27612473856144fd565b9050612a3a8161248b6060870187614582565b612a775760405162461bcd60e51b815260206004820152600e60248201526d24b73b30b634b21029b4b3b732b960911b60448201526064016109d0565b60016101946000612a8b6020890189613dd9565b6001600160a01b03166001600160a01b031681526020019081526020016000206000828254612aba9190614409565b90915550612ac990508661316f565b612ad961066c6020870187613dd9565b15612b265760405162461bcd60e51b815260206004820152601c60248201527f42616c616e6365206166746572206275726e206d75737420626520300000000060448201526064016109d0565b600061019381612b396020890189613dd9565b6001600160a01b03168152602081019190915260400160009081208181556001015550505050505050565b60006001600160e01b0319821663780e9d6360e01b148061098a575061098a82613212565b612b9382826119af565b610fad57612ba081613262565b612bab836020613274565b604051602001612bbc929190614680565b60408051601f198184030181529082905262461bcd60e51b82526109d091600401613d83565b6001600160a01b038416158015612c0157506001600160a01b03831615155b80612c2657506001600160a01b03841615801590612c2657506001600160a01b038316155b612c825760405162461bcd60e51b815260206004820152602760248201527f4f6e6c79206d696e74206f72206275726e207472616e73666572732061726520604482015266185b1b1bddd95960ca1b60648201526084016109d0565b610a9a8484848461340f565b6001600160a01b0381163b612cfb5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b60648201526084016109d0565b60008051602061495c83398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b612d338361354f565b600082511180612d405750805b15610bd757610a9a838361358f565b600080612e23604080518082018252600781526612da5b9d1bd25160ca1b6020918201528151808301835260018152603160f81b9082015281517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818301527ff2acf2bff9f153ce27ec66ef28c5d61aaa06a6eac70c4c0de4bac7cb3bec0c54818401527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a0808301919091528351808303909101815260c0909101909252815191012090565b90506000612e9a84805160208083015160409384015184517fce753e2ed199e3bc0c561ccacfe9f2ebd720bf99f6d0e6854d8ec36486eb18c7818501526001600160a01b039094168486015260608401919091526080808401919091528351808403909101815260a0909201909252805191012090565b60405161190160f01b602082015260228101849052604281018290529091506062016040516020818303038152906040528051906020012092505050919050565b6000806000612eea8585613683565b90925090506000816004811115612f0357612f036146f5565b148015612f215750856001600160a01b0316826001600160a01b0316145b80612f325750612f328686866136c8565b9695505050505050565b610fad8282604051806020016040528060008152506137b4565b600054610100900460ff16612f7d5760405162461bcd60e51b81526004016109d0906145e3565b6065612f89838261478d565b506066610bd7828261478d565b60006001600160a01b0384163b1561308c57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612fda90339089908890889060040161484c565b6020604051808303816000875af1925050508015613015575060408051601f3d908101601f191682019092526130129181019061487f565b60015b613072573d808015613043576040519150601f19603f3d011682016040523d82523d6000602084013e613048565b606091505b50805160000361306a5760405162461bcd60e51b81526004016109d09061462e565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611ef5565b506001949350505050565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b83106130d65772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef81000000008310613102576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc10000831061312057662386f26fc10000830492506010015b6305f5e1008310613138576305f5e100830492506008015b612710831061314c57612710830492506004015b6064831061315e576064830492506002015b600a831061098a5760010192915050565b600061317a826112fb565b905061318a816000846001612be2565b613193826112fb565b600083815260696020908152604080832080546001600160a01b03199081169091556001600160a01b0385168085526068845282852080546000190190558785526067909352818420805490911690555192935084927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b60006001600160e01b031982166380ac58cd60e01b148061324357506001600160e01b03198216635b5e139f60e01b145b8061098a57506301ffc9a760e01b6001600160e01b031983161461098a565b606061098a6001600160a01b03831660145b6060600061328383600261489c565b61328e906002614409565b6001600160401b038111156132a5576132a5613e53565b6040519080825280601f01601f1916602001820160405280156132cf576020820181803683370190505b509050600360fc1b816000815181106132ea576132ea614327565b60200101906001600160f81b031916908160001a905350600f60fb1b8160018151811061331957613319614327565b60200101906001600160f81b031916908160001a905350600061333d84600261489c565b613348906001614409565b90505b60018111156133c0576f181899199a1a9b1b9c1cb0b131b232b360811b85600f166010811061337c5761337c614327565b1a60f81b82828151811061339257613392614327565b60200101906001600160f81b031916908160001a90535060049490941c936133b9816148b3565b905061334b565b5083156119a85760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016109d0565b61341b848484846137e7565b600181111561348a5760405162461bcd60e51b815260206004820152603560248201527f455243373231456e756d657261626c653a20636f6e7365637574697665207472604482015274185b9cd9995c9cc81b9bdd081cdd5c1c1bdc9d1959605a1b60648201526084016109d0565b816001600160a01b0385166134e6576134e181609980546000838152609a60205260408120829055600182018355919091527f72a152ddfb8e864297c917af52ea6c1c68aead0fee1a62673fcc7e0c94979d000155565b613509565b836001600160a01b0316856001600160a01b03161461350957613509858261386f565b6001600160a01b038416613525576135208161390c565b613548565b846001600160a01b0316846001600160a01b0316146135485761354884826139bb565b5050505050565b61355881612c8e565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606001600160a01b0383163b6135f75760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b60648201526084016109d0565b600080846001600160a01b03168460405161361291906148ca565b600060405180830381855af49150503d806000811461364d576040519150601f19603f3d011682016040523d82523d6000602084013e613652565b606091505b509150915061367a828260405180606001604052806027815260200161497c602791396139ff565b95945050505050565b60008082516041036136b95760208301516040840151606085015160001a6136ad87828585613a18565b945094505050506136c1565b506000905060025b9250929050565b6000806000856001600160a01b0316631626ba7e60e01b86866040516024016136f29291906148e6565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b031990941693909317909252905161373091906148ca565b600060405180830381855afa9150503d806000811461376b576040519150601f19603f3d011682016040523d82523d6000602084013e613770565b606091505b509150915081801561378457506020815110155b8015612f3257508051630b135d3f60e11b906137a990830160209081019084016144e4565b149695505050505050565b6137be8383613adc565b6137cb6000848484612f96565b610bd75760405162461bcd60e51b81526004016109d09061462e565b6001811115610a9a576001600160a01b0384161561382d576001600160a01b03841660009081526068602052604081208054839290613827908490614473565b90915550505b6001600160a01b03831615610a9a576001600160a01b03831660009081526068602052604081208054839290613864908490614409565b909155505050505050565b6000600161387c84611701565b6138869190614473565b6000838152609860205260409020549091508082146138d9576001600160a01b03841660009081526097602090815260408083208584528252808320548484528184208190558352609890915290208190555b5060009182526098602090815260408084208490556001600160a01b039094168352609781528383209183525290812055565b60995460009061391e90600190614473565b6000838152609a60205260408120546099805493945090928490811061394657613946614327565b90600052602060002001549050806099838154811061396757613967614327565b6000918252602080832090910192909255828152609a9091526040808220849055858252812055609980548061399f5761399f6148ff565b6001900381819060005260206000200160009055905550505050565b60006139c683611701565b6001600160a01b039093166000908152609760209081526040808320868452825280832085905593825260989052919091209190915550565b60608315613a0e5750816119a8565b6119a88383613c75565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115613a4f5750600090506003613ad3565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015613aa3573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116613acc57600060019250925050613ad3565b9150600090505b94509492505050565b6001600160a01b038216613b325760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016109d0565b6000818152606760205260409020546001600160a01b031615613b975760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016109d0565b613ba5600083836001612be2565b6000818152606760205260409020546001600160a01b031615613c0a5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016109d0565b6001600160a01b038216600081815260686020908152604080832080546001019055848352606790915280822080546001600160a01b0319168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b815115613c855781518083602001fd5b8060405162461bcd60e51b81526004016109d09190613d83565b6001600160e01b03198116811461108d57600080fd5b600060208284031215613cc757600080fd5b81356119a881613c9f565b80356001600160a01b0381168114613ce957600080fd5b919050565b803561ffff81168114613ce957600080fd5b60008060408385031215613d1357600080fd5b613d1c83613cd2565b9150613d2a60208401613cee565b90509250929050565b60005b83811015613d4e578181015183820152602001613d36565b50506000910152565b60008151808452613d6f816020860160208601613d33565b601f01601f19169290920160200192915050565b6020815260006119a86020830184613d57565b600060208284031215613da857600080fd5b5035919050565b60008060408385031215613dc257600080fd5b613dcb83613cd2565b946020939093013593505050565b600060208284031215613deb57600080fd5b6119a882613cd2565b600080600060608486031215613e0957600080fd5b613e1284613cd2565b9250613e2060208501613cd2565b9150604084013590509250925092565b60008060408385031215613e4357600080fd5b82359150613d2a60208401613cd2565b634e487b7160e01b600052604160045260246000fd5b600082601f830112613e7a57600080fd5b81356001600160401b0380821115613e9457613e94613e53565b604051601f8301601f19908116603f01168101908282118183101715613ebc57613ebc613e53565b81604052838152866020858801011115613ed557600080fd5b836020870160208301376000602085830101528094505050505092915050565b60008060408385031215613f0857600080fd5b613f1183613cd2565b915060208301356001600160401b03811115613f2c57600080fd5b613f3885828601613e69565b9150509250929050565b600060808284031215613f5457600080fd5b50919050565b60008083601f840112613f6c57600080fd5b5081356001600160401b03811115613f8357600080fd5b6020830191508360208260051b85010111156136c157600080fd5b600080600060408486031215613fb357600080fd5b83356001600160401b0380821115613fca57600080fd5b613fd687838801613f42565b94506020860135915080821115613fec57600080fd5b50613ff986828701613f5a565b9497909650939450505050565b6000806000806040858703121561401c57600080fd5b84356001600160401b038082111561403357600080fd5b61403f88838901613f5a565b9096509450602087013591508082111561405857600080fd5b5061406587828801613f5a565b95989497509550505050565b80358015158114613ce957600080fd5b6000806040838503121561409457600080fd5b61409d83613cd2565b9150613d2a60208401614071565b6020808252825182820181905260009190848201906040850190845b818110156140e55783511515835292840192918401916001016140c7565b50909695505050505050565b6000806000806080858703121561410757600080fd5b61411085613cd2565b935061411e60208601613cd2565b92506040850135915060608501356001600160401b0381111561414057600080fd5b61414c87828801613e69565b91505092959194509250565b6000806040838503121561416b57600080fd5b61417483613cd2565b9150613d2a60208401613cd2565b60006020828403121561419457600080fd5b813563ffffffff811681146119a857600080fd5b6000602082840312156141ba57600080fd5b81356001600160401b038111156141d057600080fd5b611ef584828501613f42565b6020808252601d908201527f4163636f756e74206d75737420686176652061204b594320746f6b656e000000604082015260600190565b634e487b7160e01b600052601160045260246000fd5b60ff818116838216019081111561098a5761098a614213565b6020808252602d908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526c1c881bdc88185c1c1c9bdd9959609a1b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b6163746976652070726f787960a01b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b60006001820161434f5761434f614213565b5060010190565b6000808335601e1984360301811261436d57600080fd5b8301803591506001600160401b0382111561438757600080fd5b60200191506060810236038213156136c157600080fd5b6000606082840312156143b057600080fd5b604051606081018181106001600160401b03821117156143d2576143d2613e53565b6040526143de83614071565b81526143ec60208401614071565b60208201526143fd60408401613cee565b60408201529392505050565b8082018082111561098a5761098a614213565b6000835161442e818460208801613d33565b835190830190614442818360208801613d33565b01949350505050565b63ffffffff81811683821602808216919082811461446b5761446b614213565b505092915050565b8181038181111561098a5761098a614213565b60ff828116828216039081111561098a5761098a614213565b60208082526025908201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060408201526437bbb732b960d91b606082015260800190565b6000602082840312156144f657600080fd5b5051919050565b60006080823603121561450f57600080fd5b604051608081016001600160401b03828210818311171561453257614532613e53565b8160405261453f85613cd2565b83526020850135602084015260408501356040840152606085013591508082111561456957600080fd5b5061457636828601613e69565b60608301525092915050565b6000808335601e1984360301811261459957600080fd5b8301803591506001600160401b038211156145b357600080fd5b6020019150368190038213156136c157600080fd5b6000602082840312156145da57600080fd5b6119a882613cee565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b7f416363657373436f6e74726f6c3a206163636f756e74200000000000000000008152600083516146b8816017850160208801613d33565b7001034b99036b4b9b9b4b733903937b6329607d1b60179184019182015283516146e9816028840160208801613d33565b01602801949350505050565b634e487b7160e01b600052602160045260246000fd5b600181811c9082168061471f57607f821691505b602082108103613f5457634e487b7160e01b600052602260045260246000fd5b601f821115610bd757600081815260208120601f850160051c810160208610156147665750805b601f850160051c820191505b8181101561478557828155600101614772565b505050505050565b81516001600160401b038111156147a6576147a6613e53565b6147ba816147b4845461470b565b8461473f565b602080601f8311600181146147ef57600084156147d75750858301515b600019600386901b1c1916600185901b178555614785565b600085815260208120601f198616915b8281101561481e578886015182559484019460019091019084016147ff565b508582101561483c5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612f3290830184613d57565b60006020828403121561489157600080fd5b81516119a881613c9f565b808202811582820484141761098a5761098a614213565b6000816148c2576148c2614213565b506000190190565b600082516148dc818460208701613d33565b9190910192915050565b828152604060208201526000611ef56040830184613d57565b634e487b7160e01b600052603160045260246000fdfe6c4079fcac94e7142d8c209744c998efe53a188aadb7e55958f7ad3ea8a1d65268747470733a2f2f6b696e746f2e78797a2f6170692f76312f6e66742d6b696e746f2d69642f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220ea527462f9a55acdb96e43e2c0af177ef3023b34dd3a19f6add47f098f6ecb0364736f6c63430008120033000000000000000000", + "nonce": "0x10" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x02e7d7327761fac3fe83beefd23ecae331aade5d0d303861056cdf9f2dab8eb7", + "transactionType": "CALL", + "contractName": null, + "contractAddress": null, + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0xc1f4d15c16a1f3555e0a5f7aefd1e17ad4aaf40b", + "to": "0x8a4720488ca32f1223ccfe5a087e250fe3bc5d75", + "value": "0x0", + "data": "0x3659cfe6000000000000000000000000652c9b99f916beb42ccb7883a725e2f9219095b4", + "nonce": "0x3c" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x6bc0ebf4dca10e8817f37d144980b6908597ed327a05707ceda82f1398692959", + "transactionType": "CALL", + "contractName": null, + "contractAddress": null, + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0xc1f4d15c16a1f3555e0a5f7aefd1e17ad4aaf40b", + "to": "0xf369f78e3a0492cc4e96a90dae0728a38498e9c7", + "value": "0x0", + "data": "0x3659cfe60000000000000000000000002aa456d97fb8f75283327458920d4daa2bfe363e", + "nonce": "0x3d" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0x1aef06ade0c6712c96d108dc0f0d72053c1948a306e597624a3ca346b0a0e4a9", + "transactionIndex": "0x1", + "blockHash": "0xd478b838cff6e2863f74dc2be3b1c73f4d365164d1f135f650ab6d639dd2a12f", + "blockNumber": "0xa0", + "from": "0x660ad4B5A74130a4796B4d54BC6750Ae93C86e6c", + "to": "0x8a4720488CA32f1223ccFE5A087e250fE3BC5D75", + "cumulativeGasUsed": "0x35c1852", + "gasUsed": "0x35c1852", + "contractAddress": null, + "logs": [ + { + "address": "0x652c9b99f916beb42ccb7883a725E2f9219095B4", + "topics": [ + "0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000ff", + "blockHash": "0xd478b838cff6e2863f74dc2be3b1c73f4d365164d1f135f650ab6d639dd2a12f", + "blockNumber": "0xa0", + "transactionHash": "0x1aef06ade0c6712c96d108dc0f0d72053c1948a306e597624a3ca346b0a0e4a9", + "transactionIndex": "0x1", + "logIndex": "0x0", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000400000000000000000000000000000400000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x0", + "effectiveGasPrice": "0x5f5e100" + }, + { + "transactionHash": "0xe776c20bd6ff45148cf4e430bfc0065ce64768dd86280875bcce04f5a02566ab", + "transactionIndex": "0x1", + "blockHash": "0x08ec53e48af25b20b67beaa3c52beb00f509554023a8558444781b17c6e395f6", + "blockNumber": "0xa1", + "from": "0x660ad4B5A74130a4796B4d54BC6750Ae93C86e6c", + "to": "0x8a4720488CA32f1223ccFE5A087e250fE3BC5D75", + "cumulativeGasUsed": "0x518e3c1", + "gasUsed": "0x518e3c1", + "contractAddress": null, + "logs": [ + { + "address": "0x2AA456d97fB8f75283327458920D4daA2BFe363e", + "topics": [ + "0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000ff", + "blockHash": "0x08ec53e48af25b20b67beaa3c52beb00f509554023a8558444781b17c6e395f6", + "blockNumber": "0xa1", + "transactionHash": "0xe776c20bd6ff45148cf4e430bfc0065ce64768dd86280875bcce04f5a02566ab", + "transactionIndex": "0x1", + "logIndex": "0x0", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000004000000080000000000000000000000000400000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x0", + "effectiveGasPrice": "0x5f5e100" + }, + { + "transactionHash": "0x02e7d7327761fac3fe83beefd23ecae331aade5d0d303861056cdf9f2dab8eb7", + "transactionIndex": "0x1", + "blockHash": "0xdb66b20db333c97a3135e842354d7e9df20f5692690f818e5c68b0b86179d85b", + "blockNumber": "0xa2", + "from": "0xc1f4D15C16A1f3555E0a5F7AeFD1e17AD4aaf40B", + "to": "0x8a4720488CA32f1223ccFE5A087e250fE3BC5D75", + "cumulativeGasUsed": "0x115bfb", + "gasUsed": "0x115bfb", + "contractAddress": null, + "logs": [ + { + "address": "0x8a4720488CA32f1223ccFE5A087e250fE3BC5D75", + "topics": [ + "0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b", + "0x000000000000000000000000652c9b99f916beb42ccb7883a725e2f9219095b4" + ], + "data": "0x", + "blockHash": "0xdb66b20db333c97a3135e842354d7e9df20f5692690f818e5c68b0b86179d85b", + "blockNumber": "0xa2", + "transactionHash": "0x02e7d7327761fac3fe83beefd23ecae331aade5d0d303861056cdf9f2dab8eb7", + "transactionIndex": "0x1", + "logIndex": "0x0", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000100000000008000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000008000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000004000000000000000000000020000000000000000000000000000000000000000000000000", + "type": "0x0", + "effectiveGasPrice": "0x5f5e100" + }, + { + "transactionHash": "0x6bc0ebf4dca10e8817f37d144980b6908597ed327a05707ceda82f1398692959", + "transactionIndex": "0x1", + "blockHash": "0xe6a61403f3553a63620372bbec54a7098cc988b9e1f1be3c9c64e1122d881dcf", + "blockNumber": "0xa3", + "from": "0xc1f4D15C16A1f3555E0a5F7AeFD1e17AD4aaf40B", + "to": "0xf369f78E3A0492CC4e96a90dae0728A38498e9c7", + "cumulativeGasUsed": "0x115d20", + "gasUsed": "0x115d20", + "contractAddress": null, + "logs": [ + { + "address": "0xf369f78E3A0492CC4e96a90dae0728A38498e9c7", + "topics": [ + "0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b", + "0x0000000000000000000000002aa456d97fb8f75283327458920d4daa2bfe363e" + ], + "data": "0x", + "blockHash": "0xe6a61403f3553a63620372bbec54a7098cc988b9e1f1be3c9c64e1122d881dcf", + "blockNumber": "0xa3", + "transactionHash": "0x6bc0ebf4dca10e8817f37d144980b6908597ed327a05707ceda82f1398692959", + "transactionIndex": "0x1", + "logIndex": "0x0", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000004400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000002000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000020000000000000000000000000000400000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x0", + "effectiveGasPrice": "0x5f5e100" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1705336600, + "chain": 7887, + "multi": false, + "commit": "1101a79" +} \ No newline at end of file diff --git a/broadcast/14-factory_v3.sol/7887/run-latest.json b/broadcast/14-factory_v3.sol/7887/run-latest.json new file mode 100644 index 000000000..35df2489b --- /dev/null +++ b/broadcast/14-factory_v3.sol/7887/run-latest.json @@ -0,0 +1,207 @@ +{ + "transactions": [ + { + "hash": "0x1aef06ade0c6712c96d108dc0f0d72053c1948a306e597624a3ca346b0a0e4a9", + "transactionType": "CALL", + "contractName": null, + "contractAddress": null, + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0x660ad4b5a74130a4796b4d54bc6750ae93c86e6c", + "to": "0x8a4720488ca32f1223ccfe5a087e250fe3bc5d75", + "value": "0x0", + "data": "0x66d6e19b000000000000000000000000c1f4d15c16a1f3555e0a5f7aefd1e17ad4aaf40b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000376a60c0604052306080523480156200001557600080fd5b506040516200374a3803806200374a833981016040819052620000389162000117565b806200004362000056565b6001600160a01b031660a0525062000149565b600054610100900460ff1615620000c35760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff9081161462000115576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6000602082840312156200012a57600080fd5b81516001600160a01b03811681146200014257600080fd5b9392505050565b60805160a0516135bf6200018b6000396000610f9001526000818161090301528181610946015281816109ee01528181610a310152610acd01526135bf6000f3fe6080604052600436106200015b5760003560e01c8063778c271d11620000c5578063daba3eac1162000078578063daba3eac14620003b4578063ea372fce14620003d9578063ed97bab31462000413578063f2fde38b146200042a578063f4f4b03a146200044f578063f662e6e2146200047457600080fd5b8063778c271d14620002f85780638da5cb5b146200031d578063977d2c45146200033d57806399a6cddd1462000355578063bae7b5d31462000377578063c4d66de8146200038f57600080fd5b80634f1ef286116200011e5780634f1ef286146200025357806352d1902d146200026a57806359659e9014620002825780635fd6656f14620002a457806366d6e19b14620002c9578063715018a614620002e057600080fd5b806308a6354e1462000160578063097e9dd414620001a25780631230aea214620001c95780632098fe4814620001ee5780633659cfe6146200022e575b600080fd5b3480156200016d57600080fd5b50620001856200017f3660046200202a565b62000499565b6040516001600160a01b0390911681526020015b60405180910390f35b348015620001af57600080fd5b50620001c7620001c136600462002070565b6200056b565b005b348015620001d657600080fd5b5062000185620001e83660046200202a565b620006ad565b348015620001fb57600080fd5b506200021f6200020d366004620020ff565b60cb6020526000908152604090205481565b60405190815260200162000199565b3480156200023b57600080fd5b50620001c76200024d366004620020ff565b620008f9565b620001c76200026436600462002135565b620009e4565b3480156200027757600080fd5b506200021f62000ac0565b3480156200028f57600080fd5b5060c95462000185906001600160a01b031681565b348015620002b157600080fd5b50620001c7620002c336600462002205565b62000b76565b62000185620002da36600462002261565b62000ddc565b348015620002ed57600080fd5b50620001c762000e84565b3480156200030557600080fd5b506200018562000317366004620022f9565b62000e9c565b3480156200032a57600080fd5b506097546001600160a01b031662000185565b3480156200034a57600080fd5b506200021f60cd5481565b3480156200036257600080fd5b5060ca5462000185906001600160a01b031681565b3480156200038457600080fd5b506200021f60cc5481565b3480156200039c57600080fd5b50620001c7620003ae366004620020ff565b62000eb4565b348015620003c157600080fd5b50620001c7620003d33660046200231c565b62001069565b348015620003e657600080fd5b506200021f620003f8366004620020ff565b6001600160a01b0316600090815260cb602052604090205490565b620001c762000424366004620020ff565b62001168565b3480156200043757600080fd5b50620001c762000449366004620020ff565b62001374565b3480156200045c57600080fd5b50620001c76200046e366004620020ff565b620013f0565b3480156200048157600080fd5b50620001c762000493366004620020ff565b62001600565b6000620005618260001b60405180602001620004b59062001ff8565b601f1982820381018352601f90910116604081905260c9546001600160a01b0389811660248401528881166044840152169060640160408051601f19818403018152918152602080830180516001600160e01b031663485cc95560e01b17905290516200052593929101620023a3565b60408051601f1981840301815290829052620005459291602001620023c9565b6040516020818303038152906040528051906020012062000e9c565b90505b9392505050565b6001600160a01b038316600090815260cb6020526040902054620005ac5760405162461bcd60e51b8152600401620005a390620023fc565b60405180910390fd5b826001600160a01b031663b808dce86040518163ffffffff1660e01b8152600401602060405180830381865afa158015620005eb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000611919062002424565b6001600160a01b0316336001600160a01b031614620006445760405162461bcd60e51b8152600401620005a39062002444565b60405163182e75b360e01b81526001600160a01b0384169063182e75b3906200067490859085906004016200246c565b600060405180830381600087803b1580156200068f57600080fd5b505af1158015620006a4573d6000803e3d6000fd5b50505050505050565b60006001600160a01b03841615801590620006d057506001600160a01b03831615155b620007125760405162461bcd60e51b8152602060048201526011602482015270696e76616c69642061646472657373657360781b6044820152606401620005a3565b60ca546040516313289ea360e31b81526001600160a01b03868116600483015290911690639944f51890602401602060405180830381865afa1580156200075d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620007839190620024b3565b80156200079857506001600160a01b03841633145b620007b75760405162461bcd60e51b8152600401620005a390620024d7565b6000620007c685858562000499565b90506001600160a01b0381163b8015620007e35750905062000564565b60c9546040516001600160a01b03888116602483015287811660448301528692169060640160408051601f198184030181529181526020820180516001600160e01b031663485cc95560e01b179052516200083e9062001ff8565b6200084b929190620023a3565b8190604051809103906000f59050801580156200086c573d6000803e3d6000fd5b506001600160a01b038116600090815260cb6020526040812042905560cd8054929550906200089b8362002513565b9190505550856001600160a01b0316836001600160a01b03167fa097b826e61d0ee46c6b3b1596580ed60bd21801826a88e23c919724e6f8f21360cc54604051620008e891815260200190565b60405180910390a350509392505050565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163003620009445760405162461bcd60e51b8152600401620005a3906200252f565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166200098f60008051602062003543833981519152546001600160a01b031690565b6001600160a01b031614620009b85760405162461bcd60e51b8152600401620005a3906200257b565b620009c3816200170c565b60408051600080825260208201909252620009e19183919062001716565b50565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016300362000a2f5760405162461bcd60e51b8152600401620005a3906200252f565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031662000a7a60008051602062003543833981519152546001600160a01b031690565b6001600160a01b03161462000aa35760405162461bcd60e51b8152600401620005a3906200257b565b62000aae826200170c565b62000abc8282600162001716565b5050565b6000306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161462000b625760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c00000000000000006064820152608401620005a3565b506000805160206200354383398151915290565b60ca546040516313289ea360e31b81523360048201526001600160a01b0390911690639944f51890602401602060405180830381865afa15801562000bbf573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000be59190620024b3565b62000c045760405162461bcd60e51b8152600401620005a390620024d7565b60ca546040805163d9e1063d60e01b815290516001600160a01b03909216916391d1485491839163d9e1063d916004808201926020929091908290030181865afa15801562000c57573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000c7d9190620025c7565b6040516001600160e01b031960e084901b1681526004810191909152336024820152604401602060405180830381865afa15801562000cc0573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000ce69190620024b3565b62000d255760405162461bcd60e51b815260206004820152600e60248201526d24b73b30b634b21039b2b73232b960911b6044820152606401620005a3565b6001600160a01b03821662000d765760405162461bcd60e51b8152602060048201526016602482015275496e76616c696420666175636574206164647265737360501b6044820152606401620005a3565b60405163064a7ecf60e31b81526001600160a01b03831690633253f6789062000da49084906004016200260a565b600060405180830381600087803b15801562000dbf57600080fd5b505af115801562000dd4573d6000803e3d6000fd5b505050505050565b60ca546040516313289ea360e31b81523360048201526000916001600160a01b031690639944f51890602401602060405180830381865afa15801562000e26573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000e4c9190620024b3565b62000e6b5760405162461bcd60e51b8152600401620005a390620024d7565b62000e7a868686868662001893565b9695505050505050565b62000e8e62001a08565b62000e9a600062001a64565b565b600062000eab83833062001ab6565b90505b92915050565b600054610100900460ff161580801562000ed55750600054600160ff909116105b8062000ef15750303b15801562000ef1575060005460ff166001145b62000f565760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401620005a3565b6000805460ff19166001179055801562000f7a576000805461ff0019166101001790555b62000f8462001ae0565b62000f8e62001b14565b7f000000000000000000000000000000000000000000000000000000000000000060405162000fbd9062002006565b6001600160a01b039091168152602001604051809103906000f08015801562000fea573d6000803e3d6000fd5b5060c980546001600160a01b03199081166001600160a01b0393841617909155600160cc5560ca8054909116918416919091179055801562000abc576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050565b6001600160a01b038216600090815260cb6020526040902054620010a15760405162461bcd60e51b8152600401620005a390620023fc565b816001600160a01b031663b808dce86040518163ffffffff1660e01b8152600401602060405180830381865afa158015620010e0573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001106919062002424565b6001600160a01b0316336001600160a01b031614620011395760405162461bcd60e51b8152600401620005a39062002444565b60405163bd53457b60e01b81526001600160a01b03828116600483015283169063bd53457b9060240162000da4565b6000341180156200119057506001600160a01b038116600090815260cb602052604090205415155b80156200127d575060ca5460405163025e7c2760e01b8152600060048201526001600160a01b0391821691639944f518919084169063025e7c2790602401602060405180830381865afa158015620011ec573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001212919062002424565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa15801562001257573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200127d9190620024b3565b8015620012f05750604051631c7a34ef60e31b81523360048201526001600160a01b0382169063e3d1a77890602401602060405180830381865afa158015620012ca573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620012f09190620024b3565b6200133e5760405162461bcd60e51b815260206004820152601860248201527f496e76616c69642077616c6c6574206f722066756e64657200000000000000006044820152606401620005a3565b6040516001600160a01b038216903480156108fc02916000818181858888f1935050505015801562000abc573d6000803e3d6000fd5b6200137e62001a08565b6001600160a01b038116620013e55760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401620005a3565b620009e18162001a64565b620013fa62001a08565b6001600160a01b038116158015906200149e575060c960009054906101000a90046001600160a01b03166001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801562001462573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001488919062002424565b6001600160a01b0316816001600160a01b031614155b620014de5760405162461bcd60e51b815260206004820152600f60248201526e696e76616c6964206164647265737360881b6044820152606401620005a3565b60cc8054906000620014f08362002513565b909155505060c95460408051635c60da1b60e01b815290516001600160a01b03808516931691635c60da1b9160048083019260209291908290030181865afa15801562001541573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001567919062002424565b6001600160a01b03167f5678caf9f87c5a77571c317ab0f4cc76826bfa201760aaf54273c13333de40f660405160405180910390a360c954604051631b2ce7f360e11b81526001600160a01b03838116600483015290911690633659cfe690602401600060405180830381600087803b158015620015e457600080fd5b505af1158015620015f9573d6000803e3d6000fd5b5050505050565b6001600160a01b038116600090815260cb6020526040902054620016385760405162461bcd60e51b8152600401620005a390620023fc565b806001600160a01b031663b808dce86040518163ffffffff1660e01b8152600401602060405180830381865afa15801562001677573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200169d919062002424565b6001600160a01b0316336001600160a01b031614620016d05760405162461bcd60e51b8152600401620005a39062002444565b806001600160a01b031663923689e46040518163ffffffff1660e01b8152600401600060405180830381600087803b158015620015e457600080fd5b620009e162001a08565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff161562001751576200174c8362001b3e565b505050565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015620017ae575060408051601f3d908101601f19168201909252620017ab91810190620025c7565b60015b620018135760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b6064820152608401620005a3565b600080516020620035438339815191528114620018855760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b6064820152608401620005a3565b506200174c83838362001bdd565b6000348514620018d85760405162461bcd60e51b815260206004820152600f60248201526e0c2dadeeadce840dad2e6dac2e8c6d608b1b6044820152606401620005a3565b620018e4848462001c0e565b600062001929868487878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525062001d3692505050565b9050806001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa92505050801562001988575060408051601f3d908101601f19168201909252620019859181019062002424565b60015b1562000e7a57306001600160a01b03821603620019fd5760405163f2fde38b60e01b81526001600160a01b03898116600483015283169063f2fde38b90602401600060405180830381600087803b158015620019e357600080fd5b505af1158015620019f8573d6000803e3d6000fd5b505050505b509695505050505050565b6097546001600160a01b0316331462000e9a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401620005a3565b609780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b600054610100900460ff1662001b0a5760405162461bcd60e51b8152600401620005a3906200269c565b62000e9a62001e40565b600054610100900460ff1662000e9a5760405162461bcd60e51b8152600401620005a3906200269c565b6001600160a01b0381163b62001bad5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401620005a3565b6000805160206200354383398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b62001be88362001e75565b60008251118062001bf65750805b156200174c5762001c08838362001eb7565b50505050565b60006040518060200162001c229062001ff8565b601f1982820381018352601f90910116604052805190915062001c47906020620026e7565b8211156200174c5760008151600c62001c619190620026e7565b905060008085838662001c76826014620026e7565b9262001c8593929190620026fd565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050601482015160c954909450919250506001600160a01b039081169083160362000dd45760405162461bcd60e51b815260206004820152602960248201527f446972656374204b696e746f57616c6c6574206465706c6f796d656e74206e6f6044820152681d08185b1b1bddd95960ba1b6064820152608401620005a3565b60008347101562001d8a5760405162461bcd60e51b815260206004820152601d60248201527f437265617465323a20696e73756666696369656e742062616c616e63650000006044820152606401620005a3565b815160000362001ddd5760405162461bcd60e51b815260206004820181905260248201527f437265617465323a2062797465636f6465206c656e677468206973207a65726f6044820152606401620005a3565b8282516020840186f590506001600160a01b038116620005645760405162461bcd60e51b815260206004820152601960248201527f437265617465323a204661696c6564206f6e206465706c6f79000000000000006044820152606401620005a3565b600054610100900460ff1662001e6a5760405162461bcd60e51b8152600401620005a3906200269c565b62000e9a3362001a64565b62001e808162001b3e565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606001600160a01b0383163b62001f215760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b6064820152608401620005a3565b600080846001600160a01b03168460405162001f3e919062002729565b600060405180830381855af49150503d806000811462001f7b576040519150601f19603f3d011682016040523d82523d6000602084013e62001f80565b606091505b509150915062001fab8282604051806060016040528060278152602001620035636027913962001fb4565b95945050505050565b6060831562001fc557508162000564565b62000564838381511562001fdc5781518083602001fd5b8060405162461bcd60e51b8152600401620005a3919062002747565b610902806200275d83390190565b6104e4806200305f83390190565b6001600160a01b0381168114620009e157600080fd5b6000806000606084860312156200204057600080fd5b83356200204d8162002014565b925060208401356200205f8162002014565b929592945050506040919091013590565b6000806000604084860312156200208657600080fd5b8335620020938162002014565b9250602084013567ffffffffffffffff80821115620020b157600080fd5b818601915086601f830112620020c657600080fd5b813581811115620020d657600080fd5b8760208260051b8501011115620020ec57600080fd5b6020830194508093505050509250925092565b6000602082840312156200211257600080fd5b8135620005648162002014565b634e487b7160e01b600052604160045260246000fd5b600080604083850312156200214957600080fd5b8235620021568162002014565b9150602083013567ffffffffffffffff808211156200217457600080fd5b818501915085601f8301126200218957600080fd5b8135818111156200219e576200219e6200211f565b604051601f8201601f19908116603f01168101908382118183101715620021c957620021c96200211f565b81604052828152886020848701011115620021e357600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b600080604083850312156200221957600080fd5b8235620022268162002014565b9150602083013567ffffffffffffffff8111156200224357600080fd5b8301608081860312156200225657600080fd5b809150509250929050565b6000806000806000608086880312156200227a57600080fd5b8535620022878162002014565b945060208601359350604086013567ffffffffffffffff80821115620022ac57600080fd5b818801915088601f830112620022c157600080fd5b813581811115620022d157600080fd5b896020828501011115620022e457600080fd5b96999598505060200195606001359392505050565b600080604083850312156200230d57600080fd5b50508035926020909101359150565b600080604083850312156200233057600080fd5b82356200233d8162002014565b91506020830135620022568162002014565b60005b838110156200236c57818101518382015260200162002352565b50506000910152565b600081518084526200238f8160208601602086016200234f565b601f01601f19169290920160200192915050565b6001600160a01b0383168152604060208201819052600090620005619083018462002375565b60008351620023dd8184602088016200234f565b835190830190620023f38183602088016200234f565b01949350505050565b6020808252600e908201526d1a5b9d985b1a59081dd85b1b195d60921b604082015260600190565b6000602082840312156200243757600080fd5b8151620005648162002014565b6020808252600e908201526d37b7363c903932b1b7bb32b932b960911b604082015260600190565b60208082528181018390526000908460408401835b86811015620019fd578235620024978162002014565b6001600160a01b03168252918301919083019060010162002481565b600060208284031215620024c657600080fd5b815180151581146200056457600080fd5b6020808252600c908201526b12d650c81c995c5d5a5c995960a21b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b600060018201620025285762002528620024fd565b5060010190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b6163746976652070726f787960a01b606082015260800190565b600060208284031215620025da57600080fd5b5051919050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60208152600082356200261d8162002014565b60018060a01b03811660208401525060208301356040830152604083013560608301526060830135601e198436030181126200265857600080fd5b830160208101903567ffffffffffffffff8111156200267657600080fd5b8036038213156200268657600080fd5b60808085015262001fab60a085018284620025e1565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b8082018082111562000eae5762000eae620024fd565b600080858511156200270e57600080fd5b838611156200271c57600080fd5b5050820193919092039150565b600082516200273d8184602087016200234f565b9190910192915050565b60208152600062000eab60208301846200237556fe60806040526040516109023803806109028339810160408190526100229161045f565b818161003082826000610039565b50505050610589565b61004283610104565b6040516001600160a01b038416907f1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e90600090a26000825111806100835750805b156100ff576100fd836001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100ed919061051f565b836102a760201b6100271760201c565b505b505050565b610117816102d360201b6100531760201c565b6101765760405162461bcd60e51b815260206004820152602560248201527f455243313936373a206e657720626561636f6e206973206e6f74206120636f6e6044820152641d1c9858dd60da1b60648201526084015b60405180910390fd5b6101ea816001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156101b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101db919061051f565b6102d360201b6100531760201c565b61024f5760405162461bcd60e51b815260206004820152603060248201527f455243313936373a20626561636f6e20696d706c656d656e746174696f6e206960448201526f1cc81b9bdd08184818dbdb9d1c9858dd60821b606482015260840161016d565b806102867fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d5060001b6102e260201b6100621760201c565b80546001600160a01b0319166001600160a01b039290921691909117905550565b60606102cc83836040518060600160405280602781526020016108db602791396102e5565b9392505050565b6001600160a01b03163b151590565b90565b6060600080856001600160a01b031685604051610302919061053a565b600060405180830381855af49150503d806000811461033d576040519150601f19603f3d011682016040523d82523d6000602084013e610342565b606091505b5090925090506103548683838761035e565b9695505050505050565b606083156103cd5782516000036103c6576001600160a01b0385163b6103c65760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161016d565b50816103d7565b6103d783836103df565b949350505050565b8151156103ef5781518083602001fd5b8060405162461bcd60e51b815260040161016d9190610556565b80516001600160a01b038116811461042057600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b8381101561045657818101518382015260200161043e565b50506000910152565b6000806040838503121561047257600080fd5b61047b83610409565b60208401519092506001600160401b038082111561049857600080fd5b818501915085601f8301126104ac57600080fd5b8151818111156104be576104be610425565b604051601f8201601f19908116603f011681019083821181831017156104e6576104e6610425565b816040528281528860208487010111156104ff57600080fd5b61051083602083016020880161043b565b80955050505050509250929050565b60006020828403121561053157600080fd5b6102cc82610409565b6000825161054c81846020870161043b565b9190910192915050565b602081526000825180602084015261057581604085016020870161043b565b601f01601f19169190910160400192915050565b610343806105986000396000f3fe60806040523661000b57005b610013610015565b005b610025610020610065565b6100fe565b565b606061004c83836040518060600160405280602781526020016102e760279139610122565b9392505050565b6001600160a01b03163b151590565b90565b60006100987fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50546001600160a01b031690565b6001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100f9919061024a565b905090565b3660008037600080366000845af43d6000803e80801561011d573d6000f35b3d6000fd5b6060600080856001600160a01b03168560405161013f9190610297565b600060405180830381855af49150503d806000811461017a576040519150601f19603f3d011682016040523d82523d6000602084013e61017f565b606091505b50915091506101908683838761019a565b9695505050505050565b6060831561020e578251600003610207576001600160a01b0385163b6102075760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064015b60405180910390fd5b5081610218565b6102188383610220565b949350505050565b8151156102305781518083602001fd5b8060405162461bcd60e51b81526004016101fe91906102b3565b60006020828403121561025c57600080fd5b81516001600160a01b038116811461004c57600080fd5b60005b8381101561028e578181015183820152602001610276565b50506000910152565b600082516102a9818460208701610273565b9190910192915050565b60208152600082518060208401526102d2816040850160208701610273565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220f0e3ef2d2445c27cb092c3417e9d772e131fc2383995e0d0d9ee96165dd0ab0b64736f6c63430008120033416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564608060405234801561001057600080fd5b506040516104e43803806104e483398101604081905261002f91610151565b61003833610047565b61004181610097565b50610181565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6100aa8161014260201b6101a01760201c565b6101205760405162461bcd60e51b815260206004820152603360248201527f5570677261646561626c65426561636f6e3a20696d706c656d656e746174696f60448201527f6e206973206e6f74206120636f6e747261637400000000000000000000000000606482015260840160405180910390fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b03163b151590565b60006020828403121561016357600080fd5b81516001600160a01b038116811461017a57600080fd5b9392505050565b610354806101906000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80633659cfe61461005c5780635c60da1b14610071578063715018a61461009a5780638da5cb5b146100a2578063f2fde38b146100b3575b600080fd5b61006f61006a3660046102ee565b6100c6565b005b6001546001600160a01b03165b6040516001600160a01b03909116815260200160405180910390f35b61006f61010e565b6000546001600160a01b031661007e565b61006f6100c13660046102ee565b610122565b6100ce6101af565b6100d781610209565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6101166101af565b610120600061029e565b565b61012a6101af565b6001600160a01b0381166101945760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b61019d8161029e565b50565b6001600160a01b03163b151590565b6000546001600160a01b031633146101205760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161018b565b6001600160a01b0381163b61027c5760405162461bcd60e51b815260206004820152603360248201527f5570677261646561626c65426561636f6e3a20696d706c656d656e746174696f6044820152721b881a5cc81b9bdd08184818dbdb9d1c9858dd606a1b606482015260840161018b565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60006020828403121561030057600080fd5b81356001600160a01b038116811461031757600080fd5b939250505056fea26469706673582212209f2075bb08aacaa7585daf8bbb94ff2d4da0d3e0654263dbde3f0bbbb81f211c64736f6c63430008120033360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220a8a73ad628f04f8207326aada973ff18641485bc88eb48c3bf942a0e3fbb04c564736f6c63430008120033000000000000000000000000893b0aea9c45fa8d3b0fbbebd03d4220b951459900000000000000000000000000000000000000000000", + "nonce": "0xf" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xe776c20bd6ff45148cf4e430bfc0065ce64768dd86280875bcce04f5a02566ab", + "transactionType": "CALL", + "contractName": null, + "contractAddress": null, + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0x660ad4b5a74130a4796b4d54bc6750ae93c86e6c", + "to": "0x8a4720488ca32f1223ccfe5a087e250fe3bc5d75", + "value": "0x0", + "data": "0x66d6e19b000000000000000000000000c1f4d15c16a1f3555e0a5f7aefd1e17ad4aaf40b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004af760a0604052306080523480156200001557600080fd5b506200002062000026565b620000e7565b600054610100900460ff1615620000935760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff90811614620000e5576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6080516149d86200011f60003960008181610fbb01528181610ffb015281816110f301528181611133015261125501526149d86000f3fe6080604052600436106102935760003560e01c80636d7cdf6c1161015a578063b0a77c61116100c1578063d9e1063d1161007a578063d9e1063d14610880578063e985e9c5146108a2578063ead15596146108eb578063ef3b49031461090b578063efdbfaee1461092b578063f72c0d8b1461094b57600080fd5b8063b0a77c61146107bc578063b61f5515146107d3578063b75a3e4e14610800578063b88d4fde14610820578063c87b56dd14610840578063d547741f1461086057600080fd5b806391d148541161011357806391d14854146106d457806395d89b41146106f45780639944f51814610724578063a0406ce214610744578063a217fddf14610787578063a22cb4651461079c57600080fd5b80636d7cdf6c146106115780636ed1f4a31461063157806370a08231146106515780637ecebe00146106715780638129fc1c1461069f57806386823a2c146106b457600080fd5b80632f2ff15d116101fe57806342966c68116101b757806342966c68146105695780634f1ef286146105895780634f6ccce71461059c57806352d1902d146105bc5780636352211e146105d15780636d785f3b146105f157600080fd5b80632f2ff15d146104875780632f745c59146104a757806336568abe146104c75780633659cfe6146104e7578063390c11ae1461050757806342842e0e1461054957600080fd5b806311c0154e1161025057806311c0154e146103a157806318160ddd146103c15780631fbd4041146103e057806321442ec91461040057806323b872dd14610437578063248a9ca31461045757600080fd5b806301ffc9a71461029857806305bdaabb146102cd57806306fdde03146102ef578063081812fc14610329578063095ea7b3146103615780630add9f7f14610381575b600080fd5b3480156102a457600080fd5b506102b86102b3366004613cb5565b61097f565b60405190151581526020015b60405180910390f35b3480156102d957600080fd5b506102ed6102e8366004613d00565b610990565b005b3480156102fb57600080fd5b5060408051808201909152600881526712da5b9d1bc8125160c21b60208201525b6040516102c49190613d83565b34801561033557600080fd5b50610349610344366004613d96565b610aa0565b6040516001600160a01b0390911681526020016102c4565b34801561036d57600080fd5b506102ed61037c366004613daf565b610ac7565b34801561038d57600080fd5b506102b861039c366004613dd9565b610bdc565b3480156103ad57600080fd5b506102ed6103bc366004613d00565b610c13565b3480156103cd57600080fd5b506099545b6040519081526020016102c4565b3480156103ec57600080fd5b506102ed6103fb366004613d00565b610d11565b34801561040c57600080fd5b506103d261041b366004613dd9565b6001600160a01b03166000908152610193602052604090205490565b34801561044357600080fd5b506102ed610452366004613df4565b610e47565b34801561046357600080fd5b506103d2610472366004613d96565b600090815260fb602052604090206001015490565b34801561049357600080fd5b506102ed6104a2366004613e30565b610e78565b3480156104b357600080fd5b506103d26104c2366004613daf565b610e9d565b3480156104d357600080fd5b506102ed6104e2366004613e30565b610f33565b3480156104f357600080fd5b506102ed610502366004613dd9565b610fb1565b34801561051357600080fd5b506102b8610522366004613dd9565b6001600160a01b031660009081526101936020526040902060020154610100900460ff1690565b34801561055557600080fd5b506102ed610564366004613df4565b611090565b34801561057557600080fd5b506102ed610584366004613d96565b6110ab565b6102ed610597366004613ef5565b6110e9565b3480156105a857600080fd5b506103d26105b7366004613d96565b6111b5565b3480156105c857600080fd5b506103d2611248565b3480156105dd57600080fd5b506103496105ec366004613d96565b6112fb565b3480156105fd57600080fd5b506102ed61060c366004613f9e565b61135b565b34801561061d57600080fd5b506102ed61062c366004613f9e565b611382565b34801561063d57600080fd5b506102ed61064c366004614006565b6113a9565b34801561065d57600080fd5b506103d261066c366004613dd9565b611701565b34801561067d57600080fd5b506103d261068c366004613dd9565b6101946020526000908152604090205481565b3480156106ab57600080fd5b506102ed611787565b3480156106c057600080fd5b506102b86106cf366004613d00565b61194a565b3480156106e057600080fd5b506102b86106ef366004613e30565b6119af565b34801561070057600080fd5b5060408051808201909152600781526612d2539513d25160ca1b602082015261031c565b34801561073057600080fd5b506102b861073f366004613dd9565b6119da565b34801561075057600080fd5b506102b861075f366004613dd9565b6001600160a01b031660009081526101936020526040902060020154610100900460ff161590565b34801561079357600080fd5b506103d2600081565b3480156107a857600080fd5b506102ed6107b7366004614081565b6119f7565b3480156107c857600080fd5b506103d26101925481565b3480156107df57600080fd5b506107f36107ee366004613dd9565b611a02565b6040516102c491906140ab565b34801561080c57600080fd5b506102b861081b366004613d00565b611aae565b34801561082c57600080fd5b506102ed61083b3660046140f1565b611af1565b34801561084c57600080fd5b5061031c61085b366004613d96565b611b23565b34801561086c57600080fd5b506102ed61087b366004613e30565b611b89565b34801561088c57600080fd5b506103d260008051602061491683398151915281565b3480156108ae57600080fd5b506102b86108bd366004614158565b6001600160a01b039182166000908152606a6020908152604080832093909416825291909152205460ff1690565b3480156108f757600080fd5b506102b8610906366004614182565b611bae565b34801561091757600080fd5b506102ed610926366004613d00565b611bd9565b34801561093757600080fd5b506102ed6109463660046141a8565b611d11565b34801561095757600080fd5b506103d27f189ab7a9244df0848122154315af71fe140f3db0fe014031783b0946b8c9d2e381565b600061098a82611d82565b92915050565b6000805160206149168339815191526109a881611da7565b60006109b384611701565b116109d95760405162461bcd60e51b81526004016109d0906141dc565b60405180910390fd5b6001600160a01b03831660009081526101936020908152604080832060ff600887901c811685526003820190935292205460019185169190911b16610a9a5760ff600884901c811660009081526003830160205260409020805460019286169290921b909117905542600182018190556101928190556040805161ffff8616815260208101929092526001600160a01b038616917f364b7a2e1762fd5d9cdeda6c0ea8e1be396892c015c5c917f4d164cd4968ac7691015b60405180910390a25b50505050565b6000610aab82611db1565b506000908152606960205260409020546001600160a01b031690565b6000610ad2826112fb565b9050806001600160a01b0316836001600160a01b031603610b3f5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016109d0565b336001600160a01b0382161480610b5b5750610b5b81336108bd565b610bcd5760405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c00000060648201526084016109d0565b610bd78383611e10565b505050565b6000610be86007611bae565b801561098a5750506001600160a01b03166000908152610193602052604090206002015460ff161590565b600080516020614916833981519152610c2b81611da7565b6000610c3684611701565b11610c535760405162461bcd60e51b81526004016109d0906141dc565b6001600160a01b03831660009081526101936020908152604080832060ff600887901c811685526003820190935292205460019185169190911b1615610a9a5760ff600884901c811660009081526003830160205260409020805460019286169290921b19909116905542600182018190556101928190556040805161ffff8616815260208101929092526001600160a01b038616917fdaf71d6bfd7a93506c86e0e5c5725808f99fe27f13af711f321edf92511e609b9101610a91565b600080516020614916833981519152610d2981611da7565b6000610d3484611701565b11610d515760405162461bcd60e51b81526004016109d0906141dc565b6001600160a01b03831660009081526101936020908152604080832060ff600887901c811685526004820190935292205460019185169190911b16610a9a5760ff600884901c811660009081526004830160205260409020805460019286169290921b909117905560028101805460019190600090610dd490849060ff16614229565b92506101000a81548160ff021916908360ff1602179055504281600101819055504261019281905550836001600160a01b03167f87d7acad3a8fb00ded1ae0aeaed871a89b621b17d6cd6ff8fd5c00b63394f94a8442604051610a9192919061ffff929092168252602082015260400190565b610e513382611e7e565b610e6d5760405162461bcd60e51b81526004016109d090614242565b610bd7838383611efd565b600082815260fb6020526040902060010154610e9381611da7565b610bd7838361206e565b6000610ea883611701565b8210610f0a5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b60648201526084016109d0565b506001600160a01b03919091166000908152609760209081526040808320938352929052205490565b6001600160a01b0381163314610fa35760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b60648201526084016109d0565b610fad82826120f4565b5050565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163003610ff95760405162461bcd60e51b81526004016109d09061428f565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031661104260008051602061495c833981519152546001600160a01b031690565b6001600160a01b0316146110685760405162461bcd60e51b81526004016109d0906142db565b6110718161215b565b6040805160008082526020820190925261108d91839190612185565b50565b610bd783838360405180602001604052806000815250611af1565b60405162461bcd60e51b8152602060048201526013602482015272155cd948189d5c9b92d650c81a5b9cdd195859606a1b60448201526064016109d0565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001630036111315760405162461bcd60e51b81526004016109d09061428f565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031661117a60008051602061495c833981519152546001600160a01b031690565b6001600160a01b0316146111a05760405162461bcd60e51b81526004016109d0906142db565b6111a98261215b565b610fad82826001612185565b60006111c060995490565b82106112235760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b60648201526084016109d0565b6099828154811061123657611236614327565b90600052602060002001549050919050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146112e85760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c000000000000000060648201526084016109d0565b5060008051602061495c83398151915290565b6000818152606760205260408120546001600160a01b03168061098a5760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b60448201526064016109d0565b610191805490600061136c8361433d565b9190505550610bd76101915484848460016122f0565b61019180549060006113938361433d565b9190505550610bd76101915484848460006122f0565b6000805160206149168339815191526113c181611da7565b8382146114025760405162461bcd60e51b815260206004820152600f60248201526e098cadccee8d040dad2e6dac2e8c6d608b1b60448201526064016109d0565b60c884111561145f5760405162461bcd60e51b8152602060048201526024808201527f546f6f206d616e79206163636f756e747320746f206d6f6e69746f72206174206044820152636f6e636560e01b60648201526084016109d0565b60005b848110156116b1576000610193600088888581811061148357611483614327565b90506020020160208101906114989190613dd9565b6001600160a01b03166001600160a01b0316815260200190815260200160002090506114e48787848181106114cf576114cf614327565b905060200201602081019061066c9190613dd9565b6000036114f1575061169f565b42600182015560005b85858481811061150c5761150c614327565b905060200281019061151e9190614356565b905081101561169c57600086868581811061153b5761153b614327565b905060200281019061154d9190614356565b8381811061155d5761155d614327565b905060600201803603810190611573919061439e565b80519091508015611585575080602001515b156115c3576115be89898681811061159f5761159f614327565b90506020020160208101906115b49190613dd9565b8260400151610990565b611689565b805180156115d357508060200151155b1561160c576115be8989868181106115ed576115ed614327565b90506020020160208101906116029190613dd9565b8260400151610c13565b805115801561161c575080602001515b15611655576115be89898681811061163657611636614327565b905060200201602081019061164b9190613dd9565b8260400151610d11565b61168989898681811061166a5761166a614327565b905060200201602081019061167f9190613dd9565b8260400151611bd9565b50611695600182614409565b90506114fa565b50505b6116aa600182614409565b9050611462565b504261019281905560405133917f18fb8b1f79749f3894ec6b996ad0503b2dbcf19585865dba3df7683953fc450d916116f291888252602082015260400190565b60405180910390a25050505050565b60006001600160a01b03821661176b5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b60648201526084016109d0565b506001600160a01b031660009081526068602052604090205490565b600054610100900460ff16158080156117a75750600054600160ff909116105b806117c15750303b1580156117c1575060005460ff166001145b6118245760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016109d0565b6000805460ff191660011790558015611847576000805461ff0019166101001790555b6118906040518060400160405280600881526020016712da5b9d1bc8125160c21b8152506040518060400160405280600781526020016612d2539513d25160ca1b815250612697565b6118986126c8565b6118a06126c8565b6118a86126c8565b6118b06126c8565b6118bb60003361206e565b6118d36000805160206149168339815191523361206e565b6118fd7f189ab7a9244df0848122154315af71fe140f3db0fe014031783b0946b8c9d2e33361206e565b4261019255801561108d576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150565b60006119566007611bae565b80156119a857506001600160a01b0383166000908152610193602052604090206119a69060040161ffff8416600881901c600090815260208390526040902054600160ff83161b16151592915050565b155b9392505050565b600091825260fb602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6000806119e683611701565b11801561098a575061098a82610bdc565b610fad3383836126f1565b6001600160a01b038116600090815261019360205260408082208151610100808252612020820190935260609360039092019281602001602082028036833701905050905060005b610100811015611aa657600881901c600090815260208490526040902054600160ff83161b161515828281518110611a8457611a84614327565b9115156020928302919091019091015280611a9e8161433d565b915050611a4a565b509392505050565b6001600160a01b03821660009081526101936020908152604080832060ff600886901c81168552600390910190925282205460019184169190911b1615156119a8565b611afb3383611e7e565b611b175760405162461bcd60e51b81526004016109d090614242565b610a9a848484846127bf565b6060611b2e82611db1565b6000611b386127f2565b90506000815111611b5857604051806020016040528060008152506119a8565b80611b6284612812565b604051602001611b7392919061441c565b6040516020818303038152906040529392505050565b600082815260fb6020526040902060010154611ba481611da7565b610bd783836120f4565b6000611bbd826201518061444b565b63ffffffff166101925442611bd29190614473565b1092915050565b600080516020614916833981519152611bf181611da7565b6000611bfc84611701565b11611c195760405162461bcd60e51b81526004016109d0906141dc565b6001600160a01b03831660009081526101936020908152604080832060ff600887901c811685526004820190935292205460019185169190911b1615610a9a5760ff600884901c811660009081526004830160205260409020805460019286169290921b19909116905560028101805460019190600090611c9e90849060ff16614486565b92506101000a81548160ff021916908360ff1602179055504281600101819055504261019281905550836001600160a01b03167fe307a82882b02537e8254556f85aa0ae942a060782f1f076028687f1fd7dba188442604051610a9192919061ffff929092168252602082015260400190565b6000611d2361066c6020840184613dd9565b11611d625760405162461bcd60e51b815260206004820152600f60248201526e2737ba3434b733903a3790313ab93760891b60448201526064016109d0565b61108d611d7c611d756020840184613dd9565b6000610e9d565b826128a4565b60006001600160e01b03198216637965db0b60e01b148061098a575061098a82612b64565b61108d8133612b89565b6000818152606760205260409020546001600160a01b031661108d5760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b60448201526064016109d0565b600081815260696020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611e45826112fb565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080611e8a836112fb565b9050806001600160a01b0316846001600160a01b03161480611ed157506001600160a01b038082166000908152606a602090815260408083209388168352929052205460ff165b80611ef55750836001600160a01b0316611eea84610aa0565b6001600160a01b0316145b949350505050565b826001600160a01b0316611f10826112fb565b6001600160a01b031614611f365760405162461bcd60e51b81526004016109d09061449f565b6001600160a01b038216611f985760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016109d0565b611fa58383836001612be2565b826001600160a01b0316611fb8826112fb565b6001600160a01b031614611fde5760405162461bcd60e51b81526004016109d09061449f565b600081815260696020908152604080832080546001600160a01b03199081169091556001600160a01b0387811680865260688552838620805460001901905590871680865283862080546001019055868652606790945282852080549092168417909155905184937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b61207882826119af565b610fad57600082815260fb602090815260408083206001600160a01b03851684529091529020805460ff191660011790556120b03390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6120fe82826119af565b15610fad57600082815260fb602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b7f189ab7a9244df0848122154315af71fe140f3db0fe014031783b0946b8c9d2e3610fad81611da7565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff16156121b857610bd783612c8e565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015612212575060408051601f3d908101601f1916820190925261220f918101906144e4565b60015b6122755760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b60648201526084016109d0565b60008051602061495c83398151915281146122e45760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b60648201526084016109d0565b50610bd7838383612d2a565b838060400135421061233c5760405162461bcd60e51b815260206004820152601560248201527414da59db985d1d5c99481a185cc8195e1c1a5c9959605a1b60448201526064016109d0565b60208101803590610194906000906123549085613dd9565b6001600160a01b03166001600160a01b0316815260200190815260200160002054146123b25760405162461bcd60e51b815260206004820152600d60248201526c496e76616c6964204e6f6e636560981b60448201526064016109d0565b6123ca600080516020614916833981519152336119af565b6124095760405162461bcd60e51b815260206004820152601060248201526f24b73b30b634b210283937bb34b232b960811b60448201526064016109d0565b6000806124196020840184613dd9565b803b9250905081156124655760405162461bcd60e51b81526020600482015260156024820152745369676e6572206d75737420626520616e20454f4160581b60448201526064016109d0565b6000612478612473856144fd565b612d4f565b90506124dd8161248b6060870187614582565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506124cd925050506020880188613dd9565b6001600160a01b03169190612edb565b61251a5760405162461bcd60e51b815260206004820152600e60248201526d24b73b30b634b21029b4b3b732b960911b60448201526064016109d0565b61252a61066c60208a018a613dd9565b156125775760405162461bcd60e51b815260206004820152601d60248201527f42616c616e6365206265666f7265206d696e74206d757374206265203000000060448201526064016109d0565b60006101938161258a60208c018c613dd9565b6001600160a01b031681526020810191909152604001600090812042808255600182015560028101805461ff0019166101008a15150217905591505b87811015612635576126238989838181106125e3576125e3614327565b90506020020160208101906125f891906145c8565b600881901c60ff9081166000908152600386016020526040902080546001939092169290921b179055565b8061262d8161433d565b9150506125c6565b50610194600061264860208c018c613dd9565b6001600160a01b031681526020810191909152604001600090812080549161266f8361433d565b9091555061268b905061268560208b018b613dd9565b8b612f3c565b50505050505050505050565b600054610100900460ff166126be5760405162461bcd60e51b81526004016109d0906145e3565b610fad8282612f56565b600054610100900460ff166126ef5760405162461bcd60e51b81526004016109d0906145e3565b565b816001600160a01b0316836001600160a01b0316036127525760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016109d0565b6001600160a01b038381166000818152606a6020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6127ca848484611efd565b6127d684848484612f96565b610a9a5760405162461bcd60e51b81526004016109d09061462e565b606060405180606001604052806026815260200161493660269139905090565b6060600061281f83613097565b60010190506000816001600160401b0381111561283e5761283e613e53565b6040519080825280601f01601f191660200182016040528015612868576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a850494508461287257509392505050565b80806040013542106128f05760405162461bcd60e51b815260206004820152601560248201527414da59db985d1d5c99481a185cc8195e1c1a5c9959605a1b60448201526064016109d0565b60208101803590610194906000906129089085613dd9565b6001600160a01b03166001600160a01b0316815260200190815260200160002054146129665760405162461bcd60e51b815260206004820152600d60248201526c496e76616c6964204e6f6e636560981b60448201526064016109d0565b61297e600080516020614916833981519152336119af565b6129bd5760405162461bcd60e51b815260206004820152601060248201526f24b73b30b634b210283937bb34b232b960811b60448201526064016109d0565b6000806129cd6020840184613dd9565b803b925090508115612a195760405162461bcd60e51b81526020600482015260156024820152745369676e6572206d75737420626520616e20454f4160581b60448201526064016109d0565b6000612a27612473856144fd565b9050612a3a8161248b6060870187614582565b612a775760405162461bcd60e51b815260206004820152600e60248201526d24b73b30b634b21029b4b3b732b960911b60448201526064016109d0565b60016101946000612a8b6020890189613dd9565b6001600160a01b03166001600160a01b031681526020019081526020016000206000828254612aba9190614409565b90915550612ac990508661316f565b612ad961066c6020870187613dd9565b15612b265760405162461bcd60e51b815260206004820152601c60248201527f42616c616e6365206166746572206275726e206d75737420626520300000000060448201526064016109d0565b600061019381612b396020890189613dd9565b6001600160a01b03168152602081019190915260400160009081208181556001015550505050505050565b60006001600160e01b0319821663780e9d6360e01b148061098a575061098a82613212565b612b9382826119af565b610fad57612ba081613262565b612bab836020613274565b604051602001612bbc929190614680565b60408051601f198184030181529082905262461bcd60e51b82526109d091600401613d83565b6001600160a01b038416158015612c0157506001600160a01b03831615155b80612c2657506001600160a01b03841615801590612c2657506001600160a01b038316155b612c825760405162461bcd60e51b815260206004820152602760248201527f4f6e6c79206d696e74206f72206275726e207472616e73666572732061726520604482015266185b1b1bddd95960ca1b60648201526084016109d0565b610a9a8484848461340f565b6001600160a01b0381163b612cfb5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b60648201526084016109d0565b60008051602061495c83398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b612d338361354f565b600082511180612d405750805b15610bd757610a9a838361358f565b600080612e23604080518082018252600781526612da5b9d1bd25160ca1b6020918201528151808301835260018152603160f81b9082015281517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818301527ff2acf2bff9f153ce27ec66ef28c5d61aaa06a6eac70c4c0de4bac7cb3bec0c54818401527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a0808301919091528351808303909101815260c0909101909252815191012090565b90506000612e9a84805160208083015160409384015184517fce753e2ed199e3bc0c561ccacfe9f2ebd720bf99f6d0e6854d8ec36486eb18c7818501526001600160a01b039094168486015260608401919091526080808401919091528351808403909101815260a0909201909252805191012090565b60405161190160f01b602082015260228101849052604281018290529091506062016040516020818303038152906040528051906020012092505050919050565b6000806000612eea8585613683565b90925090506000816004811115612f0357612f036146f5565b148015612f215750856001600160a01b0316826001600160a01b0316145b80612f325750612f328686866136c8565b9695505050505050565b610fad8282604051806020016040528060008152506137b4565b600054610100900460ff16612f7d5760405162461bcd60e51b81526004016109d0906145e3565b6065612f89838261478d565b506066610bd7828261478d565b60006001600160a01b0384163b1561308c57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612fda90339089908890889060040161484c565b6020604051808303816000875af1925050508015613015575060408051601f3d908101601f191682019092526130129181019061487f565b60015b613072573d808015613043576040519150601f19603f3d011682016040523d82523d6000602084013e613048565b606091505b50805160000361306a5760405162461bcd60e51b81526004016109d09061462e565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611ef5565b506001949350505050565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b83106130d65772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef81000000008310613102576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc10000831061312057662386f26fc10000830492506010015b6305f5e1008310613138576305f5e100830492506008015b612710831061314c57612710830492506004015b6064831061315e576064830492506002015b600a831061098a5760010192915050565b600061317a826112fb565b905061318a816000846001612be2565b613193826112fb565b600083815260696020908152604080832080546001600160a01b03199081169091556001600160a01b0385168085526068845282852080546000190190558785526067909352818420805490911690555192935084927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b60006001600160e01b031982166380ac58cd60e01b148061324357506001600160e01b03198216635b5e139f60e01b145b8061098a57506301ffc9a760e01b6001600160e01b031983161461098a565b606061098a6001600160a01b03831660145b6060600061328383600261489c565b61328e906002614409565b6001600160401b038111156132a5576132a5613e53565b6040519080825280601f01601f1916602001820160405280156132cf576020820181803683370190505b509050600360fc1b816000815181106132ea576132ea614327565b60200101906001600160f81b031916908160001a905350600f60fb1b8160018151811061331957613319614327565b60200101906001600160f81b031916908160001a905350600061333d84600261489c565b613348906001614409565b90505b60018111156133c0576f181899199a1a9b1b9c1cb0b131b232b360811b85600f166010811061337c5761337c614327565b1a60f81b82828151811061339257613392614327565b60200101906001600160f81b031916908160001a90535060049490941c936133b9816148b3565b905061334b565b5083156119a85760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016109d0565b61341b848484846137e7565b600181111561348a5760405162461bcd60e51b815260206004820152603560248201527f455243373231456e756d657261626c653a20636f6e7365637574697665207472604482015274185b9cd9995c9cc81b9bdd081cdd5c1c1bdc9d1959605a1b60648201526084016109d0565b816001600160a01b0385166134e6576134e181609980546000838152609a60205260408120829055600182018355919091527f72a152ddfb8e864297c917af52ea6c1c68aead0fee1a62673fcc7e0c94979d000155565b613509565b836001600160a01b0316856001600160a01b03161461350957613509858261386f565b6001600160a01b038416613525576135208161390c565b613548565b846001600160a01b0316846001600160a01b0316146135485761354884826139bb565b5050505050565b61355881612c8e565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606001600160a01b0383163b6135f75760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b60648201526084016109d0565b600080846001600160a01b03168460405161361291906148ca565b600060405180830381855af49150503d806000811461364d576040519150601f19603f3d011682016040523d82523d6000602084013e613652565b606091505b509150915061367a828260405180606001604052806027815260200161497c602791396139ff565b95945050505050565b60008082516041036136b95760208301516040840151606085015160001a6136ad87828585613a18565b945094505050506136c1565b506000905060025b9250929050565b6000806000856001600160a01b0316631626ba7e60e01b86866040516024016136f29291906148e6565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b031990941693909317909252905161373091906148ca565b600060405180830381855afa9150503d806000811461376b576040519150601f19603f3d011682016040523d82523d6000602084013e613770565b606091505b509150915081801561378457506020815110155b8015612f3257508051630b135d3f60e11b906137a990830160209081019084016144e4565b149695505050505050565b6137be8383613adc565b6137cb6000848484612f96565b610bd75760405162461bcd60e51b81526004016109d09061462e565b6001811115610a9a576001600160a01b0384161561382d576001600160a01b03841660009081526068602052604081208054839290613827908490614473565b90915550505b6001600160a01b03831615610a9a576001600160a01b03831660009081526068602052604081208054839290613864908490614409565b909155505050505050565b6000600161387c84611701565b6138869190614473565b6000838152609860205260409020549091508082146138d9576001600160a01b03841660009081526097602090815260408083208584528252808320548484528184208190558352609890915290208190555b5060009182526098602090815260408084208490556001600160a01b039094168352609781528383209183525290812055565b60995460009061391e90600190614473565b6000838152609a60205260408120546099805493945090928490811061394657613946614327565b90600052602060002001549050806099838154811061396757613967614327565b6000918252602080832090910192909255828152609a9091526040808220849055858252812055609980548061399f5761399f6148ff565b6001900381819060005260206000200160009055905550505050565b60006139c683611701565b6001600160a01b039093166000908152609760209081526040808320868452825280832085905593825260989052919091209190915550565b60608315613a0e5750816119a8565b6119a88383613c75565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115613a4f5750600090506003613ad3565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015613aa3573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116613acc57600060019250925050613ad3565b9150600090505b94509492505050565b6001600160a01b038216613b325760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016109d0565b6000818152606760205260409020546001600160a01b031615613b975760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016109d0565b613ba5600083836001612be2565b6000818152606760205260409020546001600160a01b031615613c0a5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016109d0565b6001600160a01b038216600081815260686020908152604080832080546001019055848352606790915280822080546001600160a01b0319168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b815115613c855781518083602001fd5b8060405162461bcd60e51b81526004016109d09190613d83565b6001600160e01b03198116811461108d57600080fd5b600060208284031215613cc757600080fd5b81356119a881613c9f565b80356001600160a01b0381168114613ce957600080fd5b919050565b803561ffff81168114613ce957600080fd5b60008060408385031215613d1357600080fd5b613d1c83613cd2565b9150613d2a60208401613cee565b90509250929050565b60005b83811015613d4e578181015183820152602001613d36565b50506000910152565b60008151808452613d6f816020860160208601613d33565b601f01601f19169290920160200192915050565b6020815260006119a86020830184613d57565b600060208284031215613da857600080fd5b5035919050565b60008060408385031215613dc257600080fd5b613dcb83613cd2565b946020939093013593505050565b600060208284031215613deb57600080fd5b6119a882613cd2565b600080600060608486031215613e0957600080fd5b613e1284613cd2565b9250613e2060208501613cd2565b9150604084013590509250925092565b60008060408385031215613e4357600080fd5b82359150613d2a60208401613cd2565b634e487b7160e01b600052604160045260246000fd5b600082601f830112613e7a57600080fd5b81356001600160401b0380821115613e9457613e94613e53565b604051601f8301601f19908116603f01168101908282118183101715613ebc57613ebc613e53565b81604052838152866020858801011115613ed557600080fd5b836020870160208301376000602085830101528094505050505092915050565b60008060408385031215613f0857600080fd5b613f1183613cd2565b915060208301356001600160401b03811115613f2c57600080fd5b613f3885828601613e69565b9150509250929050565b600060808284031215613f5457600080fd5b50919050565b60008083601f840112613f6c57600080fd5b5081356001600160401b03811115613f8357600080fd5b6020830191508360208260051b85010111156136c157600080fd5b600080600060408486031215613fb357600080fd5b83356001600160401b0380821115613fca57600080fd5b613fd687838801613f42565b94506020860135915080821115613fec57600080fd5b50613ff986828701613f5a565b9497909650939450505050565b6000806000806040858703121561401c57600080fd5b84356001600160401b038082111561403357600080fd5b61403f88838901613f5a565b9096509450602087013591508082111561405857600080fd5b5061406587828801613f5a565b95989497509550505050565b80358015158114613ce957600080fd5b6000806040838503121561409457600080fd5b61409d83613cd2565b9150613d2a60208401614071565b6020808252825182820181905260009190848201906040850190845b818110156140e55783511515835292840192918401916001016140c7565b50909695505050505050565b6000806000806080858703121561410757600080fd5b61411085613cd2565b935061411e60208601613cd2565b92506040850135915060608501356001600160401b0381111561414057600080fd5b61414c87828801613e69565b91505092959194509250565b6000806040838503121561416b57600080fd5b61417483613cd2565b9150613d2a60208401613cd2565b60006020828403121561419457600080fd5b813563ffffffff811681146119a857600080fd5b6000602082840312156141ba57600080fd5b81356001600160401b038111156141d057600080fd5b611ef584828501613f42565b6020808252601d908201527f4163636f756e74206d75737420686176652061204b594320746f6b656e000000604082015260600190565b634e487b7160e01b600052601160045260246000fd5b60ff818116838216019081111561098a5761098a614213565b6020808252602d908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526c1c881bdc88185c1c1c9bdd9959609a1b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b6163746976652070726f787960a01b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b60006001820161434f5761434f614213565b5060010190565b6000808335601e1984360301811261436d57600080fd5b8301803591506001600160401b0382111561438757600080fd5b60200191506060810236038213156136c157600080fd5b6000606082840312156143b057600080fd5b604051606081018181106001600160401b03821117156143d2576143d2613e53565b6040526143de83614071565b81526143ec60208401614071565b60208201526143fd60408401613cee565b60408201529392505050565b8082018082111561098a5761098a614213565b6000835161442e818460208801613d33565b835190830190614442818360208801613d33565b01949350505050565b63ffffffff81811683821602808216919082811461446b5761446b614213565b505092915050565b8181038181111561098a5761098a614213565b60ff828116828216039081111561098a5761098a614213565b60208082526025908201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060408201526437bbb732b960d91b606082015260800190565b6000602082840312156144f657600080fd5b5051919050565b60006080823603121561450f57600080fd5b604051608081016001600160401b03828210818311171561453257614532613e53565b8160405261453f85613cd2565b83526020850135602084015260408501356040840152606085013591508082111561456957600080fd5b5061457636828601613e69565b60608301525092915050565b6000808335601e1984360301811261459957600080fd5b8301803591506001600160401b038211156145b357600080fd5b6020019150368190038213156136c157600080fd5b6000602082840312156145da57600080fd5b6119a882613cee565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b7f416363657373436f6e74726f6c3a206163636f756e74200000000000000000008152600083516146b8816017850160208801613d33565b7001034b99036b4b9b9b4b733903937b6329607d1b60179184019182015283516146e9816028840160208801613d33565b01602801949350505050565b634e487b7160e01b600052602160045260246000fd5b600181811c9082168061471f57607f821691505b602082108103613f5457634e487b7160e01b600052602260045260246000fd5b601f821115610bd757600081815260208120601f850160051c810160208610156147665750805b601f850160051c820191505b8181101561478557828155600101614772565b505050505050565b81516001600160401b038111156147a6576147a6613e53565b6147ba816147b4845461470b565b8461473f565b602080601f8311600181146147ef57600084156147d75750858301515b600019600386901b1c1916600185901b178555614785565b600085815260208120601f198616915b8281101561481e578886015182559484019460019091019084016147ff565b508582101561483c5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612f3290830184613d57565b60006020828403121561489157600080fd5b81516119a881613c9f565b808202811582820484141761098a5761098a614213565b6000816148c2576148c2614213565b506000190190565b600082516148dc818460208701613d33565b9190910192915050565b828152604060208201526000611ef56040830184613d57565b634e487b7160e01b600052603160045260246000fdfe6c4079fcac94e7142d8c209744c998efe53a188aadb7e55958f7ad3ea8a1d65268747470733a2f2f6b696e746f2e78797a2f6170692f76312f6e66742d6b696e746f2d69642f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220ea527462f9a55acdb96e43e2c0af177ef3023b34dd3a19f6add47f098f6ecb0364736f6c63430008120033000000000000000000", + "nonce": "0x10" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x02e7d7327761fac3fe83beefd23ecae331aade5d0d303861056cdf9f2dab8eb7", + "transactionType": "CALL", + "contractName": null, + "contractAddress": null, + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0xc1f4d15c16a1f3555e0a5f7aefd1e17ad4aaf40b", + "to": "0x8a4720488ca32f1223ccfe5a087e250fe3bc5d75", + "value": "0x0", + "data": "0x3659cfe6000000000000000000000000652c9b99f916beb42ccb7883a725e2f9219095b4", + "nonce": "0x3c" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x6bc0ebf4dca10e8817f37d144980b6908597ed327a05707ceda82f1398692959", + "transactionType": "CALL", + "contractName": null, + "contractAddress": null, + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0xc1f4d15c16a1f3555e0a5f7aefd1e17ad4aaf40b", + "to": "0xf369f78e3a0492cc4e96a90dae0728a38498e9c7", + "value": "0x0", + "data": "0x3659cfe60000000000000000000000002aa456d97fb8f75283327458920d4daa2bfe363e", + "nonce": "0x3d" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0x1aef06ade0c6712c96d108dc0f0d72053c1948a306e597624a3ca346b0a0e4a9", + "transactionIndex": "0x1", + "blockHash": "0xd478b838cff6e2863f74dc2be3b1c73f4d365164d1f135f650ab6d639dd2a12f", + "blockNumber": "0xa0", + "from": "0x660ad4B5A74130a4796B4d54BC6750Ae93C86e6c", + "to": "0x8a4720488CA32f1223ccFE5A087e250fE3BC5D75", + "cumulativeGasUsed": "0x35c1852", + "gasUsed": "0x35c1852", + "contractAddress": null, + "logs": [ + { + "address": "0x652c9b99f916beb42ccb7883a725E2f9219095B4", + "topics": [ + "0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000ff", + "blockHash": "0xd478b838cff6e2863f74dc2be3b1c73f4d365164d1f135f650ab6d639dd2a12f", + "blockNumber": "0xa0", + "transactionHash": "0x1aef06ade0c6712c96d108dc0f0d72053c1948a306e597624a3ca346b0a0e4a9", + "transactionIndex": "0x1", + "logIndex": "0x0", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000400000000000000000000000000000400000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x0", + "effectiveGasPrice": "0x5f5e100" + }, + { + "transactionHash": "0xe776c20bd6ff45148cf4e430bfc0065ce64768dd86280875bcce04f5a02566ab", + "transactionIndex": "0x1", + "blockHash": "0x08ec53e48af25b20b67beaa3c52beb00f509554023a8558444781b17c6e395f6", + "blockNumber": "0xa1", + "from": "0x660ad4B5A74130a4796B4d54BC6750Ae93C86e6c", + "to": "0x8a4720488CA32f1223ccFE5A087e250fE3BC5D75", + "cumulativeGasUsed": "0x518e3c1", + "gasUsed": "0x518e3c1", + "contractAddress": null, + "logs": [ + { + "address": "0x2AA456d97fB8f75283327458920D4daA2BFe363e", + "topics": [ + "0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000ff", + "blockHash": "0x08ec53e48af25b20b67beaa3c52beb00f509554023a8558444781b17c6e395f6", + "blockNumber": "0xa1", + "transactionHash": "0xe776c20bd6ff45148cf4e430bfc0065ce64768dd86280875bcce04f5a02566ab", + "transactionIndex": "0x1", + "logIndex": "0x0", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000004000000080000000000000000000000000400000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x0", + "effectiveGasPrice": "0x5f5e100" + }, + { + "transactionHash": "0x02e7d7327761fac3fe83beefd23ecae331aade5d0d303861056cdf9f2dab8eb7", + "transactionIndex": "0x1", + "blockHash": "0xdb66b20db333c97a3135e842354d7e9df20f5692690f818e5c68b0b86179d85b", + "blockNumber": "0xa2", + "from": "0xc1f4D15C16A1f3555E0a5F7AeFD1e17AD4aaf40B", + "to": "0x8a4720488CA32f1223ccFE5A087e250fE3BC5D75", + "cumulativeGasUsed": "0x115bfb", + "gasUsed": "0x115bfb", + "contractAddress": null, + "logs": [ + { + "address": "0x8a4720488CA32f1223ccFE5A087e250fE3BC5D75", + "topics": [ + "0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b", + "0x000000000000000000000000652c9b99f916beb42ccb7883a725e2f9219095b4" + ], + "data": "0x", + "blockHash": "0xdb66b20db333c97a3135e842354d7e9df20f5692690f818e5c68b0b86179d85b", + "blockNumber": "0xa2", + "transactionHash": "0x02e7d7327761fac3fe83beefd23ecae331aade5d0d303861056cdf9f2dab8eb7", + "transactionIndex": "0x1", + "logIndex": "0x0", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000100000000008000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000008000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000004000000000000000000000020000000000000000000000000000000000000000000000000", + "type": "0x0", + "effectiveGasPrice": "0x5f5e100" + }, + { + "transactionHash": "0x6bc0ebf4dca10e8817f37d144980b6908597ed327a05707ceda82f1398692959", + "transactionIndex": "0x1", + "blockHash": "0xe6a61403f3553a63620372bbec54a7098cc988b9e1f1be3c9c64e1122d881dcf", + "blockNumber": "0xa3", + "from": "0xc1f4D15C16A1f3555E0a5F7AeFD1e17AD4aaf40B", + "to": "0xf369f78E3A0492CC4e96a90dae0728A38498e9c7", + "cumulativeGasUsed": "0x115d20", + "gasUsed": "0x115d20", + "contractAddress": null, + "logs": [ + { + "address": "0xf369f78E3A0492CC4e96a90dae0728A38498e9c7", + "topics": [ + "0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b", + "0x0000000000000000000000002aa456d97fb8f75283327458920d4daa2bfe363e" + ], + "data": "0x", + "blockHash": "0xe6a61403f3553a63620372bbec54a7098cc988b9e1f1be3c9c64e1122d881dcf", + "blockNumber": "0xa3", + "transactionHash": "0x6bc0ebf4dca10e8817f37d144980b6908597ed327a05707ceda82f1398692959", + "transactionIndex": "0x1", + "logIndex": "0x0", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000004400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000002000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000020000000000000000000000000000400000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x0", + "effectiveGasPrice": "0x5f5e100" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1705336600, + "chain": 7887, + "multi": false, + "commit": "1101a79" +} \ No newline at end of file diff --git a/broadcast/15-faucet_v2.sol/7887/run-1705342190.json b/broadcast/15-faucet_v2.sol/7887/run-1705342190.json new file mode 100644 index 000000000..0422331c1 --- /dev/null +++ b/broadcast/15-faucet_v2.sol/7887/run-1705342190.json @@ -0,0 +1,337 @@ +{ + "transactions": [ + { + "hash": "0xb5706db127416b3221f08908c1a14b105ffb021bb2a304bf1295d5ed09a6812c", + "transactionType": "CALL", + "contractName": null, + "contractAddress": null, + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x660ad4b5a74130a4796b4d54bc6750ae93c86e6c", + "to": "0x8a4720488ca32f1223ccfe5a087e250fe3bc5d75", + "value": "0x0", + "data": "0x66d6e19b0000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f38000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000199a60c0604052306080523480156200001557600080fd5b506040516200197a3803806200197a833981016040819052620000389162000115565b6200004262000054565b6001600160a01b031660a05262000147565b600054610100900460ff1615620000c15760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff9081161462000113576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6000602082840312156200012857600080fd5b81516001600160a01b03811681146200014057600080fd5b9392505050565b60805160a0516117ea62000190600039600081816102a4015261058701526000818161065f0152818161069f0152818161073e0152818161077e015261081101526117ea6000f3fe6080604052600436106101025760003560e01c80637ecebe0011610095578063909d834d11610064578063909d834d1461028a578063c5c0369914610292578063c884ef83146102c6578063e9173036146102f6578063f2fde38b1461030b57600080fd5b80637ecebe00146102015780638129fc1c1461022e578063853828b6146102435780638da5cb5b1461025857600080fd5b80634f1ef286116100d15780634f1ef286146101a857806352d1902d146101bb578063715018a6146101d057806376697640146101e557600080fd5b806302fb0c5e1461010e578063270ef3851461013d5780633253f678146101665780633659cfe61461018857600080fd5b3661010957005b600080fd5b34801561011a57600080fd5b5060ca546101289060ff1681565b60405190151581526020015b60405180910390f35b34801561014957600080fd5b5061015866016bcc41e9000081565b604051908152602001610134565b34801561017257600080fd5b50610186610181366004611403565b61032b565b005b34801561019457600080fd5b506101866101a336600461145a565b610655565b6101866101b636600461148b565b610734565b3480156101c757600080fd5b50610158610804565b3480156101dc57600080fd5b506101866108b7565b3480156101f157600080fd5b50610158670de0b6b3a764000081565b34801561020d57600080fd5b5061015861021c36600461145a565b60cb6020526000908152604090205481565b34801561023a57600080fd5b506101866108cb565b34801561024f57600080fd5b506101866109ec565b34801561026457600080fd5b506097546001600160a01b03165b6040516001600160a01b039091168152602001610134565b610186610a2d565b34801561029e57600080fd5b506102727f000000000000000000000000000000000000000000000000000000000000000081565b3480156102d257600080fd5b506101286102e136600461145a565b60c96020526000908152604090205460ff1681565b34801561030257600080fd5b50610186610a9c565b34801561031757600080fd5b5061018661032636600461145a565b610aa5565b808060400135421061037c5760405162461bcd60e51b815260206004820152601560248201527414da59db985d1d5c99481a185cc8195e1c1a5c9959605a1b60448201526064015b60405180910390fd5b6020810180359060cb90600090610393908561145a565b6001600160a01b03166001600160a01b0316815260200190815260200160002054146103f15760405162461bcd60e51b815260206004820152600d60248201526c496e76616c6964204e6f6e636560981b6044820152606401610373565b60006104da610403602084018461145a565b30604085013560cb600061041a602089018961145a565b6001600160a01b0390811682526020808301939093526040918201600020548251968216938701939093529390931692840192909252606083015260808201524660a082015260c00160408051601f1981840301815290829052805160209182012061190160f01b918301919091526022820152604201604051602081830303815290604052805190602001207f19457468657265756d205369676e6564204d6573736167653a0a3332000000006000908152601c91909152603c902090565b905061053f816104ed606085018561154d565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061052f92505050602086018661145a565b6001600160a01b03169190610b1b565b61057c5760405162461bcd60e51b815260206004820152600e60248201526d24b73b30b634b21029b4b3b732b960911b6044820152606401610373565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105fe5760405162461bcd60e51b815260206004820152602160248201527f4f6e6c792077616c6c657420666163746f72792063616e2063616c6c207468696044820152607360f81b6064820152608401610373565b61061361060e602085018561145a565b610b7e565b60cb6000610624602086018661145a565b6001600160a01b031681526020810191909152604001600090812080549161064b83611594565b9190505550505050565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016300361069d5760405162461bcd60e51b8152600401610373906115bb565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166106e660008051602061176e833981519152546001600160a01b031690565b6001600160a01b03161461070c5760405162461bcd60e51b815260040161037390611607565b61071581610cec565b6040805160008082526020820190925261073191839190610d33565b50565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016300361077c5760405162461bcd60e51b8152600401610373906115bb565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166107c560008051602061176e833981519152546001600160a01b031690565b6001600160a01b0316146107eb5760405162461bcd60e51b815260040161037390611607565b6107f482610cec565b61080082826001610d33565b5050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146108a45760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c00000000000000006064820152608401610373565b5060008051602061176e83398151915290565b6108bf610ea3565b6108c96000610efd565b565b600054610100900460ff16158080156108eb5750600054600160ff909116105b806109055750303b158015610905575060005460ff166001145b6109685760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610373565b6000805460ff19166001179055801561098b576000805461ff0019166101001790555b610993610f4f565b61099b610f7e565b6109a433610efd565b8015610731576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150565b6109f4610ea3565b60405133904780156108fc02916000818181858888f19350505050158015610a20573d6000803e3d6000fd5b5060ca805460ff19169055565b610a35610ea3565b670de0b6b3a7640000471015610a8d5760405162461bcd60e51b815260206004820152601e60248201527f4e6f7420656e6f7567682045544820746f2073746172742066617563657400006044820152606401610373565b60ca805460ff19166001179055565b6108c933610b7e565b610aad610ea3565b6001600160a01b038116610b125760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610373565b61073181610efd565b6000806000610b2a8585610fa5565b90925090506000816004811115610b4357610b43611653565b148015610b615750856001600160a01b0316826001600160a01b0316145b80610b725750610b72868686610fea565b925050505b9392505050565b60ca5460ff16610bc75760405162461bcd60e51b8152602060048201526014602482015273466175636574206973206e6f742061637469766560601b6044820152606401610373565b6001600160a01b038116600090815260c9602052604090205460ff1615610c3f5760405162461bcd60e51b815260206004820152602660248201527f596f75206861766520616c726561647920636c61696d656420796f7572204b696044820152650dce8de8aa8960d31b6064820152608401610373565b6001600160a01b038116600081815260c96020526040808220805460ff191660011790555166016bcc41e900009082818181858883f19350505050158015610c8b573d6000803e3d6000fd5b5066016bcc41e90000471015610ca65760ca805460ff191690555b806001600160a01b03167f47cee97cb7acd717b3c0aa1435d004cd5b3c8c57d70dbceb4e4458bbd60e39d442604051610ce191815260200190565b60405180910390a250565b6097546001600160a01b031633146107315760405162461bcd60e51b815260206004820152600a60248201526937b7363c9037bbb732b960b11b6044820152606401610373565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff1615610d6b57610d66836110d6565b505050565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015610dc5575060408051601f3d908101601f19168201909252610dc291810190611669565b60015b610e285760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b6064820152608401610373565b60008051602061176e8339815191528114610e975760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b6064820152608401610373565b50610d66838383611172565b6097546001600160a01b031633146108c95760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610373565b609780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600054610100900460ff16610f765760405162461bcd60e51b815260040161037390611682565b6108c961119d565b600054610100900460ff166108c95760405162461bcd60e51b815260040161037390611682565b6000808251604103610fdb5760208301516040840151606085015160001a610fcf878285856111cd565b94509450505050610fe3565b506000905060025b9250929050565b6000806000856001600160a01b0316631626ba7e60e01b868660405160240161101492919061171d565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b0319909416939093179092529051611052919061173e565b600060405180830381855afa9150503d806000811461108d576040519150601f19603f3d011682016040523d82523d6000602084013e611092565b606091505b50915091508180156110a657506020815110155b8015610b7257508051630b135d3f60e11b906110cb9083016020908101908401611669565b149695505050505050565b6001600160a01b0381163b6111435760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401610373565b60008051602061176e83398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b61117b83611291565b6000825111806111885750805b15610d665761119783836112d1565b50505050565b600054610100900460ff166111c45760405162461bcd60e51b815260040161037390611682565b6108c933610efd565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156112045750600090506003611288565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015611258573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661128157600060019250925050611288565b9150600090505b94509492505050565b61129a816110d6565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606001600160a01b0383163b6113395760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b6064820152608401610373565b600080846001600160a01b031684604051611354919061173e565b600060405180830381855af49150503d806000811461138f576040519150601f19603f3d011682016040523d82523d6000602084013e611394565b606091505b50915091506113bc828260405180606001604052806027815260200161178e602791396113c5565b95945050505050565b606083156113d4575081610b77565b610b7783838151156113e95781518083602001fd5b8060405162461bcd60e51b8152600401610373919061175a565b60006020828403121561141557600080fd5b813567ffffffffffffffff81111561142c57600080fd5b820160808185031215610b7757600080fd5b80356001600160a01b038116811461145557600080fd5b919050565b60006020828403121561146c57600080fd5b610b778261143e565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561149e57600080fd5b6114a78361143e565b9150602083013567ffffffffffffffff808211156114c457600080fd5b818501915085601f8301126114d857600080fd5b8135818111156114ea576114ea611475565b604051601f8201601f19908116603f0116810190838211818310171561151257611512611475565b8160405282815288602084870101111561152b57600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b6000808335601e1984360301811261156457600080fd5b83018035915067ffffffffffffffff82111561157f57600080fd5b602001915036819003821315610fe357600080fd5b6000600182016115b457634e487b7160e01b600052601160045260246000fd5b5060010190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b6163746976652070726f787960a01b606082015260800190565b634e487b7160e01b600052602160045260246000fd5b60006020828403121561167b57600080fd5b5051919050565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b60005b838110156116e85781810151838201526020016116d0565b50506000910152565b600081518084526117098160208601602086016116cd565b601f01601f19169290920160200192915050565b82815260406020820152600061173660408301846116f1565b949350505050565b600082516117508184602087016116cd565b9190910192915050565b602081526000610b7760208301846116f156fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212203f8048dbbda85e3ebed5d2e31115f3bad409d55ad534214b70e1836c6f0d975764736f6c634300081200330000000000000000000000008a4720488ca32f1223ccfe5a087e250fe3bc5d75000000000000", + "nonce": "0x11", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x143fcf93ba99e9386bef055670644f8e2f574f9036aa70d7832d1aea1bb738e1", + "transactionType": "CALL", + "contractName": null, + "contractAddress": null, + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x660ad4b5a74130a4796b4d54bc6750ae93c86e6c", + "to": "0x8a4720488ca32f1223ccfe5a087e250fe3bc5d75", + "value": "0x0", + "data": "0x66d6e19b0000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f380000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000798608060405234801561001057600080fd5b5060405161073838038061073883398101604081905261002f9161032a565b818161003d82826000610046565b50505050610447565b61004f8361007c565b60008251118061005c5750805b156100775761007583836100bc60201b6100291760201c565b505b505050565b610085816100e8565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606100e18383604051806060016040528060278152602001610711602791396101ba565b9392505050565b6100fb8161023360201b6100551760201c565b6101625760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b60648201526084015b60405180910390fd5b806101997f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b61024260201b6100641760201c565b80546001600160a01b0319166001600160a01b039290921691909117905550565b6060600080856001600160a01b0316856040516101d791906103f8565b600060405180830381855af49150503d8060008114610212576040519150601f19603f3d011682016040523d82523d6000602084013e610217565b606091505b50909250905061022986838387610245565b9695505050505050565b6001600160a01b03163b151590565b90565b606083156102b45782516000036102ad576001600160a01b0385163b6102ad5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610159565b50816102be565b6102be83836102c6565b949350505050565b8151156102d65781518083602001fd5b8060405162461bcd60e51b81526004016101599190610414565b634e487b7160e01b600052604160045260246000fd5b60005b83811015610321578181015183820152602001610309565b50506000910152565b6000806040838503121561033d57600080fd5b82516001600160a01b038116811461035457600080fd5b60208401519092506001600160401b038082111561037157600080fd5b818501915085601f83011261038557600080fd5b815181811115610397576103976102f0565b604051601f8201601f19908116603f011681019083821181831017156103bf576103bf6102f0565b816040528281528860208487010111156103d857600080fd5b6103e9836020830160208801610306565b80955050505050509250929050565b6000825161040a818460208701610306565b9190910192915050565b6020815260008251806020840152610433816040850160208701610306565b601f01601f19169190910160400192915050565b6102bb806104566000396000f3fe60806040523661001357610011610017565b005b6100115b610027610022610067565b61009f565b565b606061004e838360405180606001604052806027815260200161025f602791396100c3565b9392505050565b6001600160a01b03163b151590565b90565b600061009a7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b3660008037600080366000845af43d6000803e8080156100be573d6000f35b3d6000fd5b6060600080856001600160a01b0316856040516100e0919061020f565b600060405180830381855af49150503d806000811461011b576040519150601f19603f3d011682016040523d82523d6000602084013e610120565b606091505b50915091506101318683838761013b565b9695505050505050565b606083156101af5782516000036101a8576001600160a01b0385163b6101a85760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064015b60405180910390fd5b50816101b9565b6101b983836101c1565b949350505050565b8151156101d15781518083602001fd5b8060405162461bcd60e51b815260040161019f919061022b565b60005b838110156102065781810151838201526020016101ee565b50506000910152565b600082516102218184602087016101eb565b9190910192915050565b602081526000825180602084015261024a8160408501602087016101eb565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212203a5f5ea9c654f7b8dbde04d4e283fcec607ed5d6102e340c8ec9eee20bb61f4064736f6c63430008120033416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564000000000000000000000000b2f4c8e6d336db09731a4d08bc087838b4841b06000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "nonce": "0x12", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xe6b112ca5a4d44b22d429cd75194cdbfc0aaf2f8152b02118b891090daa5e314", + "transactionType": "CALL", + "contractName": null, + "contractAddress": null, + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x660ad4b5a74130a4796b4d54bc6750ae93c86e6c", + "to": "0x8a4720488ca32f1223ccfe5a087e250fe3bc5d75", + "value": "0xde0b6b3a7640000", + "data": "0xed97bab30000000000000000000000002e2b1c42e38f5af81771e65d87729e57abd1337a", + "nonce": "0x13", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xc8f525d188fe95a37a50731e477da3aef28eb83154359dc71262e3d0887f3664", + "transactionType": "CALL", + "contractName": null, + "contractAddress": null, + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x660ad4b5a74130a4796b4d54bc6750ae93c86e6c", + "to": "0x1842a4eff3efd24c50b63c3cf89cecee245fc2bd", + "value": "0x16345785d8a0000", + "data": "0x0993969a0000000000000000000000000719d47a213149e2ef8d3f5afdada8a8e22dfc03", + "nonce": "0x14", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xdc009f3e21a594d726884d117565a39b19c40cbe86a7d863e0e2e4844a48ecb5", + "transactionType": "CALL", + "contractName": null, + "contractAddress": null, + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x660ad4b5a74130a4796b4d54bc6750ae93c86e6c", + "to": "0x2843c269d2a64ecfa63548e8b3fc0fd23b7f70cb", + "value": "0x0", + "data": "0x1fad948c0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000660ad4b5a74130a4796b4d54bc6750ae93c86e6c00000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000044000000000000000000000000000000000000000000000000000000000000007600000000000000000000000002e2b1c42e38f5af81771e65d87729e57abd1337a00000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000003d0900000000000000000000000000000000000000000000000000000000000003345000000000000000000000000000000000000000000000000000000000000052080000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000003b9aca000000000000000000000000000000000000000000000000000000000000000320000000000000000000000000000000000000000000000000000000000000036000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000164b61d27f60000000000000000000000002e2b1c42e38f5af81771e65d87729e57abd1337a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000c45f9d23010000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000719d47a213149e2ef8d3f5afdada8a8e22dfc0300000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000141842a4eff3efd24c50b63c3cf89cecee245fc2bd0000000000000000000000000000000000000000000000000000000000000000000000000000000000000041dab62882a5627150e74cbe26be3a5edfc8a34b92fae0a2f8952bd12835e2342a469d86b6104b6dcaac0bab78914674879b129bea7e09da29bf35be3a1b7e90351b000000000000000000000000000000000000000000000000000000000000000000000000000000000000002e2b1c42e38f5af81771e65d87729e57abd1337a00000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000003d0900000000000000000000000000000000000000000000000000000000000003345000000000000000000000000000000000000000000000000000000000000052080000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000003b9aca00000000000000000000000000000000000000000000000000000000000000026000000000000000000000000000000000000000000000000000000000000002a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a4b61d27f60000000000000000000000000719d47a213149e2ef8d3f5afdada8a8e22dfc030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000048129fc1c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000141842a4eff3efd24c50b63c3cf89cecee245fc2bd00000000000000000000000000000000000000000000000000000000000000000000000000000000000000414cba3187a3616b83dab6dff726d8df92edca4cbbbf98f7c493bb9eeb541d4031102b194077b47fcf8989bb375d15acc5443695d4760e22dace907172b864d1d51b000000000000000000000000000000000000000000000000000000000000000000000000000000000000002e2b1c42e38f5af81771e65d87729e57abd1337a00000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000003d0900000000000000000000000000000000000000000000000000000000000003345000000000000000000000000000000000000000000000000000000000000052080000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000003b9aca00000000000000000000000000000000000000000000000000000000000000026000000000000000000000000000000000000000000000000000000000000002a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a4b61d27f60000000000000000000000000719d47a213149e2ef8d3f5afdada8a8e22dfc030000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000004909d834d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000141842a4eff3efd24c50b63c3cf89cecee245fc2bd00000000000000000000000000000000000000000000000000000000000000000000000000000000000000419341335b23684e09113844e60c2131299ceffe69c0421c93e993f8dfc560355e4136b682a8280326b088c5104782392586b2d5ea883228ef1c80805312632cf21b00000000000000000000000000000000000000000000000000000000000000", + "nonce": "0x15", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0xb5706db127416b3221f08908c1a14b105ffb021bb2a304bf1295d5ed09a6812c", + "transactionIndex": "0x1", + "blockHash": "0xd47cece0b10447a65f3698cebf7c10fb513417cb5f5f43224891e6e6e071ded3", + "blockNumber": "0xa8", + "from": "0x660ad4B5A74130a4796B4d54BC6750Ae93C86e6c", + "to": "0x8a4720488CA32f1223ccFE5A087e250fE3BC5D75", + "cumulativeGasUsed": "0x1f2ff33", + "gasUsed": "0x1f2ff33", + "contractAddress": null, + "logs": [ + { + "address": "0xB2f4c8E6D336DB09731A4D08BC087838b4841b06", + "topics": [ + "0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000ff", + "blockHash": "0xd47cece0b10447a65f3698cebf7c10fb513417cb5f5f43224891e6e6e071ded3", + "blockNumber": "0xa8", + "transactionHash": "0xb5706db127416b3221f08908c1a14b105ffb021bb2a304bf1295d5ed09a6812c", + "transactionIndex": "0x1", + "logIndex": "0x0", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x02000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0x5f5e100" + }, + { + "transactionHash": "0x143fcf93ba99e9386bef055670644f8e2f574f9036aa70d7832d1aea1bb738e1", + "transactionIndex": "0x1", + "blockHash": "0xa01ff87029dee301df463f14cb5f1f96ab1569bb959f34f55d3a0b5a1a4cd197", + "blockNumber": "0xa9", + "from": "0x660ad4B5A74130a4796B4d54BC6750Ae93C86e6c", + "to": "0x8a4720488CA32f1223ccFE5A087e250fE3BC5D75", + "cumulativeGasUsed": "0xb15984", + "gasUsed": "0xb15984", + "contractAddress": null, + "logs": [ + { + "address": "0x0719D47A213149E2Ef8d3f5afDaDA8a8E22dfc03", + "topics": [ + "0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b", + "0x000000000000000000000000b2f4c8e6d336db09731a4d08bc087838b4841b06" + ], + "data": "0x", + "blockHash": "0xa01ff87029dee301df463f14cb5f1f96ab1569bb959f34f55d3a0b5a1a4cd197", + "blockNumber": "0xa9", + "transactionHash": "0x143fcf93ba99e9386bef055670644f8e2f574f9036aa70d7832d1aea1bb738e1", + "transactionIndex": "0x1", + "logIndex": "0x0", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000400000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000100000000000000000000100000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0x5f5e100" + }, + { + "transactionHash": "0xe6b112ca5a4d44b22d429cd75194cdbfc0aaf2f8152b02118b891090daa5e314", + "transactionIndex": "0x1", + "blockHash": "0xc55e12a1fee1a97e9d4fbc718eb03e8ae60026dcd27398ee71c5ebb18a1cd053", + "blockNumber": "0xaa", + "from": "0x660ad4B5A74130a4796B4d54BC6750Ae93C86e6c", + "to": "0x8a4720488CA32f1223ccFE5A087e250fE3BC5D75", + "cumulativeGasUsed": "0x13bb42", + "gasUsed": "0x13bb42", + "contractAddress": null, + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0x5f5e100" + }, + { + "transactionHash": "0xc8f525d188fe95a37a50731e477da3aef28eb83154359dc71262e3d0887f3664", + "transactionIndex": "0x1", + "blockHash": "0x9afddd6b82b84a8d36256abede9699527ee8b7961047917d0a823236fc482f3d", + "blockNumber": "0xab", + "from": "0x660ad4B5A74130a4796B4d54BC6750Ae93C86e6c", + "to": "0x1842a4EFf3eFd24c50B63c3CF89cECEe245Fc2bd", + "cumulativeGasUsed": "0x139edd", + "gasUsed": "0x139edd", + "contractAddress": null, + "logs": [ + { + "address": "0x2843C269D2a64eCfA63548E8B3Fc0FD23B7F70cb", + "topics": [ + "0x2da466a7b24304f47e87fa2e1e5a81b9831ce54fec19055ce277ca2f39ba42c4", + "0x0000000000000000000000001842a4eff3efd24c50b63c3cf89cecee245fc2bd" + ], + "data": "0x000000000000000000000000000000000000000000000000058d15e17606a615", + "blockHash": "0x9afddd6b82b84a8d36256abede9699527ee8b7961047917d0a823236fc482f3d", + "blockNumber": "0xab", + "transactionHash": "0xc8f525d188fe95a37a50731e477da3aef28eb83154359dc71262e3d0887f3664", + "transactionIndex": "0x1", + "logIndex": "0x0", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x40000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200800000000000000000000000000000000002000000000000000000000000200000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0x5f5e100" + }, + { + "transactionHash": "0xdc009f3e21a594d726884d117565a39b19c40cbe86a7d863e0e2e4844a48ecb5", + "transactionIndex": "0x1", + "blockHash": "0xe6599a9ca54ea7a7477616d3a66d4d7b6491a4a045460136863e31761a3bc661", + "blockNumber": "0xac", + "from": "0x660ad4B5A74130a4796B4d54BC6750Ae93C86e6c", + "to": "0x2843C269D2a64eCfA63548E8B3Fc0FD23B7F70cb", + "cumulativeGasUsed": "0x6a4e8b", + "gasUsed": "0x6a4e8b", + "contractAddress": null, + "logs": [ + { + "address": "0x2843C269D2a64eCfA63548E8B3Fc0FD23B7F70cb", + "topics": [ + "0xbb47ee3e183a558b1a2ff0874b079f3fc5478b7454eacf2bfc5af2ff5878f972" + ], + "data": "0x", + "blockHash": "0xe6599a9ca54ea7a7477616d3a66d4d7b6491a4a045460136863e31761a3bc661", + "blockNumber": "0xac", + "transactionHash": "0xdc009f3e21a594d726884d117565a39b19c40cbe86a7d863e0e2e4844a48ecb5", + "transactionIndex": "0x1", + "logIndex": "0x0", + "removed": false + }, + { + "address": "0x2843C269D2a64eCfA63548E8B3Fc0FD23B7F70cb", + "topics": [ + "0x49628fd1471006c1482da88028e9ce4dbb080b815c9b0344d39e5a8e6ec1419f", + "0x5f529e5437767614d9106692fac2cded5993e02ebbc642e600996dd6acf79089", + "0x0000000000000000000000002e2b1c42e38f5af81771e65d87729e57abd1337a", + "0x0000000000000000000000001842a4eff3efd24c50b63c3cf89cecee245fc2bd" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000009b952000000000000000000000000000000000000000000000000000000000009b952", + "blockHash": "0xe6599a9ca54ea7a7477616d3a66d4d7b6491a4a045460136863e31761a3bc661", + "blockNumber": "0xac", + "transactionHash": "0xdc009f3e21a594d726884d117565a39b19c40cbe86a7d863e0e2e4844a48ecb5", + "transactionIndex": "0x1", + "logIndex": "0x1", + "removed": false + }, + { + "address": "0x0719D47A213149E2Ef8d3f5afDaDA8a8E22dfc03", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000002e2b1c42e38f5af81771e65d87729e57abd1337a" + ], + "data": "0x", + "blockHash": "0xe6599a9ca54ea7a7477616d3a66d4d7b6491a4a045460136863e31761a3bc661", + "blockNumber": "0xac", + "transactionHash": "0xdc009f3e21a594d726884d117565a39b19c40cbe86a7d863e0e2e4844a48ecb5", + "transactionIndex": "0x1", + "logIndex": "0x2", + "removed": false + }, + { + "address": "0x0719D47A213149E2Ef8d3f5afDaDA8a8E22dfc03", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000002e2b1c42e38f5af81771e65d87729e57abd1337a", + "0x0000000000000000000000002e2b1c42e38f5af81771e65d87729e57abd1337a" + ], + "data": "0x", + "blockHash": "0xe6599a9ca54ea7a7477616d3a66d4d7b6491a4a045460136863e31761a3bc661", + "blockNumber": "0xac", + "transactionHash": "0xdc009f3e21a594d726884d117565a39b19c40cbe86a7d863e0e2e4844a48ecb5", + "transactionIndex": "0x1", + "logIndex": "0x3", + "removed": false + }, + { + "address": "0x0719D47A213149E2Ef8d3f5afDaDA8a8E22dfc03", + "topics": [ + "0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498" + ], + "data": "0x0000000000000000000000000000000000000000000000000000000000000001", + "blockHash": "0xe6599a9ca54ea7a7477616d3a66d4d7b6491a4a045460136863e31761a3bc661", + "blockNumber": "0xac", + "transactionHash": "0xdc009f3e21a594d726884d117565a39b19c40cbe86a7d863e0e2e4844a48ecb5", + "transactionIndex": "0x1", + "logIndex": "0x4", + "removed": false + }, + { + "address": "0x2843C269D2a64eCfA63548E8B3Fc0FD23B7F70cb", + "topics": [ + "0x49628fd1471006c1482da88028e9ce4dbb080b815c9b0344d39e5a8e6ec1419f", + "0xca701f9dacc32341fba37afc891eefabd1d29dfaa0cfaebd94ed7d460b183ce0", + "0x0000000000000000000000002e2b1c42e38f5af81771e65d87729e57abd1337a", + "0x0000000000000000000000001842a4eff3efd24c50b63c3cf89cecee245fc2bd" + ], + "data": "0x0000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000a338e00000000000000000000000000000000000000000000000000000000000a338e", + "blockHash": "0xe6599a9ca54ea7a7477616d3a66d4d7b6491a4a045460136863e31761a3bc661", + "blockNumber": "0xac", + "transactionHash": "0xdc009f3e21a594d726884d117565a39b19c40cbe86a7d863e0e2e4844a48ecb5", + "transactionIndex": "0x1", + "logIndex": "0x5", + "removed": false + }, + { + "address": "0x2843C269D2a64eCfA63548E8B3Fc0FD23B7F70cb", + "topics": [ + "0x49628fd1471006c1482da88028e9ce4dbb080b815c9b0344d39e5a8e6ec1419f", + "0xe95fc85773d20871e2d14136cd58397b85d14177eb1d5d0190a5650cf542d043", + "0x0000000000000000000000002e2b1c42e38f5af81771e65d87729e57abd1337a", + "0x0000000000000000000000001842a4eff3efd24c50b63c3cf89cecee245fc2bd" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000007e799000000000000000000000000000000000000000000000000000000000007e799", + "blockHash": "0xe6599a9ca54ea7a7477616d3a66d4d7b6491a4a045460136863e31761a3bc661", + "blockNumber": "0xac", + "transactionHash": "0xdc009f3e21a594d726884d117565a39b19c40cbe86a7d863e0e2e4844a48ecb5", + "transactionIndex": "0x1", + "logIndex": "0x6", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x40000000000000000000000100004000000000000000000000800000000000000008000000000000000000010000000000000000000000004000020000000000000000000000000000000000000000000001000000800000000000000000000800000000020000010000000000000800002000000000000000000000000000400000000000000000000100000000800000000008000080000000000000000020000400000000000000400000000400000004000000000000000002000000000000000000000000100001000000040000000000000002000000000000000020000001000000410000000000000000000000000000000000000040000000000000", + "type": "0x2", + "effectiveGasPrice": "0x5f5e100" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1705342190, + "chain": 7887, + "multi": false, + "commit": "aa8d15e" +} \ No newline at end of file diff --git a/broadcast/15-faucet_v2.sol/7887/run-latest.json b/broadcast/15-faucet_v2.sol/7887/run-latest.json new file mode 100644 index 000000000..0422331c1 --- /dev/null +++ b/broadcast/15-faucet_v2.sol/7887/run-latest.json @@ -0,0 +1,337 @@ +{ + "transactions": [ + { + "hash": "0xb5706db127416b3221f08908c1a14b105ffb021bb2a304bf1295d5ed09a6812c", + "transactionType": "CALL", + "contractName": null, + "contractAddress": null, + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x660ad4b5a74130a4796b4d54bc6750ae93c86e6c", + "to": "0x8a4720488ca32f1223ccfe5a087e250fe3bc5d75", + "value": "0x0", + "data": "0x66d6e19b0000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f38000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000199a60c0604052306080523480156200001557600080fd5b506040516200197a3803806200197a833981016040819052620000389162000115565b6200004262000054565b6001600160a01b031660a05262000147565b600054610100900460ff1615620000c15760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff9081161462000113576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6000602082840312156200012857600080fd5b81516001600160a01b03811681146200014057600080fd5b9392505050565b60805160a0516117ea62000190600039600081816102a4015261058701526000818161065f0152818161069f0152818161073e0152818161077e015261081101526117ea6000f3fe6080604052600436106101025760003560e01c80637ecebe0011610095578063909d834d11610064578063909d834d1461028a578063c5c0369914610292578063c884ef83146102c6578063e9173036146102f6578063f2fde38b1461030b57600080fd5b80637ecebe00146102015780638129fc1c1461022e578063853828b6146102435780638da5cb5b1461025857600080fd5b80634f1ef286116100d15780634f1ef286146101a857806352d1902d146101bb578063715018a6146101d057806376697640146101e557600080fd5b806302fb0c5e1461010e578063270ef3851461013d5780633253f678146101665780633659cfe61461018857600080fd5b3661010957005b600080fd5b34801561011a57600080fd5b5060ca546101289060ff1681565b60405190151581526020015b60405180910390f35b34801561014957600080fd5b5061015866016bcc41e9000081565b604051908152602001610134565b34801561017257600080fd5b50610186610181366004611403565b61032b565b005b34801561019457600080fd5b506101866101a336600461145a565b610655565b6101866101b636600461148b565b610734565b3480156101c757600080fd5b50610158610804565b3480156101dc57600080fd5b506101866108b7565b3480156101f157600080fd5b50610158670de0b6b3a764000081565b34801561020d57600080fd5b5061015861021c36600461145a565b60cb6020526000908152604090205481565b34801561023a57600080fd5b506101866108cb565b34801561024f57600080fd5b506101866109ec565b34801561026457600080fd5b506097546001600160a01b03165b6040516001600160a01b039091168152602001610134565b610186610a2d565b34801561029e57600080fd5b506102727f000000000000000000000000000000000000000000000000000000000000000081565b3480156102d257600080fd5b506101286102e136600461145a565b60c96020526000908152604090205460ff1681565b34801561030257600080fd5b50610186610a9c565b34801561031757600080fd5b5061018661032636600461145a565b610aa5565b808060400135421061037c5760405162461bcd60e51b815260206004820152601560248201527414da59db985d1d5c99481a185cc8195e1c1a5c9959605a1b60448201526064015b60405180910390fd5b6020810180359060cb90600090610393908561145a565b6001600160a01b03166001600160a01b0316815260200190815260200160002054146103f15760405162461bcd60e51b815260206004820152600d60248201526c496e76616c6964204e6f6e636560981b6044820152606401610373565b60006104da610403602084018461145a565b30604085013560cb600061041a602089018961145a565b6001600160a01b0390811682526020808301939093526040918201600020548251968216938701939093529390931692840192909252606083015260808201524660a082015260c00160408051601f1981840301815290829052805160209182012061190160f01b918301919091526022820152604201604051602081830303815290604052805190602001207f19457468657265756d205369676e6564204d6573736167653a0a3332000000006000908152601c91909152603c902090565b905061053f816104ed606085018561154d565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061052f92505050602086018661145a565b6001600160a01b03169190610b1b565b61057c5760405162461bcd60e51b815260206004820152600e60248201526d24b73b30b634b21029b4b3b732b960911b6044820152606401610373565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105fe5760405162461bcd60e51b815260206004820152602160248201527f4f6e6c792077616c6c657420666163746f72792063616e2063616c6c207468696044820152607360f81b6064820152608401610373565b61061361060e602085018561145a565b610b7e565b60cb6000610624602086018661145a565b6001600160a01b031681526020810191909152604001600090812080549161064b83611594565b9190505550505050565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016300361069d5760405162461bcd60e51b8152600401610373906115bb565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166106e660008051602061176e833981519152546001600160a01b031690565b6001600160a01b03161461070c5760405162461bcd60e51b815260040161037390611607565b61071581610cec565b6040805160008082526020820190925261073191839190610d33565b50565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016300361077c5760405162461bcd60e51b8152600401610373906115bb565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166107c560008051602061176e833981519152546001600160a01b031690565b6001600160a01b0316146107eb5760405162461bcd60e51b815260040161037390611607565b6107f482610cec565b61080082826001610d33565b5050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146108a45760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c00000000000000006064820152608401610373565b5060008051602061176e83398151915290565b6108bf610ea3565b6108c96000610efd565b565b600054610100900460ff16158080156108eb5750600054600160ff909116105b806109055750303b158015610905575060005460ff166001145b6109685760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610373565b6000805460ff19166001179055801561098b576000805461ff0019166101001790555b610993610f4f565b61099b610f7e565b6109a433610efd565b8015610731576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150565b6109f4610ea3565b60405133904780156108fc02916000818181858888f19350505050158015610a20573d6000803e3d6000fd5b5060ca805460ff19169055565b610a35610ea3565b670de0b6b3a7640000471015610a8d5760405162461bcd60e51b815260206004820152601e60248201527f4e6f7420656e6f7567682045544820746f2073746172742066617563657400006044820152606401610373565b60ca805460ff19166001179055565b6108c933610b7e565b610aad610ea3565b6001600160a01b038116610b125760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610373565b61073181610efd565b6000806000610b2a8585610fa5565b90925090506000816004811115610b4357610b43611653565b148015610b615750856001600160a01b0316826001600160a01b0316145b80610b725750610b72868686610fea565b925050505b9392505050565b60ca5460ff16610bc75760405162461bcd60e51b8152602060048201526014602482015273466175636574206973206e6f742061637469766560601b6044820152606401610373565b6001600160a01b038116600090815260c9602052604090205460ff1615610c3f5760405162461bcd60e51b815260206004820152602660248201527f596f75206861766520616c726561647920636c61696d656420796f7572204b696044820152650dce8de8aa8960d31b6064820152608401610373565b6001600160a01b038116600081815260c96020526040808220805460ff191660011790555166016bcc41e900009082818181858883f19350505050158015610c8b573d6000803e3d6000fd5b5066016bcc41e90000471015610ca65760ca805460ff191690555b806001600160a01b03167f47cee97cb7acd717b3c0aa1435d004cd5b3c8c57d70dbceb4e4458bbd60e39d442604051610ce191815260200190565b60405180910390a250565b6097546001600160a01b031633146107315760405162461bcd60e51b815260206004820152600a60248201526937b7363c9037bbb732b960b11b6044820152606401610373565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff1615610d6b57610d66836110d6565b505050565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015610dc5575060408051601f3d908101601f19168201909252610dc291810190611669565b60015b610e285760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b6064820152608401610373565b60008051602061176e8339815191528114610e975760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b6064820152608401610373565b50610d66838383611172565b6097546001600160a01b031633146108c95760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610373565b609780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600054610100900460ff16610f765760405162461bcd60e51b815260040161037390611682565b6108c961119d565b600054610100900460ff166108c95760405162461bcd60e51b815260040161037390611682565b6000808251604103610fdb5760208301516040840151606085015160001a610fcf878285856111cd565b94509450505050610fe3565b506000905060025b9250929050565b6000806000856001600160a01b0316631626ba7e60e01b868660405160240161101492919061171d565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b0319909416939093179092529051611052919061173e565b600060405180830381855afa9150503d806000811461108d576040519150601f19603f3d011682016040523d82523d6000602084013e611092565b606091505b50915091508180156110a657506020815110155b8015610b7257508051630b135d3f60e11b906110cb9083016020908101908401611669565b149695505050505050565b6001600160a01b0381163b6111435760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401610373565b60008051602061176e83398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b61117b83611291565b6000825111806111885750805b15610d665761119783836112d1565b50505050565b600054610100900460ff166111c45760405162461bcd60e51b815260040161037390611682565b6108c933610efd565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156112045750600090506003611288565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015611258573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661128157600060019250925050611288565b9150600090505b94509492505050565b61129a816110d6565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606001600160a01b0383163b6113395760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b6064820152608401610373565b600080846001600160a01b031684604051611354919061173e565b600060405180830381855af49150503d806000811461138f576040519150601f19603f3d011682016040523d82523d6000602084013e611394565b606091505b50915091506113bc828260405180606001604052806027815260200161178e602791396113c5565b95945050505050565b606083156113d4575081610b77565b610b7783838151156113e95781518083602001fd5b8060405162461bcd60e51b8152600401610373919061175a565b60006020828403121561141557600080fd5b813567ffffffffffffffff81111561142c57600080fd5b820160808185031215610b7757600080fd5b80356001600160a01b038116811461145557600080fd5b919050565b60006020828403121561146c57600080fd5b610b778261143e565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561149e57600080fd5b6114a78361143e565b9150602083013567ffffffffffffffff808211156114c457600080fd5b818501915085601f8301126114d857600080fd5b8135818111156114ea576114ea611475565b604051601f8201601f19908116603f0116810190838211818310171561151257611512611475565b8160405282815288602084870101111561152b57600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b6000808335601e1984360301811261156457600080fd5b83018035915067ffffffffffffffff82111561157f57600080fd5b602001915036819003821315610fe357600080fd5b6000600182016115b457634e487b7160e01b600052601160045260246000fd5b5060010190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b6163746976652070726f787960a01b606082015260800190565b634e487b7160e01b600052602160045260246000fd5b60006020828403121561167b57600080fd5b5051919050565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b60005b838110156116e85781810151838201526020016116d0565b50506000910152565b600081518084526117098160208601602086016116cd565b601f01601f19169290920160200192915050565b82815260406020820152600061173660408301846116f1565b949350505050565b600082516117508184602087016116cd565b9190910192915050565b602081526000610b7760208301846116f156fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212203f8048dbbda85e3ebed5d2e31115f3bad409d55ad534214b70e1836c6f0d975764736f6c634300081200330000000000000000000000008a4720488ca32f1223ccfe5a087e250fe3bc5d75000000000000", + "nonce": "0x11", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x143fcf93ba99e9386bef055670644f8e2f574f9036aa70d7832d1aea1bb738e1", + "transactionType": "CALL", + "contractName": null, + "contractAddress": null, + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x660ad4b5a74130a4796b4d54bc6750ae93c86e6c", + "to": "0x8a4720488ca32f1223ccfe5a087e250fe3bc5d75", + "value": "0x0", + "data": "0x66d6e19b0000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f380000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000798608060405234801561001057600080fd5b5060405161073838038061073883398101604081905261002f9161032a565b818161003d82826000610046565b50505050610447565b61004f8361007c565b60008251118061005c5750805b156100775761007583836100bc60201b6100291760201c565b505b505050565b610085816100e8565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606100e18383604051806060016040528060278152602001610711602791396101ba565b9392505050565b6100fb8161023360201b6100551760201c565b6101625760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b60648201526084015b60405180910390fd5b806101997f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b61024260201b6100641760201c565b80546001600160a01b0319166001600160a01b039290921691909117905550565b6060600080856001600160a01b0316856040516101d791906103f8565b600060405180830381855af49150503d8060008114610212576040519150601f19603f3d011682016040523d82523d6000602084013e610217565b606091505b50909250905061022986838387610245565b9695505050505050565b6001600160a01b03163b151590565b90565b606083156102b45782516000036102ad576001600160a01b0385163b6102ad5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610159565b50816102be565b6102be83836102c6565b949350505050565b8151156102d65781518083602001fd5b8060405162461bcd60e51b81526004016101599190610414565b634e487b7160e01b600052604160045260246000fd5b60005b83811015610321578181015183820152602001610309565b50506000910152565b6000806040838503121561033d57600080fd5b82516001600160a01b038116811461035457600080fd5b60208401519092506001600160401b038082111561037157600080fd5b818501915085601f83011261038557600080fd5b815181811115610397576103976102f0565b604051601f8201601f19908116603f011681019083821181831017156103bf576103bf6102f0565b816040528281528860208487010111156103d857600080fd5b6103e9836020830160208801610306565b80955050505050509250929050565b6000825161040a818460208701610306565b9190910192915050565b6020815260008251806020840152610433816040850160208701610306565b601f01601f19169190910160400192915050565b6102bb806104566000396000f3fe60806040523661001357610011610017565b005b6100115b610027610022610067565b61009f565b565b606061004e838360405180606001604052806027815260200161025f602791396100c3565b9392505050565b6001600160a01b03163b151590565b90565b600061009a7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b3660008037600080366000845af43d6000803e8080156100be573d6000f35b3d6000fd5b6060600080856001600160a01b0316856040516100e0919061020f565b600060405180830381855af49150503d806000811461011b576040519150601f19603f3d011682016040523d82523d6000602084013e610120565b606091505b50915091506101318683838761013b565b9695505050505050565b606083156101af5782516000036101a8576001600160a01b0385163b6101a85760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064015b60405180910390fd5b50816101b9565b6101b983836101c1565b949350505050565b8151156101d15781518083602001fd5b8060405162461bcd60e51b815260040161019f919061022b565b60005b838110156102065781810151838201526020016101ee565b50506000910152565b600082516102218184602087016101eb565b9190910192915050565b602081526000825180602084015261024a8160408501602087016101eb565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212203a5f5ea9c654f7b8dbde04d4e283fcec607ed5d6102e340c8ec9eee20bb61f4064736f6c63430008120033416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564000000000000000000000000b2f4c8e6d336db09731a4d08bc087838b4841b06000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "nonce": "0x12", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xe6b112ca5a4d44b22d429cd75194cdbfc0aaf2f8152b02118b891090daa5e314", + "transactionType": "CALL", + "contractName": null, + "contractAddress": null, + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x660ad4b5a74130a4796b4d54bc6750ae93c86e6c", + "to": "0x8a4720488ca32f1223ccfe5a087e250fe3bc5d75", + "value": "0xde0b6b3a7640000", + "data": "0xed97bab30000000000000000000000002e2b1c42e38f5af81771e65d87729e57abd1337a", + "nonce": "0x13", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xc8f525d188fe95a37a50731e477da3aef28eb83154359dc71262e3d0887f3664", + "transactionType": "CALL", + "contractName": null, + "contractAddress": null, + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x660ad4b5a74130a4796b4d54bc6750ae93c86e6c", + "to": "0x1842a4eff3efd24c50b63c3cf89cecee245fc2bd", + "value": "0x16345785d8a0000", + "data": "0x0993969a0000000000000000000000000719d47a213149e2ef8d3f5afdada8a8e22dfc03", + "nonce": "0x14", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xdc009f3e21a594d726884d117565a39b19c40cbe86a7d863e0e2e4844a48ecb5", + "transactionType": "CALL", + "contractName": null, + "contractAddress": null, + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x660ad4b5a74130a4796b4d54bc6750ae93c86e6c", + "to": "0x2843c269d2a64ecfa63548e8b3fc0fd23b7f70cb", + "value": "0x0", + "data": "0x1fad948c0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000660ad4b5a74130a4796b4d54bc6750ae93c86e6c00000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000044000000000000000000000000000000000000000000000000000000000000007600000000000000000000000002e2b1c42e38f5af81771e65d87729e57abd1337a00000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000003d0900000000000000000000000000000000000000000000000000000000000003345000000000000000000000000000000000000000000000000000000000000052080000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000003b9aca000000000000000000000000000000000000000000000000000000000000000320000000000000000000000000000000000000000000000000000000000000036000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000164b61d27f60000000000000000000000002e2b1c42e38f5af81771e65d87729e57abd1337a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000c45f9d23010000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000719d47a213149e2ef8d3f5afdada8a8e22dfc0300000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000141842a4eff3efd24c50b63c3cf89cecee245fc2bd0000000000000000000000000000000000000000000000000000000000000000000000000000000000000041dab62882a5627150e74cbe26be3a5edfc8a34b92fae0a2f8952bd12835e2342a469d86b6104b6dcaac0bab78914674879b129bea7e09da29bf35be3a1b7e90351b000000000000000000000000000000000000000000000000000000000000000000000000000000000000002e2b1c42e38f5af81771e65d87729e57abd1337a00000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000003d0900000000000000000000000000000000000000000000000000000000000003345000000000000000000000000000000000000000000000000000000000000052080000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000003b9aca00000000000000000000000000000000000000000000000000000000000000026000000000000000000000000000000000000000000000000000000000000002a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a4b61d27f60000000000000000000000000719d47a213149e2ef8d3f5afdada8a8e22dfc030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000048129fc1c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000141842a4eff3efd24c50b63c3cf89cecee245fc2bd00000000000000000000000000000000000000000000000000000000000000000000000000000000000000414cba3187a3616b83dab6dff726d8df92edca4cbbbf98f7c493bb9eeb541d4031102b194077b47fcf8989bb375d15acc5443695d4760e22dace907172b864d1d51b000000000000000000000000000000000000000000000000000000000000000000000000000000000000002e2b1c42e38f5af81771e65d87729e57abd1337a00000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000003d0900000000000000000000000000000000000000000000000000000000000003345000000000000000000000000000000000000000000000000000000000000052080000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000003b9aca00000000000000000000000000000000000000000000000000000000000000026000000000000000000000000000000000000000000000000000000000000002a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a4b61d27f60000000000000000000000000719d47a213149e2ef8d3f5afdada8a8e22dfc030000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000004909d834d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000141842a4eff3efd24c50b63c3cf89cecee245fc2bd00000000000000000000000000000000000000000000000000000000000000000000000000000000000000419341335b23684e09113844e60c2131299ceffe69c0421c93e993f8dfc560355e4136b682a8280326b088c5104782392586b2d5ea883228ef1c80805312632cf21b00000000000000000000000000000000000000000000000000000000000000", + "nonce": "0x15", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0xb5706db127416b3221f08908c1a14b105ffb021bb2a304bf1295d5ed09a6812c", + "transactionIndex": "0x1", + "blockHash": "0xd47cece0b10447a65f3698cebf7c10fb513417cb5f5f43224891e6e6e071ded3", + "blockNumber": "0xa8", + "from": "0x660ad4B5A74130a4796B4d54BC6750Ae93C86e6c", + "to": "0x8a4720488CA32f1223ccFE5A087e250fE3BC5D75", + "cumulativeGasUsed": "0x1f2ff33", + "gasUsed": "0x1f2ff33", + "contractAddress": null, + "logs": [ + { + "address": "0xB2f4c8E6D336DB09731A4D08BC087838b4841b06", + "topics": [ + "0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000ff", + "blockHash": "0xd47cece0b10447a65f3698cebf7c10fb513417cb5f5f43224891e6e6e071ded3", + "blockNumber": "0xa8", + "transactionHash": "0xb5706db127416b3221f08908c1a14b105ffb021bb2a304bf1295d5ed09a6812c", + "transactionIndex": "0x1", + "logIndex": "0x0", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x02000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0x5f5e100" + }, + { + "transactionHash": "0x143fcf93ba99e9386bef055670644f8e2f574f9036aa70d7832d1aea1bb738e1", + "transactionIndex": "0x1", + "blockHash": "0xa01ff87029dee301df463f14cb5f1f96ab1569bb959f34f55d3a0b5a1a4cd197", + "blockNumber": "0xa9", + "from": "0x660ad4B5A74130a4796B4d54BC6750Ae93C86e6c", + "to": "0x8a4720488CA32f1223ccFE5A087e250fE3BC5D75", + "cumulativeGasUsed": "0xb15984", + "gasUsed": "0xb15984", + "contractAddress": null, + "logs": [ + { + "address": "0x0719D47A213149E2Ef8d3f5afDaDA8a8E22dfc03", + "topics": [ + "0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b", + "0x000000000000000000000000b2f4c8e6d336db09731a4d08bc087838b4841b06" + ], + "data": "0x", + "blockHash": "0xa01ff87029dee301df463f14cb5f1f96ab1569bb959f34f55d3a0b5a1a4cd197", + "blockNumber": "0xa9", + "transactionHash": "0x143fcf93ba99e9386bef055670644f8e2f574f9036aa70d7832d1aea1bb738e1", + "transactionIndex": "0x1", + "logIndex": "0x0", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000400000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000100000000000000000000100000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0x5f5e100" + }, + { + "transactionHash": "0xe6b112ca5a4d44b22d429cd75194cdbfc0aaf2f8152b02118b891090daa5e314", + "transactionIndex": "0x1", + "blockHash": "0xc55e12a1fee1a97e9d4fbc718eb03e8ae60026dcd27398ee71c5ebb18a1cd053", + "blockNumber": "0xaa", + "from": "0x660ad4B5A74130a4796B4d54BC6750Ae93C86e6c", + "to": "0x8a4720488CA32f1223ccFE5A087e250fE3BC5D75", + "cumulativeGasUsed": "0x13bb42", + "gasUsed": "0x13bb42", + "contractAddress": null, + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0x5f5e100" + }, + { + "transactionHash": "0xc8f525d188fe95a37a50731e477da3aef28eb83154359dc71262e3d0887f3664", + "transactionIndex": "0x1", + "blockHash": "0x9afddd6b82b84a8d36256abede9699527ee8b7961047917d0a823236fc482f3d", + "blockNumber": "0xab", + "from": "0x660ad4B5A74130a4796B4d54BC6750Ae93C86e6c", + "to": "0x1842a4EFf3eFd24c50B63c3CF89cECEe245Fc2bd", + "cumulativeGasUsed": "0x139edd", + "gasUsed": "0x139edd", + "contractAddress": null, + "logs": [ + { + "address": "0x2843C269D2a64eCfA63548E8B3Fc0FD23B7F70cb", + "topics": [ + "0x2da466a7b24304f47e87fa2e1e5a81b9831ce54fec19055ce277ca2f39ba42c4", + "0x0000000000000000000000001842a4eff3efd24c50b63c3cf89cecee245fc2bd" + ], + "data": "0x000000000000000000000000000000000000000000000000058d15e17606a615", + "blockHash": "0x9afddd6b82b84a8d36256abede9699527ee8b7961047917d0a823236fc482f3d", + "blockNumber": "0xab", + "transactionHash": "0xc8f525d188fe95a37a50731e477da3aef28eb83154359dc71262e3d0887f3664", + "transactionIndex": "0x1", + "logIndex": "0x0", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x40000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200800000000000000000000000000000000002000000000000000000000000200000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0x5f5e100" + }, + { + "transactionHash": "0xdc009f3e21a594d726884d117565a39b19c40cbe86a7d863e0e2e4844a48ecb5", + "transactionIndex": "0x1", + "blockHash": "0xe6599a9ca54ea7a7477616d3a66d4d7b6491a4a045460136863e31761a3bc661", + "blockNumber": "0xac", + "from": "0x660ad4B5A74130a4796B4d54BC6750Ae93C86e6c", + "to": "0x2843C269D2a64eCfA63548E8B3Fc0FD23B7F70cb", + "cumulativeGasUsed": "0x6a4e8b", + "gasUsed": "0x6a4e8b", + "contractAddress": null, + "logs": [ + { + "address": "0x2843C269D2a64eCfA63548E8B3Fc0FD23B7F70cb", + "topics": [ + "0xbb47ee3e183a558b1a2ff0874b079f3fc5478b7454eacf2bfc5af2ff5878f972" + ], + "data": "0x", + "blockHash": "0xe6599a9ca54ea7a7477616d3a66d4d7b6491a4a045460136863e31761a3bc661", + "blockNumber": "0xac", + "transactionHash": "0xdc009f3e21a594d726884d117565a39b19c40cbe86a7d863e0e2e4844a48ecb5", + "transactionIndex": "0x1", + "logIndex": "0x0", + "removed": false + }, + { + "address": "0x2843C269D2a64eCfA63548E8B3Fc0FD23B7F70cb", + "topics": [ + "0x49628fd1471006c1482da88028e9ce4dbb080b815c9b0344d39e5a8e6ec1419f", + "0x5f529e5437767614d9106692fac2cded5993e02ebbc642e600996dd6acf79089", + "0x0000000000000000000000002e2b1c42e38f5af81771e65d87729e57abd1337a", + "0x0000000000000000000000001842a4eff3efd24c50b63c3cf89cecee245fc2bd" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000009b952000000000000000000000000000000000000000000000000000000000009b952", + "blockHash": "0xe6599a9ca54ea7a7477616d3a66d4d7b6491a4a045460136863e31761a3bc661", + "blockNumber": "0xac", + "transactionHash": "0xdc009f3e21a594d726884d117565a39b19c40cbe86a7d863e0e2e4844a48ecb5", + "transactionIndex": "0x1", + "logIndex": "0x1", + "removed": false + }, + { + "address": "0x0719D47A213149E2Ef8d3f5afDaDA8a8E22dfc03", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000002e2b1c42e38f5af81771e65d87729e57abd1337a" + ], + "data": "0x", + "blockHash": "0xe6599a9ca54ea7a7477616d3a66d4d7b6491a4a045460136863e31761a3bc661", + "blockNumber": "0xac", + "transactionHash": "0xdc009f3e21a594d726884d117565a39b19c40cbe86a7d863e0e2e4844a48ecb5", + "transactionIndex": "0x1", + "logIndex": "0x2", + "removed": false + }, + { + "address": "0x0719D47A213149E2Ef8d3f5afDaDA8a8E22dfc03", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000002e2b1c42e38f5af81771e65d87729e57abd1337a", + "0x0000000000000000000000002e2b1c42e38f5af81771e65d87729e57abd1337a" + ], + "data": "0x", + "blockHash": "0xe6599a9ca54ea7a7477616d3a66d4d7b6491a4a045460136863e31761a3bc661", + "blockNumber": "0xac", + "transactionHash": "0xdc009f3e21a594d726884d117565a39b19c40cbe86a7d863e0e2e4844a48ecb5", + "transactionIndex": "0x1", + "logIndex": "0x3", + "removed": false + }, + { + "address": "0x0719D47A213149E2Ef8d3f5afDaDA8a8E22dfc03", + "topics": [ + "0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498" + ], + "data": "0x0000000000000000000000000000000000000000000000000000000000000001", + "blockHash": "0xe6599a9ca54ea7a7477616d3a66d4d7b6491a4a045460136863e31761a3bc661", + "blockNumber": "0xac", + "transactionHash": "0xdc009f3e21a594d726884d117565a39b19c40cbe86a7d863e0e2e4844a48ecb5", + "transactionIndex": "0x1", + "logIndex": "0x4", + "removed": false + }, + { + "address": "0x2843C269D2a64eCfA63548E8B3Fc0FD23B7F70cb", + "topics": [ + "0x49628fd1471006c1482da88028e9ce4dbb080b815c9b0344d39e5a8e6ec1419f", + "0xca701f9dacc32341fba37afc891eefabd1d29dfaa0cfaebd94ed7d460b183ce0", + "0x0000000000000000000000002e2b1c42e38f5af81771e65d87729e57abd1337a", + "0x0000000000000000000000001842a4eff3efd24c50b63c3cf89cecee245fc2bd" + ], + "data": "0x0000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000a338e00000000000000000000000000000000000000000000000000000000000a338e", + "blockHash": "0xe6599a9ca54ea7a7477616d3a66d4d7b6491a4a045460136863e31761a3bc661", + "blockNumber": "0xac", + "transactionHash": "0xdc009f3e21a594d726884d117565a39b19c40cbe86a7d863e0e2e4844a48ecb5", + "transactionIndex": "0x1", + "logIndex": "0x5", + "removed": false + }, + { + "address": "0x2843C269D2a64eCfA63548E8B3Fc0FD23B7F70cb", + "topics": [ + "0x49628fd1471006c1482da88028e9ce4dbb080b815c9b0344d39e5a8e6ec1419f", + "0xe95fc85773d20871e2d14136cd58397b85d14177eb1d5d0190a5650cf542d043", + "0x0000000000000000000000002e2b1c42e38f5af81771e65d87729e57abd1337a", + "0x0000000000000000000000001842a4eff3efd24c50b63c3cf89cecee245fc2bd" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000007e799000000000000000000000000000000000000000000000000000000000007e799", + "blockHash": "0xe6599a9ca54ea7a7477616d3a66d4d7b6491a4a045460136863e31761a3bc661", + "blockNumber": "0xac", + "transactionHash": "0xdc009f3e21a594d726884d117565a39b19c40cbe86a7d863e0e2e4844a48ecb5", + "transactionIndex": "0x1", + "logIndex": "0x6", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x40000000000000000000000100004000000000000000000000800000000000000008000000000000000000010000000000000000000000004000020000000000000000000000000000000000000000000001000000800000000000000000000800000000020000010000000000000800002000000000000000000000000000400000000000000000000100000000800000000008000080000000000000000020000400000000000000400000000400000004000000000000000002000000000000000000000000100001000000040000000000000002000000000000000020000001000000410000000000000000000000000000000000000040000000000000", + "type": "0x2", + "effectiveGasPrice": "0x5f5e100" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1705342190, + "chain": 7887, + "multi": false, + "commit": "aa8d15e" +} \ No newline at end of file diff --git a/broadcast/16-factory_v4.sol/7887/run-1705346386.json b/broadcast/16-factory_v4.sol/7887/run-1705346386.json new file mode 100644 index 000000000..5cc3e2bc4 --- /dev/null +++ b/broadcast/16-factory_v4.sol/7887/run-1705346386.json @@ -0,0 +1,110 @@ +{ + "transactions": [ + { + "hash": "0x88b587d4ae6dae4f7579ad6a32f0ea579802ad1c47a1b29fe6119995e2ef733b", + "transactionType": "CALL", + "contractName": null, + "contractAddress": null, + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0x660ad4b5a74130a4796b4d54bc6750ae93c86e6c", + "to": "0x8a4720488ca32f1223ccfe5a087e250fe3bc5d75", + "value": "0x0", + "data": "0x66d6e19b000000000000000000000000c1f4d15c16a1f3555e0a5f7aefd1e17ad4aaf40b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000036f260c0604052306080523480156200001557600080fd5b50604051620036d2380380620036d2833981016040819052620000389162000117565b806200004362000056565b6001600160a01b031660a0525062000149565b600054610100900460ff1615620000c35760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff9081161462000115576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6000602082840312156200012a57600080fd5b81516001600160a01b03811681146200014257600080fd5b9392505050565b60805160a0516135476200018b6000396000610f3e0152600081816109210152818161096401528181610a0c01528181610a4f0152610aeb01526135476000f3fe6080604052600436106200015b5760003560e01c8063778c271d11620000c5578063daba3eac1162000078578063daba3eac14620003b4578063ea372fce14620003d9578063ed97bab31462000413578063f2fde38b146200042a578063f4f4b03a146200044f578063f662e6e2146200047457600080fd5b8063778c271d14620002f85780638da5cb5b146200031d578063977d2c45146200033d57806399a6cddd1462000355578063bae7b5d31462000377578063c4d66de8146200038f57600080fd5b80634f1ef286116200011e5780634f1ef286146200025357806352d1902d146200026a57806359659e9014620002825780635fd6656f14620002a457806366d6e19b14620002c9578063715018a614620002e057600080fd5b806308a6354e1462000160578063097e9dd414620001a25780631230aea214620001c95780632098fe4814620001ee5780633659cfe6146200022e575b600080fd5b3480156200016d57600080fd5b50620001856200017f36600462001fd8565b62000499565b6040516001600160a01b0390911681526020015b60405180910390f35b348015620001af57600080fd5b50620001c7620001c13660046200201e565b6200056b565b005b348015620001d657600080fd5b5062000185620001e836600462001fd8565b620006ad565b348015620001fb57600080fd5b506200021f6200020d366004620020ad565b60cb6020526000908152604090205481565b60405190815260200162000199565b3480156200023b57600080fd5b50620001c76200024d366004620020ad565b62000917565b620001c762000264366004620020e3565b62000a02565b3480156200027757600080fd5b506200021f62000ade565b3480156200028f57600080fd5b5060c95462000185906001600160a01b031681565b348015620002b157600080fd5b50620001c7620002c3366004620021b3565b62000b94565b62000185620002da3660046200220f565b62000d6c565b348015620002ed57600080fd5b50620001c762000e32565b3480156200030557600080fd5b506200018562000317366004620022a7565b62000e4a565b3480156200032a57600080fd5b506097546001600160a01b031662000185565b3480156200034a57600080fd5b506200021f60cd5481565b3480156200036257600080fd5b5060ca5462000185906001600160a01b031681565b3480156200038457600080fd5b506200021f60cc5481565b3480156200039c57600080fd5b50620001c7620003ae366004620020ad565b62000e62565b348015620003c157600080fd5b50620001c7620003d3366004620022ca565b62001017565b348015620003e657600080fd5b506200021f620003f8366004620020ad565b6001600160a01b0316600090815260cb602052604090205490565b620001c762000424366004620020ad565b62001116565b3480156200043757600080fd5b50620001c762000449366004620020ad565b62001322565b3480156200045c57600080fd5b50620001c76200046e366004620020ad565b6200139e565b3480156200048157600080fd5b50620001c762000493366004620020ad565b620015ae565b6000620005618260001b60405180602001620004b59062001fa6565b601f1982820381018352601f90910116604081905260c9546001600160a01b0389811660248401528881166044840152169060640160408051601f19818403018152918152602080830180516001600160e01b031663485cc95560e01b1790529051620005259392910162002351565b60408051601f198184030181529082905262000545929160200162002377565b6040516020818303038152906040528051906020012062000e4a565b90505b9392505050565b6001600160a01b038316600090815260cb6020526040902054620005ac5760405162461bcd60e51b8152600401620005a390620023aa565b60405180910390fd5b826001600160a01b031663b808dce86040518163ffffffff1660e01b8152600401602060405180830381865afa158015620005eb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620006119190620023d2565b6001600160a01b0316336001600160a01b031614620006445760405162461bcd60e51b8152600401620005a390620023f2565b60405163182e75b360e01b81526001600160a01b0384169063182e75b3906200067490859085906004016200241a565b600060405180830381600087803b1580156200068f57600080fd5b505af1158015620006a4573d6000803e3d6000fd5b50505050505050565b60006001600160a01b03841615801590620006d057506001600160a01b03831615155b620007125760405162461bcd60e51b8152602060048201526011602482015270696e76616c69642061646472657373657360781b6044820152606401620005a3565b60ca546040516313289ea360e31b81526001600160a01b03868116600483015290911690639944f51890602401602060405180830381865afa1580156200075d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000783919062002461565b80156200079857506001600160a01b03841633145b620007d55760405162461bcd60e51b815260206004820152600c60248201526b12d650c81c995c5d5a5c995960a21b6044820152606401620005a3565b6000620007e485858562000499565b90506001600160a01b0381163b8015620008015750905062000564565b60c9546040516001600160a01b03888116602483015287811660448301528692169060640160408051601f198184030181529181526020820180516001600160e01b031663485cc95560e01b179052516200085c9062001fa6565b6200086992919062002351565b8190604051809103906000f59050801580156200088a573d6000803e3d6000fd5b506001600160a01b038116600090815260cb6020526040812042905560cd805492955090620008b9836200249b565b9190505550856001600160a01b0316836001600160a01b03167fa097b826e61d0ee46c6b3b1596580ed60bd21801826a88e23c919724e6f8f21360cc546040516200090691815260200190565b60405180910390a350509392505050565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163003620009625760405162461bcd60e51b8152600401620005a390620024b7565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316620009ad600080516020620034cb833981519152546001600160a01b031690565b6001600160a01b031614620009d65760405162461bcd60e51b8152600401620005a39062002503565b620009e181620016ba565b60408051600080825260208201909252620009ff91839190620016c4565b50565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016300362000a4d5760405162461bcd60e51b8152600401620005a390620024b7565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031662000a98600080516020620034cb833981519152546001600160a01b031690565b6001600160a01b03161462000ac15760405162461bcd60e51b8152600401620005a39062002503565b62000acc82620016ba565b62000ada82826001620016c4565b5050565b6000306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161462000b805760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c00000000000000006064820152608401620005a3565b50600080516020620034cb83398151915290565b60ca546040805163d9e1063d60e01b815290516001600160a01b03909216916391d1485491839163d9e1063d916004808201926020929091908290030181865afa15801562000be7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000c0d91906200254f565b6040516001600160e01b031960e084901b1681526004810191909152336024820152604401602060405180830381865afa15801562000c50573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000c76919062002461565b62000cb55760405162461bcd60e51b815260206004820152600e60248201526d24b73b30b634b21039b2b73232b960911b6044820152606401620005a3565b6001600160a01b03821662000d065760405162461bcd60e51b8152602060048201526016602482015275496e76616c696420666175636574206164647265737360501b6044820152606401620005a3565b60405163064a7ecf60e31b81526001600160a01b03831690633253f6789062000d3490849060040162002592565b600060405180830381600087803b15801562000d4f57600080fd5b505af115801562000d64573d6000803e3d6000fd5b505050505050565b60ca546040516313289ea360e31b81523360048201526000916001600160a01b031690639944f51890602401602060405180830381865afa15801562000db6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000ddc919062002461565b62000e195760405162461bcd60e51b815260206004820152600c60248201526b12d650c81c995c5d5a5c995960a21b6044820152606401620005a3565b62000e28868686868662001841565b9695505050505050565b62000e3c620019b6565b62000e48600062001a12565b565b600062000e5983833062001a64565b90505b92915050565b600054610100900460ff161580801562000e835750600054600160ff909116105b8062000e9f5750303b15801562000e9f575060005460ff166001145b62000f045760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401620005a3565b6000805460ff19166001179055801562000f28576000805461ff0019166101001790555b62000f3262001a8e565b62000f3c62001ac2565b7f000000000000000000000000000000000000000000000000000000000000000060405162000f6b9062001fb4565b6001600160a01b039091168152602001604051809103906000f08015801562000f98573d6000803e3d6000fd5b5060c980546001600160a01b03199081166001600160a01b0393841617909155600160cc5560ca8054909116918416919091179055801562000ada576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050565b6001600160a01b038216600090815260cb60205260409020546200104f5760405162461bcd60e51b8152600401620005a390620023aa565b816001600160a01b031663b808dce86040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200108e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620010b49190620023d2565b6001600160a01b0316336001600160a01b031614620010e75760405162461bcd60e51b8152600401620005a390620023f2565b60405163bd53457b60e01b81526001600160a01b03828116600483015283169063bd53457b9060240162000d34565b6000341180156200113e57506001600160a01b038116600090815260cb602052604090205415155b80156200122b575060ca5460405163025e7c2760e01b8152600060048201526001600160a01b0391821691639944f518919084169063025e7c2790602401602060405180830381865afa1580156200119a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620011c09190620023d2565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa15801562001205573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200122b919062002461565b80156200129e5750604051631c7a34ef60e31b81523360048201526001600160a01b0382169063e3d1a77890602401602060405180830381865afa15801562001278573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200129e919062002461565b620012ec5760405162461bcd60e51b815260206004820152601860248201527f496e76616c69642077616c6c6574206f722066756e64657200000000000000006044820152606401620005a3565b6040516001600160a01b038216903480156108fc02916000818181858888f1935050505015801562000ada573d6000803e3d6000fd5b6200132c620019b6565b6001600160a01b038116620013935760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401620005a3565b620009ff8162001a12565b620013a8620019b6565b6001600160a01b038116158015906200144c575060c960009054906101000a90046001600160a01b03166001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801562001410573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620014369190620023d2565b6001600160a01b0316816001600160a01b031614155b6200148c5760405162461bcd60e51b815260206004820152600f60248201526e696e76616c6964206164647265737360881b6044820152606401620005a3565b60cc80549060006200149e836200249b565b909155505060c95460408051635c60da1b60e01b815290516001600160a01b03808516931691635c60da1b9160048083019260209291908290030181865afa158015620014ef573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620015159190620023d2565b6001600160a01b03167f5678caf9f87c5a77571c317ab0f4cc76826bfa201760aaf54273c13333de40f660405160405180910390a360c954604051631b2ce7f360e11b81526001600160a01b03838116600483015290911690633659cfe690602401600060405180830381600087803b1580156200159257600080fd5b505af1158015620015a7573d6000803e3d6000fd5b5050505050565b6001600160a01b038116600090815260cb6020526040902054620015e65760405162461bcd60e51b8152600401620005a390620023aa565b806001600160a01b031663b808dce86040518163ffffffff1660e01b8152600401602060405180830381865afa15801562001625573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200164b9190620023d2565b6001600160a01b0316336001600160a01b0316146200167e5760405162461bcd60e51b8152600401620005a390620023f2565b806001600160a01b031663923689e46040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156200159257600080fd5b620009ff620019b6565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff1615620016ff57620016fa8362001aec565b505050565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156200175c575060408051601f3d908101601f1916820190925262001759918101906200254f565b60015b620017c15760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b6064820152608401620005a3565b600080516020620034cb8339815191528114620018335760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b6064820152608401620005a3565b50620016fa83838362001b8b565b6000348514620018865760405162461bcd60e51b815260206004820152600f60248201526e0c2dadeeadce840dad2e6dac2e8c6d608b1b6044820152606401620005a3565b62001892848462001bbc565b6000620018d7868487878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525062001ce492505050565b9050806001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa92505050801562001936575060408051601f3d908101601f191682019092526200193391810190620023d2565b60015b1562000e2857306001600160a01b03821603620019ab5760405163f2fde38b60e01b81526001600160a01b03898116600483015283169063f2fde38b90602401600060405180830381600087803b1580156200199157600080fd5b505af1158015620019a6573d6000803e3d6000fd5b505050505b509695505050505050565b6097546001600160a01b0316331462000e485760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401620005a3565b609780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b600054610100900460ff1662001ab85760405162461bcd60e51b8152600401620005a39062002624565b62000e4862001dee565b600054610100900460ff1662000e485760405162461bcd60e51b8152600401620005a39062002624565b6001600160a01b0381163b62001b5b5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401620005a3565b600080516020620034cb83398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b62001b968362001e23565b60008251118062001ba45750805b15620016fa5762001bb6838362001e65565b50505050565b60006040518060200162001bd09062001fa6565b601f1982820381018352601f90910116604052805190915062001bf59060206200266f565b821115620016fa5760008151600c62001c0f91906200266f565b905060008085838662001c248260146200266f565b9262001c339392919062002685565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050601482015160c954909450919250506001600160a01b039081169083160362000d645760405162461bcd60e51b815260206004820152602960248201527f446972656374204b696e746f57616c6c6574206465706c6f796d656e74206e6f6044820152681d08185b1b1bddd95960ba1b6064820152608401620005a3565b60008347101562001d385760405162461bcd60e51b815260206004820152601d60248201527f437265617465323a20696e73756666696369656e742062616c616e63650000006044820152606401620005a3565b815160000362001d8b5760405162461bcd60e51b815260206004820181905260248201527f437265617465323a2062797465636f6465206c656e677468206973207a65726f6044820152606401620005a3565b8282516020840186f590506001600160a01b038116620005645760405162461bcd60e51b815260206004820152601960248201527f437265617465323a204661696c6564206f6e206465706c6f79000000000000006044820152606401620005a3565b600054610100900460ff1662001e185760405162461bcd60e51b8152600401620005a39062002624565b62000e483362001a12565b62001e2e8162001aec565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606001600160a01b0383163b62001ecf5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b6064820152608401620005a3565b600080846001600160a01b03168460405162001eec9190620026b1565b600060405180830381855af49150503d806000811462001f29576040519150601f19603f3d011682016040523d82523d6000602084013e62001f2e565b606091505b509150915062001f598282604051806060016040528060278152602001620034eb6027913962001f62565b95945050505050565b6060831562001f7357508162000564565b62000564838381511562001f8a5781518083602001fd5b8060405162461bcd60e51b8152600401620005a39190620026cf565b61090280620026e583390190565b6104e48062002fe783390190565b6001600160a01b0381168114620009ff57600080fd5b60008060006060848603121562001fee57600080fd5b833562001ffb8162001fc2565b925060208401356200200d8162001fc2565b929592945050506040919091013590565b6000806000604084860312156200203457600080fd5b8335620020418162001fc2565b9250602084013567ffffffffffffffff808211156200205f57600080fd5b818601915086601f8301126200207457600080fd5b8135818111156200208457600080fd5b8760208260051b85010111156200209a57600080fd5b6020830194508093505050509250925092565b600060208284031215620020c057600080fd5b8135620005648162001fc2565b634e487b7160e01b600052604160045260246000fd5b60008060408385031215620020f757600080fd5b8235620021048162001fc2565b9150602083013567ffffffffffffffff808211156200212257600080fd5b818501915085601f8301126200213757600080fd5b8135818111156200214c576200214c620020cd565b604051601f8201601f19908116603f01168101908382118183101715620021775762002177620020cd565b816040528281528860208487010111156200219157600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b60008060408385031215620021c757600080fd5b8235620021d48162001fc2565b9150602083013567ffffffffffffffff811115620021f157600080fd5b8301608081860312156200220457600080fd5b809150509250929050565b6000806000806000608086880312156200222857600080fd5b8535620022358162001fc2565b945060208601359350604086013567ffffffffffffffff808211156200225a57600080fd5b818801915088601f8301126200226f57600080fd5b8135818111156200227f57600080fd5b8960208285010111156200229257600080fd5b96999598505060200195606001359392505050565b60008060408385031215620022bb57600080fd5b50508035926020909101359150565b60008060408385031215620022de57600080fd5b8235620022eb8162001fc2565b91506020830135620022048162001fc2565b60005b838110156200231a57818101518382015260200162002300565b50506000910152565b600081518084526200233d816020860160208601620022fd565b601f01601f19169290920160200192915050565b6001600160a01b0383168152604060208201819052600090620005619083018462002323565b600083516200238b818460208801620022fd565b835190830190620023a1818360208801620022fd565b01949350505050565b6020808252600e908201526d1a5b9d985b1a59081dd85b1b195d60921b604082015260600190565b600060208284031215620023e557600080fd5b8151620005648162001fc2565b6020808252600e908201526d37b7363c903932b1b7bb32b932b960911b604082015260600190565b60208082528181018390526000908460408401835b86811015620019ab578235620024458162001fc2565b6001600160a01b0316825291830191908301906001016200242f565b6000602082840312156200247457600080fd5b815180151581146200056457600080fd5b634e487b7160e01b600052601160045260246000fd5b600060018201620024b057620024b062002485565b5060010190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b6163746976652070726f787960a01b606082015260800190565b6000602082840312156200256257600080fd5b5051919050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6020815260008235620025a58162001fc2565b60018060a01b03811660208401525060208301356040830152604083013560608301526060830135601e19843603018112620025e057600080fd5b830160208101903567ffffffffffffffff811115620025fe57600080fd5b8036038213156200260e57600080fd5b60808085015262001f5960a08501828462002569565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b8082018082111562000e5c5762000e5c62002485565b600080858511156200269657600080fd5b83861115620026a457600080fd5b5050820193919092039150565b60008251620026c5818460208701620022fd565b9190910192915050565b60208152600062000e5960208301846200232356fe60806040526040516109023803806109028339810160408190526100229161045f565b818161003082826000610039565b50505050610589565b61004283610104565b6040516001600160a01b038416907f1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e90600090a26000825111806100835750805b156100ff576100fd836001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100ed919061051f565b836102a760201b6100271760201c565b505b505050565b610117816102d360201b6100531760201c565b6101765760405162461bcd60e51b815260206004820152602560248201527f455243313936373a206e657720626561636f6e206973206e6f74206120636f6e6044820152641d1c9858dd60da1b60648201526084015b60405180910390fd5b6101ea816001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156101b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101db919061051f565b6102d360201b6100531760201c565b61024f5760405162461bcd60e51b815260206004820152603060248201527f455243313936373a20626561636f6e20696d706c656d656e746174696f6e206960448201526f1cc81b9bdd08184818dbdb9d1c9858dd60821b606482015260840161016d565b806102867fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d5060001b6102e260201b6100621760201c565b80546001600160a01b0319166001600160a01b039290921691909117905550565b60606102cc83836040518060600160405280602781526020016108db602791396102e5565b9392505050565b6001600160a01b03163b151590565b90565b6060600080856001600160a01b031685604051610302919061053a565b600060405180830381855af49150503d806000811461033d576040519150601f19603f3d011682016040523d82523d6000602084013e610342565b606091505b5090925090506103548683838761035e565b9695505050505050565b606083156103cd5782516000036103c6576001600160a01b0385163b6103c65760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161016d565b50816103d7565b6103d783836103df565b949350505050565b8151156103ef5781518083602001fd5b8060405162461bcd60e51b815260040161016d9190610556565b80516001600160a01b038116811461042057600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b8381101561045657818101518382015260200161043e565b50506000910152565b6000806040838503121561047257600080fd5b61047b83610409565b60208401519092506001600160401b038082111561049857600080fd5b818501915085601f8301126104ac57600080fd5b8151818111156104be576104be610425565b604051601f8201601f19908116603f011681019083821181831017156104e6576104e6610425565b816040528281528860208487010111156104ff57600080fd5b61051083602083016020880161043b565b80955050505050509250929050565b60006020828403121561053157600080fd5b6102cc82610409565b6000825161054c81846020870161043b565b9190910192915050565b602081526000825180602084015261057581604085016020870161043b565b601f01601f19169190910160400192915050565b610343806105986000396000f3fe60806040523661000b57005b610013610015565b005b610025610020610065565b6100fe565b565b606061004c83836040518060600160405280602781526020016102e760279139610122565b9392505050565b6001600160a01b03163b151590565b90565b60006100987fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50546001600160a01b031690565b6001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100f9919061024a565b905090565b3660008037600080366000845af43d6000803e80801561011d573d6000f35b3d6000fd5b6060600080856001600160a01b03168560405161013f9190610297565b600060405180830381855af49150503d806000811461017a576040519150601f19603f3d011682016040523d82523d6000602084013e61017f565b606091505b50915091506101908683838761019a565b9695505050505050565b6060831561020e578251600003610207576001600160a01b0385163b6102075760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064015b60405180910390fd5b5081610218565b6102188383610220565b949350505050565b8151156102305781518083602001fd5b8060405162461bcd60e51b81526004016101fe91906102b3565b60006020828403121561025c57600080fd5b81516001600160a01b038116811461004c57600080fd5b60005b8381101561028e578181015183820152602001610276565b50506000910152565b600082516102a9818460208701610273565b9190910192915050565b60208152600082518060208401526102d2816040850160208701610273565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220f0e3ef2d2445c27cb092c3417e9d772e131fc2383995e0d0d9ee96165dd0ab0b64736f6c63430008120033416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564608060405234801561001057600080fd5b506040516104e43803806104e483398101604081905261002f91610151565b61003833610047565b61004181610097565b50610181565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6100aa8161014260201b6101a01760201c565b6101205760405162461bcd60e51b815260206004820152603360248201527f5570677261646561626c65426561636f6e3a20696d706c656d656e746174696f60448201527f6e206973206e6f74206120636f6e747261637400000000000000000000000000606482015260840160405180910390fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b03163b151590565b60006020828403121561016357600080fd5b81516001600160a01b038116811461017a57600080fd5b9392505050565b610354806101906000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80633659cfe61461005c5780635c60da1b14610071578063715018a61461009a5780638da5cb5b146100a2578063f2fde38b146100b3575b600080fd5b61006f61006a3660046102ee565b6100c6565b005b6001546001600160a01b03165b6040516001600160a01b03909116815260200160405180910390f35b61006f61010e565b6000546001600160a01b031661007e565b61006f6100c13660046102ee565b610122565b6100ce6101af565b6100d781610209565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6101166101af565b610120600061029e565b565b61012a6101af565b6001600160a01b0381166101945760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b61019d8161029e565b50565b6001600160a01b03163b151590565b6000546001600160a01b031633146101205760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161018b565b6001600160a01b0381163b61027c5760405162461bcd60e51b815260206004820152603360248201527f5570677261646561626c65426561636f6e3a20696d706c656d656e746174696f6044820152721b881a5cc81b9bdd08184818dbdb9d1c9858dd606a1b606482015260840161018b565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60006020828403121561030057600080fd5b81356001600160a01b038116811461031757600080fd5b939250505056fea26469706673582212209f2075bb08aacaa7585daf8bbb94ff2d4da0d3e0654263dbde3f0bbbb81f211c64736f6c63430008120033360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a264697066735822122096d8f569086ac9ff85732fd5bd5def71e0773b0c67b9c13f912a1aa762d1343f64736f6c63430008120033000000000000000000000000893b0aea9c45fa8d3b0fbbebd03d4220b95145990000000000000000000000000000", + "nonce": "0x16" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x44fd2d87a8b692ae4257c1336d44296c4b1e4e78d2a0093d97a4fcb41dffa0f5", + "transactionType": "CALL", + "contractName": null, + "contractAddress": null, + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0xc1f4d15c16a1f3555e0a5f7aefd1e17ad4aaf40b", + "to": "0x8a4720488ca32f1223ccfe5a087e250fe3bc5d75", + "value": "0x0", + "data": "0x3659cfe60000000000000000000000001b5976043578c6f4d2d1d17d3d4ae89cf001b9d5", + "nonce": "0x3e" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0x88b587d4ae6dae4f7579ad6a32f0ea579802ad1c47a1b29fe6119995e2ef733b", + "transactionIndex": "0x1", + "blockHash": "0x1efef8c9a8c3e46f7085284d38e19c4c2ed839eef27e017151398b8ef2d23b89", + "blockNumber": "0xaf", + "from": "0x660ad4B5A74130a4796B4d54BC6750Ae93C86e6c", + "to": "0x8a4720488CA32f1223ccFE5A087e250fE3BC5D75", + "cumulativeGasUsed": "0x3584765", + "gasUsed": "0x3584765", + "contractAddress": null, + "logs": [ + { + "address": "0x1b5976043578C6F4d2D1d17D3d4AE89Cf001B9d5", + "topics": [ + "0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000ff", + "blockHash": "0x1efef8c9a8c3e46f7085284d38e19c4c2ed839eef27e017151398b8ef2d23b89", + "blockNumber": "0xaf", + "transactionHash": "0x88b587d4ae6dae4f7579ad6a32f0ea579802ad1c47a1b29fe6119995e2ef733b", + "transactionIndex": "0x1", + "logIndex": "0x0", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000080200000000000000000000000000000000000000000000400000000000000000000000000000400000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x0", + "effectiveGasPrice": "0x5f5e100" + }, + { + "transactionHash": "0x44fd2d87a8b692ae4257c1336d44296c4b1e4e78d2a0093d97a4fcb41dffa0f5", + "transactionIndex": "0x1", + "blockHash": "0x8da1a1ebbe983cf095e39962416bd2ae1a685daa7e03242ce851d0ef0ba9ff73", + "blockNumber": "0xb0", + "from": "0xc1f4D15C16A1f3555E0a5F7AeFD1e17AD4aaf40B", + "to": "0x8a4720488CA32f1223ccFE5A087e250fE3BC5D75", + "cumulativeGasUsed": "0x1163c2", + "gasUsed": "0x1163c2", + "contractAddress": null, + "logs": [ + { + "address": "0x8a4720488CA32f1223ccFE5A087e250fE3BC5D75", + "topics": [ + "0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b", + "0x0000000000000000000000001b5976043578c6f4d2d1d17d3d4ae89cf001b9d5" + ], + "data": "0x", + "blockHash": "0x8da1a1ebbe983cf095e39962416bd2ae1a685daa7e03242ce851d0ef0ba9ff73", + "blockNumber": "0xb0", + "transactionHash": "0x44fd2d87a8b692ae4257c1336d44296c4b1e4e78d2a0093d97a4fcb41dffa0f5", + "transactionIndex": "0x1", + "logIndex": "0x0", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000008000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000020000000000100000020000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x0", + "effectiveGasPrice": "0x5f5e100" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1705346386, + "chain": 7887, + "multi": false, + "commit": "7a64c5d" +} \ No newline at end of file diff --git a/broadcast/16-factory_v4.sol/7887/run-latest.json b/broadcast/16-factory_v4.sol/7887/run-latest.json new file mode 100644 index 000000000..5cc3e2bc4 --- /dev/null +++ b/broadcast/16-factory_v4.sol/7887/run-latest.json @@ -0,0 +1,110 @@ +{ + "transactions": [ + { + "hash": "0x88b587d4ae6dae4f7579ad6a32f0ea579802ad1c47a1b29fe6119995e2ef733b", + "transactionType": "CALL", + "contractName": null, + "contractAddress": null, + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0x660ad4b5a74130a4796b4d54bc6750ae93c86e6c", + "to": "0x8a4720488ca32f1223ccfe5a087e250fe3bc5d75", + "value": "0x0", + "data": "0x66d6e19b000000000000000000000000c1f4d15c16a1f3555e0a5f7aefd1e17ad4aaf40b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000036f260c0604052306080523480156200001557600080fd5b50604051620036d2380380620036d2833981016040819052620000389162000117565b806200004362000056565b6001600160a01b031660a0525062000149565b600054610100900460ff1615620000c35760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff9081161462000115576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6000602082840312156200012a57600080fd5b81516001600160a01b03811681146200014257600080fd5b9392505050565b60805160a0516135476200018b6000396000610f3e0152600081816109210152818161096401528181610a0c01528181610a4f0152610aeb01526135476000f3fe6080604052600436106200015b5760003560e01c8063778c271d11620000c5578063daba3eac1162000078578063daba3eac14620003b4578063ea372fce14620003d9578063ed97bab31462000413578063f2fde38b146200042a578063f4f4b03a146200044f578063f662e6e2146200047457600080fd5b8063778c271d14620002f85780638da5cb5b146200031d578063977d2c45146200033d57806399a6cddd1462000355578063bae7b5d31462000377578063c4d66de8146200038f57600080fd5b80634f1ef286116200011e5780634f1ef286146200025357806352d1902d146200026a57806359659e9014620002825780635fd6656f14620002a457806366d6e19b14620002c9578063715018a614620002e057600080fd5b806308a6354e1462000160578063097e9dd414620001a25780631230aea214620001c95780632098fe4814620001ee5780633659cfe6146200022e575b600080fd5b3480156200016d57600080fd5b50620001856200017f36600462001fd8565b62000499565b6040516001600160a01b0390911681526020015b60405180910390f35b348015620001af57600080fd5b50620001c7620001c13660046200201e565b6200056b565b005b348015620001d657600080fd5b5062000185620001e836600462001fd8565b620006ad565b348015620001fb57600080fd5b506200021f6200020d366004620020ad565b60cb6020526000908152604090205481565b60405190815260200162000199565b3480156200023b57600080fd5b50620001c76200024d366004620020ad565b62000917565b620001c762000264366004620020e3565b62000a02565b3480156200027757600080fd5b506200021f62000ade565b3480156200028f57600080fd5b5060c95462000185906001600160a01b031681565b348015620002b157600080fd5b50620001c7620002c3366004620021b3565b62000b94565b62000185620002da3660046200220f565b62000d6c565b348015620002ed57600080fd5b50620001c762000e32565b3480156200030557600080fd5b506200018562000317366004620022a7565b62000e4a565b3480156200032a57600080fd5b506097546001600160a01b031662000185565b3480156200034a57600080fd5b506200021f60cd5481565b3480156200036257600080fd5b5060ca5462000185906001600160a01b031681565b3480156200038457600080fd5b506200021f60cc5481565b3480156200039c57600080fd5b50620001c7620003ae366004620020ad565b62000e62565b348015620003c157600080fd5b50620001c7620003d3366004620022ca565b62001017565b348015620003e657600080fd5b506200021f620003f8366004620020ad565b6001600160a01b0316600090815260cb602052604090205490565b620001c762000424366004620020ad565b62001116565b3480156200043757600080fd5b50620001c762000449366004620020ad565b62001322565b3480156200045c57600080fd5b50620001c76200046e366004620020ad565b6200139e565b3480156200048157600080fd5b50620001c762000493366004620020ad565b620015ae565b6000620005618260001b60405180602001620004b59062001fa6565b601f1982820381018352601f90910116604081905260c9546001600160a01b0389811660248401528881166044840152169060640160408051601f19818403018152918152602080830180516001600160e01b031663485cc95560e01b1790529051620005259392910162002351565b60408051601f198184030181529082905262000545929160200162002377565b6040516020818303038152906040528051906020012062000e4a565b90505b9392505050565b6001600160a01b038316600090815260cb6020526040902054620005ac5760405162461bcd60e51b8152600401620005a390620023aa565b60405180910390fd5b826001600160a01b031663b808dce86040518163ffffffff1660e01b8152600401602060405180830381865afa158015620005eb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620006119190620023d2565b6001600160a01b0316336001600160a01b031614620006445760405162461bcd60e51b8152600401620005a390620023f2565b60405163182e75b360e01b81526001600160a01b0384169063182e75b3906200067490859085906004016200241a565b600060405180830381600087803b1580156200068f57600080fd5b505af1158015620006a4573d6000803e3d6000fd5b50505050505050565b60006001600160a01b03841615801590620006d057506001600160a01b03831615155b620007125760405162461bcd60e51b8152602060048201526011602482015270696e76616c69642061646472657373657360781b6044820152606401620005a3565b60ca546040516313289ea360e31b81526001600160a01b03868116600483015290911690639944f51890602401602060405180830381865afa1580156200075d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000783919062002461565b80156200079857506001600160a01b03841633145b620007d55760405162461bcd60e51b815260206004820152600c60248201526b12d650c81c995c5d5a5c995960a21b6044820152606401620005a3565b6000620007e485858562000499565b90506001600160a01b0381163b8015620008015750905062000564565b60c9546040516001600160a01b03888116602483015287811660448301528692169060640160408051601f198184030181529181526020820180516001600160e01b031663485cc95560e01b179052516200085c9062001fa6565b6200086992919062002351565b8190604051809103906000f59050801580156200088a573d6000803e3d6000fd5b506001600160a01b038116600090815260cb6020526040812042905560cd805492955090620008b9836200249b565b9190505550856001600160a01b0316836001600160a01b03167fa097b826e61d0ee46c6b3b1596580ed60bd21801826a88e23c919724e6f8f21360cc546040516200090691815260200190565b60405180910390a350509392505050565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163003620009625760405162461bcd60e51b8152600401620005a390620024b7565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316620009ad600080516020620034cb833981519152546001600160a01b031690565b6001600160a01b031614620009d65760405162461bcd60e51b8152600401620005a39062002503565b620009e181620016ba565b60408051600080825260208201909252620009ff91839190620016c4565b50565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016300362000a4d5760405162461bcd60e51b8152600401620005a390620024b7565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031662000a98600080516020620034cb833981519152546001600160a01b031690565b6001600160a01b03161462000ac15760405162461bcd60e51b8152600401620005a39062002503565b62000acc82620016ba565b62000ada82826001620016c4565b5050565b6000306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161462000b805760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c00000000000000006064820152608401620005a3565b50600080516020620034cb83398151915290565b60ca546040805163d9e1063d60e01b815290516001600160a01b03909216916391d1485491839163d9e1063d916004808201926020929091908290030181865afa15801562000be7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000c0d91906200254f565b6040516001600160e01b031960e084901b1681526004810191909152336024820152604401602060405180830381865afa15801562000c50573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000c76919062002461565b62000cb55760405162461bcd60e51b815260206004820152600e60248201526d24b73b30b634b21039b2b73232b960911b6044820152606401620005a3565b6001600160a01b03821662000d065760405162461bcd60e51b8152602060048201526016602482015275496e76616c696420666175636574206164647265737360501b6044820152606401620005a3565b60405163064a7ecf60e31b81526001600160a01b03831690633253f6789062000d3490849060040162002592565b600060405180830381600087803b15801562000d4f57600080fd5b505af115801562000d64573d6000803e3d6000fd5b505050505050565b60ca546040516313289ea360e31b81523360048201526000916001600160a01b031690639944f51890602401602060405180830381865afa15801562000db6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000ddc919062002461565b62000e195760405162461bcd60e51b815260206004820152600c60248201526b12d650c81c995c5d5a5c995960a21b6044820152606401620005a3565b62000e28868686868662001841565b9695505050505050565b62000e3c620019b6565b62000e48600062001a12565b565b600062000e5983833062001a64565b90505b92915050565b600054610100900460ff161580801562000e835750600054600160ff909116105b8062000e9f5750303b15801562000e9f575060005460ff166001145b62000f045760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401620005a3565b6000805460ff19166001179055801562000f28576000805461ff0019166101001790555b62000f3262001a8e565b62000f3c62001ac2565b7f000000000000000000000000000000000000000000000000000000000000000060405162000f6b9062001fb4565b6001600160a01b039091168152602001604051809103906000f08015801562000f98573d6000803e3d6000fd5b5060c980546001600160a01b03199081166001600160a01b0393841617909155600160cc5560ca8054909116918416919091179055801562000ada576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050565b6001600160a01b038216600090815260cb60205260409020546200104f5760405162461bcd60e51b8152600401620005a390620023aa565b816001600160a01b031663b808dce86040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200108e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620010b49190620023d2565b6001600160a01b0316336001600160a01b031614620010e75760405162461bcd60e51b8152600401620005a390620023f2565b60405163bd53457b60e01b81526001600160a01b03828116600483015283169063bd53457b9060240162000d34565b6000341180156200113e57506001600160a01b038116600090815260cb602052604090205415155b80156200122b575060ca5460405163025e7c2760e01b8152600060048201526001600160a01b0391821691639944f518919084169063025e7c2790602401602060405180830381865afa1580156200119a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620011c09190620023d2565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa15801562001205573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200122b919062002461565b80156200129e5750604051631c7a34ef60e31b81523360048201526001600160a01b0382169063e3d1a77890602401602060405180830381865afa15801562001278573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200129e919062002461565b620012ec5760405162461bcd60e51b815260206004820152601860248201527f496e76616c69642077616c6c6574206f722066756e64657200000000000000006044820152606401620005a3565b6040516001600160a01b038216903480156108fc02916000818181858888f1935050505015801562000ada573d6000803e3d6000fd5b6200132c620019b6565b6001600160a01b038116620013935760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401620005a3565b620009ff8162001a12565b620013a8620019b6565b6001600160a01b038116158015906200144c575060c960009054906101000a90046001600160a01b03166001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801562001410573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620014369190620023d2565b6001600160a01b0316816001600160a01b031614155b6200148c5760405162461bcd60e51b815260206004820152600f60248201526e696e76616c6964206164647265737360881b6044820152606401620005a3565b60cc80549060006200149e836200249b565b909155505060c95460408051635c60da1b60e01b815290516001600160a01b03808516931691635c60da1b9160048083019260209291908290030181865afa158015620014ef573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620015159190620023d2565b6001600160a01b03167f5678caf9f87c5a77571c317ab0f4cc76826bfa201760aaf54273c13333de40f660405160405180910390a360c954604051631b2ce7f360e11b81526001600160a01b03838116600483015290911690633659cfe690602401600060405180830381600087803b1580156200159257600080fd5b505af1158015620015a7573d6000803e3d6000fd5b5050505050565b6001600160a01b038116600090815260cb6020526040902054620015e65760405162461bcd60e51b8152600401620005a390620023aa565b806001600160a01b031663b808dce86040518163ffffffff1660e01b8152600401602060405180830381865afa15801562001625573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200164b9190620023d2565b6001600160a01b0316336001600160a01b0316146200167e5760405162461bcd60e51b8152600401620005a390620023f2565b806001600160a01b031663923689e46040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156200159257600080fd5b620009ff620019b6565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff1615620016ff57620016fa8362001aec565b505050565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156200175c575060408051601f3d908101601f1916820190925262001759918101906200254f565b60015b620017c15760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b6064820152608401620005a3565b600080516020620034cb8339815191528114620018335760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b6064820152608401620005a3565b50620016fa83838362001b8b565b6000348514620018865760405162461bcd60e51b815260206004820152600f60248201526e0c2dadeeadce840dad2e6dac2e8c6d608b1b6044820152606401620005a3565b62001892848462001bbc565b6000620018d7868487878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525062001ce492505050565b9050806001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa92505050801562001936575060408051601f3d908101601f191682019092526200193391810190620023d2565b60015b1562000e2857306001600160a01b03821603620019ab5760405163f2fde38b60e01b81526001600160a01b03898116600483015283169063f2fde38b90602401600060405180830381600087803b1580156200199157600080fd5b505af1158015620019a6573d6000803e3d6000fd5b505050505b509695505050505050565b6097546001600160a01b0316331462000e485760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401620005a3565b609780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b600054610100900460ff1662001ab85760405162461bcd60e51b8152600401620005a39062002624565b62000e4862001dee565b600054610100900460ff1662000e485760405162461bcd60e51b8152600401620005a39062002624565b6001600160a01b0381163b62001b5b5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401620005a3565b600080516020620034cb83398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b62001b968362001e23565b60008251118062001ba45750805b15620016fa5762001bb6838362001e65565b50505050565b60006040518060200162001bd09062001fa6565b601f1982820381018352601f90910116604052805190915062001bf59060206200266f565b821115620016fa5760008151600c62001c0f91906200266f565b905060008085838662001c248260146200266f565b9262001c339392919062002685565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050601482015160c954909450919250506001600160a01b039081169083160362000d645760405162461bcd60e51b815260206004820152602960248201527f446972656374204b696e746f57616c6c6574206465706c6f796d656e74206e6f6044820152681d08185b1b1bddd95960ba1b6064820152608401620005a3565b60008347101562001d385760405162461bcd60e51b815260206004820152601d60248201527f437265617465323a20696e73756666696369656e742062616c616e63650000006044820152606401620005a3565b815160000362001d8b5760405162461bcd60e51b815260206004820181905260248201527f437265617465323a2062797465636f6465206c656e677468206973207a65726f6044820152606401620005a3565b8282516020840186f590506001600160a01b038116620005645760405162461bcd60e51b815260206004820152601960248201527f437265617465323a204661696c6564206f6e206465706c6f79000000000000006044820152606401620005a3565b600054610100900460ff1662001e185760405162461bcd60e51b8152600401620005a39062002624565b62000e483362001a12565b62001e2e8162001aec565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606001600160a01b0383163b62001ecf5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b6064820152608401620005a3565b600080846001600160a01b03168460405162001eec9190620026b1565b600060405180830381855af49150503d806000811462001f29576040519150601f19603f3d011682016040523d82523d6000602084013e62001f2e565b606091505b509150915062001f598282604051806060016040528060278152602001620034eb6027913962001f62565b95945050505050565b6060831562001f7357508162000564565b62000564838381511562001f8a5781518083602001fd5b8060405162461bcd60e51b8152600401620005a39190620026cf565b61090280620026e583390190565b6104e48062002fe783390190565b6001600160a01b0381168114620009ff57600080fd5b60008060006060848603121562001fee57600080fd5b833562001ffb8162001fc2565b925060208401356200200d8162001fc2565b929592945050506040919091013590565b6000806000604084860312156200203457600080fd5b8335620020418162001fc2565b9250602084013567ffffffffffffffff808211156200205f57600080fd5b818601915086601f8301126200207457600080fd5b8135818111156200208457600080fd5b8760208260051b85010111156200209a57600080fd5b6020830194508093505050509250925092565b600060208284031215620020c057600080fd5b8135620005648162001fc2565b634e487b7160e01b600052604160045260246000fd5b60008060408385031215620020f757600080fd5b8235620021048162001fc2565b9150602083013567ffffffffffffffff808211156200212257600080fd5b818501915085601f8301126200213757600080fd5b8135818111156200214c576200214c620020cd565b604051601f8201601f19908116603f01168101908382118183101715620021775762002177620020cd565b816040528281528860208487010111156200219157600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b60008060408385031215620021c757600080fd5b8235620021d48162001fc2565b9150602083013567ffffffffffffffff811115620021f157600080fd5b8301608081860312156200220457600080fd5b809150509250929050565b6000806000806000608086880312156200222857600080fd5b8535620022358162001fc2565b945060208601359350604086013567ffffffffffffffff808211156200225a57600080fd5b818801915088601f8301126200226f57600080fd5b8135818111156200227f57600080fd5b8960208285010111156200229257600080fd5b96999598505060200195606001359392505050565b60008060408385031215620022bb57600080fd5b50508035926020909101359150565b60008060408385031215620022de57600080fd5b8235620022eb8162001fc2565b91506020830135620022048162001fc2565b60005b838110156200231a57818101518382015260200162002300565b50506000910152565b600081518084526200233d816020860160208601620022fd565b601f01601f19169290920160200192915050565b6001600160a01b0383168152604060208201819052600090620005619083018462002323565b600083516200238b818460208801620022fd565b835190830190620023a1818360208801620022fd565b01949350505050565b6020808252600e908201526d1a5b9d985b1a59081dd85b1b195d60921b604082015260600190565b600060208284031215620023e557600080fd5b8151620005648162001fc2565b6020808252600e908201526d37b7363c903932b1b7bb32b932b960911b604082015260600190565b60208082528181018390526000908460408401835b86811015620019ab578235620024458162001fc2565b6001600160a01b0316825291830191908301906001016200242f565b6000602082840312156200247457600080fd5b815180151581146200056457600080fd5b634e487b7160e01b600052601160045260246000fd5b600060018201620024b057620024b062002485565b5060010190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b6163746976652070726f787960a01b606082015260800190565b6000602082840312156200256257600080fd5b5051919050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6020815260008235620025a58162001fc2565b60018060a01b03811660208401525060208301356040830152604083013560608301526060830135601e19843603018112620025e057600080fd5b830160208101903567ffffffffffffffff811115620025fe57600080fd5b8036038213156200260e57600080fd5b60808085015262001f5960a08501828462002569565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b8082018082111562000e5c5762000e5c62002485565b600080858511156200269657600080fd5b83861115620026a457600080fd5b5050820193919092039150565b60008251620026c5818460208701620022fd565b9190910192915050565b60208152600062000e5960208301846200232356fe60806040526040516109023803806109028339810160408190526100229161045f565b818161003082826000610039565b50505050610589565b61004283610104565b6040516001600160a01b038416907f1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e90600090a26000825111806100835750805b156100ff576100fd836001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100ed919061051f565b836102a760201b6100271760201c565b505b505050565b610117816102d360201b6100531760201c565b6101765760405162461bcd60e51b815260206004820152602560248201527f455243313936373a206e657720626561636f6e206973206e6f74206120636f6e6044820152641d1c9858dd60da1b60648201526084015b60405180910390fd5b6101ea816001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156101b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101db919061051f565b6102d360201b6100531760201c565b61024f5760405162461bcd60e51b815260206004820152603060248201527f455243313936373a20626561636f6e20696d706c656d656e746174696f6e206960448201526f1cc81b9bdd08184818dbdb9d1c9858dd60821b606482015260840161016d565b806102867fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d5060001b6102e260201b6100621760201c565b80546001600160a01b0319166001600160a01b039290921691909117905550565b60606102cc83836040518060600160405280602781526020016108db602791396102e5565b9392505050565b6001600160a01b03163b151590565b90565b6060600080856001600160a01b031685604051610302919061053a565b600060405180830381855af49150503d806000811461033d576040519150601f19603f3d011682016040523d82523d6000602084013e610342565b606091505b5090925090506103548683838761035e565b9695505050505050565b606083156103cd5782516000036103c6576001600160a01b0385163b6103c65760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161016d565b50816103d7565b6103d783836103df565b949350505050565b8151156103ef5781518083602001fd5b8060405162461bcd60e51b815260040161016d9190610556565b80516001600160a01b038116811461042057600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b8381101561045657818101518382015260200161043e565b50506000910152565b6000806040838503121561047257600080fd5b61047b83610409565b60208401519092506001600160401b038082111561049857600080fd5b818501915085601f8301126104ac57600080fd5b8151818111156104be576104be610425565b604051601f8201601f19908116603f011681019083821181831017156104e6576104e6610425565b816040528281528860208487010111156104ff57600080fd5b61051083602083016020880161043b565b80955050505050509250929050565b60006020828403121561053157600080fd5b6102cc82610409565b6000825161054c81846020870161043b565b9190910192915050565b602081526000825180602084015261057581604085016020870161043b565b601f01601f19169190910160400192915050565b610343806105986000396000f3fe60806040523661000b57005b610013610015565b005b610025610020610065565b6100fe565b565b606061004c83836040518060600160405280602781526020016102e760279139610122565b9392505050565b6001600160a01b03163b151590565b90565b60006100987fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50546001600160a01b031690565b6001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100f9919061024a565b905090565b3660008037600080366000845af43d6000803e80801561011d573d6000f35b3d6000fd5b6060600080856001600160a01b03168560405161013f9190610297565b600060405180830381855af49150503d806000811461017a576040519150601f19603f3d011682016040523d82523d6000602084013e61017f565b606091505b50915091506101908683838761019a565b9695505050505050565b6060831561020e578251600003610207576001600160a01b0385163b6102075760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064015b60405180910390fd5b5081610218565b6102188383610220565b949350505050565b8151156102305781518083602001fd5b8060405162461bcd60e51b81526004016101fe91906102b3565b60006020828403121561025c57600080fd5b81516001600160a01b038116811461004c57600080fd5b60005b8381101561028e578181015183820152602001610276565b50506000910152565b600082516102a9818460208701610273565b9190910192915050565b60208152600082518060208401526102d2816040850160208701610273565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220f0e3ef2d2445c27cb092c3417e9d772e131fc2383995e0d0d9ee96165dd0ab0b64736f6c63430008120033416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564608060405234801561001057600080fd5b506040516104e43803806104e483398101604081905261002f91610151565b61003833610047565b61004181610097565b50610181565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6100aa8161014260201b6101a01760201c565b6101205760405162461bcd60e51b815260206004820152603360248201527f5570677261646561626c65426561636f6e3a20696d706c656d656e746174696f60448201527f6e206973206e6f74206120636f6e747261637400000000000000000000000000606482015260840160405180910390fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b03163b151590565b60006020828403121561016357600080fd5b81516001600160a01b038116811461017a57600080fd5b9392505050565b610354806101906000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80633659cfe61461005c5780635c60da1b14610071578063715018a61461009a5780638da5cb5b146100a2578063f2fde38b146100b3575b600080fd5b61006f61006a3660046102ee565b6100c6565b005b6001546001600160a01b03165b6040516001600160a01b03909116815260200160405180910390f35b61006f61010e565b6000546001600160a01b031661007e565b61006f6100c13660046102ee565b610122565b6100ce6101af565b6100d781610209565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6101166101af565b610120600061029e565b565b61012a6101af565b6001600160a01b0381166101945760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b61019d8161029e565b50565b6001600160a01b03163b151590565b6000546001600160a01b031633146101205760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161018b565b6001600160a01b0381163b61027c5760405162461bcd60e51b815260206004820152603360248201527f5570677261646561626c65426561636f6e3a20696d706c656d656e746174696f6044820152721b881a5cc81b9bdd08184818dbdb9d1c9858dd606a1b606482015260840161018b565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60006020828403121561030057600080fd5b81356001600160a01b038116811461031757600080fd5b939250505056fea26469706673582212209f2075bb08aacaa7585daf8bbb94ff2d4da0d3e0654263dbde3f0bbbb81f211c64736f6c63430008120033360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a264697066735822122096d8f569086ac9ff85732fd5bd5def71e0773b0c67b9c13f912a1aa762d1343f64736f6c63430008120033000000000000000000000000893b0aea9c45fa8d3b0fbbebd03d4220b95145990000000000000000000000000000", + "nonce": "0x16" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x44fd2d87a8b692ae4257c1336d44296c4b1e4e78d2a0093d97a4fcb41dffa0f5", + "transactionType": "CALL", + "contractName": null, + "contractAddress": null, + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0xc1f4d15c16a1f3555e0a5f7aefd1e17ad4aaf40b", + "to": "0x8a4720488ca32f1223ccfe5a087e250fe3bc5d75", + "value": "0x0", + "data": "0x3659cfe60000000000000000000000001b5976043578c6f4d2d1d17d3d4ae89cf001b9d5", + "nonce": "0x3e" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0x88b587d4ae6dae4f7579ad6a32f0ea579802ad1c47a1b29fe6119995e2ef733b", + "transactionIndex": "0x1", + "blockHash": "0x1efef8c9a8c3e46f7085284d38e19c4c2ed839eef27e017151398b8ef2d23b89", + "blockNumber": "0xaf", + "from": "0x660ad4B5A74130a4796B4d54BC6750Ae93C86e6c", + "to": "0x8a4720488CA32f1223ccFE5A087e250fE3BC5D75", + "cumulativeGasUsed": "0x3584765", + "gasUsed": "0x3584765", + "contractAddress": null, + "logs": [ + { + "address": "0x1b5976043578C6F4d2D1d17D3d4AE89Cf001B9d5", + "topics": [ + "0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000ff", + "blockHash": "0x1efef8c9a8c3e46f7085284d38e19c4c2ed839eef27e017151398b8ef2d23b89", + "blockNumber": "0xaf", + "transactionHash": "0x88b587d4ae6dae4f7579ad6a32f0ea579802ad1c47a1b29fe6119995e2ef733b", + "transactionIndex": "0x1", + "logIndex": "0x0", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000080200000000000000000000000000000000000000000000400000000000000000000000000000400000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x0", + "effectiveGasPrice": "0x5f5e100" + }, + { + "transactionHash": "0x44fd2d87a8b692ae4257c1336d44296c4b1e4e78d2a0093d97a4fcb41dffa0f5", + "transactionIndex": "0x1", + "blockHash": "0x8da1a1ebbe983cf095e39962416bd2ae1a685daa7e03242ce851d0ef0ba9ff73", + "blockNumber": "0xb0", + "from": "0xc1f4D15C16A1f3555E0a5F7AeFD1e17AD4aaf40B", + "to": "0x8a4720488CA32f1223ccFE5A087e250fE3BC5D75", + "cumulativeGasUsed": "0x1163c2", + "gasUsed": "0x1163c2", + "contractAddress": null, + "logs": [ + { + "address": "0x8a4720488CA32f1223ccFE5A087e250fE3BC5D75", + "topics": [ + "0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b", + "0x0000000000000000000000001b5976043578c6f4d2d1d17d3d4ae89cf001b9d5" + ], + "data": "0x", + "blockHash": "0x8da1a1ebbe983cf095e39962416bd2ae1a685daa7e03242ce851d0ef0ba9ff73", + "blockNumber": "0xb0", + "transactionHash": "0x44fd2d87a8b692ae4257c1336d44296c4b1e4e78d2a0093d97a4fcb41dffa0f5", + "transactionIndex": "0x1", + "logIndex": "0x0", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000008000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000020000000000100000020000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x0", + "effectiveGasPrice": "0x5f5e100" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1705346386, + "chain": 7887, + "multi": false, + "commit": "7a64c5d" +} \ No newline at end of file diff --git a/broadcast/17-faucet_v3.sol/7887/run-1705353451.json b/broadcast/17-faucet_v3.sol/7887/run-1705353451.json new file mode 100644 index 000000000..55b53c307 --- /dev/null +++ b/broadcast/17-faucet_v3.sol/7887/run-1705353451.json @@ -0,0 +1,141 @@ +{ + "transactions": [ + { + "hash": "0x28ba1ce8701c8c13f731897f5e249e15ef4d7077a5639f590114d892d036c9ea", + "transactionType": "CALL", + "contractName": null, + "contractAddress": null, + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x660ad4b5a74130a4796b4d54bc6750ae93c86e6c", + "to": "0x8a4720488ca32f1223ccfe5a087e250fe3bc5d75", + "value": "0x0", + "data": "0x66d6e19b0000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f38000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000196e60c0604052306080523480156200001557600080fd5b506040516200194e3803806200194e833981016040819052620000389162000117565b806200004362000056565b6001600160a01b031660a0525062000149565b600054610100900460ff1615620000c35760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff9081161462000115576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6000602082840312156200012a57600080fd5b81516001600160a01b03811681146200014257600080fd5b9392505050565b60805160a0516117bc62000192600039600081816102a4015261055901526000818161063101528181610671015281816107100152818161075001526107e301526117bc6000f3fe6080604052600436106101025760003560e01c80637ecebe0011610095578063909d834d11610064578063909d834d1461028a578063c5c0369914610292578063c884ef83146102c6578063e9173036146102f6578063f2fde38b1461030b57600080fd5b80637ecebe00146102015780638129fc1c1461022e578063853828b6146102435780638da5cb5b1461025857600080fd5b80634f1ef286116100d15780634f1ef286146101a857806352d1902d146101bb578063715018a6146101d057806376697640146101e557600080fd5b806302fb0c5e1461010e578063270ef3851461013d5780633253f678146101665780633659cfe61461018857600080fd5b3661010957005b600080fd5b34801561011a57600080fd5b5060ca546101289060ff1681565b60405190151581526020015b60405180910390f35b34801561014957600080fd5b5061015866016bcc41e9000081565b604051908152602001610134565b34801561017257600080fd5b506101866101813660046113d5565b61032b565b005b34801561019457600080fd5b506101866101a336600461142c565b610627565b6101866101b636600461145d565b610706565b3480156101c757600080fd5b506101586107d6565b3480156101dc57600080fd5b50610186610889565b3480156101f157600080fd5b50610158670de0b6b3a764000081565b34801561020d57600080fd5b5061015861021c36600461142c565b60cb6020526000908152604090205481565b34801561023a57600080fd5b5061018661089d565b34801561024f57600080fd5b506101866109be565b34801561026457600080fd5b506097546001600160a01b03165b6040516001600160a01b039091168152602001610134565b6101866109ff565b34801561029e57600080fd5b506102727f000000000000000000000000000000000000000000000000000000000000000081565b3480156102d257600080fd5b506101286102e136600461142c565b60c96020526000908152604090205460ff1681565b34801561030257600080fd5b50610186610a6e565b34801561031757600080fd5b5061018661032636600461142c565b610a77565b808060400135421061037c5760405162461bcd60e51b815260206004820152601560248201527414da59db985d1d5c99481a185cc8195e1c1a5c9959605a1b60448201526064015b60405180910390fd5b6020810180359060cb90600090610393908561142c565b6001600160a01b03166001600160a01b0316815260200190815260200160002054146103f15760405162461bcd60e51b815260206004820152600d60248201526c496e76616c6964204e6f6e636560981b6044820152606401610373565b60006104ac610403602084018461142c565b30604085013560cb600061041a602089018961142c565b6001600160a01b0390811682526020808301939093526040918201600020548251968216938701939093529390931692840192909252606083015260808201524660a082015260c001604051602081830303815290604052805190602001207f19457468657265756d205369676e6564204d6573736167653a0a3332000000006000908152601c91909152603c902090565b9050610511816104bf606085018561151f565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061050192505050602086018661142c565b6001600160a01b03169190610aed565b61054e5760405162461bcd60e51b815260206004820152600e60248201526d24b73b30b634b21029b4b3b732b960911b6044820152606401610373565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105d05760405162461bcd60e51b815260206004820152602160248201527f4f6e6c792077616c6c657420666163746f72792063616e2063616c6c207468696044820152607360f81b6064820152608401610373565b6105e56105e0602085018561142c565b610b50565b60cb60006105f6602086018661142c565b6001600160a01b031681526020810191909152604001600090812080549161061d83611566565b9190505550505050565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016300361066f5760405162461bcd60e51b81526004016103739061158d565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166106b8600080516020611740833981519152546001600160a01b031690565b6001600160a01b0316146106de5760405162461bcd60e51b8152600401610373906115d9565b6106e781610cbe565b6040805160008082526020820190925261070391839190610d05565b50565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016300361074e5760405162461bcd60e51b81526004016103739061158d565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610797600080516020611740833981519152546001600160a01b031690565b6001600160a01b0316146107bd5760405162461bcd60e51b8152600401610373906115d9565b6107c682610cbe565b6107d282826001610d05565b5050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146108765760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c00000000000000006064820152608401610373565b5060008051602061174083398151915290565b610891610e75565b61089b6000610ecf565b565b600054610100900460ff16158080156108bd5750600054600160ff909116105b806108d75750303b1580156108d7575060005460ff166001145b61093a5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610373565b6000805460ff19166001179055801561095d576000805461ff0019166101001790555b610965610f21565b61096d610f50565b61097633610ecf565b8015610703576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150565b6109c6610e75565b60405133904780156108fc02916000818181858888f193505050501580156109f2573d6000803e3d6000fd5b5060ca805460ff19169055565b610a07610e75565b670de0b6b3a7640000471015610a5f5760405162461bcd60e51b815260206004820152601e60248201527f4e6f7420656e6f7567682045544820746f2073746172742066617563657400006044820152606401610373565b60ca805460ff19166001179055565b61089b33610b50565b610a7f610e75565b6001600160a01b038116610ae45760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610373565b61070381610ecf565b6000806000610afc8585610f77565b90925090506000816004811115610b1557610b15611625565b148015610b335750856001600160a01b0316826001600160a01b0316145b80610b445750610b44868686610fbc565b925050505b9392505050565b60ca5460ff16610b995760405162461bcd60e51b8152602060048201526014602482015273466175636574206973206e6f742061637469766560601b6044820152606401610373565b6001600160a01b038116600090815260c9602052604090205460ff1615610c115760405162461bcd60e51b815260206004820152602660248201527f596f75206861766520616c726561647920636c61696d656420796f7572204b696044820152650dce8de8aa8960d31b6064820152608401610373565b6001600160a01b038116600081815260c96020526040808220805460ff191660011790555166016bcc41e900009082818181858883f19350505050158015610c5d573d6000803e3d6000fd5b5066016bcc41e90000471015610c785760ca805460ff191690555b806001600160a01b03167f47cee97cb7acd717b3c0aa1435d004cd5b3c8c57d70dbceb4e4458bbd60e39d442604051610cb391815260200190565b60405180910390a250565b6097546001600160a01b031633146107035760405162461bcd60e51b815260206004820152600a60248201526937b7363c9037bbb732b960b11b6044820152606401610373565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff1615610d3d57610d38836110a8565b505050565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015610d97575060408051601f3d908101601f19168201909252610d949181019061163b565b60015b610dfa5760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b6064820152608401610373565b6000805160206117408339815191528114610e695760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b6064820152608401610373565b50610d38838383611144565b6097546001600160a01b0316331461089b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610373565b609780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600054610100900460ff16610f485760405162461bcd60e51b815260040161037390611654565b61089b61116f565b600054610100900460ff1661089b5760405162461bcd60e51b815260040161037390611654565b6000808251604103610fad5760208301516040840151606085015160001a610fa18782858561119f565b94509450505050610fb5565b506000905060025b9250929050565b6000806000856001600160a01b0316631626ba7e60e01b8686604051602401610fe69291906116ef565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b03199094169390931790925290516110249190611710565b600060405180830381855afa9150503d806000811461105f576040519150601f19603f3d011682016040523d82523d6000602084013e611064565b606091505b509150915081801561107857506020815110155b8015610b4457508051630b135d3f60e11b9061109d908301602090810190840161163b565b149695505050505050565b6001600160a01b0381163b6111155760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401610373565b60008051602061174083398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b61114d83611263565b60008251118061115a5750805b15610d385761116983836112a3565b50505050565b600054610100900460ff166111965760405162461bcd60e51b815260040161037390611654565b61089b33610ecf565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156111d6575060009050600361125a565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa15801561122a573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166112535760006001925092505061125a565b9150600090505b94509492505050565b61126c816110a8565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606001600160a01b0383163b61130b5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b6064820152608401610373565b600080846001600160a01b0316846040516113269190611710565b600060405180830381855af49150503d8060008114611361576040519150601f19603f3d011682016040523d82523d6000602084013e611366565b606091505b509150915061138e828260405180606001604052806027815260200161176060279139611397565b95945050505050565b606083156113a6575081610b49565b610b4983838151156113bb5781518083602001fd5b8060405162461bcd60e51b8152600401610373919061172c565b6000602082840312156113e757600080fd5b813567ffffffffffffffff8111156113fe57600080fd5b820160808185031215610b4957600080fd5b80356001600160a01b038116811461142757600080fd5b919050565b60006020828403121561143e57600080fd5b610b4982611410565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561147057600080fd5b61147983611410565b9150602083013567ffffffffffffffff8082111561149657600080fd5b818501915085601f8301126114aa57600080fd5b8135818111156114bc576114bc611447565b604051601f8201601f19908116603f011681019083821181831017156114e4576114e4611447565b816040528281528860208487010111156114fd57600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b6000808335601e1984360301811261153657600080fd5b83018035915067ffffffffffffffff82111561155157600080fd5b602001915036819003821315610fb557600080fd5b60006001820161158657634e487b7160e01b600052601160045260246000fd5b5060010190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b6163746976652070726f787960a01b606082015260800190565b634e487b7160e01b600052602160045260246000fd5b60006020828403121561164d57600080fd5b5051919050565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b60005b838110156116ba5781810151838201526020016116a2565b50506000910152565b600081518084526116db81602086016020860161169f565b601f01601f19169290920160200192915050565b82815260406020820152600061170860408301846116c3565b949350505050565b6000825161172281846020870161169f565b9190910192915050565b602081526000610b4960208301846116c356fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220caec238fca5bac131da1c80db469bec4b5ce4ad027cca03265148b438ffec7b464736f6c634300081200330000000000000000000000008a4720488ca32f1223ccfe5a087e250fe3bc5d75000000000000000000000000000000000000", + "nonce": "0x17", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xfe63ae596cffd80e9f173f0b10c5e9e06d9e3c89dc51999665840c8addaf1119", + "transactionType": "CALL", + "contractName": null, + "contractAddress": null, + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x660ad4b5a74130a4796b4d54bc6750ae93c86e6c", + "to": "0x2843c269d2a64ecfa63548e8b3fc0fd23b7f70cb", + "value": "0x0", + "data": "0x1fad948c0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000660ad4b5a74130a4796b4d54bc6750ae93c86e6c000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000200000000000000000000000002e2b1c42e38f5af81771e65d87729e57abd1337a00000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000003d0900000000000000000000000000000000000000000000000000000000000003345000000000000000000000000000000000000000000000000000000000000052080000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000003b9aca00000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000002c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c4b61d27f60000000000000000000000000719d47a213149e2ef8d3f5afdada8a8e22dfc030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000243659cfe6000000000000000000000000a0bb7432357634e66b9f56aed03e46c4abffea49000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000141842a4eff3efd24c50b63c3cf89cecee245fc2bd0000000000000000000000000000000000000000000000000000000000000000000000000000000000000041c6770922fe6eda7460eb83729895c08da9ee5254a43ae2377bc6b23fa521661158e2682bb2da2d7399aa7f33e6908f1da8c5ba1b9461e15b86390f5f7f9dfce61b00000000000000000000000000000000000000000000000000000000000000", + "nonce": "0x18", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0x28ba1ce8701c8c13f731897f5e249e15ef4d7077a5639f590114d892d036c9ea", + "transactionIndex": "0x1", + "blockHash": "0xe7985867ee7d0a71214f960893d318976efb917d677e21c662989f224c147517", + "blockNumber": "0xb3", + "from": "0x660ad4B5A74130a4796B4d54BC6750Ae93C86e6c", + "to": "0x8a4720488CA32f1223ccFE5A087e250fE3BC5D75", + "cumulativeGasUsed": "0x1f26b7d", + "gasUsed": "0x1f26b7d", + "contractAddress": null, + "logs": [ + { + "address": "0xa0BB7432357634e66b9F56AED03e46c4abfFea49", + "topics": [ + "0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000ff", + "blockHash": "0xe7985867ee7d0a71214f960893d318976efb917d677e21c662989f224c147517", + "blockNumber": "0xb3", + "transactionHash": "0x28ba1ce8701c8c13f731897f5e249e15ef4d7077a5639f590114d892d036c9ea", + "transactionIndex": "0x1", + "logIndex": "0x0", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0x5f5e100" + }, + { + "transactionHash": "0xfe63ae596cffd80e9f173f0b10c5e9e06d9e3c89dc51999665840c8addaf1119", + "transactionIndex": "0x1", + "blockHash": "0xf3b16ec6c989d2dcc1bc9177952bd1fa1da9c995e4f24e29fdab57f3ce98d59d", + "blockNumber": "0xb4", + "from": "0x660ad4B5A74130a4796B4d54BC6750Ae93C86e6c", + "to": "0x2843C269D2a64eCfA63548E8B3Fc0FD23B7F70cb", + "cumulativeGasUsed": "0x4a771d", + "gasUsed": "0x4a771d", + "contractAddress": null, + "logs": [ + { + "address": "0x2843C269D2a64eCfA63548E8B3Fc0FD23B7F70cb", + "topics": [ + "0xbb47ee3e183a558b1a2ff0874b079f3fc5478b7454eacf2bfc5af2ff5878f972" + ], + "data": "0x", + "blockHash": "0xf3b16ec6c989d2dcc1bc9177952bd1fa1da9c995e4f24e29fdab57f3ce98d59d", + "blockNumber": "0xb4", + "transactionHash": "0xfe63ae596cffd80e9f173f0b10c5e9e06d9e3c89dc51999665840c8addaf1119", + "transactionIndex": "0x1", + "logIndex": "0x0", + "removed": false + }, + { + "address": "0x0719D47A213149E2Ef8d3f5afDaDA8a8E22dfc03", + "topics": [ + "0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b", + "0x000000000000000000000000a0bb7432357634e66b9f56aed03e46c4abffea49" + ], + "data": "0x", + "blockHash": "0xf3b16ec6c989d2dcc1bc9177952bd1fa1da9c995e4f24e29fdab57f3ce98d59d", + "blockNumber": "0xb4", + "transactionHash": "0xfe63ae596cffd80e9f173f0b10c5e9e06d9e3c89dc51999665840c8addaf1119", + "transactionIndex": "0x1", + "logIndex": "0x1", + "removed": false + }, + { + "address": "0x2843C269D2a64eCfA63548E8B3Fc0FD23B7F70cb", + "topics": [ + "0x49628fd1471006c1482da88028e9ce4dbb080b815c9b0344d39e5a8e6ec1419f", + "0xf6610fa041c2572bcd6ecbae72a3cdf800857c1792a884988b7c595561a05d1e", + "0x0000000000000000000000002e2b1c42e38f5af81771e65d87729e57abd1337a", + "0x0000000000000000000000001842a4eff3efd24c50b63c3cf89cecee245fc2bd" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000009b974000000000000000000000000000000000000000000000000000000000009b974", + "blockHash": "0xf3b16ec6c989d2dcc1bc9177952bd1fa1da9c995e4f24e29fdab57f3ce98d59d", + "blockNumber": "0xb4", + "transactionHash": "0xfe63ae596cffd80e9f173f0b10c5e9e06d9e3c89dc51999665840c8addaf1119", + "transactionIndex": "0x1", + "logIndex": "0x2", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x40000000000000000000000000004000400000000000000000000000000000000008000000000000000000010000000000000000000000000000020000000000000000000000000000010000000002000000000000000000000000000000000800000000000000000000000000000800002000000000000000000000000000000000000000000000000100000000800000000008000000000000400000000000000400000012000000400000000000000004000000000000000002000000000000000020010000100001000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0x5f5e100" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1705353451, + "chain": 7887, + "multi": false, + "commit": "10f6ab9" +} \ No newline at end of file diff --git a/broadcast/17-faucet_v3.sol/7887/run-latest.json b/broadcast/17-faucet_v3.sol/7887/run-latest.json new file mode 100644 index 000000000..55b53c307 --- /dev/null +++ b/broadcast/17-faucet_v3.sol/7887/run-latest.json @@ -0,0 +1,141 @@ +{ + "transactions": [ + { + "hash": "0x28ba1ce8701c8c13f731897f5e249e15ef4d7077a5639f590114d892d036c9ea", + "transactionType": "CALL", + "contractName": null, + "contractAddress": null, + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x660ad4b5a74130a4796b4d54bc6750ae93c86e6c", + "to": "0x8a4720488ca32f1223ccfe5a087e250fe3bc5d75", + "value": "0x0", + "data": "0x66d6e19b0000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f38000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000196e60c0604052306080523480156200001557600080fd5b506040516200194e3803806200194e833981016040819052620000389162000117565b806200004362000056565b6001600160a01b031660a0525062000149565b600054610100900460ff1615620000c35760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff9081161462000115576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6000602082840312156200012a57600080fd5b81516001600160a01b03811681146200014257600080fd5b9392505050565b60805160a0516117bc62000192600039600081816102a4015261055901526000818161063101528181610671015281816107100152818161075001526107e301526117bc6000f3fe6080604052600436106101025760003560e01c80637ecebe0011610095578063909d834d11610064578063909d834d1461028a578063c5c0369914610292578063c884ef83146102c6578063e9173036146102f6578063f2fde38b1461030b57600080fd5b80637ecebe00146102015780638129fc1c1461022e578063853828b6146102435780638da5cb5b1461025857600080fd5b80634f1ef286116100d15780634f1ef286146101a857806352d1902d146101bb578063715018a6146101d057806376697640146101e557600080fd5b806302fb0c5e1461010e578063270ef3851461013d5780633253f678146101665780633659cfe61461018857600080fd5b3661010957005b600080fd5b34801561011a57600080fd5b5060ca546101289060ff1681565b60405190151581526020015b60405180910390f35b34801561014957600080fd5b5061015866016bcc41e9000081565b604051908152602001610134565b34801561017257600080fd5b506101866101813660046113d5565b61032b565b005b34801561019457600080fd5b506101866101a336600461142c565b610627565b6101866101b636600461145d565b610706565b3480156101c757600080fd5b506101586107d6565b3480156101dc57600080fd5b50610186610889565b3480156101f157600080fd5b50610158670de0b6b3a764000081565b34801561020d57600080fd5b5061015861021c36600461142c565b60cb6020526000908152604090205481565b34801561023a57600080fd5b5061018661089d565b34801561024f57600080fd5b506101866109be565b34801561026457600080fd5b506097546001600160a01b03165b6040516001600160a01b039091168152602001610134565b6101866109ff565b34801561029e57600080fd5b506102727f000000000000000000000000000000000000000000000000000000000000000081565b3480156102d257600080fd5b506101286102e136600461142c565b60c96020526000908152604090205460ff1681565b34801561030257600080fd5b50610186610a6e565b34801561031757600080fd5b5061018661032636600461142c565b610a77565b808060400135421061037c5760405162461bcd60e51b815260206004820152601560248201527414da59db985d1d5c99481a185cc8195e1c1a5c9959605a1b60448201526064015b60405180910390fd5b6020810180359060cb90600090610393908561142c565b6001600160a01b03166001600160a01b0316815260200190815260200160002054146103f15760405162461bcd60e51b815260206004820152600d60248201526c496e76616c6964204e6f6e636560981b6044820152606401610373565b60006104ac610403602084018461142c565b30604085013560cb600061041a602089018961142c565b6001600160a01b0390811682526020808301939093526040918201600020548251968216938701939093529390931692840192909252606083015260808201524660a082015260c001604051602081830303815290604052805190602001207f19457468657265756d205369676e6564204d6573736167653a0a3332000000006000908152601c91909152603c902090565b9050610511816104bf606085018561151f565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061050192505050602086018661142c565b6001600160a01b03169190610aed565b61054e5760405162461bcd60e51b815260206004820152600e60248201526d24b73b30b634b21029b4b3b732b960911b6044820152606401610373565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105d05760405162461bcd60e51b815260206004820152602160248201527f4f6e6c792077616c6c657420666163746f72792063616e2063616c6c207468696044820152607360f81b6064820152608401610373565b6105e56105e0602085018561142c565b610b50565b60cb60006105f6602086018661142c565b6001600160a01b031681526020810191909152604001600090812080549161061d83611566565b9190505550505050565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016300361066f5760405162461bcd60e51b81526004016103739061158d565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166106b8600080516020611740833981519152546001600160a01b031690565b6001600160a01b0316146106de5760405162461bcd60e51b8152600401610373906115d9565b6106e781610cbe565b6040805160008082526020820190925261070391839190610d05565b50565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016300361074e5760405162461bcd60e51b81526004016103739061158d565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610797600080516020611740833981519152546001600160a01b031690565b6001600160a01b0316146107bd5760405162461bcd60e51b8152600401610373906115d9565b6107c682610cbe565b6107d282826001610d05565b5050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146108765760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c00000000000000006064820152608401610373565b5060008051602061174083398151915290565b610891610e75565b61089b6000610ecf565b565b600054610100900460ff16158080156108bd5750600054600160ff909116105b806108d75750303b1580156108d7575060005460ff166001145b61093a5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610373565b6000805460ff19166001179055801561095d576000805461ff0019166101001790555b610965610f21565b61096d610f50565b61097633610ecf565b8015610703576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150565b6109c6610e75565b60405133904780156108fc02916000818181858888f193505050501580156109f2573d6000803e3d6000fd5b5060ca805460ff19169055565b610a07610e75565b670de0b6b3a7640000471015610a5f5760405162461bcd60e51b815260206004820152601e60248201527f4e6f7420656e6f7567682045544820746f2073746172742066617563657400006044820152606401610373565b60ca805460ff19166001179055565b61089b33610b50565b610a7f610e75565b6001600160a01b038116610ae45760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610373565b61070381610ecf565b6000806000610afc8585610f77565b90925090506000816004811115610b1557610b15611625565b148015610b335750856001600160a01b0316826001600160a01b0316145b80610b445750610b44868686610fbc565b925050505b9392505050565b60ca5460ff16610b995760405162461bcd60e51b8152602060048201526014602482015273466175636574206973206e6f742061637469766560601b6044820152606401610373565b6001600160a01b038116600090815260c9602052604090205460ff1615610c115760405162461bcd60e51b815260206004820152602660248201527f596f75206861766520616c726561647920636c61696d656420796f7572204b696044820152650dce8de8aa8960d31b6064820152608401610373565b6001600160a01b038116600081815260c96020526040808220805460ff191660011790555166016bcc41e900009082818181858883f19350505050158015610c5d573d6000803e3d6000fd5b5066016bcc41e90000471015610c785760ca805460ff191690555b806001600160a01b03167f47cee97cb7acd717b3c0aa1435d004cd5b3c8c57d70dbceb4e4458bbd60e39d442604051610cb391815260200190565b60405180910390a250565b6097546001600160a01b031633146107035760405162461bcd60e51b815260206004820152600a60248201526937b7363c9037bbb732b960b11b6044820152606401610373565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff1615610d3d57610d38836110a8565b505050565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015610d97575060408051601f3d908101601f19168201909252610d949181019061163b565b60015b610dfa5760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b6064820152608401610373565b6000805160206117408339815191528114610e695760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b6064820152608401610373565b50610d38838383611144565b6097546001600160a01b0316331461089b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610373565b609780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600054610100900460ff16610f485760405162461bcd60e51b815260040161037390611654565b61089b61116f565b600054610100900460ff1661089b5760405162461bcd60e51b815260040161037390611654565b6000808251604103610fad5760208301516040840151606085015160001a610fa18782858561119f565b94509450505050610fb5565b506000905060025b9250929050565b6000806000856001600160a01b0316631626ba7e60e01b8686604051602401610fe69291906116ef565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b03199094169390931790925290516110249190611710565b600060405180830381855afa9150503d806000811461105f576040519150601f19603f3d011682016040523d82523d6000602084013e611064565b606091505b509150915081801561107857506020815110155b8015610b4457508051630b135d3f60e11b9061109d908301602090810190840161163b565b149695505050505050565b6001600160a01b0381163b6111155760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401610373565b60008051602061174083398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b61114d83611263565b60008251118061115a5750805b15610d385761116983836112a3565b50505050565b600054610100900460ff166111965760405162461bcd60e51b815260040161037390611654565b61089b33610ecf565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156111d6575060009050600361125a565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa15801561122a573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166112535760006001925092505061125a565b9150600090505b94509492505050565b61126c816110a8565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606001600160a01b0383163b61130b5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b6064820152608401610373565b600080846001600160a01b0316846040516113269190611710565b600060405180830381855af49150503d8060008114611361576040519150601f19603f3d011682016040523d82523d6000602084013e611366565b606091505b509150915061138e828260405180606001604052806027815260200161176060279139611397565b95945050505050565b606083156113a6575081610b49565b610b4983838151156113bb5781518083602001fd5b8060405162461bcd60e51b8152600401610373919061172c565b6000602082840312156113e757600080fd5b813567ffffffffffffffff8111156113fe57600080fd5b820160808185031215610b4957600080fd5b80356001600160a01b038116811461142757600080fd5b919050565b60006020828403121561143e57600080fd5b610b4982611410565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561147057600080fd5b61147983611410565b9150602083013567ffffffffffffffff8082111561149657600080fd5b818501915085601f8301126114aa57600080fd5b8135818111156114bc576114bc611447565b604051601f8201601f19908116603f011681019083821181831017156114e4576114e4611447565b816040528281528860208487010111156114fd57600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b6000808335601e1984360301811261153657600080fd5b83018035915067ffffffffffffffff82111561155157600080fd5b602001915036819003821315610fb557600080fd5b60006001820161158657634e487b7160e01b600052601160045260246000fd5b5060010190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b6163746976652070726f787960a01b606082015260800190565b634e487b7160e01b600052602160045260246000fd5b60006020828403121561164d57600080fd5b5051919050565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b60005b838110156116ba5781810151838201526020016116a2565b50506000910152565b600081518084526116db81602086016020860161169f565b601f01601f19169290920160200192915050565b82815260406020820152600061170860408301846116c3565b949350505050565b6000825161172281846020870161169f565b9190910192915050565b602081526000610b4960208301846116c356fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220caec238fca5bac131da1c80db469bec4b5ce4ad027cca03265148b438ffec7b464736f6c634300081200330000000000000000000000008a4720488ca32f1223ccfe5a087e250fe3bc5d75000000000000000000000000000000000000", + "nonce": "0x17", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xfe63ae596cffd80e9f173f0b10c5e9e06d9e3c89dc51999665840c8addaf1119", + "transactionType": "CALL", + "contractName": null, + "contractAddress": null, + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x660ad4b5a74130a4796b4d54bc6750ae93c86e6c", + "to": "0x2843c269d2a64ecfa63548e8b3fc0fd23b7f70cb", + "value": "0x0", + "data": "0x1fad948c0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000660ad4b5a74130a4796b4d54bc6750ae93c86e6c000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000200000000000000000000000002e2b1c42e38f5af81771e65d87729e57abd1337a00000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000003d0900000000000000000000000000000000000000000000000000000000000003345000000000000000000000000000000000000000000000000000000000000052080000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000003b9aca00000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000002c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c4b61d27f60000000000000000000000000719d47a213149e2ef8d3f5afdada8a8e22dfc030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000243659cfe6000000000000000000000000a0bb7432357634e66b9f56aed03e46c4abffea49000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000141842a4eff3efd24c50b63c3cf89cecee245fc2bd0000000000000000000000000000000000000000000000000000000000000000000000000000000000000041c6770922fe6eda7460eb83729895c08da9ee5254a43ae2377bc6b23fa521661158e2682bb2da2d7399aa7f33e6908f1da8c5ba1b9461e15b86390f5f7f9dfce61b00000000000000000000000000000000000000000000000000000000000000", + "nonce": "0x18", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0x28ba1ce8701c8c13f731897f5e249e15ef4d7077a5639f590114d892d036c9ea", + "transactionIndex": "0x1", + "blockHash": "0xe7985867ee7d0a71214f960893d318976efb917d677e21c662989f224c147517", + "blockNumber": "0xb3", + "from": "0x660ad4B5A74130a4796B4d54BC6750Ae93C86e6c", + "to": "0x8a4720488CA32f1223ccFE5A087e250fE3BC5D75", + "cumulativeGasUsed": "0x1f26b7d", + "gasUsed": "0x1f26b7d", + "contractAddress": null, + "logs": [ + { + "address": "0xa0BB7432357634e66b9F56AED03e46c4abfFea49", + "topics": [ + "0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000ff", + "blockHash": "0xe7985867ee7d0a71214f960893d318976efb917d677e21c662989f224c147517", + "blockNumber": "0xb3", + "transactionHash": "0x28ba1ce8701c8c13f731897f5e249e15ef4d7077a5639f590114d892d036c9ea", + "transactionIndex": "0x1", + "logIndex": "0x0", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0x5f5e100" + }, + { + "transactionHash": "0xfe63ae596cffd80e9f173f0b10c5e9e06d9e3c89dc51999665840c8addaf1119", + "transactionIndex": "0x1", + "blockHash": "0xf3b16ec6c989d2dcc1bc9177952bd1fa1da9c995e4f24e29fdab57f3ce98d59d", + "blockNumber": "0xb4", + "from": "0x660ad4B5A74130a4796B4d54BC6750Ae93C86e6c", + "to": "0x2843C269D2a64eCfA63548E8B3Fc0FD23B7F70cb", + "cumulativeGasUsed": "0x4a771d", + "gasUsed": "0x4a771d", + "contractAddress": null, + "logs": [ + { + "address": "0x2843C269D2a64eCfA63548E8B3Fc0FD23B7F70cb", + "topics": [ + "0xbb47ee3e183a558b1a2ff0874b079f3fc5478b7454eacf2bfc5af2ff5878f972" + ], + "data": "0x", + "blockHash": "0xf3b16ec6c989d2dcc1bc9177952bd1fa1da9c995e4f24e29fdab57f3ce98d59d", + "blockNumber": "0xb4", + "transactionHash": "0xfe63ae596cffd80e9f173f0b10c5e9e06d9e3c89dc51999665840c8addaf1119", + "transactionIndex": "0x1", + "logIndex": "0x0", + "removed": false + }, + { + "address": "0x0719D47A213149E2Ef8d3f5afDaDA8a8E22dfc03", + "topics": [ + "0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b", + "0x000000000000000000000000a0bb7432357634e66b9f56aed03e46c4abffea49" + ], + "data": "0x", + "blockHash": "0xf3b16ec6c989d2dcc1bc9177952bd1fa1da9c995e4f24e29fdab57f3ce98d59d", + "blockNumber": "0xb4", + "transactionHash": "0xfe63ae596cffd80e9f173f0b10c5e9e06d9e3c89dc51999665840c8addaf1119", + "transactionIndex": "0x1", + "logIndex": "0x1", + "removed": false + }, + { + "address": "0x2843C269D2a64eCfA63548E8B3Fc0FD23B7F70cb", + "topics": [ + "0x49628fd1471006c1482da88028e9ce4dbb080b815c9b0344d39e5a8e6ec1419f", + "0xf6610fa041c2572bcd6ecbae72a3cdf800857c1792a884988b7c595561a05d1e", + "0x0000000000000000000000002e2b1c42e38f5af81771e65d87729e57abd1337a", + "0x0000000000000000000000001842a4eff3efd24c50b63c3cf89cecee245fc2bd" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000009b974000000000000000000000000000000000000000000000000000000000009b974", + "blockHash": "0xf3b16ec6c989d2dcc1bc9177952bd1fa1da9c995e4f24e29fdab57f3ce98d59d", + "blockNumber": "0xb4", + "transactionHash": "0xfe63ae596cffd80e9f173f0b10c5e9e06d9e3c89dc51999665840c8addaf1119", + "transactionIndex": "0x1", + "logIndex": "0x2", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x40000000000000000000000000004000400000000000000000000000000000000008000000000000000000010000000000000000000000000000020000000000000000000000000000010000000002000000000000000000000000000000000800000000000000000000000000000800002000000000000000000000000000000000000000000000000100000000800000000008000000000000400000000000000400000012000000400000000000000004000000000000000002000000000000000020010000100001000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0x5f5e100" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1705353451, + "chain": 7887, + "multi": false, + "commit": "10f6ab9" +} \ No newline at end of file diff --git a/script/migrations/03-mint_nft_admin.sol b/script/migrations/03-mint_nft_admin.sol index 27814ca64..8c984c79b 100644 --- a/script/migrations/03-mint_nft_admin.sol +++ b/script/migrations/03-mint_nft_admin.sol @@ -36,7 +36,7 @@ contract KintoMigration3DeployScript is Create2Helper, KYCSignature, ArtifactsRe _auxCreateSignature(_kintoIDv1, deployer, deployer, deployerPrivateKey, block.timestamp + 1000); vm.stopBroadcast(); vm.startBroadcast(); - uint8[] memory traits = new uint8[](1); + uint16[] memory traits = new uint16[](1); traits[0] = 0; // ADMIN _kintoIDv1.mintIndividualKyc(sigdata, traits); vm.stopBroadcast(); diff --git a/script/migrations/13-upgrade_id_paymasterv3.sol b/script/migrations/13-upgrade_id_paymasterv3.sol index 9be114ca5..7d7c53230 100644 --- a/script/migrations/13-upgrade_id_paymasterv3.sol +++ b/script/migrations/13-upgrade_id_paymasterv3.sol @@ -13,6 +13,8 @@ import "../../test/helpers/UUPSProxy.sol"; import "forge-std/Script.sol"; import "forge-std/console.sol"; +contract KintoIDV3 is KintoID {} + contract KintoMigration13DeployScript is Create2Helper, ArtifactsReader { using ECDSAUpgradeable for bytes32; diff --git a/script/migrations/14-factory_v3.sol b/script/migrations/14-factory_v3.sol index 671dee66d..36d0e8d9d 100644 --- a/script/migrations/14-factory_v3.sol +++ b/script/migrations/14-factory_v3.sol @@ -13,14 +13,16 @@ import "../../test/helpers/UUPSProxy.sol"; import "forge-std/Script.sol"; import "forge-std/console.sol"; +contract KintoWalletFactoryV3 is KintoWalletFactory { + constructor(IKintoWallet _implementation) KintoWalletFactory(_implementation) {} +} + contract KintoMigration14DeployScript is Create2Helper, ArtifactsReader { using ECDSAUpgradeable for bytes32; - SponsorPaymaster _paymaster; - SponsorPaymasterV3 _paymasterImpl; - KintoID _kintoID; KintoWalletFactoryV3 _factoryImpl; - UUPSProxy _proxy; + KintoID _kintoID; + KintoIDV4 _kintoIDImpl; function setUp() public {} @@ -30,7 +32,7 @@ contract KintoMigration14DeployScript is Create2Helper, ArtifactsReader { // Execute this script with the ledger admin but first we use the hot wallet uint256 deployerPrivateKey = vm.envUint("PRIVATE_KEY"); vm.startBroadcast(deployerPrivateKey); - console.log("Executing with address", msg.sender); + console.log("Executing with address", msg.sender, vm.envAddress("LEDGER_ADMIN")); address factoryAddr = _getChainDeployment("KintoWalletFactory"); if (factoryAddr == address(0)) { console.log("Need to execute main deploy script first", factoryAddr); @@ -41,6 +43,13 @@ contract KintoMigration14DeployScript is Create2Helper, ArtifactsReader { console.log("V3 already deployed", v3factory); return; } + + address kintoIDAddr = _getChainDeployment("KintoID"); + if (kintoIDAddr == address(0)) { + console.log("Need to execute main deploy script first", kintoIDAddr); + return; + } + IKintoWalletFactory _walletFactory = IKintoWalletFactory(payable(_getChainDeployment("KintoWalletFactory"))); address newImpl = _getChainDeployment("KintoWalletV3-impl"); @@ -48,23 +57,35 @@ contract KintoMigration14DeployScript is Create2Helper, ArtifactsReader { console.log("Need to deploy the new wallet first", newImpl); return; } + bytes memory bytecode = abi.encodePacked( type(KintoWalletFactoryV3).creationCode, - abi.encode(_getChainDeployment("KintoWalletV3-impl")) // Encoded constructor arguments + abi.encode(newImpl) // Encoded constructor arguments ); // 1) Deploy new wallet factory _factoryImpl = KintoWalletFactoryV3( payable(_walletFactory.deployContract(vm.envAddress("LEDGER_ADMIN"), 0, bytecode, bytes32(0))) ); + + // (2). deploy new kinto ID implementation via wallet factory + + _kintoID = KintoID(payable(kintoIDAddr)); + bytecode = abi.encodePacked(type(KintoIDV4).creationCode); + _kintoIDImpl = + KintoIDV4(payable(_walletFactory.deployContract(vm.envAddress("LEDGER_ADMIN"), 0, bytecode, bytes32(0)))); + vm.stopBroadcast(); // Start admin vm.startBroadcast(); - // 2) Upgrade wallet factory + // 3) Upgrade wallet factory KintoWalletFactory(address(_walletFactory)).upgradeTo(address(_factoryImpl)); + // (4). upgrade kinto id to new implementation + _kintoID.upgradeTo(address(_kintoIDImpl)); vm.stopBroadcast(); // writes the addresses to a file console.log("Add these new addresses to the artifacts file"); - console.log(string.concat('"KintoWalletFactoryV3-impl": "', vm.toString(address(newImpl)), '"')); + console.log(string.concat('"KintoWalletFactoryV3-impl": "', vm.toString(address(_factoryImpl)), '"')); + console.log(string.concat('"KintoIDV4-impl": "', vm.toString(address(_kintoIDImpl)), '"')); } } diff --git a/script/migrations/15-faucet_v2.sol b/script/migrations/15-faucet_v2.sol index b39526264..fc7a4d6bb 100644 --- a/script/migrations/15-faucet_v2.sol +++ b/script/migrations/15-faucet_v2.sol @@ -1,17 +1,21 @@ // SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.18; +import "../../src/interfaces/IKintoWalletFactory.sol"; +import "../../src/interfaces/IKintoWallet.sol"; +import "../../src/interfaces/ISponsorPaymaster.sol"; + import "../../src/Faucet.sol"; -import "../../src/wallet/KintoWalletFactory.sol"; import "../../test/helpers/Create2Helper.sol"; import "../../test/helpers/ArtifactsReader.sol"; import "../../test/helpers/UUPSProxy.sol"; +import "../../test/helpers/UserOp.sol"; import "forge-std/Script.sol"; import "forge-std/console.sol"; -contract KintoMigration15DeployScript is Create2Helper, ArtifactsReader { +contract KintoMigration15DeployScript is Create2Helper, ArtifactsReader, UserOp { using ECDSAUpgradeable for bytes32; Faucet _implementation; @@ -23,7 +27,7 @@ contract KintoMigration15DeployScript is Create2Helper, ArtifactsReader { console.log("Chain ID", vm.toString(block.chainid)); uint256 deployerPrivateKey = vm.envUint("PRIVATE_KEY"); - console.log("Executing with address", msg.sender); + console.log("Deployer address: ", vm.addr(deployerPrivateKey)); vm.startBroadcast(deployerPrivateKey); @@ -36,26 +40,91 @@ contract KintoMigration15DeployScript is Create2Helper, ArtifactsReader { require(factory != address(0), "Need to deploy the wallet factory first"); // use wallet factory to deploy Faucet implementation & proxy - KintoWalletFactory walletFactory = KintoWalletFactory(payable(factory)); + IKintoWalletFactory walletFactory = IKintoWalletFactory(payable(factory)); + address payable adminWallet = payable(_getChainDeployment("KintoWallet-admin")); - // deploy Faucet implementation + // (1). deploy Faucet implementation bytes memory bytecode = abi.encodePacked(type(Faucet).creationCode, abi.encode(factory)); _implementation = Faucet(payable(walletFactory.deployContract(msg.sender, 0, bytecode, bytes32(0)))); - // deploy Faucet proxy + // (2). deploy Faucet proxy bytecode = abi.encodePacked(type(UUPSProxy).creationCode, abi.encode(address(_implementation), "")); _proxy = UUPSProxy(payable(walletFactory.deployContract(msg.sender, 0, bytecode, bytes32(0)))); - // initialize proxy - Faucet(payable(address(_proxy))).initialize(); + // (3). fund Kinto wallet with 1 ether from deployer + walletFactory.fundWallet{value: 1 ether}(adminWallet); + + // (4). execute user ops (whitelist faucet on KintoWallet, initialise and startFaucet on Faucet) + _execute(adminWallet, address(_proxy), deployerPrivateKey); vm.stopBroadcast(); - // sanity check: faucet has the new claim amount + // sanity checks: + require(Faucet(payable(address(_proxy))).active(), "Faucet is not active"); require(Faucet(payable(address(_proxy))).CLAIM_AMOUNT() == 1 ether / 2500, "Claim amount is not correct"); // Writes the addresses to a file console.log(string.concat("Faucet-impl: ", vm.toString(address(_implementation)))); console.log(string.concat("Faucet: ", vm.toString(address(_proxy)))); } + + function _execute(address _from, address _faucet, uint256 _signerPk) internal { + // fund Faucet in the paymaster + ISponsorPaymaster _paymaster = ISponsorPaymaster(_getChainDeployment("SponsorPaymaster")); + _paymaster.addDepositFor{value: 0.1 ether}(address(address(_faucet))); + assertEq(_paymaster.balances(address(_proxy)), 0.1 ether); + + // prep user ops + uint256 nonce = IKintoWallet(_from).getNonce(); + uint256[] memory privateKeys = new uint256[](1); + privateKeys[0] = _signerPk; + UserOperation[] memory userOps = new UserOperation[](3); + + { + // (1). whitelist faucet + address[] memory apps = new address[](1); + apps[0] = address(_faucet); + + bool[] memory flags = new bool[](1); + flags[0] = true; + + userOps[0] = this.createUserOperation( + block.chainid, + _from, + nonce, + privateKeys, + _from, + 0, + abi.encodeWithSelector(IKintoWallet.whitelistApp.selector, apps, flags), + _getChainDeployment("SponsorPaymaster") + ); + } + + // (2). initialise faucet + userOps[1] = this.createUserOperation( + block.chainid, + _from, + nonce + 1, + privateKeys, + _faucet, + 0, + abi.encodeWithSelector(Faucet.initialize.selector), + _getChainDeployment("SponsorPaymaster") + ); + + // (3). call startFaucet + userOps[2] = this.createUserOperation( + block.chainid, + _from, + nonce + 2, + privateKeys, + _faucet, + 1 ether, + abi.encodeWithSelector(Faucet.startFaucet.selector), + _getChainDeployment("SponsorPaymaster") + ); + + // execute transaction via entry point & broadcast + IEntryPoint(_getChainDeployment("EntryPoint")).handleOps(userOps, payable(vm.addr(_signerPk))); + } } diff --git a/script/migrations/16-factory_v4.sol b/script/migrations/16-factory_v4.sol new file mode 100644 index 000000000..848af3a98 --- /dev/null +++ b/script/migrations/16-factory_v4.sol @@ -0,0 +1,69 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.18; + +import "../../src/wallet/KintoWalletFactory.sol"; +import "../../src/wallet/KintoWallet.sol"; +import "../../src/paymasters/SponsorPaymaster.sol"; +import "../../src/KintoID.sol"; + +import "../../test/helpers/Create2Helper.sol"; +import "../../test/helpers/ArtifactsReader.sol"; +import "../../test/helpers/UUPSProxy.sol"; + +import "forge-std/Script.sol"; +import "forge-std/console.sol"; + +contract KintoMigration16DeployScript is Create2Helper, ArtifactsReader { + using ECDSAUpgradeable for bytes32; + + KintoWalletFactoryV4 _factoryImpl; + + function setUp() public {} + + // NOTE: this migration must be run from the ledger admin + function run() public { + console.log("RUNNING ON CHAIN WITH ID", vm.toString(block.chainid)); + // Execute this script with the ledger admin but first we use the hot wallet + uint256 deployerPrivateKey = vm.envUint("PRIVATE_KEY"); + vm.startBroadcast(deployerPrivateKey); + console.log("Executing with address", msg.sender, vm.envAddress("LEDGER_ADMIN")); + address factoryAddr = _getChainDeployment("KintoWalletFactory"); + if (factoryAddr == address(0)) { + console.log("Need to execute main deploy script first", factoryAddr); + return; + } + address v3factory = _getChainDeployment("KintoWalletFactoryV4-impl"); + if (v3factory != address(0)) { + console.log("V4 already deployed", v3factory); + return; + } + + IKintoWalletFactory _walletFactory = IKintoWalletFactory(payable(_getChainDeployment("KintoWalletFactory"))); + + address newImpl = _getChainDeployment("KintoWalletV3-impl"); + if (newImpl == address(0)) { + console.log("Need to deploy the new wallet first", newImpl); + return; + } + + bytes memory bytecode = abi.encodePacked( + type(KintoWalletFactoryV4).creationCode, + abi.encode(newImpl) // Encoded constructor arguments + ); + + // 1) Deploy new wallet factory + _factoryImpl = KintoWalletFactoryV4( + payable(_walletFactory.deployContract(vm.envAddress("LEDGER_ADMIN"), 0, bytecode, bytes32(0))) + ); + + vm.stopBroadcast(); + // Start admin + vm.startBroadcast(); + // 2) Upgrade wallet factory + KintoWalletFactory(address(_walletFactory)).upgradeTo(address(_factoryImpl)); + vm.stopBroadcast(); + // writes the addresses to a file + console.log("Add these new addresses to the artifacts file"); + console.log(string.concat('"KintoWalletFactoryV4-impl": "', vm.toString(address(_factoryImpl)), '"')); + } +} diff --git a/script/migrations/17-faucet_v3.sol b/script/migrations/17-faucet_v3.sol new file mode 100644 index 000000000..16a6d5ce3 --- /dev/null +++ b/script/migrations/17-faucet_v3.sol @@ -0,0 +1,80 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.18; + +import "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol"; + +import "../../src/interfaces/IKintoWalletFactory.sol"; +import "../../src/interfaces/IKintoWallet.sol"; +import "../../src/interfaces/ISponsorPaymaster.sol"; + +import "../../src/Faucet.sol"; + +import "../../test/helpers/Create2Helper.sol"; +import "../../test/helpers/ArtifactsReader.sol"; +import "../../test/helpers/UUPSProxy.sol"; +import "../../test/helpers/UserOp.sol"; + +import "forge-std/Script.sol"; +import "forge-std/console.sol"; + +contract KintoMigration15DeployScript is Create2Helper, ArtifactsReader, UserOp { + using ECDSAUpgradeable for bytes32; + + FaucetV3 _implementation; + UUPSProxy _proxy; + + function setUp() public {} + + function run() public { + console.log("Chain ID", vm.toString(block.chainid)); + + uint256 deployerPrivateKey = vm.envUint("PRIVATE_KEY"); + console.log("Deployer address: ", vm.addr(deployerPrivateKey)); + + vm.startBroadcast(deployerPrivateKey); + + address faucetProxy = payable(_getChainDeployment("Faucet")); + require(faucetProxy != address(0), "Faucet proxy is already deployed"); + + // make sure wallet faucet v3 is not deployed + require(_getChainDeployment("FaucetV3-impl") == address(0), "Faucet v3 is already deployed"); + + // use wallet factory to deploy new Faucet implementation + address factory = _getChainDeployment("KintoWalletFactory"); + IKintoWalletFactory walletFactory = IKintoWalletFactory(payable(factory)); + + // deploy Faucet implementation + bytes memory bytecode = abi.encodePacked(type(FaucetV3).creationCode, abi.encode(factory)); + _implementation = FaucetV3(payable(walletFactory.deployContract(msg.sender, 0, bytecode, bytes32(0)))); + + _upgradeTo(address(_implementation), deployerPrivateKey); + + vm.stopBroadcast(); + + console.log(string.concat("Faucet-impl: ", vm.toString(address(_implementation)))); + } + + function _upgradeTo(address _newFaucetImpl, uint256 _signerPk) internal { + address payable adminWallet = payable(_getChainDeployment("KintoWallet-admin")); + address payable faucetProxy = payable(_getChainDeployment("Faucet")); + + // prep upgradeTo user op + uint256 nonce = IKintoWallet(adminWallet).getNonce(); + uint256[] memory privateKeys = new uint256[](1); + privateKeys[0] = _signerPk; + UserOperation[] memory userOps = new UserOperation[](1); + userOps[0] = this.createUserOperation( + block.chainid, + adminWallet, + nonce, + privateKeys, + faucetProxy, + 0, + abi.encodeWithSelector(UUPSUpgradeable.upgradeTo.selector, address(_newFaucetImpl)), + _getChainDeployment("SponsorPaymaster") + ); + + // execute transaction via entry point + IEntryPoint(_getChainDeployment("EntryPoint")).handleOps(userOps, payable(vm.addr(_signerPk))); + } +} diff --git a/script/test.sol b/script/test.sol index e0ad6f268..4406a5e7d 100644 --- a/script/test.sol +++ b/script/test.sol @@ -43,7 +43,7 @@ contract KintoDeployTestWalletScript is AASetup, KYCSignature { if (!_kintoID.isKYC(recipientWallet)) { IKintoID.SignatureData memory sigdata = _auxCreateSignature(_kintoID, recipientWallet, recipientWallet, recipientKey, block.timestamp + 1000); - uint8[] memory traits = new uint8[](0); + uint16[] memory traits = new uint16[](0); _kintoID.mintIndividualKyc(sigdata, traits); } diff --git a/src/Faucet.sol b/src/Faucet.sol index e58756b0e..07cb5c7bc 100644 --- a/src/Faucet.sol +++ b/src/Faucet.sol @@ -73,7 +73,7 @@ contract Faucet is Initializable, UUPSUpgradeable, OwnableUpgradeable, IFaucet { * @dev Claim via meta tx on behalf of a new account by the owner * @param _signatureData Signature data */ - function claimOnBehalf(IFaucet.SignatureData calldata _signatureData) external onlySignerVerified(_signatureData) { + function claimKintoETH(IFaucet.SignatureData calldata _signatureData) external onlySignerVerified(_signatureData) { require(msg.sender == address(walletFactory), "Only wallet factory can call this"); _privateClaim(_signatureData.signer); nonces[_signatureData.signer]++; @@ -91,7 +91,7 @@ contract Faucet is Initializable, UUPSUpgradeable, OwnableUpgradeable, IFaucet { * @dev Function to start the faucet */ function startFaucet() external payable override onlyOwner { - require(msg.value >= FAUCET_AMOUNT, "Not enough ETH to start faucet"); + require(address(this).balance >= FAUCET_AMOUNT, "Not enough ETH to start faucet"); active = true; } @@ -122,23 +122,16 @@ contract Faucet is Initializable, UUPSUpgradeable, OwnableUpgradeable, IFaucet { modifier onlySignerVerified(IFaucet.SignatureData calldata _signature) { require(block.timestamp < _signature.expiresAt, "Signature has expired"); require(nonces[_signature.signer] == _signature.nonce, "Invalid Nonce"); - bytes32 hash = keccak256( - abi.encodePacked( - "\x19\x01", - keccak256( - abi.encode( - _signature.signer, - address(this), - _signature.expiresAt, - nonces[_signature.signer], - bytes32(block.chainid) - ) - ) - ) - ) // EIP-191 header - .toEthSignedMessageHash(); - - require(_signature.signer.isValidSignatureNow(hash, _signature.signature), "Invalid Signer"); + + bytes32 dataHash = keccak256( + abi.encode(_signature.signer, address(this), _signature.expiresAt, nonces[_signature.signer], block.chainid) + ).toEthSignedMessageHash(); // EIP-712 hash + + require(_signature.signer.isValidSignatureNow(dataHash, _signature.signature), "Invalid Signer"); _; } } + +contract FaucetV3 is Faucet { + constructor(address _kintoWalletFactory) Faucet(_kintoWalletFactory) {} +} diff --git a/src/KintoID.sol b/src/KintoID.sol index 2208eeb49..22c663c5b 100644 --- a/src/KintoID.sol +++ b/src/KintoID.sol @@ -117,7 +117,7 @@ contract KintoID is * @param _signatureData Signature data * @param _traits Traits to be added to the account. */ - function mintIndividualKyc(IKintoID.SignatureData calldata _signatureData, uint8[] calldata _traits) + function mintIndividualKyc(IKintoID.SignatureData calldata _signatureData, uint16[] calldata _traits) external override { @@ -130,7 +130,7 @@ contract KintoID is * @param _signatureData Signature data * @param _traits Traits to be added to the account. */ - function mintCompanyKyc(IKintoID.SignatureData calldata _signatureData, uint8[] calldata _traits) + function mintCompanyKyc(IKintoID.SignatureData calldata _signatureData, uint16[] calldata _traits) external override { @@ -148,7 +148,7 @@ contract KintoID is function _mintTo( uint256 _tokenId, IKintoID.SignatureData calldata _signatureData, - uint8[] calldata _traits, + uint16[] calldata _traits, bool _indiv ) private onlySignerVerified(_signatureData) { require(balanceOf(_signatureData.signer) == 0, "Balance before mint must be 0"); @@ -211,29 +211,22 @@ contract KintoID is uint256 time = block.timestamp; for (uint256 i = 0; i < _accounts.length; i += 1) { - address account = _accounts[i]; Metadata storage meta = _kycmetas[_accounts[i]]; - if (balanceOf(_accounts[i]) > 0) { - meta.updatedAt = time; - IKintoID.MonitorUpdateData[] memory updates = _traitsAndSanctions[i]; - - for (uint256 j = 0; j < updates.length; j += 1) { - IKintoID.MonitorUpdateData memory updateData = updates[j]; - - if (updateData.isTrait) { - if (updateData.isSet) { - addTrait(account, uint8(updateData.index)); - } else { - removeTrait(account, uint8(updateData.index)); - } - } else { - if (updateData.isSet) { - addSanction(account, updateData.index); - } else { - removeSanction(account, updateData.index); - } - } + if (balanceOf(_accounts[i]) == 0) { + continue; + } + meta.updatedAt = block.timestamp; + for (uint256 j = 0; j < _traitsAndSanctions[i].length; j += 1) { + IKintoID.MonitorUpdateData memory updateData = _traitsAndSanctions[i][j]; + if (updateData.isTrait && updateData.isSet) { + addTrait(_accounts[i], updateData.index); + } else if (updateData.isTrait && !updateData.isSet) { + removeTrait(_accounts[i], updateData.index); + } else if (!updateData.isTrait && updateData.isSet) { + addSanction(_accounts[i], updateData.index); + } else { + removeSanction(_accounts[i], updateData.index); } } } @@ -247,7 +240,7 @@ contract KintoID is * @param _account account to be added the trait to. * @param _traitId trait id to be added. */ - function addTrait(address _account, uint8 _traitId) public override onlyRole(KYC_PROVIDER_ROLE) { + function addTrait(address _account, uint16 _traitId) public override onlyRole(KYC_PROVIDER_ROLE) { require(balanceOf(_account) > 0, "Account must have a KYC token"); Metadata storage meta = _kycmetas[_account]; @@ -264,7 +257,7 @@ contract KintoID is * @param _account account to be removed the trait from. * @param _traitId trait id to be removed. */ - function removeTrait(address _account, uint8 _traitId) public override onlyRole(KYC_PROVIDER_ROLE) { + function removeTrait(address _account, uint16 _traitId) public override onlyRole(KYC_PROVIDER_ROLE) { require(balanceOf(_account) > 0, "Account must have a KYC token"); Metadata storage meta = _kycmetas[_account]; @@ -382,7 +375,7 @@ contract KintoID is * @param index index of the trait to be checked. * @return true if the account has the trait. */ - function hasTrait(address _account, uint8 index) external view override returns (bool) { + function hasTrait(address _account, uint16 index) external view override returns (bool) { return _kycmetas[_account].traits.get(index); } @@ -500,6 +493,6 @@ contract KintoID is } } -contract KintoIDV3 is KintoID { +contract KintoIDV4 is KintoID { constructor() KintoID() {} } diff --git a/src/interfaces/IFaucet.sol b/src/interfaces/IFaucet.sol index 6ccdc6e84..961985f1b 100644 --- a/src/interfaces/IFaucet.sol +++ b/src/interfaces/IFaucet.sol @@ -17,7 +17,7 @@ interface IFaucet { function claimKintoETH() external; - function claimOnBehalf(SignatureData calldata _signatureData) external; + function claimKintoETH(SignatureData calldata _signatureData) external; function withdrawAll() external; diff --git a/src/interfaces/IKintoID.sol b/src/interfaces/IKintoID.sol index 4e3d5e57b..d084952aa 100644 --- a/src/interfaces/IKintoID.sol +++ b/src/interfaces/IKintoID.sol @@ -30,15 +30,15 @@ interface IKintoID { /* ============ State Change ============ */ - function mintIndividualKyc(SignatureData calldata _signatureData, uint8[] calldata _traits) external; + function mintIndividualKyc(SignatureData calldata _signatureData, uint16[] calldata _traits) external; - function mintCompanyKyc(SignatureData calldata _signatureData, uint8[] calldata _traits) external; + function mintCompanyKyc(SignatureData calldata _signatureData, uint16[] calldata _traits) external; function burnKYC(SignatureData calldata _signatureData) external; - function addTrait(address _account, uint8 _traitId) external; + function addTrait(address _account, uint16 _traitId) external; - function removeTrait(address _account, uint8 _traitId) external; + function removeTrait(address _account, uint16 _traitId) external; function addSanction(address _account, uint16 _countryId) external; @@ -66,7 +66,7 @@ interface IKintoID { function mintedAt(address _account) external view returns (uint256); - function hasTrait(address _account, uint8 index) external view returns (bool); + function hasTrait(address _account, uint16 index) external view returns (bool); function traits(address _account) external view returns (bool[] memory); diff --git a/src/wallet/KintoWalletFactory.sol b/src/wallet/KintoWalletFactory.sol index dd45f2199..0e5451e01 100644 --- a/src/wallet/KintoWalletFactory.sol +++ b/src/wallet/KintoWalletFactory.sol @@ -5,6 +5,7 @@ import "@openzeppelin/contracts/utils/Create2.sol"; import "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; import "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol"; +import "@openzeppelin/contracts/access/IAccessControl.sol"; import {UpgradeableBeacon} from "@openzeppelin/contracts/proxy/beacon/UpgradeableBeacon.sol"; import {SafeBeaconProxy} from "../proxy/SafeBeaconProxy.sol"; @@ -12,11 +13,6 @@ import "../interfaces/IKintoID.sol"; import "../interfaces/IFaucet.sol"; import "../interfaces/IKintoWalletFactory.sol"; import "../interfaces/IKintoWallet.sol"; - -interface KintoIDWithAccessControl is IKintoID { - function hasRole(bytes32 role, address account) external view returns (bool); -} - /** * @title KintoWalletFactory * @dev A kinto wallet factory contract for KintoWallet @@ -27,6 +23,7 @@ interface KintoIDWithAccessControl is IKintoID { * This way, the entryPoint.getSenderAddress() can be called either * before or after the account is created. */ + contract KintoWalletFactory is Initializable, UUPSUpgradeable, OwnableUpgradeable, IKintoWalletFactory { /* ============ State Variables ============ */ UpgradeableBeacon public beacon; @@ -101,6 +98,7 @@ contract KintoWalletFactory is Initializable, UUPSUpgradeable, OwnableUpgradeabl override returns (IKintoWallet ret) { + require(owner != address(0) && recoverer != address(0), "invalid addresses"); require(kintoID.isKYC(owner) && owner == msg.sender, "KYC required"); address addr = getAddress(owner, recoverer, salt); uint256 codeSize = addr.code.length; @@ -201,13 +199,9 @@ contract KintoWalletFactory is Initializable, UUPSUpgradeable, OwnableUpgradeabl * @param _signatureData The signature data */ function claimFromFaucet(address _faucet, IFaucet.SignatureData calldata _signatureData) external override { - require(kintoID.isKYC(msg.sender), "KYC required"); - require( - KintoIDWithAccessControl(address(kintoID)).hasRole(kintoID.KYC_PROVIDER_ROLE(), msg.sender), - "Invalid sender" - ); + require(IAccessControl(address(kintoID)).hasRole(kintoID.KYC_PROVIDER_ROLE(), msg.sender), "Invalid sender"); require(address(_faucet) != address(0), "Invalid faucet address"); - IFaucet(_faucet).claimOnBehalf(_signatureData); + IFaucet(_faucet).claimKintoETH(_signatureData); } /* ============ View Functions ============ */ @@ -287,6 +281,6 @@ contract KintoWalletFactory is Initializable, UUPSUpgradeable, OwnableUpgradeabl } } -contract KintoWalletFactoryV3 is KintoWalletFactory { +contract KintoWalletFactoryV4 is KintoWalletFactory { constructor(IKintoWallet _implAddressP) KintoWalletFactory(_implAddressP) {} } diff --git a/test/Faucet.t.sol b/test/Faucet.t.sol index f8fa684a5..e5d13ea26 100644 --- a/test/Faucet.t.sol +++ b/test/Faucet.t.sol @@ -12,7 +12,7 @@ import "./helpers/UserOp.sol"; import "./helpers/UUPSProxy.sol"; import {AATestScaffolding} from "./helpers/AATestScaffolding.sol"; -contract FaucetV2 is Faucet { +contract FaucetV999 is Faucet { function newFunction() external pure returns (uint256) { return 1; } @@ -23,13 +23,13 @@ contract FaucetV2 is Faucet { contract FaucetTest is UserOp, AATestScaffolding { using ECDSA for bytes32; - UUPSProxy _proxyViewer; + UUPSProxy _proxyFaucet; Faucet _implFaucet; - FaucetV2 _implFaucetV2; + FaucetV999 _implFaucetV999; Faucet _faucet; - FaucetV2 _faucetv2; + FaucetV999 _FaucetV999; - // Create a aux function to create a signature for claiming kinto ETH from the faucet + // Create a aux function to create an EIP-191 comploiant signature for claiming Kinto ETH from the faucet function _auxCreateSignature(address _signer, uint256 _privateKey, uint256 _expiresAt) private view @@ -38,8 +38,9 @@ contract FaucetTest is UserOp, AATestScaffolding { bytes32 dataHash = keccak256( abi.encode(_signer, address(_faucet), _expiresAt, _faucet.nonces(_signer), bytes32(block.chainid)) ); - bytes32 hash = keccak256(abi.encodePacked(bytes1(0x19), bytes1(0x01), dataHash)).toEthSignedMessageHash(); - (uint8 v, bytes32 r, bytes32 s) = vm.sign(_privateKey, hash); + bytes32 ethSignedMessageHash = keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", dataHash)); // EIP-191 compliant + + (uint8 v, bytes32 r, bytes32 s) = vm.sign(_privateKey, ethSignedMessageHash); bytes memory signature = abi.encodePacked(r, s, v); return IFaucet.SignatureData(_signer, _faucet.nonces(_signer), _expiresAt, signature); } @@ -53,9 +54,9 @@ contract FaucetTest is UserOp, AATestScaffolding { vm.startPrank(_owner); _implFaucet = new Faucet{salt: 0}(address(_walletFactory)); // deploy _proxy contract and point it to _implementation - _proxyViewer = new UUPSProxy{salt: 0}(address(_implFaucet), ""); + _proxyFaucet = new UUPSProxy{salt: 0}(address(_implFaucet), ""); // wrap in ABI to support easier calls - _faucet = Faucet(payable(address(_proxyViewer))); + _faucet = Faucet(payable(address(_proxyFaucet))); // Initialize kyc viewer _proxy _faucet.initialize(); vm.stopPrank(); @@ -70,16 +71,16 @@ contract FaucetTest is UserOp, AATestScaffolding { function testOwnerCanUpgradeViewer() public { vm.startPrank(_owner); - FaucetV2 _implementationV2 = new FaucetV2(address(_walletFactory)); + FaucetV999 _implementationV2 = new FaucetV999(address(_walletFactory)); _faucet.upgradeTo(address(_implementationV2)); // re-wrap the _proxy - _faucetv2 = FaucetV2(payable(address(_faucet))); - assertEq(_faucetv2.newFunction(), 1); + _FaucetV999 = FaucetV999(payable(address(_faucet))); + assertEq(_FaucetV999.newFunction(), 1); vm.stopPrank(); } function test_RevertWhen_OthersCannotUpgradeFactory() public { - FaucetV2 _implementationV2 = new FaucetV2(address(_walletFactory)); + FaucetV999 _implementationV2 = new FaucetV999(address(_walletFactory)); vm.expectRevert("only owner"); _faucet.upgradeTo(address(_implementationV2)); } @@ -154,7 +155,7 @@ contract FaucetTest is UserOp, AATestScaffolding { IFaucet.SignatureData memory sigdata = _auxCreateSignature(_user, 3, block.timestamp + 1000); vm.expectRevert("Only wallet factory can call this"); - _faucet.claimOnBehalf(sigdata); + _faucet.claimKintoETH(sigdata); } function testClaim_RevertWhen_FaucerIsNotActive() public { diff --git a/test/KintoID.t.sol b/test/KintoID.t.sol index 6b0b409d0..ed26c0421 100644 --- a/test/KintoID.t.sol +++ b/test/KintoID.t.sol @@ -96,7 +96,7 @@ contract KintoIDTest is KYCSignature, AATestScaffolding, UserOp { function testMintIndividualKYC() public { IKintoID.SignatureData memory sigdata = _auxCreateSignature(_kintoIDv1, _user, _user, 3, block.timestamp + 1000); - uint8[] memory traits = new uint8[](0); + uint16[] memory traits = new uint16[](0); vm.startPrank(_kycProvider); assertEq(_kintoIDv1.isKYC(_user), false); _kintoIDv1.mintIndividualKyc(sigdata, traits); @@ -110,7 +110,7 @@ contract KintoIDTest is KYCSignature, AATestScaffolding, UserOp { function testMintCompanyKYC() public { IKintoID.SignatureData memory sigdata = _auxCreateSignature(_kintoIDv1, _user, _user, 3, block.timestamp + 1000); - uint8[] memory traits = new uint8[](2); + uint16[] memory traits = new uint16[](2); traits[0] = 2; traits[1] = 5; vm.startPrank(_kycProvider); @@ -126,7 +126,7 @@ contract KintoIDTest is KYCSignature, AATestScaffolding, UserOp { function testMintIndividualKYCWithInvalidSender() public { IKintoID.SignatureData memory sigdata = _auxCreateSignature(_kintoIDv1, _user, _user, 3, block.timestamp + 1000); - uint8[] memory traits = new uint8[](1); + uint16[] memory traits = new uint16[](1); traits[0] = 1; vm.startPrank(_user); vm.expectRevert("Invalid Provider"); @@ -135,7 +135,7 @@ contract KintoIDTest is KYCSignature, AATestScaffolding, UserOp { function testMintIndividualKYCWithInvalidSigner() public { IKintoID.SignatureData memory sigdata = _auxCreateSignature(_kintoIDv1, _user, _user, 5, block.timestamp + 1000); - uint8[] memory traits = new uint8[](1); + uint16[] memory traits = new uint16[](1); traits[0] = 1; vm.startPrank(_kycProvider); vm.expectRevert("Invalid Signer"); @@ -144,7 +144,7 @@ contract KintoIDTest is KYCSignature, AATestScaffolding, UserOp { function testMintIndividualKYCWithInvalidNonce() public { IKintoID.SignatureData memory sigdata = _auxCreateSignature(_kintoIDv1, _user, _user, 3, block.timestamp + 1000); - uint8[] memory traits = new uint8[](1); + uint16[] memory traits = new uint16[](1); traits[0] = 1; vm.startPrank(_kycProvider); _kintoIDv1.mintIndividualKyc(sigdata, traits); @@ -154,7 +154,7 @@ contract KintoIDTest is KYCSignature, AATestScaffolding, UserOp { function testMintIndividualKYCWithExpiredSignature() public { IKintoID.SignatureData memory sigdata = _auxCreateSignature(_kintoIDv1, _user, _user, 3, block.timestamp - 1000); - uint8[] memory traits = new uint8[](1); + uint16[] memory traits = new uint16[](1); traits[0] = 1; vm.startPrank(_kycProvider); vm.expectRevert("Signature has expired"); @@ -163,7 +163,7 @@ contract KintoIDTest is KYCSignature, AATestScaffolding, UserOp { function testMintIndividualKYC_RevertWhen_AlreadyMinted() public { IKintoID.SignatureData memory sigdata = _auxCreateSignature(_kintoIDv1, _user, _user, 3, block.timestamp + 1000); - uint8[] memory traits = new uint8[](0); + uint16[] memory traits = new uint16[](0); vm.prank(_kycProvider); _kintoIDv1.mintIndividualKyc(sigdata, traits); @@ -192,7 +192,7 @@ contract KintoIDTest is KYCSignature, AATestScaffolding, UserOp { function testBurnKYC() public { IKintoID.SignatureData memory sigdata = _auxCreateSignature(_kintoIDv1, _user, _user, 3, block.timestamp + 1000); - uint8[] memory traits = new uint8[](1); + uint16[] memory traits = new uint16[](1); traits[0] = 1; vm.startPrank(_kycProvider); _kintoIDv1.mintIndividualKyc(sigdata, traits); @@ -204,7 +204,7 @@ contract KintoIDTest is KYCSignature, AATestScaffolding, UserOp { function testOnlyProviderCanBurnKYC() public { IKintoID.SignatureData memory sigdata = _auxCreateSignature(_kintoIDv1, _user, _user, 3, block.timestamp + 1000); - uint8[] memory traits = new uint8[](1); + uint16[] memory traits = new uint16[](1); traits[0] = 1; vm.startPrank(_kycProvider); _kintoIDv1.mintIndividualKyc(sigdata, traits); @@ -225,7 +225,7 @@ contract KintoIDTest is KYCSignature, AATestScaffolding, UserOp { function testBurningTwiceFails() public { IKintoID.SignatureData memory sigdata = _auxCreateSignature(_kintoIDv1, _user, _user, 3, block.timestamp + 1000); - uint8[] memory traits = new uint8[](1); + uint16[] memory traits = new uint16[](1); traits[0] = 1; vm.startPrank(_kycProvider); _kintoIDv1.mintIndividualKyc(sigdata, traits); @@ -337,7 +337,7 @@ contract KintoIDTest is KYCSignature, AATestScaffolding, UserOp { function testRemoveTrait() public { vm.startPrank(_kycProvider); IKintoID.SignatureData memory sigdata = _auxCreateSignature(_kintoIDv1, _user, _user, 3, block.timestamp + 1000); - uint8[] memory traits = new uint8[](1); + uint16[] memory traits = new uint16[](1); traits[0] = 1; _kintoIDv1.mintIndividualKyc(sigdata, traits); _kintoIDv1.addTrait(_user, 1); @@ -390,7 +390,7 @@ contract KintoIDTest is KYCSignature, AATestScaffolding, UserOp { function testAddSanction() public { vm.startPrank(_kycProvider); IKintoID.SignatureData memory sigdata = _auxCreateSignature(_kintoIDv1, _user, _user, 3, block.timestamp + 1000); - uint8[] memory traits = new uint8[](1); + uint16[] memory traits = new uint16[](1); traits[0] = 1; _kintoIDv1.mintIndividualKyc(sigdata, traits); _kintoIDv1.addSanction(_user, 1); @@ -402,7 +402,7 @@ contract KintoIDTest is KYCSignature, AATestScaffolding, UserOp { function testRemoveSancion() public { vm.startPrank(_kycProvider); IKintoID.SignatureData memory sigdata = _auxCreateSignature(_kintoIDv1, _user, _user, 3, block.timestamp + 1000); - uint8[] memory traits = new uint8[](1); + uint16[] memory traits = new uint16[](1); traits[0] = 1; _kintoIDv1.mintIndividualKyc(sigdata, traits); _kintoIDv1.addSanction(_user, 1); @@ -414,7 +414,7 @@ contract KintoIDTest is KYCSignature, AATestScaffolding, UserOp { } function testAddSanction_RevertWhen_CallerIsNotKYCProvider() public { - approveKYC(_kycProvider, _user, _userPk, new uint8[](1)); + approveKYC(_kycProvider, _user, _userPk, new uint16[](1)); bytes memory err = abi.encodePacked( "AccessControl: account ", diff --git a/test/KintoWallet.t.sol b/test/KintoWallet.t.sol index 326d81cbf..b6507e349 100644 --- a/test/KintoWallet.t.sol +++ b/test/KintoWallet.t.sol @@ -968,7 +968,7 @@ contract KintoWalletTest is AATestScaffolding, UserOp { // Mint NFT to new owner and burn old IKintoID.SignatureData memory sigdata = _auxCreateSignature(_kintoIDv1, _user, _user, 3, block.timestamp + 1000); - uint8[] memory traits = new uint8[](0); + uint16[] memory traits = new uint16[](0); vm.startPrank(_kycProvider); _kintoIDv1.mintIndividualKyc(sigdata, traits); sigdata = _auxCreateSignature(_kintoIDv1, _owner, _owner, 1, block.timestamp + 1000); diff --git a/test/artifacts/7887/addresses.json b/test/artifacts/7887/addresses.json index a691ca3f2..7f470354b 100644 --- a/test/artifacts/7887/addresses.json +++ b/test/artifacts/7887/addresses.json @@ -2,12 +2,15 @@ "KintoID": "0xf369f78E3A0492CC4e96a90dae0728A38498e9c7", "KintoID-impl": "0xa3625A24376C2eac96eDcF353C88F3F3a1De030a", "KintoIDV3-impl": "0xd838189759e85Ac8673515FFd9c72cc854f360Fa", +"KintoIDV4-impl": "0x2AA456d97fB8f75283327458920D4daA2BFe363e", "EntryPoint": "0x2843C269D2a64eCfA63548E8B3Fc0FD23B7F70cb", "KintoWallet-impl": "0x51c676fC24C776eBcb78B8ca3e6Ca2E810Dd6B80", "KintoWalletV2-impl": "0xd87FB0bF3c38f216bD1604bFa4d262F95409227d", "KintoWalletV3-impl": "0x893B0AeA9C45FA8d3b0FBbebd03d4220B9514599", "KintoWalletFactory-impl": "0x9F8Af18f6C1E5E4DA42b33D283F23EB8C23DF505", "KintoWalletFactoryV2-impl": "0xd6Dea5Ff03f099242DBDF737E25e4bf4B9d4f9f6", +"KintoWalletFactoryV3-impl": "0x652c9b99f916beb42ccb7883a725E2f9219095B4", +"KintoWalletFactoryV4-impl": "0x1b5976043578C6F4d2D1d17D3d4AE89Cf001B9d5", "KintoWalletFactory": "0x8a4720488CA32f1223ccFE5A087e250fE3BC5D75", "SponsorPaymaster": "0x1842a4EFf3eFd24c50B63c3CF89cECEe245Fc2bd", "SponsorPaymaster-impl": "0x1F9E60e0289b35325B25635B602d515179a7497d", @@ -18,7 +21,10 @@ "EngenCredits-impl": "0xd128059962F92e7f19318EB03D5Bfd64EF9c5DA3", "EngenCredits": "0xb2F2BF932105A192566b56643BCa738eec06b3f1", "KintoWallet-admin": "0x2e2B1c42E38f5af81771e65D87729E57ABD1337a", -"Faucet-old": "0xa62Bf9b53044885CddFcbC4cA52f51f8ae39eCFE", +"FaucetV1": "0xa62Bf9b53044885CddFcbC4cA52f51f8ae39eCFE", +"FaucetV2-impl": "0xB2f4c8E6D336DB09731A4D08BC087838b4841b06", +"FaucetV3-impl": "0xa0BB7432357634e66b9F56AED03e46c4abfFea49", +"Faucet": "0x0719D47A213149E2Ef8d3f5afDaDA8a8E22dfc03", "Counter": "0xdb791AF345A21588957E4e45596411b2Be2BD4cd", "KintoAppRegistry": "0x5A2b641b84b0230C8e75F55d5afd27f4Dbd59d5b", "KintoAppRegistry-impl": "0xEDA88D4810E14aE4C384369CbC6F1510787Dc4fB" diff --git a/test/helpers/AATestScaffolding.sol b/test/helpers/AATestScaffolding.sol index 7180e5f44..25dc94447 100644 --- a/test/helpers/AATestScaffolding.sol +++ b/test/helpers/AATestScaffolding.sol @@ -12,7 +12,7 @@ import "../../src/apps/KintoAppRegistry.sol"; import "../../src/tokens/EngenCredits.sol"; import "../../src/paymasters/SponsorPaymaster.sol"; import {KintoWalletV3 as KintoWallet} from "../../src/wallet/KintoWallet.sol"; -import {KintoWalletFactoryV3 as KintoWalletFactory} from "../../src/wallet/KintoWalletFactory.sol"; +import {KintoWalletFactoryV4 as KintoWalletFactory} from "../../src/wallet/KintoWalletFactory.sol"; import "../helpers/UUPSProxy.sol"; import "../helpers/KYCSignature.sol"; @@ -180,13 +180,13 @@ abstract contract AATestScaffolding is KYCSignature { IKintoID.SignatureData memory sigdata = _auxCreateSignature(_kintoIDv1, _account, _account, _accountPk, block.timestamp + 1000); - uint8[] memory traits = new uint8[](0); + uint16[] memory traits = new uint16[](0); _kintoIDv1.mintIndividualKyc(sigdata, traits); vm.stopPrank(); } - function approveKYC(address _kycProvider, address _account, uint256 _accountPk, uint8[] memory traits) public { + function approveKYC(address _kycProvider, address _account, uint256 _accountPk, uint16[] memory traits) public { vm.startPrank(_kycProvider); IKintoID.SignatureData memory sigdata = From ce24400946aa8a138a5863f74fa91cfeb5b34aaf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Federico=20Mart=C3=ADn=20Alconada=20Verzini?= Date: Mon, 15 Jan 2024 16:21:09 -0300 Subject: [PATCH 08/13] refactor: rename and refactor user operation helper --- script/migrations/12-create_engen_app.sol | 6 +- script/test.sol | 4 +- test/EngenCredits.t.sol | 8 +- test/KintoWallet.t.sol | 76 +++---- test/KintoWalletFactory.t.sol | 2 +- test/SponsorPaymaster.t.sol | 14 +- test/helpers/UserOp.sol | 245 +++++++++++----------- 7 files changed, 180 insertions(+), 175 deletions(-) diff --git a/script/migrations/12-create_engen_app.sol b/script/migrations/12-create_engen_app.sol index 8d693140e..780204087 100644 --- a/script/migrations/12-create_engen_app.sol +++ b/script/migrations/12-create_engen_app.sol @@ -75,7 +75,7 @@ contract KintoMigration12DeployScript is ArtifactsReader, UserOp { flags[0] = true; flags[1] = true; - userOps[0] = this.createUserOperation( + userOps[0] = _createUserOperation( block.chainid, address(_kintoWallet), nonce, @@ -87,7 +87,7 @@ contract KintoMigration12DeployScript is ArtifactsReader, UserOp { ); // call initialise on KintoRegistryApp - userOps[1] = this.createUserOperation( + userOps[1] = _createUserOperation( block.chainid, address(_kintoWallet), nonce + 1, @@ -99,7 +99,7 @@ contract KintoMigration12DeployScript is ArtifactsReader, UserOp { ); // register Engen Credits app into the registry - userOps[2] = this.createUserOperation( + userOps[2] = _createUserOperation( block.chainid, address(_kintoWallet), nonce + 2, diff --git a/script/test.sol b/script/test.sol index 4406a5e7d..192e187b3 100644 --- a/script/test.sol +++ b/script/test.sol @@ -143,7 +143,7 @@ contract KintoDeployTestCounter is AASetup, KYCSignature, UserOp { uint256 startingNonce = _newWallet.getNonce(); uint256[] memory privateKeys = new uint256[](1); privateKeys[0] = deployerPrivateKey; - UserOperation memory userOp = this.createUserOperation( + UserOperation memory userOp = _createUserOperation( block.chainid, address(_newWallet), startingNonce, @@ -221,7 +221,7 @@ contract KintoDeployETHPriceIsRight is AASetup, KYCSignature, UserOp { uint256 startingNonce = _newWallet.getNonce(); uint256[] memory privateKeys = new uint256[](1); privateKeys[0] = deployerPrivateKey; - UserOperation memory userOp = this.createUserOperation( + UserOperation memory userOp = _createUserOperation( block.chainid, address(_newWallet), startingNonce, diff --git a/test/EngenCredits.t.sol b/test/EngenCredits.t.sol index cf862a928..fb4b762af 100644 --- a/test/EngenCredits.t.sol +++ b/test/EngenCredits.t.sol @@ -126,7 +126,7 @@ contract EngenCreditsTest is UserOp, AATestScaffolding { uint256 startingNonce = _kintoWallet.getNonce(); uint256[] memory privateKeys = new uint256[](1); privateKeys[0] = 1; - UserOperation memory userOp = this.createUserOperation( + UserOperation memory userOp = _createUserOperation( _chainID, address(_kintoWallet), startingNonce + 1, @@ -165,7 +165,7 @@ contract EngenCreditsTest is UserOp, AATestScaffolding { uint256 startingNonce = _kintoWallet.getNonce(); uint256[] memory privateKeys = new uint256[](1); privateKeys[0] = 1; - UserOperation memory userOp = this.createUserOperation( + UserOperation memory userOp = _createUserOperation( _chainID, address(_kintoWallet), startingNonce + 1, @@ -199,7 +199,7 @@ contract EngenCreditsTest is UserOp, AATestScaffolding { uint256 startingNonce = _kintoWallet.getNonce(); uint256[] memory privateKeys = new uint256[](1); privateKeys[0] = 1; - UserOperation memory userOp = this.createUserOperation( + UserOperation memory userOp = _createUserOperation( _chainID, address(_kintoWallet), startingNonce + 1, @@ -223,7 +223,7 @@ contract EngenCreditsTest is UserOp, AATestScaffolding { _entryPoint.handleOps(userOps, payable(_owner)); assertEq(_engenCredits.balanceOf(address(_kintoWallet)), 15); // call again - userOp = this.createUserOperation( + userOp = _createUserOperation( _chainID, address(_kintoWallet), startingNonce + 2, diff --git a/test/KintoWallet.t.sol b/test/KintoWallet.t.sol index b6507e349..3f3d73260 100644 --- a/test/KintoWallet.t.sol +++ b/test/KintoWallet.t.sol @@ -47,14 +47,14 @@ contract KintoWalletTest is AATestScaffolding, UserOp { /* ============ Upgrade Tests ============ */ - // FIXME: these I think these upgrade tests are wrong because, basically, the KintoWallet.sol does not have + // FIXME: I think these upgrade tests are wrong because, basically, the KintoWallet.sol does not have // an upgrade function. The upgrade function is in the UUPSUpgradeable.sol contract. function test_RevertWhen_OwnerCannotUpgrade() public { // deploy a new implementation KintoWallet _newImplementation = new KintoWallet(_entryPoint, _kintoIDv1, _kintoAppRegistry); // try calling upgradeTo from _owner wallet to upgrade _owner wallet - UserOperation memory userOp = this.createUserOperation( + UserOperation memory userOp = _createUserOperation( _chainID, address(_kintoWallet), _kintoWallet.getNonce(), @@ -89,7 +89,7 @@ contract KintoWalletTest is AATestScaffolding, UserOp { uint256 nonce = userWallet.getNonce(); privateKeys[0] = _userPk; - UserOperation memory userOp = this.createUserOperation( + UserOperation memory userOp = _createUserOperation( _chainID, address(userWallet), nonce, @@ -115,7 +115,7 @@ contract KintoWalletTest is AATestScaffolding, UserOp { vm.stopPrank(); } - /* ============ One Signer Account Transaction Tests ============ */ + /* ============ One Signer Account Transaction Tests (execute) ============ */ function test_RevertWhen_SendingTransactionDirectlyAndPrefundNotPaid() public { // deploy the counter contract @@ -125,7 +125,7 @@ contract KintoWalletTest is AATestScaffolding, UserOp { // send a transaction to the counter contract through our wallet // without a paymaster and without prefunding the wallet - UserOperation memory userOp = this.createUserOperation( + UserOperation memory userOp = _createUserOperation( _chainID, address(_kintoWallet), _kintoWallet.getNonce(), @@ -159,7 +159,7 @@ contract KintoWalletTest is AATestScaffolding, UserOp { // send a transaction to the counter contract through our wallet // without a paymaster but prefunding the wallet - userOps[1] = this.createUserOperation( + userOps[1] = _createUserOperation( _chainID, address(_kintoWallet), _kintoWallet.getNonce() + 1, @@ -184,7 +184,7 @@ contract KintoWalletTest is AATestScaffolding, UserOp { // (3). Create Counter increment user op UserOperation[] memory userOps = new UserOperation[](1); - userOps[0] = this.createUserOperation( + userOps[0] = _createUserOperation( _chainID, address(_kintoWallet), _kintoWallet.getNonce(), @@ -219,7 +219,7 @@ contract KintoWalletTest is AATestScaffolding, UserOp { // (4). Create Counter increment user op UserOperation[] memory userOps = new UserOperation[](1); - userOps[0] = this.createUserOperation( + userOps[0] = _createUserOperation( _chainID, address(_kintoWallet), _kintoWallet.getNonce(), @@ -254,7 +254,7 @@ contract KintoWalletTest is AATestScaffolding, UserOp { uint256 nonce = _kintoWallet.getNonce(); bool[] memory flags = new bool[](1); flags[0] = true; - UserOperation memory userOp2 = this.createUserOperation( + UserOperation memory userOp2 = _createUserOperation( _chainID, address(_kintoWallet), nonce + 1, @@ -286,7 +286,7 @@ contract KintoWalletTest is AATestScaffolding, UserOp { vm.startPrank(_owner); _fundPaymasterForContract(address(counter)); // Let's send a transaction to the counter contract through our wallet - UserOperation memory userOp = this.createUserOperation( + UserOperation memory userOp = _createUserOperation( _chainID, address(_kintoWallet), nonce + 1, @@ -296,7 +296,7 @@ contract KintoWalletTest is AATestScaffolding, UserOp { abi.encodeWithSignature("increment()"), address(_paymaster) ); - UserOperation memory userOp2 = this.createUserOperation( + UserOperation memory userOp2 = _createUserOperation( _chainID, address(_kintoWallet), nonce + 2, @@ -317,6 +317,8 @@ contract KintoWalletTest is AATestScaffolding, UserOp { vm.stopPrank(); } + /* ============ One Signer Account Transaction Tests (executeBatch) ============ */ + function testMultipleTransactionsExecuteBatchPaymaster() public { vm.startPrank(_owner); // Let's deploy the counter contract @@ -345,7 +347,7 @@ contract KintoWalletTest is AATestScaffolding, UserOp { calls[2] = abi.encodeWithSignature("increment()"); OperationParams memory opParams = OperationParams({targetContracts: targets, values: values, bytesOps: calls}); - UserOperation memory userOp = this.createUserOperationBatchWithPaymaster( + UserOperation memory userOp = _createUserOperationBatchWithPaymaster( _chainID, address(_kintoWallet), nonce, privateKeys, opParams, address(_paymaster) ); UserOperation[] memory userOps = new UserOperation[](1); @@ -393,7 +395,7 @@ contract KintoWalletTest is AATestScaffolding, UserOp { // send all transactions via batch OperationParams memory opParams = OperationParams({targetContracts: targets, values: values, bytesOps: calls}); - UserOperation memory userOp = this.createUserOperationBatchWithPaymaster( + UserOperation memory userOp = _createUserOperationBatchWithPaymaster( _chainID, address(_kintoWallet), _kintoWallet.getNonce(), privateKeys, opParams, address(_paymaster) ); UserOperation[] memory userOps = new UserOperation[](1); @@ -428,7 +430,7 @@ contract KintoWalletTest is AATestScaffolding, UserOp { owners[0] = _owner; owners[1] = _user; uint256 nonce = _kintoWallet.getNonce(); - UserOperation memory userOp = this.createUserOperation( + UserOperation memory userOp = _createUserOperation( _chainID, address(_kintoWallet), nonce, @@ -451,7 +453,7 @@ contract KintoWalletTest is AATestScaffolding, UserOp { owners[0] = _owner; owners[1] = _owner; - UserOperation memory userOp = this.createUserOperation( + UserOperation memory userOp = _createUserOperation( _chainID, address(_kintoWallet), _kintoWallet.getNonce(), @@ -478,7 +480,7 @@ contract KintoWalletTest is AATestScaffolding, UserOp { function test_RevertWhen_WithEmptyArray() public { address[] memory owners = new address[](0); - UserOperation memory userOp = this.createUserOperation( + UserOperation memory userOp = _createUserOperation( _chainID, address(_kintoWallet), _kintoWallet.getNonce(), @@ -509,7 +511,7 @@ contract KintoWalletTest is AATestScaffolding, UserOp { owners[2] = _user; owners[3] = _user; - UserOperation memory userOp = this.createUserOperation( + UserOperation memory userOp = _createUserOperation( _chainID, address(_kintoWallet), _kintoWallet.getNonce(), @@ -537,7 +539,7 @@ contract KintoWalletTest is AATestScaffolding, UserOp { address[] memory owners = new address[](1); owners[0] = _user; - UserOperation memory userOp = this.createUserOperation( + UserOperation memory userOp = _createUserOperation( _chainID, address(_kintoWallet), _kintoWallet.getNonce(), @@ -560,7 +562,7 @@ contract KintoWalletTest is AATestScaffolding, UserOp { owners[0] = _owner; owners[1] = _user; uint256 nonce = _kintoWallet.getNonce(); - UserOperation memory userOp = this.createUserOperation( + UserOperation memory userOp = _createUserOperation( _chainID, address(_kintoWallet), nonce, @@ -586,7 +588,7 @@ contract KintoWalletTest is AATestScaffolding, UserOp { owners[1] = _user; owners[2] = _user2; uint256 nonce = _kintoWallet.getNonce(); - UserOperation memory userOp = this.createUserOperation( + UserOperation memory userOp = _createUserOperation( _chainID, address(_kintoWallet), nonce, @@ -616,7 +618,7 @@ contract KintoWalletTest is AATestScaffolding, UserOp { // call setSignerPolicy with ALL_SIGNERS policy should revert because the wallet has 1 owners // and the policy requires 3 owners. UserOperation[] memory userOps = new UserOperation[](2); - userOps[0] = this.createUserOperation( + userOps[0] = _createUserOperation( _chainID, address(_kintoWallet), nonce, @@ -628,7 +630,7 @@ contract KintoWalletTest is AATestScaffolding, UserOp { ); // call resetSigners with existing policy (SINGLE_SIGNER) should revert because I'm passing 2 owners - userOps[1] = this.createUserOperation( + userOps[1] = _createUserOperation( _chainID, address(_kintoWallet), nonce + 1, @@ -672,7 +674,7 @@ contract KintoWalletTest is AATestScaffolding, UserOp { owners[0] = _owner; owners[1] = _user; - UserOperation memory userOp = this.createUserOperation( + UserOperation memory userOp = _createUserOperation( _chainID, address(_kintoWallet), _kintoWallet.getNonce(), @@ -714,7 +716,7 @@ contract KintoWalletTest is AATestScaffolding, UserOp { ); // b. Counter increment - userOps[1] = this.createUserOperation( + userOps[1] = _createUserOperation( _chainID, address(_kintoWallet), _kintoWallet.getNonce() + 1, @@ -736,7 +738,7 @@ contract KintoWalletTest is AATestScaffolding, UserOp { owners[0] = _owner; owners[1] = _user; - UserOperation memory userOp = this.createUserOperation( + UserOperation memory userOp = _createUserOperation( _chainID, address(_kintoWallet), _kintoWallet.getNonce(), @@ -773,7 +775,7 @@ contract KintoWalletTest is AATestScaffolding, UserOp { ); // b. Counter increment - userOps[1] = this.createUserOperation( + userOps[1] = _createUserOperation( _chainID, address(_kintoWallet), _kintoWallet.getNonce() + 1, @@ -796,7 +798,7 @@ contract KintoWalletTest is AATestScaffolding, UserOp { owners[1] = _user; owners[2] = _user2; - UserOperation memory userOp = this.createUserOperation( + UserOperation memory userOp = _createUserOperation( _chainID, address(_kintoWallet), _kintoWallet.getNonce(), @@ -838,7 +840,7 @@ contract KintoWalletTest is AATestScaffolding, UserOp { _chainID, privateKeys, address(_kintoWallet), _kintoWallet.getNonce(), address(counter), address(_paymaster) ); // b. Counter increment - userOps[1] = this.createUserOperation( + userOps[1] = _createUserOperation( _chainID, address(_kintoWallet), _kintoWallet.getNonce() + 1, @@ -872,7 +874,7 @@ contract KintoWalletTest is AATestScaffolding, UserOp { ); // b. Counter increment - userOps[1] = this.createUserOperation( + userOps[1] = _createUserOperation( _chainID, address(_kintoWallet), _kintoWallet.getNonce() + 1, @@ -896,7 +898,7 @@ contract KintoWalletTest is AATestScaffolding, UserOp { owners[1] = _user; owners[2] = _user2; - UserOperation memory userOp = this.createUserOperation( + UserOperation memory userOp = _createUserOperation( _chainID, address(_kintoWallet), _kintoWallet.getNonce(), @@ -939,7 +941,7 @@ contract KintoWalletTest is AATestScaffolding, UserOp { ); // b. Counter increment - userOps[1] = this.createUserOperation( + userOps[1] = _createUserOperation( _chainID, address(_kintoWallet), _kintoWallet.getNonce() + 1, @@ -1116,7 +1118,7 @@ contract KintoWalletTest is AATestScaffolding, UserOp { uint256 nonce = _kintoWallet.getNonce(); bool[] memory flags = new bool[](1); flags[0] = true; - UserOperation memory userOp = this.createUserOperation( + UserOperation memory userOp = _createUserOperation( _chainID, address(_kintoWallet), nonce, @@ -1139,7 +1141,7 @@ contract KintoWalletTest is AATestScaffolding, UserOp { function test_RevertWhen_SettingAppKeyNoWhitelist() public { address app = address(_engenCredits); registerApp(_owner, "test", address(_engenCredits)); - UserOperation memory userOp = this.createUserOperation( + UserOperation memory userOp = _createUserOperation( _chainID, address(_kintoWallet), _kintoWallet.getNonce(), @@ -1175,7 +1177,7 @@ contract KintoWalletTest is AATestScaffolding, UserOp { _chainID, privateKeys, address(_kintoWallet), nonce, address(_engenCredits), address(_paymaster) ); - userOps[1] = this.createUserOperation( + userOps[1] = _createUserOperation( _chainID, address(_kintoWallet), nonce + 1, @@ -1199,7 +1201,7 @@ contract KintoWalletTest is AATestScaffolding, UserOp { owners[1] = _user2; // generate the user operation wihch changes the policy to ALL_SIGNERS - UserOperation memory userOp = this.createUserOperation( + UserOperation memory userOp = _createUserOperation( _chainID, address(_kintoWallet), _kintoWallet.getNonce(), @@ -1235,7 +1237,7 @@ contract KintoWalletTest is AATestScaffolding, UserOp { userOps[0] = _whitelistAppOp( _chainID, privateKeys, address(_kintoWallet), _kintoWallet.getNonce(), address(counter), address(_paymaster) ); - userOps[1] = this.createUserOperation( + userOps[1] = _createUserOperation( _chainID, address(_kintoWallet), _kintoWallet.getNonce() + 1, @@ -1252,7 +1254,7 @@ contract KintoWalletTest is AATestScaffolding, UserOp { // Set only app key signature uint256[] memory privateKeysApp = new uint256[](1); privateKeysApp[0] = 3; - userOps[0] = this.createUserOperation( + userOps[0] = _createUserOperation( _chainID, address(_kintoWallet), _kintoWallet.getNonce(), diff --git a/test/KintoWalletFactory.t.sol b/test/KintoWalletFactory.t.sol index ae11049a1..7e4518dad 100644 --- a/test/KintoWalletFactory.t.sol +++ b/test/KintoWalletFactory.t.sol @@ -146,7 +146,7 @@ contract KintoWalletFactoryTest is UserOp, AATestScaffolding { flags[0] = true; uint256[] memory privateKeys = new uint256[](1); privateKeys[0] = 1; - UserOperation memory userOp = this.createUserOperation( + UserOperation memory userOp = _createUserOperation( _chainID, address(_kintoWallet), startingNonce, diff --git a/test/SponsorPaymaster.t.sol b/test/SponsorPaymaster.t.sol index cc0f7785b..daef31c61 100644 --- a/test/SponsorPaymaster.t.sol +++ b/test/SponsorPaymaster.t.sol @@ -153,7 +153,7 @@ contract SponsorPaymasterTest is KYCSignature, UserOp, AATestScaffolding { /* ============ PER-OP: Global Rate limits ============ */ function testValidatePaymasterUserOp() public { - UserOperation memory userOp = this.createUserOperation( + UserOperation memory userOp = _createUserOperation( _chainID, address(_kintoWallet), _kintoWallet.getNonce(), @@ -169,7 +169,7 @@ contract SponsorPaymasterTest is KYCSignature, UserOp, AATestScaffolding { } function testValidatePaymasterUserOp_RevertWhen_GasLimitIsLessThanCostOfPost() public { - UserOperation memory userOp = this.createUserOperation( + UserOperation memory userOp = _createUserOperation( _chainID, address(_kintoWallet), _kintoWallet.getNonce(), @@ -189,7 +189,7 @@ contract SponsorPaymasterTest is KYCSignature, UserOp, AATestScaffolding { } function testValidatePaymasterUserOp_RevertWhen_GasLimitIsMoreThanCostOfVerification() public { - UserOperation memory userOp = this.createUserOperation( + UserOperation memory userOp = _createUserOperation( _chainID, address(_kintoWallet), _kintoWallet.getNonce(), @@ -209,7 +209,7 @@ contract SponsorPaymasterTest is KYCSignature, UserOp, AATestScaffolding { } function testValidatePaymasterUserOp_RevertWhen_PreGasLimitIsMoreThanMaxPreVerification() public { - UserOperation memory userOp = this.createUserOperation( + UserOperation memory userOp = _createUserOperation( _chainID, address(_kintoWallet), _kintoWallet.getNonce(), @@ -229,7 +229,7 @@ contract SponsorPaymasterTest is KYCSignature, UserOp, AATestScaffolding { } function testValidatePaymasterUserOp_RevertWhen_PaymasterAndDataIsNotLength20() public { - UserOperation memory userOp = this.createUserOperation( + UserOperation memory userOp = _createUserOperation( _chainID, address(_kintoWallet), _kintoWallet.getNonce(), @@ -249,7 +249,7 @@ contract SponsorPaymasterTest is KYCSignature, UserOp, AATestScaffolding { } function testValidatePaymasterUserOp_RevertWhen_GasIsTooHigh() public { - UserOperation memory userOp = this.createUserOperation( + UserOperation memory userOp = _createUserOperation( _chainID, address(_kintoWallet), _kintoWallet.getNonce(), @@ -541,7 +541,7 @@ contract SponsorPaymasterTest is KYCSignature, UserOp, AATestScaffolding { userOps = new UserOperation[](amt); // we iterate from 1 because the first op is whitelisting the app for (uint256 i = 0; i < amt; i++) { - userOps[i] = this.createUserOperation( + userOps[i] = _createUserOperation( _chainID, address(_kintoWallet), nonce, diff --git a/test/helpers/UserOp.sol b/test/helpers/UserOp.sol index f2ae6e84d..e67cb08f3 100644 --- a/test/helpers/UserOp.sol +++ b/test/helpers/UserOp.sol @@ -34,125 +34,75 @@ abstract contract UserOp is Test { address payable _recoverer = payable(vm.addr(_recovererPk)); address payable _funder = payable(vm.addr(_funderPk)); + // gas constants + uint256 constant CALL_GAS_LIMIT = 4_000_000; + uint256 constant VERIFICATION_GAS_LIMIT = 210_000; + uint256 constant PRE_VERIFICATION_GAS = 21_000; + uint256 constant MAX_FEE_PER_GAS = 1; + uint256 constant MAX_PRIORITY_FEE_PER_GAS = 1e9; + struct OperationParams { address[] targetContracts; uint256[] values; bytes[] bytesOps; } - function _packUserOp(UserOperation memory op, bool forSig) internal pure returns (bytes memory) { - if (forSig) { - return abi.encode( - op.sender, - op.nonce, - keccak256(op.initCode), - keccak256(op.callData), - op.callGasLimit, - op.verificationGasLimit, - op.preVerificationGas, - op.maxFeePerGas, - op.maxPriorityFeePerGas, - keccak256(op.paymasterAndData) - ); - } - return abi.encode( - op.sender, - op.nonce, - op.initCode, - op.callData, - op.callGasLimit, - op.verificationGasLimit, - op.preVerificationGas, - op.maxFeePerGas, - op.maxPriorityFeePerGas, - op.paymasterAndData, - op.signature - ); - } - - function _getUserOpHash(UserOperation memory op, IEntryPoint _entryPoint, uint256 chainID) - internal - pure - returns (bytes32) - { - bytes32 opHash = keccak256(_packUserOp(op, true)); - return keccak256(abi.encode(opHash, address(_entryPoint), chainID)); - } - - function _signUserOp( - UserOperation memory op, - IEntryPoint _entryPoint, - uint256 chainID, - uint256[] calldata privateKeys - ) internal pure returns (bytes memory) { - bytes32 hash = _getUserOpHash(op, _entryPoint, chainID); - hash = hash.toEthSignedMessageHash(); - - bytes memory signature; - for (uint256 i = 0; i < privateKeys.length; i++) { - (uint8 v, bytes32 r, bytes32 s) = vm.sign(privateKeys[i], hash); - if (i == 0) { - signature = abi.encodePacked(r, s, v); - } else { - signature = abi.encodePacked(signature, r, s, v); - } - } - - return signature; - } - - function createUserOperation( + function _createUserOperation( uint256 _chainID, address _account, uint256 nonce, - uint256[] calldata _privateKeyOwners, + uint256[] memory _privateKeyOwners, address _targetContract, uint256 value, - bytes calldata _bytesOp - ) public view returns (UserOperation memory op) { - return this.createUserOperation( - _chainID, _account, nonce, _privateKeyOwners, _targetContract, value, _bytesOp, address(0) + bytes memory _bytesOp + ) internal view returns (UserOperation memory op) { + return _createUserOperation( + _chainID, + _account, + nonce, + _privateKeyOwners, + _targetContract, + value, + _bytesOp, + address(0), + [CALL_GAS_LIMIT, MAX_FEE_PER_GAS, MAX_PRIORITY_FEE_PER_GAS] ); } - function createUserOperation( + function _createUserOperation( uint256 _chainID, address _account, uint256 nonce, - uint256[] calldata _privateKeyOwners, + uint256[] memory _privateKeyOwners, address _targetContract, uint256 value, - bytes calldata _bytesOp, + bytes memory _bytesOp, address _paymaster - ) public view returns (UserOperation memory op) { - op = UserOperation({ - sender: _account, - nonce: nonce, - initCode: bytes(""), - callData: abi.encodeCall(KintoWallet.execute, (_targetContract, value, _bytesOp)), - callGasLimit: 4_000_000, // generate from call simulation - verificationGasLimit: 210_000, // verification gas. will add create2 cost (3200+200*length) if initCode exists - preVerificationGas: 21_000, // should also cover calldata cost. - maxFeePerGas: 1, // grab from current gas - maxPriorityFeePerGas: 1e9, // grab from current gas - paymasterAndData: abi.encodePacked(_paymaster), - signature: bytes("") - }); - op.signature = _signUserOp(op, KintoWallet(payable(_account)).entryPoint(), _chainID, _privateKeyOwners); - return op; + ) internal view returns (UserOperation memory op) { + return _createUserOperation( + _chainID, + _account, + nonce, + _privateKeyOwners, + _targetContract, + value, + _bytesOp, + _paymaster, + [CALL_GAS_LIMIT, MAX_FEE_PER_GAS, MAX_PRIORITY_FEE_PER_GAS] + ); } - function createUserOperation( + function _createUserOperation( uint256 _chainID, address _account, uint256 nonce, - uint256[] calldata _privateKeyOwners, + uint256[] memory _privateKeyOwners, address _targetContract, uint256 value, - bytes calldata _bytesOp, + bytes memory _bytesOp, address _paymaster, - uint256[3] calldata _gasLimits - ) public view returns (UserOperation memory op) { + uint256[3] memory _gasLimits + ) internal view returns (UserOperation memory op) { op = UserOperation({ sender: _account, nonce: nonce, @@ -170,41 +120,31 @@ abstract contract UserOp is Test { return op; } - function createUserOperationBatchWithPaymaster( + function _createUserOperationBatchWithPaymaster( uint256 _chainID, address _account, uint256 nonce, - uint256[] calldata _privateKeyOwners, - OperationParams calldata opParams, + uint256[] memory _privateKeyOwners, + OperationParams memory opParams, address _paymaster - ) public view returns (UserOperation memory op) { - op = _prepareUserOperation(_account, nonce, opParams, _paymaster); + ) internal view returns (UserOperation memory op) { + op = _createUserOperation( + _chainID, + _account, + nonce, + _privateKeyOwners, + address(0), + 0, + bytes(""), + _paymaster, + [CALL_GAS_LIMIT, MAX_FEE_PER_GAS, MAX_PRIORITY_FEE_PER_GAS] + ); + op.callData = + abi.encodeCall(KintoWallet.executeBatch, (opParams.targetContracts, opParams.values, opParams.bytesOps)); op.signature = _signUserOp(op, KintoWallet(payable(_account)).entryPoint(), _chainID, _privateKeyOwners); } - function _prepareUserOperation(address _account, uint256 nonce, OperationParams memory opParams, address _paymaster) - internal - pure - returns (UserOperation memory op) - { - op = UserOperation({ - sender: _account, - nonce: nonce, - initCode: bytes(""), - callData: abi.encodeCall( - KintoWallet.executeBatch, (opParams.targetContracts, opParams.values, opParams.bytesOps) - ), - callGasLimit: 4_000_000, // generate from call simulation - verificationGasLimit: 210_000, // verification gas - preVerificationGas: 21_000, // should also cover calldata cost. - maxFeePerGas: 1, // grab from current gas - maxPriorityFeePerGas: 1e9, // grab from current gas - paymasterAndData: abi.encodePacked(_paymaster), - signature: bytes("") - }); - - return op; - } + // user ops generators function _registerAppOp( uint256 _chainId, @@ -217,7 +157,7 @@ abstract contract UserOp is Test { address[] memory appContracts, uint256[4] memory appLimits ) internal view returns (UserOperation memory userOp) { - return this.createUserOperation( + return _createUserOperation( _chainId, address(wallet), startingNonce, @@ -243,7 +183,7 @@ abstract contract UserOp is Test { targets[0] = address(app); bool[] memory flags = new bool[](1); flags[0] = true; - return this.createUserOperation( + return _createUserOperation( _chainId, address(wallet), startingNonce, @@ -254,4 +194,67 @@ abstract contract UserOp is Test { address(_paymaster) ); } + + // signature helpers + + function _packUserOp(UserOperation memory op, bool forSig) internal pure returns (bytes memory) { + if (forSig) { + return abi.encode( + op.sender, + op.nonce, + keccak256(op.initCode), + keccak256(op.callData), + op.callGasLimit, + op.verificationGasLimit, + op.preVerificationGas, + op.maxFeePerGas, + op.maxPriorityFeePerGas, + keccak256(op.paymasterAndData) + ); + } + return abi.encode( + op.sender, + op.nonce, + op.initCode, + op.callData, + op.callGasLimit, + op.verificationGasLimit, + op.preVerificationGas, + op.maxFeePerGas, + op.maxPriorityFeePerGas, + op.paymasterAndData, + op.signature + ); + } + + function _getUserOpHash(UserOperation memory op, IEntryPoint _entryPoint, uint256 chainID) + internal + pure + returns (bytes32) + { + bytes32 opHash = keccak256(_packUserOp(op, true)); + return keccak256(abi.encode(opHash, address(_entryPoint), chainID)); + } + + function _signUserOp( + UserOperation memory op, + IEntryPoint _entryPoint, + uint256 chainID, + uint256[] memory privateKeys + ) internal pure returns (bytes memory) { + bytes32 hash = _getUserOpHash(op, _entryPoint, chainID); + hash = hash.toEthSignedMessageHash(); + + bytes memory signature; + for (uint256 i = 0; i < privateKeys.length; i++) { + (uint8 v, bytes32 r, bytes32 s) = vm.sign(privateKeys[i], hash); + if (i == 0) { + signature = abi.encodePacked(r, s, v); + } else { + signature = abi.encodePacked(signature, r, s, v); + } + } + + return signature; + } } From f6538d749003bc013efd9e605e0812763169e006 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Federico=20Mart=C3=ADn=20Alconada=20Verzini?= Date: Tue, 16 Jan 2024 09:54:10 -0300 Subject: [PATCH 09/13] refactor: simplify user op helpers --- test/EngenCredits.t.sol | 21 ++------ test/KintoWallet.t.sol | 112 ++++++++-------------------------------- test/helpers/UserOp.sol | 73 +++++++++++++------------- 3 files changed, 59 insertions(+), 147 deletions(-) diff --git a/test/EngenCredits.t.sol b/test/EngenCredits.t.sol index fb4b762af..8fcccc2e1 100644 --- a/test/EngenCredits.t.sol +++ b/test/EngenCredits.t.sol @@ -138,12 +138,7 @@ contract EngenCreditsTest is UserOp, AATestScaffolding { ); UserOperation[] memory userOps = new UserOperation[](2); userOps[0] = _whitelistAppOp( - _chainID, - privateKeys, - address(_kintoWallet), - _kintoWallet.getNonce(), - address(_engenCredits), - address(_paymaster) + privateKeys, address(_kintoWallet), _kintoWallet.getNonce(), address(_engenCredits), address(_paymaster) ); userOps[1] = userOp; // Execute the transaction via the entry point @@ -177,12 +172,7 @@ contract EngenCreditsTest is UserOp, AATestScaffolding { ); UserOperation[] memory userOps = new UserOperation[](2); userOps[0] = _whitelistAppOp( - _chainID, - privateKeys, - address(_kintoWallet), - _kintoWallet.getNonce(), - address(_engenCredits), - address(_paymaster) + privateKeys, address(_kintoWallet), _kintoWallet.getNonce(), address(_engenCredits), address(_paymaster) ); userOps[1] = userOp; // Execute the transaction via the entry point @@ -211,12 +201,7 @@ contract EngenCreditsTest is UserOp, AATestScaffolding { ); UserOperation[] memory userOps = new UserOperation[](2); userOps[0] = _whitelistAppOp( - _chainID, - privateKeys, - address(_kintoWallet), - _kintoWallet.getNonce(), - address(_engenCredits), - address(_paymaster) + privateKeys, address(_kintoWallet), _kintoWallet.getNonce(), address(_engenCredits), address(_paymaster) ); userOps[1] = userOp; // Execute the transaction via the entry point diff --git a/test/KintoWallet.t.sol b/test/KintoWallet.t.sol index 3f3d73260..79f355c11 100644 --- a/test/KintoWallet.t.sol +++ b/test/KintoWallet.t.sol @@ -15,7 +15,6 @@ import {AATestScaffolding} from "./helpers/AATestScaffolding.sol"; contract KintoWalletTest is AATestScaffolding, UserOp { uint256[] privateKeys; - uint256 _chainID = 1; // events event UserOperationRevertReason( @@ -26,8 +25,6 @@ contract KintoWalletTest is AATestScaffolding, UserOp { event RecovererChanged(address indexed newRecoverer, address indexed recoverer); function setUp() public { - vm.chainId(_chainID); - deployAAScaffolding(_owner, 1, _kycProvider, _recoverer); // Add paymaster to _kintoWallet @@ -55,12 +52,10 @@ contract KintoWalletTest is AATestScaffolding, UserOp { // try calling upgradeTo from _owner wallet to upgrade _owner wallet UserOperation memory userOp = _createUserOperation( - _chainID, address(_kintoWallet), _kintoWallet.getNonce(), privateKeys, address(_kintoWallet), - 0, abi.encodeWithSignature("upgradeTo(address)", address(_newImplementation)), address(_paymaster) ); @@ -90,12 +85,10 @@ contract KintoWalletTest is AATestScaffolding, UserOp { privateKeys[0] = _userPk; UserOperation memory userOp = _createUserOperation( - _chainID, address(userWallet), nonce, privateKeys, address(_kintoWallet), - 0, abi.encodeWithSignature("upgradeTo(address)", address(_newImplementation)), address(_paymaster) ); @@ -126,12 +119,10 @@ contract KintoWalletTest is AATestScaffolding, UserOp { // send a transaction to the counter contract through our wallet // without a paymaster and without prefunding the wallet UserOperation memory userOp = _createUserOperation( - _chainID, address(_kintoWallet), _kintoWallet.getNonce(), privateKeys, address(counter), - 0, abi.encodeWithSignature("increment()") ); UserOperation[] memory userOps = new UserOperation[](1); @@ -154,18 +145,16 @@ contract KintoWalletTest is AATestScaffolding, UserOp { // whitelist app userOps[0] = _whitelistAppOp( - _chainID, privateKeys, address(_kintoWallet), _kintoWallet.getNonce(), address(counter), address(_paymaster) + privateKeys, address(_kintoWallet), _kintoWallet.getNonce(), address(counter), address(_paymaster) ); // send a transaction to the counter contract through our wallet // without a paymaster but prefunding the wallet userOps[1] = _createUserOperation( - _chainID, address(_kintoWallet), _kintoWallet.getNonce() + 1, privateKeys, address(counter), - 0, abi.encodeWithSignature("increment()") ); @@ -185,12 +174,10 @@ contract KintoWalletTest is AATestScaffolding, UserOp { // (3). Create Counter increment user op UserOperation[] memory userOps = new UserOperation[](1); userOps[0] = _createUserOperation( - _chainID, address(_kintoWallet), _kintoWallet.getNonce(), privateKeys, address(counter), - 0, abi.encodeWithSignature("increment()"), address(_paymaster) ); @@ -220,12 +207,10 @@ contract KintoWalletTest is AATestScaffolding, UserOp { // (4). Create Counter increment user op UserOperation[] memory userOps = new UserOperation[](1); userOps[0] = _createUserOperation( - _chainID, address(_kintoWallet), _kintoWallet.getNonce(), privateKeys, address(counter), - 0, abi.encodeWithSignature("increment()"), address(_paymaster) ); @@ -255,18 +240,16 @@ contract KintoWalletTest is AATestScaffolding, UserOp { bool[] memory flags = new bool[](1); flags[0] = true; UserOperation memory userOp2 = _createUserOperation( - _chainID, address(_kintoWallet), nonce + 1, privateKeys, address(counter), - 0, abi.encodeWithSignature("increment()"), address(_paymaster) ); UserOperation[] memory userOps = new UserOperation[](2); userOps[0] = _whitelistAppOp( - _chainID, privateKeys, address(_kintoWallet), _kintoWallet.getNonce(), address(counter), address(_paymaster) + privateKeys, address(_kintoWallet), _kintoWallet.getNonce(), address(counter), address(_paymaster) ); userOps[1] = userOp2; // Execute the transactions via the entry point @@ -287,28 +270,23 @@ contract KintoWalletTest is AATestScaffolding, UserOp { _fundPaymasterForContract(address(counter)); // Let's send a transaction to the counter contract through our wallet UserOperation memory userOp = _createUserOperation( - _chainID, address(_kintoWallet), nonce + 1, privateKeys, address(counter), - 0, abi.encodeWithSignature("increment()"), address(_paymaster) ); UserOperation memory userOp2 = _createUserOperation( - _chainID, address(_kintoWallet), nonce + 2, privateKeys, address(counter), - 0, abi.encodeWithSignature("increment()"), address(_paymaster) ); UserOperation[] memory userOps = new UserOperation[](3); - userOps[0] = - _whitelistAppOp(_chainID, privateKeys, address(_kintoWallet), nonce, address(counter), address(_paymaster)); + userOps[0] = _whitelistAppOp(privateKeys, address(_kintoWallet), nonce, address(counter), address(_paymaster)); userOps[1] = userOp; userOps[2] = userOp2; // Execute the transaction via the entry point @@ -346,10 +324,10 @@ contract KintoWalletTest is AATestScaffolding, UserOp { calls[1] = abi.encodeWithSignature("increment()"); calls[2] = abi.encodeWithSignature("increment()"); - OperationParams memory opParams = OperationParams({targetContracts: targets, values: values, bytesOps: calls}); - UserOperation memory userOp = _createUserOperationBatchWithPaymaster( - _chainID, address(_kintoWallet), nonce, privateKeys, opParams, address(_paymaster) - ); + OperationParamsBatch memory opParams = + OperationParamsBatch({targetContracts: targets, values: values, bytesOps: calls}); + UserOperation memory userOp = + _createUserOperation(address(_kintoWallet), nonce, privateKeys, opParams, address(_paymaster)); UserOperation[] memory userOps = new UserOperation[](1); userOps[0] = userOp; // Execute the transaction via the entry point @@ -394,9 +372,10 @@ contract KintoWalletTest is AATestScaffolding, UserOp { calls[2] = abi.encodeWithSignature("increment()"); // send all transactions via batch - OperationParams memory opParams = OperationParams({targetContracts: targets, values: values, bytesOps: calls}); - UserOperation memory userOp = _createUserOperationBatchWithPaymaster( - _chainID, address(_kintoWallet), _kintoWallet.getNonce(), privateKeys, opParams, address(_paymaster) + OperationParamsBatch memory opParams = + OperationParamsBatch({targetContracts: targets, values: values, bytesOps: calls}); + UserOperation memory userOp = _createUserOperation( + address(_kintoWallet), _kintoWallet.getNonce(), privateKeys, opParams, address(_paymaster) ); UserOperation[] memory userOps = new UserOperation[](1); userOps[0] = userOp; @@ -431,12 +410,10 @@ contract KintoWalletTest is AATestScaffolding, UserOp { owners[1] = _user; uint256 nonce = _kintoWallet.getNonce(); UserOperation memory userOp = _createUserOperation( - _chainID, address(_kintoWallet), nonce, privateKeys, address(_kintoWallet), - 0, abi.encodeWithSignature("resetSigners(address[],uint8)", owners, _kintoWallet.signerPolicy()), address(_paymaster) ); @@ -454,12 +431,10 @@ contract KintoWalletTest is AATestScaffolding, UserOp { owners[1] = _owner; UserOperation memory userOp = _createUserOperation( - _chainID, address(_kintoWallet), _kintoWallet.getNonce(), privateKeys, address(_kintoWallet), - 0, abi.encodeWithSignature("resetSigners(address[],uint8)", owners, _kintoWallet.signerPolicy()), address(_paymaster) ); @@ -481,12 +456,10 @@ contract KintoWalletTest is AATestScaffolding, UserOp { address[] memory owners = new address[](0); UserOperation memory userOp = _createUserOperation( - _chainID, address(_kintoWallet), _kintoWallet.getNonce(), privateKeys, address(_kintoWallet), - 0, abi.encodeWithSignature("resetSigners(address[],uint8)", owners, _kintoWallet.signerPolicy()), address(_paymaster) ); @@ -512,12 +485,10 @@ contract KintoWalletTest is AATestScaffolding, UserOp { owners[3] = _user; UserOperation memory userOp = _createUserOperation( - _chainID, address(_kintoWallet), _kintoWallet.getNonce(), privateKeys, address(_kintoWallet), - 0, abi.encodeWithSignature("resetSigners(address[],uint8)", owners, _kintoWallet.signerPolicy()), address(_paymaster) ); @@ -540,12 +511,10 @@ contract KintoWalletTest is AATestScaffolding, UserOp { owners[0] = _user; UserOperation memory userOp = _createUserOperation( - _chainID, address(_kintoWallet), _kintoWallet.getNonce(), privateKeys, address(_kintoWallet), - 0, abi.encodeWithSignature("resetSigners(address[],uint8)", owners, _kintoWallet.signerPolicy()), address(_paymaster) ); @@ -563,12 +532,10 @@ contract KintoWalletTest is AATestScaffolding, UserOp { owners[1] = _user; uint256 nonce = _kintoWallet.getNonce(); UserOperation memory userOp = _createUserOperation( - _chainID, address(_kintoWallet), nonce, privateKeys, address(_kintoWallet), - 0, abi.encodeWithSignature("resetSigners(address[],uint8)", owners, _kintoWallet.ALL_SIGNERS()), address(_paymaster) ); @@ -589,12 +556,10 @@ contract KintoWalletTest is AATestScaffolding, UserOp { owners[2] = _user2; uint256 nonce = _kintoWallet.getNonce(); UserOperation memory userOp = _createUserOperation( - _chainID, address(_kintoWallet), nonce, privateKeys, address(_kintoWallet), - 0, abi.encodeWithSignature("resetSigners(address[],uint8)", owners, _kintoWallet.MINUS_ONE_SIGNER()), address(_paymaster) ); @@ -619,24 +584,20 @@ contract KintoWalletTest is AATestScaffolding, UserOp { // and the policy requires 3 owners. UserOperation[] memory userOps = new UserOperation[](2); userOps[0] = _createUserOperation( - _chainID, address(_kintoWallet), nonce, privateKeys, address(_kintoWallet), - 0, abi.encodeWithSignature("setSignerPolicy(uint8)", _kintoWallet.ALL_SIGNERS()), address(_paymaster) ); // call resetSigners with existing policy (SINGLE_SIGNER) should revert because I'm passing 2 owners userOps[1] = _createUserOperation( - _chainID, address(_kintoWallet), nonce + 1, privateKeys, address(_kintoWallet), - 0, abi.encodeWithSignature("resetSigners(address[], uint8)", owners, _kintoWallet.signerPolicy()), address(_paymaster) ); @@ -675,12 +636,10 @@ contract KintoWalletTest is AATestScaffolding, UserOp { owners[1] = _user; UserOperation memory userOp = _createUserOperation( - _chainID, address(_kintoWallet), _kintoWallet.getNonce(), privateKeys, address(_kintoWallet), - 0, abi.encodeWithSignature("resetSigners(address[],uint8)", owners, _kintoWallet.ALL_SIGNERS()), address(_paymaster) ); @@ -712,17 +671,15 @@ contract KintoWalletTest is AATestScaffolding, UserOp { userOps = new UserOperation[](2); // a. whitelist app userOps[0] = _whitelistAppOp( - _chainID, privateKeys, address(_kintoWallet), _kintoWallet.getNonce(), address(counter), address(_paymaster) + privateKeys, address(_kintoWallet), _kintoWallet.getNonce(), address(counter), address(_paymaster) ); // b. Counter increment userOps[1] = _createUserOperation( - _chainID, address(_kintoWallet), _kintoWallet.getNonce() + 1, privateKeys, address(counter), - 0, abi.encodeWithSignature("increment()"), address(_paymaster) ); @@ -739,12 +696,10 @@ contract KintoWalletTest is AATestScaffolding, UserOp { owners[1] = _user; UserOperation memory userOp = _createUserOperation( - _chainID, address(_kintoWallet), _kintoWallet.getNonce(), privateKeys, address(_kintoWallet), - 0, abi.encodeWithSignature("resetSigners(address[],uint8)", owners, _kintoWallet.ALL_SIGNERS()), address(_paymaster) ); @@ -771,17 +726,15 @@ contract KintoWalletTest is AATestScaffolding, UserOp { // a. whitelist app userOps[0] = _whitelistAppOp( - _chainID, privateKeys, address(_kintoWallet), _kintoWallet.getNonce(), address(counter), address(_paymaster) + privateKeys, address(_kintoWallet), _kintoWallet.getNonce(), address(counter), address(_paymaster) ); // b. Counter increment userOps[1] = _createUserOperation( - _chainID, address(_kintoWallet), _kintoWallet.getNonce() + 1, privateKeys, address(counter), - 0, abi.encodeWithSignature("increment()"), address(_paymaster) ); @@ -799,12 +752,10 @@ contract KintoWalletTest is AATestScaffolding, UserOp { owners[2] = _user2; UserOperation memory userOp = _createUserOperation( - _chainID, address(_kintoWallet), _kintoWallet.getNonce(), privateKeys, address(_kintoWallet), - 0, abi.encodeWithSignature("resetSigners(address[],uint8)", owners, _kintoWallet.ALL_SIGNERS()), address(_paymaster) ); @@ -837,16 +788,14 @@ contract KintoWalletTest is AATestScaffolding, UserOp { userOps = new UserOperation[](2); // a. whitelist app userOps[0] = _whitelistAppOp( - _chainID, privateKeys, address(_kintoWallet), _kintoWallet.getNonce(), address(counter), address(_paymaster) + privateKeys, address(_kintoWallet), _kintoWallet.getNonce(), address(counter), address(_paymaster) ); // b. Counter increment userOps[1] = _createUserOperation( - _chainID, address(_kintoWallet), _kintoWallet.getNonce() + 1, privateKeys, address(counter), - 0, abi.encodeWithSignature("increment()"), address(_paymaster) ); @@ -870,17 +819,15 @@ contract KintoWalletTest is AATestScaffolding, UserOp { userOps = new UserOperation[](2); // a. whitelist app userOps[0] = _whitelistAppOp( - _chainID, privateKeys, address(_kintoWallet), _kintoWallet.getNonce(), address(counter), address(_paymaster) + privateKeys, address(_kintoWallet), _kintoWallet.getNonce(), address(counter), address(_paymaster) ); // b. Counter increment userOps[1] = _createUserOperation( - _chainID, address(_kintoWallet), _kintoWallet.getNonce() + 1, privateKeys, address(counter), - 0, abi.encodeWithSignature("increment()"), address(_paymaster) ); @@ -899,12 +846,10 @@ contract KintoWalletTest is AATestScaffolding, UserOp { owners[2] = _user2; UserOperation memory userOp = _createUserOperation( - _chainID, address(_kintoWallet), _kintoWallet.getNonce(), privateKeys, address(_kintoWallet), - 0, abi.encodeWithSignature("resetSigners(address[],uint8)", owners, _kintoWallet.ALL_SIGNERS()), address(_paymaster) ); @@ -937,17 +882,15 @@ contract KintoWalletTest is AATestScaffolding, UserOp { // a. whitelist app userOps[0] = _whitelistAppOp( - _chainID, privateKeys, address(_kintoWallet), _kintoWallet.getNonce(), address(counter), address(_paymaster) + privateKeys, address(_kintoWallet), _kintoWallet.getNonce(), address(counter), address(_paymaster) ); // b. Counter increment userOps[1] = _createUserOperation( - _chainID, address(_kintoWallet), _kintoWallet.getNonce() + 1, privateKeys, address(counter), - 0, abi.encodeWithSignature("increment()"), address(_paymaster) ); @@ -1119,12 +1062,10 @@ contract KintoWalletTest is AATestScaffolding, UserOp { bool[] memory flags = new bool[](1); flags[0] = true; UserOperation memory userOp = _createUserOperation( - _chainID, address(_kintoWallet), nonce, privateKeys, address(_kintoWallet), - 0, abi.encodeWithSignature("setFunderWhitelist(address[],bool[])", funders, flags), address(_paymaster) ); @@ -1142,12 +1083,10 @@ contract KintoWalletTest is AATestScaffolding, UserOp { address app = address(_engenCredits); registerApp(_owner, "test", address(_engenCredits)); UserOperation memory userOp = _createUserOperation( - _chainID, address(_kintoWallet), _kintoWallet.getNonce(), privateKeys, address(_kintoWallet), - 0, abi.encodeWithSignature("setAppKey(address,address)", app, _user), address(_paymaster) ); @@ -1173,17 +1112,14 @@ contract KintoWalletTest is AATestScaffolding, UserOp { registerApp(_owner, "test", address(_engenCredits)); UserOperation[] memory userOps = new UserOperation[](2); - userOps[0] = _whitelistAppOp( - _chainID, privateKeys, address(_kintoWallet), nonce, address(_engenCredits), address(_paymaster) - ); + userOps[0] = + _whitelistAppOp(privateKeys, address(_kintoWallet), nonce, address(_engenCredits), address(_paymaster)); userOps[1] = _createUserOperation( - _chainID, address(_kintoWallet), nonce + 1, privateKeys, address(_kintoWallet), - 0, abi.encodeWithSignature("setAppKey(address,address)", app, _user), address(_paymaster) ); @@ -1202,12 +1138,10 @@ contract KintoWalletTest is AATestScaffolding, UserOp { // generate the user operation wihch changes the policy to ALL_SIGNERS UserOperation memory userOp = _createUserOperation( - _chainID, address(_kintoWallet), _kintoWallet.getNonce(), privateKeys, address(_kintoWallet), - 0, abi.encodeWithSignature("resetSigners(address[],uint8)", owners, _kintoWallet.ALL_SIGNERS()), address(_paymaster) ); @@ -1235,15 +1169,13 @@ contract KintoWalletTest is AATestScaffolding, UserOp { privateKeys[0] = _ownerPk; privateKeys[1] = _user2Pk; userOps[0] = _whitelistAppOp( - _chainID, privateKeys, address(_kintoWallet), _kintoWallet.getNonce(), address(counter), address(_paymaster) + privateKeys, address(_kintoWallet), _kintoWallet.getNonce(), address(counter), address(_paymaster) ); userOps[1] = _createUserOperation( - _chainID, address(_kintoWallet), _kintoWallet.getNonce() + 1, privateKeys, address(_kintoWallet), - 0, abi.encodeWithSignature("setAppKey(address,address)", address(counter), _user), address(_paymaster) ); @@ -1255,12 +1187,10 @@ contract KintoWalletTest is AATestScaffolding, UserOp { uint256[] memory privateKeysApp = new uint256[](1); privateKeysApp[0] = 3; userOps[0] = _createUserOperation( - _chainID, address(_kintoWallet), _kintoWallet.getNonce(), privateKeysApp, address(counter), - 0, abi.encodeWithSignature("increment()"), address(_paymaster) ); @@ -1287,7 +1217,7 @@ contract KintoWalletTest is AATestScaffolding, UserOp { // (4). Create whitelist app user op UserOperation[] memory userOps = new UserOperation[](1); userOps[0] = _whitelistAppOp( - _chainID, privateKeys, address(_kintoWallet), _kintoWallet.getNonce(), address(counter), address(_paymaster) + privateKeys, address(_kintoWallet), _kintoWallet.getNonce(), address(counter), address(_paymaster) ); // (5). execute the transaction via the entry point @@ -1305,7 +1235,7 @@ contract KintoWalletTest is AATestScaffolding, UserOp { // // (3). Create whitelist app user op // UserOperation[] memory userOps = new UserOperation[](1); // userOps[0] = _whitelistAppOp( - // _chainID, privateKeys, address(_kintoWallet), _kintoWallet.getNonce(), address(counter), address(_paymaster) + // privateKeys, address(_kintoWallet), _kintoWallet.getNonce(), address(counter), address(_paymaster) // ); // // (4). execute the transaction via the entry point and expect a revert event diff --git a/test/helpers/UserOp.sol b/test/helpers/UserOp.sol index e67cb08f3..3e01578ee 100644 --- a/test/helpers/UserOp.sol +++ b/test/helpers/UserOp.sol @@ -34,6 +34,9 @@ abstract contract UserOp is Test { address payable _recoverer = payable(vm.addr(_recovererPk)); address payable _funder = payable(vm.addr(_funderPk)); + // constants + uint256 constant CHAIN_ID = 1; + // gas constants uint256 constant CALL_GAS_LIMIT = 4_000_000; uint256 constant VERIFICATION_GAS_LIMIT = 210_000; @@ -41,34 +44,55 @@ abstract contract UserOp is Test { uint256 constant MAX_FEE_PER_GAS = 1; uint256 constant MAX_PRIORITY_FEE_PER_GAS = 1e9; - struct OperationParams { + struct OperationParamsBatch { address[] targetContracts; uint256[] values; bytes[] bytesOps; } function _createUserOperation( - uint256 _chainID, address _account, uint256 nonce, uint256[] memory _privateKeyOwners, address _targetContract, - uint256 value, bytes memory _bytesOp ) internal view returns (UserOperation memory op) { return _createUserOperation( - _chainID, + CHAIN_ID, _account, nonce, _privateKeyOwners, _targetContract, - value, + 0, _bytesOp, address(0), [CALL_GAS_LIMIT, MAX_FEE_PER_GAS, MAX_PRIORITY_FEE_PER_GAS] ); } + // with paymaster + function _createUserOperation( + address _account, + uint256 nonce, + uint256[] memory _privateKeyOwners, + address _targetContract, + bytes memory _bytesOp, + address _paymaster + ) internal view returns (UserOperation memory op) { + return _createUserOperation( + CHAIN_ID, + _account, + nonce, + _privateKeyOwners, + _targetContract, + 0, + _bytesOp, + _paymaster, + [CALL_GAS_LIMIT, MAX_FEE_PER_GAS, MAX_PRIORITY_FEE_PER_GAS] + ); + } + + // with chain ID and paymaster function _createUserOperation( uint256 _chainID, address _account, @@ -92,6 +116,7 @@ abstract contract UserOp is Test { ); } + // with all params (chain ID, paymaster and gas limits) function _createUserOperation( uint256 _chainID, address _account, @@ -120,16 +145,16 @@ abstract contract UserOp is Test { return op; } - function _createUserOperationBatchWithPaymaster( - uint256 _chainID, + // with execute batch + function _createUserOperation( address _account, uint256 nonce, uint256[] memory _privateKeyOwners, - OperationParams memory opParams, + OperationParamsBatch memory opParams, address _paymaster ) internal view returns (UserOperation memory op) { op = _createUserOperation( - _chainID, + CHAIN_ID, _account, nonce, _privateKeyOwners, @@ -141,38 +166,12 @@ abstract contract UserOp is Test { ); op.callData = abi.encodeCall(KintoWallet.executeBatch, (opParams.targetContracts, opParams.values, opParams.bytesOps)); - op.signature = _signUserOp(op, KintoWallet(payable(_account)).entryPoint(), _chainID, _privateKeyOwners); + op.signature = _signUserOp(op, KintoWallet(payable(_account)).entryPoint(), CHAIN_ID, _privateKeyOwners); } // user ops generators - function _registerAppOp( - uint256 _chainId, - uint256[] memory pk, - address wallet, - uint256 startingNonce, - address _paymaster, - string memory name, - address parentContract, - address[] memory appContracts, - uint256[4] memory appLimits - ) internal view returns (UserOperation memory userOp) { - return _createUserOperation( - _chainId, - address(wallet), - startingNonce, - pk, - address(wallet), - 0, - abi.encodeWithSignature( - "registerApp(string,address,address[],uint256[4])", name, parentContract, appContracts, appLimits - ), - address(_paymaster) - ); - } - function _whitelistAppOp( - uint256 _chainId, uint256[] memory pk, address wallet, uint256 startingNonce, @@ -184,12 +183,10 @@ abstract contract UserOp is Test { bool[] memory flags = new bool[](1); flags[0] = true; return _createUserOperation( - _chainId, address(wallet), startingNonce, pk, address(wallet), - 0, abi.encodeWithSignature("whitelistApp(address[],bool[])", targets, flags), address(_paymaster) ); From 526d29555a6dae4f30dab2d3a2a0d4c9ae8c921d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Federico=20Mart=C3=ADn=20Alconada=20Verzini?= Date: Tue, 16 Jan 2024 10:15:03 -0300 Subject: [PATCH 10/13] refactor: cleanups --- script/migrations/12-create_engen_app.sol | 12 +-- script/test.sol | 12 +-- test/EngenCredits.t.sol | 30 +++----- test/KintoWallet.t.sol | 69 +++++++++-------- test/KintoWalletFactory.t.sol | 11 +-- test/SponsorPaymastExploit.t.sol | 4 +- test/SponsorPaymaster.t.sol | 29 ++------ test/helpers/UserOp.sol | 90 +++++++++++------------ 8 files changed, 113 insertions(+), 144 deletions(-) diff --git a/script/migrations/12-create_engen_app.sol b/script/migrations/12-create_engen_app.sol index 780204087..3ec5137a4 100644 --- a/script/migrations/12-create_engen_app.sol +++ b/script/migrations/12-create_engen_app.sol @@ -78,10 +78,10 @@ contract KintoMigration12DeployScript is ArtifactsReader, UserOp { userOps[0] = _createUserOperation( block.chainid, address(_kintoWallet), - nonce, - privateKeys, address(_kintoWallet), 0, + nonce, + privateKeys, abi.encodeWithSelector(IKintoWallet.whitelistApp.selector, apps, flags), address(_paymaster) ); @@ -90,10 +90,10 @@ contract KintoMigration12DeployScript is ArtifactsReader, UserOp { userOps[1] = _createUserOperation( block.chainid, address(_kintoWallet), - nonce + 1, - privateKeys, address(_kintoAppRegistry), 0, + nonce + 1, + privateKeys, abi.encodeWithSelector(KintoAppRegistry.initialize.selector), address(_paymaster) ); @@ -102,10 +102,10 @@ contract KintoMigration12DeployScript is ArtifactsReader, UserOp { userOps[2] = _createUserOperation( block.chainid, address(_kintoWallet), - nonce + 2, - privateKeys, address(_kintoAppRegistry), 0, + nonce + 2, + privateKeys, abi.encodeWithSignature( "registerApp(string,address,address[],uint256[4])", "Engen", diff --git a/script/test.sol b/script/test.sol index 192e187b3..9624d79c3 100644 --- a/script/test.sol +++ b/script/test.sol @@ -140,16 +140,16 @@ contract KintoDeployTestCounter is AASetup, KYCSignature, UserOp { console.log("Counter already has balance to pay for tx", computed); } // Let's send a transaction to the counter contract through our wallet - uint256 startingNonce = _newWallet.getNonce(); + uint256 nonce = _newWallet.getNonce(); uint256[] memory privateKeys = new uint256[](1); privateKeys[0] = deployerPrivateKey; UserOperation memory userOp = _createUserOperation( block.chainid, address(_newWallet), - startingNonce, - privateKeys, address(counter), 0, + nonce, + privateKeys, abi.encodeWithSignature("increment()"), address(_sponsorPaymaster), [uint256(5000000), 3, 3] @@ -218,16 +218,16 @@ contract KintoDeployETHPriceIsRight is AASetup, KYCSignature, UserOp { console.log("ETHPriceIsRight already has balance to pay for tx", computed); } // Let's send a transaction to the counter contract through our wallet - uint256 startingNonce = _newWallet.getNonce(); + uint256 nonce = _newWallet.getNonce(); uint256[] memory privateKeys = new uint256[](1); privateKeys[0] = deployerPrivateKey; UserOperation memory userOp = _createUserOperation( block.chainid, address(_newWallet), - startingNonce, - privateKeys, address(ethpriceisright), 0, + nonce, + privateKeys, abi.encodeWithSignature("enterGuess(uint256)", 7000), address(_sponsorPaymaster), [uint256(5000000), 3, 3] diff --git a/test/EngenCredits.t.sol b/test/EngenCredits.t.sol index 8fcccc2e1..f8a8b1f8d 100644 --- a/test/EngenCredits.t.sol +++ b/test/EngenCredits.t.sol @@ -123,16 +123,14 @@ contract EngenCreditsTest is UserOp, AATestScaffolding { assertEq(_engenCredits.calculatePoints(address(_kintoWallet)), 15); vm.startPrank(_owner); // Let's send a transaction to the counter contract through our wallet - uint256 startingNonce = _kintoWallet.getNonce(); + uint256 nonce = _kintoWallet.getNonce(); uint256[] memory privateKeys = new uint256[](1); privateKeys[0] = 1; UserOperation memory userOp = _createUserOperation( - _chainID, address(_kintoWallet), - startingNonce + 1, - privateKeys, address(_engenCredits), - 0, + nonce + 1, + privateKeys, abi.encodeWithSignature("mintCredits()"), address(_paymaster) ); @@ -157,16 +155,14 @@ contract EngenCreditsTest is UserOp, AATestScaffolding { assertEq(_engenCredits.balanceOf(address(_kintoWallet)), 0); assertEq(_engenCredits.calculatePoints(address(_kintoWallet)), 20); // Let's send a transaction to the counter contract through our wallet - uint256 startingNonce = _kintoWallet.getNonce(); + uint256 nonce = _kintoWallet.getNonce(); uint256[] memory privateKeys = new uint256[](1); privateKeys[0] = 1; UserOperation memory userOp = _createUserOperation( - _chainID, address(_kintoWallet), - startingNonce + 1, - privateKeys, address(_engenCredits), - 0, + nonce + 1, + privateKeys, abi.encodeWithSignature("mintCredits()"), address(_paymaster) ); @@ -186,16 +182,14 @@ contract EngenCreditsTest is UserOp, AATestScaffolding { assertEq(_engenCredits.calculatePoints(address(_kintoWallet)), 15); vm.startPrank(_owner); // Let's send a transaction to the counter contract through our wallet - uint256 startingNonce = _kintoWallet.getNonce(); + uint256 nonce = _kintoWallet.getNonce(); uint256[] memory privateKeys = new uint256[](1); privateKeys[0] = 1; UserOperation memory userOp = _createUserOperation( - _chainID, address(_kintoWallet), - startingNonce + 1, - privateKeys, address(_engenCredits), - 0, + nonce + 1, + privateKeys, abi.encodeWithSignature("mintCredits()"), address(_paymaster) ); @@ -209,12 +203,10 @@ contract EngenCreditsTest is UserOp, AATestScaffolding { assertEq(_engenCredits.balanceOf(address(_kintoWallet)), 15); // call again userOp = _createUserOperation( - _chainID, address(_kintoWallet), - startingNonce + 2, - privateKeys, address(_engenCredits), - 0, + nonce + 2, + privateKeys, abi.encodeWithSignature("mintCredits()"), address(_paymaster) ); diff --git a/test/KintoWallet.t.sol b/test/KintoWallet.t.sol index 79f355c11..2908de9ea 100644 --- a/test/KintoWallet.t.sol +++ b/test/KintoWallet.t.sol @@ -52,10 +52,10 @@ contract KintoWalletTest is AATestScaffolding, UserOp { // try calling upgradeTo from _owner wallet to upgrade _owner wallet UserOperation memory userOp = _createUserOperation( + address(_kintoWallet), address(_kintoWallet), _kintoWallet.getNonce(), privateKeys, - address(_kintoWallet), abi.encodeWithSignature("upgradeTo(address)", address(_newImplementation)), address(_paymaster) ); @@ -86,9 +86,9 @@ contract KintoWalletTest is AATestScaffolding, UserOp { UserOperation memory userOp = _createUserOperation( address(userWallet), + address(_kintoWallet), nonce, privateKeys, - address(_kintoWallet), abi.encodeWithSignature("upgradeTo(address)", address(_newImplementation)), address(_paymaster) ); @@ -120,9 +120,9 @@ contract KintoWalletTest is AATestScaffolding, UserOp { // without a paymaster and without prefunding the wallet UserOperation memory userOp = _createUserOperation( address(_kintoWallet), + address(counter), _kintoWallet.getNonce(), privateKeys, - address(counter), abi.encodeWithSignature("increment()") ); UserOperation[] memory userOps = new UserOperation[](1); @@ -152,9 +152,9 @@ contract KintoWalletTest is AATestScaffolding, UserOp { // without a paymaster but prefunding the wallet userOps[1] = _createUserOperation( address(_kintoWallet), + address(counter), _kintoWallet.getNonce() + 1, privateKeys, - address(counter), abi.encodeWithSignature("increment()") ); @@ -175,9 +175,9 @@ contract KintoWalletTest is AATestScaffolding, UserOp { UserOperation[] memory userOps = new UserOperation[](1); userOps[0] = _createUserOperation( address(_kintoWallet), + address(counter), _kintoWallet.getNonce(), privateKeys, - address(counter), abi.encodeWithSignature("increment()"), address(_paymaster) ); @@ -208,9 +208,9 @@ contract KintoWalletTest is AATestScaffolding, UserOp { UserOperation[] memory userOps = new UserOperation[](1); userOps[0] = _createUserOperation( address(_kintoWallet), + address(counter), _kintoWallet.getNonce(), privateKeys, - address(counter), abi.encodeWithSignature("increment()"), address(_paymaster) ); @@ -241,9 +241,9 @@ contract KintoWalletTest is AATestScaffolding, UserOp { flags[0] = true; UserOperation memory userOp2 = _createUserOperation( address(_kintoWallet), + address(counter), nonce + 1, privateKeys, - address(counter), abi.encodeWithSignature("increment()"), address(_paymaster) ); @@ -271,17 +271,17 @@ contract KintoWalletTest is AATestScaffolding, UserOp { // Let's send a transaction to the counter contract through our wallet UserOperation memory userOp = _createUserOperation( address(_kintoWallet), + address(counter), nonce + 1, privateKeys, - address(counter), abi.encodeWithSignature("increment()"), address(_paymaster) ); UserOperation memory userOp2 = _createUserOperation( address(_kintoWallet), + address(counter), nonce + 2, privateKeys, - address(counter), abi.encodeWithSignature("increment()"), address(_paymaster) ); @@ -410,10 +410,10 @@ contract KintoWalletTest is AATestScaffolding, UserOp { owners[1] = _user; uint256 nonce = _kintoWallet.getNonce(); UserOperation memory userOp = _createUserOperation( + address(_kintoWallet), address(_kintoWallet), nonce, privateKeys, - address(_kintoWallet), abi.encodeWithSignature("resetSigners(address[],uint8)", owners, _kintoWallet.signerPolicy()), address(_paymaster) ); @@ -431,10 +431,10 @@ contract KintoWalletTest is AATestScaffolding, UserOp { owners[1] = _owner; UserOperation memory userOp = _createUserOperation( + address(_kintoWallet), address(_kintoWallet), _kintoWallet.getNonce(), privateKeys, - address(_kintoWallet), abi.encodeWithSignature("resetSigners(address[],uint8)", owners, _kintoWallet.signerPolicy()), address(_paymaster) ); @@ -456,10 +456,10 @@ contract KintoWalletTest is AATestScaffolding, UserOp { address[] memory owners = new address[](0); UserOperation memory userOp = _createUserOperation( + address(_kintoWallet), address(_kintoWallet), _kintoWallet.getNonce(), privateKeys, - address(_kintoWallet), abi.encodeWithSignature("resetSigners(address[],uint8)", owners, _kintoWallet.signerPolicy()), address(_paymaster) ); @@ -485,10 +485,10 @@ contract KintoWalletTest is AATestScaffolding, UserOp { owners[3] = _user; UserOperation memory userOp = _createUserOperation( + address(_kintoWallet), address(_kintoWallet), _kintoWallet.getNonce(), privateKeys, - address(_kintoWallet), abi.encodeWithSignature("resetSigners(address[],uint8)", owners, _kintoWallet.signerPolicy()), address(_paymaster) ); @@ -511,10 +511,10 @@ contract KintoWalletTest is AATestScaffolding, UserOp { owners[0] = _user; UserOperation memory userOp = _createUserOperation( + address(_kintoWallet), address(_kintoWallet), _kintoWallet.getNonce(), privateKeys, - address(_kintoWallet), abi.encodeWithSignature("resetSigners(address[],uint8)", owners, _kintoWallet.signerPolicy()), address(_paymaster) ); @@ -532,10 +532,10 @@ contract KintoWalletTest is AATestScaffolding, UserOp { owners[1] = _user; uint256 nonce = _kintoWallet.getNonce(); UserOperation memory userOp = _createUserOperation( + address(_kintoWallet), address(_kintoWallet), nonce, privateKeys, - address(_kintoWallet), abi.encodeWithSignature("resetSigners(address[],uint8)", owners, _kintoWallet.ALL_SIGNERS()), address(_paymaster) ); @@ -556,10 +556,10 @@ contract KintoWalletTest is AATestScaffolding, UserOp { owners[2] = _user2; uint256 nonce = _kintoWallet.getNonce(); UserOperation memory userOp = _createUserOperation( + address(_kintoWallet), address(_kintoWallet), nonce, privateKeys, - address(_kintoWallet), abi.encodeWithSignature("resetSigners(address[],uint8)", owners, _kintoWallet.MINUS_ONE_SIGNER()), address(_paymaster) ); @@ -584,20 +584,20 @@ contract KintoWalletTest is AATestScaffolding, UserOp { // and the policy requires 3 owners. UserOperation[] memory userOps = new UserOperation[](2); userOps[0] = _createUserOperation( + address(_kintoWallet), address(_kintoWallet), nonce, privateKeys, - address(_kintoWallet), abi.encodeWithSignature("setSignerPolicy(uint8)", _kintoWallet.ALL_SIGNERS()), address(_paymaster) ); // call resetSigners with existing policy (SINGLE_SIGNER) should revert because I'm passing 2 owners userOps[1] = _createUserOperation( + address(_kintoWallet), address(_kintoWallet), nonce + 1, privateKeys, - address(_kintoWallet), abi.encodeWithSignature("resetSigners(address[], uint8)", owners, _kintoWallet.signerPolicy()), address(_paymaster) ); @@ -636,10 +636,10 @@ contract KintoWalletTest is AATestScaffolding, UserOp { owners[1] = _user; UserOperation memory userOp = _createUserOperation( + address(_kintoWallet), address(_kintoWallet), _kintoWallet.getNonce(), privateKeys, - address(_kintoWallet), abi.encodeWithSignature("resetSigners(address[],uint8)", owners, _kintoWallet.ALL_SIGNERS()), address(_paymaster) ); @@ -677,9 +677,9 @@ contract KintoWalletTest is AATestScaffolding, UserOp { // b. Counter increment userOps[1] = _createUserOperation( address(_kintoWallet), + address(counter), _kintoWallet.getNonce() + 1, privateKeys, - address(counter), abi.encodeWithSignature("increment()"), address(_paymaster) ); @@ -696,10 +696,10 @@ contract KintoWalletTest is AATestScaffolding, UserOp { owners[1] = _user; UserOperation memory userOp = _createUserOperation( + address(_kintoWallet), address(_kintoWallet), _kintoWallet.getNonce(), privateKeys, - address(_kintoWallet), abi.encodeWithSignature("resetSigners(address[],uint8)", owners, _kintoWallet.ALL_SIGNERS()), address(_paymaster) ); @@ -732,9 +732,9 @@ contract KintoWalletTest is AATestScaffolding, UserOp { // b. Counter increment userOps[1] = _createUserOperation( address(_kintoWallet), + address(counter), _kintoWallet.getNonce() + 1, privateKeys, - address(counter), abi.encodeWithSignature("increment()"), address(_paymaster) ); @@ -752,10 +752,10 @@ contract KintoWalletTest is AATestScaffolding, UserOp { owners[2] = _user2; UserOperation memory userOp = _createUserOperation( + address(_kintoWallet), address(_kintoWallet), _kintoWallet.getNonce(), privateKeys, - address(_kintoWallet), abi.encodeWithSignature("resetSigners(address[],uint8)", owners, _kintoWallet.ALL_SIGNERS()), address(_paymaster) ); @@ -793,9 +793,9 @@ contract KintoWalletTest is AATestScaffolding, UserOp { // b. Counter increment userOps[1] = _createUserOperation( address(_kintoWallet), + address(counter), _kintoWallet.getNonce() + 1, privateKeys, - address(counter), abi.encodeWithSignature("increment()"), address(_paymaster) ); @@ -825,9 +825,9 @@ contract KintoWalletTest is AATestScaffolding, UserOp { // b. Counter increment userOps[1] = _createUserOperation( address(_kintoWallet), + address(counter), _kintoWallet.getNonce() + 1, privateKeys, - address(counter), abi.encodeWithSignature("increment()"), address(_paymaster) ); @@ -846,10 +846,10 @@ contract KintoWalletTest is AATestScaffolding, UserOp { owners[2] = _user2; UserOperation memory userOp = _createUserOperation( + address(_kintoWallet), address(_kintoWallet), _kintoWallet.getNonce(), privateKeys, - address(_kintoWallet), abi.encodeWithSignature("resetSigners(address[],uint8)", owners, _kintoWallet.ALL_SIGNERS()), address(_paymaster) ); @@ -888,9 +888,9 @@ contract KintoWalletTest is AATestScaffolding, UserOp { // b. Counter increment userOps[1] = _createUserOperation( address(_kintoWallet), + address(counter), _kintoWallet.getNonce() + 1, privateKeys, - address(counter), abi.encodeWithSignature("increment()"), address(_paymaster) ); @@ -1062,10 +1062,10 @@ contract KintoWalletTest is AATestScaffolding, UserOp { bool[] memory flags = new bool[](1); flags[0] = true; UserOperation memory userOp = _createUserOperation( + address(_kintoWallet), address(_kintoWallet), nonce, privateKeys, - address(_kintoWallet), abi.encodeWithSignature("setFunderWhitelist(address[],bool[])", funders, flags), address(_paymaster) ); @@ -1083,10 +1083,10 @@ contract KintoWalletTest is AATestScaffolding, UserOp { address app = address(_engenCredits); registerApp(_owner, "test", address(_engenCredits)); UserOperation memory userOp = _createUserOperation( + address(_kintoWallet), address(_kintoWallet), _kintoWallet.getNonce(), privateKeys, - address(_kintoWallet), abi.encodeWithSignature("setAppKey(address,address)", app, _user), address(_paymaster) ); @@ -1116,10 +1116,10 @@ contract KintoWalletTest is AATestScaffolding, UserOp { _whitelistAppOp(privateKeys, address(_kintoWallet), nonce, address(_engenCredits), address(_paymaster)); userOps[1] = _createUserOperation( + address(_kintoWallet), address(_kintoWallet), nonce + 1, privateKeys, - address(_kintoWallet), abi.encodeWithSignature("setAppKey(address,address)", app, _user), address(_paymaster) ); @@ -1138,10 +1138,10 @@ contract KintoWalletTest is AATestScaffolding, UserOp { // generate the user operation wihch changes the policy to ALL_SIGNERS UserOperation memory userOp = _createUserOperation( + address(_kintoWallet), address(_kintoWallet), _kintoWallet.getNonce(), privateKeys, - address(_kintoWallet), abi.encodeWithSignature("resetSigners(address[],uint8)", owners, _kintoWallet.ALL_SIGNERS()), address(_paymaster) ); @@ -1172,25 +1172,24 @@ contract KintoWalletTest is AATestScaffolding, UserOp { privateKeys, address(_kintoWallet), _kintoWallet.getNonce(), address(counter), address(_paymaster) ); userOps[1] = _createUserOperation( + address(_kintoWallet), address(_kintoWallet), _kintoWallet.getNonce() + 1, privateKeys, - address(_kintoWallet), abi.encodeWithSignature("setAppKey(address,address)", address(counter), _user), address(_paymaster) ); _entryPoint.handleOps(userOps, payable(_owner)); userOps = new UserOperation[](1); - console.log("counter address", address(counter)); - console.log("user address", _user); + // Set only app key signature uint256[] memory privateKeysApp = new uint256[](1); privateKeysApp[0] = 3; userOps[0] = _createUserOperation( address(_kintoWallet), + address(counter), _kintoWallet.getNonce(), privateKeysApp, - address(counter), abi.encodeWithSignature("increment()"), address(_paymaster) ); diff --git a/test/KintoWalletFactory.t.sol b/test/KintoWalletFactory.t.sol index 7e4518dad..c48e06568 100644 --- a/test/KintoWalletFactory.t.sol +++ b/test/KintoWalletFactory.t.sol @@ -41,10 +41,7 @@ contract KintoWalletFactoryTest is UserOp, AATestScaffolding { KintoWalletFactoryUpgrade _walletFactoryv2; KintoWalletUpgrade _kintoWalletv2; - uint256 _chainID = 1; - function setUp() public { - vm.chainId(_chainID); vm.startPrank(address(1)); _owner.transfer(1e18); vm.stopPrank(); @@ -139,7 +136,7 @@ contract KintoWalletFactoryTest is UserOp, AATestScaffolding { function testWhitelistedSignerCanFundWallet() public { vm.startPrank(_owner); _fundPaymasterForContract(address(_kintoWallet)); - uint256 startingNonce = _kintoWallet.getNonce(); + uint256 nonce = _kintoWallet.getNonce(); address[] memory funders = new address[](1); funders[0] = _funder; bool[] memory flags = new bool[](1); @@ -147,12 +144,10 @@ contract KintoWalletFactoryTest is UserOp, AATestScaffolding { uint256[] memory privateKeys = new uint256[](1); privateKeys[0] = 1; UserOperation memory userOp = _createUserOperation( - _chainID, address(_kintoWallet), - startingNonce, - privateKeys, address(_kintoWallet), - 0, + nonce, + privateKeys, abi.encodeWithSignature("setFunderWhitelist(address[],bool[])", funders, flags), address(_paymaster) ); diff --git a/test/SponsorPaymastExploit.t.sol b/test/SponsorPaymastExploit.t.sol index ed542153d..76c105d73 100644 --- a/test/SponsorPaymastExploit.t.sol +++ b/test/SponsorPaymastExploit.t.sol @@ -71,14 +71,14 @@ contract SponsorPaymasterExploitTest is MyOpCreator, AATestScaffolding { _fundPaymasterForContract(address(counter)); vm.startPrank(_owner); // Let's send a transaction to the counter contract through our wallet - uint256 startingNonce = _kintoWallet.getNonce(); + uint256 nonce = _kintoWallet.getNonce(); uint256[] memory privateKeys = new uint256[](1); privateKeys[0] = 1; UserOperation memory userOp = this._createOp( _chainID, address(_kintoWallet), - startingNonce, + nonce, privateKeys, address(counter), 0, diff --git a/test/SponsorPaymaster.t.sol b/test/SponsorPaymaster.t.sol index daef31c61..be253fb8d 100644 --- a/test/SponsorPaymaster.t.sol +++ b/test/SponsorPaymaster.t.sol @@ -32,7 +32,6 @@ contract SponsorPaymasterTest is KYCSignature, UserOp, AATestScaffolding { using ECDSAUpgradeable for bytes32; using SignatureChecker for address; - uint256 _chainID = 1; uint256[] privateKeys; function setUp() public { @@ -154,12 +153,10 @@ contract SponsorPaymasterTest is KYCSignature, UserOp, AATestScaffolding { function testValidatePaymasterUserOp() public { UserOperation memory userOp = _createUserOperation( - _chainID, + address(_kintoWallet), address(_kintoWallet), _kintoWallet.getNonce(), privateKeys, - address(_kintoWallet), - 0, abi.encodeWithSignature("increment()"), address(_paymaster) ); @@ -170,12 +167,10 @@ contract SponsorPaymasterTest is KYCSignature, UserOp, AATestScaffolding { function testValidatePaymasterUserOp_RevertWhen_GasLimitIsLessThanCostOfPost() public { UserOperation memory userOp = _createUserOperation( - _chainID, + address(_kintoWallet), address(_kintoWallet), _kintoWallet.getNonce(), privateKeys, - address(_kintoWallet), - 0, abi.encodeWithSignature("increment()"), address(_paymaster) ); @@ -190,12 +185,10 @@ contract SponsorPaymasterTest is KYCSignature, UserOp, AATestScaffolding { function testValidatePaymasterUserOp_RevertWhen_GasLimitIsMoreThanCostOfVerification() public { UserOperation memory userOp = _createUserOperation( - _chainID, + address(_kintoWallet), address(_kintoWallet), _kintoWallet.getNonce(), privateKeys, - address(_kintoWallet), - 0, abi.encodeWithSignature("increment()"), address(_paymaster) ); @@ -210,12 +203,10 @@ contract SponsorPaymasterTest is KYCSignature, UserOp, AATestScaffolding { function testValidatePaymasterUserOp_RevertWhen_PreGasLimitIsMoreThanMaxPreVerification() public { UserOperation memory userOp = _createUserOperation( - _chainID, + address(_kintoWallet), address(_kintoWallet), _kintoWallet.getNonce(), privateKeys, - address(_kintoWallet), - 0, abi.encodeWithSignature("increment()"), address(_paymaster) ); @@ -230,12 +221,10 @@ contract SponsorPaymasterTest is KYCSignature, UserOp, AATestScaffolding { function testValidatePaymasterUserOp_RevertWhen_PaymasterAndDataIsNotLength20() public { UserOperation memory userOp = _createUserOperation( - _chainID, + address(_kintoWallet), address(_kintoWallet), _kintoWallet.getNonce(), privateKeys, - address(_kintoWallet), - 0, abi.encodeWithSignature("increment()"), address(_paymaster) ); @@ -250,12 +239,10 @@ contract SponsorPaymasterTest is KYCSignature, UserOp, AATestScaffolding { function testValidatePaymasterUserOp_RevertWhen_GasIsTooHigh() public { UserOperation memory userOp = _createUserOperation( - _chainID, + address(_kintoWallet), address(_kintoWallet), _kintoWallet.getNonce(), privateKeys, - address(_kintoWallet), - 0, abi.encodeWithSignature("increment()"), address(_paymaster) ); @@ -542,12 +529,10 @@ contract SponsorPaymasterTest is KYCSignature, UserOp, AATestScaffolding { // we iterate from 1 because the first op is whitelisting the app for (uint256 i = 0; i < amt; i++) { userOps[i] = _createUserOperation( - _chainID, address(_kintoWallet), + address(app), nonce, privateKeys, - address(app), - 0, abi.encodeWithSignature("increment()"), address(_paymaster) ); diff --git a/test/helpers/UserOp.sol b/test/helpers/UserOp.sol index 3e01578ee..5bc610084 100644 --- a/test/helpers/UserOp.sol +++ b/test/helpers/UserOp.sol @@ -51,19 +51,19 @@ abstract contract UserOp is Test { } function _createUserOperation( - address _account, - uint256 nonce, + address _from, + address _target, + uint256 _nonce, uint256[] memory _privateKeyOwners, - address _targetContract, bytes memory _bytesOp ) internal view returns (UserOperation memory op) { return _createUserOperation( CHAIN_ID, - _account, - nonce, - _privateKeyOwners, - _targetContract, + _from, + _target, 0, + _nonce, + _privateKeyOwners, _bytesOp, address(0), [CALL_GAS_LIMIT, MAX_FEE_PER_GAS, MAX_PRIORITY_FEE_PER_GAS] @@ -72,20 +72,20 @@ abstract contract UserOp is Test { // with paymaster function _createUserOperation( - address _account, - uint256 nonce, + address _from, + address _target, + uint256 _nonce, uint256[] memory _privateKeyOwners, - address _targetContract, bytes memory _bytesOp, address _paymaster ) internal view returns (UserOperation memory op) { return _createUserOperation( CHAIN_ID, - _account, - nonce, - _privateKeyOwners, - _targetContract, + _from, + _target, 0, + _nonce, + _privateKeyOwners, _bytesOp, _paymaster, [CALL_GAS_LIMIT, MAX_FEE_PER_GAS, MAX_PRIORITY_FEE_PER_GAS] @@ -95,21 +95,21 @@ abstract contract UserOp is Test { // with chain ID and paymaster function _createUserOperation( uint256 _chainID, - address _account, - uint256 nonce, + address _from, + address _target, + uint256 _value, + uint256 _nonce, uint256[] memory _privateKeyOwners, - address _targetContract, - uint256 value, bytes memory _bytesOp, address _paymaster ) internal view returns (UserOperation memory op) { return _createUserOperation( _chainID, - _account, - nonce, + _from, + _target, + _value, + _nonce, _privateKeyOwners, - _targetContract, - value, _bytesOp, _paymaster, [CALL_GAS_LIMIT, MAX_FEE_PER_GAS, MAX_PRIORITY_FEE_PER_GAS] @@ -119,20 +119,20 @@ abstract contract UserOp is Test { // with all params (chain ID, paymaster and gas limits) function _createUserOperation( uint256 _chainID, - address _account, - uint256 nonce, + address _from, + address _target, + uint256 _value, + uint256 _nonce, uint256[] memory _privateKeyOwners, - address _targetContract, - uint256 value, bytes memory _bytesOp, address _paymaster, uint256[3] memory _gasLimits ) internal view returns (UserOperation memory op) { op = UserOperation({ - sender: _account, - nonce: nonce, + sender: _from, + nonce: _nonce, initCode: bytes(""), - callData: abi.encodeCall(KintoWallet.execute, (_targetContract, value, _bytesOp)), + callData: abi.encodeCall(KintoWallet.execute, (_target, _value, _bytesOp)), callGasLimit: _gasLimits[0], // generate from call simulation verificationGasLimit: 210_000, // verification gas. will add create2 cost (3200+200*length) if initCode exists preVerificationGas: 21_000, // should also cover calldata cost. @@ -141,52 +141,50 @@ abstract contract UserOp is Test { paymasterAndData: abi.encodePacked(_paymaster), signature: bytes("") }); - op.signature = _signUserOp(op, KintoWallet(payable(_account)).entryPoint(), _chainID, _privateKeyOwners); + op.signature = _signUserOp(op, KintoWallet(payable(_from)).entryPoint(), _chainID, _privateKeyOwners); return op; } // with execute batch function _createUserOperation( - address _account, - uint256 nonce, + address _from, + uint256 _nonce, uint256[] memory _privateKeyOwners, OperationParamsBatch memory opParams, address _paymaster ) internal view returns (UserOperation memory op) { op = _createUserOperation( CHAIN_ID, - _account, - nonce, - _privateKeyOwners, + _from, address(0), 0, + _nonce, + _privateKeyOwners, bytes(""), _paymaster, [CALL_GAS_LIMIT, MAX_FEE_PER_GAS, MAX_PRIORITY_FEE_PER_GAS] ); op.callData = abi.encodeCall(KintoWallet.executeBatch, (opParams.targetContracts, opParams.values, opParams.bytesOps)); - op.signature = _signUserOp(op, KintoWallet(payable(_account)).entryPoint(), CHAIN_ID, _privateKeyOwners); + op.signature = _signUserOp(op, KintoWallet(payable(_from)).entryPoint(), CHAIN_ID, _privateKeyOwners); } // user ops generators - function _whitelistAppOp( - uint256[] memory pk, - address wallet, - uint256 startingNonce, - address app, - address _paymaster - ) internal view returns (UserOperation memory userOp) { + function _whitelistAppOp(uint256[] memory pk, address from, uint256 nonce, address app, address _paymaster) + internal + view + returns (UserOperation memory userOp) + { address[] memory targets = new address[](1); targets[0] = address(app); bool[] memory flags = new bool[](1); flags[0] = true; return _createUserOperation( - address(wallet), - startingNonce, + from, + from, // target is the wallet itself + nonce, pk, - address(wallet), abi.encodeWithSignature("whitelistApp(address[],bool[])", targets, flags), address(_paymaster) ); From d0deeba39914a683871cb12857ec43fa3942d583 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Federico=20Mart=C3=ADn=20Alconada=20Verzini?= Date: Tue, 16 Jan 2024 12:07:12 -0300 Subject: [PATCH 11/13] fix: migrations --- script/migrations/15-faucet_v2.sol | 18 +++++++++--------- script/migrations/17-faucet_v3.sol | 6 +++--- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/script/migrations/15-faucet_v2.sol b/script/migrations/15-faucet_v2.sol index fc7a4d6bb..3d35260b0 100644 --- a/script/migrations/15-faucet_v2.sol +++ b/script/migrations/15-faucet_v2.sol @@ -88,38 +88,38 @@ contract KintoMigration15DeployScript is Create2Helper, ArtifactsReader, UserOp bool[] memory flags = new bool[](1); flags[0] = true; - userOps[0] = this.createUserOperation( + userOps[0] = _createUserOperation( block.chainid, _from, - nonce, - privateKeys, _from, 0, + nonce, + privateKeys, abi.encodeWithSelector(IKintoWallet.whitelistApp.selector, apps, flags), _getChainDeployment("SponsorPaymaster") ); } // (2). initialise faucet - userOps[1] = this.createUserOperation( + userOps[1] = _createUserOperation( block.chainid, _from, - nonce + 1, - privateKeys, _faucet, 0, + nonce + 1, + privateKeys, abi.encodeWithSelector(Faucet.initialize.selector), _getChainDeployment("SponsorPaymaster") ); // (3). call startFaucet - userOps[2] = this.createUserOperation( + userOps[2] = _createUserOperation( block.chainid, _from, - nonce + 2, - privateKeys, _faucet, 1 ether, + nonce + 2, + privateKeys, abi.encodeWithSelector(Faucet.startFaucet.selector), _getChainDeployment("SponsorPaymaster") ); diff --git a/script/migrations/17-faucet_v3.sol b/script/migrations/17-faucet_v3.sol index 16a6d5ce3..834bf31b3 100644 --- a/script/migrations/17-faucet_v3.sol +++ b/script/migrations/17-faucet_v3.sol @@ -63,13 +63,13 @@ contract KintoMigration15DeployScript is Create2Helper, ArtifactsReader, UserOp uint256[] memory privateKeys = new uint256[](1); privateKeys[0] = _signerPk; UserOperation[] memory userOps = new UserOperation[](1); - userOps[0] = this.createUserOperation( + userOps[0] = _createUserOperation( block.chainid, adminWallet, - nonce, - privateKeys, faucetProxy, 0, + nonce, + privateKeys, abi.encodeWithSelector(UUPSUpgradeable.upgradeTo.selector, address(_newFaucetImpl)), _getChainDeployment("SponsorPaymaster") ); From 02576e99c28dfe843c771d199701e93a6fe52219 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Federico=20Mart=C3=ADn=20Alconada=20Verzini?= Date: Tue, 16 Jan 2024 12:38:15 -0300 Subject: [PATCH 12/13] refactor: rename targetContract to target --- src/paymasters/SponsorPaymaster.sol | 12 ++++++------ src/wallet/KintoWallet.sol | 14 +++++++------- test/KintoWallet.t.sol | 6 ++---- test/SponsorPaymastExploit.t.sol | 4 ++-- test/helpers/UserOp.sol | 5 ++--- 5 files changed, 19 insertions(+), 22 deletions(-) diff --git a/src/paymasters/SponsorPaymaster.sol b/src/paymasters/SponsorPaymaster.sol index f7b1d456b..86810eb57 100644 --- a/src/paymasters/SponsorPaymaster.sol +++ b/src/paymasters/SponsorPaymaster.sol @@ -286,19 +286,19 @@ contract SponsorPaymaster is Initializable, BasePaymaster, UUPSUpgradeable, Reen bytes4 selector = bytes4(callData[:4]); // function selector if (selector == IKintoWallet.executeBatch.selector) { // decode callData for executeBatch - (address[] memory targetContracts,,) = abi.decode(callData[4:], (address[], uint256[], bytes[])); - sponsor = appRegistry.getSponsor(targetContracts[targetContracts.length - 1]); + (address[] memory targets,,) = abi.decode(callData[4:], (address[], uint256[], bytes[])); + sponsor = appRegistry.getSponsor(targets[targets.length - 1]); // last contract must be a contract app - for (uint256 i = 0; i < targetContracts.length - 1; i++) { - if (!appRegistry.isContractSponsored(sponsor, targetContracts[i]) && targetContracts[i] != sender) { + for (uint256 i = 0; i < targets.length - 1; i++) { + if (!appRegistry.isContractSponsored(sponsor, targets[i]) && targets[i] != sender) { revert("SP: executeBatch targets must be sponsored by the contract or be the sender wallet"); } } } else if (selector == IKintoWallet.execute.selector) { // decode callData for execute - (address targetContract,,) = abi.decode(callData[4:], (address, uint256, bytes)); - sponsor = appRegistry.getSponsor(targetContract); + (address target,,) = abi.decode(callData[4:], (address, uint256, bytes)); + sponsor = appRegistry.getSponsor(target); } else { // handle unknown function or error revert("SP: Unknown function selector"); diff --git a/src/wallet/KintoWallet.sol b/src/wallet/KintoWallet.sol index 1e7cec3fc..ecd625c60 100644 --- a/src/wallet/KintoWallet.sol +++ b/src/wallet/KintoWallet.sol @@ -360,24 +360,24 @@ contract KintoWallet is Initializable, BaseAccount, TokenCallbackHandler, IKinto // Compare the selector with the known function selectors if (selector == IKintoWallet.executeBatch.selector) { // Decode callData for executeBatch - (address[] memory targetContracts,,) = abi.decode(callData[4:], (address[], uint256[], bytes[])); - address lastTargetContract = appRegistry.getSponsor(targetContracts[targetContracts.length - 1]); - for (uint256 i = 0; i < targetContracts.length; i++) { + (address[] memory targets,,) = abi.decode(callData[4:], (address[], uint256[], bytes[])); + address lastTargetContract = appRegistry.getSponsor(targets[targets.length - 1]); + for (uint256 i = 0; i < targets.length; i++) { // App signer should only be valid for the app itself and its children // It is important that wallet calls are not allowed through the app signer - if (!appRegistry.isContractSponsored(lastTargetContract, targetContracts[i])) { + if (!appRegistry.isContractSponsored(lastTargetContract, targets[i])) { return address(0); } } return lastTargetContract; } else if (selector == IKintoWallet.execute.selector) { // Decode callData for execute - (address targetContract,,) = abi.decode(callData[4:], (address, uint256, bytes)); + (address target,,) = abi.decode(callData[4:], (address, uint256, bytes)); // Do not allow txs to the wallet via app key - if (targetContract == address(this)) { + if (target == address(this)) { return address(0); } - return targetContract; + return target; } return address(0); } diff --git a/test/KintoWallet.t.sol b/test/KintoWallet.t.sol index 2908de9ea..da773f7d6 100644 --- a/test/KintoWallet.t.sol +++ b/test/KintoWallet.t.sol @@ -324,8 +324,7 @@ contract KintoWalletTest is AATestScaffolding, UserOp { calls[1] = abi.encodeWithSignature("increment()"); calls[2] = abi.encodeWithSignature("increment()"); - OperationParamsBatch memory opParams = - OperationParamsBatch({targetContracts: targets, values: values, bytesOps: calls}); + OperationParamsBatch memory opParams = OperationParamsBatch({targets: targets, values: values, bytesOps: calls}); UserOperation memory userOp = _createUserOperation(address(_kintoWallet), nonce, privateKeys, opParams, address(_paymaster)); UserOperation[] memory userOps = new UserOperation[](1); @@ -372,8 +371,7 @@ contract KintoWalletTest is AATestScaffolding, UserOp { calls[2] = abi.encodeWithSignature("increment()"); // send all transactions via batch - OperationParamsBatch memory opParams = - OperationParamsBatch({targetContracts: targets, values: values, bytesOps: calls}); + OperationParamsBatch memory opParams = OperationParamsBatch({targets: targets, values: values, bytesOps: calls}); UserOperation memory userOp = _createUserOperation( address(_kintoWallet), _kintoWallet.getNonce(), privateKeys, opParams, address(_paymaster) ); diff --git a/test/SponsorPaymastExploit.t.sol b/test/SponsorPaymastExploit.t.sol index 76c105d73..0aef917c1 100644 --- a/test/SponsorPaymastExploit.t.sol +++ b/test/SponsorPaymastExploit.t.sol @@ -23,7 +23,7 @@ contract MyOpCreator is UserOp, KYCSignature { address _account, uint256 nonce, uint256[] calldata _privateKeyOwners, - address _targetContract, + address _target, uint256 value, bytes calldata _bytesOp, address _paymaster @@ -32,7 +32,7 @@ contract MyOpCreator is UserOp, KYCSignature { sender: _account, nonce: nonce, initCode: bytes(""), - callData: abi.encodeCall(KintoWallet.execute, (_targetContract, value, _bytesOp)), + callData: abi.encodeCall(KintoWallet.execute, (_target, value, _bytesOp)), callGasLimit: 40000, // generate from call simulation verificationGasLimit: 150000, // verification gas. will add create2 cost (3200+200*length) if initCode exists preVerificationGas: 99e18, // should also cover calldata cost. diff --git a/test/helpers/UserOp.sol b/test/helpers/UserOp.sol index 5bc610084..55c5d3ec4 100644 --- a/test/helpers/UserOp.sol +++ b/test/helpers/UserOp.sol @@ -45,7 +45,7 @@ abstract contract UserOp is Test { uint256 constant MAX_PRIORITY_FEE_PER_GAS = 1e9; struct OperationParamsBatch { - address[] targetContracts; + address[] targets; uint256[] values; bytes[] bytesOps; } @@ -164,8 +164,7 @@ abstract contract UserOp is Test { _paymaster, [CALL_GAS_LIMIT, MAX_FEE_PER_GAS, MAX_PRIORITY_FEE_PER_GAS] ); - op.callData = - abi.encodeCall(KintoWallet.executeBatch, (opParams.targetContracts, opParams.values, opParams.bytesOps)); + op.callData = abi.encodeCall(KintoWallet.executeBatch, (opParams.targets, opParams.values, opParams.bytesOps)); op.signature = _signUserOp(op, KintoWallet(payable(_from)).entryPoint(), CHAIN_ID, _privateKeyOwners); } From 7a9a72c24ced6b16d7746164d5269eb134d39e85 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Federico=20Mart=C3=ADn=20Alconada=20Verzini?= Date: Tue, 16 Jan 2024 16:56:59 -0300 Subject: [PATCH 13/13] chore: rmv commented code on export.js --- utils/export.js | 56 ------------------------------------------------- 1 file changed, 56 deletions(-) diff --git a/utils/export.js b/utils/export.js index c286547f0..1360e0957 100644 --- a/utils/export.js +++ b/utils/export.js @@ -65,59 +65,3 @@ processFiles(); const jsonString = JSON.stringify({ contracts: contracts }, null, 2); fs.writeFileSync(`./artifacts/${network}.json`, jsonString); - - -// const files = fs.readdirSync(dirPath); - - -// // Loop through all directories in src -// for (let i = 0; i < files.length; i++) { -// const filePath = path.join(dirPath, files[i]); -// const fileExt = path.extname(filePath); -// if (fileExt === '' && !filePath.includes('interfaces') && !filePath.includes('libraries')) { // Ensure we only process directories -// const dirFiles = fs.readdirSync(filePath); -// for (let j = 0; j < dirFiles.length; j++) { -// const dirFilePath = path.join(filePath, dirFiles[j]); -// const dirFileExt = path.extname(dirFilePath); - -// if (dirFileExt === '.sol') { // Ensure we only process .sol files -// const contractName = path.basename(dirFilePath, '.sol'); -// const cmd = `forge inspect ${contractName} abi`; -// const result = execSync(cmd).toString(); -// console.log('Exported:', contractName, 'ABI'); -// const jsonObject = JSON.parse(result); -// let address = addresses[contractName]; -// if (!address || address.length < 8) { -// address = "0x0000000000000000000000000000000000000000"; -// console.error('MISSING ADDRESS FOR', contractName); -// } -// contracts[contractName] = {"abi": jsonObject, "address": address}; -// } -// } -// } -// } - - -// for (let i = 0; i < files.length; i++) { -// const filePath = path.join(dirPath, files[i]); -// const fileExt = path.extname(filePath); - -// if (fileExt === '.sol') { // Ensure we only process .sol files -// const contractName = path.basename(filePath, '.sol'); -// const cmd = `forge inspect ${contractName} abi`; -// const result = execSync(cmd).toString(); - -// console.log('Exported:', contractName, 'ABI'); - -// const jsonObject = JSON.parse(result); -// let address = addresses[contractName]; -// if (!address || address.length < 8) { -// address = '0x0000000000000000000000000000000000000000'; -// console.error('MISSING ADDRESS FOR', contractName); -// } -// contracts[contractName] = {"abi": jsonObject, "address": address}; -// } -// } - -// const jsonString = JSON.stringify({"contracts": contracts}); -// fs.writeFileSync(`./artifacts/${network}.json`, jsonString); \ No newline at end of file