@keep-network/tbtc-v2 1.6.0-dev.6 → 1.6.0-dev.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (132) hide show
  1. package/artifacts/BLS.json +6 -6
  2. package/artifacts/Bank.json +17 -17
  3. package/artifacts/BeaconAuthorization.json +6 -6
  4. package/artifacts/BeaconDkg.json +6 -6
  5. package/artifacts/BeaconDkgValidator.json +9 -9
  6. package/artifacts/BeaconInactivity.json +6 -6
  7. package/artifacts/BeaconSortitionPool.json +16 -16
  8. package/artifacts/Bridge.json +32 -32
  9. package/artifacts/BridgeGovernance.json +14 -14
  10. package/artifacts/BridgeGovernanceParameters.json +7 -7
  11. package/artifacts/Deposit.json +7 -7
  12. package/artifacts/DepositSweep.json +7 -7
  13. package/artifacts/DonationVault.json +11 -11
  14. package/artifacts/EcdsaDkgValidator.json +7 -7
  15. package/artifacts/EcdsaInactivity.json +6 -6
  16. package/artifacts/EcdsaSortitionPool.json +16 -16
  17. package/artifacts/Fraud.json +7 -7
  18. package/artifacts/LightRelay.json +28 -28
  19. package/artifacts/LightRelayMaintainerProxy.json +24 -24
  20. package/artifacts/MaintainerProxy.json +37 -37
  21. package/artifacts/MovingFunds.json +7 -7
  22. package/artifacts/NuCypherToken.json +11 -11
  23. package/artifacts/RandomBeacon.json +23 -23
  24. package/artifacts/RandomBeaconChaosnet.json +11 -11
  25. package/artifacts/RandomBeaconGovernance.json +12 -12
  26. package/artifacts/Redemption.json +7 -7
  27. package/artifacts/ReimbursementPool.json +11 -11
  28. package/artifacts/T.json +11 -11
  29. package/artifacts/TBTC.json +19 -19
  30. package/artifacts/TBTCToken.json +19 -19
  31. package/artifacts/TBTCVault.json +36 -36
  32. package/artifacts/TokenStaking.json +156 -308
  33. package/artifacts/TokenholderGovernor.json +47 -47
  34. package/artifacts/TokenholderTimelock.json +36 -36
  35. package/artifacts/VendingMachine.json +22 -22
  36. package/artifacts/VendingMachineNuCypher.json +9 -9
  37. package/artifacts/VendingMachineV2.json +15 -15
  38. package/artifacts/VendingMachineV3.json +15 -15
  39. package/artifacts/WalletProposalValidator.json +84 -13
  40. package/artifacts/WalletRegistry.json +31 -31
  41. package/artifacts/WalletRegistryGovernance.json +56 -56
  42. package/artifacts/Wallets.json +7 -7
  43. package/artifacts/solcInputs/{d46fa1d8846c35adf326ab51a3910266.json → e2337fbc33ddf79d3229147ce15c40b6.json} +3 -3
  44. package/build/contracts/GovernanceUtils.sol/GovernanceUtils.dbg.json +1 -1
  45. package/build/contracts/bank/Bank.sol/Bank.dbg.json +1 -1
  46. package/build/contracts/bank/IReceiveBalanceApproval.sol/IReceiveBalanceApproval.dbg.json +1 -1
  47. package/build/contracts/bridge/BitcoinTx.sol/BitcoinTx.dbg.json +1 -1
  48. package/build/contracts/bridge/Bridge.sol/Bridge.dbg.json +1 -1
  49. package/build/contracts/bridge/BridgeGovernanceParameters.sol/BridgeGovernanceParameters.dbg.json +1 -1
  50. package/build/contracts/bridge/BridgeState.sol/BridgeState.dbg.json +1 -1
  51. package/build/contracts/bridge/Deposit.sol/Deposit.dbg.json +1 -1
  52. package/build/contracts/bridge/DepositSweep.sol/DepositSweep.dbg.json +1 -1
  53. package/build/contracts/bridge/EcdsaLib.sol/EcdsaLib.dbg.json +1 -1
  54. package/build/contracts/bridge/Fraud.sol/Fraud.dbg.json +1 -1
  55. package/build/contracts/bridge/Heartbeat.sol/Heartbeat.dbg.json +1 -1
  56. package/build/contracts/bridge/IRelay.sol/IRelay.dbg.json +1 -1
  57. package/build/contracts/bridge/MovingFunds.sol/MovingFunds.dbg.json +1 -1
  58. package/build/contracts/bridge/Redemption.sol/OutboundTx.dbg.json +1 -1
  59. package/build/contracts/bridge/Redemption.sol/Redemption.dbg.json +1 -1
  60. package/build/contracts/bridge/VendingMachine.sol/VendingMachine.dbg.json +1 -1
  61. package/build/contracts/bridge/VendingMachineV2.sol/VendingMachineV2.dbg.json +1 -1
  62. package/build/contracts/bridge/VendingMachineV3.sol/VendingMachineV3.dbg.json +1 -1
  63. package/build/contracts/bridge/WalletProposalValidator.sol/WalletProposalValidator.dbg.json +1 -1
  64. package/build/contracts/bridge/WalletProposalValidator.sol/WalletProposalValidator.json +60 -2
  65. package/build/contracts/bridge/Wallets.sol/Wallets.dbg.json +1 -1
  66. package/build/contracts/l2/L2TBTC.sol/L2TBTC.dbg.json +1 -1
  67. package/build/contracts/l2/L2WormholeGateway.sol/IWormholeTokenBridge.dbg.json +1 -1
  68. package/build/contracts/l2/L2WormholeGateway.sol/L2WormholeGateway.dbg.json +1 -1
  69. package/build/contracts/maintainer/MaintainerProxy.sol/MaintainerProxy.dbg.json +1 -1
  70. package/build/contracts/relay/LightRelay.sol/ILightRelay.dbg.json +1 -1
  71. package/build/contracts/relay/LightRelay.sol/LightRelay.dbg.json +1 -1
  72. package/build/contracts/relay/LightRelay.sol/RelayUtils.dbg.json +1 -1
  73. package/build/contracts/relay/LightRelayMaintainerProxy.sol/LightRelayMaintainerProxy.dbg.json +1 -1
  74. package/build/contracts/token/TBTC.sol/TBTC.dbg.json +1 -1
  75. package/build/contracts/vault/DonationVault.sol/DonationVault.dbg.json +1 -1
  76. package/build/contracts/vault/IVault.sol/IVault.dbg.json +1 -1
  77. package/build/contracts/vault/TBTCOptimisticMinting.sol/TBTCOptimisticMinting.dbg.json +1 -1
  78. package/build/contracts/vault/TBTCVault.sol/TBTCVault.dbg.json +1 -1
  79. package/contracts/bridge/WalletProposalValidator.sol +129 -0
  80. package/export/artifacts/@keep-network/ecdsa/contracts/EcdsaDkgValidator.sol/EcdsaDkgValidator.json +24 -24
  81. package/export/artifacts/@keep-network/ecdsa/contracts/WalletRegistry.sol/WalletRegistry.json +4999 -4814
  82. package/export/artifacts/@keep-network/ecdsa/contracts/libraries/EcdsaDkg.sol/EcdsaDkg.json +2 -2
  83. package/export/artifacts/@keep-network/ecdsa/contracts/libraries/EcdsaInactivity.sol/EcdsaInactivity.json +23 -23
  84. package/export/artifacts/@keep-network/random-beacon/contracts/ReimbursementPool.sol/ReimbursementPool.json +53 -53
  85. package/export/artifacts/@keep-network/sortition-pools/contracts/Chaosnet.sol/Chaosnet.json +21 -21
  86. package/export/artifacts/@keep-network/sortition-pools/contracts/Rewards.sol/Rewards.json +16 -16
  87. package/export/artifacts/@keep-network/sortition-pools/contracts/SortitionPool.sol/SortitionPool.json +206 -206
  88. package/export/artifacts/@keep-network/sortition-pools/contracts/SortitionTree.sol/SortitionTree.json +26 -26
  89. package/export/artifacts/@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol/ERC1967Proxy.json +46 -46
  90. package/export/artifacts/@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol/ProxyAdmin.json +36 -36
  91. package/export/artifacts/@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol/TransparentUpgradeableProxy.json +78 -78
  92. package/export/artifacts/@openzeppelin/contracts/token/ERC721/ERC721.sol/ERC721.json +68 -68
  93. package/export/artifacts/@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol/ERC20Upgradeable.json +43 -43
  94. package/export/artifacts/@thesis/solidity-contracts/contracts/token/ERC20WithPermit.sol/ERC20WithPermit.json +79 -79
  95. package/export/artifacts/@thesis/solidity-contracts/contracts/token/MisfundRecovery.sol/MisfundRecovery.json +42 -42
  96. package/export/artifacts/contracts/bank/Bank.sol/Bank.json +77 -77
  97. package/export/artifacts/contracts/bridge/Bridge.sol/Bridge.json +320 -320
  98. package/export/artifacts/contracts/bridge/VendingMachine.sol/VendingMachine.json +108 -108
  99. package/export/artifacts/contracts/bridge/VendingMachineV2.sol/VendingMachineV2.json +63 -63
  100. package/export/artifacts/contracts/bridge/VendingMachineV3.sol/VendingMachineV3.json +65 -65
  101. package/export/artifacts/contracts/bridge/WalletProposalValidator.sol/WalletProposalValidator.json +9987 -5463
  102. package/export/artifacts/contracts/l2/L2TBTC.sol/L2TBTC.json +194 -194
  103. package/export/artifacts/contracts/l2/L2WormholeGateway.sol/L2WormholeGateway.json +98 -98
  104. package/export/artifacts/contracts/maintainer/MaintainerProxy.sol/MaintainerProxy.json +149 -149
  105. package/export/artifacts/contracts/relay/LightRelay.sol/LightRelay.json +76 -76
  106. package/export/artifacts/contracts/relay/LightRelayMaintainerProxy.sol/LightRelayMaintainerProxy.json +62 -62
  107. package/export/artifacts/contracts/test/BankStub.sol/BankStub.json +79 -79
  108. package/export/artifacts/contracts/test/BridgeStub.sol/BridgeStub.json +358 -358
  109. package/export/artifacts/contracts/test/GoerliLightRelay.sol/GoerliLightRelay.json +78 -78
  110. package/export/artifacts/contracts/test/HeartbeatStub.sol/HeartbeatStub.json +4 -4
  111. package/export/artifacts/contracts/test/LightRelayStub.sol/LightRelayStub.json +78 -78
  112. package/export/artifacts/contracts/test/ReceiveApprovalStub.sol/ReceiveApprovalStub.json +7 -7
  113. package/export/artifacts/contracts/test/SepoliaLightRelay.sol/SepoliaLightRelay.json +78 -78
  114. package/export/artifacts/contracts/test/SystemTestRelay.sol/SystemTestRelay.json +14 -14
  115. package/export/artifacts/contracts/test/TestERC20.sol/TestERC20.json +85 -85
  116. package/export/artifacts/contracts/test/TestERC721.sol/TestERC721.json +78 -78
  117. package/export/artifacts/contracts/test/TestEcdsaLib.sol/TestEcdsaLib.json +4 -4
  118. package/export/artifacts/contracts/test/WormholeBridgeStub.sol/WormholeBridgeStub.json +37 -37
  119. package/export/artifacts/contracts/token/TBTC.sol/TBTC.json +104 -104
  120. package/export/artifacts/contracts/vault/DonationVault.sol/DonationVault.json +19 -19
  121. package/export/artifacts/contracts/vault/TBTCVault.sol/TBTCVault.json +184 -184
  122. package/export/typechain/factories/EcdsaAuthorization__factory.js +1 -1
  123. package/export/typechain/factories/IStaking__factory.js +24 -103
  124. package/export/typechain/factories/WalletProposalValidator__factory.js +59 -1
  125. package/export/typechain/factories/WalletRegistry__factory.js +1 -1
  126. package/package.json +2 -2
  127. package/artifacts/KeepRegistry.json +0 -99
  128. package/artifacts/KeepStake.json +0 -286
  129. package/artifacts/KeepToken.json +0 -711
  130. package/artifacts/KeepTokenStaking.json +0 -483
  131. package/artifacts/NuCypherStakingEscrow.json +0 -287
  132. package/artifacts/VendingMachineKeep.json +0 -400
