@keep-network/tbtc-v2 1.7.0 → 1.7.1

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 (235) hide show
  1. package/artifacts/.chainId +1 -1
  2. package/artifacts/BLS.json +223 -0
  3. package/artifacts/Bank.json +50 -40
  4. package/artifacts/BeaconAuthorization.json +273 -0
  5. package/artifacts/BeaconDkg.json +241 -0
  6. package/artifacts/BeaconDkgValidator.json +501 -0
  7. package/artifacts/BeaconInactivity.json +151 -0
  8. package/artifacts/BeaconSortitionPool.json +1187 -0
  9. package/artifacts/Bridge.json +449 -32
  10. package/artifacts/BridgeGovernance.json +22 -22
  11. package/artifacts/BridgeGovernanceParameters.json +10 -10
  12. package/artifacts/Deposit.json +12 -12
  13. package/artifacts/DepositSweep.json +12 -12
  14. package/artifacts/DonationVault.json +17 -17
  15. package/artifacts/EcdsaDkgValidator.json +517 -0
  16. package/artifacts/EcdsaInactivity.json +156 -0
  17. package/artifacts/EcdsaSortitionPool.json +1187 -0
  18. package/artifacts/Fraud.json +12 -12
  19. package/artifacts/LightRelay.json +38 -38
  20. package/artifacts/LightRelayMaintainerProxy.json +31 -31
  21. package/artifacts/MaintainerProxy.json +44 -44
  22. package/artifacts/MovingFunds.json +12 -12
  23. package/artifacts/NuCypherToken.json +711 -0
  24. package/artifacts/RandomBeacon.json +3271 -0
  25. package/artifacts/RandomBeaconChaosnet.json +252 -0
  26. package/artifacts/RandomBeaconGovernance.json +3499 -0
  27. package/artifacts/Redemption.json +12 -12
  28. package/artifacts/RedemptionWatchtower.json +39 -39
  29. package/artifacts/ReimbursementPool.json +509 -0
  30. package/artifacts/T.json +1148 -0
  31. package/artifacts/TBTC.json +37 -36
  32. package/artifacts/TBTCToken.json +738 -0
  33. package/artifacts/TBTCVault.json +47 -47
  34. package/artifacts/Timelock.json +148 -148
  35. package/artifacts/TokenStaking.json +2117 -0
  36. package/artifacts/TokenholderGovernor.json +1795 -0
  37. package/artifacts/TokenholderTimelock.json +1058 -0
  38. package/artifacts/VendingMachine.json +35 -34
  39. package/artifacts/VendingMachineNuCypher.json +400 -0
  40. package/artifacts/VendingMachineV2.json +21 -21
  41. package/artifacts/VendingMachineV3.json +21 -21
  42. package/artifacts/WalletProposalValidator.json +12 -12
  43. package/artifacts/WalletRegistry.json +1962 -0
  44. package/artifacts/WalletRegistryGovernance.json +2863 -0
  45. package/artifacts/Wallets.json +12 -12
  46. package/artifacts/solcInputs/{be146ce112252bdda3a03de3614fbbf1.json → 2cb3f9e60e45f0ca528d3d5260ff3139.json} +31 -7
  47. package/build/contracts/GovernanceUtils.sol/GovernanceUtils.dbg.json +1 -1
  48. package/build/contracts/Timelock.sol/Timelock.dbg.json +1 -1
  49. package/build/contracts/bank/Bank.sol/Bank.dbg.json +1 -1
  50. package/build/contracts/bank/IReceiveBalanceApproval.sol/IReceiveBalanceApproval.dbg.json +1 -1
  51. package/build/contracts/bridge/BitcoinTx.sol/BitcoinTx.dbg.json +1 -1
  52. package/build/contracts/bridge/Bridge.sol/Bridge.dbg.json +1 -1
  53. package/build/contracts/bridge/BridgeGovernanceParameters.sol/BridgeGovernanceParameters.dbg.json +1 -1
  54. package/build/contracts/bridge/BridgeState.sol/BridgeState.dbg.json +1 -1
  55. package/build/contracts/bridge/Deposit.sol/Deposit.dbg.json +1 -1
  56. package/build/contracts/bridge/DepositSweep.sol/DepositSweep.dbg.json +1 -1
  57. package/build/contracts/bridge/EcdsaLib.sol/EcdsaLib.dbg.json +1 -1
  58. package/build/contracts/bridge/Fraud.sol/Fraud.dbg.json +1 -1
  59. package/build/contracts/bridge/Heartbeat.sol/Heartbeat.dbg.json +1 -1
  60. package/build/contracts/bridge/IRelay.sol/IRelay.dbg.json +1 -1
  61. package/build/contracts/bridge/MovingFunds.sol/MovingFunds.dbg.json +1 -1
  62. package/build/contracts/bridge/Redemption.sol/IRedemptionWatchtower.dbg.json +1 -1
  63. package/build/contracts/bridge/Redemption.sol/OutboundTx.dbg.json +1 -1
  64. package/build/contracts/bridge/Redemption.sol/Redemption.dbg.json +1 -1
  65. package/build/contracts/bridge/RedemptionWatchtower.sol/RedemptionWatchtower.dbg.json +1 -1
  66. package/build/contracts/bridge/VendingMachine.sol/VendingMachine.dbg.json +1 -1
  67. package/build/contracts/bridge/VendingMachineV2.sol/VendingMachineV2.dbg.json +1 -1
  68. package/build/contracts/bridge/VendingMachineV3.sol/VendingMachineV3.dbg.json +1 -1
  69. package/build/contracts/bridge/WalletProposalValidator.sol/WalletProposalValidator.dbg.json +1 -1
  70. package/build/contracts/bridge/Wallets.sol/Wallets.dbg.json +1 -1
  71. package/build/contracts/integrator/AbstractTBTCDepositor.sol/AbstractTBTCDepositor.dbg.json +1 -1
  72. package/build/contracts/integrator/IBridge.sol/IBridge.dbg.json +1 -1
  73. package/build/contracts/integrator/IBridge.sol/IBridgeTypes.dbg.json +1 -1
  74. package/build/contracts/integrator/ITBTCVault.sol/ITBTCVault.dbg.json +1 -1
  75. package/build/contracts/l2/L1BitcoinDepositor.sol/L1BitcoinDepositor.dbg.json +1 -1
  76. package/build/contracts/l2/L1BitcoinDepositor.sol/L1BitcoinDepositor.json +41 -2
  77. package/build/contracts/l2/L2BitcoinDepositor.sol/IL2WormholeGateway.dbg.json +1 -1
  78. package/build/contracts/l2/L2BitcoinDepositor.sol/L2BitcoinDepositor.dbg.json +1 -1
  79. package/build/contracts/l2/L2TBTC.sol/L2TBTC.dbg.json +1 -1
  80. package/build/contracts/l2/L2WormholeGateway.sol/L2WormholeGateway.dbg.json +1 -1
  81. package/build/contracts/l2/Wormhole.sol/IWormhole.dbg.json +1 -1
  82. package/build/contracts/l2/Wormhole.sol/IWormholeReceiver.dbg.json +1 -1
  83. package/build/contracts/l2/Wormhole.sol/IWormholeRelayer.dbg.json +1 -1
  84. package/build/contracts/l2/Wormhole.sol/IWormholeTokenBridge.dbg.json +1 -1
  85. package/build/contracts/l2/Wormhole.sol/WormholeTypes.dbg.json +1 -1
  86. package/build/contracts/l2/Wormhole.sol/WormholeUtils.dbg.json +1 -1
  87. package/build/contracts/maintainer/MaintainerProxy.sol/MaintainerProxy.dbg.json +1 -1
  88. package/build/contracts/relay/LightRelay.sol/ILightRelay.dbg.json +1 -1
  89. package/build/contracts/relay/LightRelay.sol/LightRelay.dbg.json +1 -1
  90. package/build/contracts/relay/LightRelay.sol/RelayUtils.dbg.json +1 -1
  91. package/build/contracts/relay/LightRelayMaintainerProxy.sol/LightRelayMaintainerProxy.dbg.json +1 -1
  92. package/build/contracts/test/BankStub.sol/BankStub.dbg.json +1 -1
  93. package/build/contracts/test/BridgeStub.sol/BridgeStub.dbg.json +1 -1
  94. package/build/contracts/test/HeartbeatStub.sol/HeartbeatStub.dbg.json +1 -1
  95. package/build/contracts/test/LightRelayStub.sol/LightRelayStub.dbg.json +1 -1
  96. package/build/contracts/test/ReceiveApprovalStub.sol/ReceiveApprovalStub.dbg.json +1 -1
  97. package/build/contracts/test/SepoliaLightRelay.sol/SepoliaLightRelay.dbg.json +1 -1
  98. package/build/contracts/test/SystemTestRelay.sol/SystemTestRelay.dbg.json +1 -1
  99. package/build/contracts/test/TestBitcoinTx.sol/TestBitcoinTx.dbg.json +1 -1
  100. package/build/contracts/test/TestERC20.sol/TestERC20.dbg.json +1 -1
  101. package/build/contracts/test/TestERC721.sol/TestERC721.dbg.json +1 -1
  102. package/build/contracts/test/TestEcdsaLib.sol/TestEcdsaLib.dbg.json +1 -1
  103. package/build/contracts/test/TestTBTCDepositor.sol/MockBridge.dbg.json +1 -1
  104. package/build/contracts/test/TestTBTCDepositor.sol/MockTBTCVault.dbg.json +1 -1
  105. package/build/contracts/test/TestTBTCDepositor.sol/TestTBTCDepositor.dbg.json +1 -1
  106. package/build/contracts/test/WormholeBridgeStub.sol/WormholeBridgeStub.dbg.json +1 -1
  107. package/build/contracts/token/TBTC.sol/TBTC.dbg.json +1 -1
  108. package/build/contracts/vault/DonationVault.sol/DonationVault.dbg.json +1 -1
  109. package/build/contracts/vault/IVault.sol/IVault.dbg.json +1 -1
  110. package/build/contracts/vault/TBTCOptimisticMinting.sol/TBTCOptimisticMinting.dbg.json +1 -1
  111. package/build/contracts/vault/TBTCVault.sol/TBTCVault.dbg.json +1 -1
  112. package/contracts/l2/L1BitcoinDepositor.sol +31 -0
  113. package/export/artifacts/@keep-network/ecdsa/contracts/EcdsaDkgValidator.sol/EcdsaDkgValidator.json +24 -24
  114. package/export/artifacts/@keep-network/ecdsa/contracts/WalletRegistry.sol/WalletRegistry.json +4999 -4814
  115. package/export/artifacts/@keep-network/ecdsa/contracts/libraries/EcdsaDkg.sol/EcdsaDkg.json +2 -2
  116. package/export/artifacts/@keep-network/ecdsa/contracts/libraries/EcdsaInactivity.sol/EcdsaInactivity.json +23 -23
  117. package/export/artifacts/@keep-network/random-beacon/contracts/ReimbursementPool.sol/ReimbursementPool.json +53 -53
  118. package/export/artifacts/@keep-network/sortition-pools/contracts/Chaosnet.sol/Chaosnet.json +21 -21
  119. package/export/artifacts/@keep-network/sortition-pools/contracts/Rewards.sol/Rewards.json +16 -16
  120. package/export/artifacts/@keep-network/sortition-pools/contracts/SortitionPool.sol/SortitionPool.json +206 -206
  121. package/export/artifacts/@keep-network/sortition-pools/contracts/SortitionTree.sol/SortitionTree.json +26 -26
  122. package/export/artifacts/@openzeppelin/contracts/governance/TimelockController.sol/TimelockController.json +107 -107
  123. package/export/artifacts/@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol/ERC1967Proxy.json +46 -46
  124. package/export/artifacts/@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol/ProxyAdmin.json +36 -36
  125. package/export/artifacts/@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol/TransparentUpgradeableProxy.json +78 -78
  126. package/export/artifacts/@openzeppelin/contracts/token/ERC721/ERC721.sol/ERC721.json +68 -68
  127. package/export/artifacts/@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol/ERC20Upgradeable.json +43 -43
  128. package/export/artifacts/@thesis/solidity-contracts/contracts/token/ERC20WithPermit.sol/ERC20WithPermit.json +79 -79
  129. package/export/artifacts/@thesis/solidity-contracts/contracts/token/MisfundRecovery.sol/MisfundRecovery.json +42 -42
  130. package/export/artifacts/contracts/Timelock.sol/Timelock.json +109 -109
  131. package/export/artifacts/contracts/bank/Bank.sol/Bank.json +77 -77
  132. package/export/artifacts/contracts/bridge/Bridge.sol/Bridge.json +338 -338
  133. package/export/artifacts/contracts/bridge/RedemptionWatchtower.sol/RedemptionWatchtower.json +128 -128
  134. package/export/artifacts/contracts/bridge/VendingMachine.sol/VendingMachine.json +108 -108
  135. package/export/artifacts/contracts/bridge/VendingMachineV2.sol/VendingMachineV2.json +63 -63
  136. package/export/artifacts/contracts/bridge/VendingMachineV3.sol/VendingMachineV3.json +65 -65
  137. package/export/artifacts/contracts/bridge/WalletProposalValidator.sol/WalletProposalValidator.json +67 -67
  138. package/export/artifacts/contracts/l2/L1BitcoinDepositor.sol/L1BitcoinDepositor.json +4431 -4171
  139. package/export/artifacts/contracts/l2/L2BitcoinDepositor.sol/L2BitcoinDepositor.json +62 -62
  140. package/export/artifacts/contracts/l2/L2TBTC.sol/L2TBTC.json +194 -194
  141. package/export/artifacts/contracts/l2/L2WormholeGateway.sol/L2WormholeGateway.json +102 -102
  142. package/export/artifacts/contracts/maintainer/MaintainerProxy.sol/MaintainerProxy.json +149 -149
  143. package/export/artifacts/contracts/relay/LightRelay.sol/LightRelay.json +76 -76
  144. package/export/artifacts/contracts/relay/LightRelayMaintainerProxy.sol/LightRelayMaintainerProxy.json +62 -62
  145. package/export/artifacts/contracts/test/BankStub.sol/BankStub.json +79 -79
  146. package/export/artifacts/contracts/test/BridgeStub.sol/BridgeStub.json +376 -376
  147. package/export/artifacts/contracts/test/HeartbeatStub.sol/HeartbeatStub.json +4 -4
  148. package/export/artifacts/contracts/test/LightRelayStub.sol/LightRelayStub.json +78 -78
  149. package/export/artifacts/contracts/test/ReceiveApprovalStub.sol/ReceiveApprovalStub.json +7 -7
  150. package/export/artifacts/contracts/test/SepoliaLightRelay.sol/SepoliaLightRelay.json +78 -78
  151. package/export/artifacts/contracts/test/SystemTestRelay.sol/SystemTestRelay.json +14 -14
  152. package/export/artifacts/contracts/test/TestBitcoinTx.sol/TestBitcoinTx.json +132 -132
  153. package/export/artifacts/contracts/test/TestERC20.sol/TestERC20.json +85 -85
  154. package/export/artifacts/contracts/test/TestERC721.sol/TestERC721.json +78 -78
  155. package/export/artifacts/contracts/test/TestEcdsaLib.sol/TestEcdsaLib.json +4 -4
  156. package/export/artifacts/contracts/test/TestTBTCDepositor.sol/MockBridge.json +34 -34
  157. package/export/artifacts/contracts/test/TestTBTCDepositor.sol/MockTBTCVault.json +20 -20
  158. package/export/artifacts/contracts/test/TestTBTCDepositor.sol/TestTBTCDepositor.json +52 -52
  159. package/export/artifacts/contracts/test/WormholeBridgeStub.sol/WormholeBridgeStub.json +37 -37
  160. package/export/artifacts/contracts/token/TBTC.sol/TBTC.json +104 -104
  161. package/export/artifacts/contracts/vault/DonationVault.sol/DonationVault.json +19 -19
  162. package/export/artifacts/contracts/vault/TBTCVault.sol/TBTCVault.json +184 -184
  163. package/export/typechain/factories/EcdsaAuthorization__factory.js +1 -1
  164. package/export/typechain/factories/IStaking__factory.js +24 -103
  165. package/export/typechain/factories/L1BitcoinDepositor__factory.js +40 -1
  166. package/export/typechain/factories/WalletRegistry__factory.js +1 -1
  167. package/package.json +2 -2
  168. package/artifacts/solcInputs/7c1f8f1dbded4c787d87a982d1fc8349.json +0 -410
  169. package/artifacts/solcInputs/7cc3eda3cb3ff2522d18b5e7b31ea228.json +0 -102
  170. package/artifacts/solcInputs/802132f7da69a8a4226cb9424480847b.json +0 -218
  171. package/artifacts/solcInputs/887fad6b16575ba42183543c324eeb0e.json +0 -335
  172. package/artifacts/solcInputs/98e272e2fbf178ec895387b6c503f9de.json +0 -68
  173. package/artifacts/solcInputs/b0025f1f7efe4824592ac0c9793776c3.json +0 -392
  174. package/artifacts/solcInputs/b7c5f3550cc22e16e6b6ea9582ccbee3.json +0 -341
  175. package/artifacts/solcInputs/d71d4b4434e6669852eaf643ebd2a7bc.json +0 -209
  176. package/artifacts/solcInputs/fccb130292c8c7cc958ab4fa31a3e180.json +0 -187
  177. package/export/deploy/00_resolve_relay.js +0 -83
  178. package/export/deploy/01_deploy_tbtc_v2_token.js +0 -70
  179. package/export/deploy/02_deploy_vending_machine.js +0 -84
  180. package/export/deploy/03_transfer_vending_machine_roles.js +0 -69
  181. package/export/deploy/04_deploy_bank.js +0 -73
  182. package/export/deploy/05_deploy_bridge.js +0 -178
  183. package/export/deploy/06_deploy_tbtc_vault.js +0 -80
  184. package/export/deploy/07_deploy_bridge_governance.js +0 -87
  185. package/export/deploy/08_deploy_maintainer_proxy.js +0 -80
  186. package/export/deploy/09_bank_update_bridge.js +0 -63
  187. package/export/deploy/10_authorize_spv_maintainer_in_bridge.js +0 -61
  188. package/export/deploy/11_transfer_bank_ownership.js +0 -60
  189. package/export/deploy/12_transfer_bridge_governance.js +0 -63
  190. package/export/deploy/13_transfer_bridge_governance_ownership.js +0 -60
  191. package/export/deploy/14_transfer_tbtc_vault_ownership.js +0 -60
  192. package/export/deploy/15_transfer_maintainer_proxy_ownership.js +0 -60
  193. package/export/deploy/16_initialize_wallet_owner.js +0 -63
  194. package/export/deploy/16_transfer_proxy_admin_ownership.js +0 -73
  195. package/export/deploy/17_authorize_maintainer_proxy_in_bridge.js +0 -63
  196. package/export/deploy/17_transfer_proxy_admin_ownership.js +0 -73
  197. package/export/deploy/18_authorize_maintainer_proxy_in_bridge.js +0 -63
  198. package/export/deploy/18_authorize_maintainer_proxy_in_reimbursement_pool.js +0 -63
  199. package/export/deploy/19_authorize_bridge_in_reimbursement_pool.js +0 -63
  200. package/export/deploy/19_authorize_maintainer_proxy_in_reimbursement_pool.js +0 -63
  201. package/export/deploy/20_authorize_bridge_in_reimbursement_pool.js +0 -63
  202. package/export/deploy/20_deploy_proxy_admin_with_deputy.js +0 -80
  203. package/export/deploy/21_transfer_reimbursement_pool_ownership.js +0 -60
  204. package/export/deploy/22_deploy_proxy_admin_with_deputy.js +0 -80
  205. package/export/deploy/24_transfer_maintainer_proxy_ownership.js +0 -60
  206. package/export/deploy/25_transfer_proxy_admin_ownership.js +0 -73
  207. package/export/deploy/26_authorize_maintainer_proxy_in_reimbursement_pool.js +0 -70
  208. package/export/deploy/27_authorize_bridge_in_reimbursement_pool.js +0 -70
  209. package/export/deploy/28_deploy_proxy_admin_with_deputy.js +0 -80
  210. package/export/deploy/34_deploy_wallet_coordinator.js +0 -115
  211. package/export/deploy/35_add_coordinator_address.js +0 -60
  212. package/export/deploy/35_transfer_wallet_coordinator_ownership.js +0 -60
  213. package/export/deploy/36_deploy_light_relay_maintainer_proxy.js +0 -86
  214. package/export/deploy/36_transfer_wallet_coordinator_ownership.js +0 -60
  215. package/export/deploy/37_authorize_maintainer_in_light_relay_maintainer_proxy.js +0 -65
  216. package/export/deploy/37_deploy_light_relay_maintainer_proxy.js +0 -86
  217. package/export/deploy/37_transfer_light_relay_maintainer_proxy_ownership.js +0 -60
  218. package/export/deploy/38_authorize_light_relay_maintainer_proxy_in_reimbursement_pool.js +0 -70
  219. package/export/deploy/38_authorize_maintainer_in_light_relay_maintainer_proxy.js +0 -65
  220. package/export/deploy/38_transfer_light_relay_maintainer_proxy_ownership.js +0 -60
  221. package/export/deploy/39_authorize_light_relay_maintainer_proxy_in_light_relay.js +0 -63
  222. package/export/deploy/39_authorize_light_relay_maintainer_proxy_in_reimbursement_pool.js +0 -70
  223. package/export/deploy/39_transfer_light_relay_maintainer_proxy_ownership.js +0 -60
  224. package/export/deploy/40_authorize_light_relay_maintainer_proxy_in_light_relay.js +0 -66
  225. package/export/deploy/40_authorize_light_relay_maintainer_proxy_in_reimbursement_pool.js +0 -70
  226. package/export/deploy/41_authorize_light_relay_maintainer_proxy_in_light_relay.js +0 -66
  227. package/export/typechain/GoerliLightRelay.js +0 -2
  228. package/export/typechain/RelayStub.js +0 -2
  229. package/export/typechain/TestRelay.js +0 -2
  230. package/export/typechain/WalletCoordinator.js +0 -2
  231. package/export/typechain/factories/GoerliLightRelay__factory.js +0 -535
  232. package/export/typechain/factories/RelayStub__factory.js +0 -546
  233. package/export/typechain/factories/TestRelay__factory.js +0 -168
  234. package/export/typechain/factories/WalletCoordinator__factory.js +0 -1121
  235. package/export.json +0 -16130
