From 745b5a501854532b1233a16ab6dc77577cd7fd1f Mon Sep 17 00:00:00 2001 From: cryptoAtwill Date: Thu, 2 Nov 2023 22:19:52 +0800 Subject: [PATCH 1/7] fix stack too deep --- src/gateway/GatewayRouterFacet.sol | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/gateway/GatewayRouterFacet.sol b/src/gateway/GatewayRouterFacet.sol index 2aeca2ff2..270b49a14 100644 --- a/src/gateway/GatewayRouterFacet.sol +++ b/src/gateway/GatewayRouterFacet.sol @@ -232,10 +232,8 @@ contract GatewayRouterFacet is GatewayActorModifiers { revert CheckpointNotCreated(); } - bytes32 checkpointHash = checkpointInfo.hash; - // slither-disable-next-line unused-return - (address recoveredSignatory, ECDSA.RecoverError err, ) = ECDSA.tryRecover(checkpointHash, signature); + (address recoveredSignatory, ECDSA.RecoverError err, ) = ECDSA.tryRecover(checkpointInfo.hash, signature); if (err != ECDSA.RecoverError.NoError) { revert InvalidSignature(); } @@ -273,13 +271,13 @@ contract GatewayRouterFacet is GatewayActorModifiers { } emit QuorumReached({ height: height, - checkpoint: checkpointHash, + checkpoint: checkpointInfo.hash, quorumWeight: checkpointInfo.currentWeight }); } else { emit QuorumWeightUpdated({ height: height, - checkpoint: checkpointHash, + checkpoint: checkpointInfo.hash, newWeight: checkpointInfo.currentWeight }); } From 097b57a7ebde1b2c99710360fbe8d4c22879bfb2 Mon Sep 17 00:00:00 2001 From: cryptoAtwill Date: Thu, 2 Nov 2023 22:26:33 +0800 Subject: [PATCH 2/7] format --- src/gateway/GatewayRouterFacet.sol | 2 +- src/lib/LibGateway.sol | 13 ++++++++----- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/src/gateway/GatewayRouterFacet.sol b/src/gateway/GatewayRouterFacet.sol index 270b49a14..8462acc05 100644 --- a/src/gateway/GatewayRouterFacet.sol +++ b/src/gateway/GatewayRouterFacet.sol @@ -314,7 +314,7 @@ contract GatewayRouterFacet is GatewayActorModifiers { if (!ok) { revert FailedAddIncompleteCheckpoint(); } - + CheckpointInfo memory info = CheckpointInfo({ hash: checkpoint.toHash(), rootHash: membershipRootHash, diff --git a/src/lib/LibGateway.sol b/src/lib/LibGateway.sol index 1d761d2eb..96934463d 100644 --- a/src/lib/LibGateway.sol +++ b/src/lib/LibGateway.sol @@ -43,7 +43,11 @@ library LibGateway { /// @notice returns the bottom-up checkpoint and its info at the target epoch function getBottomUpCheckpointWithInfo( uint64 epoch - ) internal view returns (bool exists, BottomUpCheckpoint storage checkpoint, CheckpointInfo storage checkpointInfo) { + ) + internal + view + returns (bool exists, BottomUpCheckpoint storage checkpoint, CheckpointInfo storage checkpointInfo) + { GatewayActorStorage storage s = LibGatewayActorStorage.appStorage(); checkpoint = s.bottomUpCheckpoints[epoch]; @@ -53,16 +57,15 @@ library LibGateway { } /// @notice checks if the bottom-up checkpoint already exists at the target epoch - function bottomUpCheckpointExists( - uint64 epoch - ) internal view returns (bool) { + function bottomUpCheckpointExists(uint64 epoch) internal view returns (bool) { GatewayActorStorage storage s = LibGatewayActorStorage.appStorage(); return s.bottomUpCheckpoints[epoch].blockHeight != 0; } /// @notice stores checkpoint and its info to storage. function storeBottomUpCheckpointWithInfo( - BottomUpCheckpoint memory checkpoint, CheckpointInfo memory checkpointInfo + BottomUpCheckpoint memory checkpoint, + CheckpointInfo memory checkpointInfo ) internal { GatewayActorStorage storage s = LibGatewayActorStorage.appStorage(); From 6305aef5d25140e4179675190f3ce34fccdacfc1 Mon Sep 17 00:00:00 2001 From: Alfonso de la Rocha Date: Thu, 2 Nov 2023 15:29:51 +0100 Subject: [PATCH 3/7] IPC-361: Add pre-release function and recover initial balance in leave --- src/gateway/GatewayRouterFacet.sol | 2 +- src/interfaces/ISubnetActor.sol | 3 ++ src/lib/LibGateway.sol | 13 ++++--- src/subnet/SubnetActorManagerFacet.sol | 54 +++++++++++++++++++++++++- test/SubnetActorDiamondReal.t.sol | 21 +++++++++- 5 files changed, 83 insertions(+), 10 deletions(-) diff --git a/src/gateway/GatewayRouterFacet.sol b/src/gateway/GatewayRouterFacet.sol index 2aeca2ff2..2f3fe547b 100644 --- a/src/gateway/GatewayRouterFacet.sol +++ b/src/gateway/GatewayRouterFacet.sol @@ -316,7 +316,7 @@ contract GatewayRouterFacet is GatewayActorModifiers { if (!ok) { revert FailedAddIncompleteCheckpoint(); } - + CheckpointInfo memory info = CheckpointInfo({ hash: checkpoint.toHash(), rootHash: membershipRootHash, diff --git a/src/interfaces/ISubnetActor.sol b/src/interfaces/ISubnetActor.sol index 41aabb9ba..a70d6bd15 100644 --- a/src/interfaces/ISubnetActor.sol +++ b/src/interfaces/ISubnetActor.sol @@ -21,6 +21,9 @@ interface ISubnetActor { /// Method that allows to pre-fund an address in the subnet before it bootstraps. function preFund() external payable; + /// Method that allows to recover initial balance for an address from a subnet that hasn't bootstrapped yet. + function preRelease(uint256 amount) external; + /// Method that allows a validator to unstake their collateral from a subnet function unstake(uint256 amount) external; diff --git a/src/lib/LibGateway.sol b/src/lib/LibGateway.sol index 1d761d2eb..96934463d 100644 --- a/src/lib/LibGateway.sol +++ b/src/lib/LibGateway.sol @@ -43,7 +43,11 @@ library LibGateway { /// @notice returns the bottom-up checkpoint and its info at the target epoch function getBottomUpCheckpointWithInfo( uint64 epoch - ) internal view returns (bool exists, BottomUpCheckpoint storage checkpoint, CheckpointInfo storage checkpointInfo) { + ) + internal + view + returns (bool exists, BottomUpCheckpoint storage checkpoint, CheckpointInfo storage checkpointInfo) + { GatewayActorStorage storage s = LibGatewayActorStorage.appStorage(); checkpoint = s.bottomUpCheckpoints[epoch]; @@ -53,16 +57,15 @@ library LibGateway { } /// @notice checks if the bottom-up checkpoint already exists at the target epoch - function bottomUpCheckpointExists( - uint64 epoch - ) internal view returns (bool) { + function bottomUpCheckpointExists(uint64 epoch) internal view returns (bool) { GatewayActorStorage storage s = LibGatewayActorStorage.appStorage(); return s.bottomUpCheckpoints[epoch].blockHeight != 0; } /// @notice stores checkpoint and its info to storage. function storeBottomUpCheckpointWithInfo( - BottomUpCheckpoint memory checkpoint, CheckpointInfo memory checkpointInfo + BottomUpCheckpoint memory checkpoint, + CheckpointInfo memory checkpointInfo ) internal { GatewayActorStorage storage s = LibGatewayActorStorage.appStorage(); diff --git a/src/subnet/SubnetActorManagerFacet.sol b/src/subnet/SubnetActorManagerFacet.sol index a7d4fd446..8492420bd 100644 --- a/src/subnet/SubnetActorManagerFacet.sol +++ b/src/subnet/SubnetActorManagerFacet.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: MIT OR Apache-2.0 pragma solidity 0.8.19; -import {SubnetAlreadyBootstrapped, NotEnoughFunds, CollateralIsZero, CannotReleaseZero, NotOwnerOfPublicKey, EmptyAddress, NotEnoughBalanceForRewards, NotEnoughCollateral, NotValidator, NotAllValidatorsHaveLeft, NotStakedBefore, InvalidSignatureErr, InvalidCheckpointEpoch, InvalidCheckpointMessagesHash, InvalidPublicKeyLength} from "../errors/IPCErrors.sol"; +import {SubnetAlreadyBootstrapped, NotEnoughFunds, CollateralIsZero, CannotReleaseZero, NotOwnerOfPublicKey, EmptyAddress, NotEnoughBalance, NotEnoughBalanceForRewards, NotEnoughCollateral, NotValidator, NotAllValidatorsHaveLeft, NotStakedBefore, InvalidSignatureErr, InvalidCheckpointEpoch, InvalidCheckpointMessagesHash, InvalidPublicKeyLength} from "../errors/IPCErrors.sol"; import {IGateway} from "../interfaces/IGateway.sol"; import {ISubnetActor} from "../interfaces/ISubnetActor.sol"; import {BottomUpCheckpoint, CrossMsg} from "../structs/Checkpoint.sol"; @@ -109,6 +109,31 @@ contract SubnetActorManagerFacet is ISubnetActor, SubnetActorModifiers, Reentran s.genesisCircSupply += msg.value; } + /// @notice method to remove funds from the initial balance of a subnet. + /// @dev This method can be used by users looking to recover part of their + /// initial balance before the subnet bootstraps. + function preRelease(uint256 amount) external nonReentrant { + if (amount == 0) { + revert NotEnoughFunds(); + } + + if (s.bootstrapped) { + revert SubnetAlreadyBootstrapped(); + } + + if (s.genesisBalance[msg.sender] == 0) { + revert NotEnoughBalance(); + } + + s.genesisBalance[msg.sender] -= amount; + s.genesisCircSupply -= amount; + + if (s.genesisBalance[msg.sender] == 0) { + rmAddressFromBalanceKey(msg.sender); + payable(msg.sender).sendValue(amount); + } + } + /// @notice method that allows a validator to join the subnet /// @param publicKey The off-chain 65 byte public key that should be associated with the validator function join(bytes calldata publicKey) external payable nonReentrant notKilled { @@ -196,7 +221,9 @@ contract SubnetActorManagerFacet is ISubnetActor, SubnetActorModifiers, Reentran } /// @notice method that allows a validator to leave the subnet - function leave() external notKilled { + /// @dev it also return the validators initial balance if the + /// subnet was not yet bootstrapped. + function leave() external notKilled nonReentrant { // remove bootstrap nodes added by this validator uint256 amount = LibStaking.totalValidatorCollateral(msg.sender); @@ -210,6 +237,13 @@ contract SubnetActorManagerFacet is ISubnetActor, SubnetActorModifiers, Reentran if (!s.bootstrapped) { LibStaking.withdrawWithConfirm(msg.sender, amount); + // check if the validator had some initial balance and return it if not bootstrapped + uint256 genesisBalance = s.genesisBalance[msg.sender]; + if (genesisBalance != 0) { + s.genesisBalance[msg.sender] == 0; + rmAddressFromBalanceKey(msg.sender); + payable(msg.sender).sendValue(genesisBalance); + } return; } LibStaking.withdraw(msg.sender, amount); @@ -319,4 +353,20 @@ contract SubnetActorManagerFacet is ISubnetActor, SubnetActorModifiers, Reentran bytes32 hashed = keccak256(publicKey[1:]); return address(uint160(uint256(hashed))); } + + /// @notice Removes an address from the initial balance keys + function rmAddressFromBalanceKey(address addr) internal { + uint length = s.genesisBalanceKeys.length; + for (uint i = 0; i < length; ) { + if (s.genesisBalanceKeys[i] == addr) { + s.genesisBalanceKeys[i] = s.genesisBalanceKeys[length - 1]; + s.genesisBalanceKeys.pop(); + // exit after removing the key + break; + } + unchecked { + ++i; + } + } + } } diff --git a/test/SubnetActorDiamondReal.t.sol b/test/SubnetActorDiamondReal.t.sol index 8e0a59886..e1f726eda 100644 --- a/test/SubnetActorDiamondReal.t.sol +++ b/test/SubnetActorDiamondReal.t.sol @@ -451,9 +451,10 @@ contract SubnetActorDiamondRealTest is Test { ); } - function testSubnetActorDiamondReal_PreFund_works() public { + function testSubnetActorDiamondReal_PreFundRelease_works() public { (address validator1, bytes memory publicKey1) = TestUtils.deriveValidatorAddress(100); address preFunder = address(102); + address preReleaser = address(103); // total collateral in the gateway uint256 collateral = 0; @@ -463,6 +464,20 @@ contract SubnetActorDiamondRealTest is Test { require(!saGetter.isWaitingValidator(validator1), "waiting validator1"); // ======== Step. Join ====== + + // pre-fund and pre-release from same address + vm.startPrank(preReleaser); + vm.deal(preReleaser, 2*fundAmount); + saManager.preFund{value: 2*fundAmount}(); + require(saGetter.genesisCircSupply() == 2*fundAmount, "genesis circ supply not correct"); + saManager.preRelease(fundAmount); + require(saGetter.genesisCircSupply() == fundAmount, "genesis circ supply not correct"); + (address[] memory genesisAddrs, ) = saGetter.genesisBalances(); + require(genesisAddrs.length == 1, "not one genesis addresses"); + saManager.preRelease(fundAmount); + require(saGetter.genesisCircSupply() == 0, "genesis circ supply not correct"); + require(genesisAddrs.length == 0, "not zero genesis addresses"); + // pre-fund from validator and from pre-funder vm.startPrank(validator1); vm.deal(validator1, fundAmount); @@ -471,6 +486,8 @@ contract SubnetActorDiamondRealTest is Test { vm.deal(preFunder, fundAmount); saManager.preFund{value: fundAmount}(); + + // initial validator joins vm.deal(validator1, DEFAULT_MIN_VALIDATOR_STAKE); @@ -484,7 +501,7 @@ contract SubnetActorDiamondRealTest is Test { ); require(saGetter.genesisCircSupply() == 2 * fundAmount, "genesis circ supply not correct"); - (address[] memory genesisAddrs, ) = saGetter.genesisBalances(); + (genesisAddrs, ) = saGetter.genesisBalances(); require(genesisAddrs.length == 2, "not two genesis addresses"); // collateral confirmed immediately and network boostrapped From c36ccccb644f0e03af8f2a8465518507b12c5cf2 Mon Sep 17 00:00:00 2001 From: Alfonso de la Rocha Date: Thu, 2 Nov 2023 15:57:40 +0100 Subject: [PATCH 4/7] IPC-361: Add unit tests and minor fixes --- src/lib/LibStaking.sol | 3 +- src/subnet/SubnetActorManagerFacet.sol | 2 + test/SubnetActorDiamondReal.t.sol | 55 +++++++++++++++++++++++--- 3 files changed, 54 insertions(+), 6 deletions(-) diff --git a/src/lib/LibStaking.sol b/src/lib/LibStaking.sol index 4419b2b6a..854f07928 100644 --- a/src/lib/LibStaking.sol +++ b/src/lib/LibStaking.sol @@ -429,6 +429,8 @@ library LibStaking { } /// @notice Confirm the withdraw directly without going through the confirmation process + /// and releasing from the gateway. + /// @dev only use for non-bootstrapped subnets function withdrawWithConfirm(address validator, uint256 amount) internal { SubnetActorStorage storage s = LibSubnetActorStorage.appStorage(); @@ -438,7 +440,6 @@ library LibStaking { s.validatorSet.confirmWithdraw(validator, amount); // release stake from gateway and transfer to user - IGateway(s.ipcGatewayAddr).releaseStake(amount); payable(validator).transfer(amount); } diff --git a/src/subnet/SubnetActorManagerFacet.sol b/src/subnet/SubnetActorManagerFacet.sol index 8492420bd..f1372bf7d 100644 --- a/src/subnet/SubnetActorManagerFacet.sol +++ b/src/subnet/SubnetActorManagerFacet.sol @@ -237,10 +237,12 @@ contract SubnetActorManagerFacet is ISubnetActor, SubnetActorModifiers, Reentran if (!s.bootstrapped) { LibStaking.withdrawWithConfirm(msg.sender, amount); + // check if the validator had some initial balance and return it if not bootstrapped uint256 genesisBalance = s.genesisBalance[msg.sender]; if (genesisBalance != 0) { s.genesisBalance[msg.sender] == 0; + s.genesisCircSupply -= genesisBalance; rmAddressFromBalanceKey(msg.sender); payable(msg.sender).sendValue(genesisBalance); } diff --git a/test/SubnetActorDiamondReal.t.sol b/test/SubnetActorDiamondReal.t.sol index e1f726eda..67a530661 100644 --- a/test/SubnetActorDiamondReal.t.sol +++ b/test/SubnetActorDiamondReal.t.sol @@ -467,14 +467,15 @@ contract SubnetActorDiamondRealTest is Test { // pre-fund and pre-release from same address vm.startPrank(preReleaser); - vm.deal(preReleaser, 2*fundAmount); - saManager.preFund{value: 2*fundAmount}(); - require(saGetter.genesisCircSupply() == 2*fundAmount, "genesis circ supply not correct"); + vm.deal(preReleaser, 2 * fundAmount); + saManager.preFund{value: 2 * fundAmount}(); + require(saGetter.genesisCircSupply() == 2 * fundAmount, "genesis circ supply not correct"); saManager.preRelease(fundAmount); require(saGetter.genesisCircSupply() == fundAmount, "genesis circ supply not correct"); (address[] memory genesisAddrs, ) = saGetter.genesisBalances(); require(genesisAddrs.length == 1, "not one genesis addresses"); saManager.preRelease(fundAmount); + (genesisAddrs, ) = saGetter.genesisBalances(); require(saGetter.genesisCircSupply() == 0, "genesis circ supply not correct"); require(genesisAddrs.length == 0, "not zero genesis addresses"); @@ -486,8 +487,6 @@ contract SubnetActorDiamondRealTest is Test { vm.deal(preFunder, fundAmount); saManager.preFund{value: fundAmount}(); - - // initial validator joins vm.deal(validator1, DEFAULT_MIN_VALIDATOR_STAKE); @@ -519,6 +518,7 @@ contract SubnetActorDiamondRealTest is Test { require(nextConfigNum == LibStaking.INITIAL_CONFIGURATION_NUMBER, "next config num not 1"); require(startConfigNum == LibStaking.INITIAL_CONFIGURATION_NUMBER, "start config num not 1"); + // pre-fund not allowed with bootstrapped subnet vm.startPrank(preFunder); vm.expectRevert(SubnetAlreadyBootstrapped.selector); vm.deal(preFunder, fundAmount); @@ -526,4 +526,49 @@ contract SubnetActorDiamondRealTest is Test { vm.stopPrank(); } + + function testSubnetActorDiamondReal_PreFundAndLeave_works() public { + (address validator1, bytes memory publicKey1) = TestUtils.deriveValidatorAddress(100); + + // total collateral in the gateway + uint256 collateral = DEFAULT_MIN_VALIDATOR_STAKE - 100; + uint256 fundAmount = 100; + + // pre-fund from validator + vm.startPrank(validator1); + vm.deal(validator1, fundAmount); + saManager.preFund{value: fundAmount}(); + + // initial validator joins but doesn't bootstrap the subnet + vm.deal(validator1, collateral); + vm.startPrank(validator1); + saManager.join{value: collateral}(publicKey1); + require( + address(saDiamond).balance == collateral + fundAmount, + "subnet balance is incorrect after validator1 joining" + ); + require(saGetter.genesisCircSupply() == fundAmount, "genesis circ supply not correct"); + (address[] memory genesisAddrs, ) = saGetter.genesisBalances(); + require(genesisAddrs.length == 1, "not one genesis addresses"); + + // Leave should return the collateral and the initial balance + saManager.leave(); + require(address(saDiamond).balance == 0, "subnet balance is incorrect after validator1 leaving"); + require(saGetter.genesisCircSupply() == 0, "genesis circ supply not zero"); + (genesisAddrs, ) = saGetter.genesisBalances(); + require(genesisAddrs.length == 0, "not zero genesis addresses"); + + // initial validator joins to bootstrap the subnet + vm.deal(validator1, DEFAULT_MIN_VALIDATOR_STAKE); + + vm.startPrank(validator1); + saManager.join{value: DEFAULT_MIN_VALIDATOR_STAKE}(publicKey1); + + // pre-release not allowed with bootstrapped subnet + vm.startPrank(validator1); + vm.expectRevert(SubnetAlreadyBootstrapped.selector); + saManager.preRelease(fundAmount); + + vm.stopPrank(); + } } From 3fbf215b82b49edcf44c191775e3e265469d0bf9 Mon Sep 17 00:00:00 2001 From: auto-commit Date: Thu, 2 Nov 2023 15:08:49 +0000 Subject: [PATCH 5/7] commit rust binding --- binding/src/gateway_diamond.rs | 4 +- binding/src/gateway_router_facet.rs | 94 ----------- binding/src/lib_staking.rs | 4 +- binding/src/lib_staking_change_log.rs | 4 +- binding/src/subnet_actor_diamond.rs | 2 +- binding/src/subnet_actor_manager_facet.rs | 188 ++++++++++++++++++++++ 6 files changed, 195 insertions(+), 101 deletions(-) diff --git a/binding/src/gateway_diamond.rs b/binding/src/gateway_diamond.rs index 9ba2716a7..2f3599bf1 100644 --- a/binding/src/gateway_diamond.rs +++ b/binding/src/gateway_diamond.rs @@ -334,12 +334,12 @@ pub mod gateway_diamond { pub static GATEWAYDIAMOND_ABI: ::ethers::contract::Lazy<::ethers::core::abi::Abi> = ::ethers::contract::Lazy::new(__abi); #[rustfmt::skip] - const __BYTECODE: &[u8] = b"`\x80`@R4b\0\x0C\x03Wb\0\x1A\xBD\x808\x03\x80\x91b\0\0 \x82`\x80b\0\x0EuV[`\x809`@\x81\x12b\0\x0C\x03W`\x80Q`\x01`\x01`@\x1B\x03\x81\x11b\0\x0C\x03W`\x80\x82\x01`\x9F\x82\x01\x12\x15b\0\x0C\x03W\x80`\x80\x01Q\x90b\0\0^\x82b\0\x0E\x99V[\x91b\0\0n`@Q\x93\x84b\0\x0EuV[\x80\x83R` \x83\x01\x80\x92\x85`\x80\x01` \x84`\x05\x1B\x83`\x80\x01\x01\x01\x11b\0\x0C\x03W`\xA0\x81\x01\x91[`\xA0`\x05\x85\x90\x1B\x83\x01\x01\x83\x10b\0\r*WPP`\xA0Q\x91PP`\x01`\x01`@\x1B\x03\x81\x11b\0\x0C\x03W`\xE0\x81\x85\x03\x12b\0\x0C\x03W`@Q\x93`\xE0\x85\x01`\x01`\x01`@\x1B\x03\x81\x11\x86\x82\x10\x17b\0\x04\xE2W`@\x81\x90R`\x80\x83\x01Q`\x01`\x01`@\x1B\x03\x81\x11b\0\x0C\x03W\x83`\x80\x01\x01`@\x81\x84`\x80\x01\x03\x12b\0\x0C\x03Wb\0\x01\x18\x82b\0\x0EYV[b\0\x01#\x81b\0\x0E\xC6V[\x82R` \x81\x01Q\x90`\x01`\x01`@\x1B\x03\x82\x11b\0\x0C\x03W\x01\x82`\x80\x01`\x1F\x82\x01\x12\x15b\0\x0C\x03W\x80Q\x90b\0\x01X\x82b\0\x0E\x99V[\x91b\0\x01h`@Q\x93\x84b\0\x0EuV[\x80\x83R` \x80\x84\x01\x91`\x05\x1B\x83\x01\x01\x91\x85`\x80\x01\x83\x11b\0\x0C\x03W` \x01\x90[\x82\x82\x10b\0\r\x0FWPPPa\x01\0\x87\x01R\x85Rb\0\x01\xA9`\xA0\x83\x01b\0\x0E\xC6V[` \x86\x01R`\xC0\x82\x01Q`@\x86\x01R`\xE0\x82\x01Q``\x86\x01Ra\x01\0\x82\x01Q`\xFF\x81\x16\x81\x03b\0\x0C\x03W`\x80\x86\x01Ra\x01 \x82\x01Q`\x01`\x01`@\x1B\x03\x81\x11b\0\x0C\x03W`\x80\x82\x01`\x9F\x84\x83\x01\x01\x12\x15b\0\x0C\x03W\x80\x83`\x80\x01\x01Qb\0\x02\x10\x81b\0\x0E\x99V[\x92b\0\x02 `@Q\x94\x85b\0\x0EuV[\x81\x84R` \x84\x01`\x80\x82\x01`\xA0\x87\x86\x01`\x05\x86\x90\x1B\x01\x01\x11b\0\x0C\x03W`\xA0\x86\x85\x01\x01\x90[`\xA0\x87\x86\x01`\x05\x86\x90\x1B\x01\x01\x82\x10b\0\x0C\x08W\x89\x89\x89`\xC0\x8A\x8A`\xA0\x86\x01R`\x80\x01\x01Qa\xFF\xFF\x81\x16\x81\x03b\0\x0C\x03W`\xC0\x84\x01R`@\x83\x01Q\x15b\0\x0B\xF1W` \x83\x01Q`\x01`\x01`@\x1B\x03\x16\x15b\0\x0B\xDFW`\xFF`\x80\x84\x01Q\x16`3\x81\x10\x90\x81\x15b\0\x0B\xD3W[Pb\0\x0B\xC1W\x7F\x80n\x0C\xBB\x9F\xCE)k\xBC3jH\xF4+\xF1\xDB\xC6\x97\"\xD1\x8D\x90\xD6\xFEp[u\x82\xC2\xBBK\xD5\x80T`\x01`\x01`\xA0\x1B\x03\x19\x163\x17\x90U`@Q`\x01`\x01`@\x1B\x03` \x82\x01\x90\x81\x11\x90\x82\x11\x17b\0\x04\xE2W` \x81\x01`@R`\0\x81R\x82Q`\0[\x81\x81\x10b\0\x05RWPP`@Q\x92``\x84\x01\x90``\x85RQ\x80\x91R`\x80\x84\x01\x90`\x80\x81`\x05\x1B\x86\x01\x01\x93\x91`\0\x90[\x82\x82\x10b\0\x04\xF8W\x87\x7F\x8F\xAAp\x87\x86q\xCC\xD2\x12\xD2\x07q\xB7\x95\xC5\n\xF8\xFD?\xF6\xCF'\xF4\xBD\xE5~]M\xE0\xAE\xB6s\x88\x80b\0\x03\x86\x8A\x8A`\0` \x85\x01R\x83\x82\x03`@\x85\x01Rb\0\x0F\x92V[\x03\x90\xA1\x80Q\x80Q`\x13\x80T`\x01`\x01`@\x1B\x03\x19\x90\x81\x16`\x01`\x01`@\x1B\x03\x93\x84\x16\x17\x90\x91U` \x90\x92\x01Q\x80Q\x93\x92\x91\x84\x11b\0\x04\xE2Wh\x01\0\0\0\0\0\0\0\0\x84\x11b\0\x04\xE2W` \x90`\x14T\x85`\x14U\x80\x86\x10b\0\x04\xC1W[P\x01\x92`\x14`\0R` `\0 `\0[\x82\x81\x10b\0\x04\xA3Wb\0\x04\x93`\xA0\x86`\x01\x87`@\x83\x01Q`\x15U\x81\x80`@\x1B\x03` \x84\x01Q\x16\x81`\x18T\x16\x17`\x18U``\x83\x01Q`\x16U`\xFF`\x80\x84\x01Q\x16`\xFF\x19`\x17T\x16\x17`\x17U`\rT\x16\x17`\rUa\xFF\xFF`\xC0\x82\x01Q\x16a\xFF\xFF\x19`\x19T\x16\x17`\x19Uh\x01\0\0\0\0\0\0\0\x01`\x01\x80`\x80\x1B\x03\x19`\"T\x16\x17`\"U\x01Q`@Q\x90b\0\x04\x84\x82b\0\x0EYV[\x81R`\0` \x82\x01Rb\0\x13zV[`@Qa\x013\x90\x81b\0\x19J\x829\xF3[\x85Q`\x01`\x01`\xA0\x1B\x03\x16\x81\x83\x01U` \x90\x95\x01\x94`\x01\x01b\0\x03\xF2V[b\0\x04\xDB\x90`\x14`\0R\x86\x84`\0 \x91\x82\x01\x91\x01b\0\x0F\0V[\x85b\0\x03\xE2V[cNH{q`\xE0\x1B`\0R`A`\x04R`$`\0\xFD[\x90\x91\x92\x94` \x80b\0\x05C`\x01\x93`\x7F\x19\x8B\x82\x03\x01\x86R```@\x8BQ\x87\x80`\xA0\x1B\x03\x81Q\x16\x84Rb\0\x052\x86\x82\x01Q\x87\x86\x01\x90b\0\x0FDV[\x01Q\x91\x81`@\x82\x01R\x01\x90b\0\x0FRV[\x97\x01\x92\x01\x92\x01\x90\x92\x91b\0\x03?V[`@b\0\x05`\x82\x87b\0\x0F\x19V[Q\x01Q`\x01`\x01`\xA0\x1B\x03b\0\x05w\x83\x88b\0\x0F\x19V[QQ\x16\x90\x80Q\x15b\0\x0B\xA8W` b\0\x05\x91\x84\x89b\0\x0F\x19V[Q\x01Q`\x03\x81\x10\x15b\0\x0B\x92W\x80b\0\x07\xBDWP\x81\x15b\0\x07\x92Wa\xFF\xFF`\0\x80Q` b\0\x1A}\x839\x81Q\x91RT\x16b\0\x06\x0E`@Qb\0\x05\xD3\x81b\0\x0E=V[`!\x81R\x7FdiamondCut: Add facet has no cod` \x82\x01R`e`\xF8\x1B`@\x82\x01R\x84b\0\x0F\xFBV[\x81Q\x91`\0\x91[\x83\x83\x10b\0\x06-WPPPPP`\x01\x90[\x01b\0\x03\x10V[`\x01`\x01`\xE0\x1B\x03\x19b\0\x06B\x84\x84b\0\x0F\x19V[Q\x16`\0\x81\x81R`\0\x80Q` b\0\x1A\x9D\x839\x81Q\x91R` R`@\x90 T\x90\x91\x90`\x01`\x01`\xA0\x1B\x03\x16b\0\x07yWb\0\x06\xE1`@Qb\0\x06\x84\x81b\0\x0EYV[\x87\x81Ra\xFF\xFF\x83\x16` \x80\x83\x01\x91\x82R`\0\x86\x81R`\0\x80Q` b\0\x1A\x9D\x839\x81Q\x91R\x90\x91R`@\x90 \x91Q\x82T\x91Q`\x01`\x01`\xB0\x1B\x03\x19\x90\x92\x16`\x01`\x01`\xA0\x1B\x03\x91\x90\x91\x16\x17`\xA0\x91\x90\x91\x1Ba\xFF\xFF`\xA0\x1B\x16\x17\x90UV[`\0\x80Q` b\0\x1A}\x839\x81Q\x91RT\x91h\x01\0\0\0\0\0\0\0\0\x83\x10\x15b\0\x04\xE2Wb\0\x07H\x90b\0\x07+`\x01\x94\x85\x81\x01`\0\x80Q` b\0\x1A}\x839\x81Q\x91RUb\0\x0F\xB9V[\x90\x91\x90c\xFF\xFF\xFF\xFF\x83T\x91`\x03\x1B\x92`\xE0\x1C\x83\x1B\x92\x1B\x19\x16\x17\x90UV[a\xFF\xFF\x80\x82\x16\x14b\0\x07cW\x92\x81\x01\x92a\xFF\xFF\x16\x01b\0\x06\x15V[cNH{q`\xE0\x1B`\0R`\x11`\x04R`$`\0\xFD[`@Qc\xEB\xBF]\x07`\xE0\x1B\x81R`\x04\x81\x01\x83\x90R`$\x90\xFD[`@Qc\x02\xB8\xDA\x07`\xE2\x1B\x81R` `\x04\x82\x01R\x90\x81\x90b\0\x07\xB9\x90`$\x83\x01\x90b\0\x0FRV[\x03\x90\xFD[`\x01\x81\x99\x95\x96\x92\x97\x93\x99\x98\x94\x98\x14`\0\x14b\0\tKWP\x87\x15b\0\t'Wb\0\x08/`@Qb\0\x07\xED\x81b\0\x0E=V[`(\x81R\x7FLibDiamondCut: Replace facet has` \x82\x01Rg no code`\xC0\x1B`@\x82\x01R\x89b\0\x0F\xFBV[`\0[\x86Q\x81\x10\x15b\0\t\x16W`\x01`\x01`\xE0\x1B\x03\x19b\0\x08Q\x82\x89b\0\x0F\x19V[Q\x16`\0\x81\x81R`\0\x80Q` b\0\x1A\x9D\x839\x81Q\x91R` R`@\x90 T`\x01`\x01`\xA0\x1B\x03\x160\x81\x14b\0\x08\xFDW\x8A\x81\x14b\0\x08\xE4W\x15b\0\x08\xCCW`\0\x90\x81R`\0\x80Q` b\0\x1A\x9D\x839\x81Q\x91R` R`@\x90 \x80T`\x01`\x01`\xA0\x1B\x03\x19\x16\x8A\x17\x90Ub\0\x08\xC6\x90b\0\x0F\xEBV[b\0\x082V[`$\x90`@Q\x90cty\xF99`\xE0\x1B\x82R`\x04\x82\x01R\xFD[`@Qc\x1A\xC6\xCE\x8D`\xE1\x1B\x81R`\x04\x81\x01\x83\x90R`$\x90\xFD[`@Qc)\x01\x80m`\xE1\x1B\x81R`\x04\x81\x01\x83\x90R`$\x90\xFD[P\x93\x92\x96P\x93P\x93`\x01\x90b\0\x06&V[`@Qc\xCD\x98\xA9o`\xE0\x1B\x81R` `\x04\x82\x01R\x80b\0\x07\xB9`$\x82\x01\x89b\0\x0FRV[`\x02\x81\x03b\0\x0BpWP`\0\x80Q` b\0\x1A}\x839\x81Q\x91RT\x97\x80b\0\x0BXWP`\0\x97[\x86Q\x89\x10\x15b\0\t\x16Wa\xFF\xFF\x98`\x01`\x01`\xE0\x1B\x03\x19b\0\t\x95\x82\x8Ab\0\x0F\x19V[Q\x16\x91\x82`\0R`\0\x80Q` b\0\x1A\x9D\x839\x81Q\x91R` R`@`\0 `@Q\x9B\x8C\x91b\0\t\xC5\x83b\0\x0EYV[T`\x01`\x01`\xA0\x1B\x03\x81\x16\x92\x83\x90R`\xA0\x1C\x16` \x8D\x01R\x15b\0\x0B?W\x8AQ`\x01`\x01`\xA0\x1B\x03\x160\x14b\0\x0B&W\x80\x15b\0\x07cW`\0\x19\x01\x8A\x81a\xFF\xFF` \x82\x9E\x01Q\x16\x03b\0\n\xA3W[PP`\0\x80Q` b\0\x1A}\x839\x81Q\x91RT\x91\x82\x15b\0\n\x8DWb\0\n\x86\x92`\0\x19\x01b\0\nB\x81b\0\x0F\xB9V[c\xFF\xFF\xFF\xFF\x82T\x91`\x03\x1B\x1B\x19\x16\x90U`\0\x80Q` b\0\x1A}\x839\x81Q\x91RU`\0R`\0\x80Q` b\0\x1A\x9D\x839\x81Q\x91R` R`\0`@\x81 Ub\0\x0F\xEBV[\x97b\0\trV[cNH{q`\xE0\x1B`\0R`1`\x04R`$`\0\xFD[a\xFF\xFF` b\0\n\xB7b\0\x0B\x1E\x94b\0\x0F\xB9V[\x90T\x90`\x03\x1B\x1C`\xE0\x1B\x92b\0\n\xD7\x84b\0\x07+\x85\x85\x85\x01Q\x16b\0\x0F\xB9V[\x01Q`\x01`\x01`\xE0\x1B\x03\x19\x90\x92\x16`\0\x90\x81R`\0\x80Q` b\0\x1A\x9D\x839\x81Q\x91R` R`@\x90 \x80Ta\xFF\xFF`\xA0\x1B\x19\x16\x91\x90\x92\x16`\xA0\x1Ba\xFF\xFF`\xA0\x1B\x16\x17\x90UV[\x89\x8Bb\0\n\x13V[`@Qc\r\xF5\xFDa`\xE3\x1B\x81R`\x04\x81\x01\x84\x90R`$\x90\xFD[`@Qcz\x08\xA2-`\xE0\x1B\x81R`\x04\x81\x01\x84\x90R`$\x90\xFD[`$\x90`@Q\x90c\xD0\x91\xBC\x81`\xE0\x1B\x82R`\x04\x82\x01R\xFD[`@Qc?\xF4\xD2\x0F`\xE1\x1B\x81R`$\x91b\0\x0B\x90\x90`\x04\x83\x01\x90b\0\x0FDV[\xFD[cNH{q`\xE0\x1B`\0R`!`\x04R`$`\0\xFD[`@Qc\xE7g\xF9\x1F`\xE0\x1B\x81R`\x04\x81\x01\x83\x90R`$\x90\xFD[`@Qcu\xC3\xB4'`\xE0\x1B\x81R`\x04\x90\xFD[`d\x91P\x11\x84b\0\x02\xAEV[`@Qc1/\x8E\x05`\xE0\x1B\x81R`\x04\x90\xFD[`@Qch\xF7\xA6u`\xE1\x1B\x81R`\x04\x90\xFD[`\0\x80\xFD[\x81Q\x90`\x01`\x01`@\x1B\x03\x82\x11b\0\x0C\x03W``\x88\x87\x01\x83\x01\x85\x03`\x1F\x19\x01\x12b\0\x0C\x03W`@Q\x91b\0\x0C<\x83b\0\x0E=V[\x86\x89\x01\x81\x01`\xA0\x81\x01Q\x84Rb\0\x0CV\x90`\xC0\x01b\0\x0E\xB1V[` \x84\x01R`\xE0\x89\x88\x01\x82\x01\x01Q\x90`\x01`\x01`@\x1B\x03\x82\x11b\0\x0C\x03W\x87\x8A`\x80\x01\x01\x01\x01\x90\x84`\x80\x01`?\x83\x01\x12\x15b\0\x0C\x03W` \x82\x01Q\x90`\x01`\x01`@\x1B\x03\x82\x11b\0\x0C\xFAW`@Q\x93b\0\x0C\xBB`\x1F\x84\x01`\x1F\x19\x16` \x01\x86b\0\x0EuV[\x82\x85R\x86`\x80\x01`@\x84\x86\x01\x01\x11b\0\x0C\x03W\x84b\0\x0C\xE7` \x96\x94\x87\x96`@\x88\x80\x98\x01\x91\x01b\0\x0E\xDBV[`@\x82\x01R\x81R\x01\x92\x01\x91\x90Pb\0\x02EV[`$`\0cNH{q`\xE0\x1B\x81R`A`\x04R\xFD[` \x80\x91b\0\r\x1E\x84b\0\x0E\xB1V[\x81R\x01\x91\x01\x90b\0\x01\x88V[\x82Q`\x01`\x01`@\x1B\x03\x81\x11b\0\x0C\x03W``\x90\x83\x01`\x80\x81\x01\x90\x89\x03`\x1F\x19\x01\x82\x13b\0\x0C\x03W`@Q\x91b\0\ra\x83b\0\x0E=V[b\0\ro` \x83\x01b\0\x0E\xB1V[\x83R`@\x82\x01Q`\x03\x81\x10\x15b\0\x0C\x03W` \x84\x01R\x81\x01Q`\x01`\x01`@\x1B\x03\x81\x11b\0\x0C\x03W\x89`\x80\x01`?\x82\x84\x01\x01\x12\x15b\0\x0C\x03W` \x81\x83\x01\x01Qb\0\r\xBA\x81b\0\x0E\x99V[\x92b\0\r\xCA`@Q\x94\x85b\0\x0EuV[\x81\x84R` \x84\x01\x90\x8C`\x80\x01`@\x84`\x05\x1B\x86\x84\x01\x01\x01\x11b\0\x0C\x03W`@\x84\x82\x01\x01\x91[`@\x84`\x05\x1B\x86\x84\x01\x01\x01\x83\x10b\0\x0E\x1AWPPPPP`@\x82\x01R\x81R` \x92\x83\x01\x92\x01b\0\0\x93V[\x82Q`\x01`\x01`\xE0\x1B\x03\x19\x81\x16\x81\x03b\0\x0C\x03W\x81R` \x92\x83\x01\x92\x01b\0\r\xEFV[``\x81\x01\x90\x81\x10`\x01`\x01`@\x1B\x03\x82\x11\x17b\0\x04\xE2W`@RV[`@\x81\x01\x90\x81\x10`\x01`\x01`@\x1B\x03\x82\x11\x17b\0\x04\xE2W`@RV[`\x1F\x90\x91\x01`\x1F\x19\x16\x81\x01\x90`\x01`\x01`@\x1B\x03\x82\x11\x90\x82\x10\x17b\0\x04\xE2W`@RV[`\x01`\x01`@\x1B\x03\x81\x11b\0\x04\xE2W`\x05\x1B` \x01\x90V[Q\x90`\x01`\x01`\xA0\x1B\x03\x82\x16\x82\x03b\0\x0C\x03WV[Q\x90`\x01`\x01`@\x1B\x03\x82\x16\x82\x03b\0\x0C\x03WV[`\0[\x83\x81\x10b\0\x0E\xEFWPP`\0\x91\x01RV[\x81\x81\x01Q\x83\x82\x01R` \x01b\0\x0E\xDEV[\x81\x81\x10b\0\x0F\x0CWPPV[`\0\x81U`\x01\x01b\0\x0F\0V[\x80Q\x82\x10\x15b\0\x0F.W` \x91`\x05\x1B\x01\x01\x90V[cNH{q`\xE0\x1B`\0R`2`\x04R`$`\0\xFD[\x90`\x03\x82\x10\x15b\0\x0B\x92WRV[\x90\x81Q\x80\x82R` \x80\x80\x93\x01\x93\x01\x91`\0[\x82\x81\x10b\0\x0FsWPPPP\x90V[\x83Q`\x01`\x01`\xE0\x1B\x03\x19\x16\x85R\x93\x81\x01\x93\x92\x81\x01\x92`\x01\x01b\0\x0FdV[\x90` \x91b\0\x0F\xAD\x81Q\x80\x92\x81\x85R\x85\x80\x86\x01\x91\x01b\0\x0E\xDBV[`\x1F\x01`\x1F\x19\x16\x01\x01\x90V[\x90`\0\x80Q` b\0\x1A}\x839\x81Q\x91R\x80T\x83\x10\x15b\0\x0F.W`\0R`\x1C` `\0 \x83`\x03\x1C\x01\x92`\x02\x1B\x16\x90V[`\0\x19\x81\x14b\0\x07cW`\x01\x01\x90V[\x80;\x15b\0\x10\x07WPPV[`@\x80Qc\x91\x984\xB9`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x90\x92\x16`\x04\x83\x01R`$\x82\x01R\x90\x81\x90b\0\x07\xB9\x90`D\x83\x01\x90b\0\x0F\x92V[\x90\x80\x82Q\x90\x81\x81R` \x80\x91\x01\x92\x81\x80\x84`\x05\x1B\x83\x01\x01\x95\x01\x93`\0\x91[\x84\x83\x10b\0\x10lWPPPPPP\x90V[\x90\x91\x92\x93\x94\x95\x84\x80b\0\x10\xAF`\x01\x93`\x1F\x19\x86\x82\x03\x01\x87R\x8AQ\x80Q\x82R\x85\x80`\xA0\x1B\x03\x84\x82\x01Q\x16\x84\x83\x01R`@\x80\x91\x01Q\x91``\x80\x92\x82\x01R\x01\x90b\0\x0F\x92V[\x98\x01\x93\x01\x93\x01\x91\x94\x93\x92\x90b\0\x10[V[\x90`\x01\x82\x81\x1C\x92\x16\x80\x15b\0\x10\xF2W[` \x83\x10\x14b\0\x10\xDCWV[cNH{q`\xE0\x1B`\0R`\"`\x04R`$`\0\xFD[\x91`\x7F\x16\x91b\0\x10\xD0V[\x91\x90`\x1F\x81\x11b\0\x11\rWPPPV[b\0\x11<\x92`\0R` `\0 \x90` `\x1F\x84\x01`\x05\x1C\x83\x01\x93\x10b\0\x11>W[`\x1F\x01`\x05\x1C\x01\x90b\0\x0F\0V[V[\x90\x91P\x81\x90b\0\x11.V[\x90\x80\x82\x14b\0\x122Wb\0\x11^\x81Tb\0\x10\xC0V[\x90`\x01`\x01`@\x1B\x03\x82\x11b\0\x04\xE2W\x81\x90b\0\x11\x88\x82b\0\x11\x81\x86Tb\0\x10\xC0V[\x86b\0\x10\xFDV[`\0\x90`\x1F\x83\x11`\x01\x14b\0\x11\xC2W`\0\x92b\0\x11\xB6W[PP\x81`\x01\x1B\x91`\0\x19\x90`\x03\x1B\x1C\x19\x16\x17\x90UV[\x01T\x90P8\x80b\0\x11\xA0V[\x81R` \x80\x82 \x85\x83R\x81\x83 \x93P\x90`\x1F\x19\x85\x16\x90\x83\x90[\x82\x82\x10b\0\x12\x18WPP\x90\x84`\x01\x95\x94\x93\x92\x10b\0\x11\xFEW[PPP\x81\x1B\x01\x90UV[\x01T`\0\x19`\xF8\x84`\x03\x1B\x16\x1C\x19\x16\x90U8\x80\x80b\0\x11\xF4V[\x84\x95\x81\x92\x95\x85\x01T\x81U`\x01\x80\x91\x01\x96\x01\x94\x01\x90b\0\x11\xDBV[PPV[`\x06T\x81\x10\x15b\0\x0F.W`\x06`\0R`\x03` `\0 \x91\x02\x01\x90`\0\x90V[\x90b\0\x13dW\x81Q\x81U` \x80\x83\x01Q`\x01\x80\x84\x01\x80T`\x01`\x01`\xA0\x1B\x03\x19\x16`\x01`\x01`\xA0\x1B\x03\x93\x90\x93\x16\x92\x90\x92\x17\x90\x91U`@\x90\x93\x01Q\x80Q`\x02\x90\x93\x01\x93\x92\x91\x90`\x01`\x01`@\x1B\x03\x83\x11b\0\x04\xE2Wb\0\x12\xC2\x83b\0\x12\xBB\x87Tb\0\x10\xC0V[\x87b\0\x10\xFDV[\x81`\x1F\x84\x11`\x01\x14b\0\x12\xFEWP\x92\x82\x93\x91\x83\x92`\0\x94b\0\x12\xF2W[PP\x1B\x91`\0\x19\x90`\x03\x1B\x1C\x19\x16\x17\x90UV[\x01Q\x92P8\x80b\0\x12\xDFV[\x91\x90\x83`\x1F\x19\x81\x16\x87`\0R\x84`\0 \x94`\0\x90[\x88\x83\x83\x10b\0\x13IWPPP\x10b\0\x13/WPPP\x81\x1B\x01\x90UV[\x01Q`\0\x19`\xF8\x84`\x03\x1B\x16\x1C\x19\x16\x90U8\x80\x80b\0\x11\xF4V[\x85\x87\x01Q\x88U\x90\x96\x01\x95\x94\x85\x01\x94\x87\x93P\x90\x81\x01\x90b\0\x13\x13V[cNH{q`\xE0\x1B`\0R`\0`\x04R`$`\0\xFD[`@Q\x90` \x91\x82\x81Rb\0\x13\x9B\x82Q`@\x85\x84\x01R``\x83\x01\x90b\0\x10=V[\x91\x7F~\xCD\xACH#4\xC3o\xCC\xBE7C\x18\xCF\xE7N\xA0\xC8\x18\x13\x94\x89\r\xDE\xC8\x94\xA1\x0F\x0F\xCCt\x81\x84\x82\x01\x92\x80`\x01\x80`@\x1B\x03\x95\x86\x86Q\x16`@\x83\x01R\x03\x90\xA1\x82`\x07T\x16\x80b\0\x16\xC5W[P`\x06\x90\x81T\x92h\x01\0\0\0\0\0\0\0\0\x94\x85\x85\x11b\0\x04\xE2W`\x08T\x85`\x08U\x80\x86\x10b\0\x16\rW[P`\0\x94\x84\x86R\x87\x86 `\x08\x87R\x88\x87 \x90\x87\x90[\x83\x82\x10b\0\x15\xB7WPPPP\x80`\x07T\x16\x91`\x01\x80`@\x1B\x03\x19\x92\x83`\tT\x16\x17`\tU\x83QQ\x93\x85T\x97\x87[\x86\x81\x10b\0\x155WPPPQ\x16\x90`\x07T\x16\x17`\x07U\x80\x84\x11b\0\x14tW[PPPPPV[\x83\x81\x10\x15b\0\x14mW\x81T\x80\x15b\0\x15!W`\0\x19\x01\x90b\0\x14\x96\x82b\0\x126V[\x92\x90\x92b\0\x15\rW\x84\x83U\x84`\x02`\x01\x94\x82\x86\x82\x01U\x01b\0\x14\xB9\x81Tb\0\x10\xC0V[\x80b\0\x14\xCCW[PPP\x83U\x01b\0\x14tV[\x82`\x1F\x80\x83\x11`\x01\x14b\0\x14\xE8WPPPU[\x848\x80b\0\x14\xC0V[\x83\x82R\x8B\x82 \x93\x91\x92b\0\x15\x05\x91\x01`\x05\x1C\x84\x01\x88\x85\x01b\0\x0F\0V[UUb\0\x14\xDFV[cNH{q`\xE0\x1B\x85R`\x04\x85\x90R`$\x85\xFD[cNH{q`\xE0\x1B\x84R`1`\x04R`$\x84\xFD[\x89\x81\x10\x15b\0\x15lW\x80b\0\x15eb\0\x15R`\x01\x93\x86Qb\0\x0F\x19V[Qb\0\x15^\x83b\0\x126V[\x90b\0\x12VV[\x01b\0\x14NV[b\0\x15y\x81\x84Qb\0\x0F\x19V[Q\x88T\x83\x81\x10\x15b\0\x15\xA3W`\x01\x92\x91b\0\x15^\x82\x85b\0\x15\x9D\x94\x01\x8DUb\0\x126V[b\0\x15eV[cNH{q`\xE0\x1B\x8BR`A`\x04R`$\x8B\xFD[\x80`\x01\x91\x84\x03b\0\x15\xD4W[`\x03\x80\x91\x01\x93\x01\x91\x01\x90\x91b\0\x14!V[\x80T\x84U\x81\x80\x85\x01\x90\x83\x80`\xA0\x1B\x03\x90\x83\x01T\x16\x83\x80`\xA0\x1B\x03\x19\x82T\x16\x17\x90Ub\0\x16\x07`\x02\x80\x83\x01\x90\x86\x01b\0\x11IV[b\0\x15\xC3V[`\x03\x90\x80\x82\x02\x90\x82\x82\x04\x03b\0\x07cW\x86\x82\x02\x82\x81\x04\x88\x03b\0\x07cW`\0\x90`\x08\x82R\x8A\x82 \x92\x83\x01\x92\x01[\x82\x81\x10b\0\x16KWPPPb\0\x14\x0CV[\x80\x82\x85\x92U\x82\x8C`\x01\x82\x81\x85\x01U`\x02\x84\x01\x90b\0\x16j\x82Tb\0\x10\xC0V[\x90\x81b\0\x16~W[PPPPP\x01b\0\x16:V[\x84\x90`\x1F\x80\x84\x11`\x01\x14b\0\x16\xA0WPPPP\x90PU[\x82\x8C8\x80\x80b\0\x16rV[\x84\x93\x95\x83\x95b\0\x16\xBD\x94R\x85 \x95\x01`\x05\x1C\x85\x01\x90\x85\x01b\0\x0F\0V[UUb\0\x16\x95V[\x83\x83Q\x16\x84`\tT\x16\x90\x81\x81\x14b\0\x18FW\x10b\0\x184W`@Q\x90b\0\x16\xEC\x82b\0\x0EYV[`\x06Tb\0\x16\xFA\x81b\0\x0E\x99V[\x90b\0\x17\n`@Q\x92\x83b\0\x0EuV[\x80\x82R\x87\x82\x01`\x06`\0R\x88`\0 `\0\x91[\x83\x83\x10b\0\x17NWPPP\x90\x83RP\x85\x82\x01Rb\0\x17<\x90\x82b\0\x18OV[b\0\x17HW8b\0\x13\xE2V[PPPPV[\x8A`@Qb\0\x17]\x81b\0\x0E=V[\x83T\x81R`\x01\x84\x01T`\x01`\x01`\xA0\x1B\x03\x16\x82\x82\x01R`@Q`\x02\x85\x01\x80T`\0\x91b\0\x17\x8A\x82b\0\x10\xC0V[\x80\x85R\x91`\x01\x81\x16\x90\x81\x15b\0\x18\x14WP`\x01\x14b\0\x17\xD0W[PP\x91\x81b\0\x17\xBC`\x01\x96\x93`\x03\x96\x95\x03\x82b\0\x0EuV[`@\x82\x01R\x81R\x01\x92\x01\x92\x01\x91\x90b\0\x17\x1DV[`\0\x90\x81R\x85\x81 \x90\x92P[\x81\x83\x10b\0\x17\xF5WPP\x81\x01\x83\x01\x81b\0\x17\xBCb\0\x17\xA4V[\x80`\x01\x91\x96\x92\x93\x94\x95\x96T\x83\x86\x88\x01\x01R\x01\x92\x01\x90\x8F\x94\x93\x92b\0\x17\xDCV[`\xFF\x19\x16\x85\x88\x01RPP\x15\x15`\x05\x1B\x82\x01\x84\x01\x90P\x81b\0\x17\xBCb\0\x17\xA4V[`@Qc7F\xBE%`\xE1\x1B\x81R`\x04\x90\xFD[PPPPPPPV[` \x80\x82\x01Q\x83\x82\x01Q\x91\x92\x91`\x01`\x01`@\x1B\x03\x91\x82\x16\x91\x16\x03b\0\x19\x01Wb\0\x18z\x81b\0\x19\tV[b\0\x18\x85\x84b\0\x19\tV[\x03b\0\x19\x01WQ\x80Q\x83QQ\x03b\0\x19\x01Wb\0\x18\xFAb\0\x18\xED\x91`@Q\x90\x81b\0\x18\xBB\x86\x82\x01\x92\x87\x84R`@\x83\x01\x90b\0\x10=V[\x03\x91b\0\x18\xD1`\x1F\x19\x93\x84\x81\x01\x83R\x82b\0\x0EuV[Q\x90 \x94Q`@Q\x93\x84\x91\x86\x83\x01\x96\x87R`@\x83\x01\x90b\0\x10=V[\x03\x90\x81\x01\x83R\x82b\0\x0EuV[Q\x90 \x14\x90V[PPP`\0\x90V[\x80QQ\x90`\0\x91\x82\x91[\x81\x83\x10b\0\x19!WPPP\x90V[\x90\x91\x92b\0\x191\x84\x83Qb\0\x0F\x19V[QQ\x81\x01\x80\x91\x11b\0\x07cW\x92`\x01\x01\x91\x90b\0\x19\x13V\xFE`\x80`@R6\x15`\x87W`\0\x805`\x01`\x01`\xE0\x1B\x03\x19\x16\x80\x82R\x7F\x80n\x0C\xBB\x9F\xCE)k\xBC3jH\xF4+\xF1\xDB\xC6\x97\"\xD1\x8D\x90\xD6\xFEp[u\x82\xC2\xBBK\xD2` R`@\x82 T`\x01`\x01`\xA0\x1B\x03\x16\x90\x81\x15`oWP\x81\x80\x916\x82\x807\x816\x91Z\xF4=\x82\x80>\x15`kW=\x90\xF3[=\x90\xFD[`$\x90`@Q\x90c\n\x82\xDDs`\xE3\x1B\x82R`\x04\x82\x01R\xFD[`\0\x805`\x01`\x01`\xE0\x1B\x03\x19\x16\x80\x82R\x7F\x80n\x0C\xBB\x9F\xCE)k\xBC3jH\xF4+\xF1\xDB\xC6\x97\"\xD1\x8D\x90\xD6\xFEp[u\x82\xC2\xBBK\xD2` R`@\x82 T`\x01`\x01`\xA0\x1B\x03\x16\x90\x81\x15`\xE9WP\x81\x80\x916\x82\x807\x816\x91Z\xF4=\x82\x80>\x15`kW=\x90\xF3[c\n\x82\xDDs`\xE3\x1B`\x80R`\x84R`$`\x80\xFD\xFE\xA2dipfsX\"\x12 z\xCD\xDF-\xF2Hf\x99\xE9\x86\x10\xBF*\x03\x16/n\x1C[4\x17k~\x19\xC6\x08\xEC\xAFk\xF4q\xB2dsolcC\0\x08\x13\x003\x80n\x0C\xBB\x9F\xCE)k\xBC3jH\xF4+\xF1\xDB\xC6\x97\"\xD1\x8D\x90\xD6\xFEp[u\x82\xC2\xBBK\xD3\x80n\x0C\xBB\x9F\xCE)k\xBC3jH\xF4+\xF1\xDB\xC6\x97\"\xD1\x8D\x90\xD6\xFEp[u\x82\xC2\xBBK\xD2"; + const __BYTECODE: &[u8] = b"`\x80`@R4b\0\x0C\x03Wb\0\x1A\xBD\x808\x03\x80\x91b\0\0 \x82`\x80b\0\x0EuV[`\x809`@\x81\x12b\0\x0C\x03W`\x80Q`\x01`\x01`@\x1B\x03\x81\x11b\0\x0C\x03W`\x80\x82\x01`\x9F\x82\x01\x12\x15b\0\x0C\x03W\x80`\x80\x01Q\x90b\0\0^\x82b\0\x0E\x99V[\x91b\0\0n`@Q\x93\x84b\0\x0EuV[\x80\x83R` \x83\x01\x80\x92\x85`\x80\x01` \x84`\x05\x1B\x83`\x80\x01\x01\x01\x11b\0\x0C\x03W`\xA0\x81\x01\x91[`\xA0`\x05\x85\x90\x1B\x83\x01\x01\x83\x10b\0\r*WPP`\xA0Q\x91PP`\x01`\x01`@\x1B\x03\x81\x11b\0\x0C\x03W`\xE0\x81\x85\x03\x12b\0\x0C\x03W`@Q\x93`\xE0\x85\x01`\x01`\x01`@\x1B\x03\x81\x11\x86\x82\x10\x17b\0\x04\xE2W`@\x81\x90R`\x80\x83\x01Q`\x01`\x01`@\x1B\x03\x81\x11b\0\x0C\x03W\x83`\x80\x01\x01`@\x81\x84`\x80\x01\x03\x12b\0\x0C\x03Wb\0\x01\x18\x82b\0\x0EYV[b\0\x01#\x81b\0\x0E\xC6V[\x82R` \x81\x01Q\x90`\x01`\x01`@\x1B\x03\x82\x11b\0\x0C\x03W\x01\x82`\x80\x01`\x1F\x82\x01\x12\x15b\0\x0C\x03W\x80Q\x90b\0\x01X\x82b\0\x0E\x99V[\x91b\0\x01h`@Q\x93\x84b\0\x0EuV[\x80\x83R` \x80\x84\x01\x91`\x05\x1B\x83\x01\x01\x91\x85`\x80\x01\x83\x11b\0\x0C\x03W` \x01\x90[\x82\x82\x10b\0\r\x0FWPPPa\x01\0\x87\x01R\x85Rb\0\x01\xA9`\xA0\x83\x01b\0\x0E\xC6V[` \x86\x01R`\xC0\x82\x01Q`@\x86\x01R`\xE0\x82\x01Q``\x86\x01Ra\x01\0\x82\x01Q`\xFF\x81\x16\x81\x03b\0\x0C\x03W`\x80\x86\x01Ra\x01 \x82\x01Q`\x01`\x01`@\x1B\x03\x81\x11b\0\x0C\x03W`\x80\x82\x01`\x9F\x84\x83\x01\x01\x12\x15b\0\x0C\x03W\x80\x83`\x80\x01\x01Qb\0\x02\x10\x81b\0\x0E\x99V[\x92b\0\x02 `@Q\x94\x85b\0\x0EuV[\x81\x84R` \x84\x01`\x80\x82\x01`\xA0\x87\x86\x01`\x05\x86\x90\x1B\x01\x01\x11b\0\x0C\x03W`\xA0\x86\x85\x01\x01\x90[`\xA0\x87\x86\x01`\x05\x86\x90\x1B\x01\x01\x82\x10b\0\x0C\x08W\x89\x89\x89`\xC0\x8A\x8A`\xA0\x86\x01R`\x80\x01\x01Qa\xFF\xFF\x81\x16\x81\x03b\0\x0C\x03W`\xC0\x84\x01R`@\x83\x01Q\x15b\0\x0B\xF1W` \x83\x01Q`\x01`\x01`@\x1B\x03\x16\x15b\0\x0B\xDFW`\xFF`\x80\x84\x01Q\x16`3\x81\x10\x90\x81\x15b\0\x0B\xD3W[Pb\0\x0B\xC1W\x7F\x80n\x0C\xBB\x9F\xCE)k\xBC3jH\xF4+\xF1\xDB\xC6\x97\"\xD1\x8D\x90\xD6\xFEp[u\x82\xC2\xBBK\xD5\x80T`\x01`\x01`\xA0\x1B\x03\x19\x163\x17\x90U`@Q`\x01`\x01`@\x1B\x03` \x82\x01\x90\x81\x11\x90\x82\x11\x17b\0\x04\xE2W` \x81\x01`@R`\0\x81R\x82Q`\0[\x81\x81\x10b\0\x05RWPP`@Q\x92``\x84\x01\x90``\x85RQ\x80\x91R`\x80\x84\x01\x90`\x80\x81`\x05\x1B\x86\x01\x01\x93\x91`\0\x90[\x82\x82\x10b\0\x04\xF8W\x87\x7F\x8F\xAAp\x87\x86q\xCC\xD2\x12\xD2\x07q\xB7\x95\xC5\n\xF8\xFD?\xF6\xCF'\xF4\xBD\xE5~]M\xE0\xAE\xB6s\x88\x80b\0\x03\x86\x8A\x8A`\0` \x85\x01R\x83\x82\x03`@\x85\x01Rb\0\x0F\x92V[\x03\x90\xA1\x80Q\x80Q`\x13\x80T`\x01`\x01`@\x1B\x03\x19\x90\x81\x16`\x01`\x01`@\x1B\x03\x93\x84\x16\x17\x90\x91U` \x90\x92\x01Q\x80Q\x93\x92\x91\x84\x11b\0\x04\xE2Wh\x01\0\0\0\0\0\0\0\0\x84\x11b\0\x04\xE2W` \x90`\x14T\x85`\x14U\x80\x86\x10b\0\x04\xC1W[P\x01\x92`\x14`\0R` `\0 `\0[\x82\x81\x10b\0\x04\xA3Wb\0\x04\x93`\xA0\x86`\x01\x87`@\x83\x01Q`\x15U\x81\x80`@\x1B\x03` \x84\x01Q\x16\x81`\x18T\x16\x17`\x18U``\x83\x01Q`\x16U`\xFF`\x80\x84\x01Q\x16`\xFF\x19`\x17T\x16\x17`\x17U`\rT\x16\x17`\rUa\xFF\xFF`\xC0\x82\x01Q\x16a\xFF\xFF\x19`\x19T\x16\x17`\x19Uh\x01\0\0\0\0\0\0\0\x01`\x01\x80`\x80\x1B\x03\x19`\"T\x16\x17`\"U\x01Q`@Q\x90b\0\x04\x84\x82b\0\x0EYV[\x81R`\0` \x82\x01Rb\0\x13zV[`@Qa\x013\x90\x81b\0\x19J\x829\xF3[\x85Q`\x01`\x01`\xA0\x1B\x03\x16\x81\x83\x01U` \x90\x95\x01\x94`\x01\x01b\0\x03\xF2V[b\0\x04\xDB\x90`\x14`\0R\x86\x84`\0 \x91\x82\x01\x91\x01b\0\x0F\0V[\x85b\0\x03\xE2V[cNH{q`\xE0\x1B`\0R`A`\x04R`$`\0\xFD[\x90\x91\x92\x94` \x80b\0\x05C`\x01\x93`\x7F\x19\x8B\x82\x03\x01\x86R```@\x8BQ\x87\x80`\xA0\x1B\x03\x81Q\x16\x84Rb\0\x052\x86\x82\x01Q\x87\x86\x01\x90b\0\x0FDV[\x01Q\x91\x81`@\x82\x01R\x01\x90b\0\x0FRV[\x97\x01\x92\x01\x92\x01\x90\x92\x91b\0\x03?V[`@b\0\x05`\x82\x87b\0\x0F\x19V[Q\x01Q`\x01`\x01`\xA0\x1B\x03b\0\x05w\x83\x88b\0\x0F\x19V[QQ\x16\x90\x80Q\x15b\0\x0B\xA8W` b\0\x05\x91\x84\x89b\0\x0F\x19V[Q\x01Q`\x03\x81\x10\x15b\0\x0B\x92W\x80b\0\x07\xBDWP\x81\x15b\0\x07\x92Wa\xFF\xFF`\0\x80Q` b\0\x1A}\x839\x81Q\x91RT\x16b\0\x06\x0E`@Qb\0\x05\xD3\x81b\0\x0E=V[`!\x81R\x7FdiamondCut: Add facet has no cod` \x82\x01R`e`\xF8\x1B`@\x82\x01R\x84b\0\x0F\xFBV[\x81Q\x91`\0\x91[\x83\x83\x10b\0\x06-WPPPPP`\x01\x90[\x01b\0\x03\x10V[`\x01`\x01`\xE0\x1B\x03\x19b\0\x06B\x84\x84b\0\x0F\x19V[Q\x16`\0\x81\x81R`\0\x80Q` b\0\x1A\x9D\x839\x81Q\x91R` R`@\x90 T\x90\x91\x90`\x01`\x01`\xA0\x1B\x03\x16b\0\x07yWb\0\x06\xE1`@Qb\0\x06\x84\x81b\0\x0EYV[\x87\x81Ra\xFF\xFF\x83\x16` \x80\x83\x01\x91\x82R`\0\x86\x81R`\0\x80Q` b\0\x1A\x9D\x839\x81Q\x91R\x90\x91R`@\x90 \x91Q\x82T\x91Q`\x01`\x01`\xB0\x1B\x03\x19\x90\x92\x16`\x01`\x01`\xA0\x1B\x03\x91\x90\x91\x16\x17`\xA0\x91\x90\x91\x1Ba\xFF\xFF`\xA0\x1B\x16\x17\x90UV[`\0\x80Q` b\0\x1A}\x839\x81Q\x91RT\x91h\x01\0\0\0\0\0\0\0\0\x83\x10\x15b\0\x04\xE2Wb\0\x07H\x90b\0\x07+`\x01\x94\x85\x81\x01`\0\x80Q` b\0\x1A}\x839\x81Q\x91RUb\0\x0F\xB9V[\x90\x91\x90c\xFF\xFF\xFF\xFF\x83T\x91`\x03\x1B\x92`\xE0\x1C\x83\x1B\x92\x1B\x19\x16\x17\x90UV[a\xFF\xFF\x80\x82\x16\x14b\0\x07cW\x92\x81\x01\x92a\xFF\xFF\x16\x01b\0\x06\x15V[cNH{q`\xE0\x1B`\0R`\x11`\x04R`$`\0\xFD[`@Qc\xEB\xBF]\x07`\xE0\x1B\x81R`\x04\x81\x01\x83\x90R`$\x90\xFD[`@Qc\x02\xB8\xDA\x07`\xE2\x1B\x81R` `\x04\x82\x01R\x90\x81\x90b\0\x07\xB9\x90`$\x83\x01\x90b\0\x0FRV[\x03\x90\xFD[`\x01\x81\x99\x95\x96\x92\x97\x93\x99\x98\x94\x98\x14`\0\x14b\0\tKWP\x87\x15b\0\t'Wb\0\x08/`@Qb\0\x07\xED\x81b\0\x0E=V[`(\x81R\x7FLibDiamondCut: Replace facet has` \x82\x01Rg no code`\xC0\x1B`@\x82\x01R\x89b\0\x0F\xFBV[`\0[\x86Q\x81\x10\x15b\0\t\x16W`\x01`\x01`\xE0\x1B\x03\x19b\0\x08Q\x82\x89b\0\x0F\x19V[Q\x16`\0\x81\x81R`\0\x80Q` b\0\x1A\x9D\x839\x81Q\x91R` R`@\x90 T`\x01`\x01`\xA0\x1B\x03\x160\x81\x14b\0\x08\xFDW\x8A\x81\x14b\0\x08\xE4W\x15b\0\x08\xCCW`\0\x90\x81R`\0\x80Q` b\0\x1A\x9D\x839\x81Q\x91R` R`@\x90 \x80T`\x01`\x01`\xA0\x1B\x03\x19\x16\x8A\x17\x90Ub\0\x08\xC6\x90b\0\x0F\xEBV[b\0\x082V[`$\x90`@Q\x90cty\xF99`\xE0\x1B\x82R`\x04\x82\x01R\xFD[`@Qc\x1A\xC6\xCE\x8D`\xE1\x1B\x81R`\x04\x81\x01\x83\x90R`$\x90\xFD[`@Qc)\x01\x80m`\xE1\x1B\x81R`\x04\x81\x01\x83\x90R`$\x90\xFD[P\x93\x92\x96P\x93P\x93`\x01\x90b\0\x06&V[`@Qc\xCD\x98\xA9o`\xE0\x1B\x81R` `\x04\x82\x01R\x80b\0\x07\xB9`$\x82\x01\x89b\0\x0FRV[`\x02\x81\x03b\0\x0BpWP`\0\x80Q` b\0\x1A}\x839\x81Q\x91RT\x97\x80b\0\x0BXWP`\0\x97[\x86Q\x89\x10\x15b\0\t\x16Wa\xFF\xFF\x98`\x01`\x01`\xE0\x1B\x03\x19b\0\t\x95\x82\x8Ab\0\x0F\x19V[Q\x16\x91\x82`\0R`\0\x80Q` b\0\x1A\x9D\x839\x81Q\x91R` R`@`\0 `@Q\x9B\x8C\x91b\0\t\xC5\x83b\0\x0EYV[T`\x01`\x01`\xA0\x1B\x03\x81\x16\x92\x83\x90R`\xA0\x1C\x16` \x8D\x01R\x15b\0\x0B?W\x8AQ`\x01`\x01`\xA0\x1B\x03\x160\x14b\0\x0B&W\x80\x15b\0\x07cW`\0\x19\x01\x8A\x81a\xFF\xFF` \x82\x9E\x01Q\x16\x03b\0\n\xA3W[PP`\0\x80Q` b\0\x1A}\x839\x81Q\x91RT\x91\x82\x15b\0\n\x8DWb\0\n\x86\x92`\0\x19\x01b\0\nB\x81b\0\x0F\xB9V[c\xFF\xFF\xFF\xFF\x82T\x91`\x03\x1B\x1B\x19\x16\x90U`\0\x80Q` b\0\x1A}\x839\x81Q\x91RU`\0R`\0\x80Q` b\0\x1A\x9D\x839\x81Q\x91R` R`\0`@\x81 Ub\0\x0F\xEBV[\x97b\0\trV[cNH{q`\xE0\x1B`\0R`1`\x04R`$`\0\xFD[a\xFF\xFF` b\0\n\xB7b\0\x0B\x1E\x94b\0\x0F\xB9V[\x90T\x90`\x03\x1B\x1C`\xE0\x1B\x92b\0\n\xD7\x84b\0\x07+\x85\x85\x85\x01Q\x16b\0\x0F\xB9V[\x01Q`\x01`\x01`\xE0\x1B\x03\x19\x90\x92\x16`\0\x90\x81R`\0\x80Q` b\0\x1A\x9D\x839\x81Q\x91R` R`@\x90 \x80Ta\xFF\xFF`\xA0\x1B\x19\x16\x91\x90\x92\x16`\xA0\x1Ba\xFF\xFF`\xA0\x1B\x16\x17\x90UV[\x89\x8Bb\0\n\x13V[`@Qc\r\xF5\xFDa`\xE3\x1B\x81R`\x04\x81\x01\x84\x90R`$\x90\xFD[`@Qcz\x08\xA2-`\xE0\x1B\x81R`\x04\x81\x01\x84\x90R`$\x90\xFD[`$\x90`@Q\x90c\xD0\x91\xBC\x81`\xE0\x1B\x82R`\x04\x82\x01R\xFD[`@Qc?\xF4\xD2\x0F`\xE1\x1B\x81R`$\x91b\0\x0B\x90\x90`\x04\x83\x01\x90b\0\x0FDV[\xFD[cNH{q`\xE0\x1B`\0R`!`\x04R`$`\0\xFD[`@Qc\xE7g\xF9\x1F`\xE0\x1B\x81R`\x04\x81\x01\x83\x90R`$\x90\xFD[`@Qcu\xC3\xB4'`\xE0\x1B\x81R`\x04\x90\xFD[`d\x91P\x11\x84b\0\x02\xAEV[`@Qc1/\x8E\x05`\xE0\x1B\x81R`\x04\x90\xFD[`@Qch\xF7\xA6u`\xE1\x1B\x81R`\x04\x90\xFD[`\0\x80\xFD[\x81Q\x90`\x01`\x01`@\x1B\x03\x82\x11b\0\x0C\x03W``\x88\x87\x01\x83\x01\x85\x03`\x1F\x19\x01\x12b\0\x0C\x03W`@Q\x91b\0\x0C<\x83b\0\x0E=V[\x86\x89\x01\x81\x01`\xA0\x81\x01Q\x84Rb\0\x0CV\x90`\xC0\x01b\0\x0E\xB1V[` \x84\x01R`\xE0\x89\x88\x01\x82\x01\x01Q\x90`\x01`\x01`@\x1B\x03\x82\x11b\0\x0C\x03W\x87\x8A`\x80\x01\x01\x01\x01\x90\x84`\x80\x01`?\x83\x01\x12\x15b\0\x0C\x03W` \x82\x01Q\x90`\x01`\x01`@\x1B\x03\x82\x11b\0\x0C\xFAW`@Q\x93b\0\x0C\xBB`\x1F\x84\x01`\x1F\x19\x16` \x01\x86b\0\x0EuV[\x82\x85R\x86`\x80\x01`@\x84\x86\x01\x01\x11b\0\x0C\x03W\x84b\0\x0C\xE7` \x96\x94\x87\x96`@\x88\x80\x98\x01\x91\x01b\0\x0E\xDBV[`@\x82\x01R\x81R\x01\x92\x01\x91\x90Pb\0\x02EV[`$`\0cNH{q`\xE0\x1B\x81R`A`\x04R\xFD[` \x80\x91b\0\r\x1E\x84b\0\x0E\xB1V[\x81R\x01\x91\x01\x90b\0\x01\x88V[\x82Q`\x01`\x01`@\x1B\x03\x81\x11b\0\x0C\x03W``\x90\x83\x01`\x80\x81\x01\x90\x89\x03`\x1F\x19\x01\x82\x13b\0\x0C\x03W`@Q\x91b\0\ra\x83b\0\x0E=V[b\0\ro` \x83\x01b\0\x0E\xB1V[\x83R`@\x82\x01Q`\x03\x81\x10\x15b\0\x0C\x03W` \x84\x01R\x81\x01Q`\x01`\x01`@\x1B\x03\x81\x11b\0\x0C\x03W\x89`\x80\x01`?\x82\x84\x01\x01\x12\x15b\0\x0C\x03W` \x81\x83\x01\x01Qb\0\r\xBA\x81b\0\x0E\x99V[\x92b\0\r\xCA`@Q\x94\x85b\0\x0EuV[\x81\x84R` \x84\x01\x90\x8C`\x80\x01`@\x84`\x05\x1B\x86\x84\x01\x01\x01\x11b\0\x0C\x03W`@\x84\x82\x01\x01\x91[`@\x84`\x05\x1B\x86\x84\x01\x01\x01\x83\x10b\0\x0E\x1AWPPPPP`@\x82\x01R\x81R` \x92\x83\x01\x92\x01b\0\0\x93V[\x82Q`\x01`\x01`\xE0\x1B\x03\x19\x81\x16\x81\x03b\0\x0C\x03W\x81R` \x92\x83\x01\x92\x01b\0\r\xEFV[``\x81\x01\x90\x81\x10`\x01`\x01`@\x1B\x03\x82\x11\x17b\0\x04\xE2W`@RV[`@\x81\x01\x90\x81\x10`\x01`\x01`@\x1B\x03\x82\x11\x17b\0\x04\xE2W`@RV[`\x1F\x90\x91\x01`\x1F\x19\x16\x81\x01\x90`\x01`\x01`@\x1B\x03\x82\x11\x90\x82\x10\x17b\0\x04\xE2W`@RV[`\x01`\x01`@\x1B\x03\x81\x11b\0\x04\xE2W`\x05\x1B` \x01\x90V[Q\x90`\x01`\x01`\xA0\x1B\x03\x82\x16\x82\x03b\0\x0C\x03WV[Q\x90`\x01`\x01`@\x1B\x03\x82\x16\x82\x03b\0\x0C\x03WV[`\0[\x83\x81\x10b\0\x0E\xEFWPP`\0\x91\x01RV[\x81\x81\x01Q\x83\x82\x01R` \x01b\0\x0E\xDEV[\x81\x81\x10b\0\x0F\x0CWPPV[`\0\x81U`\x01\x01b\0\x0F\0V[\x80Q\x82\x10\x15b\0\x0F.W` \x91`\x05\x1B\x01\x01\x90V[cNH{q`\xE0\x1B`\0R`2`\x04R`$`\0\xFD[\x90`\x03\x82\x10\x15b\0\x0B\x92WRV[\x90\x81Q\x80\x82R` \x80\x80\x93\x01\x93\x01\x91`\0[\x82\x81\x10b\0\x0FsWPPPP\x90V[\x83Q`\x01`\x01`\xE0\x1B\x03\x19\x16\x85R\x93\x81\x01\x93\x92\x81\x01\x92`\x01\x01b\0\x0FdV[\x90` \x91b\0\x0F\xAD\x81Q\x80\x92\x81\x85R\x85\x80\x86\x01\x91\x01b\0\x0E\xDBV[`\x1F\x01`\x1F\x19\x16\x01\x01\x90V[\x90`\0\x80Q` b\0\x1A}\x839\x81Q\x91R\x80T\x83\x10\x15b\0\x0F.W`\0R`\x1C` `\0 \x83`\x03\x1C\x01\x92`\x02\x1B\x16\x90V[`\0\x19\x81\x14b\0\x07cW`\x01\x01\x90V[\x80;\x15b\0\x10\x07WPPV[`@\x80Qc\x91\x984\xB9`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x90\x92\x16`\x04\x83\x01R`$\x82\x01R\x90\x81\x90b\0\x07\xB9\x90`D\x83\x01\x90b\0\x0F\x92V[\x90\x80\x82Q\x90\x81\x81R` \x80\x91\x01\x92\x81\x80\x84`\x05\x1B\x83\x01\x01\x95\x01\x93`\0\x91[\x84\x83\x10b\0\x10lWPPPPPP\x90V[\x90\x91\x92\x93\x94\x95\x84\x80b\0\x10\xAF`\x01\x93`\x1F\x19\x86\x82\x03\x01\x87R\x8AQ\x80Q\x82R\x85\x80`\xA0\x1B\x03\x84\x82\x01Q\x16\x84\x83\x01R`@\x80\x91\x01Q\x91``\x80\x92\x82\x01R\x01\x90b\0\x0F\x92V[\x98\x01\x93\x01\x93\x01\x91\x94\x93\x92\x90b\0\x10[V[\x90`\x01\x82\x81\x1C\x92\x16\x80\x15b\0\x10\xF2W[` \x83\x10\x14b\0\x10\xDCWV[cNH{q`\xE0\x1B`\0R`\"`\x04R`$`\0\xFD[\x91`\x7F\x16\x91b\0\x10\xD0V[\x91\x90`\x1F\x81\x11b\0\x11\rWPPPV[b\0\x11<\x92`\0R` `\0 \x90` `\x1F\x84\x01`\x05\x1C\x83\x01\x93\x10b\0\x11>W[`\x1F\x01`\x05\x1C\x01\x90b\0\x0F\0V[V[\x90\x91P\x81\x90b\0\x11.V[\x90\x80\x82\x14b\0\x122Wb\0\x11^\x81Tb\0\x10\xC0V[\x90`\x01`\x01`@\x1B\x03\x82\x11b\0\x04\xE2W\x81\x90b\0\x11\x88\x82b\0\x11\x81\x86Tb\0\x10\xC0V[\x86b\0\x10\xFDV[`\0\x90`\x1F\x83\x11`\x01\x14b\0\x11\xC2W`\0\x92b\0\x11\xB6W[PP\x81`\x01\x1B\x91`\0\x19\x90`\x03\x1B\x1C\x19\x16\x17\x90UV[\x01T\x90P8\x80b\0\x11\xA0V[\x81R` \x80\x82 \x85\x83R\x81\x83 \x93P\x90`\x1F\x19\x85\x16\x90\x83\x90[\x82\x82\x10b\0\x12\x18WPP\x90\x84`\x01\x95\x94\x93\x92\x10b\0\x11\xFEW[PPP\x81\x1B\x01\x90UV[\x01T`\0\x19`\xF8\x84`\x03\x1B\x16\x1C\x19\x16\x90U8\x80\x80b\0\x11\xF4V[\x84\x95\x81\x92\x95\x85\x01T\x81U`\x01\x80\x91\x01\x96\x01\x94\x01\x90b\0\x11\xDBV[PPV[`\x06T\x81\x10\x15b\0\x0F.W`\x06`\0R`\x03` `\0 \x91\x02\x01\x90`\0\x90V[\x90b\0\x13dW\x81Q\x81U` \x80\x83\x01Q`\x01\x80\x84\x01\x80T`\x01`\x01`\xA0\x1B\x03\x19\x16`\x01`\x01`\xA0\x1B\x03\x93\x90\x93\x16\x92\x90\x92\x17\x90\x91U`@\x90\x93\x01Q\x80Q`\x02\x90\x93\x01\x93\x92\x91\x90`\x01`\x01`@\x1B\x03\x83\x11b\0\x04\xE2Wb\0\x12\xC2\x83b\0\x12\xBB\x87Tb\0\x10\xC0V[\x87b\0\x10\xFDV[\x81`\x1F\x84\x11`\x01\x14b\0\x12\xFEWP\x92\x82\x93\x91\x83\x92`\0\x94b\0\x12\xF2W[PP\x1B\x91`\0\x19\x90`\x03\x1B\x1C\x19\x16\x17\x90UV[\x01Q\x92P8\x80b\0\x12\xDFV[\x91\x90\x83`\x1F\x19\x81\x16\x87`\0R\x84`\0 \x94`\0\x90[\x88\x83\x83\x10b\0\x13IWPPP\x10b\0\x13/WPPP\x81\x1B\x01\x90UV[\x01Q`\0\x19`\xF8\x84`\x03\x1B\x16\x1C\x19\x16\x90U8\x80\x80b\0\x11\xF4V[\x85\x87\x01Q\x88U\x90\x96\x01\x95\x94\x85\x01\x94\x87\x93P\x90\x81\x01\x90b\0\x13\x13V[cNH{q`\xE0\x1B`\0R`\0`\x04R`$`\0\xFD[`@Q\x90` \x91\x82\x81Rb\0\x13\x9B\x82Q`@\x85\x84\x01R``\x83\x01\x90b\0\x10=V[\x91\x7F~\xCD\xACH#4\xC3o\xCC\xBE7C\x18\xCF\xE7N\xA0\xC8\x18\x13\x94\x89\r\xDE\xC8\x94\xA1\x0F\x0F\xCCt\x81\x84\x82\x01\x92\x80`\x01\x80`@\x1B\x03\x95\x86\x86Q\x16`@\x83\x01R\x03\x90\xA1\x82`\x07T\x16\x80b\0\x16\xC5W[P`\x06\x90\x81T\x92h\x01\0\0\0\0\0\0\0\0\x94\x85\x85\x11b\0\x04\xE2W`\x08T\x85`\x08U\x80\x86\x10b\0\x16\rW[P`\0\x94\x84\x86R\x87\x86 `\x08\x87R\x88\x87 \x90\x87\x90[\x83\x82\x10b\0\x15\xB7WPPPP\x80`\x07T\x16\x91`\x01\x80`@\x1B\x03\x19\x92\x83`\tT\x16\x17`\tU\x83QQ\x93\x85T\x97\x87[\x86\x81\x10b\0\x155WPPPQ\x16\x90`\x07T\x16\x17`\x07U\x80\x84\x11b\0\x14tW[PPPPPV[\x83\x81\x10\x15b\0\x14mW\x81T\x80\x15b\0\x15!W`\0\x19\x01\x90b\0\x14\x96\x82b\0\x126V[\x92\x90\x92b\0\x15\rW\x84\x83U\x84`\x02`\x01\x94\x82\x86\x82\x01U\x01b\0\x14\xB9\x81Tb\0\x10\xC0V[\x80b\0\x14\xCCW[PPP\x83U\x01b\0\x14tV[\x82`\x1F\x80\x83\x11`\x01\x14b\0\x14\xE8WPPPU[\x848\x80b\0\x14\xC0V[\x83\x82R\x8B\x82 \x93\x91\x92b\0\x15\x05\x91\x01`\x05\x1C\x84\x01\x88\x85\x01b\0\x0F\0V[UUb\0\x14\xDFV[cNH{q`\xE0\x1B\x85R`\x04\x85\x90R`$\x85\xFD[cNH{q`\xE0\x1B\x84R`1`\x04R`$\x84\xFD[\x89\x81\x10\x15b\0\x15lW\x80b\0\x15eb\0\x15R`\x01\x93\x86Qb\0\x0F\x19V[Qb\0\x15^\x83b\0\x126V[\x90b\0\x12VV[\x01b\0\x14NV[b\0\x15y\x81\x84Qb\0\x0F\x19V[Q\x88T\x83\x81\x10\x15b\0\x15\xA3W`\x01\x92\x91b\0\x15^\x82\x85b\0\x15\x9D\x94\x01\x8DUb\0\x126V[b\0\x15eV[cNH{q`\xE0\x1B\x8BR`A`\x04R`$\x8B\xFD[\x80`\x01\x91\x84\x03b\0\x15\xD4W[`\x03\x80\x91\x01\x93\x01\x91\x01\x90\x91b\0\x14!V[\x80T\x84U\x81\x80\x85\x01\x90\x83\x80`\xA0\x1B\x03\x90\x83\x01T\x16\x83\x80`\xA0\x1B\x03\x19\x82T\x16\x17\x90Ub\0\x16\x07`\x02\x80\x83\x01\x90\x86\x01b\0\x11IV[b\0\x15\xC3V[`\x03\x90\x80\x82\x02\x90\x82\x82\x04\x03b\0\x07cW\x86\x82\x02\x82\x81\x04\x88\x03b\0\x07cW`\0\x90`\x08\x82R\x8A\x82 \x92\x83\x01\x92\x01[\x82\x81\x10b\0\x16KWPPPb\0\x14\x0CV[\x80\x82\x85\x92U\x82\x8C`\x01\x82\x81\x85\x01U`\x02\x84\x01\x90b\0\x16j\x82Tb\0\x10\xC0V[\x90\x81b\0\x16~W[PPPPP\x01b\0\x16:V[\x84\x90`\x1F\x80\x84\x11`\x01\x14b\0\x16\xA0WPPPP\x90PU[\x82\x8C8\x80\x80b\0\x16rV[\x84\x93\x95\x83\x95b\0\x16\xBD\x94R\x85 \x95\x01`\x05\x1C\x85\x01\x90\x85\x01b\0\x0F\0V[UUb\0\x16\x95V[\x83\x83Q\x16\x84`\tT\x16\x90\x81\x81\x14b\0\x18FW\x10b\0\x184W`@Q\x90b\0\x16\xEC\x82b\0\x0EYV[`\x06Tb\0\x16\xFA\x81b\0\x0E\x99V[\x90b\0\x17\n`@Q\x92\x83b\0\x0EuV[\x80\x82R\x87\x82\x01`\x06`\0R\x88`\0 `\0\x91[\x83\x83\x10b\0\x17NWPPP\x90\x83RP\x85\x82\x01Rb\0\x17<\x90\x82b\0\x18OV[b\0\x17HW8b\0\x13\xE2V[PPPPV[\x8A`@Qb\0\x17]\x81b\0\x0E=V[\x83T\x81R`\x01\x84\x01T`\x01`\x01`\xA0\x1B\x03\x16\x82\x82\x01R`@Q`\x02\x85\x01\x80T`\0\x91b\0\x17\x8A\x82b\0\x10\xC0V[\x80\x85R\x91`\x01\x81\x16\x90\x81\x15b\0\x18\x14WP`\x01\x14b\0\x17\xD0W[PP\x91\x81b\0\x17\xBC`\x01\x96\x93`\x03\x96\x95\x03\x82b\0\x0EuV[`@\x82\x01R\x81R\x01\x92\x01\x92\x01\x91\x90b\0\x17\x1DV[`\0\x90\x81R\x85\x81 \x90\x92P[\x81\x83\x10b\0\x17\xF5WPP\x81\x01\x83\x01\x81b\0\x17\xBCb\0\x17\xA4V[\x80`\x01\x91\x96\x92\x93\x94\x95\x96T\x83\x86\x88\x01\x01R\x01\x92\x01\x90\x8F\x94\x93\x92b\0\x17\xDCV[`\xFF\x19\x16\x85\x88\x01RPP\x15\x15`\x05\x1B\x82\x01\x84\x01\x90P\x81b\0\x17\xBCb\0\x17\xA4V[`@Qc7F\xBE%`\xE1\x1B\x81R`\x04\x90\xFD[PPPPPPPV[` \x80\x82\x01Q\x83\x82\x01Q\x91\x92\x91`\x01`\x01`@\x1B\x03\x91\x82\x16\x91\x16\x03b\0\x19\x01Wb\0\x18z\x81b\0\x19\tV[b\0\x18\x85\x84b\0\x19\tV[\x03b\0\x19\x01WQ\x80Q\x83QQ\x03b\0\x19\x01Wb\0\x18\xFAb\0\x18\xED\x91`@Q\x90\x81b\0\x18\xBB\x86\x82\x01\x92\x87\x84R`@\x83\x01\x90b\0\x10=V[\x03\x91b\0\x18\xD1`\x1F\x19\x93\x84\x81\x01\x83R\x82b\0\x0EuV[Q\x90 \x94Q`@Q\x93\x84\x91\x86\x83\x01\x96\x87R`@\x83\x01\x90b\0\x10=V[\x03\x90\x81\x01\x83R\x82b\0\x0EuV[Q\x90 \x14\x90V[PPP`\0\x90V[\x80QQ\x90`\0\x91\x82\x91[\x81\x83\x10b\0\x19!WPPP\x90V[\x90\x91\x92b\0\x191\x84\x83Qb\0\x0F\x19V[QQ\x81\x01\x80\x91\x11b\0\x07cW\x92`\x01\x01\x91\x90b\0\x19\x13V\xFE`\x80`@R6\x15`\x87W`\0\x805`\x01`\x01`\xE0\x1B\x03\x19\x16\x80\x82R\x7F\x80n\x0C\xBB\x9F\xCE)k\xBC3jH\xF4+\xF1\xDB\xC6\x97\"\xD1\x8D\x90\xD6\xFEp[u\x82\xC2\xBBK\xD2` R`@\x82 T`\x01`\x01`\xA0\x1B\x03\x16\x90\x81\x15`oWP\x81\x80\x916\x82\x807\x816\x91Z\xF4=\x82\x80>\x15`kW=\x90\xF3[=\x90\xFD[`$\x90`@Q\x90c\n\x82\xDDs`\xE3\x1B\x82R`\x04\x82\x01R\xFD[`\0\x805`\x01`\x01`\xE0\x1B\x03\x19\x16\x80\x82R\x7F\x80n\x0C\xBB\x9F\xCE)k\xBC3jH\xF4+\xF1\xDB\xC6\x97\"\xD1\x8D\x90\xD6\xFEp[u\x82\xC2\xBBK\xD2` R`@\x82 T`\x01`\x01`\xA0\x1B\x03\x16\x90\x81\x15`\xE9WP\x81\x80\x916\x82\x807\x816\x91Z\xF4=\x82\x80>\x15`kW=\x90\xF3[c\n\x82\xDDs`\xE3\x1B`\x80R`\x84R`$`\x80\xFD\xFE\xA2dipfsX\"\x12 \xC2\x918\x90\x89\xFC\xAFgU*\xA9\x0E\xF5\x15\x1B\x95g\xC3q\xDCdT4\xD4!\xE2+\xF2\x0B\xB5V\xA5dsolcC\0\x08\x13\x003\x80n\x0C\xBB\x9F\xCE)k\xBC3jH\xF4+\xF1\xDB\xC6\x97\"\xD1\x8D\x90\xD6\xFEp[u\x82\xC2\xBBK\xD3\x80n\x0C\xBB\x9F\xCE)k\xBC3jH\xF4+\xF1\xDB\xC6\x97\"\xD1\x8D\x90\xD6\xFEp[u\x82\xC2\xBBK\xD2"; /// The bytecode of the contract. pub static GATEWAYDIAMOND_BYTECODE: ::ethers::core::types::Bytes = ::ethers::core::types::Bytes::from_static(__BYTECODE); #[rustfmt::skip] - const __DEPLOYED_BYTECODE: &[u8] = b"`\x80`@R6\x15`\x87W`\0\x805`\x01`\x01`\xE0\x1B\x03\x19\x16\x80\x82R\x7F\x80n\x0C\xBB\x9F\xCE)k\xBC3jH\xF4+\xF1\xDB\xC6\x97\"\xD1\x8D\x90\xD6\xFEp[u\x82\xC2\xBBK\xD2` R`@\x82 T`\x01`\x01`\xA0\x1B\x03\x16\x90\x81\x15`oWP\x81\x80\x916\x82\x807\x816\x91Z\xF4=\x82\x80>\x15`kW=\x90\xF3[=\x90\xFD[`$\x90`@Q\x90c\n\x82\xDDs`\xE3\x1B\x82R`\x04\x82\x01R\xFD[`\0\x805`\x01`\x01`\xE0\x1B\x03\x19\x16\x80\x82R\x7F\x80n\x0C\xBB\x9F\xCE)k\xBC3jH\xF4+\xF1\xDB\xC6\x97\"\xD1\x8D\x90\xD6\xFEp[u\x82\xC2\xBBK\xD2` R`@\x82 T`\x01`\x01`\xA0\x1B\x03\x16\x90\x81\x15`\xE9WP\x81\x80\x916\x82\x807\x816\x91Z\xF4=\x82\x80>\x15`kW=\x90\xF3[c\n\x82\xDDs`\xE3\x1B`\x80R`\x84R`$`\x80\xFD\xFE\xA2dipfsX\"\x12 z\xCD\xDF-\xF2Hf\x99\xE9\x86\x10\xBF*\x03\x16/n\x1C[4\x17k~\x19\xC6\x08\xEC\xAFk\xF4q\xB2dsolcC\0\x08\x13\x003"; + const __DEPLOYED_BYTECODE: &[u8] = b"`\x80`@R6\x15`\x87W`\0\x805`\x01`\x01`\xE0\x1B\x03\x19\x16\x80\x82R\x7F\x80n\x0C\xBB\x9F\xCE)k\xBC3jH\xF4+\xF1\xDB\xC6\x97\"\xD1\x8D\x90\xD6\xFEp[u\x82\xC2\xBBK\xD2` R`@\x82 T`\x01`\x01`\xA0\x1B\x03\x16\x90\x81\x15`oWP\x81\x80\x916\x82\x807\x816\x91Z\xF4=\x82\x80>\x15`kW=\x90\xF3[=\x90\xFD[`$\x90`@Q\x90c\n\x82\xDDs`\xE3\x1B\x82R`\x04\x82\x01R\xFD[`\0\x805`\x01`\x01`\xE0\x1B\x03\x19\x16\x80\x82R\x7F\x80n\x0C\xBB\x9F\xCE)k\xBC3jH\xF4+\xF1\xDB\xC6\x97\"\xD1\x8D\x90\xD6\xFEp[u\x82\xC2\xBBK\xD2` R`@\x82 T`\x01`\x01`\xA0\x1B\x03\x16\x90\x81\x15`\xE9WP\x81\x80\x916\x82\x807\x816\x91Z\xF4=\x82\x80>\x15`kW=\x90\xF3[c\n\x82\xDDs`\xE3\x1B`\x80R`\x84R`$`\x80\xFD\xFE\xA2dipfsX\"\x12 \xC2\x918\x90\x89\xFC\xAFgU*\xA9\x0E\xF5\x15\x1B\x95g\xC3q\xDCdT4\xD4!\xE2+\xF2\x0B\xB5V\xA5dsolcC\0\x08\x13\x003"; /// The deployed bytecode of the contract. pub static GATEWAYDIAMOND_DEPLOYED_BYTECODE: ::ethers::core::types::Bytes = ::ethers::core::types::Bytes::from_static(__DEPLOYED_BYTECODE); diff --git a/binding/src/gateway_router_facet.rs b/binding/src/gateway_router_facet.rs index 142d6f2a2..8d958b0ee 100644 --- a/binding/src/gateway_router_facet.rs +++ b/binding/src/gateway_router_facet.rs @@ -587,28 +587,6 @@ pub mod gateway_router_facet { }, ], ), - ( - ::std::borrow::ToOwned::to_owned("CheckpointInfoAlreadyExists"), - ::std::vec![ - ::ethers::core::abi::ethabi::AbiError { - name: ::std::borrow::ToOwned::to_owned( - "CheckpointInfoAlreadyExists", - ), - inputs: ::std::vec![], - }, - ], - ), - ( - ::std::borrow::ToOwned::to_owned("CheckpointMembershipNotCreated"), - ::std::vec![ - ::ethers::core::abi::ethabi::AbiError { - name: ::std::borrow::ToOwned::to_owned( - "CheckpointMembershipNotCreated", - ), - inputs: ::std::vec![], - }, - ], - ), ( ::std::borrow::ToOwned::to_owned("CheckpointNotCreated"), ::std::vec![ @@ -1139,38 +1117,6 @@ pub mod gateway_router_facet { abi = "CheckpointAlreadyProcessed()" )] pub struct CheckpointAlreadyProcessed; - ///Custom Error type `CheckpointInfoAlreadyExists` with signature `CheckpointInfoAlreadyExists()` and selector `0xa04ff7c7` - #[derive( - Clone, - ::ethers::contract::EthError, - ::ethers::contract::EthDisplay, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[etherror( - name = "CheckpointInfoAlreadyExists", - abi = "CheckpointInfoAlreadyExists()" - )] - pub struct CheckpointInfoAlreadyExists; - ///Custom Error type `CheckpointMembershipNotCreated` with signature `CheckpointMembershipNotCreated()` and selector `0x009f833a` - #[derive( - Clone, - ::ethers::contract::EthError, - ::ethers::contract::EthDisplay, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[etherror( - name = "CheckpointMembershipNotCreated", - abi = "CheckpointMembershipNotCreated()" - )] - pub struct CheckpointMembershipNotCreated; ///Custom Error type `CheckpointNotCreated` with signature `CheckpointNotCreated()` and selector `0x58cdd2e7` #[derive( Clone, @@ -1546,8 +1492,6 @@ pub mod gateway_router_facet { CannotConfirmFutureChanges(CannotConfirmFutureChanges), CheckpointAlreadyExists(CheckpointAlreadyExists), CheckpointAlreadyProcessed(CheckpointAlreadyProcessed), - CheckpointInfoAlreadyExists(CheckpointInfoAlreadyExists), - CheckpointMembershipNotCreated(CheckpointMembershipNotCreated), CheckpointNotCreated(CheckpointNotCreated), FailedAddIncompleteCheckpoint(FailedAddIncompleteCheckpoint), FailedAddSignatory(FailedAddSignatory), @@ -1618,16 +1562,6 @@ pub mod gateway_router_facet { { return Ok(Self::CheckpointAlreadyProcessed(decoded)); } - if let Ok(decoded) = - ::decode(data) - { - return Ok(Self::CheckpointInfoAlreadyExists(decoded)); - } - if let Ok(decoded) = - ::decode(data) - { - return Ok(Self::CheckpointMembershipNotCreated(decoded)); - } if let Ok(decoded) = ::decode(data) { @@ -1767,12 +1701,6 @@ pub mod gateway_router_facet { Self::CheckpointAlreadyProcessed(element) => { ::ethers::core::abi::AbiEncode::encode(element) } - Self::CheckpointInfoAlreadyExists(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::CheckpointMembershipNotCreated(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } Self::CheckpointNotCreated(element) => { ::ethers::core::abi::AbiEncode::encode(element) } @@ -1866,14 +1794,6 @@ pub mod gateway_router_facet { == ::selector() => { true } - _ if selector - == ::selector() => { - true - } - _ if selector - == ::selector() => { - true - } _ if selector == ::selector() => { true @@ -1993,10 +1913,6 @@ pub mod gateway_router_facet { Self::CannotConfirmFutureChanges(element) => ::core::fmt::Display::fmt(element, f), Self::CheckpointAlreadyExists(element) => ::core::fmt::Display::fmt(element, f), Self::CheckpointAlreadyProcessed(element) => ::core::fmt::Display::fmt(element, f), - Self::CheckpointInfoAlreadyExists(element) => ::core::fmt::Display::fmt(element, f), - Self::CheckpointMembershipNotCreated(element) => { - ::core::fmt::Display::fmt(element, f) - } Self::CheckpointNotCreated(element) => ::core::fmt::Display::fmt(element, f), Self::FailedAddIncompleteCheckpoint(element) => { ::core::fmt::Display::fmt(element, f) @@ -2069,16 +1985,6 @@ pub mod gateway_router_facet { Self::CheckpointAlreadyProcessed(value) } } - impl ::core::convert::From for GatewayRouterFacetErrors { - fn from(value: CheckpointInfoAlreadyExists) -> Self { - Self::CheckpointInfoAlreadyExists(value) - } - } - impl ::core::convert::From for GatewayRouterFacetErrors { - fn from(value: CheckpointMembershipNotCreated) -> Self { - Self::CheckpointMembershipNotCreated(value) - } - } impl ::core::convert::From for GatewayRouterFacetErrors { fn from(value: CheckpointNotCreated) -> Self { Self::CheckpointNotCreated(value) diff --git a/binding/src/lib_staking.rs b/binding/src/lib_staking.rs index bdb95d6d5..8c1a624a6 100644 --- a/binding/src/lib_staking.rs +++ b/binding/src/lib_staking.rs @@ -100,12 +100,12 @@ pub mod lib_staking { pub static LIBSTAKING_ABI: ::ethers::contract::Lazy<::ethers::core::abi::Abi> = ::ethers::contract::Lazy::new(__abi); #[rustfmt::skip] - const __BYTECODE: &[u8] = b"`\x80\x80`@R4a\0\x1CWa\x029\x90\x81a\0\"\x8290\x81`=\x01R\xF3[`\0\x80\xFD\xFE`\x80`@\x81\x81R`\x04\x90\x816\x10\x15a\0\x16W`\0\x80\xFD[`\0\x92\x835`\xE0\x1C\x90\x81c!\xEE\xF6\x06\x14a\x01\xEDWPc\x82\x98^\x0B\x14a\0:W`\0\x80\xFD[0\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x14a\x01\xE9W` 6`\x03\x19\x01\x12a\x01\xE9W\x815`\x01`\x01`\xA0\x1B\x03\x80\x82\x16\x90\x81\x83\x03a\x01\xE5W`\x01`\x01`\xA0\x1B\x03\x83\x16`\0\x90\x81R`\x1C` R`@\x90 T\x92\x83\x15a\x01\xD5W`\x01`\x01`\xA0\x1B\x03\x16`\0\x90\x81R`\x1C` R`@\x90 \x86\x90U`\tT\x86\x91\x16\x80;\x15a\x01\xD1W\x81\x90`$\x86Q\x80\x94\x81\x93clq*\xB9`\xE1\x1B\x83R\x88\x8B\x84\x01RZ\xF1\x80\x15a\x01\xC7Wa\x01\x99W[P\x81G\x10a\x01\x83W\x84\x80\x80\x93\x81\x93Z\xF1=\x15a\x01~Wg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF=\x81\x81\x11a\x01kW\x83Q\x91`\x1F\x82\x01`\x1F\x19\x90\x81\x16`?\x01\x16\x83\x01\x90\x81\x11\x83\x82\x10\x17a\x01VW\x84R\x81R\x84` =\x92\x01>[\x15a\x01IW\x82\x80\xF3[Qc\n\x12\xF5!`\xE1\x1B\x81R\xFD[`A\x86cNH{q`\xE0\x1B`\0RR`$`\0\xFD[cNH{q`\xE0\x1B\x86R`A\x85R`$\x86\xFD[a\x01@V[\x82Qc\xCDx`Y`\xE0\x1B\x81R0\x81\x86\x01R`$\x90\xFD[g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x96\x92\x96\x11a\x01\xB4W\x83R\x938a\0\xEFV[cNH{q`\xE0\x1B\x82R`A\x85R`$\x82\xFD[\x84Q=\x88\x82>=\x90\xFD[P\x80\xFD[\x84Qcg0\x0F\x91`\xE1\x1B\x81R\x86\x90\xFD[\x85\x80\xFD[\x82\x80\xFD[\x84\x90\x81`\x03\x196\x01\x12a\x01\xD1W\x80`\x01` \x92R\xF3\xFE\xA2dipfsX\"\x12 \xC0>\x9Ec8)\x8F\x13\\\xF1\x9FK\xF5\xC51T\x95s\xE7\xDA\xCF|\xCB\xE0g\xA3\xF3-\x85;!\xEAdsolcC\0\x08\x13\x003"; + const __BYTECODE: &[u8] = b"`\x80\x80`@R4a\0\x1CWa\x029\x90\x81a\0\"\x8290\x81`=\x01R\xF3[`\0\x80\xFD\xFE`\x80`@\x81\x81R`\x04\x90\x816\x10\x15a\0\x16W`\0\x80\xFD[`\0\x92\x835`\xE0\x1C\x90\x81c!\xEE\xF6\x06\x14a\x01\xEDWPc\x82\x98^\x0B\x14a\0:W`\0\x80\xFD[0\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x14a\x01\xE9W` 6`\x03\x19\x01\x12a\x01\xE9W\x815`\x01`\x01`\xA0\x1B\x03\x80\x82\x16\x90\x81\x83\x03a\x01\xE5W`\x01`\x01`\xA0\x1B\x03\x83\x16`\0\x90\x81R`\x1C` R`@\x90 T\x92\x83\x15a\x01\xD5W`\x01`\x01`\xA0\x1B\x03\x16`\0\x90\x81R`\x1C` R`@\x90 \x86\x90U`\tT\x86\x91\x16\x80;\x15a\x01\xD1W\x81\x90`$\x86Q\x80\x94\x81\x93clq*\xB9`\xE1\x1B\x83R\x88\x8B\x84\x01RZ\xF1\x80\x15a\x01\xC7Wa\x01\x99W[P\x81G\x10a\x01\x83W\x84\x80\x80\x93\x81\x93Z\xF1=\x15a\x01~Wg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF=\x81\x81\x11a\x01kW\x83Q\x91`\x1F\x82\x01`\x1F\x19\x90\x81\x16`?\x01\x16\x83\x01\x90\x81\x11\x83\x82\x10\x17a\x01VW\x84R\x81R\x84` =\x92\x01>[\x15a\x01IW\x82\x80\xF3[Qc\n\x12\xF5!`\xE1\x1B\x81R\xFD[`A\x86cNH{q`\xE0\x1B`\0RR`$`\0\xFD[cNH{q`\xE0\x1B\x86R`A\x85R`$\x86\xFD[a\x01@V[\x82Qc\xCDx`Y`\xE0\x1B\x81R0\x81\x86\x01R`$\x90\xFD[g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x96\x92\x96\x11a\x01\xB4W\x83R\x938a\0\xEFV[cNH{q`\xE0\x1B\x82R`A\x85R`$\x82\xFD[\x84Q=\x88\x82>=\x90\xFD[P\x80\xFD[\x84Qcg0\x0F\x91`\xE1\x1B\x81R\x86\x90\xFD[\x85\x80\xFD[\x82\x80\xFD[\x84\x90\x81`\x03\x196\x01\x12a\x01\xD1W\x80`\x01` \x92R\xF3\xFE\xA2dipfsX\"\x12 \xDC\xAF\x1C\xF2g\xBF\xE5,\xCE]fl\x91\xD6\x9F\xFB\x14&\xB0\x87L \r)\x98L\xBE\t\xB9\xE1budsolcC\0\x08\x13\x003"; /// The bytecode of the contract. pub static LIBSTAKING_BYTECODE: ::ethers::core::types::Bytes = ::ethers::core::types::Bytes::from_static(__BYTECODE); #[rustfmt::skip] - const __DEPLOYED_BYTECODE: &[u8] = b"`\x80`@\x81\x81R`\x04\x90\x816\x10\x15a\0\x16W`\0\x80\xFD[`\0\x92\x835`\xE0\x1C\x90\x81c!\xEE\xF6\x06\x14a\x01\xEDWPc\x82\x98^\x0B\x14a\0:W`\0\x80\xFD[0\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x14a\x01\xE9W` 6`\x03\x19\x01\x12a\x01\xE9W\x815`\x01`\x01`\xA0\x1B\x03\x80\x82\x16\x90\x81\x83\x03a\x01\xE5W`\x01`\x01`\xA0\x1B\x03\x83\x16`\0\x90\x81R`\x1C` R`@\x90 T\x92\x83\x15a\x01\xD5W`\x01`\x01`\xA0\x1B\x03\x16`\0\x90\x81R`\x1C` R`@\x90 \x86\x90U`\tT\x86\x91\x16\x80;\x15a\x01\xD1W\x81\x90`$\x86Q\x80\x94\x81\x93clq*\xB9`\xE1\x1B\x83R\x88\x8B\x84\x01RZ\xF1\x80\x15a\x01\xC7Wa\x01\x99W[P\x81G\x10a\x01\x83W\x84\x80\x80\x93\x81\x93Z\xF1=\x15a\x01~Wg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF=\x81\x81\x11a\x01kW\x83Q\x91`\x1F\x82\x01`\x1F\x19\x90\x81\x16`?\x01\x16\x83\x01\x90\x81\x11\x83\x82\x10\x17a\x01VW\x84R\x81R\x84` =\x92\x01>[\x15a\x01IW\x82\x80\xF3[Qc\n\x12\xF5!`\xE1\x1B\x81R\xFD[`A\x86cNH{q`\xE0\x1B`\0RR`$`\0\xFD[cNH{q`\xE0\x1B\x86R`A\x85R`$\x86\xFD[a\x01@V[\x82Qc\xCDx`Y`\xE0\x1B\x81R0\x81\x86\x01R`$\x90\xFD[g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x96\x92\x96\x11a\x01\xB4W\x83R\x938a\0\xEFV[cNH{q`\xE0\x1B\x82R`A\x85R`$\x82\xFD[\x84Q=\x88\x82>=\x90\xFD[P\x80\xFD[\x84Qcg0\x0F\x91`\xE1\x1B\x81R\x86\x90\xFD[\x85\x80\xFD[\x82\x80\xFD[\x84\x90\x81`\x03\x196\x01\x12a\x01\xD1W\x80`\x01` \x92R\xF3\xFE\xA2dipfsX\"\x12 \xC0>\x9Ec8)\x8F\x13\\\xF1\x9FK\xF5\xC51T\x95s\xE7\xDA\xCF|\xCB\xE0g\xA3\xF3-\x85;!\xEAdsolcC\0\x08\x13\x003"; + const __DEPLOYED_BYTECODE: &[u8] = b"`\x80`@\x81\x81R`\x04\x90\x816\x10\x15a\0\x16W`\0\x80\xFD[`\0\x92\x835`\xE0\x1C\x90\x81c!\xEE\xF6\x06\x14a\x01\xEDWPc\x82\x98^\x0B\x14a\0:W`\0\x80\xFD[0\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x14a\x01\xE9W` 6`\x03\x19\x01\x12a\x01\xE9W\x815`\x01`\x01`\xA0\x1B\x03\x80\x82\x16\x90\x81\x83\x03a\x01\xE5W`\x01`\x01`\xA0\x1B\x03\x83\x16`\0\x90\x81R`\x1C` R`@\x90 T\x92\x83\x15a\x01\xD5W`\x01`\x01`\xA0\x1B\x03\x16`\0\x90\x81R`\x1C` R`@\x90 \x86\x90U`\tT\x86\x91\x16\x80;\x15a\x01\xD1W\x81\x90`$\x86Q\x80\x94\x81\x93clq*\xB9`\xE1\x1B\x83R\x88\x8B\x84\x01RZ\xF1\x80\x15a\x01\xC7Wa\x01\x99W[P\x81G\x10a\x01\x83W\x84\x80\x80\x93\x81\x93Z\xF1=\x15a\x01~Wg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF=\x81\x81\x11a\x01kW\x83Q\x91`\x1F\x82\x01`\x1F\x19\x90\x81\x16`?\x01\x16\x83\x01\x90\x81\x11\x83\x82\x10\x17a\x01VW\x84R\x81R\x84` =\x92\x01>[\x15a\x01IW\x82\x80\xF3[Qc\n\x12\xF5!`\xE1\x1B\x81R\xFD[`A\x86cNH{q`\xE0\x1B`\0RR`$`\0\xFD[cNH{q`\xE0\x1B\x86R`A\x85R`$\x86\xFD[a\x01@V[\x82Qc\xCDx`Y`\xE0\x1B\x81R0\x81\x86\x01R`$\x90\xFD[g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x96\x92\x96\x11a\x01\xB4W\x83R\x938a\0\xEFV[cNH{q`\xE0\x1B\x82R`A\x85R`$\x82\xFD[\x84Q=\x88\x82>=\x90\xFD[P\x80\xFD[\x84Qcg0\x0F\x91`\xE1\x1B\x81R\x86\x90\xFD[\x85\x80\xFD[\x82\x80\xFD[\x84\x90\x81`\x03\x196\x01\x12a\x01\xD1W\x80`\x01` \x92R\xF3\xFE\xA2dipfsX\"\x12 \xDC\xAF\x1C\xF2g\xBF\xE5,\xCE]fl\x91\xD6\x9F\xFB\x14&\xB0\x87L \r)\x98L\xBE\t\xB9\xE1budsolcC\0\x08\x13\x003"; /// The deployed bytecode of the contract. pub static LIBSTAKING_DEPLOYED_BYTECODE: ::ethers::core::types::Bytes = ::ethers::core::types::Bytes::from_static(__DEPLOYED_BYTECODE); diff --git a/binding/src/lib_staking_change_log.rs b/binding/src/lib_staking_change_log.rs index b615594d7..eea3a9dd4 100644 --- a/binding/src/lib_staking_change_log.rs +++ b/binding/src/lib_staking_change_log.rs @@ -53,12 +53,12 @@ pub mod lib_staking_change_log { pub static LIBSTAKINGCHANGELOG_ABI: ::ethers::contract::Lazy<::ethers::core::abi::Abi> = ::ethers::contract::Lazy::new(__abi); #[rustfmt::skip] - const __BYTECODE: &[u8] = b"`\x80\x80`@R4`\x17W`:\x90\x81`\x1D\x8290\x81PP\xF3[`\0\x80\xFD\xFE`\0\x80\xFD\xFE\xA2dipfsX\"\x12 =\x9B\x13\x0E>\xDE\xEE\xE5L\rv\xFBL\xE4\x0F\xCF\x05_\xB2\xE0.\x81+C\xD5\x1E\0\xFC\xC5\xD4\x8CedsolcC\0\x08\x13\x003"; + const __BYTECODE: &[u8] = b"`\x80\x80`@R4`\x17W`:\x90\x81`\x1D\x8290\x81PP\xF3[`\0\x80\xFD\xFE`\0\x80\xFD\xFE\xA2dipfsX\"\x12 ^NW\xF1\\$\x0F\xE9\xE2|u\x90\xB45\x15w\x9D\x1Ct4\xEBu\xB9\x01\xD1\x83\x93\x18s\xF9\x1B{dsolcC\0\x08\x13\x003"; /// The bytecode of the contract. pub static LIBSTAKINGCHANGELOG_BYTECODE: ::ethers::core::types::Bytes = ::ethers::core::types::Bytes::from_static(__BYTECODE); #[rustfmt::skip] - const __DEPLOYED_BYTECODE: &[u8] = b"`\0\x80\xFD\xFE\xA2dipfsX\"\x12 =\x9B\x13\x0E>\xDE\xEE\xE5L\rv\xFBL\xE4\x0F\xCF\x05_\xB2\xE0.\x81+C\xD5\x1E\0\xFC\xC5\xD4\x8CedsolcC\0\x08\x13\x003"; + const __DEPLOYED_BYTECODE: &[u8] = b"`\0\x80\xFD\xFE\xA2dipfsX\"\x12 ^NW\xF1\\$\x0F\xE9\xE2|u\x90\xB45\x15w\x9D\x1Ct4\xEBu\xB9\x01\xD1\x83\x93\x18s\xF9\x1B{dsolcC\0\x08\x13\x003"; /// The deployed bytecode of the contract. pub static LIBSTAKINGCHANGELOG_DEPLOYED_BYTECODE: ::ethers::core::types::Bytes = ::ethers::core::types::Bytes::from_static(__DEPLOYED_BYTECODE); diff --git a/binding/src/subnet_actor_diamond.rs b/binding/src/subnet_actor_diamond.rs index e95a3e334..3219c038d 100644 --- a/binding/src/subnet_actor_diamond.rs +++ b/binding/src/subnet_actor_diamond.rs @@ -345,7 +345,7 @@ pub mod subnet_actor_diamond { pub static SUBNETACTORDIAMOND_ABI: ::ethers::contract::Lazy<::ethers::core::abi::Abi> = ::ethers::contract::Lazy::new(__abi); #[rustfmt::skip] - const __DEPLOYED_BYTECODE: &[u8] = b"`\x80`@R6\x15`\x91W`\0\x805`\x01`\x01`\xE0\x1B\x03\x19\x16\x80\x82R\x7F\x80n\x0C\xBB\x9F\xCE)k\xBC3jH\xF4+\xF1\xDB\xC6\x97\"\xD1\x8D\x90\xD6\xFEp[u\x82\xC2\xBBK\xD2` R`@\x82 T`\x01`\x01`\xA0\x1B\x03\x16\x90\x81\x15`oWP\x81\x80\x916\x82\x807\x816\x91Z\xF4=\x82\x80>\x15`kW=\x90\xF3[=\x90\xFD[c\n\x82\xDDs`\xE3\x1B`\x80R`\x01`\x01`\xE0\x1B\x03\x19\x16`\x84R`\x7F\x19`\xA4\x01`\x80\xFD[`\tT`\x01`\x01`\xA0\x1B\x03\x163\x03`\xA4W\0[c\xE7\xE6\x01\xDB`\xE0\x1B`\x80R`\x04`\x80\xFD\xFE\xA2dipfsX\"\x12 \xE3\x7FC\xF7\xDE3(\xF7\xA7\x87\xB9pIvb\xE1\xFB\xF5{\xC7\xEE#ltC}O\x1Dh\xBEEadsolcC\0\x08\x13\x003"; + const __DEPLOYED_BYTECODE: &[u8] = b"`\x80`@R6\x15`\x91W`\0\x805`\x01`\x01`\xE0\x1B\x03\x19\x16\x80\x82R\x7F\x80n\x0C\xBB\x9F\xCE)k\xBC3jH\xF4+\xF1\xDB\xC6\x97\"\xD1\x8D\x90\xD6\xFEp[u\x82\xC2\xBBK\xD2` R`@\x82 T`\x01`\x01`\xA0\x1B\x03\x16\x90\x81\x15`oWP\x81\x80\x916\x82\x807\x816\x91Z\xF4=\x82\x80>\x15`kW=\x90\xF3[=\x90\xFD[c\n\x82\xDDs`\xE3\x1B`\x80R`\x01`\x01`\xE0\x1B\x03\x19\x16`\x84R`\x7F\x19`\xA4\x01`\x80\xFD[`\tT`\x01`\x01`\xA0\x1B\x03\x163\x03`\xA4W\0[c\xE7\xE6\x01\xDB`\xE0\x1B`\x80R`\x04`\x80\xFD\xFE\xA2dipfsX\"\x12 \x13\x980L4\x95!\xC5\xA7\xAAf\x96\xD0\x86\x97\x084$0w\xA1 ::ethers::contract::builders::ContractCall { + self.0 + .method_hash([102, 120, 60, 155], amount) + .expect("method not found (this should never happen)") + } ///Calls the contract's `stake` (0x3a4b66f1) function pub fn stake(&self) -> ::ethers::contract::builders::ContractCall { self.0 @@ -922,6 +990,24 @@ pub mod subnet_actor_manager_facet { Self::new(contract.address(), contract.client()) } } + ///Custom Error type `AddressInsufficientBalance` with signature `AddressInsufficientBalance(address)` and selector `0xcd786059` + #[derive( + Clone, + ::ethers::contract::EthError, + ::ethers::contract::EthDisplay, + Default, + Debug, + PartialEq, + Eq, + Hash, + )] + #[etherror( + name = "AddressInsufficientBalance", + abi = "AddressInsufficientBalance(address)" + )] + pub struct AddressInsufficientBalance { + pub account: ::ethers::core::types::Address, + } ///Custom Error type `AddressShouldBeValidator` with signature `AddressShouldBeValidator()` and selector `0x2a55ca53` #[derive( Clone, @@ -990,6 +1076,19 @@ pub mod subnet_actor_manager_facet { )] #[etherror(name = "EmptyAddress", abi = "EmptyAddress()")] pub struct EmptyAddress; + ///Custom Error type `FailedInnerCall` with signature `FailedInnerCall()` and selector `0x1425ea42` + #[derive( + Clone, + ::ethers::contract::EthError, + ::ethers::contract::EthDisplay, + Default, + Debug, + PartialEq, + Eq, + Hash, + )] + #[etherror(name = "FailedInnerCall", abi = "FailedInnerCall()")] + pub struct FailedInnerCall; ///Custom Error type `InvalidCheckpointEpoch` with signature `InvalidCheckpointEpoch()` and selector `0xfae4eadb` #[derive( Clone, @@ -1071,6 +1170,19 @@ pub mod subnet_actor_manager_facet { )] #[etherror(name = "NotAllValidatorsHaveLeft", abi = "NotAllValidatorsHaveLeft()")] pub struct NotAllValidatorsHaveLeft; + ///Custom Error type `NotEnoughBalance` with signature `NotEnoughBalance()` and selector `0xad3a8b9e` + #[derive( + Clone, + ::ethers::contract::EthError, + ::ethers::contract::EthDisplay, + Default, + Debug, + PartialEq, + Eq, + Hash, + )] + #[etherror(name = "NotEnoughBalance", abi = "NotEnoughBalance()")] + pub struct NotEnoughBalance; ///Custom Error type `NotEnoughCollateral` with signature `NotEnoughCollateral()` and selector `0x34477cc0` #[derive( Clone, @@ -1236,17 +1348,20 @@ pub mod subnet_actor_manager_facet { ///Container type for all of the contract's custom errors #[derive(Clone, ::ethers::contract::EthAbiType, Debug, PartialEq, Eq, Hash)] pub enum SubnetActorManagerFacetErrors { + AddressInsufficientBalance(AddressInsufficientBalance), AddressShouldBeValidator(AddressShouldBeValidator), CannotConfirmFutureChanges(CannotConfirmFutureChanges), CannotReleaseZero(CannotReleaseZero), CollateralIsZero(CollateralIsZero), EmptyAddress(EmptyAddress), + FailedInnerCall(FailedInnerCall), InvalidCheckpointEpoch(InvalidCheckpointEpoch), InvalidCheckpointMessagesHash(InvalidCheckpointMessagesHash), InvalidPublicKeyLength(InvalidPublicKeyLength), InvalidSignatureErr(InvalidSignatureErr), NoCollateralToWithdraw(NoCollateralToWithdraw), NotAllValidatorsHaveLeft(NotAllValidatorsHaveLeft), + NotEnoughBalance(NotEnoughBalance), NotEnoughCollateral(NotEnoughCollateral), NotEnoughFunds(NotEnoughFunds), NotGateway(NotGateway), @@ -1273,6 +1388,11 @@ pub mod subnet_actor_manager_facet { { return Ok(Self::RevertString(decoded)); } + if let Ok(decoded) = + ::decode(data) + { + return Ok(Self::AddressInsufficientBalance(decoded)); + } if let Ok(decoded) = ::decode(data) { @@ -1294,6 +1414,9 @@ pub mod subnet_actor_manager_facet { if let Ok(decoded) = ::decode(data) { return Ok(Self::EmptyAddress(decoded)); } + if let Ok(decoded) = ::decode(data) { + return Ok(Self::FailedInnerCall(decoded)); + } if let Ok(decoded) = ::decode(data) { @@ -1324,6 +1447,10 @@ pub mod subnet_actor_manager_facet { { return Ok(Self::NotAllValidatorsHaveLeft(decoded)); } + if let Ok(decoded) = ::decode(data) + { + return Ok(Self::NotEnoughBalance(decoded)); + } if let Ok(decoded) = ::decode(data) { @@ -1378,6 +1505,9 @@ pub mod subnet_actor_manager_facet { impl ::ethers::core::abi::AbiEncode for SubnetActorManagerFacetErrors { fn encode(self) -> ::std::vec::Vec { match self { + Self::AddressInsufficientBalance(element) => { + ::ethers::core::abi::AbiEncode::encode(element) + } Self::AddressShouldBeValidator(element) => { ::ethers::core::abi::AbiEncode::encode(element) } @@ -1387,6 +1517,7 @@ pub mod subnet_actor_manager_facet { Self::CannotReleaseZero(element) => ::ethers::core::abi::AbiEncode::encode(element), Self::CollateralIsZero(element) => ::ethers::core::abi::AbiEncode::encode(element), Self::EmptyAddress(element) => ::ethers::core::abi::AbiEncode::encode(element), + Self::FailedInnerCall(element) => ::ethers::core::abi::AbiEncode::encode(element), Self::InvalidCheckpointEpoch(element) => { ::ethers::core::abi::AbiEncode::encode(element) } @@ -1405,6 +1536,7 @@ pub mod subnet_actor_manager_facet { Self::NotAllValidatorsHaveLeft(element) => { ::ethers::core::abi::AbiEncode::encode(element) } + Self::NotEnoughBalance(element) => ::ethers::core::abi::AbiEncode::encode(element), Self::NotEnoughCollateral(element) => { ::ethers::core::abi::AbiEncode::encode(element) } @@ -1437,6 +1569,10 @@ pub mod subnet_actor_manager_facet { fn valid_selector(selector: [u8; 4]) -> bool { match selector { [0x08, 0xc3, 0x79, 0xa0] => true, + _ if selector + == ::selector() => { + true + } _ if selector == ::selector() => { true @@ -1455,6 +1591,10 @@ pub mod subnet_actor_manager_facet { } _ if selector == ::selector() => true, + _ if selector + == ::selector() => { + true + } _ if selector == ::selector() => { true @@ -1479,6 +1619,10 @@ pub mod subnet_actor_manager_facet { == ::selector() => { true } + _ if selector + == ::selector() => { + true + } _ if selector == ::selector() => { true @@ -1528,11 +1672,13 @@ pub mod subnet_actor_manager_facet { impl ::core::fmt::Display for SubnetActorManagerFacetErrors { fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { match self { + Self::AddressInsufficientBalance(element) => ::core::fmt::Display::fmt(element, f), Self::AddressShouldBeValidator(element) => ::core::fmt::Display::fmt(element, f), Self::CannotConfirmFutureChanges(element) => ::core::fmt::Display::fmt(element, f), Self::CannotReleaseZero(element) => ::core::fmt::Display::fmt(element, f), Self::CollateralIsZero(element) => ::core::fmt::Display::fmt(element, f), Self::EmptyAddress(element) => ::core::fmt::Display::fmt(element, f), + Self::FailedInnerCall(element) => ::core::fmt::Display::fmt(element, f), Self::InvalidCheckpointEpoch(element) => ::core::fmt::Display::fmt(element, f), Self::InvalidCheckpointMessagesHash(element) => { ::core::fmt::Display::fmt(element, f) @@ -1541,6 +1687,7 @@ pub mod subnet_actor_manager_facet { Self::InvalidSignatureErr(element) => ::core::fmt::Display::fmt(element, f), Self::NoCollateralToWithdraw(element) => ::core::fmt::Display::fmt(element, f), Self::NotAllValidatorsHaveLeft(element) => ::core::fmt::Display::fmt(element, f), + Self::NotEnoughBalance(element) => ::core::fmt::Display::fmt(element, f), Self::NotEnoughCollateral(element) => ::core::fmt::Display::fmt(element, f), Self::NotEnoughFunds(element) => ::core::fmt::Display::fmt(element, f), Self::NotGateway(element) => ::core::fmt::Display::fmt(element, f), @@ -1562,6 +1709,11 @@ pub mod subnet_actor_manager_facet { Self::RevertString(value) } } + impl ::core::convert::From for SubnetActorManagerFacetErrors { + fn from(value: AddressInsufficientBalance) -> Self { + Self::AddressInsufficientBalance(value) + } + } impl ::core::convert::From for SubnetActorManagerFacetErrors { fn from(value: AddressShouldBeValidator) -> Self { Self::AddressShouldBeValidator(value) @@ -1587,6 +1739,11 @@ pub mod subnet_actor_manager_facet { Self::EmptyAddress(value) } } + impl ::core::convert::From for SubnetActorManagerFacetErrors { + fn from(value: FailedInnerCall) -> Self { + Self::FailedInnerCall(value) + } + } impl ::core::convert::From for SubnetActorManagerFacetErrors { fn from(value: InvalidCheckpointEpoch) -> Self { Self::InvalidCheckpointEpoch(value) @@ -1617,6 +1774,11 @@ pub mod subnet_actor_manager_facet { Self::NotAllValidatorsHaveLeft(value) } } + impl ::core::convert::From for SubnetActorManagerFacetErrors { + fn from(value: NotEnoughBalance) -> Self { + Self::NotEnoughBalance(value) + } + } impl ::core::convert::From for SubnetActorManagerFacetErrors { fn from(value: NotEnoughCollateral) -> Self { Self::NotEnoughCollateral(value) @@ -1931,6 +2093,21 @@ pub mod subnet_actor_manager_facet { )] #[ethcall(name = "preFund", abi = "preFund()")] pub struct PreFundCall; + ///Container type for all input parameters for the `preRelease` function with signature `preRelease(uint256)` and selector `0x66783c9b` + #[derive( + Clone, + ::ethers::contract::EthCall, + ::ethers::contract::EthDisplay, + Default, + Debug, + PartialEq, + Eq, + Hash, + )] + #[ethcall(name = "preRelease", abi = "preRelease(uint256)")] + pub struct PreReleaseCall { + pub amount: ::ethers::core::types::U256, + } ///Container type for all input parameters for the `stake` function with signature `stake()` and selector `0x3a4b66f1` #[derive( Clone, @@ -2011,6 +2188,7 @@ pub mod subnet_actor_manager_facet { Kill(KillCall), Leave(LeaveCall), PreFund(PreFundCall), + PreRelease(PreReleaseCall), Stake(StakeCall), SubmitCheckpoint(SubmitCheckpointCall), Unstake(UnstakeCall), @@ -2051,6 +2229,9 @@ pub mod subnet_actor_manager_facet { if let Ok(decoded) = ::decode(data) { return Ok(Self::PreFund(decoded)); } + if let Ok(decoded) = ::decode(data) { + return Ok(Self::PreRelease(decoded)); + } if let Ok(decoded) = ::decode(data) { return Ok(Self::Stake(decoded)); } @@ -2085,6 +2266,7 @@ pub mod subnet_actor_manager_facet { Self::Kill(element) => ::ethers::core::abi::AbiEncode::encode(element), Self::Leave(element) => ::ethers::core::abi::AbiEncode::encode(element), Self::PreFund(element) => ::ethers::core::abi::AbiEncode::encode(element), + Self::PreRelease(element) => ::ethers::core::abi::AbiEncode::encode(element), Self::Stake(element) => ::ethers::core::abi::AbiEncode::encode(element), Self::SubmitCheckpoint(element) => ::ethers::core::abi::AbiEncode::encode(element), Self::Unstake(element) => ::ethers::core::abi::AbiEncode::encode(element), @@ -2105,6 +2287,7 @@ pub mod subnet_actor_manager_facet { Self::Kill(element) => ::core::fmt::Display::fmt(element, f), Self::Leave(element) => ::core::fmt::Display::fmt(element, f), Self::PreFund(element) => ::core::fmt::Display::fmt(element, f), + Self::PreRelease(element) => ::core::fmt::Display::fmt(element, f), Self::Stake(element) => ::core::fmt::Display::fmt(element, f), Self::SubmitCheckpoint(element) => ::core::fmt::Display::fmt(element, f), Self::Unstake(element) => ::core::fmt::Display::fmt(element, f), @@ -2154,6 +2337,11 @@ pub mod subnet_actor_manager_facet { Self::PreFund(value) } } + impl ::core::convert::From for SubnetActorManagerFacetCalls { + fn from(value: PreReleaseCall) -> Self { + Self::PreRelease(value) + } + } impl ::core::convert::From for SubnetActorManagerFacetCalls { fn from(value: StakeCall) -> Self { Self::Stake(value) From 12a8f6dc46abe96f41f267c353c2b80da29f78c8 Mon Sep 17 00:00:00 2001 From: Alfonso de la Rocha Date: Thu, 2 Nov 2023 16:26:42 +0100 Subject: [PATCH 6/7] IPC-361: address review and more tests --- src/subnet/SubnetActorManagerFacet.sol | 5 +++-- test/SubnetActorDiamondReal.t.sol | 4 ++++ 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/subnet/SubnetActorManagerFacet.sol b/src/subnet/SubnetActorManagerFacet.sol index f1372bf7d..ad1fceef4 100644 --- a/src/subnet/SubnetActorManagerFacet.sol +++ b/src/subnet/SubnetActorManagerFacet.sol @@ -121,7 +121,7 @@ contract SubnetActorManagerFacet is ISubnetActor, SubnetActorModifiers, Reentran revert SubnetAlreadyBootstrapped(); } - if (s.genesisBalance[msg.sender] == 0) { + if (s.genesisBalance[msg.sender] < amount) { revert NotEnoughBalance(); } @@ -130,8 +130,9 @@ contract SubnetActorManagerFacet is ISubnetActor, SubnetActorModifiers, Reentran if (s.genesisBalance[msg.sender] == 0) { rmAddressFromBalanceKey(msg.sender); - payable(msg.sender).sendValue(amount); } + + payable(msg.sender).sendValue(amount); } /// @notice method that allows a validator to join the subnet diff --git a/test/SubnetActorDiamondReal.t.sol b/test/SubnetActorDiamondReal.t.sol index 67a530661..93394e8e8 100644 --- a/test/SubnetActorDiamondReal.t.sol +++ b/test/SubnetActorDiamondReal.t.sol @@ -474,6 +474,10 @@ contract SubnetActorDiamondRealTest is Test { require(saGetter.genesisCircSupply() == fundAmount, "genesis circ supply not correct"); (address[] memory genesisAddrs, ) = saGetter.genesisBalances(); require(genesisAddrs.length == 1, "not one genesis addresses"); + // cannot release more than the initial balance of the address + vm.expectRevert(NotEnoughBalance.selector); + saManager.preRelease(2*fundAmount); + // release all saManager.preRelease(fundAmount); (genesisAddrs, ) = saGetter.genesisBalances(); require(saGetter.genesisCircSupply() == 0, "genesis circ supply not correct"); From 217159f702be29065269a7fc84ba6f6b0595f9fd Mon Sep 17 00:00:00 2001 From: Alfonso de la Rocha Date: Thu, 2 Nov 2023 16:28:57 +0100 Subject: [PATCH 7/7] IPC-361: make lint --- test/SubnetActorDiamondReal.t.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/SubnetActorDiamondReal.t.sol b/test/SubnetActorDiamondReal.t.sol index 93394e8e8..fe8d5ef26 100644 --- a/test/SubnetActorDiamondReal.t.sol +++ b/test/SubnetActorDiamondReal.t.sol @@ -476,7 +476,7 @@ contract SubnetActorDiamondRealTest is Test { require(genesisAddrs.length == 1, "not one genesis addresses"); // cannot release more than the initial balance of the address vm.expectRevert(NotEnoughBalance.selector); - saManager.preRelease(2*fundAmount); + saManager.preRelease(2 * fundAmount); // release all saManager.preRelease(fundAmount); (genesisAddrs, ) = saGetter.genesisBalances();