@@ -94,6 +94,16 @@ contract WalletProposalValidator {
94
94
  uint256 redemptionTxFee;
95
95
  }
96
96
 
97
+ /// @notice Helper structure representing a moving funds proposal.
98
+ struct MovingFundsProposal {
99
+ // 20-byte public key hash of the source wallet.
100
+ bytes20 walletPubKeyHash;
101
+ // List of 20-byte public key hashes of target wallets.
102
+ bytes20[] targetWallets;
103
+ // Proposed BTC fee for the entire transaction.
104
+ uint256 movingFundsTxFee;
105
+ }
106
+
97
107
  /// @notice Helper structure representing a heartbeat proposal.
98
108
  struct HeartbeatProposal {
99
109
  // 20-byte public key hash of the target wallet.
@@ -587,6 +597,125 @@ contract WalletProposalValidator {
587
597
  return true;
588
598
  }
589
599
 
600
+ /// @notice View function encapsulating the main rules of a valid moving
601
+ /// funds proposal. This function is meant to facilitate the
602
+ /// off-chain validation of the incoming proposals. Thanks to it,
603
+ /// most of the work can be done using a single readonly contract
604
+ /// call.
605
+ /// @param proposal The moving funds proposal to validate.
606
+ /// @param walletMainUtxo The main UTXO of the source wallet.
607
+ /// @return True if the proposal is valid. Reverts otherwise.
608
+ /// @dev Notice that this function is meant to be invoked after the moving
609
+ /// funds commitment has already been submitted. This function skips
610
+ /// some checks related to the moving funds procedure as they were
611
+ /// already checked on the commitment submission.
612
+ /// Requirements:
613
+ /// - The source wallet must be in the MovingFunds state,
614
+ /// - The target wallets commitment must be submitted,
615
+ /// - The target wallets commitment hash must match the target wallets
616
+ /// from the proposal,
617
+ /// - The source wallet BTC balance must be equal to or greater than
618
+ /// `movingFundsDustThreshold`,
619
+ /// - The proposed moving funds transaction fee must be greater than
620
+ /// zero,
621
+ /// - The proposed moving funds transaction fee must not exceed the
622
+ /// maximum total fee allowed for moving funds.
623
+ function validateMovingFundsProposal(
624
+ MovingFundsProposal calldata proposal,
625
+ BitcoinTx.UTXO calldata walletMainUtxo
626
+ ) external view returns (bool) {
627
+ Wallets.Wallet memory sourceWallet = bridge.wallets(
628
+ proposal.walletPubKeyHash
629
+ );
630
+
631
+ // Make sure the source wallet is in MovingFunds state.
632
+ require(
633
+ sourceWallet.state == Wallets.WalletState.MovingFunds,
634
+ "Source wallet is not in MovingFunds state"
635
+ );
636
+
637
+ // Make sure the moving funds commitment has been submitted and
638
+ // the commitment hash matches the target wallets from the proposal.
639
+ require(
640
+ sourceWallet.movingFundsTargetWalletsCommitmentHash != bytes32(0),
641
+ "Target wallets commitment is not submitted"
642
+ );
643
+
644
+ require(
645
+ sourceWallet.movingFundsTargetWalletsCommitmentHash ==
646
+ keccak256(abi.encodePacked(proposal.targetWallets)),
647
+ "Target wallets do not match target wallets commitment hash"
648
+ );
649
+
650
+ (
651
+ uint64 movingFundsTxMaxTotalFee,
652
+ uint64 movingFundsDustThreshold,
653
+ ,
654
+ ,
655
+ ,
656
+ ,
657
+ ,
658
+ ,
659
+ ,
660
+ ,
661
+
662
+ ) = bridge.movingFundsParameters();
663
+
664
+ // Make sure the source wallet balance is correct.
665
+ uint64 sourceWalletBtcBalance = getWalletBtcBalance(
666
+ sourceWallet.mainUtxoHash,
667
+ walletMainUtxo
668
+ );
669
+
670
+ require(
671
+ sourceWalletBtcBalance >= movingFundsDustThreshold,
672
+ "Source wallet BTC balance is below the moving funds dust threshold"
673
+ );
674
+
675
+ // Make sure the proposed fee is valid.
676
+ require(
677
+ proposal.movingFundsTxFee > 0,
678
+ "Proposed transaction fee cannot be zero"
679
+ );
680
+
681
+ require(
682
+ proposal.movingFundsTxFee <= movingFundsTxMaxTotalFee,
683
+ "Proposed transaction fee is too high"
684
+ );
685
+
686
+ return true;
687
+ }
688
+
689
+ /// @notice Calculates the Bitcoin balance of a wallet based on its main
690
+ /// UTXO.
691
+ /// @param walletMainUtxoHash The hash of the wallet's main UTXO.
692
+ /// @param walletMainUtxo The detailed data of the wallet's main UTXO.
693
+ /// @return walletBtcBalance The calculated Bitcoin balance of the wallet.
694
+ function getWalletBtcBalance(
695
+ bytes32 walletMainUtxoHash,
696
+ BitcoinTx.UTXO calldata walletMainUtxo
697
+ ) internal view returns (uint64 walletBtcBalance) {
698
+ // If the wallet has a main UTXO hash set, cross-check it with the
699
+ // provided plain-text parameter and get the transaction output value
700
+ // as BTC balance. Otherwise, the BTC balance is just zero.
701
+ if (walletMainUtxoHash != bytes32(0)) {
702
+ require(
703
+ keccak256(
704
+ abi.encodePacked(
705
+ walletMainUtxo.txHash,
706
+ walletMainUtxo.txOutputIndex,
707
+ walletMainUtxo.txOutputValue
708
+ )
709
+ ) == walletMainUtxoHash,
710
+ "Invalid wallet main UTXO data"
711
+ );
712
+
713
+ walletBtcBalance = walletMainUtxo.txOutputValue;
714
+ }
715
+
716
+ return walletBtcBalance;
717
+ }
718
+
590
719
  /// @notice View function encapsulating the main rules of a valid heartbeat
591
720
  /// proposal. This function is meant to facilitate the off-chain
592
721
  /// validation of the incoming proposals. Thanks to it, most
@@ -479,7 +479,7 @@
479
479
  "parameterSlots": 1,
480
480
  "returnSlots": 0
481
481
  },