@@ -1 +1 @@
1
- 1
1
+ 31337
@@ -0,0 +1,223 @@
1
+ {
2
+ "address": "0xe6b98F104c1BEf218F3893ADab4160Dc73Eb8367",
3
+ "abi": [
4
+ {
5
+ "inputs": [
6
+ {
7
+ "components": [
8
+ {
9
+ "components": [
10
+ {
11
+ "internalType": "uint256",
12
+ "name": "x",
13
+ "type": "uint256"
14
+ },
15
+ {
16
+ "internalType": "uint256",
17
+ "name": "y",
18
+ "type": "uint256"
19
+ }
20
+ ],
21
+ "internalType": "struct AltBn128.gfP2",
22
+ "name": "x",
23
+ "type": "tuple"
24
+ },
25
+ {
26
+ "components": [
27
+ {
28
+ "internalType": "uint256",
29
+ "name": "x",
30
+ "type": "uint256"
31
+ },
32
+ {
33
+ "internalType": "uint256",
34
+ "name": "y",
35
+ "type": "uint256"
36
+ }
37
+ ],
38
+ "internalType": "struct AltBn128.gfP2",
39
+ "name": "y",
40
+ "type": "tuple"
41
+ }
42
+ ],
43
+ "internalType": "struct AltBn128.G2Point",
44
+ "name": "publicKey",
45
+ "type": "tuple"
46
+ },
47
+ {
48
+ "components": [
49
+ {
50
+ "internalType": "uint256",
51
+ "name": "x",
52
+ "type": "uint256"
53
+ },
54
+ {
55
+ "internalType": "uint256",
56
+ "name": "y",
57
+ "type": "uint256"
58
+ }
59
+ ],
60
+ "internalType": "struct AltBn128.G1Point",
61
+ "name": "message",
62
+ "type": "tuple"
63
+ },
64
+ {
65
+ "components": [
66
+ {
67
+ "internalType": "uint256",
68
+ "name": "x",
69
+ "type": "uint256"
70
+ },
71
+ {
72
+ "internalType": "uint256",
73
+ "name": "y",
74
+ "type": "uint256"
75
+ }
76
+ ],
77
+ "internalType": "struct AltBn128.G1Point",
78
+ "name": "signature",
79
+ "type": "tuple"
80
+ }
81
+ ],
82
+ "name": "_verify",
83
+ "outputs": [
84
+ {
85
+ "internalType": "bool",
86
+ "name": "",
87
+ "type": "bool"
88
+ }
89
+ ],
90
+ "stateMutability": "view",
91
+ "type": "function"
92
+ },
93
+ {
94
+ "inputs": [
95
+ {
96
+ "internalType": "bytes",
97
+ "name": "message",
98
+ "type": "bytes"
99
+ },
100
+ {
101
+ "internalType": "uint256",
102
+ "name": "secretKey",
103
+ "type": "uint256"
104
+ }
105
+ ],
106
+ "name": "sign",
107
+ "outputs": [
108
+ {
109
+ "internalType": "bytes",
110
+ "name": "",
111
+ "type": "bytes"
112
+ }
113
+ ],
114
+ "stateMutability": "view",
115
+ "type": "function"
116
+ },
117
+ {
118
+ "inputs": [
119
+ {
120
+ "internalType": "bytes",
121
+ "name": "publicKey",
122
+ "type": "bytes"
123
+ },
124
+ {
125
+ "internalType": "bytes",
126
+ "name": "message",
127
+ "type": "bytes"
128
+ },
129
+ {
130
+ "internalType": "bytes",
131
+ "name": "signature",
132
+ "type": "bytes"
133
+ }
134
+ ],
135
+ "name": "verify",
136
+ "outputs": [
137
+ {
138
+ "internalType": "bool",
139
+ "name": "",
140
+ "type": "bool"
141
+ }
142
+ ],
143
+ "stateMutability": "view",
144
+ "type": "function"
145
+ },
146
+ {
147
+ "inputs": [
148
+ {
149
+ "internalType": "bytes",
150
+ "name": "publicKey",
151
+ "type": "bytes"
152
+ },
153
+ {
154
+ "internalType": "bytes",
155
+ "name": "message",
156
+ "type": "bytes"
157
+ },
158
+ {
159
+ "internalType": "bytes",
160
+ "name": "signature",
161
+ "type": "bytes"
162
+ }
163
+ ],
164
+ "name": "verifyBytes",
165
+ "outputs": [
166
+ {
167
+ "internalType": "bool",
168
+ "name": "",
169
+ "type": "bool"
170
+ }
171
+ ],
172
+ "stateMutability": "view",
173
+ "type": "function"
174
+ }
175
+ ],
176
+ "transactionHash": "0x34b71c16b8b6efa9edfd50da14004b79b03bb9eafbf562cab963150c9bfeeaaa",
177
+ "receipt": {
178
+ "to": null,
179
+ "from": "0x70997970C51812dc3A010C7d01b50e0d17dc79C8",
180
+ "contractAddress": "0xe6b98F104c1BEf218F3893ADab4160Dc73Eb8367",
181
+ "transactionIndex": 0,
182
+ "gasUsed": "709678",
183
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
184
+ "blockHash": "0x91b2e35cfd3e332b0370caa283d7349238041d521280b3849e658f29da457fc8",
185
+ "transactionHash": "0x34b71c16b8b6efa9edfd50da14004b79b03bb9eafbf562cab963150c9bfeeaaa",
186
+ "logs": [],
187
+ "blockNumber": 17,
188
+ "cumulativeGasUsed": "709678",
189
+ "status": 1,
190
+ "byzantium": true
191
+ },
192
+ "args": [],
193
+ "numDeployments": 1,
194
+ "metadata": "{\"compiler\":{\"version\":\"0.8.17+commit.8df45f5f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"components\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct AltBn128.gfP2\",\"name\":\"x\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct AltBn128.gfP2\",\"name\":\"y\",\"type\":\"tuple\"}],\"internalType\":\"struct AltBn128.G2Point\",\"name\":\"publicKey\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct AltBn128.G1Point\",\"name\":\"message\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct AltBn128.G1Point\",\"name\":\"signature\",\"type\":\"tuple\"}],\"name\":\"_verify\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"secretKey\",\"type\":\"uint256\"}],\"name\":\"sign\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"publicKey\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"name\":\"verify\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"publicKey\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"name\":\"verifyBytes\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"Library for verification of 2-pairing-check BLS signatures, including basic, aggregated, or reconstructed threshold BLS signatures, generated using the AltBn128 curve.\",\"kind\":\"dev\",\"methods\":{\"sign(bytes,uint256)\":{\"details\":\"Creates a signature over message using the provided secret key.\"},\"verify(bytes,bytes,bytes)\":{\"details\":\"Verify performs the pairing operation to check if the signature is correct for the provided message and the corresponding public key. Public key must be a valid point on G2 curve in an uncompressed format. Message must be a valid point on G1 curve in an uncompressed format. Signature must be a valid point on G1 curve in an uncompressed format.\"},\"verifyBytes(bytes,bytes,bytes)\":{\"details\":\"Wraps the functionality of BLS.verify, but hashes a message to a point on G1 and marshal to bytes first to allow raw bytes verification.\"}},\"title\":\"BLS signatures verification\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/libraries/BLS.sol\":\"BLS\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/libraries/AltBn128.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-only\\n//\\n// \\u2593\\u2593\\u258c \\u2593\\u2593 \\u2590\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u258c\\u2590\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2584\\n// \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u258c\\u2590\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\n// \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2580 \\u2590\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2590\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593 \\u2590\\u2593\\u2593\\u2593\\u2593\\u2593\\u258c \\u2590\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\n// \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2584\\u2584\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2580 \\u2590\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2584\\u2584\\u2584\\u2584 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2584\\u2584\\u2584\\u2584 \\u2590\\u2593\\u2593\\u2593\\u2593\\u2593\\u258c \\u2590\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\n// \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2580 \\u2590\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2590\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\n// \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2580\\u2580\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2584 \\u2590\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2580\\u2580\\u2580\\u2580 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2580\\u2580\\u2580\\u2580 \\u2590\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2580\\n// \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2580\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2584 \\u2590\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593 \\u2590\\u2593\\u2593\\u2593\\u2593\\u2593\\u258c\\n// \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2588\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2590\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\n// \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2590\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\n//\\n//\\n\\npragma solidity 0.8.17;\\n\\nimport \\\"./ModUtils.sol\\\";\\n\\n/// @title Operations on alt_bn128\\n/// @dev Implementations of common elliptic curve operations on Ethereum's\\n/// (poorly named) alt_bn128 curve. Whenever possible, use post-Byzantium\\n/// pre-compiled contracts to offset gas costs. Note that these\\n/// pre-compiles might not be available on all (eg private) chains.\\nlibrary AltBn128 {\\n using ModUtils for uint256;\\n\\n // G1Point implements a point in G1 group.\\n struct G1Point {\\n uint256 x;\\n uint256 y;\\n }\\n\\n // gfP2 implements a field of size p\\u00b2 as a quadratic extension of the base\\n // field.\\n struct gfP2 {\\n uint256 x;\\n uint256 y;\\n }\\n\\n // G2Point implements a point in G2 group.\\n struct G2Point {\\n gfP2 x;\\n gfP2 y;\\n }\\n\\n // p is a prime over which we form a basic field\\n // Taken from go-ethereum/crypto/bn256/cloudflare/constants.go\\n uint256 internal constant p =\\n 21888242871839275222246405745257275088696311157297823662689037894645226208583;\\n\\n /// @dev Gets generator of G1 group.\\n /// Taken from go-ethereum/crypto/bn256/cloudflare/curve.go\\n uint256 internal constant g1x = 1;\\n uint256 internal constant g1y = 2;\\n\\n /// @dev Gets generator of G2 group.\\n /// Taken from go-ethereum/crypto/bn256/cloudflare/twist.go\\n uint256 internal constant g2xx =\\n 11559732032986387107991004021392285783925812861821192530917403151452391805634;\\n uint256 internal constant g2xy =\\n 10857046999023057135944570762232829481370756359578518086990519993285655852781;\\n uint256 internal constant g2yx =\\n 4082367875863433681332203403145435568316851327593401208105741076214120093531;\\n uint256 internal constant g2yy =\\n 8495653923123431417604973247489272438418190587263600148770280649306958101930;\\n\\n /// @dev Gets twist curve B constant.\\n /// Taken from go-ethereum/crypto/bn256/cloudflare/twist.go\\n uint256 internal constant twistBx =\\n 266929791119991161246907387137283842545076965332900288569378510910307636690;\\n uint256 internal constant twistBy =\\n 19485874751759354771024239261021720505790618469301721065564631296452457478373;\\n\\n /// @dev Gets root of the point where x and y are equal.\\n uint256 internal constant hexRootX =\\n 21573744529824266246521972077326577680729363968861965890554801909984373949499;\\n uint256 internal constant hexRootY =\\n 16854739155576650954933913186877292401521110422362946064090026408937773542853;\\n\\n /// @dev g1YFromX computes a Y value for a G1 point based on an X value.\\n /// This computation is simply evaluating the curve equation for Y on a\\n /// given X, and allows a point on the curve to be represented by just\\n /// an X value + a sign bit.\\n function g1YFromX(uint256 x) internal view returns (uint256) {\\n return ((x.modExp(3, p) + 3) % p).modSqrt(p);\\n }\\n\\n /// @dev Hash a byte array message, m, and map it deterministically to a\\n /// point on G1. Note that this approach was chosen for its simplicity\\n /// and lower gas cost on the EVM, rather than good distribution of\\n /// points on G1.\\n function g1HashToPoint(bytes memory m)\\n internal\\n view\\n returns (G1Point memory)\\n {\\n unchecked {\\n bytes32 h = sha256(m);\\n uint256 x = uint256(h) % p;\\n uint256 y;\\n\\n while (true) {\\n y = g1YFromX(x);\\n if (y > 0) {\\n return G1Point(x, y);\\n }\\n x += 1;\\n }\\n }\\n }\\n\\n /// @dev Decompress a point on G1 from a single uint256.\\n function g1Decompress(bytes32 m) internal view returns (G1Point memory) {\\n unchecked {\\n bytes32 mX = bytes32(0);\\n bytes1 leadX = m[0] & 0x7f;\\n // slither-disable-next-line incorrect-shift\\n uint256 mask = 0xff << (31 * 8);\\n mX = (m & ~bytes32(mask)) | (leadX >> 0);\\n\\n uint256 x = uint256(mX);\\n uint256 y = g1YFromX(x);\\n\\n if (parity(y) != (m[0] & 0x80) >> 7) {\\n y = p - y;\\n }\\n\\n require(\\n isG1PointOnCurve(G1Point(x, y)),\\n \\\"Malformed bn256.G1 point.\\\"\\n );\\n\\n return G1Point(x, y);\\n }\\n }\\n\\n /// @dev Wraps the point addition pre-compile introduced in Byzantium.\\n /// Returns the sum of two points on G1. Revert if the provided points\\n /// are not on the curve.\\n function g1Add(G1Point memory a, G1Point memory b)\\n internal\\n view\\n returns (G1Point memory c)\\n {\\n assembly {\\n let arg := mload(0x40)\\n mstore(arg, mload(a))\\n mstore(add(arg, 0x20), mload(add(a, 0x20)))\\n mstore(add(arg, 0x40), mload(b))\\n mstore(add(arg, 0x60), mload(add(b, 0x20)))\\n // 0x60 is the ECADD precompile address\\n if iszero(staticcall(not(0), 0x06, arg, 0x80, c, 0x40)) {\\n revert(0, 0)\\n }\\n }\\n }\\n\\n /// @dev Returns true if G1 point is on the curve.\\n function isG1PointOnCurve(G1Point memory point)\\n internal\\n view\\n returns (bool)\\n {\\n return point.y.modExp(2, p) == (point.x.modExp(3, p) + 3) % p;\\n }\\n\\n /// @dev Wraps the scalar point multiplication pre-compile introduced in\\n /// Byzantium. The result of a point from G1 multiplied by a scalar\\n /// should match the point added to itself the same number of times.\\n /// Revert if the provided point isn't on the curve.\\n function scalarMultiply(G1Point memory p_1, uint256 scalar)\\n internal\\n view\\n returns (G1Point memory p_2)\\n {\\n assembly {\\n let arg := mload(0x40)\\n mstore(arg, mload(p_1))\\n mstore(add(arg, 0x20), mload(add(p_1, 0x20)))\\n mstore(add(arg, 0x40), scalar)\\n // 0x07 is the ECMUL precompile address\\n if iszero(staticcall(not(0), 0x07, arg, 0x60, p_2, 0x40)) {\\n revert(0, 0)\\n }\\n }\\n }\\n\\n /// @dev Wraps the pairing check pre-compile introduced in Byzantium.\\n /// Returns the result of a pairing check of 2 pairs\\n /// (G1 p1, G2 p2) (G1 p3, G2 p4)\\n function pairing(\\n G1Point memory p1,\\n G2Point memory p2,\\n G1Point memory p3,\\n G2Point memory p4\\n ) internal view returns (bool result) {\\n uint256 _c;\\n assembly {\\n let c := mload(0x40)\\n let arg := add(c, 0x20)\\n\\n mstore(arg, mload(p1))\\n mstore(add(arg, 0x20), mload(add(p1, 0x20)))\\n\\n let p2x := mload(p2)\\n mstore(add(arg, 0x40), mload(p2x))\\n mstore(add(arg, 0x60), mload(add(p2x, 0x20)))\\n\\n let p2y := mload(add(p2, 0x20))\\n mstore(add(arg, 0x80), mload(p2y))\\n mstore(add(arg, 0xa0), mload(add(p2y, 0x20)))\\n\\n mstore(add(arg, 0xc0), mload(p3))\\n mstore(add(arg, 0xe0), mload(add(p3, 0x20)))\\n\\n let p4x := mload(p4)\\n mstore(add(arg, 0x100), mload(p4x))\\n mstore(add(arg, 0x120), mload(add(p4x, 0x20)))\\n\\n let p4y := mload(add(p4, 0x20))\\n mstore(add(arg, 0x140), mload(p4y))\\n mstore(add(arg, 0x160), mload(add(p4y, 0x20)))\\n\\n // call(gasLimit, to, value, inputOffset, inputSize, outputOffset, outputSize)\\n if iszero(staticcall(not(0), 0x08, arg, 0x180, c, 0x20)) {\\n revert(0, 0)\\n }\\n _c := mload(c)\\n }\\n return _c != 0;\\n }\\n\\n function getP() internal pure returns (uint256) {\\n return p;\\n }\\n\\n function g1() internal pure returns (G1Point memory) {\\n return G1Point(g1x, g1y);\\n }\\n\\n function g2() internal pure returns (G2Point memory) {\\n return G2Point(gfP2(g2xx, g2xy), gfP2(g2yx, g2yy));\\n }\\n\\n /// @dev g2YFromX computes a Y value for a G2 point based on an X value.\\n /// This computation is simply evaluating the curve equation for Y on a\\n /// given X, and allows a point on the curve to be represented by just\\n /// an X value + a sign bit.\\n function g2YFromX(gfP2 memory _x) internal pure returns (gfP2 memory y) {\\n (uint256 xx, uint256 xy) = _gfP2CubeAddTwistB(_x.x, _x.y);\\n\\n // Using formula y = x ^ (p^2 + 15) / 32 from\\n // https://github.com/ethereum/beacon_chain/blob/master/beacon_chain/utils/bls.py\\n // (p^2 + 15) / 32 results into a big 512bit value, so breaking it to two uint256 as (a * a + b)\\n uint256 a = 3869331240733915743250440106392954448556483137451914450067252501901456824595;\\n uint256 b = 146360017852723390495514512480590656176144969185739259173561346299185050597;\\n\\n (uint256 xbx, uint256 xby) = _gfP2Pow(xx, xy, b);\\n (uint256 yax, uint256 yay) = _gfP2Pow(xx, xy, a);\\n (uint256 ya2x, uint256 ya2y) = _gfP2Pow(yax, yay, a);\\n (y.x, y.y) = _gfP2Multiply(ya2x, ya2y, xbx, xby);\\n\\n // Multiply y by hexRoot constant to find correct y.\\n while (!_g2X2y(xx, xy, y.x, y.y)) {\\n (y.x, y.y) = _gfP2Multiply(y.x, y.y, hexRootX, hexRootY);\\n }\\n }\\n\\n /// @dev Compress a point on G1 to a single uint256 for serialization.\\n function g1Compress(G1Point memory point) internal pure returns (bytes32) {\\n bytes32 m = bytes32(point.x);\\n\\n bytes1 leadM = m[0] | (parity(point.y) << 7);\\n // slither-disable-next-line incorrect-shift\\n uint256 mask = 0xff << (31 * 8);\\n m = (m & ~bytes32(mask)) | (leadM >> 0);\\n\\n return m;\\n }\\n\\n /// @dev Compress a point on G2 to a pair of uint256 for serialization.\\n function g2Compress(G2Point memory point)\\n internal\\n pure\\n returns (bytes memory)\\n {\\n bytes32 m = bytes32(point.x.x);\\n\\n bytes1 leadM = m[0] | (parity(point.y.x) << 7);\\n // slither-disable-next-line incorrect-shift\\n uint256 mask = 0xff << (31 * 8);\\n m = (m & ~bytes32(mask)) | (leadM >> 0);\\n\\n return abi.encodePacked(m, bytes32(point.x.y));\\n }\\n\\n /// @dev Unmarshals a point on G1 from bytes in an uncompressed form.\\n function g1Unmarshal(bytes memory m)\\n internal\\n pure\\n returns (G1Point memory)\\n {\\n require(m.length == 64, \\\"Invalid G1 bytes length\\\");\\n\\n bytes32 x;\\n bytes32 y;\\n\\n assembly {\\n x := mload(add(m, 0x20))\\n y := mload(add(m, 0x40))\\n }\\n\\n return G1Point(uint256(x), uint256(y));\\n }\\n\\n /// @dev Marshals a point on G1 to bytes form.\\n function g1Marshal(G1Point memory point)\\n internal\\n pure\\n returns (bytes memory)\\n {\\n bytes memory m = new bytes(64);\\n bytes32 x = bytes32(point.x);\\n bytes32 y = bytes32(point.y);\\n\\n assembly {\\n mstore(add(m, 32), x)\\n mstore(add(m, 64), y)\\n }\\n\\n return m;\\n }\\n\\n /// @dev Unmarshals a point on G2 from bytes in an uncompressed form.\\n function g2Unmarshal(bytes memory m)\\n internal\\n pure\\n returns (G2Point memory)\\n {\\n require(m.length == 128, \\\"Invalid G2 bytes length\\\");\\n\\n uint256 xx;\\n uint256 xy;\\n uint256 yx;\\n uint256 yy;\\n\\n assembly {\\n xx := mload(add(m, 0x20))\\n xy := mload(add(m, 0x40))\\n yx := mload(add(m, 0x60))\\n yy := mload(add(m, 0x80))\\n }\\n\\n return G2Point(gfP2(xx, xy), gfP2(yx, yy));\\n }\\n\\n /// @dev Decompress a point on G2 from a pair of uint256.\\n function g2Decompress(bytes memory m)\\n internal\\n pure\\n returns (G2Point memory)\\n {\\n require(m.length == 64, \\\"Invalid G2 compressed bytes length\\\");\\n\\n bytes32 x1;\\n bytes32 x2;\\n uint256 temp;\\n\\n // Extract two bytes32 from bytes array\\n assembly {\\n temp := add(m, 32)\\n x1 := mload(temp)\\n temp := add(m, 64)\\n x2 := mload(temp)\\n }\\n\\n bytes32 mX = bytes32(0);\\n bytes1 leadX = x1[0] & 0x7f;\\n // slither-disable-next-line incorrect-shift\\n uint256 mask = 0xff << (31 * 8);\\n mX = (x1 & ~bytes32(mask)) | (leadX >> 0);\\n\\n gfP2 memory x = gfP2(uint256(mX), uint256(x2));\\n gfP2 memory y = g2YFromX(x);\\n\\n if (parity(y.x) != (m[0] & 0x80) >> 7) {\\n y.x = p - y.x;\\n y.y = p - y.y;\\n }\\n\\n return G2Point(x, y);\\n }\\n\\n /// @dev Returns the sum of two gfP2 field elements.\\n function gfP2Add(gfP2 memory a, gfP2 memory b)\\n internal\\n pure\\n returns (gfP2 memory)\\n {\\n return gfP2(addmod(a.x, b.x, p), addmod(a.y, b.y, p));\\n }\\n\\n /// @dev Returns multiplication of two gfP2 field elements.\\n function gfP2Multiply(gfP2 memory a, gfP2 memory b)\\n internal\\n pure\\n returns (gfP2 memory)\\n {\\n return\\n gfP2(\\n addmod(mulmod(a.x, b.y, p), mulmod(b.x, a.y, p), p),\\n addmod(mulmod(a.y, b.y, p), p - mulmod(a.x, b.x, p), p)\\n );\\n }\\n\\n /// @dev Returns gfP2 element to the power of the provided exponent.\\n function gfP2Pow(gfP2 memory _a, uint256 _exp)\\n internal\\n pure\\n returns (gfP2 memory result)\\n {\\n (uint256 x, uint256 y) = _gfP2Pow(_a.x, _a.y, _exp);\\n return gfP2(x, y);\\n }\\n\\n function gfP2Square(gfP2 memory a) internal pure returns (gfP2 memory) {\\n return gfP2Multiply(a, a);\\n }\\n\\n function gfP2Cube(gfP2 memory a) internal pure returns (gfP2 memory) {\\n return gfP2Multiply(a, gfP2Square(a));\\n }\\n\\n function gfP2CubeAddTwistB(gfP2 memory a)\\n internal\\n pure\\n returns (gfP2 memory)\\n {\\n (uint256 x, uint256 y) = _gfP2CubeAddTwistB(a.x, a.y);\\n return gfP2(x, y);\\n }\\n\\n /// @dev Returns true if G2 point's y^2 equals x.\\n function g2X2y(gfP2 memory x, gfP2 memory y) internal pure returns (bool) {\\n gfP2 memory y2;\\n y2 = gfP2Square(y);\\n\\n return (y2.x == x.x && y2.y == x.y);\\n }\\n\\n /// @dev Returns true if G2 point is on the curve.\\n function isG2PointOnCurve(G2Point memory point)\\n internal\\n pure\\n returns (bool)\\n {\\n (uint256 y2x, uint256 y2y) = _gfP2Square(point.y.x, point.y.y);\\n (uint256 x3x, uint256 x3y) = _gfP2CubeAddTwistB(point.x.x, point.x.y);\\n\\n return (y2x == x3x && y2y == x3y);\\n }\\n\\n function twistB() private pure returns (gfP2 memory) {\\n return gfP2(twistBx, twistBy);\\n }\\n\\n function hexRoot() private pure returns (gfP2 memory) {\\n return gfP2(hexRootX, hexRootY);\\n }\\n\\n /// @dev Calculates whether the provided number is even or odd.\\n /// @return 0x01 if y is an even number and 0x00 if it's odd.\\n function parity(uint256 value) private pure returns (bytes1) {\\n return bytes32(value)[31] & 0x01;\\n }\\n\\n function _gfP2Add(\\n uint256 ax,\\n uint256 ay,\\n uint256 bx,\\n uint256 by\\n ) private pure returns (uint256 x, uint256 y) {\\n x = addmod(ax, bx, p);\\n y = addmod(ay, by, p);\\n }\\n\\n function _gfP2Multiply(\\n uint256 ax,\\n uint256 ay,\\n uint256 bx,\\n uint256 by\\n ) private pure returns (uint256 x, uint256 y) {\\n x = addmod(mulmod(ax, by, p), mulmod(bx, ay, p), p);\\n y = addmod(mulmod(ay, by, p), p - mulmod(ax, bx, p), p);\\n }\\n\\n function _gfP2CubeAddTwistB(uint256 ax, uint256 ay)\\n private\\n pure\\n returns (uint256 x, uint256 y)\\n {\\n (uint256 a3x, uint256 a3y) = _gfP2Cube(ax, ay);\\n return _gfP2Add(a3x, a3y, twistBx, twistBy);\\n }\\n\\n function _gfP2Pow(\\n uint256 _ax,\\n uint256 _ay,\\n uint256 _exp\\n ) private pure returns (uint256 x, uint256 y) {\\n uint256 exp = _exp;\\n x = 0;\\n y = 1;\\n uint256 ax = _ax;\\n uint256 ay = _ay;\\n\\n // Reduce exp dividing by 2 gradually to 0 while computing final\\n // result only when exp is an odd number.\\n while (exp > 0) {\\n if (parity(exp) == 0x01) {\\n (x, y) = _gfP2Multiply(x, y, ax, ay);\\n }\\n\\n unchecked {\\n exp = exp / 2;\\n }\\n (ax, ay) = _gfP2Multiply(ax, ay, ax, ay);\\n }\\n }\\n\\n function _gfP2Square(uint256 _ax, uint256 _ay)\\n private\\n pure\\n returns (uint256 x, uint256 y)\\n {\\n return _gfP2Multiply(_ax, _ay, _ax, _ay);\\n }\\n\\n function _gfP2Cube(uint256 _ax, uint256 _ay)\\n private\\n pure\\n returns (uint256 x, uint256 y)\\n {\\n (uint256 _bx, uint256 _by) = _gfP2Square(_ax, _ay);\\n return _gfP2Multiply(_ax, _ay, _bx, _by);\\n }\\n\\n function _g2X2y(\\n uint256 xx,\\n uint256 xy,\\n uint256 yx,\\n uint256 yy\\n ) private pure returns (bool) {\\n (uint256 y2x, uint256 y2y) = _gfP2Square(yx, yy);\\n\\n return (y2x == xx && y2y == xy);\\n }\\n}\\n\",\"keccak256\":\"0x8a100028820ff5c424f4bb780fbedec1da2576fbc6d5aa4e7309d986b730a319\",\"license\":\"GPL-3.0-only\"},\"contracts/libraries/BLS.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-only\\n//\\n// \\u2593\\u2593\\u258c \\u2593\\u2593 \\u2590\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u258c\\u2590\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2584\\n// \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u258c\\u2590\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\n// \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2580 \\u2590\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2590\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593 \\u2590\\u2593\\u2593\\u2593\\u2593\\u2593\\u258c \\u2590\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\n// \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2584\\u2584\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2580 \\u2590\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2584\\u2584\\u2584\\u2584 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2584\\u2584\\u2584\\u2584 \\u2590\\u2593\\u2593\\u2593\\u2593\\u2593\\u258c \\u2590\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\n// \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2580 \\u2590\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2590\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\n// \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2580\\u2580\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2584 \\u2590\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2580\\u2580\\u2580\\u2580 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2580\\u2580\\u2580\\u2580 \\u2590\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2580\\n// \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2580\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2584 \\u2590\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593 \\u2590\\u2593\\u2593\\u2593\\u2593\\u2593\\u258c\\n// \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2588\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2590\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\n// \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2590\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\n//\\n//\\n\\npragma solidity 0.8.17;\\n\\nimport \\\"./AltBn128.sol\\\";\\n\\n/// @title BLS signatures verification\\n/// @dev Library for verification of 2-pairing-check BLS signatures, including\\n/// basic, aggregated, or reconstructed threshold BLS signatures, generated\\n/// using the AltBn128 curve.\\nlibrary BLS {\\n /// @dev Creates a signature over message using the provided secret key.\\n function sign(bytes memory message, uint256 secretKey)\\n external\\n view\\n returns (bytes memory)\\n {\\n AltBn128.G1Point memory p_1 = AltBn128.g1HashToPoint(message);\\n AltBn128.G1Point memory p_2 = AltBn128.scalarMultiply(p_1, secretKey);\\n\\n return AltBn128.g1Marshal(p_2);\\n }\\n\\n /// @dev Wraps the functionality of BLS.verify, but hashes a message to\\n /// a point on G1 and marshal to bytes first to allow raw bytes\\n /// verification.\\n function verifyBytes(\\n bytes memory publicKey,\\n bytes memory message,\\n bytes memory signature\\n ) external view returns (bool) {\\n AltBn128.G1Point memory point = AltBn128.g1HashToPoint(message);\\n bytes memory messageAsPoint = AltBn128.g1Marshal(point);\\n\\n return verify(publicKey, messageAsPoint, signature);\\n }\\n\\n /// @dev Verify performs the pairing operation to check if the signature\\n /// is correct for the provided message and the corresponding public\\n /// key. Public key must be a valid point on G2 curve in an\\n /// uncompressed format. Message must be a valid point on G1 curve in\\n /// an uncompressed format. Signature must be a valid point on G1\\n /// curve in an uncompressed format.\\n function verify(\\n bytes memory publicKey,\\n bytes memory message,\\n bytes memory signature\\n ) public view returns (bool) {\\n AltBn128.G1Point memory _signature = AltBn128.g1Unmarshal(signature);\\n\\n return\\n _verify(\\n AltBn128.g2Unmarshal(publicKey),\\n AltBn128.g1Unmarshal(message),\\n _signature\\n );\\n }\\n\\n function _verify(\\n AltBn128.G2Point memory publicKey,\\n AltBn128.G1Point memory message,\\n AltBn128.G1Point memory signature\\n ) public view returns (bool) {\\n return\\n AltBn128.pairing(\\n AltBn128.G1Point(signature.x, AltBn128.getP() - signature.y),\\n AltBn128.g2(),\\n message,\\n publicKey\\n );\\n }\\n}\\n\",\"keccak256\":\"0x08c7e739c63c31f5f45fb390695eca9e98a9525589ace41526f25060f46e43d4\",\"license\":\"GPL-3.0-only\"},\"contracts/libraries/ModUtils.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-only\\n//\\n// \\u2593\\u2593\\u258c \\u2593\\u2593 \\u2590\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u258c\\u2590\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2584\\n// \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u258c\\u2590\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\n// \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2580 \\u2590\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2590\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593 \\u2590\\u2593\\u2593\\u2593\\u2593\\u2593\\u258c \\u2590\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\n// \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2584\\u2584\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2580 \\u2590\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2584\\u2584\\u2584\\u2584 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2584\\u2584\\u2584\\u2584 \\u2590\\u2593\\u2593\\u2593\\u2593\\u2593\\u258c \\u2590\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\n// \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2580 \\u2590\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2590\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\n// \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2580\\u2580\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2584 \\u2590\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2580\\u2580\\u2580\\u2580 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2580\\u2580\\u2580\\u2580 \\u2590\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2580\\n// \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2580\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2584 \\u2590\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593 \\u2590\\u2593\\u2593\\u2593\\u2593\\u2593\\u258c\\n// \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2588\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2590\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\n// \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2590\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\n//\\n//\\n\\npragma solidity 0.8.17;\\n\\nlibrary ModUtils {\\n /// @dev Wraps the modular exponent pre-compile introduced in Byzantium.\\n /// Returns base^exponent mod p.\\n function modExp(\\n uint256 base,\\n uint256 exponent,\\n uint256 p\\n ) internal view returns (uint256 o) {\\n assembly {\\n // Args for the precompile: [<length_of_BASE> <length_of_EXPONENT>\\n // <length_of_MODULUS> <BASE> <EXPONENT> <MODULUS>]\\n let output := mload(0x40)\\n let args := add(output, 0x20)\\n mstore(args, 0x20)\\n mstore(add(args, 0x20), 0x20)\\n mstore(add(args, 0x40), 0x20)\\n mstore(add(args, 0x60), base)\\n mstore(add(args, 0x80), exponent)\\n mstore(add(args, 0xa0), p)\\n\\n // 0x05 is the modular exponent contract address\\n if iszero(staticcall(not(0), 0x05, args, 0xc0, output, 0x20)) {\\n revert(0, 0)\\n }\\n o := mload(output)\\n }\\n }\\n\\n /// @dev Calculates and returns the square root of a mod p if such a square\\n /// root exists. The modulus p must be an odd prime. If a square root\\n /// does not exist, function returns 0.\\n function modSqrt(uint256 a, uint256 p) internal view returns (uint256) {\\n unchecked {\\n if (legendre(a, p) != 1) {\\n return 0;\\n }\\n\\n if (a == 0) {\\n return 0;\\n }\\n\\n if (p % 4 == 3) {\\n return modExp(a, (p + 1) / 4, p);\\n }\\n\\n uint256 s = p - 1;\\n uint256 e = 0;\\n\\n while (s % 2 == 0) {\\n s = s / 2;\\n e = e + 1;\\n }\\n\\n // Note the smaller int- finding n with Legendre symbol or -1\\n // should be quick\\n uint256 n = 2;\\n while (legendre(n, p) != -1) {\\n n = n + 1;\\n }\\n\\n uint256 x = modExp(a, (s + 1) / 2, p);\\n uint256 b = modExp(a, s, p);\\n uint256 g = modExp(n, s, p);\\n uint256 r = e;\\n uint256 gs = 0;\\n uint256 m = 0;\\n uint256 t = b;\\n\\n while (true) {\\n t = b;\\n m = 0;\\n\\n for (m = 0; m < r; m++) {\\n if (t == 1) {\\n break;\\n }\\n t = modExp(t, 2, p);\\n }\\n\\n if (m == 0) {\\n return x;\\n }\\n\\n gs = modExp(g, uint256(2)**(r - m - 1), p);\\n g = (gs * gs) % p;\\n x = (x * gs) % p;\\n b = (b * g) % p;\\n r = m;\\n }\\n }\\n }\\n\\n /// @dev Calculates the Legendre symbol of the given a mod p.\\n /// @return Returns 1 if a is a quadratic residue mod p, -1 if it is\\n /// a non-quadratic residue, and 0 if a is 0.\\n function legendre(uint256 a, uint256 p) internal view returns (int256) {\\n unchecked {\\n uint256 raised = modExp(a, (p - 1) / uint256(2), p);\\n\\n if (raised == 0 || raised == 1) {\\n return int256(raised);\\n } else if (raised == p - 1) {\\n return -1;\\n }\\n\\n require(false, \\\"Failed to calculate legendre.\\\");\\n }\\n }\\n}\\n\",\"keccak256\":\"0x57bb4ab4f257715c6daafa1a4e4bc6dd9edfe45afca797e5b8e98db577826505\",\"license\":\"GPL-3.0-only\"}},\"version\":1}",
195
+ "bytecode": "0x610be261003a600b82828239805160001a60731461002d57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600436106100565760003560e01c8063afef5d331461005b578063b6087a0f14610084578063de8f50a1146100a7578063e71b17c4146100ba575b600080fd5b61006e61006936600461093c565b6100cd565b60405161007b91906109a5565b60405180910390f35b610097610092366004610a08565b6100fe565b604051901515815260200161007b565b6100976100b5366004610a7b565b610167565b6100976100c8366004610a7b565b610199565b606060006100da846101c9565b905060006100e8828561028c565b90506100f3816102d3565b925050505b92915050565b600061015f60405180604001604052808460000151815260200184602001516101447f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4790565b61014e9190610b19565b905261015861030d565b85876103cd565b949350505050565b60008061017383610474565b9050610190610181866104fd565b61018a86610474565b836100fe565b95945050505050565b6000806101a5846101c9565b905060006101b2826102d3565b90506101bf868286610167565b9695505050505050565b604080518082019091526000808252602082015260006002836040516101ef9190610b2c565b602060405180830381855afa15801561020c573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061022f9190610b48565b90507f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47810660005b6102608261059e565b90508015610281576040805180820190915291825260208201529392505050565b600182019150610257565b604080518082019091526000808252602082015260405183518152602084015160208201528260408201526040826060836007600019fa6102cc57600080fd5b5092915050565b6040805181815260608181018352916000919060208201818036833750508451602095860151958301525060408101939093525090919050565b61031561082c565b50604080516080810182527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c28183019081527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed6060830152815281518083019092527f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b82527f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa60208381019190915281019190915290565b6000806040516020810187518152602088015160208201528651805160408301526020810151606083015250602087015180516080830152602081015160a083015250855160c0820152602086015160e08201528451805161010083015260208101516101208301525060208501518051610140830152602081015161016083015250602082610180836008600019fa61046657600080fd5b505115159695505050505050565b604080518082019091526000808252602082015281516040146104de5760405162461bcd60e51b815260206004820152601760248201527f496e76616c6964204731206279746573206c656e67746800000000000000000060448201526064015b60405180910390fd5b5060208181015160409283015183518085019094529083529082015290565b61050561082c565b81516080146105565760405162461bcd60e51b815260206004820152601760248201527f496e76616c6964204732206279746573206c656e67746800000000000000000060448201526064016104d5565b50602081810151604080840151606080860151608096870151845197880185528785019586529187019290925292855281518083019092528152808301919091529082015290565b60006100f87f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47806105d1856003836105ec565b6105dc906003610b77565b6105e69190610b8a565b90610637565b60006040516020810160208152602080820152602060408201528560608201528460808201528360a082015260208260c0836005600019fa61062d57600080fd5b5051949350505050565b6000610643838361079f565b600114610652575060006100f8565b82600003610662575060006100f8565b600482066003036106855761067e8360046001850104846105ec565b90506100f8565b600019820160005b600282066000036106a65760028204915060010161068d565b60025b6106b3818661079f565b600019146106c3576001016106a9565b60006106d68760026001870104886105ec565b905060006106e58886896105ec565b905060006106f484878a6105ec565b905084600080845b5060009050845b8382101561072c576001811461072c5761071f8160028e6105ec565b6001909201919050610703565b8160000361074657869a50505050505050505050506100f8565b6107598560018487030360020a8e6105ec565b92508b8384028161076c5761076c610b61565b0694508b8388028161078057610780610b61565b0696508b8587028161079457610794610b61565b0695508193506106fc565b6000806107b4846002600019860104856105ec565b90508015806107c35750806001145b156107cf5790506100f8565b6001830381036107e4576000199150506100f8565b60405162461bcd60e51b815260206004820152601d60248201527f4661696c656420746f2063616c63756c617465206c6567656e6472652e00000060448201526064016104d5565b6040805160808101825260009181018281526060820192909252908190815260200161086b604051806040016040528060008152602001600081525090565b905290565b634e487b7160e01b600052604160045260246000fd5b6040805190810167ffffffffffffffff811182821017156108a9576108a9610870565b60405290565b600082601f8301126108c057600080fd5b813567ffffffffffffffff808211156108db576108db610870565b604051601f8301601f19908116603f0116810190828211818310171561090357610903610870565b8160405283815286602085880101111561091c57600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000806040838503121561094f57600080fd5b823567ffffffffffffffff81111561096657600080fd5b610972858286016108af565b95602094909401359450505050565b60005b8381101561099c578181015183820152602001610984565b50506000910152565b60208152600082518060208401526109c4816040850160208701610981565b601f01601f19169190910160400192915050565b6000604082840312156109ea57600080fd5b6109f2610886565b9050813581526020820135602082015292915050565b6000806000838503610100811215610a1f57600080fd5b6080811215610a2d57600080fd5b50610a36610886565b610a4086866109d8565b8152610a4f86604087016109d8565b60208201529250610a6385608086016109d8565b9150610a728560c086016109d8565b90509250925092565b600080600060608486031215610a9057600080fd5b833567ffffffffffffffff80821115610aa857600080fd5b610ab4878388016108af565b94506020860135915080821115610aca57600080fd5b610ad6878388016108af565b93506040860135915080821115610aec57600080fd5b50610af9868287016108af565b9150509250925092565b634e487b7160e01b600052601160045260246000fd5b818103818111156100f8576100f8610b03565b60008251610b3e818460208701610981565b9190910192915050565b600060208284031215610b5a57600080fd5b5051919050565b634e487b7160e01b600052601260045260246000fd5b808201808211156100f8576100f8610b03565b600082610ba757634e487b7160e01b600052601260045260246000fd5b50069056fea2646970667358221220829ab3657ffe2f8b9548cdb9e0e6a52b8b9f02bddf27516291dd0366d3df603864736f6c63430008110033",
196
+ "deployedBytecode": "0x73000000000000000000000000000000000000000030146080604052600436106100565760003560e01c8063afef5d331461005b578063b6087a0f14610084578063de8f50a1146100a7578063e71b17c4146100ba575b600080fd5b61006e61006936600461093c565b6100cd565b60405161007b91906109a5565b60405180910390f35b610097610092366004610a08565b6100fe565b604051901515815260200161007b565b6100976100b5366004610a7b565b610167565b6100976100c8366004610a7b565b610199565b606060006100da846101c9565b905060006100e8828561028c565b90506100f3816102d3565b925050505b92915050565b600061015f60405180604001604052808460000151815260200184602001516101447f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4790565b61014e9190610b19565b905261015861030d565b85876103cd565b949350505050565b60008061017383610474565b9050610190610181866104fd565b61018a86610474565b836100fe565b95945050505050565b6000806101a5846101c9565b905060006101b2826102d3565b90506101bf868286610167565b9695505050505050565b604080518082019091526000808252602082015260006002836040516101ef9190610b2c565b602060405180830381855afa15801561020c573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061022f9190610b48565b90507f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47810660005b6102608261059e565b90508015610281576040805180820190915291825260208201529392505050565b600182019150610257565b604080518082019091526000808252602082015260405183518152602084015160208201528260408201526040826060836007600019fa6102cc57600080fd5b5092915050565b6040805181815260608181018352916000919060208201818036833750508451602095860151958301525060408101939093525090919050565b61031561082c565b50604080516080810182527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c28183019081527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed6060830152815281518083019092527f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b82527f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa60208381019190915281019190915290565b6000806040516020810187518152602088015160208201528651805160408301526020810151606083015250602087015180516080830152602081015160a083015250855160c0820152602086015160e08201528451805161010083015260208101516101208301525060208501518051610140830152602081015161016083015250602082610180836008600019fa61046657600080fd5b505115159695505050505050565b604080518082019091526000808252602082015281516040146104de5760405162461bcd60e51b815260206004820152601760248201527f496e76616c6964204731206279746573206c656e67746800000000000000000060448201526064015b60405180910390fd5b5060208181015160409283015183518085019094529083529082015290565b61050561082c565b81516080146105565760405162461bcd60e51b815260206004820152601760248201527f496e76616c6964204732206279746573206c656e67746800000000000000000060448201526064016104d5565b50602081810151604080840151606080860151608096870151845197880185528785019586529187019290925292855281518083019092528152808301919091529082015290565b60006100f87f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47806105d1856003836105ec565b6105dc906003610b77565b6105e69190610b8a565b90610637565b60006040516020810160208152602080820152602060408201528560608201528460808201528360a082015260208260c0836005600019fa61062d57600080fd5b5051949350505050565b6000610643838361079f565b600114610652575060006100f8565b82600003610662575060006100f8565b600482066003036106855761067e8360046001850104846105ec565b90506100f8565b600019820160005b600282066000036106a65760028204915060010161068d565b60025b6106b3818661079f565b600019146106c3576001016106a9565b60006106d68760026001870104886105ec565b905060006106e58886896105ec565b905060006106f484878a6105ec565b905084600080845b5060009050845b8382101561072c576001811461072c5761071f8160028e6105ec565b6001909201919050610703565b8160000361074657869a50505050505050505050506100f8565b6107598560018487030360020a8e6105ec565b92508b8384028161076c5761076c610b61565b0694508b8388028161078057610780610b61565b0696508b8587028161079457610794610b61565b0695508193506106fc565b6000806107b4846002600019860104856105ec565b90508015806107c35750806001145b156107cf5790506100f8565b6001830381036107e4576000199150506100f8565b60405162461bcd60e51b815260206004820152601d60248201527f4661696c656420746f2063616c63756c617465206c6567656e6472652e00000060448201526064016104d5565b6040805160808101825260009181018281526060820192909252908190815260200161086b604051806040016040528060008152602001600081525090565b905290565b634e487b7160e01b600052604160045260246000fd5b6040805190810167ffffffffffffffff811182821017156108a9576108a9610870565b60405290565b600082601f8301126108c057600080fd5b813567ffffffffffffffff808211156108db576108db610870565b604051601f8301601f19908116603f0116810190828211818310171561090357610903610870565b8160405283815286602085880101111561091c57600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000806040838503121561094f57600080fd5b823567ffffffffffffffff81111561096657600080fd5b610972858286016108af565b95602094909401359450505050565b60005b8381101561099c578181015183820152602001610984565b50506000910152565b60208152600082518060208401526109c4816040850160208701610981565b601f01601f19169190910160400192915050565b6000604082840312156109ea57600080fd5b6109f2610886565b9050813581526020820135602082015292915050565b6000806000838503610100811215610a1f57600080fd5b6080811215610a2d57600080fd5b50610a36610886565b610a4086866109d8565b8152610a4f86604087016109d8565b60208201529250610a6385608086016109d8565b9150610a728560c086016109d8565b90509250925092565b600080600060608486031215610a9057600080fd5b833567ffffffffffffffff80821115610aa857600080fd5b610ab4878388016108af565b94506020860135915080821115610aca57600080fd5b610ad6878388016108af565b93506040860135915080821115610aec57600080fd5b50610af9868287016108af565b9150509250925092565b634e487b7160e01b600052601160045260246000fd5b818103818111156100f8576100f8610b03565b60008251610b3e818460208701610981565b9190910192915050565b600060208284031215610b5a57600080fd5b5051919050565b634e487b7160e01b600052601260045260246000fd5b808201808211156100f8576100f8610b03565b600082610ba757634e487b7160e01b600052601260045260246000fd5b50069056fea2646970667358221220829ab3657ffe2f8b9548cdb9e0e6a52b8b9f02bddf27516291dd0366d3df603864736f6c63430008110033",
197
+ "devdoc": {
198
+ "details": "Library for verification of 2-pairing-check BLS signatures, including basic, aggregated, or reconstructed threshold BLS signatures, generated using the AltBn128 curve.",
199
+ "kind": "dev",
200
+ "methods": {
201
+ "sign(bytes,uint256)": {
202
+ "details": "Creates a signature over message using the provided secret key."
203
+ },
204
+ "verify(bytes,bytes,bytes)": {
205
+ "details": "Verify performs the pairing operation to check if the signature is correct for the provided message and the corresponding public key. Public key must be a valid point on G2 curve in an uncompressed format. Message must be a valid point on G1 curve in an uncompressed format. Signature must be a valid point on G1 curve in an uncompressed format."
206
+ },
207
+ "verifyBytes(bytes,bytes,bytes)": {
208
+ "details": "Wraps the functionality of BLS.verify, but hashes a message to a point on G1 and marshal to bytes first to allow raw bytes verification."
209
+ }
210
+ },
211
+ "title": "BLS signatures verification",
212
+ "version": 1
213
+ },
214
+ "userdoc": {
215
+ "kind": "user",
216
+ "methods": {},
217
+ "version": 1
218
+ },
219
+ "storageLayout": {
220
+ "storage": [],
221
+ "types": null
222
+ }
223
+ }