diff --git a/contracts/deployment.toml b/contracts/deployment.toml index f26a7dcc5..bb1bf7b64 100644 --- a/contracts/deployment.toml +++ b/contracts/deployment.toml @@ -13,6 +13,7 @@ admin = "0x0000000000000000000000000000000000000000" # Contracts verifier = "0x8EaB2D97Dfce405A1692a21b3ff3A172d593D319" +application-verifier = "0x0000000000000000000000000000000000000000" set-verifier = "0x0000000000000000000000000000000000000000" boundless-market = "0x0000000000000000000000000000000000000000" boundless-market-impl = "0x0000000000000000000000000000000000000000" @@ -57,6 +58,7 @@ admin-2 = "0xb04d1a222789a76e74168a919b43b20f66e24f0b" # Contracts verifier = "0x0b144e07a0826182b6b59788c34b32bfa86fb711" +application-verifier = "0x0b144e07a0826182b6b59788c34b32bfa86fb711" set-verifier = "0x1Ab08498CfF17b9723ED67143A050c8E8c2e3104" # deployed at block 31134603 boundless-market = "0xfd152dadc5183870710fe54f939eae3ab9f0fe82" @@ -83,6 +85,7 @@ admin-2 = "0xb04d1a222789a76e74168a919b43b20f66e24f0b" # Contracts verifier = "0x925d8331ddc0a1F0d96E68CF073DFE1d92b69187" +application-verifier = "0x925d8331ddc0a1F0d96E68CF073DFE1d92b69187" set-verifier = "0xcb9D14347b1e816831ECeE46EC199144F360B55c" # deployed at block 8476627 boundless-market = "0xc211b581cb62e3a6d396a592bab34979e1bbba7d" @@ -129,6 +132,7 @@ admin-2 = "0xb04d1a222789a76e74168a919b43b20f66e24f0b" # Contracts verifier = "0x0b144e07a0826182b6b59788c34b32bfa86fb711" +application-verifier = "0x0b144e07a0826182b6b59788c34b32bfa86fb711" set-verifier = "0x1Ab08498CfF17b9723ED67143A050c8E8c2e3104" # deployed at block 26646012 boundless-market = "0x56da3786061c82214d18e634d2817e86ad42d7ce" @@ -158,6 +162,7 @@ admin = "0x0000000000000000000000000000000000000000" # Contracts verifier = "0x925d8331ddc0a1F0d96E68CF073DFE1d92b69187" +application-verifier = "0x925d8331ddc0a1F0d96E68CF073DFE1d92b69187" set-verifier = "0xcb9D14347b1e816831ECeE46EC199144F360B55c" boundless-market = "0x0000000000000000000000000000000000000000" boundless-market-impl = "0x0000000000000000000000000000000000000000" @@ -200,6 +205,7 @@ admin-2 = "0xb04d1a222789a76e74168a919b43b20f66e24f0b" # Contracts verifier = "0x0b144e07a0826182b6b59788c34b32bfa86fb711" +application-verifier = "0x0b144e07a0826182b6b59788c34b32bfa86fb711" set-verifier = "0x1Ab08498CfF17b9723ED67143A050c8E8c2e3104" # deployed at block 26370829 boundless-market = "0x7abb16522f4599481361d318b765af988bfcca8e" @@ -229,6 +235,7 @@ admin = "0x08C35D3ADD5b4e914a1742f08bf00e72A85Cbe90" # Contracts verifier = "0x925d8331ddc0a1F0d96E68CF073DFE1d92b69187" +application-verifier = "0x925d8331ddc0a1F0d96E68CF073DFE1d92b69187" set-verifier = "0xcb9D14347b1e816831ECeE46EC199144F360B55c" # deployed at block 8430932 boundless-market = "0x0000000000000000000000000000000000000000" @@ -275,6 +282,7 @@ admin-2 = "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266" # Contracts verifier = "0x0000000000000000000000000000000000000000" +application-verifier = "0x0000000000000000000000000000000000000000" set-verifier = "0x0000000000000000000000000000000000000000" boundless-market = "0x0000000000000000000000000000000000000000" boundless-market-impl = "0x0000000000000000000000000000000000000000" diff --git a/contracts/scripts/Config.s.sol b/contracts/scripts/Config.s.sol index d1dc222b7..00a56059b 100644 --- a/contracts/scripts/Config.s.sol +++ b/contracts/scripts/Config.s.sol @@ -14,6 +14,7 @@ struct DeploymentConfig { address admin; address admin2; address verifier; + address applicationVerifier; address setVerifier; address boundlessMarket; address boundlessMarketImpl; @@ -102,6 +103,8 @@ library ConfigParser { deploymentConfig.admin = stdToml.readAddressOr(config, string.concat(chain, ".admin"), address(0)); deploymentConfig.admin2 = stdToml.readAddressOr(config, string.concat(chain, ".admin-2"), address(0)); deploymentConfig.verifier = stdToml.readAddressOr(config, string.concat(chain, ".verifier"), address(0)); + deploymentConfig.applicationVerifier = + stdToml.readAddressOr(config, string.concat(chain, ".application-verifier"), address(0)); deploymentConfig.setVerifier = stdToml.readAddressOr(config, string.concat(chain, ".set-verifier"), address(0)); deploymentConfig.boundlessMarket = stdToml.readAddressOr(config, string.concat(chain, ".boundless-market"), address(0)); diff --git a/contracts/scripts/Deploy.s.sol b/contracts/scripts/Deploy.s.sol index 047622d73..a6a6145b1 100644 --- a/contracts/scripts/Deploy.s.sol +++ b/contracts/scripts/Deploy.s.sol @@ -23,6 +23,7 @@ contract Deploy is BoundlessScriptBase, RiscZeroCheats { string constant CONFIG_FILE = "contracts/deployment.toml"; IRiscZeroVerifier verifier; + IRiscZeroVerifier applicationVerifier; address boundlessMarketAddress; bytes32 assessorImageId; address stakeToken; @@ -48,6 +49,7 @@ contract Deploy is BoundlessScriptBase, RiscZeroCheats { // Assign parsed config values to the variables verifier = IRiscZeroVerifier(deploymentConfig.verifier); + applicationVerifier = IRiscZeroVerifier(deploymentConfig.applicationVerifier); assessorImageId = deploymentConfig.assessorImageId; assessorGuestUrl = deploymentConfig.assessorGuestUrl; @@ -96,6 +98,7 @@ contract Deploy is BoundlessScriptBase, RiscZeroCheats { verifierRouter.addVerifier(setVerifier.SELECTOR(), setVerifier); verifier = IRiscZeroVerifier(verifierRouter); + applicationVerifier = verifier; } if (address(verifier) == address(0)) { @@ -104,6 +107,12 @@ contract Deploy is BoundlessScriptBase, RiscZeroCheats { console2.log("Using IRiscZeroVerifier deployed at", address(verifier)); } + if (address(applicationVerifier) == address(0)) { + revert("application verifier must be specified in deployment.toml"); + } else { + console2.log("Using application IRiscZeroVerifier deployed at", address(applicationVerifier)); + } + if (deploymentConfig.collateralToken == address(0)) { // Deploy the HitPoints contract stakeToken = address(new HitPoints(boundlessMarketOwner)); @@ -116,8 +125,9 @@ contract Deploy is BoundlessScriptBase, RiscZeroCheats { // Deploy the Boundless market bytes32 salt = vm.envOr("SALT", keccak256(abi.encodePacked("salt"))); - address newImplementation = - address(new BoundlessMarket{salt: salt}(verifier, assessorImageId, bytes32(0), 0, stakeToken)); + address newImplementation = address( + new BoundlessMarket{salt: salt}(verifier, applicationVerifier, assessorImageId, bytes32(0), 0, stakeToken) + ); console2.log("Deployed new BoundlessMarket implementation at", newImplementation); boundlessMarketAddress = address( new ERC1967Proxy{salt: salt}( diff --git a/contracts/scripts/Manage.s.sol b/contracts/scripts/Manage.s.sol index e8c38bc07..d8d23d99f 100644 --- a/contracts/scripts/Manage.s.sol +++ b/contracts/scripts/Manage.s.sol @@ -66,6 +66,7 @@ contract DeployBoundlessMarket is BoundlessScriptBase { address admin = deploymentConfig.admin.required("admin"); address verifier = deploymentConfig.verifier.required("verifier"); + address applicationVerifier = deploymentConfig.verifier.required("application-verifier"); bytes32 assessorImageId = deploymentConfig.assessorImageId.required("assessor-image-id"); string memory assessorGuestUrl = deploymentConfig.assessorGuestUrl.required("assessor-guest-url"); address collateralToken = deploymentConfig.collateralToken.required("collateral-token"); @@ -75,7 +76,12 @@ contract DeployBoundlessMarket is BoundlessScriptBase { bytes32 salt = bytes32(0); address newImplementation = address( new BoundlessMarket{salt: salt}( - IRiscZeroVerifier(verifier), assessorImageId, bytes32(0), 0, collateralToken + IRiscZeroVerifier(verifier), + IRiscZeroVerifier(applicationVerifier), + assessorImageId, + bytes32(0), + 0, + collateralToken ) ); address marketAddress = address( @@ -89,6 +95,10 @@ contract DeployBoundlessMarket is BoundlessScriptBase { // Verify the deployment BoundlessMarket market = BoundlessMarket(marketAddress); require(market.VERIFIER() == IRiscZeroVerifier(deploymentConfig.verifier), "verifier does not match"); + require( + market.APPLICATION_VERIFIER() == IRiscZeroVerifier(deploymentConfig.applicationVerifier), + "application verifier does not match" + ); (bytes32 assessorId, string memory guestUrl) = market.imageInfo(); require(assessorId == deploymentConfig.assessorImageId, "assessor image ID does not match"); require( @@ -105,6 +115,7 @@ contract DeployBoundlessMarket is BoundlessScriptBase { console2.log("BoundlessMarket admin is %s", deploymentConfig.admin); console2.log("BoundlessMarket stake token contract at %s", deploymentConfig.collateralToken); console2.log("BoundlessMarket verifier contract at %s", deploymentConfig.verifier); + console2.log("BoundlessMarket application verifier contract at %s", deploymentConfig.applicationVerifier); console2.log("BoundlessMarket assessor image ID %s", Strings.toHexString(uint256(assessorId), 32)); console2.log("BoundlessMarket assessor guest URL %s", guestUrl); @@ -154,6 +165,7 @@ contract UpgradeBoundlessMarket is BoundlessScriptBase { address marketAddress = deploymentConfig.boundlessMarket.required("boundless-market"); address collateralToken = deploymentConfig.collateralToken.required("collateral-token"); address verifier = deploymentConfig.verifier.required("verifier"); + address applicationVerifier = deploymentConfig.verifier.required("application-verifier"); address currentImplementation = address(uint160(uint256(vm.load(marketAddress, IMPLEMENTATION_SLOT)))); uint32 deprecatedAssessorDuration = deploymentConfig.deprecatedAssessorDuration; @@ -178,6 +190,7 @@ contract UpgradeBoundlessMarket is BoundlessScriptBase { UpgradeOptions memory opts; opts.constructorData = BoundlessMarketLib.encodeConstructorArgs( IRiscZeroVerifier(verifier), + IRiscZeroVerifier(applicationVerifier), assessorImageId, deprecatedAssessorImageId, deprecatedAssessorDuration, @@ -228,6 +241,10 @@ contract UpgradeBoundlessMarket is BoundlessScriptBase { upgradedMarket.VERIFIER() == IRiscZeroVerifier(deploymentConfig.verifier), "upgraded market verifier does not match" ); + require( + upgradedMarket.APPLICATION_VERIFIER() == IRiscZeroVerifier(deploymentConfig.applicationVerifier), + "upgraded market application verifier does not match" + ); (bytes32 assessorId, string memory upgradedGuestUrl) = upgradedMarket.imageInfo(); require(assessorId == deploymentConfig.assessorImageId, "upgraded market assessor image ID does not match"); require( @@ -248,6 +265,9 @@ contract UpgradeBoundlessMarket is BoundlessScriptBase { console2.log("Upgraded BoundlessMarket impl contract at %s", boundlessMarketImpl); console2.log("Upgraded BoundlessMarket collateral token contract at %s", deploymentConfig.collateralToken); console2.log("Upgraded BoundlessMarket verifier contract at %s", deploymentConfig.verifier); + console2.log( + "Upgraded BoundlessMarket application verifier contract at %s", deploymentConfig.applicationVerifier + ); console2.log("Upgraded BoundlessMarket assessor image ID %s", Strings.toHexString(uint256(assessorId), 32)); console2.log("Upgraded BoundlessMarket assessor guest URL %s", upgradedGuestUrl); } @@ -301,6 +321,10 @@ contract RollbackBoundlessMarket is BoundlessScriptBase { upgradedMarket.VERIFIER() == IRiscZeroVerifier(deploymentConfig.verifier), "upgraded market verifier does not match" ); + require( + upgradedMarket.APPLICATION_VERIFIER() == IRiscZeroVerifier(deploymentConfig.applicationVerifier), + "upgraded market application verifier does not match" + ); (bytes32 assessorId, string memory upgradedGuestUrl) = upgradedMarket.imageInfo(); require(assessorId == deploymentConfig.assessorImageId, "upgraded market assessor image ID does not match"); require( @@ -320,6 +344,9 @@ contract RollbackBoundlessMarket is BoundlessScriptBase { console2.log("Upgraded BoundlessMarket proxy contract at %s", marketAddress); console2.log("Upgraded BoundlessMarket collateral token contract at %s", deploymentConfig.collateralToken); console2.log("Upgraded BoundlessMarket verifier contract at %s", deploymentConfig.verifier); + console2.log( + "Upgraded BoundlessMarket application verifier contract at %s", deploymentConfig.applicationVerifier + ); console2.log("Upgraded BoundlessMarket assessor image ID %s", Strings.toHexString(uint256(assessorId), 32)); console2.log("Upgraded BoundlessMarket assessor guest URL %s", upgradedGuestUrl); diff --git a/contracts/snapshots/BoundlessMarketBasicTest.json b/contracts/snapshots/BoundlessMarketBasicTest.json index bac91eb2c..33f223ede 100644 --- a/contracts/snapshots/BoundlessMarketBasicTest.json +++ b/contracts/snapshots/BoundlessMarketBasicTest.json @@ -1,15 +1,15 @@ { "ERC20 approve: required for depositCollateral": "45966", - "bytecode size implementation": "24570", + "bytecode size implementation": "24469", "bytecode size proxy": "89", - "deposit: first ever deposit": "50964", - "deposit: second deposit": "33864", - "depositCollateral: 1 HP (tops up market account)": "59396", - "depositCollateral: full (drains testProver account)": "49796", + "deposit: first ever deposit": "50920", + "deposit: second deposit": "33820", + "depositCollateral: 1 HP (tops up market account)": "59352", + "depositCollateral: full (drains testProver account)": "49752", "depositCollateralWithPermit: 1 HP (tops up market account)": "72145", "depositCollateralWithPermit: full (drains testProver account)": "72136", - "depositTo: first ever deposit": "51046", - "depositTo: second deposit": "33946", + "depositTo: first ever deposit": "51002", + "depositTo: second deposit": "33902", "fulfill (no journal): a batch of 8": "351707", "fulfill: a batch of 8": "370252", "fulfill: a locked request": "87293", @@ -19,27 +19,27 @@ "fulfill: fulfilled by the locked prover for payment (request already fulfilled by another prover)": "82117", "fulfillAndWithdraw: a batch of 8": "382122", "fulfillAndWithdraw: a locked request": "99163", - "lockinRequest: base case": "147068", - "lockinRequest: with prover signature": "156752", - "priceAndFulfill: a single request": "109151", - "priceAndFulfill: a single request (smart contract signature)": "115313", - "priceAndFulfill: a single request (with selector)": "111462", - "priceAndFulfill: a single request that was not locked": "109151", - "priceAndFulfill: a single request that was not locked fulfilled by prover not in allow-list": "109151", - "priceAndFulfill: fulfill already fulfilled was locked request": "107459", + "lockinRequest: base case": "146962", + "lockinRequest: with prover signature": "156606", + "priceAndFulfill: a single request": "109067", + "priceAndFulfill: a single request (smart contract signature)": "115229", + "priceAndFulfill: a single request (with selector)": "111378", + "priceAndFulfill: a single request that was not locked": "109067", + "priceAndFulfill: a single request that was not locked fulfilled by prover not in allow-list": "109067", + "priceAndFulfill: fulfill already fulfilled was locked request": "107375", "slash: base case": "101033", "slash: fulfilled request after lock deadline": "80598", - "submitRequest: with maxPrice ether": "52779", - "submitRequest: without ether": "45936", + "submitRequest: with maxPrice ether": "52735", + "submitRequest: without ether": "45892", "submitRootAndFulfill: a batch of 2 requests": "161173", - "submitRootAndFulfill: a locked request": "121988", - "submitRootAndFulfill: a locked request (locked via prover signature)": "121988", + "submitRootAndFulfill: a locked request": "121944", + "submitRootAndFulfill: a locked request (locked via prover signature)": "121944", "submitRootAndFulfillAndWithdraw: a locked request": "133271", - "submitRootAndPriceAndFulfill: a single request": "142403", - "submitRootAndPriceAndFulfill: a single request that was not locked": "142403", - "submitRootAndPriceAndFulfill: a single request that was not locked fulfilled by prover not in allow-list": "142403", + "submitRootAndPriceAndFulfill: a single request": "142297", + "submitRootAndPriceAndFulfill: a single request that was not locked": "142297", + "submitRootAndPriceAndFulfill: a single request that was not locked fulfilled by prover not in allow-list": "142297", "withdraw: 1 ether": "40358", "withdraw: full balance": "40370", - "withdrawCollateral: 1 HP balance": "69117", - "withdrawCollateral: full balance": "52113" + "withdrawCollateral: 1 HP balance": "69118", + "withdrawCollateral: full balance": "52114" } \ No newline at end of file diff --git a/contracts/src/BoundlessMarket.sol b/contracts/src/BoundlessMarket.sol index 34e11be82..8ba929303 100644 --- a/contracts/src/BoundlessMarket.sol +++ b/contracts/src/BoundlessMarket.sol @@ -68,6 +68,7 @@ contract BoundlessMarket is // Using immutable here means the image ID and verifier address is linked to the implementation // contract, and not to the proxy. Any deployment that wants to update these values must deploy // a new implementation contract. + /// @dev Risc0 verifier router used for assessor seals. /// @custom:oz-upgrades-unsafe-allow state-variable-immutable IRiscZeroVerifier public immutable VERIFIER; /// @custom:oz-upgrades-unsafe-allow state-variable-immutable @@ -115,9 +116,16 @@ contract BoundlessMarket is /// @custom:oz-upgrades-unsafe-allow state-variable-immutable uint64 public immutable DEPRECATED_ASSESSOR_EXPIRES_AT; + // Using immutable here means the application verifier address is linked to the implementation + // contract, and not to the proxy. Any deployment that wants to update this value must deploy + // a new implementation contract. + /// @custom:oz-upgrades-unsafe-allow state-variable-immutable + IRiscZeroVerifier public immutable APPLICATION_VERIFIER; + /// @custom:oz-upgrades-unsafe-allow constructor constructor( IRiscZeroVerifier verifier, + IRiscZeroVerifier applicationVerifier, bytes32 assessorId, bytes32 deprecatedAssessorId, uint32 deprecatedAssessorDuration, @@ -125,6 +133,7 @@ contract BoundlessMarket is ) { // Validate non-zero critical params require(address(verifier) != address(0), "Invalid verifier"); + require(address(applicationVerifier) != address(0), "Invalid application verifier"); require(assessorId != bytes32(0), "Invalid assessor image"); require(collateralTokenContract != address(0), "Invalid collateral token"); if (deprecatedAssessorDuration > 0) { @@ -132,6 +141,7 @@ contract BoundlessMarket is } VERIFIER = verifier; + APPLICATION_VERIFIER = applicationVerifier; ASSESSOR_ID = assessorId; COLLATERAL_TOKEN_CONTRACT = collateralTokenContract; DEPRECATED_ASSESSOR_ID = deprecatedAssessorId; @@ -300,9 +310,11 @@ contract BoundlessMarket is // If the requestor did not specify a selector, we verify with DEFAULT_MAX_GAS_FOR_VERIFY gas limit. // This ensures that by default, client receive proofs that can be verified cheaply as part of their applications. if (!hasSelector[i]) { - VERIFIER.verifyIntegrity{gas: DEFAULT_MAX_GAS_FOR_VERIFY}(Receipt(fill.seal, fill.claimDigest)); + APPLICATION_VERIFIER.verifyIntegrity{gas: DEFAULT_MAX_GAS_FOR_VERIFY}( + Receipt(fill.seal, fill.claimDigest) + ); } else { - VERIFIER.verifyIntegrity(Receipt(fill.seal, fill.claimDigest)); + APPLICATION_VERIFIER.verifyIntegrity(Receipt(fill.seal, fill.claimDigest)); } } @@ -815,22 +827,6 @@ contract BoundlessMarket is return uint256(accounts[addr].balance); } - /// @inheritdoc IBoundlessMarket - /// @dev We withdraw from address(this) but send to msg.sender, so _withdraw is not used. - function withdrawFromTreasury(uint256 value) public onlyRole(ADMIN_ROLE) { - if (accounts[address(this)].balance < value.toUint96()) { - revert InsufficientBalance(address(this)); - } - unchecked { - accounts[address(this)].balance -= value.toUint96(); - } - (bool sent,) = msg.sender.call{value: value}(""); - if (!sent) { - revert TransferFailed(); - } - emit Withdrawal(address(this), value); - } - /// @inheritdoc IBoundlessMarket function depositCollateral(uint256 value) external { // Transfer tokens from user to market @@ -870,20 +866,6 @@ contract BoundlessMarket is return uint256(accounts[addr].collateralBalance); } - /// @inheritdoc IBoundlessMarket - function withdrawFromCollateralTreasury(uint256 value) public onlyRole(ADMIN_ROLE) { - if (accounts[address(this)].collateralBalance < value.toUint96()) { - revert InsufficientBalance(address(this)); - } - unchecked { - accounts[address(this)].collateralBalance -= value.toUint96(); - } - bool success = ERC20(COLLATERAL_TOKEN_CONTRACT).transfer(msg.sender, value); - if (!success) revert TransferFailed(); - - emit CollateralWithdrawal(address(this), value); - } - /// @inheritdoc IBoundlessMarket function requestIsFulfilled(RequestId id) public view returns (bool) { (address client, uint32 idx) = id.clientAndIndex(); diff --git a/contracts/src/IBoundlessMarket.sol b/contracts/src/IBoundlessMarket.sol index d2be0f178..e94ed3910 100644 --- a/contracts/src/IBoundlessMarket.sol +++ b/contracts/src/IBoundlessMarket.sol @@ -233,16 +233,6 @@ interface IBoundlessMarket { /// @return The balance of the account. function balanceOf(address addr) external view returns (uint256); - /// @notice Withdraw funds from the market's treasury. - /// @dev Value is debited from the market's account. - /// @param value The amount to withdraw. - function withdrawFromTreasury(uint256 value) external; - - /// @notice Withdraw funds from the market' collateral treasury. - /// @dev Value is debited from the market's account. - /// @param value The amount to withdraw. - function withdrawFromCollateralTreasury(uint256 value) external; - /// @notice Deposit collateral into the market to pay for lockin collateral. /// @dev Before calling this method, the account owner must approve the contract as an allowed spender. function depositCollateral(uint256 value) external; diff --git a/contracts/src/libraries/BoundlessMarketLib.sol b/contracts/src/libraries/BoundlessMarketLib.sol index b7fdd3a61..9caf8be85 100644 --- a/contracts/src/libraries/BoundlessMarketLib.sol +++ b/contracts/src/libraries/BoundlessMarketLib.sol @@ -17,11 +17,19 @@ library BoundlessMarketLib { /// signature of the BoundlessMarket constructor. function encodeConstructorArgs( IRiscZeroVerifier verifier, + IRiscZeroVerifier applicationVerifier, bytes32 assessorId, bytes32 deprecatedAssessorId, uint32 deprecatedAssessorDuration, address stakeTokenContract ) internal pure returns (bytes memory) { - return abi.encode(verifier, assessorId, deprecatedAssessorId, deprecatedAssessorDuration, stakeTokenContract); + return abi.encode( + verifier, + applicationVerifier, + assessorId, + deprecatedAssessorId, + deprecatedAssessorDuration, + stakeTokenContract + ); } } diff --git a/contracts/test/BoundlessMarket.t.sol b/contracts/test/BoundlessMarket.t.sol index f16b608e0..4ce24fd4e 100644 --- a/contracts/test/BoundlessMarket.t.sol +++ b/contracts/test/BoundlessMarket.t.sol @@ -118,6 +118,7 @@ contract BoundlessMarketTest is Test { // Deploy the UUPS proxy with the implementation boundlessMarketSource = address( new BoundlessMarket( + setVerifier, setVerifier, ASSESSOR_IMAGE_ID, DEPRECATED_ASSESSOR_IMAGE_ID, @@ -679,57 +680,6 @@ contract BoundlessMarketBasicTest is BoundlessMarketTest { expectMarketBalanceUnchanged(); } - function testWithdrawFromTreasury() public { - // Deposit funds into the market - vm.deal(address(boundlessMarket), 1 ether); - vm.prank(address(boundlessMarket)); - boundlessMarket.deposit{value: 1 ether}(); - - // Attempt to withdraw funds from the treasury from an unauthorized account. - vm.expectRevert( - abi.encodeWithSelector( - IAccessControl.AccessControlUnauthorizedAccount.selector, - testProverAddress, - boundlessMarket.ADMIN_ROLE() - ) - ); - vm.prank(testProverAddress); - boundlessMarket.withdrawFromTreasury(1 ether); - - uint256 initialBalance = ownerWallet.addr.balance; - // Withdraw funds from the treasury - vm.expectEmit(true, true, true, true); - emit IBoundlessMarket.Withdrawal(address(boundlessMarket), 1 ether); - vm.prank(ownerWallet.addr); - boundlessMarket.withdrawFromTreasury(1 ether); - assert(boundlessMarket.balanceOf(address(boundlessMarket)) == 0); - assert(ownerWallet.addr.balance == 1 ether + initialBalance); - } - - function testWithdrawFromStakeTreasury() public { - testSlashLockedRequestFullyExpired(); - - // Attempt to withdraw funds from the stake treasury from an unauthorized account. - vm.expectRevert( - abi.encodeWithSelector( - IAccessControl.AccessControlUnauthorizedAccount.selector, - testProverAddress, - boundlessMarket.ADMIN_ROLE() - ) - ); - vm.prank(testProverAddress); - uint256 expectedWithdrawal = 1 ether - (1 ether * EXPECTED_SLASH_BURN_BPS / 10000); - boundlessMarket.withdrawFromCollateralTreasury(expectedWithdrawal); - - // Withdraw funds from the stake treasury - vm.expectEmit(true, true, true, true); - emit IBoundlessMarket.CollateralWithdrawal(address(boundlessMarket), expectedWithdrawal); - vm.prank(ownerWallet.addr); - boundlessMarket.withdrawFromCollateralTreasury(expectedWithdrawal); - assert(boundlessMarket.balanceOfCollateral(address(boundlessMarket)) == 0); - assert(collateralToken.balanceOf(ownerWallet.addr) == expectedWithdrawal); - } - function testWithdrawals() public { // Deposit funds into the market vm.deal(testProverAddress, 3 ether); @@ -4319,6 +4269,7 @@ contract BoundlessMarketUpgradeTest is BoundlessMarketTest { proxy = UnsafeUpgrades.deployUUPSProxy( address( new BoundlessMarket( + setVerifier, setVerifier, ASSESSOR_IMAGE_ID, DEPRECATED_ASSESSOR_IMAGE_ID, @@ -4338,6 +4289,7 @@ contract BoundlessMarketUpgradeTest is BoundlessMarketTest { proxy, address( new BoundlessMarket( + setVerifier, setVerifier, ASSESSOR_IMAGE_ID, DEPRECATED_ASSESSOR_IMAGE_ID, diff --git a/crates/boundless-market/build.rs b/crates/boundless-market/build.rs index e92850438..34d4e3b11 100644 --- a/crates/boundless-market/build.rs +++ b/crates/boundless-market/build.rs @@ -254,7 +254,7 @@ fn get_interfaces(contract: &str) -> &str { "constructor(address verifier, bytes32 imageId, string memory imageUrl) {}" } "BoundlessMarket" => { - r#"constructor(address verifier, bytes32 assessorId, bytes32 deprecatedAssessorId, uint32 deprecatedAssessorDuration, address stakeTokenContract) {} + r#"constructor(address verifier, address applicationVerifier, bytes32 assessorId, bytes32 deprecatedAssessorId, uint32 deprecatedAssessorDuration, address stakeTokenContract) {} function initialize(address initialOwner, string calldata imageUrl) {}"# } "ERC1967Proxy" => "constructor(address implementation, bytes memory data) payable {}", diff --git a/crates/boundless-market/src/contracts/artifacts/IBoundlessMarket.sol b/crates/boundless-market/src/contracts/artifacts/IBoundlessMarket.sol index d2be0f178..e94ed3910 100644 --- a/crates/boundless-market/src/contracts/artifacts/IBoundlessMarket.sol +++ b/crates/boundless-market/src/contracts/artifacts/IBoundlessMarket.sol @@ -233,16 +233,6 @@ interface IBoundlessMarket { /// @return The balance of the account. function balanceOf(address addr) external view returns (uint256); - /// @notice Withdraw funds from the market's treasury. - /// @dev Value is debited from the market's account. - /// @param value The amount to withdraw. - function withdrawFromTreasury(uint256 value) external; - - /// @notice Withdraw funds from the market' collateral treasury. - /// @dev Value is debited from the market's account. - /// @param value The amount to withdraw. - function withdrawFromCollateralTreasury(uint256 value) external; - /// @notice Deposit collateral into the market to pay for lockin collateral. /// @dev Before calling this method, the account owner must approve the contract as an allowed spender. function depositCollateral(uint256 value) external; diff --git a/crates/boundless-market/src/contracts/bytecode.rs b/crates/boundless-market/src/contracts/bytecode.rs index b6d653f83..a339e2c67 100644 --- a/crates/boundless-market/src/contracts/bytecode.rs +++ b/crates/boundless-market/src/contracts/bytecode.rs @@ -1,9 +1,9 @@ // Auto-generated file, do not edit manually alloy::sol! { - #[sol(rpc, bytecode = "6101403461035357601f61636638819003918201601f19168301916001600160401b038311848410176103575780849260a0946040528339810103126103535780516001600160a01b03811680820361035357602083015160408401519260608501519463ffffffff86168096036103535760800151926001600160a01b0384169081850361035357306080521561031b5782156102d65715610291578461023d575b60a05260c05260e052610100526001600160401b034281169190910190811161022957610120527ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005460ff8160401c1661021a576002600160401b03196001600160401b038216016101b1575b604051615ffa908161036c823960805181818161192c01526119bf015260a0518181816122f6015281816131c901528181613662015261370d015260c051818181610d3601528181611159015261321f015260e051818181610b18015281816112b4015281816116e70152818161183c01528181611d4d0152614615015261010051818181611eeb01526132b9015261012051818181610fa901526132630152f35b6001600160401b0319166001600160401b039081177ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d290602090a15f61010f565b63f92ee8a960e01b5f5260045ffd5b634e487b7160e01b5f52601160045260245ffd5b836100a25760405162461bcd60e51b815260206004820152602160248201527f496e76616c69642064657072656361746564206173736573736f7220696d61676044820152606560f81b6064820152608490fd5b60405162461bcd60e51b815260206004820152601860248201527f496e76616c696420636f6c6c61746572616c20746f6b656e00000000000000006044820152606490fd5b60405162461bcd60e51b815260206004820152601660248201527f496e76616c6964206173736573736f7220696d616765000000000000000000006044820152606490fd5b60405162461bcd60e51b815260206004820152601060248201526f24b73b30b634b2103b32b934b334b2b960811b6044820152606490fd5b5f80fd5b634e487b7160e01b5f52604160045260245ffdfe6080806040526004361015610012575f80fd5b5f905f3560e01c90816301ffc9a7146123255750806308c84e70146122e15780630b7ae1a71461225457806315d7a240146122395780631ce030241461221b578063248a9ca3146121fc5780632abff1f2146120f15780632e107a901461206f5780632e1a7d4d146120515780632f2ff15d1461201f57806336568abe14611fda57806341451f9414611f2957806341d3ab6914611f0e578063444161da14611ed357806345bc4d1014611b655780634f1ef2861461198057806352d1902d14611919578063553c0248146118fd5780635b07fdd8146118da5780635d704b331461181657806360dfd4a91461177e5780636112fe2e14611647578063612bee0c14611626578063635556241461156257806370a082311461151f5780637136a7f31461150757806375b238fc1461113c5780637870d481146114e657806381bf6c241461149d57806384b0196e146113755780638f2b50a71461120c57806391d14854146111b6578063956b0960146111995780639f04f4201461117c5780639fe9428c14611141578063a217fddf1461113c578063ad2fa6c8146110b4578063ad3cb1cc1461106b578063ae7330f114610fcd578063afe171fd14610f89578063b09c980b14610f43578063b760faf914610ebd578063bad4a01f14610e9f578063c515c15f14610e1a578063c64067a214610e02578063cb74db1114610dd9578063cdc9712314610ce3578063d0e30db014610ccf578063d4bd257b14610c32578063d547741f14610bf7578063df2e670614610b85578063eba2ecc814610b47578063ef1ae1c814610b02578063f2800f1a14610aab578063f399e22e146104b2578063ff1214a5146102af5763ffa1ad7414610291575f80fd5b346102ac57806003193601126102ac57602060405160018152f35b80fd5b50346102ac5760603660031901126102ac576004356001600160401b0381116104ae57610160816004019160031990360301126104ae576024356001600160401b0381116104aa576103059036906004016123cd565b916044356001600160401b0381116104a6576103259036906004016123cd565b61032f83356144bd565b9161033c878784886147fc565b60405191959161034d6060826126e4565b60218152602081017f4c6f636b526571756573742850726f6f66526571756573742072657175657374815260408201602960f81b905261038b615376565b906103946153c0565b8d61039d615405565b6103a56154c3565b6103ad615510565b916103b6615597565b94604051978897602089019a5180918c5e880160208101918783528051926020849201905e0160200185815281516020819301825e0184815281516020819301825e0183815281516020819301825e0182815281516020819301825e0190815281516020819301825e018d815203601f198101825261043590826126e4565b5190209060405190602082019283526040820152604081526104586060826126e4565b519020610463615b45565b9061046d91615bfa565b91369061047992612720565b61048291615c17565b61048e91959295615c51565b61049785614e0a565b966104a3989196614faa565b80f35b8480fd5b8280fd5b5080fd5b50346102ac5760403660031901126102ac576104cc6123a3565b906024356001600160401b0381116104ae576104ec9036906004016123cd565b5f80516020615f8e833981519152939193549060ff8260401c1615916001600160401b03811680159081610aa3575b6001149081610a99575b159081610a90575b50610a815767ffffffffffffffff1981166001175f80516020615f8e8339815191525582610a55575b506001600160a01b03831615610a185761056e615bcf565b610576615bcf565b604092835161058585826126e4565b601081526f12509bdd5b991b195cdcd3585c9ad95d60821b60208201528451906105af86836126e4565b60018252603160f81b60208301526105c5615bcf565b6105cd615bcf565b8051906001600160401b038211610a04576105f55f80516020615ece83398151915254612938565b601f8111610995575b50602090601f83116001146109195761062e929189918361080b575b50508160011b915f199060031b1c19161790565b5f80516020615ece833981519152555b8051906001600160401b038211610905576106665f80516020615eee83398151915254612938565b601f8111610896575b50602090601f83116001146108165791806106a3926106d895948a9261080b5750508160011b915f199060031b1c19161790565b5f80516020615eee833981519152555b855f80516020615f0e83398151915255855f80516020615fae83398151915255613f4b565b506001600160401b0381116107f7576106fb816106f6600254612938565b612970565b83601f8211600114610788578190859661072a9495969261077d5750508160011b915f199060031b1c19161790565b6002555b610736575080f35b5f80516020615f8e833981519152805460ff60401b1916905551600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d290602090a180f35b013590505f8061061a565b60028552601f198216955f80516020615eae83398151915291865b8881106107df575083600195969798106107c6575b505050811b0160025561072e565b01355f19600384901b60f8161c191690555f80806107b8565b909260206001819286860135815501940191016107a3565b634e487b7160e01b84526041600452602484fd5b015190505f8061061a565b5f80516020615eee83398151915288528188209190601f198416895b81811061087e57509160019391856106d897969410610866575b505050811b015f80516020615eee833981519152556106b3565b01515f1960f88460031b161c191690555f808061084c565b92936020600181928786015181550195019301610832565b5f80516020615eee83398151915288527f5f9ce34815f8e11431c7bb75a8e6886a91478f7ffc1dbb0a98dc240fddd76b75601f840160051c810191602085106108fb575b601f0160051c01905b8181106108f0575061066f565b8881556001016108e3565b90915081906108da565b634e487b7160e01b87526041600452602487fd5b5f80516020615ece83398151915289528189209190601f1984168a5b81811061097d5750908460019594939210610965575b505050811b015f80516020615ece8339815191525561063e565b01515f1960f88460031b161c191690555f808061094b565b92936020600181928786015181550195019301610935565b5f80516020615ece83398151915289527f42ad5d3e1f2e6e70edcf6d991b8a3023d3fca8047a131592f9edb9fd9b89d57d601f840160051c810191602085106109fa575b601f0160051c01905b8181106109ef57506105fe565b8981556001016109e2565b90915081906109d9565b634e487b7160e01b88526041600452602488fd5b60405162461bcd60e51b815260206004820152601560248201527424b73b30b634b21034b734ba34b0b61037bbb732b960591b6044820152606490fd5b68ffffffffffffffffff191668010000000000000001175f80516020615f8e833981519152555f610556565b63f92ee8a960e01b8552600485fd5b9050155f61052d565b303b159150610525565b84915061051b565b50346102ac5760203660031901126102ac5760043590610aca826139dc565b15610af0576040816020936001600160401b039352808452205460a01c16604051908152f35b60249163d2be005d60e01b8252600452fd5b50346102ac57806003193601126102ac576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b50346102ac576104a3610b5936612827565b91610b6481356144bd565b90610b71858583866147fc565b50610b7b84614e0a565b9690953395614faa565b507fc354af001adff0e8c35481c5ce3df3edee370c71572514d281e884c8cb552203610bb036612827565b9291909234610bea575b610be460405192839260408452610bd46040850183613c3d565b918483036020860152359661287a565b0390a280f35b610bf2613b83565b610bba565b50346102ac5760403660031901126102ac57610c2e600435610c1761238d565b90610c29610c248261291a565b613f05565b614078565b5080f35b50346102ac57610c41366125d5565b969095919490936001600160a01b039092169190823b156104a65791610c82939185809460405196879586948593636691f64760e01b85526004850161289a565b03925af18015610cc457610caf575b610cab610c9f8686866128c5565b60405191829182612521565b0390f35b610cba8280926126e4565b6102ac5780610c91565b6040513d84823e3d90fd5b50806003193601126102ac576104a3613b83565b50346102ac57806003193601126102ac57604051908060025490610d0682612938565b8085529160018116908115610db25750600114610d68575b610cab84610d2e818603826126e4565b6040519182917f000000000000000000000000000000000000000000000000000000000000000083526040602084015260408301906124fd565b600281525f80516020615eae833981519152939250905b808210610d9857509091508101602001610d2e82610d1e565b919260018160209254838588010152019101909291610d7f565b60ff191660208087019190915292151560051b85019092019250610d2e9150839050610d1e565b50346102ac5760203660031901126102ac576020610df86004356139dc565b6040519015158152f35b50346102ac576104a3610e1436612827565b91613942565b50346102ac5760203660031901126102ac57604060e091600435815280602052208054906001600160601b0360026001830154920154916040519360018060a01b03811685526001600160401b038160a01c16602086015262ffffff81871c16604086015260f81c6060850152818116608085015260601c1660a083015260c0820152f35b50346102ac5760203660031901126102ac576104a3600435336145e5565b5060203660031901126102ac57610ed26123a3565b610edb346145b4565b9060018060a01b03169081835260016020526001600160601b03610f06604085209282845416612dec565b166001600160601b03198254161790557fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c6020604051348152a280f35b50346102ac5760203660031901126102ac576020906001600160601b03906040906001600160a01b03610f746123a3565b16815260018452205460601c16604051908152f35b50346102ac57806003193601126102ac5760206040516001600160401b037f0000000000000000000000000000000000000000000000000000000000000000168152f35b50346102ac5760603660031901126102ac5780610fe86123a3565b6044356001600160401b038111611067576110079036906004016123cd565b6001600160a01b0390921691823b156110625761104092849283604051809681958294636691f64760e01b84526024356004850161289a565b03925af18015610cc4576110515750f35b8161105b916126e4565b6102ac5780f35b505050fd5b5050fd5b50346102ac57806003193601126102ac5750610cab60405161108e6040826126e4565b60058152640352e302e360dc1b60208201526040519182916020835260208301906124fd565b50346102ac576110c33661242a565b9a93969297909960018060a09b949b9897981b031691823b156104a65791611106939185809460405196879586948593636691f64760e01b85526004850161289a565b03925af18015610cc457611127575b610cab610c9f8a8a8a8a8a8a8a61386b565b6111328280926126e4565b6102ac5780611115565b61280d565b50346102ac57806003193601126102ac5760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b50346102ac57806003193601126102ac57602060405161c3508152f35b50346102ac57806003193601126102ac5760206040516113888152f35b50346102ac5760403660031901126102ac5760406111d261238d565b9160043581525f80516020615f6e833981519152602052209060018060a01b03165f52602052602060ff60405f2054166040519015158152f35b50346102ac5760203660031901126102ac57600435611229613ec9565b30825260016020526001600160601b03604083205460601c166001600160601b03611253836145b4565b161161136257611289611265826145b4565b30845260016020526001600160601b03604085209181835460601c16031690612e0c565b60405163a9059cbb60e01b815233600482015260248101829052602081604481866001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000165af1908115611357578391611328575b5015611319576040519081527fa315121c7f539fd811176ad2735d5d3981237b261889ec13ae4d617ad06e39bc60203092a280f35b6312171d8360e31b8252600482fd5b61134a915060203d602011611350575b61134281836126e4565b810190612e3f565b5f6112e4565b503d611338565b6040513d85823e3d90fd5b63112fed8b60e31b825230600452602482fd5b50346102ac57806003193601126102ac575f80516020615f0e833981519152541580611487575b1561144a576113ee906113ad613a09565b906113b6613ad6565b9060206113fc604051936113ca83866126e4565b8385525f368137604051968796600f60f81b885260e08589015260e08801906124fd565b9086820360408801526124fd565b904660608601523060808601528260a086015284820360c08601528080855193848152019401925b82811061143357505050500390f35b835185528695509381019392810192600101611424565b60405162461bcd60e51b81526020600482015260156024820152741152540dcc4c8e88155b9a5b9a5d1a585b1a5e9959605a1b6044820152606490fd5b505f80516020615fae833981519152541561139c565b50346102ac5760203660031901126102ac576114da60209160406114c26004356144bd565b6001600160a01b039091168352600185529120614506565b90506040519015158152f35b50346102ac57610cab610c9f6114fb36612774565b9594909493919361386b565b50346102ac576104a361151936612580565b91612fb3565b50346102ac5760203660031901126102ac576020906001600160601b03906040906001600160a01b036115506123a3565b16815260018452205416604051908152f35b50346102ac5760203660031901126102ac5760043561157f613ec9565b30825260016020526001600160601b036040832054166001600160601b036115a6836145b4565b1611611362576115b5816145b4565b30835260016020526001600160601b03806040852092818454160316166001600160601b03198254161790558180808084335af16115f1612ed3565b5015611319576040519081527f7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b6560203092a280f35b50346102ac57610cab610c9f61163b36612774565b95949094939193612e91565b50346102ac5760203660031901126102ac5760043533825260016020526001600160601b03604083205460601c166001600160601b03611686836145b4565b161161176b576116bc611698826145b4565b33845260016020526001600160601b03604085209181835460601c16031690612e0c565b60405163a9059cbb60e01b815233600482015260248101829052602081604481866001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000165af190811561135757839161174c575b5015611319576040519081527fa315121c7f539fd811176ad2735d5d3981237b261889ec13ae4d617ad06e39bc60203392a280f35b611765915060203d6020116113505761134281836126e4565b5f611717565b63112fed8b60e31b825233600452602482fd5b50346102ac5760203660031901126102ac5760046060604060209383358152808552206002604051916117b083612664565b805460018060a01b03811684526001600160401b038160a01c168785015262ffffff8160e01c16604085015260f81c848401526001600160601b0360018201548181166080860152851c1660a0840152015460c082015201511615156040519015158152f35b50346102ac5760a03660031901126102ac576004358160443560ff81168091036104ae577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690813b156104aa57829160e48392604051948593849263d505accf60e01b84523360048501523060248501528960448501526024356064850152608484015260643560a484015260843560c48401525af16118c5575b506104a382336145e5565b816118cf916126e4565b6104ae57815f6118ba565b50346102ac57806003193601126102ac5760206118f5615b45565b604051908152f35b50346102ac57806003193601126102ac57602090604051908152f35b50346102ac57806003193601126102ac577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031630036119715760206040515f80516020615f4e8339815191528152f35b63703e46dd60e11b8152600490fd5b5060403660031901126102ac576119956123a3565b906024356001600160401b0381116104ae576119b5903690600401612756565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016308114908115611b43575b50611b34576119f7613ec9565b6040516352d1902d60e01b8152926001600160a01b0381169190602085600481865afa80958596611b00575b50611a3c57634c9c8ce360e01b84526004839052602484fd5b9091845f80516020615f4e8339815191528103611aee5750813b15611adc575f80516020615f4e83398151915280546001600160a01b031916821790557fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b8480a28151839015611ac25780836020610c2e95519101845af4611abc612ed3565b91615e4f565b50505034611acd5780f35b63b398979f60e01b8152600490fd5b634c9c8ce360e01b8452600452602483fd5b632a87526960e21b8552600452602484fd5b9095506020813d602011611b2c575b81611b1c602093836126e4565b810103126104a65751945f611a23565b3d9150611b0f565b63703e46dd60e11b8252600482fd5b5f80516020615f4e833981519152546001600160a01b0316141590505f6119ea565b50346102ac5760203660031901126102ac57600435611ba6611b86826144bd565b6001600160a01b0390911680855260016020526040852090929190614506565b5015611ebf57818352826020526040832060405190611bc482612664565b805460018060a01b03811683526001600160401b038160a01c16602084015262ffffff8160e01c16604084015260f81c60608301526001810154600260808401926001600160601b03831684526001600160601b0360a086019360601c168352015460c08401526004606084015116611eab576001606084015116611e97576001600160401b03611c5484614134565b16421115611e6e5784865260208690526040862080546001600160f81b03811660f891821c60041790911b6001600160f81b0319161781558690600101556001600160601b038151166113888102908082046113881490151715611e5a57611cd16001600160601b039392612710611cd693049485915116612af5565b6145b4565b936002606060018060a01b038651169501511615155f14611df657505060018060a01b03821685526001602052611d2760408620611d21856001600160601b03835460601c16612dec565b90612e0c565b60405163a9059cbb60e01b815261dead60048201526024810182905291602083604481897f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af18015611deb577f79ca7c80cf57b513ffdf8aa37ec70e40757f5e0d35219241860bb4b4c2fa7616946060946001600160601b0392611dce575b5060405193845216602083015260018060a01b03166040820152a280f35b611de69060203d6020116113505761134281836126e4565b611db0565b6040513d88823e3d90fd5b9092506001600160601b0330933088526001602052611e2260408920611d218885835460601c16612dec565b511690865260016020526001600160601b03611e45604088209282845416612dec565b166001600160601b0319825416179055611d27565b634e487b7160e01b87526011600452602487fd5b6044866001600160401b0387611e8387614134565b9063079c66ab60e41b845260045216602452fd5b631cfdeebb60e01b86526004859052602486fd5b633231064d60e11b86526004859052602486fd5b63d2be005d60e01b83526004829052602483fd5b50346102ac57806003193601126102ac5760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b50346102ac57610cab610c9f611f2336612580565b91612b02565b50346102ac5760203660031901126102ac5760043590611f48826139dc565b15610af057604081602093611fc9935280845220600260405191611f6b83612664565b805460018060a01b03811684526001600160401b038160a01c168685015262ffffff8160e01c16604085015260f81c60608401526001600160601b036001820154818116608086015260601c1660a0840152015460c0820152614134565b6001600160401b0360405191168152f35b50346102ac5760403660031901126102ac57611ff461238d565b336001600160a01b0382160361201057610c2e90600435614078565b63334bd91960e11b8252600482fd5b50346102ac5760403660031901126102ac57610c2e60043561203f61238d565b9061204c610c248261291a565b613fd4565b50346102ac5760203660031901126102ac576104a360043533613df7565b50346102ac5761207e366125d5565b969095919490936001600160a01b039092169190823b156104a657916120bf939185809460405196879586948593636691f64760e01b85526004850161289a565b03925af18015610cc4576120dc575b610cab610c9f868686612b02565b6120e78280926126e4565b6102ac57806120ce565b50346102ac5760203660031901126102ac576004356001600160401b0381116104ae576121229036906004016123cd565b61212d929192613ec9565b6001600160401b0381116121e85761214a816106f6600254612938565b81601f821160011461217d5781908394612177949261077d5750508160011b915f199060031b1c19161790565b60025580f35b60028352601f198216935f80516020615eae83398151915291845b8681106121d057508360019596106121b7575b505050811b0160025580f35b01355f19600384901b60f8161c191690555f80806121ab565b90926020600181928686013581550194019101612198565b634e487b7160e01b82526041600452602482fd5b50346102ac5760203660031901126102ac5760206118f560043561291a565b50346102ac57806003193601126102ac576020604051620186a08152f35b50346102ac57610cab610c9f61224e36612580565b916128c5565b346122dd576122623661242a565b97999598909691959294929091906001600160a01b0316803b156122dd576122a49a5f80946040519d8e9586948593636691f64760e01b85526004850161289a565b03925af19687156122d257610cab98610c9f986122c2575b50612e91565b5f6122cc916126e4565b5f6122bc565b6040513d5f823e3d90fd5b5f80fd5b346122dd575f3660031901126122dd576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b346122dd5760203660031901126122dd576004359063ffffffff60e01b82168092036122dd57602091637965db0b60e01b8114908115612367575b5015158152f35b6301ffc9a760e01b14905083612360565b35906001600160e01b0319821682036122dd57565b602435906001600160a01b03821682036122dd57565b600435906001600160a01b03821682036122dd57565b35906001600160a01b03821682036122dd57565b9181601f840112156122dd578235916001600160401b0383116122dd57602083818601950101116122dd57565b9181601f840112156122dd578235916001600160401b0383116122dd576020808501948460051b0101116122dd57565b60e06003198201126122dd576004356001600160a01b03811681036122dd5791602435916044356001600160401b0381116122dd578161246c916004016123cd565b929092916064356001600160401b0381116122dd578161248e916004016123fa565b929092916084356001600160401b0381116122dd57816124b0916004016123fa565b9290929160a4356001600160401b0381116122dd57816124d2916004016123fa565b9290929160c435906001600160401b0382116122dd5760809082900360031901126122dd5760040190565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b602081016020825282518091526040820191602060408360051b8301019401925f915b83831061255357505050505090565b9091929394602080612571600193603f1986820301875289516124fd565b97019301930191939290612544565b60406003198201126122dd576004356001600160401b0381116122dd57816125aa916004016123fa565b92909291602435906001600160401b0382116122dd5760809082900360031901126122dd5760040190565b60a06003198201126122dd576004356001600160a01b03811681036122dd5791602435916044356001600160401b0381116122dd5781612617916004016123cd565b929092916064356001600160401b0381116122dd5781612639916004016123fa565b92909291608435906001600160401b0382116122dd5760809082900360031901126122dd5760040190565b60e081019081106001600160401b0382111761267f57604052565b634e487b7160e01b5f52604160045260245ffd5b60a081019081106001600160401b0382111761267f57604052565b604081019081106001600160401b0382111761267f57604052565b606081019081106001600160401b0382111761267f57604052565b90601f801991011681019081106001600160401b0382111761267f57604052565b6001600160401b03811161267f57601f01601f191660200190565b92919261272c82612705565b9161273a60405193846126e4565b8294818452818301116122dd578281602093845f960137010152565b9080601f830112156122dd5781602061277193359101612720565b90565b60806003198201126122dd576004356001600160401b0381116122dd578161279e916004016123fa565b929092916024356001600160401b0381116122dd57816127c0916004016123fa565b929092916044356001600160401b0381116122dd57816127e2916004016123fa565b92909291606435906001600160401b0382116122dd5760809082900360031901126122dd5760040190565b346122dd575f3660031901126122dd5760206040515f8152f35b9060406003198301126122dd576004356001600160401b0381116122dd5761016081840360031901126122dd5760040191602435906001600160401b0382116122dd57612876916004016123cd565b9091565b908060209392818452848401375f828201840152601f01601f1916010190565b60409061277194928152816020820152019161287a565b356001600160a01b03811681036122dd5790565b826060926128d592959495612b02565b92016001600160a01b036128e8826128b1565b165f5260016020526001600160601b0360405f20541680612907575050565b612913612918926128b1565b613df7565b565b5f525f80516020615f6e833981519152602052600160405f20015490565b90600182811c92168015612966575b602083101461295257565b634e487b7160e01b5f52602260045260245ffd5b91607f1691612947565b601f811161297c575050565b60025f5260205f20906020601f840160051c830193106129b6575b601f0160051c01905b8181106129ab575050565b5f81556001016129a0565b9091508190612997565b6001600160401b03811161267f5760051b60200190565b903590601e19813603018212156122dd57018035906001600160401b0382116122dd576020019160608202360383136122dd57565b9190811015612a1c576060020190565b634e487b7160e01b5f52603260045260245ffd5b3561ffff811681036122dd5790565b805115612a1c5760200190565b8051821015612a1c5760209160051b010190565b9190811015612a1c5760051b8101359060be19813603018212156122dd570190565b60021115612a8c57565b634e487b7160e01b5f52602160045260245ffd5b903590601e19813603018212156122dd57018035906001600160401b0382116122dd576020019181360383136122dd57565b601f19810191908211612ae157565b634e487b7160e01b5f52601160045260245ffd5b91908203918211612ae157565b929192612b10848383612fb3565b612b19826129c0565b93612b2760405195866126e4565b828552601f19612b36846129c0565b015f5b818110612ddb57505084612b4c846129c0565b612b5960405191826126e4565b848152601f19612b68866129c0565b013660208301376020830194612b7e86856129d7565b90505f5b818110612d9c5750505f5b818110612b9d5750505050505050565b612ba8818388612a60565b90612bbe612bb8606088016128b1565b83614156565b90612bc98388612a4c565b52612d9357612bd88185612a4c565b5180612beb575b50600191505b01612b8d565b606083013560028110156122dd57600190612c0581612a82565b03612d8457612c176080840184612aa0565b50926040840135840191612c2b8b8a6129d7565b90915f19810191908211612ae157612c4292612a0c565b916040612c51602085016128b1565b930135926001600160601b0384168094036122dd57612c7360a0840184612aa0565b9290915a603f810290808204603f1490151715612ae157869060061c10612d75576001600160a01b031694853b156122dd5760205f8760019a612cfc8397612cea996040519a8b998a98899663a12da43f60e01b88520135600487015260606024870152606486019060406020820135910161287a565b8481036003190160448601529161287a565b0393f19081612d65575b50612d5e577f5c5960582bfc7a494183b4e9a66bfe8ecffc07a83a48d136e732400f7b98bf5090612d35612ed3565b92612d54604051928392835260406020840152359460408301906124fd565b0390a25b5f612bdf565b5050612d58565b5f612d6f916126e4565b5f612d06565b6307099c5360e21b5f5260045ffd5b63b90a25b160e01b5f5260045ffd5b60019150612be5565b612db081612daa8a896129d7565b90612a0c565b9060018101808211612ae157612dd461ffff612dcd600195612a30565b1687612a4c565b5201612b82565b806060602080938a01015201612b39565b906001600160601b03809116911601906001600160601b038211612ae157565b80546bffffffffffffffffffffffff60601b191660609290921b6bffffffffffffffffffffffff60601b16919091179055565b908160209103126122dd575180151581036122dd5790565b9190811015612a1c5760051b8101359061015e19813603018212156122dd570190565b90821015612a1c576128769160051b810190612aa0565b919695949392905f5b818110612eb057505050506127719394506128c5565b80612ecd8a610e148387612ec7600197898c612e57565b93612e7a565b01612e9a565b3d15612efd573d90612ee482612705565b91612ef260405193846126e4565b82523d5f602084013e565b606090565b903590601e19813603018212156122dd57018035906001600160401b0382116122dd57602001918160061b360383136122dd57565b9190811015612a1c5760061b0190565b6020815260406020612f638451838386015260608501906124fd565b93015191015290565b359061ffff821682036122dd57565b35906001600160601b03821682036122dd57565b90612fa9906040939695949660608452606084019161287a565b9460208201520152565b61ffff821161385257612fc5826129c0565b90612fd360405192836126e4565b828252601f19612fe2846129c0565b01366020840137612ff2836129c0565b9061300060405192836126e4565b838252601f1961300f856129c0565b0136602084013760408501936130258587612f02565b90505f5b8181106137985750505f5b8181106134265750505050613048906146ff565b61306161305860208501856129d7565b91909385612f02565b613070606087969396016128b1565b9160405193608085018581106001600160401b0382111761267f57604052613097816129c0565b916130a560405193846126e4565b81835260606020840192028101903682116122dd57915b8183106133d55750505083526130d1816129c0565b946130df60405196876126e4565b818652602086019160061b8101903682116122dd57915b818310613396575050506020820193845260408201928352606082019060018060a01b031681526040519260208401946020865260c08501935193608060408701528451809152602060e087019501905f5b818110613351575050505192603f19858203016060860152602080855192838152019401905f5b8181106133215750509051608085015250516001600160a01b031660a0830152819003601f19810182526020925f9290916131aa90826126e4565b604051918291518091835e8101838152039060025afa156122d2575f517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316916131fc8180612aa0565b843b156122dd5760405163ab750e7560e01b8152915f91839182916132489188917f00000000000000000000000000000000000000000000000000000000000000009160048601612f8f565b0381875afa9081613311575b5061330c576001600160401b037f00000000000000000000000000000000000000000000000000000000000000001642116132fd578061329391612aa0565b919092803b156122dd576132e2935f936040519586948593849363ab750e7560e01b85527f00000000000000000000000000000000000000000000000000000000000000009160048601612f8f565b03915afa80156122d2576132f35750565b5f612918916126e4565b63439cc0cd60e01b5f5260045ffd5b505050565b5f61331b916126e4565b5f613254565b8251805161ffff1687526020908101516001600160e01b031916818801526040909601959092019160010161316f565b8251805161ffff1688526020818101516001600160a01b0316818a01526040918201516001600160601b03169189019190915260609097019690920191600101613148565b6040833603126122dd57602060409182516133b0816126ae565b6133b986612f6c565b81526133c6838701612378565b838201528152019201916130f6565b6060833603126122dd5760206060916040516133f0816126c9565b6133f986612f6c565b81526134068387016123b9565b8382015261341660408701612f7b565b60408201528152019201916130bc565b613431818385612a60565b9060c0823603126122dd576040519160c083018381106001600160401b0382111761267f5760405280358084526020820135806020860152604083013591826040870152606084013560028110156122dd576060870190815260808501356001600160401b0381116122dd576134aa9036908701612756565b906080880191825260a086019788356001600160401b0381116122dd5760209261352d9260a06134df60219436908d01612756565b91015251936134ed85612a82565b6134f685612a82565b516040519384918183019660ff60f81b9060f81b1687528051918291018484015e81015f838201520301601f1981018352826126e4565b519020916040519261353e84612693565b8684526020840192835260408401918252606084018581526080850191825260a090607460405161356f84826126e4565b818152736c66696c6c6d656e74446174614469676573742960601b608060208301927f4173736573736f72436f6d6d69746d656e742875696e7432353620696e64657884527f2c75696e743235362069642c627974657333322072657175657374446967657360408201527f742c6279746573333220636c61696d4469676573742c6279746573333220667560608201520152209551945193519051925193604051956020870197885260408701526060860152608085015283015260c082015260c0815261363f60e0826126e4565b51902061364c848a612a4c565b526136578388612a4c565b51613707576136ab937f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316926136959190612aa0565b9490604051956136a4876126ae565b3691612720565b84526020840152803b156122dd576136da925f916040518080968194631599ead560e01b835260048301612f47565b039161c350fa9182156122d2576001926136f7575b505b01613034565b5f613701916126e4565b5f6136ef565b613740937f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316926136959190612aa0565b84526020840152803b156122dd5761376f925f916040518080968194631599ead560e01b835260048301612f47565b03915afa9182156122d257600192613788575b506136f1565b5f613792916126e4565b5f613782565b60206137ae826137a88a8c612f02565b90612f37565b013563ffffffff60e01b81168091036122dd576137f36137e961ffff6137e16137dc866137a88f8f90612f02565b612a30565b168688612a60565b60a0810190612aa0565b6004929192116122dd57600161382b61ffff6138246137dc878f978f6137a89163ffffffff60e01b90351699612f02565b1689612a4c565b5281810361383d575050600101613029565b632e2ce35360e21b5f5260045260245260445ffd5b506377e4aa5360e11b5f5260045261ffff60245260445ffd5b919695949392905f5b81811061388a5750505050612771939450612b02565b806138a18a610e148387612ec7600197898c612e57565b01613874565b35906001600160401b03821682036122dd57565b359063ffffffff821682036122dd57565b91908260e09103126122dd576040516138e481612664565b60c08082948035845260208101356020850152613903604082016138a7565b6040850152613914606082016138bb565b6060850152613925608082016138bb565b608085015261393660a082016138bb565b60a08501520135910152565b9161395b91833560201c6001600160a01b0316846147fc565b5090604061399a611cd161398a61397185614e0a565b90506001600160401b03429116109460803691016138cc565b6001600160401b03421690614ea6565b6001600160601b038251916139ae836126c9565b60018352602083018590521691018190526001607f1b91156139d6576001607e1b5b1717905d565b5f6139d0565b6139e8613a05916144bd565b6001600160a01b039091165f908152600160205260409020614506565b5090565b604051905f825f80516020615ece8339815191525491613a2883612938565b8083529260018116908115613ab75750600114613a4c575b612918925003836126e4565b505f80516020615ece8339815191525f90815290917f42ad5d3e1f2e6e70edcf6d991b8a3023d3fca8047a131592f9edb9fd9b89d57d5b818310613a9b57505090602061291892820101613a40565b6020919350806001915483858901015201910190918492613a83565b6020925061291894915060ff191682840152151560051b820101613a40565b604051905f825f80516020615eee8339815191525491613af583612938565b8083529260018116908115613ab75750600114613b1857612918925003836126e4565b505f80516020615eee8339815191525f90815290917f5f9ce34815f8e11431c7bb75a8e6886a91478f7ffc1dbb0a98dc240fddd76b755b818310613b6757505090602061291892820101613a40565b6020919350806001915483858901015201910190918492613b4f565b613b8c346145b4565b335f5260016020526001600160601b03613bad60405f209282845416612dec565b166001600160601b03198254161790556040513481527fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c60203392a2565b9035603e19823603018112156122dd570190565b906003821015612a8c5752565b9035601e19823603018112156122dd5701602081359101916001600160401b0382116122dd5781360383136122dd57565b90813581526020820135607e19833603018112156122dd57610160602083015282016001600160a01b03613c70826123b9565b166101608301526001600160601b03613c8b60208301612f7b565b16610180830152613c9f6040820182613beb565b9060806101a084015281359160038310156122dd57613cd7613cea91613ccd613d23956101e0880190613bff565b6020810190613c0c565b604061020087015261022086019161287a565b906001600160e01b031990613d0190606001612378565b166101c0840152613d156040850185613c0c565b90848303604086015261287a565b613d306060840184613beb565b8282036060840152803560028110156122dd57610140926040613d67859484613d5b613d7796612a82565b84526020810190613c0c565b919092816020820152019161287a565b936080810135608085015260a081013560a08501526001600160401b03613da060c083016138a7565b1660c085015263ffffffff613db760e083016138bb565b1660e085015263ffffffff613dcf61010083016138bb565b1661010085015263ffffffff613de861012083016138bb565b16610120850152013591015290565b9060018060a01b03821691825f5260016020526001600160601b0360405f2054166001600160601b03613e29846145b4565b1611613eb6575f8080848194613e3e826145b4565b88845260016020526001600160601b03806040862092818454160316166001600160601b03198254161790555af1613e74612ed3565b5015613ea75760207f7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b6591604051908152a2565b6312171d8360e31b5f5260045ffd5b8263112fed8b60e31b5f5260045260245ffd5b335f9081525f80516020615f2e833981519152602052604090205460ff1615613eee57565b63e2517d3f60e01b5f52336004525f60245260445ffd5b5f8181525f80516020615f6e8339815191526020908152604080832033845290915290205460ff1615613f355750565b63e2517d3f60e01b5f523360045260245260445ffd5b6001600160a01b0381165f9081525f80516020615f2e833981519152602052604090205460ff16613fcf576001600160a01b03165f8181525f80516020615f2e83398151915260205260408120805460ff191660011790553391907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d8180a4600190565b505f90565b5f8181525f80516020615f6e833981519152602090815260408083206001600160a01b038616845290915290205460ff16614072575f8181525f80516020615f6e833981519152602090815260408083206001600160a01b0395909516808452949091528120805460ff19166001179055339291907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9080a4600190565b50505f90565b5f8181525f80516020615f6e833981519152602090815260408083206001600160a01b038616845290915290205460ff1615614072575f8181525f80516020615f6e833981519152602090815260408083206001600160a01b0395909516808452949091528120805460ff19169055339291907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9080a4600190565b906001600160401b03809116911601906001600160401b038211612ae157565b6127719062ffffff60406001600160401b036020840151169201511690614114565b90916060925f92803590614169826144bd565b969060018060a01b0381165f5260016020526141888860405f20614506565b918199919360405161419981612664565b5f81525f60208201525f60408201525f828201525f60808201525f60a08201525f60c08201529a614441575b506020850135996141d4615604565b508a5c946141e0615604565b506040516001607f1b871615156141f6826126c9565b8082526001600160601b03604060208401936001607e1b8b161515855201981688525f146143ee575161437e5791878995949288945b156143665760208101516001600160401b031642116143495761424f97506159b8565b955b865161430b575b604051906020825283602083015260408201526040820135606082015260608201359160028310156122dd576143068291846142b47faf1db8f86d3f32029a484ff54c7ac1d7ef8f038ab050fc065af9e82eb9b850ca96612a82565b60808401526142e86142dd6142cc6080840184613c0c565b60c060a088015260e087019161287a565b9160a0810190613c0c565b848303601f190160c08601526001600160a01b03909816979061287a565b0390a3565b7f210e4fd706e561df48472433bcc50b4589f2c13e784e9992f4c3e6de26eb35646040516020815280614341602082018b6124fd565b0390a1614258565b9291906001600160601b036143609851169361575e565b95614251565b5050906001600160601b036143609651169188615622565b5050505050505092505091506040519063873fd26b60e01b60208301526024820152602481526143af6044826126e4565b7f210e4fd706e561df48472433bcc50b4589f2c13e784e9992f4c3e6de26eb356460405160208152806143e560208201856124fd565b0390a190600190565b508080614434575b156144215761440482614134565b6001600160401b034291161061437e57918789959492889461422c565b8763c274d3e360e01b5f5260045260245ffd5b508b60c0830151146143f6565b909950855f525f602052600260405f206001600160601b036040519361446685612664565b825460018060a01b03811686526001600160401b038160a01c16602087015262ffffff8160e01c16604087015260f81c8186015260018301549082821660808701521c1660a0840152015460c0820152985f6141c5565b906001600160c11b031982166144e557602082901c6001600160a01b03169163ffffffff1690565b6341abc80160e01b5f5260045ffd5b6302000000821015612a1c5701905f90565b63ffffffff821691906020831015614558576401fffffffe905460c01c9160011b169180830460021490151715612ae1576001600160401b03906003831b1616901c9060026001831615159216151590565b916145639150612ad2565b908160011b9180830460021481151715612ae15760ff916145939160071c6001600160f81b0316906001016144f4565b90549060031b1c9116906003821b16901c9060026001831615159216151590565b6001600160601b0381116145ce576001600160601b031690565b6306dfcc6560e41b5f52606060045260245260445ffd5b6040516323b872dd60e01b81526001600160a01b03918216600482018190523060248301526044820184905292917f000000000000000000000000000000000000000000000000000000000000000016906020905f9060649082855af19081601f3d1160015f51141615166146f2575b50156146b6576020816146ad61468b7ff645c19720906ca336d36d26058a9489c6c757fe35843b75a74e3b8aa972ecf5946145b4565b855f5260018452611d2160405f20916001600160601b03835460601c16612dec565b604051908152a2565b60405162461bcd60e51b81526020600482015260146024820152731514905394d1915497d19493d357d1905253115160621b6044820152606490fd5b3b153d171590505f614655565b8051156144e55760018151146147f35780515b60018111614728575061472490612a3f565b5190565b60018101808211612ae15760011c905f5b8160011c81106147875750600180821614614755575b50614712565b5f198101908111612ae15761476a9083612a4c565b515f198201828111612ae1576147809084612a4c565b525f61474f565b600181901b906001600160ff1b0381168103612ae1576147a78286612a4c565b5160018301809311612ae1576147bf60019387612a4c565b5190818110156147e4575f5260205260405f205b6147dd8287612a4c565b5201614739565b905f5260205260405f206147d3565b61472490612a3f565b91939290610160833603126122dd5760405161481781612693565b83359384825260208101356001600160401b0381116122dd5781019081360391608083126122dd57604080519361484d856126c9565b126122dd5760405161485e816126ae565b614867826123b9565b815261487560208301612f7b565b6020820152835260408101356001600160401b0381116122dd5781016040813603126122dd57604051916148a8836126ae565b813560038110156122dd5783526020820135926001600160401b0384116122dd576148db6060936148eb95369101612756565b6020820152602086015201612378565b60408301526020830191825260408101356001600160401b0381116122dd57810136601f820112156122dd57614928903690602081359101612720565b906040840191825260608101356001600160401b0381116122dd578101906040823603126122dd576040519161495d836126ae565b803560028110156122dd57835260208101356001600160401b0381116122dd5761498991369101612756565b6020830152606085019182526149a39036906080016138cc565b90608085019182526149b3615510565b6149bb615376565b6149c36153c0565b906149cc615405565b6149d46154c3565b6149dc615597565b916040519485946020860197805160208192018a5e860160208101915f83528051926020849201905e016020015f815281516020819301825e015f815281516020819301825e015f815281516020819301825e015f815281516020819301825e015f815203601f1981018252614a5290826126e4565b51902094519351614a61615597565b614a69615376565b614a716154c3565b90604051918291602083019480516020819201875e830160208101915f83528051926020849201905e016020015f815281516020819301825e015f815203601f1981018252614ac090826126e4565b519020908051614ace615376565b8051906020012090600160a01b6001900381511690602001516001600160601b031660405191602083019384526040830152606082015260608152614b146080826126e4565b519020906020810151614b256154c3565b80519060200120908051906003821015612a8c576020015160208151910120614b5c60405192602084019485526040840190613bff565b606082015260608152614b706080826126e4565b51902090604063ffffffff60e01b9101511690604051926020840194855260408401526060830152608082015260808152614bac60a0826126e4565b5190209251602081519101209051614bc26153c0565b60208151910120906020815191614bd883612a82565b0151602081519101206040519160208301938452614bf581612a82565b6040830152606082015260608152614c0e6080826126e4565b5190209151614c1b615405565b604051614c476020828180820195805191829101875e81015f838201520301601f1981018352826126e4565b519020908051906020810151906001600160401b0360408201511663ffffffff60608301511663ffffffff6080840151169160c063ffffffff60a08601511694015194604051966020880198895260408801526060870152608086015260a085015260c084015260e08301526101008201526101008152614cca610120826126e4565b51902092604051946020860196875260408601526060850152608084015260a083015260c082015260c08152614d0160e0826126e4565b51902094614d1686614d11615b45565b615bfa565b93600160c01b1615614dd35791602091614d4793604051809581948293630b135d3f60e11b8452896004850161289a565b03916001600160a01b0316620186a0fa9081156122d2575f91614d90575b506001600160e01b0319166374eca2c160e11b01614d81579190565b638baa579f60e01b5f5260045ffd5b90506020813d602011614dcb575b81614dab602093836126e4565b810103126122dd57516001600160e01b0319811681036122dd575f614d65565b3d9150614d9e565b614de5614deb91614df4943691612720565b84615c17565b90939193615c51565b6001600160a01b03908116911603614d81579190565b614e189060803691016138cc565b9081516020830151106144e55763ffffffff606083015116608083019063ffffffff825116106144e55763ffffffff90511660a083019063ffffffff825116106144e557614e859063ffffffff6001600160401b036040614e7887615bac565b9601511691511690614114565b9162ffffff6001600160401b03614e9c8386614f8a565b16116144e5579190565b9060408201906001600160401b0380835116911690811115614f84576001600160401b03614ed384615bac565b168111614f7d576001600160401b03825116906001600160401b03614f04606086019363ffffffff85511690614114565b16811115614f16575050506020015190565b614f43906001600160401b0363ffffffff614f376020880151885190612af5565b94511694511690612af5565b925192818102918183041490151715612ae1578115614f6957048101809111612ae15790565b634e487b7160e01b5f52601260045260245ffd5b5050505f90565b50505190565b906001600160401b03809116911603906001600160401b038211612ae157565b9590929796949360018060a01b031697885f526001602052614fcf8560405f20614506565b906153625761534e576001600160401b0386169889421161533657614ffd611cd161398a3660808c016138cc565b96815f52600160205260405f20996001600160601b038b5416946001600160601b038a1693848710615324575060018060a01b031698895f52600160205260405f20906001600160601b03825460601c16966101408d013580981061531157918d6001600160601b03806150a3946150a89897960316166001600160601b03198254161790556001600160601b03615094896145b4565b81835460601c16031690612e0c565b614f8a565b926001600160401b03841662ffffff81116152fa57506150c7906145b4565b604051936150d485612664565b88855260208086019c8d5262ffffff90911660408087019182525f60608801818152608089019687526001600160601b0390951660a0808a0191825260c08a019889528e35808452958390529290912097519e51925194519290911b67ffffffffffffffff60a01b166001600160a01b039e909e169d909d1760e09390931b62ffffff60e01b169290921760f89290921b6001600160f81b031916919091178455996001840191516001600160601b03166001600160601b03166001600160601b0319835416178255516001600160601b03166151b091612e0c565b51906002015563ffffffff831692602084105f1461526b576401fffffffe9060011b169280840460021490151715612ae15785546001600160c01b038116600190941b6001600160401b031660c091821c17901b6001600160c01b031916929092179094557fe5e43c93dc0ec595ed3b122bdc6d39a480e9d17fb6812e0f90cfc4ba33b0969e93615266915b6152586040519586958652606060208701526060860190613c3d565b91848303604086015261287a565b0390a2565b509161527690612ad2565b918260011b9583870460021484151715612ae1577fe5e43c93dc0ec595ed3b122bdc6d39a480e9d17fb6812e0f90cfc4ba33b0969e96615266946152f59260ff916001916152d29160071c6001600160f81b03169083016144f4565b929093161b82548260031b1c179082549060031b91821b915f19901b1916179055565b61523c565b6306dfcc6560e41b5f52601860045260245260445ffd5b8b63112fed8b60e31b5f5260045260245ffd5b63112fed8b60e31b5f5260045260245ffd5b898863cfe6a8fd60e01b5f523560045260245260445ffd5b86631cfdeebb60e01b5f523560045260245ffd5b8763a905765160e01b5f523560045260245ffd5b604051906153856060836126e4565b60268252654c696d69742960d01b6040837f43616c6c6261636b286164647265737320616464722c75696e7439362067617360208201520152565b604051906153cf6060836126e4565b60218252602960f81b6040837f496e7075742875696e743820696e707574547970652c6279746573206461746160208201520152565b6040519061541460c0836126e4565b60888252676c61746572616c2960c01b60a0837f4f666665722875696e74323536206d696e50726963652c75696e74323536206d60208201527f617850726963652c75696e7436342072616d70557053746172742c75696e743360408201527f322072616d705570506572696f642c75696e743332206c6f636b54696d656f7560608201527f742c75696e7433322074696d656f75742c75696e74323536206c6f636b436f6c60808201520152565b604051906154d26060836126e4565b602982526874657320646174612960b81b6040837f5072656469636174652875696e743820707265646963617465547970652c627960208201520152565b6040519061551f6080836126e4565b605a82527f6c2c496e70757420696e7075742c4f66666572206f66666572290000000000006060837f50726f6f66526571756573742875696e743235362069642c526571756972656d60208201527f656e747320726571756972656d656e74732c737472696e6720696d616765557260408201520152565b604051906155a66080836126e4565b60438252626f722960e81b6060837f526571756972656d656e74732843616c6c6261636b2063616c6c6261636b2c5060208201527f7265646963617465207072656469636174652c6279746573342073656c65637460408201520152565b60405190615611826126c9565b5f6040838281528260208201520152565b9694959192939096606096615711575f80516020615fce83398151915260209596979860018060a01b031693845f526001875261566360405f209687615d3a565b6040519387013584526001600160a01b0316958693a36001600160601b03825416906001600160601b03851682106156e557506001600160601b038481920316166001600160601b03198254161790555f5260016020526001600160601b036156d360405f209282845416612dec565b166001600160601b0319825416179055565b949550505050506040519063112fed8b60e31b60208301526024820152602481526127716044826126e4565b955050505050915060405190631cfdeebb60e01b60208301526024820152602481526127716044826126e4565b906001600160601b03809116911603906001600160601b038211612ae157565b93959796929490946060986001606087015116151580156159a8575b6159795715615928575b50506001600160a01b03165f908152600160205260408120608093909301516001600160601b0386811696959294911685818811156158f557816157c79161573e565b906001600160601b03835416906001600160601b03831682106158d0575b5082546bffffffffffffffffffffffff19169190036001600160601b03161790555b5f90815260208190526040902080546affffffffffffffffffffff60a01b81166001600160a01b0384169081176001600160a01b0319929092161760f890811c600217901b6001600160f81b03191617905560018060a01b03165f52600160205260405f206001600160601b036158818482845416612dec565b166001600160601b0319825416179055615899575050565b6001600160601b039192935060405192636008fdcb60e01b60208501526024840152166044820152604481526127716064826126e4565b96509450506001600160601b03806158e9868098612dec565b966001969150916157e5565b61590a615913916001600160601b039361573e565b82845416612dec565b166001600160601b0319825416179055615807565b6001600160a01b0383165f9081526001602052604090206159499190615d3a565b60405160209182013581526001600160a01b0384169186915f80516020615fce8339815191529190a35f80615784565b5050505050509192505060405190631cfdeebb60e01b60208301526024820152602481526127716044826126e4565b506002606087015116151561577a565b9391909296959496606097600160608701511615158015615b35575b615b075715615abc575b505082516001600160a01b039485169416841480159190615aa8575b50615a7e5760a061291893926001600160601b03925f525f6020525f6001604082208160f81b828060f81b03825416178155015582608082015116845f52600160205283615a4f60405f209282845416612dec565b168419825416179055015116905f526001602052611d2160405f20916001600160601b03835460601c16612dec565b92935050506040519063a905765160e01b60208301526024820152602481526127716044826126e4565b9050602060c084015191013514155f6159fa565b615ad89160018060a01b03165f52600160205260405f20615d3a565b60405160208281013582526001600160a01b0386169184915f80516020615fce83398151915291a35f806159de565b50505050929350505060405190631cfdeebb60e01b60208301526024820152602481526127716044826126e4565b50600260608701511615156159d4565b615b4d615cb1565b615b55615d08565b6040519060208201927f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f8452604083015260608201524660808201523060a082015260a08152615ba660c0826126e4565b51902090565b6127719063ffffffff60806001600160401b036040840151169201511690614114565b60ff5f80516020615f8e8339815191525460401c1615615beb57565b631afcd79f60e31b5f5260045ffd5b6042916040519161190160f01b8352600283015260228201522090565b8151919060418303615c4757615c409250602082015190606060408401519301515f1a90615dd7565b9192909190565b50505f9160029190565b6004811015612a8c5780615c63575050565b60018103615c7a5763f645eedf60e01b5f5260045ffd5b60028103615c95575063fce698f760e01b5f5260045260245ffd5b600314615c9f5750565b6335e2f38360e21b5f5260045260245ffd5b615cb9613a09565b8051908115615cc9576020012090565b50505f80516020615f0e833981519152548015615ce35790565b507fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47090565b615d10613ad6565b8051908115615d20576020012090565b50505f80516020615fae833981519152548015615ce35790565b9063ffffffff8116906020821015615d97576401fffffffe9060011b169080820460021490151715612ae15781546001600160c01b038116600290921b6001600160401b031660c091821c17901b6001600160c01b031916179055565b50615da190612ad2565b8060011b9080820460021481151715612ae1576129189260ff916002916152d29160071c6001600160f81b0316906001016144f4565b91906fa2a8918ca85bafe22016d0b997e4df60600160ff1b038411615e44579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa156122d2575f516001600160a01b03811615615e3a57905f905f90565b505f906001905f90565b5050505f9160039190565b90615e735750805115615e6457602081519101fd5b63d6bda27560e01b5f5260045ffd5b81511580615ea4575b615e84575090565b639996b31560e01b5f9081526001600160a01b0391909116600452602490fd5b50803b15615e7c56fe405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5acea16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d102a16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d103a16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d100b7db2dd08fcb62d0c9e08c51941cae53c267786a0b75803fb7960902fc8ef97d360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800f0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00a16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d101120ea8d7610aa46e4a31b254c5d07489ebe8f1a93dc7bbbe60eaf3db2c62c0cca164736f6c634300081a000a")] + #[sol(rpc, bytecode = "610160346103ba57601f61637c38819003918201601f19168301916001600160401b038311848410176103be5780849260c0946040528339810103126103ba57610048816103d2565b610054602083016103d2565b90604083015160608401519260808501519463ffffffff86168096036103ba5760a00151926001600160a01b0384168085036103ba57306080526001600160a01b03821615610382576001600160a01b0383161561033d5783156102f857156102b3578561025f575b60a0526101405260c05260e052610100526001600160401b034281169190910190811161024b57610120527ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005460ff8160401c1661023c576002600160401b03196001600160401b038216016101d3575b604051615f9590816103e782396080518181816118a10152611934015260a05181818161226b015261310f015260c051818181610d4a0152818161116d0152613165015260e051818181610ae70152818161162a015281816117b101528181611cc20152614410015261010051818181611e6001526131ff015261012051818181610fbd01526131a9015261014051818181610b2c015281816135a801526136530152f35b6001600160401b0319166001600160401b039081177ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d290602090a15f61012e565b63f92ee8a960e01b5f5260045ffd5b634e487b7160e01b5f52601160045260245ffd5b846100bd5760405162461bcd60e51b815260206004820152602160248201527f496e76616c69642064657072656361746564206173736573736f7220696d61676044820152606560f81b6064820152608490fd5b60405162461bcd60e51b815260206004820152601860248201527f496e76616c696420636f6c6c61746572616c20746f6b656e00000000000000006044820152606490fd5b60405162461bcd60e51b815260206004820152601660248201527f496e76616c6964206173736573736f7220696d616765000000000000000000006044820152606490fd5b60405162461bcd60e51b815260206004820152601c60248201527f496e76616c6964206170706c69636174696f6e207665726966696572000000006044820152606490fd5b60405162461bcd60e51b815260206004820152601060248201526f24b73b30b634b2103b32b934b334b2b960811b6044820152606490fd5b5f80fd5b634e487b7160e01b5f52604160045260245ffd5b51906001600160a01b03821682036103ba5756fe6080806040526004361015610012575f80fd5b5f905f3560e01c90816301ffc9a71461229a5750806308c84e70146122565780630b7ae1a7146121c957806315d7a240146121ae5780631ce0302414612190578063248a9ca3146121715780632abff1f2146120665780632e107a9014611fe45780632e1a7d4d14611fc65780632f2ff15d14611f9457806336568abe14611f4f57806341451f9414611e9e57806341d3ab6914611e83578063444161da14611e4857806345bc4d1014611ada5780634f1ef286146118f557806352d1902d1461188e578063553c0248146118725780635b07fdd81461184f5780635d704b331461178b57806360dfd4a9146116f35780636112fe2e14611592578063612bee0c1461157157806370a082311461152e5780637136a7f31461151657806375b238fc146111505780637870d481146114f557806381bf6c24146114ac57806384b0196e1461122057806391d14854146111ca578063956b0960146111ad5780639f04f420146111905780639fe9428c14611155578063a217fddf14611150578063ad2fa6c8146110c8578063ad3cb1cc1461107f578063ae7330f114610fe1578063afe171fd14610f9d578063b09c980b14610f57578063b760faf914610ed1578063bad4a01f14610eb3578063c515c15f14610e2e578063c64067a214610e16578063cb74db1114610ded578063cdc9712314610cf7578063d0e30db014610ce3578063d4bd257b14610c46578063d547741f14610c0b578063df2e670614610b99578063eba2ecc814610b5b578063ece510a514610b16578063ef1ae1c814610ad1578063f2800f1a14610a7a578063f399e22e146104a7578063ff1214a5146102a45763ffa1ad7414610286575f80fd5b346102a157806003193601126102a157602060405160018152f35b80fd5b50346102a15760603660031901126102a1576004356001600160401b0381116104a357610160816004019160031990360301126104a3576024356001600160401b03811161049f576102fa903690600401612342565b916044356001600160401b03811161049b5761031a903690600401612342565b61032483356142b8565b91610331878784886145f7565b604051919591610342606082612659565b60218152602081017f4c6f636b526571756573742850726f6f66526571756573742072657175657374815260408201602960f81b9052610380615171565b906103896151bb565b8d610392615200565b61039a6152be565b6103a261530b565b916103ab615392565b94604051978897602089019a5180918c5e880160208101918783528051926020849201905e0160200185815281516020819301825e0184815281516020819301825e0183815281516020819301825e0182815281516020819301825e0190815281516020819301825e018d815203601f198101825261042a9082612659565b51902090604051906020820192835260408201526040815261044d606082612659565b519020610458615940565b90610462916159f5565b91369061046e92612695565b61047791615a12565b61048391959295615a4c565b61048c85614c05565b96610498989196614da5565b80f35b8480fd5b8280fd5b5080fd5b50346102a15760403660031901126102a1576104c1612318565b906024356001600160401b0381116104a3576104e1903690600401612342565b5f80516020615f09833981519152939193549060ff8260401c1615916001600160401b03811680159081610a72575b6001149081610a68575b159081610a5f575b50610a505767ffffffffffffffff1981166001175f80516020615f098339815191525582610a24575b506001600160a01b038316156109e7576105636159ca565b61056b6159ca565b604092835161057a8582612659565b601081526f12509bdd5b991b195cdcd3585c9ad95d60821b60208201528451906105a48683612659565b60018252603160f81b60208301526105ba6159ca565b6105c26159ca565b8051906001600160401b0382116109d3576105ea5f80516020615e29833981519152546128ad565b601f8111610977575b50602090601f83116001146108fb576106239291899183610800575b50508160011b915f199060031b1c19161790565b5f80516020615e29833981519152555b8051906001600160401b0382116108e75761065b5f80516020615e49833981519152546128ad565b601f811161088b575b50602090601f831160011461080b579180610698926106cd95948a926108005750508160011b915f199060031b1c19161790565b5f80516020615e49833981519152555b855f80516020615e6983398151915255855f80516020615f2983398151915255613d46565b506001600160401b0381116107ec576106f0816106eb6002546128ad565b6128e5565b83601f821160011461077d578190859661071f949596926107725750508160011b915f199060031b1c19161790565b6002555b61072b575080f35b5f80516020615f09833981519152805460ff60401b1916905551600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d290602090a180f35b013590505f8061060f565b60028552601f198216955f80516020615e0983398151915291865b8881106107d4575083600195969798106107bb575b505050811b01600255610723565b01355f19600384901b60f8161c191690555f80806107ad565b90926020600181928686013581550194019101610798565b634e487b7160e01b84526041600452602484fd5b015190505f8061060f565b5f80516020615e4983398151915288528188209190601f198416895b81811061087357509160019391856106cd9796941061085b575b505050811b015f80516020615e49833981519152556106a8565b01515f1960f88460031b161c191690555f8080610841565b92936020600181928786015181550195019301610827565b5f80516020615e4983398151915288525f80516020615f69833981519152601f840160051c810191602085106108dd575b601f0160051c01905b8181106108d25750610664565b8881556001016108c5565b90915081906108bc565b634e487b7160e01b87526041600452602487fd5b5f80516020615e2983398151915289528189209190601f1984168a5b81811061095f5750908460019594939210610947575b505050811b015f80516020615e2983398151915255610633565b01515f1960f88460031b161c191690555f808061092d565b92936020600181928786015181550195019301610917565b5f80516020615e2983398151915289525f80516020615ea9833981519152601f840160051c810191602085106109c9575b601f0160051c01905b8181106109be57506105f3565b8981556001016109b1565b90915081906109a8565b634e487b7160e01b88526041600452602488fd5b60405162461bcd60e51b815260206004820152601560248201527424b73b30b634b21034b734ba34b0b61037bbb732b960591b6044820152606490fd5b68ffffffffffffffffff191668010000000000000001175f80516020615f09833981519152555f61054b565b63f92ee8a960e01b8552600485fd5b9050155f610522565b303b15915061051a565b849150610510565b50346102a15760203660031901126102a15760043590610a9982613922565b15610abf576040816020936001600160401b039352808452205460a01c16604051908152f35b60249163d2be005d60e01b8252600452fd5b50346102a157806003193601126102a1576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b50346102a157806003193601126102a1576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b50346102a157610498610b6d3661279c565b91610b7881356142b8565b90610b85858583866145f7565b50610b8f84614c05565b9690953395614da5565b507fc354af001adff0e8c35481c5ce3df3edee370c71572514d281e884c8cb552203610bc43661279c565b9291909234610bfe575b610bf860405192839260408452610be86040850183613a09565b91848303602086015235966127ef565b0390a280f35b610c0661394f565b610bce565b50346102a15760403660031901126102a157610c42600435610c2b612302565b90610c3d610c388261288f565b613d00565b613e73565b5080f35b50346102a157610c553661254a565b969095919490936001600160a01b039092169190823b1561049b5791610c96939185809460405196879586948593636691f64760e01b85526004850161280f565b03925af18015610cd857610cc3575b610cbf610cb386868661283a565b60405191829182612496565b0390f35b610cce828092612659565b6102a15780610ca5565b6040513d84823e3d90fd5b50806003193601126102a15761049861394f565b50346102a157806003193601126102a157604051908060025490610d1a826128ad565b8085529160018116908115610dc65750600114610d7c575b610cbf84610d4281860382612659565b6040519182917f00000000000000000000000000000000000000000000000000000000000000008352604060208401526040830190612472565b600281525f80516020615e09833981519152939250905b808210610dac57509091508101602001610d4282610d32565b919260018160209254838588010152019101909291610d93565b60ff191660208087019190915292151560051b85019092019250610d429150839050610d32565b50346102a15760203660031901126102a1576020610e0c600435613922565b6040519015158152f35b50346102a157610498610e283661279c565b91613888565b50346102a15760203660031901126102a157604060e091600435815280602052208054906001600160601b0360026001830154920154916040519360018060a01b03811685526001600160401b038160a01c16602086015262ffffff81871c16604086015260f81c6060850152818116608085015260601c1660a083015260c0820152f35b50346102a15760203660031901126102a157610498600435336143e0565b5060203660031901126102a157610ee6612318565b610eef346143af565b9060018060a01b03169081835260016020526001600160601b03610f1a604085209282845416612d61565b166001600160601b03198254161790557fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c6020604051348152a280f35b50346102a15760203660031901126102a1576020906001600160601b03906040906001600160a01b03610f88612318565b16815260018452205460601c16604051908152f35b50346102a157806003193601126102a15760206040516001600160401b037f0000000000000000000000000000000000000000000000000000000000000000168152f35b50346102a15760603660031901126102a15780610ffc612318565b6044356001600160401b03811161107b5761101b903690600401612342565b6001600160a01b0390921691823b156110765761105492849283604051809681958294636691f64760e01b84526024356004850161280f565b03925af18015610cd8576110655750f35b8161106f91612659565b6102a15780f35b505050fd5b5050fd5b50346102a157806003193601126102a15750610cbf6040516110a2604082612659565b60058152640352e302e360dc1b6020820152604051918291602083526020830190612472565b50346102a1576110d73661239f565b9a93969297909960018060a09b949b9897981b031691823b1561049b579161111a939185809460405196879586948593636691f64760e01b85526004850161280f565b03925af18015610cd85761113b575b610cbf610cb38a8a8a8a8a8a8a6137b1565b611146828092612659565b6102a15780611129565b612782565b50346102a157806003193601126102a15760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b50346102a157806003193601126102a157602060405161c3508152f35b50346102a157806003193601126102a15760206040516113888152f35b50346102a15760403660031901126102a15760406111e6612302565b9160043581525f80516020615ee9833981519152602052209060018060a01b03165f52602052602060ff60405f2054166040519015158152f35b50346102a157806003193601126102a1575f80516020615e69833981519152541580611496575b15611459576040519080825f80516020615e29833981519152549161126b836128ad565b808352926001811690811561143a57506001146113e3575b61128f92500383612659565b6040519080825f80516020615e4983398151915254916112ae836128ad565b80835292600181169081156113c4575060011461136d575b6112da919392509361131195940383612659565b602061131f604051936112ed8386612659565b8385525f368137604051968796600f60f81b885260e08589015260e0880190612472565b908682036040880152612472565b904660608601523060808601528260a086015284820360c08601528080855193848152019401925b82811061135657505050500390f35b835185528695509381019392810192600101611347565b505f80516020615e4983398151915283529082905f80516020615f698339815191525b8183106113a85750509060206112da928201016112c6565b6020919350806001915483858901015201910190918492611390565b602092506112da94915060ff191682840152151560051b8201016112c6565b505f80516020615e2983398151915283529082905f80516020615ea98339815191525b81831061141e57505090602061128f92820101611283565b6020919350806001915483858901015201910190918492611406565b6020925061128f94915060ff191682840152151560051b820101611283565b60405162461bcd60e51b81526020600482015260156024820152741152540dcc4c8e88155b9a5b9a5d1a585b1a5e9959605a1b6044820152606490fd5b505f80516020615f298339815191525415611247565b50346102a15760203660031901126102a1576114e960209160406114d16004356142b8565b6001600160a01b039091168352600185529120614301565b90506040519015158152f35b50346102a157610cbf610cb361150a366126e9565b959490949391936137b1565b50346102a157610498611528366124f5565b91612ef9565b50346102a15760203660031901126102a1576020906001600160601b03906040906001600160a01b0361155f612318565b16815260018452205416604051908152f35b50346102a157610cbf610cb3611586366126e9565b95949094939193612e06565b50346102a15760203660031901126102a15760043533825260016020526001600160601b03604083205460601c166001600160601b036115d1836143af565b16116116e0576116076115e3826143af565b33845260016020526001600160601b03604085209181835460601c16031690612d81565b60405163a9059cbb60e01b815233600482015260248101829052602081604481867f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af19081156116d55783916116a6575b5015611697576040519081527fa315121c7f539fd811176ad2735d5d3981237b261889ec13ae4d617ad06e39bc60203392a280f35b6312171d8360e31b8252600482fd5b6116c8915060203d6020116116ce575b6116c08183612659565b810190612db4565b5f611662565b503d6116b6565b6040513d85823e3d90fd5b63112fed8b60e31b825233600452602482fd5b50346102a15760203660031901126102a1576004606060406020938335815280855220600260405191611725836125d9565b805460018060a01b03811684526001600160401b038160a01c168785015262ffffff8160e01c16604085015260f81c848401526001600160601b0360018201548181166080860152851c1660a0840152015460c082015201511615156040519015158152f35b50346102a15760a03660031901126102a1576004358160443560ff81168091036104a3577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690813b1561049f57829160e48392604051948593849263d505accf60e01b84523360048501523060248501528960448501526024356064850152608484015260643560a484015260843560c48401525af161183a575b5061049882336143e0565b8161184491612659565b6104a357815f61182f565b50346102a157806003193601126102a157602061186a615940565b604051908152f35b50346102a157806003193601126102a157602090604051908152f35b50346102a157806003193601126102a1577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031630036118e65760206040515f80516020615ec98339815191528152f35b63703e46dd60e11b8152600490fd5b5060403660031901126102a15761190a612318565b906024356001600160401b0381116104a35761192a9036906004016126cb565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016308114908115611ab8575b50611aa95761196c613cc4565b6040516352d1902d60e01b8152926001600160a01b0381169190602085600481865afa80958596611a75575b506119b157634c9c8ce360e01b84526004839052602484fd5b9091845f80516020615ec98339815191528103611a635750813b15611a51575f80516020615ec983398151915280546001600160a01b031916821790557fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b8480a28151839015611a375780836020610c4295519101845af4611a31613bc3565b91615daa565b50505034611a425780f35b63b398979f60e01b8152600490fd5b634c9c8ce360e01b8452600452602483fd5b632a87526960e21b8552600452602484fd5b9095506020813d602011611aa1575b81611a9160209383612659565b8101031261049b5751945f611998565b3d9150611a84565b63703e46dd60e11b8252600482fd5b5f80516020615ec9833981519152546001600160a01b0316141590505f61195f565b50346102a15760203660031901126102a157600435611b1b611afb826142b8565b6001600160a01b0390911680855260016020526040852090929190614301565b5015611e3457818352826020526040832060405190611b39826125d9565b805460018060a01b03811683526001600160401b038160a01c16602084015262ffffff8160e01c16604084015260f81c60608301526001810154600260808401926001600160601b03831684526001600160601b0360a086019360601c168352015460c08401526004606084015116611e20576001606084015116611e0c576001600160401b03611bc984613f2f565b16421115611de35784865260208690526040862080546001600160f81b03811660f891821c60041790911b6001600160f81b0319161781558690600101556001600160601b038151166113888102908082046113881490151715611dcf57611c466001600160601b039392612710611c4b93049485915116612a6a565b6143af565b936002606060018060a01b038651169501511615155f14611d6b57505060018060a01b03821685526001602052611c9c60408620611c96856001600160601b03835460601c16612d61565b90612d81565b60405163a9059cbb60e01b815261dead60048201526024810182905291602083604481897f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af18015611d60577f79ca7c80cf57b513ffdf8aa37ec70e40757f5e0d35219241860bb4b4c2fa7616946060946001600160601b0392611d43575b5060405193845216602083015260018060a01b03166040820152a280f35b611d5b9060203d6020116116ce576116c08183612659565b611d25565b6040513d88823e3d90fd5b9092506001600160601b0330933088526001602052611d9760408920611c968885835460601c16612d61565b511690865260016020526001600160601b03611dba604088209282845416612d61565b166001600160601b0319825416179055611c9c565b634e487b7160e01b87526011600452602487fd5b6044866001600160401b0387611df887613f2f565b9063079c66ab60e41b845260045216602452fd5b631cfdeebb60e01b86526004859052602486fd5b633231064d60e11b86526004859052602486fd5b63d2be005d60e01b83526004829052602483fd5b50346102a157806003193601126102a15760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b50346102a157610cbf610cb3611e98366124f5565b91612a77565b50346102a15760203660031901126102a15760043590611ebd82613922565b15610abf57604081602093611f3e935280845220600260405191611ee0836125d9565b805460018060a01b03811684526001600160401b038160a01c168685015262ffffff8160e01c16604085015260f81c60608401526001600160601b036001820154818116608086015260601c1660a0840152015460c0820152613f2f565b6001600160401b0360405191168152f35b50346102a15760403660031901126102a157611f69612302565b336001600160a01b03821603611f8557610c4290600435613e73565b63334bd91960e11b8252600482fd5b50346102a15760403660031901126102a157610c42600435611fb4612302565b90611fc1610c388261288f565b613dcf565b50346102a15760203660031901126102a15761049860043533613bf2565b50346102a157611ff33661254a565b969095919490936001600160a01b039092169190823b1561049b5791612034939185809460405196879586948593636691f64760e01b85526004850161280f565b03925af18015610cd857612051575b610cbf610cb3868686612a77565b61205c828092612659565b6102a15780612043565b50346102a15760203660031901126102a1576004356001600160401b0381116104a357612097903690600401612342565b6120a2929192613cc4565b6001600160401b03811161215d576120bf816106eb6002546128ad565b81601f82116001146120f257819083946120ec94926107725750508160011b915f199060031b1c19161790565b60025580f35b60028352601f198216935f80516020615e0983398151915291845b868110612145575083600195961061212c575b505050811b0160025580f35b01355f19600384901b60f8161c191690555f8080612120565b9092602060018192868601358155019401910161210d565b634e487b7160e01b82526041600452602482fd5b50346102a15760203660031901126102a157602061186a60043561288f565b50346102a157806003193601126102a1576020604051620186a08152f35b50346102a157610cbf610cb36121c3366124f5565b9161283a565b34612252576121d73661239f565b97999598909691959294929091906001600160a01b0316803b15612252576122199a5f80946040519d8e9586948593636691f64760e01b85526004850161280f565b03925af196871561224757610cbf98610cb398612237575b50612e06565b5f61224191612659565b5f612231565b6040513d5f823e3d90fd5b5f80fd5b34612252575f366003190112612252576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b34612252576020366003190112612252576004359063ffffffff60e01b821680920361225257602091637965db0b60e01b81149081156122dc575b5015158152f35b6301ffc9a760e01b149050836122d5565b35906001600160e01b03198216820361225257565b602435906001600160a01b038216820361225257565b600435906001600160a01b038216820361225257565b35906001600160a01b038216820361225257565b9181601f84011215612252578235916001600160401b038311612252576020838186019501011161225257565b9181601f84011215612252578235916001600160401b038311612252576020808501948460051b01011161225257565b60e0600319820112612252576004356001600160a01b03811681036122525791602435916044356001600160401b03811161225257816123e191600401612342565b929092916064356001600160401b03811161225257816124039160040161236f565b929092916084356001600160401b03811161225257816124259160040161236f565b9290929160a4356001600160401b03811161225257816124479160040161236f565b9290929160c435906001600160401b0382116122525760809082900360031901126122525760040190565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b602081016020825282518091526040820191602060408360051b8301019401925f915b8383106124c857505050505090565b90919293946020806124e6600193603f198682030187528951612472565b970193019301919392906124b9565b6040600319820112612252576004356001600160401b038111612252578161251f9160040161236f565b92909291602435906001600160401b0382116122525760809082900360031901126122525760040190565b60a0600319820112612252576004356001600160a01b03811681036122525791602435916044356001600160401b038111612252578161258c91600401612342565b929092916064356001600160401b03811161225257816125ae9160040161236f565b92909291608435906001600160401b0382116122525760809082900360031901126122525760040190565b60e081019081106001600160401b038211176125f457604052565b634e487b7160e01b5f52604160045260245ffd5b60a081019081106001600160401b038211176125f457604052565b604081019081106001600160401b038211176125f457604052565b606081019081106001600160401b038211176125f457604052565b90601f801991011681019081106001600160401b038211176125f457604052565b6001600160401b0381116125f457601f01601f191660200190565b9291926126a18261267a565b916126af6040519384612659565b829481845281830111612252578281602093845f960137010152565b9080601f83011215612252578160206126e693359101612695565b90565b6080600319820112612252576004356001600160401b03811161225257816127139160040161236f565b929092916024356001600160401b03811161225257816127359160040161236f565b929092916044356001600160401b03811161225257816127579160040161236f565b92909291606435906001600160401b0382116122525760809082900360031901126122525760040190565b34612252575f3660031901126122525760206040515f8152f35b906040600319830112612252576004356001600160401b0381116122525761016081840360031901126122525760040191602435906001600160401b038211612252576127eb91600401612342565b9091565b908060209392818452848401375f828201840152601f01601f1916010190565b6040906126e69492815281602082015201916127ef565b356001600160a01b03811681036122525790565b8260609261284a92959495612a77565b92016001600160a01b0361285d82612826565b165f5260016020526001600160601b0360405f2054168061287c575050565b61288861288d92612826565b613bf2565b565b5f525f80516020615ee9833981519152602052600160405f20015490565b90600182811c921680156128db575b60208310146128c757565b634e487b7160e01b5f52602260045260245ffd5b91607f16916128bc565b601f81116128f1575050565b60025f5260205f20906020601f840160051c8301931061292b575b601f0160051c01905b818110612920575050565b5f8155600101612915565b909150819061290c565b6001600160401b0381116125f45760051b60200190565b903590601e198136030182121561225257018035906001600160401b0382116122525760200191606082023603831361225257565b9190811015612991576060020190565b634e487b7160e01b5f52603260045260245ffd5b3561ffff811681036122525790565b8051156129915760200190565b80518210156129915760209160051b010190565b91908110156129915760051b8101359060be1981360301821215612252570190565b60021115612a0157565b634e487b7160e01b5f52602160045260245ffd5b903590601e198136030182121561225257018035906001600160401b0382116122525760200191813603831361225257565b601f19810191908211612a5657565b634e487b7160e01b5f52601160045260245ffd5b91908203918211612a5657565b929192612a85848383612ef9565b612a8e82612935565b93612a9c6040519586612659565b828552601f19612aab84612935565b015f5b818110612d5057505084612ac184612935565b612ace6040519182612659565b848152601f19612add86612935565b013660208301376020830194612af3868561294c565b90505f5b818110612d115750505f5b818110612b125750505050505050565b612b1d8183886129d5565b90612b33612b2d60608801612826565b83613f51565b90612b3e83886129c1565b52612d0857612b4d81856129c1565b5180612b60575b50600191505b01612b02565b6060830135600281101561225257600190612b7a816129f7565b03612cf957612b8c6080840184612a15565b50926040840135840191612ba08b8a61294c565b90915f19810191908211612a5657612bb792612981565b916040612bc660208501612826565b930135926001600160601b03841680940361225257612be860a0840184612a15565b9290915a603f810290808204603f1490151715612a5657869060061c10612cea576001600160a01b031694853b156122525760205f8760019a612c718397612c5f996040519a8b998a98899663a12da43f60e01b8852013560048701526060602487015260648601906040602082013591016127ef565b848103600319016044860152916127ef565b0393f19081612cda575b50612cd3577f5c5960582bfc7a494183b4e9a66bfe8ecffc07a83a48d136e732400f7b98bf5090612caa613bc3565b92612cc960405192839283526040602084015235946040830190612472565b0390a25b5f612b54565b5050612ccd565b5f612ce491612659565b5f612c7b565b6307099c5360e21b5f5260045ffd5b63b90a25b160e01b5f5260045ffd5b60019150612b5a565b612d2581612d1f8a8961294c565b90612981565b9060018101808211612a5657612d4961ffff612d426001956129a5565b16876129c1565b5201612af7565b806060602080938a01015201612aae565b906001600160601b03809116911601906001600160601b038211612a5657565b80546bffffffffffffffffffffffff60601b191660609290921b6bffffffffffffffffffffffff60601b16919091179055565b90816020910312612252575180151581036122525790565b91908110156129915760051b8101359061015e1981360301821215612252570190565b90821015612991576127eb9160051b810190612a15565b919695949392905f5b818110612e2557505050506126e693945061283a565b80612e428a610e288387612e3c600197898c612dcc565b93612def565b01612e0f565b903590601e198136030182121561225257018035906001600160401b03821161225257602001918160061b3603831361225257565b91908110156129915760061b0190565b6020815260406020612ea9845183838601526060850190612472565b93015191015290565b359061ffff8216820361225257565b35906001600160601b038216820361225257565b90612eef90604093969594966060845260608401916127ef565b9460208201520152565b61ffff821161379857612f0b82612935565b90612f196040519283612659565b828252601f19612f2884612935565b01366020840137612f3883612935565b90612f466040519283612659565b838252601f19612f5585612935565b013660208401376040850193612f6b8587612e48565b90505f5b8181106136de5750505f5b81811061336c5750505050612f8e906144fa565b612fa7612f9e602085018561294c565b91909385612e48565b612fb660608796939601612826565b9160405193608085018581106001600160401b038211176125f457604052612fdd81612935565b91612feb6040519384612659565b818352606060208401920281019036821161225257915b81831061331b57505050835261301781612935565b946130256040519687612659565b818652602086019160061b81019036821161225257915b8183106132dc575050506020820193845260408201928352606082019060018060a01b031681526040519260208401946020865260c08501935193608060408701528451809152602060e087019501905f5b818110613297575050505192603f19858203016060860152602080855192838152019401905f5b8181106132675750509051608085015250516001600160a01b031660a0830152819003601f19810182526020925f9290916130f09082612659565b604051918291518091835e8101838152039060025afa15612247575f517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316916131428180612a15565b843b156122525760405163ab750e7560e01b8152915f918391829161318e9188917f00000000000000000000000000000000000000000000000000000000000000009160048601612ed5565b0381875afa9081613257575b50613252576001600160401b037f000000000000000000000000000000000000000000000000000000000000000016421161324357806131d991612a15565b919092803b1561225257613228935f936040519586948593849363ab750e7560e01b85527f00000000000000000000000000000000000000000000000000000000000000009160048601612ed5565b03915afa8015612247576132395750565b5f61288d91612659565b63439cc0cd60e01b5f5260045ffd5b505050565b5f61326191612659565b5f61319a565b8251805161ffff1687526020908101516001600160e01b03191681880152604090960195909201916001016130b5565b8251805161ffff1688526020818101516001600160a01b0316818a01526040918201516001600160601b0316918901919091526060909701969092019160010161308e565b60408336031261225257602060409182516132f681612623565b6132ff86612eb2565b815261330c8387016122ed565b8382015281520192019161303c565b6060833603126122525760206060916040516133368161263e565b61333f86612eb2565b815261334c83870161232e565b8382015261335c60408701612ec1565b6040820152815201920191613002565b6133778183856129d5565b9060c082360312612252576040519160c083018381106001600160401b038211176125f4576040528035808452602082013580602086015260408301359182604087015260608401356002811015612252576060870190815260808501356001600160401b038111612252576133f090369087016126cb565b906080880191825260a086019788356001600160401b038111612252576020926134739260a061342560219436908d016126cb565b9101525193613433856129f7565b61343c856129f7565b516040519384918183019660ff60f81b9060f81b1687528051918291018484015e81015f838201520301601f198101835282612659565b519020916040519261348484612608565b8684526020840192835260408401918252606084018581526080850191825260a09060746040516134b58482612659565b818152736c66696c6c6d656e74446174614469676573742960601b608060208301927f4173736573736f72436f6d6d69746d656e742875696e7432353620696e64657884527f2c75696e743235362069642c627974657333322072657175657374446967657360408201527f742c6279746573333220636c61696d4469676573742c6279746573333220667560608201520152209551945193519051925193604051956020870197885260408701526060860152608085015283015260c082015260c0815261358560e082612659565b519020613592848a6129c1565b5261359d83886129c1565b5161364d576135f1937f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316926135db9190612a15565b9490604051956135ea87612623565b3691612695565b84526020840152803b1561225257613620925f916040518080968194631599ead560e01b835260048301612e8d565b039161c350fa9182156122475760019261363d575b505b01612f7a565b5f61364791612659565b5f613635565b613686937f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316926135db9190612a15565b84526020840152803b15612252576136b5925f916040518080968194631599ead560e01b835260048301612e8d565b03915afa918215612247576001926136ce575b50613637565b5f6136d891612659565b5f6136c8565b60206136f4826136ee8a8c612e48565b90612e7d565b013563ffffffff60e01b81168091036122525761373961372f61ffff613727613722866136ee8f8f90612e48565b6129a5565b1686886129d5565b60a0810190612a15565b60049291921161225257600161377161ffff61376a613722878f978f6136ee9163ffffffff60e01b90351699612e48565b16896129c1565b52818103613783575050600101612f6f565b632e2ce35360e21b5f5260045260245260445ffd5b506377e4aa5360e11b5f5260045261ffff60245260445ffd5b919695949392905f5b8181106137d057505050506126e6939450612a77565b806137e78a610e288387612e3c600197898c612dcc565b016137ba565b35906001600160401b038216820361225257565b359063ffffffff8216820361225257565b91908260e09103126122525760405161382a816125d9565b60c08082948035845260208101356020850152613849604082016137ed565b604085015261385a60608201613801565b606085015261386b60808201613801565b608085015261387c60a08201613801565b60a08501520135910152565b916138a191833560201c6001600160a01b0316846145f7565b509060406138e0611c466138d06138b785614c05565b90506001600160401b0342911610946080369101613812565b6001600160401b03421690614ca1565b6001600160601b038251916138f48361263e565b60018352602083018590521691018190526001607f1b911561391c576001607e1b5b1717905d565b5f613916565b61392e61394b916142b8565b6001600160a01b039091165f908152600160205260409020614301565b5090565b613958346143af565b335f5260016020526001600160601b0361397960405f209282845416612d61565b166001600160601b03198254161790556040513481527fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c60203392a2565b9035603e1982360301811215612252570190565b906003821015612a015752565b9035601e19823603018112156122525701602081359101916001600160401b03821161225257813603831361225257565b90813581526020820135607e198336030181121561225257610160602083015282016001600160a01b03613a3c8261232e565b166101608301526001600160601b03613a5760208301612ec1565b16610180830152613a6b60408201826139b7565b9060806101a0840152813591600383101561225257613aa3613ab691613a99613aef956101e08801906139cb565b60208101906139d8565b60406102008701526102208601916127ef565b906001600160e01b031990613acd906060016122ed565b166101c0840152613ae160408501856139d8565b9084830360408601526127ef565b613afc60608401846139b7565b82820360608401528035600281101561225257610140926040613b33859484613b27613b43966129f7565b845260208101906139d8565b91909281602082015201916127ef565b936080810135608085015260a081013560a08501526001600160401b03613b6c60c083016137ed565b1660c085015263ffffffff613b8360e08301613801565b1660e085015263ffffffff613b9b6101008301613801565b1661010085015263ffffffff613bb46101208301613801565b16610120850152013591015290565b3d15613bed573d90613bd48261267a565b91613be26040519384612659565b82523d5f602084013e565b606090565b9060018060a01b03821691825f5260016020526001600160601b0360405f2054166001600160601b03613c24846143af565b1611613cb1575f8080848194613c39826143af565b88845260016020526001600160601b03806040862092818454160316166001600160601b03198254161790555af1613c6f613bc3565b5015613ca25760207f7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b6591604051908152a2565b6312171d8360e31b5f5260045ffd5b8263112fed8b60e31b5f5260045260245ffd5b335f9081525f80516020615e89833981519152602052604090205460ff1615613ce957565b63e2517d3f60e01b5f52336004525f60245260445ffd5b5f8181525f80516020615ee98339815191526020908152604080832033845290915290205460ff1615613d305750565b63e2517d3f60e01b5f523360045260245260445ffd5b6001600160a01b0381165f9081525f80516020615e89833981519152602052604090205460ff16613dca576001600160a01b03165f8181525f80516020615e8983398151915260205260408120805460ff191660011790553391907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d8180a4600190565b505f90565b5f8181525f80516020615ee9833981519152602090815260408083206001600160a01b038616845290915290205460ff16613e6d575f8181525f80516020615ee9833981519152602090815260408083206001600160a01b0395909516808452949091528120805460ff19166001179055339291907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9080a4600190565b50505f90565b5f8181525f80516020615ee9833981519152602090815260408083206001600160a01b038616845290915290205460ff1615613e6d575f8181525f80516020615ee9833981519152602090815260408083206001600160a01b0395909516808452949091528120805460ff19169055339291907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9080a4600190565b906001600160401b03809116911601906001600160401b038211612a5657565b6126e69062ffffff60406001600160401b036020840151169201511690613f0f565b90916060925f92803590613f64826142b8565b969060018060a01b0381165f526001602052613f838860405f20614301565b9181999193604051613f94816125d9565b5f81525f60208201525f60408201525f828201525f60808201525f60a08201525f60c08201529a61423c575b50602085013599613fcf6153ff565b508a5c94613fdb6153ff565b506040516001607f1b87161515613ff18261263e565b8082526001600160601b03604060208401936001607e1b8b161515855201981688525f146141e957516141795791878995949288945b156141615760208101516001600160401b031642116141445761404a97506157b3565b955b8651614106575b60405190602082528360208301526040820152604082013560608201526060820135916002831015612252576141018291846140af7faf1db8f86d3f32029a484ff54c7ac1d7ef8f038ab050fc065af9e82eb9b850ca966129f7565b60808401526140e36140d86140c760808401846139d8565b60c060a088015260e08701916127ef565b9160a08101906139d8565b848303601f190160c08601526001600160a01b0390981697906127ef565b0390a3565b7f210e4fd706e561df48472433bcc50b4589f2c13e784e9992f4c3e6de26eb3564604051602081528061413c602082018b612472565b0390a1614053565b9291906001600160601b0361415b98511693615559565b9561404c565b5050906001600160601b0361415b965116918861541d565b5050505050505092505091506040519063873fd26b60e01b60208301526024820152602481526141aa604482612659565b7f210e4fd706e561df48472433bcc50b4589f2c13e784e9992f4c3e6de26eb356460405160208152806141e06020820185612472565b0390a190600190565b50808061422f575b1561421c576141ff82613f2f565b6001600160401b0342911610614179579187899594928894614027565b8763c274d3e360e01b5f5260045260245ffd5b508b60c0830151146141f1565b909950855f525f602052600260405f206001600160601b0360405193614261856125d9565b825460018060a01b03811686526001600160401b038160a01c16602087015262ffffff8160e01c16604087015260f81c8186015260018301549082821660808701521c1660a0840152015460c0820152985f613fc0565b906001600160c11b031982166142e057602082901c6001600160a01b03169163ffffffff1690565b6341abc80160e01b5f5260045ffd5b63020000008210156129915701905f90565b63ffffffff821691906020831015614353576401fffffffe905460c01c9160011b169180830460021490151715612a56576001600160401b03906003831b1616901c9060026001831615159216151590565b9161435e9150612a47565b908160011b9180830460021481151715612a565760ff9161438e9160071c6001600160f81b0316906001016142ef565b90549060031b1c9116906003821b16901c9060026001831615159216151590565b6001600160601b0381116143c9576001600160601b031690565b6306dfcc6560e41b5f52606060045260245260445ffd5b6040516323b872dd60e01b81526001600160a01b03918216600482018190523060248301526044820184905292917f000000000000000000000000000000000000000000000000000000000000000016906020905f9060649082855af19081601f3d1160015f51141615166144ed575b50156144b1576020816144a86144867ff645c19720906ca336d36d26058a9489c6c757fe35843b75a74e3b8aa972ecf5946143af565b855f5260018452611c9660405f20916001600160601b03835460601c16612d61565b604051908152a2565b60405162461bcd60e51b81526020600482015260146024820152731514905394d1915497d19493d357d1905253115160621b6044820152606490fd5b3b153d171590505f614450565b8051156142e05760018151146145ee5780515b60018111614523575061451f906129b4565b5190565b60018101808211612a565760011c905f5b8160011c81106145825750600180821614614550575b5061450d565b5f198101908111612a565761456590836129c1565b515f198201828111612a565761457b90846129c1565b525f61454a565b600181901b906001600160ff1b0381168103612a56576145a282866129c1565b5160018301809311612a56576145ba600193876129c1565b5190818110156145df575f5260205260405f205b6145d882876129c1565b5201614534565b905f5260205260405f206145ce565b61451f906129b4565b91939290610160833603126122525760405161461281612608565b83359384825260208101356001600160401b0381116122525781019081360391608083126122525760408051936146488561263e565b126122525760405161465981612623565b6146628261232e565b815261467060208301612ec1565b6020820152835260408101356001600160401b03811161225257810160408136031261225257604051916146a383612623565b813560038110156122525783526020820135926001600160401b038411612252576146d66060936146e6953691016126cb565b60208201526020860152016122ed565b60408301526020830191825260408101356001600160401b03811161225257810136601f8201121561225257614723903690602081359101612695565b906040840191825260608101356001600160401b03811161225257810190604082360312612252576040519161475883612623565b8035600281101561225257835260208101356001600160401b03811161225257614784913691016126cb565b60208301526060850191825261479e903690608001613812565b90608085019182526147ae61530b565b6147b6615171565b6147be6151bb565b906147c7615200565b6147cf6152be565b6147d7615392565b916040519485946020860197805160208192018a5e860160208101915f83528051926020849201905e016020015f815281516020819301825e015f815281516020819301825e015f815281516020819301825e015f815281516020819301825e015f815203601f198101825261484d9082612659565b5190209451935161485c615392565b614864615171565b61486c6152be565b90604051918291602083019480516020819201875e830160208101915f83528051926020849201905e016020015f815281516020819301825e015f815203601f19810182526148bb9082612659565b5190209080516148c9615171565b8051906020012090600160a01b6001900381511690602001516001600160601b03166040519160208301938452604083015260608201526060815261490f608082612659565b5190209060208101516149206152be565b80519060200120908051906003821015612a01576020015160208151910120614957604051926020840194855260408401906139cb565b60608201526060815261496b608082612659565b51902090604063ffffffff60e01b91015116906040519260208401948552604084015260608301526080820152608081526149a760a082612659565b51902092516020815191012090516149bd6151bb565b602081519101209060208151916149d3836129f7565b01516020815191012060405191602083019384526149f0816129f7565b6040830152606082015260608152614a09608082612659565b5190209151614a16615200565b604051614a426020828180820195805191829101875e81015f838201520301601f198101835282612659565b519020908051906020810151906001600160401b0360408201511663ffffffff60608301511663ffffffff6080840151169160c063ffffffff60a08601511694015194604051966020880198895260408801526060870152608086015260a085015260c084015260e08301526101008201526101008152614ac561012082612659565b51902092604051946020860196875260408601526060850152608084015260a083015260c082015260c08152614afc60e082612659565b51902094614b1186614b0c615940565b6159f5565b93600160c01b1615614bce5791602091614b4293604051809581948293630b135d3f60e11b8452896004850161280f565b03916001600160a01b0316620186a0fa908115612247575f91614b8b575b506001600160e01b0319166374eca2c160e11b01614b7c579190565b638baa579f60e01b5f5260045ffd5b90506020813d602011614bc6575b81614ba660209383612659565b8101031261225257516001600160e01b031981168103612252575f614b60565b3d9150614b99565b614be0614be691614bef943691612695565b84615a12565b90939193615a4c565b6001600160a01b03908116911603614b7c579190565b614c13906080369101613812565b9081516020830151106142e05763ffffffff606083015116608083019063ffffffff825116106142e05763ffffffff90511660a083019063ffffffff825116106142e057614c809063ffffffff6001600160401b036040614c73876159a7565b9601511691511690613f0f565b9162ffffff6001600160401b03614c978386614d85565b16116142e0579190565b9060408201906001600160401b0380835116911690811115614d7f576001600160401b03614cce846159a7565b168111614d78576001600160401b03825116906001600160401b03614cff606086019363ffffffff85511690613f0f565b16811115614d11575050506020015190565b614d3e906001600160401b0363ffffffff614d326020880151885190612a6a565b94511694511690612a6a565b925192818102918183041490151715612a56578115614d6457048101809111612a565790565b634e487b7160e01b5f52601260045260245ffd5b5050505f90565b50505190565b906001600160401b03809116911603906001600160401b038211612a5657565b9590929796949360018060a01b031697885f526001602052614dca8560405f20614301565b9061515d57615149576001600160401b0386169889421161513157614df8611c466138d03660808c01613812565b96815f52600160205260405f20996001600160601b038b5416946001600160601b038a169384871061511f575060018060a01b031698895f52600160205260405f20906001600160601b03825460601c16966101408d013580981061510c57918d6001600160601b0380614e9e94614ea39897960316166001600160601b03198254161790556001600160601b03614e8f896143af565b81835460601c16031690612d81565b614d85565b926001600160401b03841662ffffff81116150f55750614ec2906143af565b60405193614ecf856125d9565b88855260208086019c8d5262ffffff90911660408087019182525f60608801818152608089019687526001600160601b0390951660a0808a0191825260c08a019889528e35808452958390529290912097519e51925194519290911b67ffffffffffffffff60a01b166001600160a01b039e909e169d909d1760e09390931b62ffffff60e01b169290921760f89290921b6001600160f81b031916919091178455996001840191516001600160601b03166001600160601b03166001600160601b0319835416178255516001600160601b0316614fab91612d81565b51906002015563ffffffff831692602084105f14615066576401fffffffe9060011b169280840460021490151715612a565785546001600160c01b038116600190941b6001600160401b031660c091821c17901b6001600160c01b031916929092179094557fe5e43c93dc0ec595ed3b122bdc6d39a480e9d17fb6812e0f90cfc4ba33b0969e93615061915b6150536040519586958652606060208701526060860190613a09565b9184830360408601526127ef565b0390a2565b509161507190612a47565b918260011b9583870460021484151715612a56577fe5e43c93dc0ec595ed3b122bdc6d39a480e9d17fb6812e0f90cfc4ba33b0969e96615061946150f09260ff916001916150cd9160071c6001600160f81b03169083016142ef565b929093161b82548260031b1c179082549060031b91821b915f19901b1916179055565b615037565b6306dfcc6560e41b5f52601860045260245260445ffd5b8b63112fed8b60e31b5f5260045260245ffd5b63112fed8b60e31b5f5260045260245ffd5b898863cfe6a8fd60e01b5f523560045260245260445ffd5b86631cfdeebb60e01b5f523560045260245ffd5b8763a905765160e01b5f523560045260245ffd5b60405190615180606083612659565b60268252654c696d69742960d01b6040837f43616c6c6261636b286164647265737320616464722c75696e7439362067617360208201520152565b604051906151ca606083612659565b60218252602960f81b6040837f496e7075742875696e743820696e707574547970652c6279746573206461746160208201520152565b6040519061520f60c083612659565b60888252676c61746572616c2960c01b60a0837f4f666665722875696e74323536206d696e50726963652c75696e74323536206d60208201527f617850726963652c75696e7436342072616d70557053746172742c75696e743360408201527f322072616d705570506572696f642c75696e743332206c6f636b54696d656f7560608201527f742c75696e7433322074696d656f75742c75696e74323536206c6f636b436f6c60808201520152565b604051906152cd606083612659565b602982526874657320646174612960b81b6040837f5072656469636174652875696e743820707265646963617465547970652c627960208201520152565b6040519061531a608083612659565b605a82527f6c2c496e70757420696e7075742c4f66666572206f66666572290000000000006060837f50726f6f66526571756573742875696e743235362069642c526571756972656d60208201527f656e747320726571756972656d656e74732c737472696e6720696d616765557260408201520152565b604051906153a1608083612659565b60438252626f722960e81b6060837f526571756972656d656e74732843616c6c6261636b2063616c6c6261636b2c5060208201527f7265646963617465207072656469636174652c6279746573342073656c65637460408201520152565b6040519061540c8261263e565b5f6040838281528260208201520152565b969495919293909660609661550c575f80516020615f4983398151915260209596979860018060a01b031693845f526001875261545e60405f209687615c95565b6040519387013584526001600160a01b0316958693a36001600160601b03825416906001600160601b03851682106154e057506001600160601b038481920316166001600160601b03198254161790555f5260016020526001600160601b036154ce60405f209282845416612d61565b166001600160601b0319825416179055565b949550505050506040519063112fed8b60e31b60208301526024820152602481526126e6604482612659565b955050505050915060405190631cfdeebb60e01b60208301526024820152602481526126e6604482612659565b906001600160601b03809116911603906001600160601b038211612a5657565b93959796929490946060986001606087015116151580156157a3575b6157745715615723575b50506001600160a01b03165f908152600160205260408120608093909301516001600160601b0386811696959294911685818811156156f057816155c291615539565b906001600160601b03835416906001600160601b03831682106156cb575b5082546bffffffffffffffffffffffff19169190036001600160601b03161790555b5f90815260208190526040902080546affffffffffffffffffffff60a01b81166001600160a01b0384169081176001600160a01b0319929092161760f890811c600217901b6001600160f81b03191617905560018060a01b03165f52600160205260405f206001600160601b0361567c8482845416612d61565b166001600160601b0319825416179055615694575050565b6001600160601b039192935060405192636008fdcb60e01b60208501526024840152166044820152604481526126e6606482612659565b96509450506001600160601b03806156e4868098612d61565b966001969150916155e0565b61570561570e916001600160601b0393615539565b82845416612d61565b166001600160601b0319825416179055615602565b6001600160a01b0383165f9081526001602052604090206157449190615c95565b60405160209182013581526001600160a01b0384169186915f80516020615f498339815191529190a35f8061557f565b5050505050509192505060405190631cfdeebb60e01b60208301526024820152602481526126e6604482612659565b5060026060870151161515615575565b9391909296959496606097600160608701511615158015615930575b61590257156158b7575b505082516001600160a01b0394851694168414801591906158a3575b506158795760a061288d93926001600160601b03925f525f6020525f6001604082208160f81b828060f81b03825416178155015582608082015116845f5260016020528361584a60405f209282845416612d61565b168419825416179055015116905f526001602052611c9660405f20916001600160601b03835460601c16612d61565b92935050506040519063a905765160e01b60208301526024820152602481526126e6604482612659565b9050602060c084015191013514155f6157f5565b6158d39160018060a01b03165f52600160205260405f20615c95565b60405160208281013582526001600160a01b0386169184915f80516020615f4983398151915291a35f806157d9565b50505050929350505060405190631cfdeebb60e01b60208301526024820152602481526126e6604482612659565b50600260608701511615156157cf565b615948615aac565b615950615bb3565b6040519060208201927f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f8452604083015260608201524660808201523060a082015260a081526159a160c082612659565b51902090565b6126e69063ffffffff60806001600160401b036040840151169201511690613f0f565b60ff5f80516020615f098339815191525460401c16156159e657565b631afcd79f60e31b5f5260045ffd5b6042916040519161190160f01b8352600283015260228201522090565b8151919060418303615a4257615a3b9250602082015190606060408401519301515f1a90615d32565b9192909190565b50505f9160029190565b6004811015612a015780615a5e575050565b60018103615a755763f645eedf60e01b5f5260045ffd5b60028103615a90575063fce698f760e01b5f5260045260245ffd5b600314615a9a5750565b6335e2f38360e21b5f5260045260245ffd5b6040515f80516020615e2983398151915254905f81615aca846128ad565b9182825260208201946001811690815f14615b975750600114615b3f575b615af492500382612659565b51908115615b00572090565b50505f80516020615e69833981519152548015615b1a5790565b507fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47090565b505f80516020615e298339815191525f90815290915f80516020615ea98339815191525b818310615b7b575050906020615af492820101615ae8565b6020919350806001915483858801015201910190918392615b63565b60ff1916865250615af492151560051b82016020019050615ae8565b6040515f80516020615e4983398151915254905f81615bd1846128ad565b9182825260208201946001811690815f14615c795750600114615c21575b615bfb92500382612659565b51908115615c07572090565b50505f80516020615f29833981519152548015615b1a5790565b505f80516020615e498339815191525f90815290915f80516020615f698339815191525b818310615c5d575050906020615bfb92820101615bef565b6020919350806001915483858801015201910190918392615c45565b60ff1916865250615bfb92151560051b82016020019050615bef565b9063ffffffff8116906020821015615cf2576401fffffffe9060011b169080820460021490151715612a565781546001600160c01b038116600290921b6001600160401b031660c091821c17901b6001600160c01b031916179055565b50615cfc90612a47565b8060011b9080820460021481151715612a565761288d9260ff916002916150cd9160071c6001600160f81b0316906001016142ef565b91906fa2a8918ca85bafe22016d0b997e4df60600160ff1b038411615d9f579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa15612247575f516001600160a01b03811615615d9557905f905f90565b505f906001905f90565b5050505f9160039190565b90615dce5750805115615dbf57602081519101fd5b63d6bda27560e01b5f5260045ffd5b81511580615dff575b615ddf575090565b639996b31560e01b5f9081526001600160a01b0391909116600452602490fd5b50803b15615dd756fe405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5acea16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d102a16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d103a16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d100b7db2dd08fcb62d0c9e08c51941cae53c267786a0b75803fb7960902fc8ef97d42ad5d3e1f2e6e70edcf6d991b8a3023d3fca8047a131592f9edb9fd9b89d57d360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800f0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00a16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d101120ea8d7610aa46e4a31b254c5d07489ebe8f1a93dc7bbbe60eaf3db2c62c0cc5f9ce34815f8e11431c7bb75a8e6886a91478f7ffc1dbb0a98dc240fddd76b75a164736f6c634300081a000a")] contract BoundlessMarket { - constructor(address verifier, bytes32 assessorId, bytes32 deprecatedAssessorId, uint32 deprecatedAssessorDuration, address stakeTokenContract) {} + constructor(address verifier, address applicationVerifier, bytes32 assessorId, bytes32 deprecatedAssessorId, uint32 deprecatedAssessorDuration, address stakeTokenContract) {} function initialize(address initialOwner, string calldata imageUrl) {} } } diff --git a/crates/test-utils/src/market.rs b/crates/test-utils/src/market.rs index 695d6c699..45fa2161e 100644 --- a/crates/test-utils/src/market.rs +++ b/crates/test-utils/src/market.rs @@ -91,6 +91,7 @@ pub async fn deploy_boundless_market( let market_instance = BoundlessMarket::deploy( &deployer_provider, verifier, + verifier, <[u8; 32]>::from(assessor_guest_id).into(), B256::ZERO, // DEPRECATED_ASSESSOR_ID 0, // DEPRECATED_ASSESSOR_DURATION diff --git a/deployments-check.py b/deployments-check.py index f290ebeb7..661ff968d 100644 --- a/deployments-check.py +++ b/deployments-check.py @@ -77,10 +77,10 @@ def main(): rs_addrs = extract_rs_addresses(rs_content, boundless_rs_network_keys[net_key]) mapping = { - "boundless-market": "boundless_market_address", - "verifier": "verifier_router_address", - "set-verifier": "set_verifier_address", - "collateral-token": "collateral_token_address", + 'boundless-market': 'boundless_market_address', + 'application-verifier': 'verifier_router_address', + 'set-verifier': 'set_verifier_address', + 'collateral-token': 'collateral_token_address', } for toml_field, addr_field in mapping.items():