482
- "abi_decode_tuple_t_contract$_SortitionPool_$11055_fromMemory": {
482
+ "abi_decode_tuple_t_contract$_SortitionPool_$11064_fromMemory": {
483
483
  "entryPoint": 64,
484
484
  "id": null,
485
485
  "parameterSlots": 2,
@@ -751,7 +751,7 @@
751
751
  }
752
752
  ]
753
753
  },
754
- "name": "abi_decode_tuple_t_contract$_SortitionPool_$11055_fromMemory",
754
+ "name": "abi_decode_tuple_t_contract$_SortitionPool_$11064_fromMemory",
755
755
  "nodeType": "YulFunctionDefinition",
756
756
  "parameters": [
757
757
  {
@@ -779,7 +779,7 @@
779
779
  }
780
780
  ]
781
781
  },
782
- "contents": "{\n { }\n function abi_decode_tuple_t_contract$_SortitionPool_$11055_fromMemory(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n let value := mload(headStart)\n if iszero(eq(value, and(value, sub(shl(160, 1), 1)))) { revert(0, 0) }\n value0 := value\n }\n}",
782
+ "contents": "{\n { }\n function abi_decode_tuple_t_contract$_SortitionPool_$11064_fromMemory(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n let value := mload(headStart)\n if iszero(eq(value, and(value, sub(shl(160, 1), 1)))) { revert(0, 0) }\n value0 := value\n }\n}",
783
783
  "id": 126,
784
784
  "language": "Yul",
785
785
  "name": "#utility.yul"
@@ -791,9 +791,9 @@
791
791
  },
792
792
  "deployedBytecode": {
793
793
  "functionDebugData": {
794
- "@_throwError_20308": {
794
+ "@_throwError_20317": {
795
795
  "entryPoint": 4084,
796
- "id": 20308,
796
+ "id": 20317,
797
797
  "parameterSlots": 1,
798
798
  "returnSlots": 0
799
799
  },
@@ -821,9 +821,9 @@
821
821
  "parameterSlots": 0,
822
822
  "returnSlots": 0
823
823
  },
824
- "@recover_20381": {
824
+ "@recover_20390": {
825
825
  "entryPoint": 3979,
826
- "id": 20381,
826
+ "id": 20390,
827
827
  "parameterSlots": 2,
828
828
  "returnSlots": 1
829
829
  },
@@ -833,9 +833,9 @@
833
833
  "parameterSlots": 0,
834
834
  "returnSlots": 0
835
835
  },
836
- "@slice_8913": {
836
+ "@slice_8922": {
837
837
  "entryPoint": 3798,
838
- "id": 8913,
838
+ "id": 8922,
839
839
  "parameterSlots": 3,
840
840
  "returnSlots": 1
841
841
  },
@@ -845,21 +845,21 @@
845
845
  "parameterSlots": 0,
846
846
  "returnSlots": 0
847
847
  },
848
- "@toEthSignedMessageHash_20572": {
848
+ "@toEthSignedMessageHash_20581": {
849
849
  "entryPoint": null,
850
- "id": 20572,
850
+ "id": 20581,
851
851
  "parameterSlots": 1,
852
852
  "returnSlots": 1
853
853
  },
854
- "@tryRecover_20354": {
854
+ "@tryRecover_20363": {
855
855
  "entryPoint": 4015,
856
- "id": 20354,
856
+ "id": 20363,
857
857
  "parameterSlots": 2,
858
858
  "returnSlots": 2
859
859
  },
860
- "@tryRecover_20522": {
860
+ "@tryRecover_20531": {
861
861
  "entryPoint": 4444,
862
- "id": 20522,
862
+ "id": 20531,
863
863
  "parameterSlots": 4,
864
864
  "returnSlots": 2
865
865
  },
@@ -911,19 +911,19 @@
911
911
  "parameterSlots": 2,
912
912
  "returnSlots": 1
913
913
  },
914
- "abi_decode_tuple_t_struct$_Result_$6858_calldata_ptr": {
914
+ "abi_decode_tuple_t_struct$_Result_$6867_calldata_ptr": {
915
915
  "entryPoint": 4664,
916
916
  "id": null,
917
917
  "parameterSlots": 2,
918
918
  "returnSlots": 1
919
919
  },
920
- "abi_decode_tuple_t_struct$_Result_$6858_calldata_ptrt_uint256": {
920
+ "abi_decode_tuple_t_struct$_Result_$6867_calldata_ptrt_uint256": {
921
921
  "entryPoint": 4813,
922
922
  "id": null,
923
923
  "parameterSlots": 2,
924
924
  "returnSlots": 2
925
925
  },
926
- "abi_decode_tuple_t_struct$_Result_$6858_calldata_ptrt_uint256t_uint256": {
926
+ "abi_decode_tuple_t_struct$_Result_$6867_calldata_ptrt_uint256t_uint256": {
927
927
  "entryPoint": 4882,
928
928
  "id": null,
929
929
  "parameterSlots": 2,
@@ -983,7 +983,7 @@
983
983
  "parameterSlots": 5,
984
984
  "returnSlots": 1
985
985
  },
986
- "abi_encode_tuple_t_contract$_SortitionPool_$11055__to_t_address__fromStack_reversed": {
986
+ "abi_encode_tuple_t_contract$_SortitionPool_$11064__to_t_address__fromStack_reversed": {
987
987
  "entryPoint": null,
988
988
  "id": null,
989
989
  "parameterSlots": 2,
@@ -1599,7 +1599,7 @@
1599
1599
  }
1600
1600
  ]
1601
1601
  },
1602
- "name": "abi_decode_tuple_t_struct$_Result_$6858_calldata_ptr",
1602
+ "name": "abi_decode_tuple_t_struct$_Result_$6867_calldata_ptr",
1603
1603
  "nodeType": "YulFunctionDefinition",
1604
1604
  "parameters": [
1605
1605
  {
@@ -2465,7 +2465,7 @@
2465
2465
  }
2466
2466
  ]
2467
2467
  },
2468
- "name": "abi_decode_tuple_t_struct$_Result_$6858_calldata_ptrt_uint256",
2468
+ "name": "abi_decode_tuple_t_struct$_Result_$6867_calldata_ptrt_uint256",
2469
2469
  "nodeType": "YulFunctionDefinition",
2470
2470
  "parameters": [
2471
2471
  {
@@ -2695,7 +2695,7 @@
2695
2695
  }
2696
2696
  ]
2697
2697
  },
2698
- "name": "abi_encode_tuple_t_contract$_SortitionPool_$11055__to_t_address__fromStack_reversed",
2698
+ "name": "abi_encode_tuple_t_contract$_SortitionPool_$11064__to_t_address__fromStack_reversed",
2699
2699
  "nodeType": "YulFunctionDefinition",
2700
2700
  "parameters": [
2701
2701
  {
@@ -3034,7 +3034,7 @@
3034
3034
  }
3035
3035
  ]
3036
3036
  },
3037
- "name": "abi_decode_tuple_t_struct$_Result_$6858_calldata_ptrt_uint256t_uint256",
3037
+ "name": "abi_decode_tuple_t_struct$_Result_$6867_calldata_ptrt_uint256t_uint256",
3038
3038
  "nodeType": "YulFunctionDefinition",
3039
3039
  "parameters": [
3040
3040
  {
@@ -11974,7 +11974,7 @@
11974
11974
  }
11975
11975
  ]
11976
11976
  },
11977
- "contents": "{\n { }\n function abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, value0)\n }\n function abi_decode_struct_Result_calldata(offset, end) -> value\n {\n if slt(sub(end, offset), 224) { revert(0, 0) }\n value := offset\n }\n function abi_decode_tuple_t_struct$_Result_$6858_calldata_ptr(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n let offset := calldataload(headStart)\n if gt(offset, 0xffffffffffffffff) { revert(0, 0) }\n value0 := abi_decode_struct_Result_calldata(add(headStart, offset), dataEnd)\n }\n function abi_encode_tuple_t_bool_t_string_memory_ptr__to_t_bool_t_string_memory_ptr__fromStack_reversed(headStart, value1, value0) -> tail\n {\n mstore(headStart, iszero(iszero(value0)))\n let _1 := 32\n mstore(add(headStart, _1), 64)\n let length := mload(value1)\n mstore(add(headStart, 64), length)\n let i := 0\n for { } lt(i, length) { i := add(i, _1) }\n {\n mstore(add(add(headStart, i), 96), mload(add(add(value1, i), _1)))\n }\n mstore(add(add(headStart, length), 96), 0)\n tail := add(add(headStart, and(add(length, 31), not(31))), 96)\n }\n function abi_decode_tuple_t_struct$_Result_$6858_calldata_ptrt_uint256(headStart, dataEnd) -> value0, value1\n {\n if slt(sub(dataEnd, headStart), 64) { revert(0, 0) }\n let offset := calldataload(headStart)\n if gt(offset, 0xffffffffffffffff) { revert(0, 0) }\n value0 := abi_decode_struct_Result_calldata(add(headStart, offset), dataEnd)\n value1 := calldataload(add(headStart, 32))\n }\n function abi_encode_tuple_t_bool__to_t_bool__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, iszero(iszero(value0)))\n }\n function abi_encode_tuple_t_contract$_SortitionPool_$11055__to_t_address__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, and(value0, 0xffffffffffffffffffffffffffffffffffffffff))\n }\n function abi_decode_tuple_t_struct$_Result_$6858_calldata_ptrt_uint256t_uint256(headStart, dataEnd) -> value0, value1, value2\n {\n if slt(sub(dataEnd, headStart), 96) { revert(0, 0) }\n let offset := calldataload(headStart)\n if gt(offset, 0xffffffffffffffff) { revert(0, 0) }\n value0 := abi_decode_struct_Result_calldata(add(headStart, offset), dataEnd)\n value1 := calldataload(add(headStart, 32))\n value2 := calldataload(add(headStart, 64))\n }\n function access_calldata_tail_t_bytes_calldata_ptr(base_ref, ptr_to_tail) -> addr, length\n {\n let rel_offset_of_tail := calldataload(ptr_to_tail)\n if iszero(slt(rel_offset_of_tail, add(sub(calldatasize(), base_ref), not(30)))) { revert(0, 0) }\n let addr_1 := add(base_ref, rel_offset_of_tail)\n length := calldataload(addr_1)\n if gt(length, 0xffffffffffffffff) { revert(0, 0) }\n addr := add(addr_1, 0x20)\n if sgt(addr, sub(calldatasize(), length)) { revert(0, 0) }\n }\n function access_calldata_tail_t_array$_t_uint8_$dyn_calldata_ptr(base_ref, ptr_to_tail) -> addr, length\n {\n let rel_offset_of_tail := calldataload(ptr_to_tail)\n if iszero(slt(rel_offset_of_tail, add(sub(calldatasize(), base_ref), not(30)))) { revert(0, 0) }\n let addr_1 := add(base_ref, rel_offset_of_tail)\n length := calldataload(addr_1)\n if gt(length, 0xffffffffffffffff) { revert(0, 0) }\n addr := add(addr_1, 0x20)\n if sgt(addr, sub(calldatasize(), shl(5, length))) { revert(0, 0) }\n }\n function panic_error_0x11()\n {\n mstore(0, 35408467139433450592217433187231851964531694900788300625387963629091585785856)\n mstore(4, 0x11)\n revert(0, 0x24)\n }\n function checked_sub_t_uint256(x, y) -> diff\n {\n diff := sub(x, y)\n if gt(diff, x) { panic_error_0x11() }\n }\n function panic_error_0x32()\n {\n mstore(0, 35408467139433450592217433187231851964531694900788300625387963629091585785856)\n mstore(4, 0x32)\n revert(0, 0x24)\n }\n function abi_decode_uint8(offset) -> value\n {\n value := calldataload(offset)\n if iszero(eq(value, and(value, 0xff))) { revert(0, 0) }\n }\n function abi_decode_tuple_t_uint8(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n value0 := abi_decode_uint8(headStart)\n }\n function increment_t_uint256(value) -> ret\n {\n if eq(value, not(0)) { panic_error_0x11() }\n ret := add(value, 1)\n }\n function panic_error_0x12()\n {\n mstore(0, 35408467139433450592217433187231851964531694900788300625387963629091585785856)\n mstore(4, 0x12)\n revert(0, 0x24)\n }\n function checked_div_t_uint256(x, y) -> r\n {\n if iszero(y) { panic_error_0x12() }\n r := div(x, y)\n }\n function mod_t_uint256(x, y) -> r\n {\n if iszero(y) { panic_error_0x12() }\n r := mod(x, y)\n }\n function access_calldata_tail_t_array$_t_uint256_$dyn_calldata_ptr(base_ref, ptr_to_tail) -> addr, length\n {\n let rel_offset_of_tail := calldataload(ptr_to_tail)\n if iszero(slt(rel_offset_of_tail, add(sub(calldatasize(), base_ref), not(30)))) { revert(0, 0) }\n let addr_1 := add(base_ref, rel_offset_of_tail)\n length := calldataload(addr_1)\n if gt(length, 0xffffffffffffffff) { revert(0, 0) }\n addr := add(addr_1, 0x20)\n if sgt(addr, sub(calldatasize(), shl(5, length))) { revert(0, 0) }\n }\n function access_calldata_tail_t_array$_t_uint32_$dyn_calldata_ptr(base_ref, ptr_to_tail) -> addr, length\n {\n let rel_offset_of_tail := calldataload(ptr_to_tail)\n if iszero(slt(rel_offset_of_tail, add(sub(calldatasize(), base_ref), not(30)))) { revert(0, 0) }\n let addr_1 := add(base_ref, rel_offset_of_tail)\n length := calldataload(addr_1)\n if gt(length, 0xffffffffffffffff) { revert(0, 0) }\n addr := add(addr_1, 0x20)\n if sgt(addr, sub(calldatasize(), shl(5, length))) { revert(0, 0) }\n }\n function abi_encode_tuple_t_uint256_t_bytes32__to_t_uint256_t_bytes32__fromStack_reversed(headStart, value1, value0) -> tail\n {\n tail := add(headStart, 64)\n mstore(headStart, value0)\n mstore(add(headStart, 32), value1)\n }\n function panic_error_0x41()\n {\n mstore(0, 35408467139433450592217433187231851964531694900788300625387963629091585785856)\n mstore(4, 0x41)\n revert(0, 0x24)\n }\n function allocate_memory(size) -> memPtr\n {\n memPtr := mload(64)\n let newFreePtr := add(memPtr, and(add(size, 31), not(31)))\n if or(gt(newFreePtr, 0xffffffffffffffff), lt(newFreePtr, memPtr)) { panic_error_0x41() }\n mstore(64, newFreePtr)\n }\n function array_allocation_size_array_uint32_dyn(length) -> size\n {\n if gt(length, 0xffffffffffffffff) { panic_error_0x41() }\n size := add(shl(5, length), 0x20)\n }\n function validator_revert_uint32(value)\n {\n if iszero(eq(value, and(value, 0xffffffff))) { revert(0, 0) }\n }\n function abi_decode_tuple_t_array$_t_uint32_$dyn_memory_ptr_fromMemory(headStart, dataEnd) -> value0\n {\n let _1 := 32\n if slt(sub(dataEnd, headStart), _1) { revert(0, 0) }\n let offset := mload(headStart)\n if gt(offset, 0xffffffffffffffff) { revert(0, 0) }\n let _2 := add(headStart, offset)\n if iszero(slt(add(_2, 0x1f), dataEnd)) { revert(0, 0) }\n let _3 := mload(_2)\n let dst := allocate_memory(array_allocation_size_array_uint32_dyn(_3))\n let dst_1 := dst\n mstore(dst, _3)\n dst := add(dst, _1)\n let srcEnd := add(add(_2, shl(5, _3)), _1)\n if gt(srcEnd, dataEnd) { revert(0, 0) }\n let src := add(_2, _1)\n for { } lt(src, srcEnd) { src := add(src, _1) }\n {\n let value := mload(src)\n validator_revert_uint32(value)\n mstore(dst, value)\n dst := add(dst, _1)\n }\n value0 := dst_1\n }\n function abi_decode_tuple_t_uint32(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_uint32(value)\n value0 := value\n }\n function checked_sub_t_uint8(x, y) -> diff\n {\n diff := sub(and(x, 0xff), and(y, 0xff))\n if gt(diff, 0xff) { panic_error_0x11() }\n }\n function abi_encode_tuple_t_array$_t_uint32_$dyn_memory_ptr__to_t_array$_t_uint32_$dyn_memory_ptr__fromStack_reversed(headStart, value0) -> tail\n {\n let _1 := 32\n let tail_1 := add(headStart, _1)\n mstore(headStart, _1)\n let pos := tail_1\n let length := mload(value0)\n mstore(tail_1, length)\n pos := add(headStart, 64)\n let srcPtr := add(value0, _1)\n let i := 0\n for { } lt(i, length) { i := add(i, 1) }\n {\n mstore(pos, and(mload(srcPtr), 0xffffffff))\n pos := add(pos, _1)\n srcPtr := add(srcPtr, _1)\n }\n tail := pos\n }\n function abi_encode_tuple_t_array$_t_uint32_$dyn_calldata_ptr__to_t_array$_t_uint32_$dyn_memory_ptr__fromStack_reversed(headStart, value1, value0) -> tail\n {\n let _1 := 32\n let tail_1 := add(headStart, _1)\n mstore(headStart, _1)\n let pos := tail_1\n mstore(tail_1, value1)\n pos := add(headStart, 64)\n let srcPtr := value0\n let i := 0\n for { } lt(i, value1) { i := add(i, 1) }\n {\n let value := calldataload(srcPtr)\n validator_revert_uint32(value)\n mstore(pos, and(value, 0xffffffff))\n pos := add(pos, _1)\n srcPtr := add(srcPtr, _1)\n }\n tail := pos\n }\n function abi_encode_tuple_t_uint256_t_bytes_calldata_ptr_t_array$_t_uint8_$dyn_calldata_ptr_t_uint256__to_t_uint256_t_bytes_memory_ptr_t_array$_t_uint8_$dyn_memory_ptr_t_uint256__fromStack_reversed(headStart, value5, value4, value3, value2, value1, value0) -> tail\n {\n mstore(headStart, value0)\n let _1 := 32\n mstore(add(headStart, _1), 128)\n mstore(add(headStart, 128), value2)\n calldatacopy(add(headStart, 160), value1, value2)\n mstore(add(add(headStart, value2), 160), 0)\n let _2 := add(headStart, and(add(value2, 31), not(31)))\n let end := add(_2, 160)\n mstore(add(headStart, 64), add(sub(_2, headStart), 160))\n let pos := end\n mstore(end, value4)\n pos := add(_2, 192)\n let srcPtr := value3\n let i := 0\n for { } lt(i, value4) { i := add(i, 1) }\n {\n mstore(pos, and(abi_decode_uint8(srcPtr), 0xff))\n pos := add(pos, _1)\n srcPtr := add(srcPtr, _1)\n }\n tail := pos\n mstore(add(headStart, 96), value5)\n }\n function abi_decode_tuple_t_array$_t_address_$dyn_memory_ptr_fromMemory(headStart, dataEnd) -> value0\n {\n let _1 := 32\n if slt(sub(dataEnd, headStart), _1) { revert(0, 0) }\n let offset := mload(headStart)\n if gt(offset, 0xffffffffffffffff) { revert(0, 0) }\n let _2 := add(headStart, offset)\n if iszero(slt(add(_2, 0x1f), dataEnd)) { revert(0, 0) }\n let _3 := mload(_2)\n let dst := allocate_memory(array_allocation_size_array_uint32_dyn(_3))\n let dst_1 := dst\n mstore(dst, _3)\n dst := add(dst, _1)\n let srcEnd := add(add(_2, shl(5, _3)), _1)\n if gt(srcEnd, dataEnd) { revert(0, 0) }\n let src := add(_2, _1)\n for { } lt(src, srcEnd) { src := add(src, _1) }\n {\n let value := mload(src)\n if iszero(eq(value, and(value, 0xffffffffffffffffffffffffffffffffffffffff)))\n {\n let _4 := 0\n revert(_4, _4)\n }\n mstore(dst, value)\n dst := add(dst, _1)\n }\n value0 := dst_1\n }\n function checked_mul_t_uint256(x, y) -> product\n {\n product := mul(x, y)\n if iszero(or(iszero(x), eq(y, div(product, x)))) { panic_error_0x11() }\n }\n function abi_encode_tuple_packed_t_stringliteral_178a2411ab6fbc1ba11064408972259c558d0e82fd48b0aba3ad81d14f065e73_t_bytes32__to_t_string_memory_ptr_t_bytes32__nonPadded_inplace_fromStack_reversed(pos, value0) -> end\n {\n mstore(pos, 0x19457468657265756d205369676e6564204d6573736167653a0a333200000000)\n mstore(add(pos, 28), value0)\n end := add(pos, 60)\n }\n function checked_add_t_uint256(x, y) -> sum\n {\n sum := add(x, y)\n if gt(x, sum) { panic_error_0x11() }\n }\n function abi_encode_tuple_t_stringliteral_f1c269d7eab972b2fd4d87a15c317e920493e7eea923de7e48c0ebcb7f611fa9__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 19)\n mstore(add(headStart, 64), \"Slice out of bounds\")\n tail := add(headStart, 96)\n }\n function panic_error_0x21()\n {\n mstore(0, 35408467139433450592217433187231851964531694900788300625387963629091585785856)\n mstore(4, 0x21)\n revert(0, 0x24)\n }\n function abi_encode_tuple_t_stringliteral_00043f6bf76368aa97c21698e9b9d4779e31902453daccf3525ddfb36e53e2be__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 24)\n mstore(add(headStart, 64), \"ECDSA: invalid signature\")\n tail := add(headStart, 96)\n }\n function abi_encode_tuple_t_stringliteral_1669ff3ba3cdf64474e1193492d05b8434e29b0b495e60095eb5f5c8ec14ce77__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 31)\n mstore(add(headStart, 64), \"ECDSA: invalid signature length\")\n tail := add(headStart, 96)\n }\n function abi_encode_tuple_t_stringliteral_520d1f787dbcafbbfc007fd2c4ecf3d2711ec587f3ee9a1215c0b646c3e530bd__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 34)\n mstore(add(headStart, 64), \"ECDSA: invalid signature 's' val\")\n mstore(add(headStart, 96), \"ue\")\n tail := add(headStart, 128)\n }\n function abi_encode_tuple_t_bytes32_t_uint8_t_bytes32_t_bytes32__to_t_bytes32_t_uint8_t_bytes32_t_bytes32__fromStack_reversed(headStart, value3, value2, value1, value0) -> tail\n {\n tail := add(headStart, 128)\n mstore(headStart, value0)\n mstore(add(headStart, 32), and(value1, 0xff))\n mstore(add(headStart, 64), value2)\n mstore(add(headStart, 96), value3)\n }\n}",
11977
+ "contents": "{\n { }\n function abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, value0)\n }\n function abi_decode_struct_Result_calldata(offset, end) -> value\n {\n if slt(sub(end, offset), 224) { revert(0, 0) }\n value := offset\n }\n function abi_decode_tuple_t_struct$_Result_$6867_calldata_ptr(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n let offset := calldataload(headStart)\n if gt(offset, 0xffffffffffffffff) { revert(0, 0) }\n value0 := abi_decode_struct_Result_calldata(add(headStart, offset), dataEnd)\n }\n function abi_encode_tuple_t_bool_t_string_memory_ptr__to_t_bool_t_string_memory_ptr__fromStack_reversed(headStart, value1, value0) -> tail\n {\n mstore(headStart, iszero(iszero(value0)))\n let _1 := 32\n mstore(add(headStart, _1), 64)\n let length := mload(value1)\n mstore(add(headStart, 64), length)\n let i := 0\n for { } lt(i, length) { i := add(i, _1) }\n {\n mstore(add(add(headStart, i), 96), mload(add(add(value1, i), _1)))\n }\n mstore(add(add(headStart, length), 96), 0)\n tail := add(add(headStart, and(add(length, 31), not(31))), 96)\n }\n function abi_decode_tuple_t_struct$_Result_$6867_calldata_ptrt_uint256(headStart, dataEnd) -> value0, value1\n {\n if slt(sub(dataEnd, headStart), 64) { revert(0, 0) }\n let offset := calldataload(headStart)\n if gt(offset, 0xffffffffffffffff) { revert(0, 0) }\n value0 := abi_decode_struct_Result_calldata(add(headStart, offset), dataEnd)\n value1 := calldataload(add(headStart, 32))\n }\n function abi_encode_tuple_t_bool__to_t_bool__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, iszero(iszero(value0)))\n }\n function abi_encode_tuple_t_contract$_SortitionPool_$11064__to_t_address__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, and(value0, 0xffffffffffffffffffffffffffffffffffffffff))\n }\n function abi_decode_tuple_t_struct$_Result_$6867_calldata_ptrt_uint256t_uint256(headStart, dataEnd) -> value0, value1, value2\n {\n if slt(sub(dataEnd, headStart), 96) { revert(0, 0) }\n let offset := calldataload(headStart)\n if gt(offset, 0xffffffffffffffff) { revert(0, 0) }\n value0 := abi_decode_struct_Result_calldata(add(headStart, offset), dataEnd)\n value1 := calldataload(add(headStart, 32))\n value2 := calldataload(add(headStart, 64))\n }\n function access_calldata_tail_t_bytes_calldata_ptr(base_ref, ptr_to_tail) -> addr, length\n {\n let rel_offset_of_tail := calldataload(ptr_to_tail)\n if iszero(slt(rel_offset_of_tail, add(sub(calldatasize(), base_ref), not(30)))) { revert(0, 0) }\n let addr_1 := add(base_ref, rel_offset_of_tail)\n length := calldataload(addr_1)\n if gt(length, 0xffffffffffffffff) { revert(0, 0) }\n addr := add(addr_1, 0x20)\n if sgt(addr, sub(calldatasize(), length)) { revert(0, 0) }\n }\n function access_calldata_tail_t_array$_t_uint8_$dyn_calldata_ptr(base_ref, ptr_to_tail) -> addr, length\n {\n let rel_offset_of_tail := calldataload(ptr_to_tail)\n if iszero(slt(rel_offset_of_tail, add(sub(calldatasize(), base_ref), not(30)))) { revert(0, 0) }\n let addr_1 := add(base_ref, rel_offset_of_tail)\n length := calldataload(addr_1)\n if gt(length, 0xffffffffffffffff) { revert(0, 0) }\n addr := add(addr_1, 0x20)\n if sgt(addr, sub(calldatasize(), shl(5, length))) { revert(0, 0) }\n }\n function panic_error_0x11()\n {\n mstore(0, 35408467139433450592217433187231851964531694900788300625387963629091585785856)\n mstore(4, 0x11)\n revert(0, 0x24)\n }\n function checked_sub_t_uint256(x, y) -> diff\n {\n diff := sub(x, y)\n if gt(diff, x) { panic_error_0x11() }\n }\n function panic_error_0x32()\n {\n mstore(0, 35408467139433450592217433187231851964531694900788300625387963629091585785856)\n mstore(4, 0x32)\n revert(0, 0x24)\n }\n function abi_decode_uint8(offset) -> value\n {\n value := calldataload(offset)\n if iszero(eq(value, and(value, 0xff))) { revert(0, 0) }\n }\n function abi_decode_tuple_t_uint8(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n value0 := abi_decode_uint8(headStart)\n }\n function increment_t_uint256(value) -> ret\n {\n if eq(value, not(0)) { panic_error_0x11() }\n ret := add(value, 1)\n }\n function panic_error_0x12()\n {\n mstore(0, 35408467139433450592217433187231851964531694900788300625387963629091585785856)\n mstore(4, 0x12)\n revert(0, 0x24)\n }\n function checked_div_t_uint256(x, y) -> r\n {\n if iszero(y) { panic_error_0x12() }\n r := div(x, y)\n }\n function mod_t_uint256(x, y) -> r\n {\n if iszero(y) { panic_error_0x12() }\n r := mod(x, y)\n }\n function access_calldata_tail_t_array$_t_uint256_$dyn_calldata_ptr(base_ref, ptr_to_tail) -> addr, length\n {\n let rel_offset_of_tail := calldataload(ptr_to_tail)\n if iszero(slt(rel_offset_of_tail, add(sub(calldatasize(), base_ref), not(30)))) { revert(0, 0) }\n let addr_1 := add(base_ref, rel_offset_of_tail)\n length := calldataload(addr_1)\n if gt(length, 0xffffffffffffffff) { revert(0, 0) }\n addr := add(addr_1, 0x20)\n if sgt(addr, sub(calldatasize(), shl(5, length))) { revert(0, 0) }\n }\n function access_calldata_tail_t_array$_t_uint32_$dyn_calldata_ptr(base_ref, ptr_to_tail) -> addr, length\n {\n let rel_offset_of_tail := calldataload(ptr_to_tail)\n if iszero(slt(rel_offset_of_tail, add(sub(calldatasize(), base_ref), not(30)))) { revert(0, 0) }\n let addr_1 := add(base_ref, rel_offset_of_tail)\n length := calldataload(addr_1)\n if gt(length, 0xffffffffffffffff) { revert(0, 0) }\n addr := add(addr_1, 0x20)\n if sgt(addr, sub(calldatasize(), shl(5, length))) { revert(0, 0) }\n }\n function abi_encode_tuple_t_uint256_t_bytes32__to_t_uint256_t_bytes32__fromStack_reversed(headStart, value1, value0) -> tail\n {\n tail := add(headStart, 64)\n mstore(headStart, value0)\n mstore(add(headStart, 32), value1)\n }\n function panic_error_0x41()\n {\n mstore(0, 35408467139433450592217433187231851964531694900788300625387963629091585785856)\n mstore(4, 0x41)\n revert(0, 0x24)\n }\n function allocate_memory(size) -> memPtr\n {\n memPtr := mload(64)\n let newFreePtr := add(memPtr, and(add(size, 31), not(31)))\n if or(gt(newFreePtr, 0xffffffffffffffff), lt(newFreePtr, memPtr)) { panic_error_0x41() }\n mstore(64, newFreePtr)\n }\n function array_allocation_size_array_uint32_dyn(length) -> size\n {\n if gt(length, 0xffffffffffffffff) { panic_error_0x41() }\n size := add(shl(5, length), 0x20)\n }\n function validator_revert_uint32(value)\n {\n if iszero(eq(value, and(value, 0xffffffff))) { revert(0, 0) }\n }\n function abi_decode_tuple_t_array$_t_uint32_$dyn_memory_ptr_fromMemory(headStart, dataEnd) -> value0\n {\n let _1 := 32\n if slt(sub(dataEnd, headStart), _1) { revert(0, 0) }\n let offset := mload(headStart)\n if gt(offset, 0xffffffffffffffff) { revert(0, 0) }\n let _2 := add(headStart, offset)\n if iszero(slt(add(_2, 0x1f), dataEnd)) { revert(0, 0) }\n let _3 := mload(_2)\n let dst := allocate_memory(array_allocation_size_array_uint32_dyn(_3))\n let dst_1 := dst\n mstore(dst, _3)\n dst := add(dst, _1)\n let srcEnd := add(add(_2, shl(5, _3)), _1)\n if gt(srcEnd, dataEnd) { revert(0, 0) }\n let src := add(_2, _1)\n for { } lt(src, srcEnd) { src := add(src, _1) }\n {\n let value := mload(src)\n validator_revert_uint32(value)\n mstore(dst, value)\n dst := add(dst, _1)\n }\n value0 := dst_1\n }\n function abi_decode_tuple_t_uint32(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_uint32(value)\n value0 := value\n }\n function checked_sub_t_uint8(x, y) -> diff\n {\n diff := sub(and(x, 0xff), and(y, 0xff))\n if gt(diff, 0xff) { panic_error_0x11() }\n }\n function abi_encode_tuple_t_array$_t_uint32_$dyn_memory_ptr__to_t_array$_t_uint32_$dyn_memory_ptr__fromStack_reversed(headStart, value0) -> tail\n {\n let _1 := 32\n let tail_1 := add(headStart, _1)\n mstore(headStart, _1)\n let pos := tail_1\n let length := mload(value0)\n mstore(tail_1, length)\n pos := add(headStart, 64)\n let srcPtr := add(value0, _1)\n let i := 0\n for { } lt(i, length) { i := add(i, 1) }\n {\n mstore(pos, and(mload(srcPtr), 0xffffffff))\n pos := add(pos, _1)\n srcPtr := add(srcPtr, _1)\n }\n tail := pos\n }\n function abi_encode_tuple_t_array$_t_uint32_$dyn_calldata_ptr__to_t_array$_t_uint32_$dyn_memory_ptr__fromStack_reversed(headStart, value1, value0) -> tail\n {\n let _1 := 32\n let tail_1 := add(headStart, _1)\n mstore(headStart, _1)\n let pos := tail_1\n mstore(tail_1, value1)\n pos := add(headStart, 64)\n let srcPtr := value0\n let i := 0\n for { } lt(i, value1) { i := add(i, 1) }\n {\n let value := calldataload(srcPtr)\n validator_revert_uint32(value)\n mstore(pos, and(value, 0xffffffff))\n pos := add(pos, _1)\n srcPtr := add(srcPtr, _1)\n }\n tail := pos\n }\n function abi_encode_tuple_t_uint256_t_bytes_calldata_ptr_t_array$_t_uint8_$dyn_calldata_ptr_t_uint256__to_t_uint256_t_bytes_memory_ptr_t_array$_t_uint8_$dyn_memory_ptr_t_uint256__fromStack_reversed(headStart, value5, value4, value3, value2, value1, value0) -> tail\n {\n mstore(headStart, value0)\n let _1 := 32\n mstore(add(headStart, _1), 128)\n mstore(add(headStart, 128), value2)\n calldatacopy(add(headStart, 160), value1, value2)\n mstore(add(add(headStart, value2), 160), 0)\n let _2 := add(headStart, and(add(value2, 31), not(31)))\n let end := add(_2, 160)\n mstore(add(headStart, 64), add(sub(_2, headStart), 160))\n let pos := end\n mstore(end, value4)\n pos := add(_2, 192)\n let srcPtr := value3\n let i := 0\n for { } lt(i, value4) { i := add(i, 1) }\n {\n mstore(pos, and(abi_decode_uint8(srcPtr), 0xff))\n pos := add(pos, _1)\n srcPtr := add(srcPtr, _1)\n }\n tail := pos\n mstore(add(headStart, 96), value5)\n }\n function abi_decode_tuple_t_array$_t_address_$dyn_memory_ptr_fromMemory(headStart, dataEnd) -> value0\n {\n let _1 := 32\n if slt(sub(dataEnd, headStart), _1) { revert(0, 0) }\n let offset := mload(headStart)\n if gt(offset, 0xffffffffffffffff) { revert(0, 0) }\n let _2 := add(headStart, offset)\n if iszero(slt(add(_2, 0x1f), dataEnd)) { revert(0, 0) }\n let _3 := mload(_2)\n let dst := allocate_memory(array_allocation_size_array_uint32_dyn(_3))\n let dst_1 := dst\n mstore(dst, _3)\n dst := add(dst, _1)\n let srcEnd := add(add(_2, shl(5, _3)), _1)\n if gt(srcEnd, dataEnd) { revert(0, 0) }\n let src := add(_2, _1)\n for { } lt(src, srcEnd) { src := add(src, _1) }\n {\n let value := mload(src)\n if iszero(eq(value, and(value, 0xffffffffffffffffffffffffffffffffffffffff)))\n {\n let _4 := 0\n revert(_4, _4)\n }\n mstore(dst, value)\n dst := add(dst, _1)\n }\n value0 := dst_1\n }\n function checked_mul_t_uint256(x, y) -> product\n {\n product := mul(x, y)\n if iszero(or(iszero(x), eq(y, div(product, x)))) { panic_error_0x11() }\n }\n function abi_encode_tuple_packed_t_stringliteral_178a2411ab6fbc1ba11064408972259c558d0e82fd48b0aba3ad81d14f065e73_t_bytes32__to_t_string_memory_ptr_t_bytes32__nonPadded_inplace_fromStack_reversed(pos, value0) -> end\n {\n mstore(pos, 0x19457468657265756d205369676e6564204d6573736167653a0a333200000000)\n mstore(add(pos, 28), value0)\n end := add(pos, 60)\n }\n function checked_add_t_uint256(x, y) -> sum\n {\n sum := add(x, y)\n if gt(x, sum) { panic_error_0x11() }\n }\n function abi_encode_tuple_t_stringliteral_f1c269d7eab972b2fd4d87a15c317e920493e7eea923de7e48c0ebcb7f611fa9__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 19)\n mstore(add(headStart, 64), \"Slice out of bounds\")\n tail := add(headStart, 96)\n }\n function panic_error_0x21()\n {\n mstore(0, 35408467139433450592217433187231851964531694900788300625387963629091585785856)\n mstore(4, 0x21)\n revert(0, 0x24)\n }\n function abi_encode_tuple_t_stringliteral_00043f6bf76368aa97c21698e9b9d4779e31902453daccf3525ddfb36e53e2be__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 24)\n mstore(add(headStart, 64), \"ECDSA: invalid signature\")\n tail := add(headStart, 96)\n }\n function abi_encode_tuple_t_stringliteral_1669ff3ba3cdf64474e1193492d05b8434e29b0b495e60095eb5f5c8ec14ce77__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 31)\n mstore(add(headStart, 64), \"ECDSA: invalid signature length\")\n tail := add(headStart, 96)\n }\n function abi_encode_tuple_t_stringliteral_520d1f787dbcafbbfc007fd2c4ecf3d2711ec587f3ee9a1215c0b646c3e530bd__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 34)\n mstore(add(headStart, 64), \"ECDSA: invalid signature 's' val\")\n mstore(add(headStart, 96), \"ue\")\n tail := add(headStart, 128)\n }\n function abi_encode_tuple_t_bytes32_t_uint8_t_bytes32_t_bytes32__to_t_bytes32_t_uint8_t_bytes32_t_bytes32__fromStack_reversed(headStart, value3, value2, value1, value0) -> tail\n {\n tail := add(headStart, 128)\n mstore(headStart, value0)\n mstore(add(headStart, 32), and(value1, 0xff))\n mstore(add(headStart, 64), value2)\n mstore(add(headStart, 96), value3)\n }\n}",
11978
11978
  "id": 126,
11979
11979
  "language": "Yul",
11980
11980
  "name": "#utility.yul"