diff --git a/Cargo.lock b/Cargo.lock index 44f5562d3..5cc98a1cb 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2655,6 +2655,7 @@ dependencies = [ "ark-serialize", "ark-std", "fp-evm", + "frame-support", "pallet-evm", "precompile-utils", "rand 0.8.5", diff --git a/precompile/bls12-381/Cargo.toml b/precompile/bls12-381/Cargo.toml index 423b45c1a..c52cfbd8c 100644 --- a/precompile/bls12-381/Cargo.toml +++ b/precompile/bls12-381/Cargo.toml @@ -22,7 +22,8 @@ pallet-evm = { workspace = true } precompile-utils = { workspace = true } # substrate -sp-std = { workspace = true } +frame-support = { workspace = true } +sp-std = { workspace = true } [dev-dependencies] rand = { version = "0.8.5" } @@ -46,5 +47,6 @@ std = [ "precompile-utils/std", # substrate + "frame-support/std", "sp-std/std", ] diff --git a/precompile/bls12-381/src/lib.rs b/precompile/bls12-381/src/lib.rs index 12697e1b8..824dd2b2a 100644 --- a/precompile/bls12-381/src/lib.rs +++ b/precompile/bls12-381/src/lib.rs @@ -23,32 +23,50 @@ use bls::{hash_to_curve_g2, PublicKey, Signature}; // core use core::marker::PhantomData; +// frontier +use pallet_evm::GasWeightMapping; // moonbeam use precompile_utils::prelude::*; // substrate +use frame_support::{ensure, weights::Weight}; use sp_std::prelude::*; -pub(crate) const BLS_ESTIMATED_COST: u64 = 100_000; +/// The BLS verification is a computationally intensive process. Normally, it consumes a lot of +/// block weight according to our benchmark test. Tested verifying of 512 public keys signature on +/// the `AMD Ryzen 7 5700G`, this precompile consumed at least 117_954_459_000 weight. So we give +/// them more than that to ensure there is enough time for other machine types. +const BLS_WEIGHT: u64 = 150_000_000_000; + pub struct BLS12381(PhantomData); #[precompile_utils::precompile] impl BLS12381 { + /// FastAggregateVerify + /// + /// Verifies an aggregate_signature against a list of pub_keys. + /// pub_keys must be trusted the origin of the serialization + /// precompile do not check the keys is valid + /// see more: https://datatracker.ietf.org/doc/html/draft-irtf-cfrg-bls-signature-04#section-2.5 #[precompile::public("fast_aggregate_verify(bytes[],bytes,bytes)")] #[precompile::view] fn fast_aggregate_verify( handle: &mut impl PrecompileHandle, - pubkeys: Vec, + pub_keys: Vec, message: UnboundedBytes, signature: UnboundedBytes, ) -> EvmResult { - handle.record_cost(BLS_ESTIMATED_COST)?; + handle.record_cost(::GasWeightMapping::weight_to_gas( + Weight::from_ref_time(BLS_WEIGHT), + ))?; + + ensure!(pub_keys.len() <= 512, revert("Too many pub keys")); let asig = Signature::from_bytes(signature.as_bytes()).map_err(|_| revert("Invalid signature"))?; - let public_keys: Result, _> = - pubkeys.into_iter().map(|k| PublicKey::from_bytes(k.as_bytes())).collect(); - let Ok(pks) = public_keys else { - return Err(revert("Invalid pubkeys")); + let pub_keys: Result, _> = + pub_keys.into_iter().map(|k| PublicKey::from_bytes(k.as_bytes())).collect(); + let Ok(pks) = pub_keys else { + return Err(revert("Invalid pub keys")); }; let apk = PublicKey::aggregate(pks); diff --git a/runtime/pangolin/src/pallets/evm.rs b/runtime/pangolin/src/pallets/evm.rs index e76eca82d..93871d23b 100644 --- a/runtime/pangolin/src/pallets/evm.rs +++ b/runtime/pangolin/src/pallets/evm.rs @@ -21,7 +21,7 @@ use crate::*; // frontier use pallet_evm::Precompile; -const BLOCK_GAS_LIMIT: u64 = 10_000_000; +const BLOCK_GAS_LIMIT: u64 = 20_000_000; frame_support::parameter_types! { pub BlockGasLimit: sp_core::U256 = sp_core::U256::from(BLOCK_GAS_LIMIT); pub PrecompilesValue: PangolinPrecompiles = PangolinPrecompiles::<_>::new(); diff --git a/tests/config.ts b/tests/config.ts index 4a3bd34aa..5af121514 100644 --- a/tests/config.ts +++ b/tests/config.ts @@ -4,7 +4,7 @@ import { JsonRpcResponse } from "web3-core-helpers"; export const CHAIN_ID = 43; export const HOST_HTTP_URL = "http://127.0.0.1:9933"; export const HOST_WS_URL = "ws://127.0.0.1:9944"; -export const BLOCK_GAS_LIMIT = 10000000; +export const BLOCK_GAS_LIMIT = 20000000; export const DEFAULT_GAS = 4000000; // Accounts builtin diff --git a/tests/ethereum/contracts/contracts_info.ts b/tests/ethereum/contracts/contracts_info.ts index 3dcfa9fbf..9cb463843 100644 --- a/tests/ethereum/contracts/contracts_info.ts +++ b/tests/ethereum/contracts/contracts_info.ts @@ -365,3 +365,37 @@ export const eventInfo = { }, ], }; + +export const blsInfo = { + abi: [ + { + inputs: [ + { + internalType: "bytes[]", + name: "pubkeys", + type: "bytes[]", + }, + { + internalType: "bytes", + name: "message", + type: "bytes", + }, + { + internalType: "bytes", + name: "sig", + type: "bytes", + }, + ], + name: "fast_aggregate_verify", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "nonpayable", + type: "function", + }, + ], +}; diff --git a/tests/ethereum/test-block.ts b/tests/ethereum/test-block.ts index 95caccf74..7493efc6c 100644 --- a/tests/ethereum/test-block.ts +++ b/tests/ethereum/test-block.ts @@ -38,7 +38,7 @@ describe("Test Block RPC", () => { miner: "0x0000000000000000000000000000000000000000", number: 0, receiptsRoot: "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", - size: 504, + size: 505, timestamp: 0, totalDifficulty: "0", transactionsRoot: "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", diff --git a/tests/ethereum/test-bls.ts b/tests/ethereum/test-bls.ts new file mode 100644 index 000000000..1402f5515 --- /dev/null +++ b/tests/ethereum/test-bls.ts @@ -0,0 +1,567 @@ +import Web3 from "web3"; +import { describe } from "mocha"; +import { expect } from "chai"; +import { HOST_HTTP_URL, FAITH, FAITH_P, BLOCK_GAS_LIMIT } from "../config"; +import { AbiItem, hexToBytes } from "web3-utils"; +import { blsInfo } from "./contracts/contracts_info"; + +const web3 = new Web3(HOST_HTTP_URL); +const pub_keys = [ + "0xb4bf4717ad2d3fce3a11a84dee1b38469be9e783b298b200cc533be97e474bf94d6c7c591d3102992f908820bc63ac72", + "0x969b4bcd84cabd5ba5f31705de51e2c4096402f832fdf543d88eb41ebb55f03a8715c1ceea92335d24febbea17a3bdd7", + "0x92c057502d4de4935cf8af77f21ca5791f646286aead82753a62dfb06dbd1705df506a02f19517accb44177cb469f3e4", + "0x90f3659630d58bd08e2e0131f76283cf9de7aa89e0102c67e79ca05c5c7217b213c05668f3de82939d8414d1674dc6a1", + "0x8c3999317e8c6753e3e89651e5ba7fdea91ab1dda46fdb6902eccd4035ba1618a178d1cd31f6fbbacc773255d72995b3", + "0x881f1a1ac6a56a47f041f49266d0a2e146c35e42bf87c22a9bc23a363526959e4d3d0c7e7382be091246787ef25e33d5", + "0x866f9ebe3afe58f2fd3234c4635a215c7982a53df4fb5396d9614a50308020b33618606a434984ca408963093b8f916d", + "0xa49f744d9bbfbcdd106592646040a3322fbe36e628be501a13f5272ad545a149f06f59bd417df9ae1a38d08c5a2108fe", + "0xa60d5589316a5e16e1d9bb03db45136afb9a3d6e97d350256129ee32a8e33396907dc44d2211762967d88d3e2840f71b", + "0xb48e56bd66650adb1e4f0c68b745f35f08d9829a06dbd5c67b2cc03dcf4cc5f9a85c84654f9596163b59d693eab14c34", + "0xac9b60d5afcbd5663a8a44b7c5a02f19e9a77ab0a35bd65809bb5c67ec582c897feb04decc694b13e08587f3ff9b5b60", + "0x99fb4a03d71921b6a56f5e39f42f281b96ee017e859f738fab6fbc51edbcf3b02b1276336d1f82391e495723ecbe337e", + "0xa9761c83d922ced991557c9913bedfbe34509ec68d34a791242ac0f96e30f87e29a19099199a38aac29037e0c8e939c6", + "0xafad69e0702e02012b2419bdc7250c94816e40286a238e5f83858c7be2f93be2ec3657dd6cd0ded9184d6c9646092d3e", + "0xa29e520a73ec28f4e2e45050c93080eeaee57af1108e659d740897c3ced76ceb75d106cb00d7ed25ec221874bf4b235a", + "0x91d2fe0eded16c39a891ba065319dabfe2c0c300f5e5f5c84f31f6c52344084f0bb60d79650fc1dfe8d2a26fe34bd1fa", + "0x97063101e86c4e4fa689de9521bb79575ed727c5799cf69c17bfe325033200fcecca79a9ec9636b7d93e6d64f7275977", + "0xb194e855fa3d9ab53cbfbc97e7e0ce463723428bb1ad25952713eac04d086bf2407bdb78f8b8173f07aa795bd5e491dc", + "0xb271205227c7aa27f45f20b3ba380dfea8b51efae91fd32e552774c99e2a1237aa59c0c43f52aad99bba3783ea2f36a4", + "0xa4e8f4a4f81f855f46512af8cdcbc9ae8a7eb395a75f135e5569b758a8d92349681a0358500f2d41f4578d3f7ffaa90f", + "0x876a46a1e38a8ae4fbad9cb9336baed2f740b01fabb784233ae2f84ffc972aefbfc5458e815491ab63b42fcb67f6b7cb", + "0x8e62874e15daea5eb362fa4aaad371d6280b6ca3d4d86dae9c6d0d663186a9475c1d865cf0f37c22cb9e916c00f92f71", + "0x95eacc3adc09c827593f581e8e2de068bf4cf5d0c0eb29e5372f0d23364788ee0f9beb112c8a7e9c2f0c720433705cf0", + "0xacebcdddf7ac509202f9db4efbc0da9172f57b3e468f9b6c116c6b134c906256630d44c38a19ec0e4b569c5001a5a04c", + "0xa7b9a71c54b44f6738a77f457af08dc79f09826193197a53c1c880f15963c716cec9ff0fd0bcb8ab41bc2fe89c2711fa", + "0xa984a361f4eb059c693e8405075a81469157811e78c317bb3ca189b16cd5c3b2a567c65d78560ef2ca95e108dc5a211e", + "0xa1cd4b34c72719c9d2707d45cd91a213541dd467f294f225e11571fd2e1cea6aac4b94b904ec9e153ed3ac350856ad97", + "0x86fef261cd5bccd56c72bba1bfcb512c7b45015283dbea7458d6a33ab1edfb992139cfb0afd7b05a2dfb327b6c8f94dc", + "0xb098f178f84fc753a76bb63709e9be91eec3ff5f7f3a5f4836f34fe8a1a6d6c5578d8fd820573cef3a01e2bfef3eaf3a", + "0x8c62ca6abda1a9af02d5c477d2bbf4c00900328f3f03c45f5e1e6bc69a5be2b7acc2532a923f19cb4d4ab43d0d2f42ec", + "0x97f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bb", + "0xb0675bcee7652a66c92dc254157eef380726c396b1c2f5b4e1905fff912003b7e790f31fb5542df57f1f465e0915e7a0", + "0xb3d106c404056e440519d8a1e657f249d9aae11325796404bb048c1792a12f8addf7aa29c5822893c8cc408527793d6a", + "0xa0ec3e71a719a25208adc97106b122809210faf45a17db24f10ffb1ac014fac1ab95a4a1967e55b185d4df622685b9e8", + "0xb12d0c357016caa5c0ec0a6bdc07e60c2af4631c477366eeb6ab4fffbd0ca40ab9ec195091478a2698bf26349b785ae8", + "0xb4ff0075497094519c49b4b56687a1b8c84878e110dc7f2bd492608f3977dfdc538f1c8e3f8941552552af121eab9772", + "0x812b2d0546aa77dec2d55406b0131ed580c079c1aeb76eb2ca076b7b58289fa9d781069a2e11fe2199f1e02c5dd70e6a", + "0xae08c32bac1e3ec1e2250803b1781b8004efb2ad7f215e2fe8feb9f9ec5ec14157a9395f9f0e92060d18f4b73b33c0c3", + "0x815c0c9f90323633f00c1382199b8c8325d66fda9b93e7147f6dee80484c5fc4ef8b4b1ec6c64fab0e23f198beefa9ea", + "0xaa10e1055b14a89cc3261699524998732fddc4f30c76c1057eb83732a01416643eb015a932e4080c86f42e485973d240", + "0xab812b452a959fd9cbca07925045312f94e45eb1a7129b88ea701b2c23c70ae18a3c4a1e81389712c6c7d41e748b8c7d", + "0x80e8e7de168588f5ac5f3b9f2fabcadc0c4f50c764f6a4abf8231675fec11277d49e7357c3b5b681566e6a3d32b557e1", + "0xb3dc963ef53ae9b6d83ce417c5d417a9f6cc46beaa5fcf74dc59f190c6e9c513e1f57a124a0ef8b6836e4c8928125500", + "0x8ff7cc69f007f11481c91c6f9b20698998a0c2e9a2928bec8eea7507c7ad73a9d1d218cfdb279c4d2132d7da6c9e513e", + "0x8623144b531c2852fb755a4d8b4c9b303a026de6f99b1e88a1e91fa82bc10d6c7a9d8dad7926b6b7afd21ca4edb92408", + "0x84a3f285f8a8afc70b2c5b2c93e8ab82668def5e21601888fac3d2c0cdf947480c97089ba4ad04e786d4b771c8988c75", + "0xa7e53203bbed6adaa99c54f786622592dcaa4cd702e9aaaa355b8dcf302301f8b8dfec87625a9560079d3f8daf076c5d", + "0xb3f095233b798f4eb74be9d7d13b95800c9421875bc58f7bab4709840881fbfbe1eb133236eead9f469dde9603f06e46", + "0xb3c8a118a25b60416b4e6f9e0bc7cb4a520b22b1982f4d6ba47d3f484f0a98d000eed8f5019051847497f24fd9079a74", + "0x927e6e88fe7641155e68ff8328af706b5f152125206fe32aeab19432f17ec925ed6452489cf22bee1f563096cbd1dae6", + "0x9446407bcd8e5efe9f2ac0efbfa9e07d136e68b03c5ebc5bde43db3b94773de8605c30419eb2596513707e4e7448bb50", + "0x99b2f703619c4472a1039f532bf97f3771a870834f08d3b84fc914a75859fd0902725b40f1a6dabe7f901ac9c23f0842", + "0x8035a49b18a5e6223952e762185cc2f992f7eabdd1fbd9d0a7467605d65de6fe89ec90d778cb2835f4e2abe84fb67983", + "0xaf81da25ecf1c84b577fefbedd61077a81dc43b00304015b2b596ab67f00e41c86bb00ebd0f90d4b125eb0539891aeed", + "0xa74fb46295a7ba2f570e09c4b8047a5833db7bf9fea68be8401bd455430418fe5485be0b41c49bd369f850dbfd991ce3", + "0x82681717d96c5d63a931c4ee8447ca0201c5951f516a876e78dcbc1689b9c4cf57a00a61c6fd0d92361a4b723c307e2d", + "0xb57520f5150ed646e8c26a01bf0bd15a324cc66fa8903f33fa26c3b4dd16b9a7c5118fdac9ee3eceba5ff2138cdce8f0", + "0xa222487021cdd811ed4410ad0c3006e8724dc489a426a0e17b4c76a8cd8f524cd0e63fac45dc8186c5ce1127162bec83", + "0xa6ba3250cd25bd8965d83a177ff93cf273980a7939160b6814a1d2f3cf3006c5a61b0d1c060aa48d33da7b24487eaf43", + "0xa8b15373c351e26e5dc5baba55cb2e1e014f839a7938764ee2def671bd7ac56c3f8b4c9c330f6ae77500d3f7118eb6e8", + "0x8f3f78ee37dbcbbc784fa2a75e047e02f8748af86365f3961cfc1b21055e552b46ec0377085da06914e0cffec0d3f0a4", + "0x997b2de22feea1fb11d265cedac9b02020c54ebf7cbc76ffdfe2dbfda93696e5f83af8d2c4ff54ce8ee987edbab19252", + "0x81ccc19e3b938ec2405099e90022a4218baa5082a3ca0974b24be0bc8b07e5fffaed64bef0d02c4dbfb6a307829afc5c", + "0x995b103d85d9e60f971e05c57b1acebf45bd6968b409906c9efea53ce4dc571aa4345e49c34b444b9ab6b62d13e6630b", + "0x99bef05aaba1ea467fcbc9c420f5e3153c9d2b5f9bf2c7e2e7f6946f854043627b45b008607b9a9108bb96f3c1c089d3", + "0xa64609779de550798ce1b718904bfd6f15e41dc56a14928ab1e6f43bba84d706f5ce39022a34e3fb2e113af695c52473", + "0x8a75c55208585181c6cef64a26b56d6a1b27ef47b69162b2538724575c2dff045ec54a9d321fe662735871b825c5aa3c", + "0x82de0e98b08925f379d1b2c40e30195f610841409ab3724ad3f2d173513e1d884c8b27aff402cd0353f79e61c7b4addb", + "0xafb72b4c111da98379f195da4e5c18462acc7ece85cd66894fbaf69ddab3d3bb0b6957ea0042b7705937919189e6a531", + "0xb58160d3dc5419cfa1f22e54e5135d4f24f9c66565da543a3845f7959660fa1d15c815b9c8ae1160dd32821a035640c0", + "0x89bdc5f82877823776a841cd8e93877c0e5e0b55adcebaafaf304d6460ab22d32bcd7e46e942ec4d8832eaa735b08923", + "0xb4aa2583a999066ec6caa72a3fc19e80d8936f6856d447dd043aa9b126aa63bcaac876266d80913071777984d8d30563", + "0xa762624bc58176cdfa2d8f83629b897bb26a2fad86feb50f1b41603db2db787b42429e3c045d7df8f7ea55c0582c9069", + "0xb8357a39c42f80953e8bc9908cb6b79c1a5c50ed3bbc0e330577a215ac850e601909fa5b53bed90c744e0355863eaa6e", + "0x9847ef9b7f43678bb536a27ab3aecee8cc3eedfe834e1214eaaeb00dc07bc20fd69af3319c043e62a29effd5ffb37e16", + "0xa7d10210c48f84d67a8af3f894062397b22cb48fa3f0936c039400638908f5e976d9783295aad8af9ac602f6bf3b10a7", + "0xa8e1bc8a6493fc7ed293f44c99b28d31561c4818984891e5817c92d270c9408241ceaca44ab079409d13cc0df9e2e187", + "0x98a3e7179e2ad305857bf326d2c4b3924af478b704a944a416f4bc40be691fa53793ae77dcfa409adaee4bced903dfb1", + "0x826a146c3580b547594469b248195c9003205f48d778e8344caff117b210b24351892c5b0ace399a3a66edebc24c180f", + "0x95cc6e3d4e3ec850b01b866ccec0e8093a72311bcc4c149377af66586471ca442d5f61ecbb8878352f0193ddea928805", + "0x925ef08813aa7d99fbb6cc9d045921a43bcf8c9721c437478afd3d81e662df84497da96ddbf663996503b433fd46af28", + "0x8b737f47d5b2794819b5dc01236895e684f1406f8b9f0d9aa06b5fb36dba6c185efec755b77d9424d09b848468127559", + "0x8988349654c5fdf666ec4647d398199cc609bb8b3d5108b9e5678b8d0c7563438f3fbcf9d30ab3ef5df22aad9dc673b2", + "0xaa44163d9f9776392ce5f29f1ecbcc177f8a91f28927f5890c672433b4a3c9b2a34830842d9396dc561348501e885afb", + "0x8fe55d12257709ae842f8594f9a0a40de3d38dabdf82b21a60baac927e52ed00c5fd42f4c905410eacdaf8f8a9952490", + "0xaed3e9f4bb4553952b687ba7bcac3a5324f0cceecc83458dcb45d73073fb20cef4f9f0c64558a527ec26bad9a42e6c4c", + "0x86d386aaf3dff5b9331ace79f6e24cff8759e7e002bbe9af91c6de91ab693f6477551e7ee0a1e675d0fc614814d8a8aa", + "0x8856c31a50097c2cc0c9a09f89e09912c83b9c7838b2c33d645e95d0f35130569a347abc4b03f0cb12a89397b899d078", + "0xa65a82f7b291d33e28dd59d614657ac5871c3c60d1fb89c41dd873e41c30e0a7bc8d57b91fe50a4c96490ebf5769cb6b", + "0x98536b398e5b7f1276f7cb426fba0ec2b8b0b64fba7785ea528bebed6ae56c0dee59f5d295fa4c97a1c621ecacfc4ec3", + "0x8d9e19b3f4c7c233a6112e5397309f9812a4f61f754f11dd3dcb8b07d55a7b1dfea65f19a1488a14fef9a41495083582", + "0xa52cd15bb5cb9bdd7cef27b3644356318d0fa9331f9388edc12b204e2eb56face5604e4c3bb9631ef5bd438ff7821523", + "0x955bcc6bca53e7a6afa0e83c8443364e0e121f416d6024a442253d1e9d805407f2c7f7d9944770db370935e8722e5f51", + "0x95c38f73d6e65f67752ae3f382e8167d7d0d18ced0ca85a1d6b9ba5196f89cf9aed314a7d80b911806d5310584adc1b8", + "0x8e34d569ec169d15c9a0de70c15bf1a798ce9c36b30cca911ef17d6c183de72614575629475b57147f1c37602f25d76c", + "0xb0ea38f0b465ae0f0b019494aecd8a82cb7c496ecfab60af96d0bda1a52c29efd4d4e5b270f3d565eb3485b2aaf3d87c", + "0x90bc674d83e1b863fec40140a2827c942e575bd96bc5e60339c51089bab5fd445ae0c99ab9f1b5074b54682ac9c4a275", + "0x9417af4462cc8d542f6f6c479866f1c9fa4768069ef145f9acdd50221b8956b891ceec3ef4ec77c54006b00e38156cee", + "0xa0d79afac7df720f660881e20f49246f64543e1655a0ab9945030e14854b1dd988df308ed374fc6130586426c6cf16a4", + "0x899729f080571e25fee93538eb21304a10600d5ceb9807959d78c3967d9ba32b570d4f4105626e5972ccf2e24b723604", + "0xada7d351b72dcca4e46d7198e0a6fae51935f9d3363659be3dfaa5af8b1c033d4c52478f8b2fbf86f7318142f07af3a7", + "0xa72841987e4f219d54f2b6a9eac5fe6e78704644753c3579e776a3691bc123743f8c63770ed0f72a71e9e964dbf58f43", + "0xae6f240e7a9baa3e388eb3052c11d5b6ace127b87a7766970db3795b4bf5fc1de17a8ee8528d9bef0d6aefcfb67a7761", + "0xa6e82f6da4520f85c5d27d8f329eccfa05944fd1096b20734c894966d12a9e2a9a9744529d7212d33883113a0cadb909", + "0x95fa3538b8379ff2423656ab436df1632b74311aaef49bc9a3cbd70b1b01febaf2f869b4127d0e8e6d18d7d919f1f6d8", + "0x8025cdadf2afc5906b2602574a799f4089d90f36d73f94c1cf317cfc1a207c57f232bca6057924dd34cff5bde87f1930", + "0xa1402173873adf34e52c43feacd915eb141d77bf16bc5180e1ee86762b120411fffa7cb956cf0e625364e9a2d56f01f3", + "0x91887afbd7a83b8e9efb0111419c3d0197728d56ef96656432fbc51eb7ed736bb534dad59359629cf9c586461e251229", + "0x8e6ad45832f4ba45f5fe719022e6b869f61e1516d8835586b702764c474befe88591722045da41ab95aafbf0387ecd18", + "0x8a8409bd78ea4ff8d6e3e780ec93a3b017e639bbdaa5f399926e07ce2a939c8b478699496da2599b03a8fb62328cb1da", + "0x912b440c4d3c8177a012cea1cc58115cbc6795afc389363c7769bf419b9451bcde764586cf26c15e9906ea54837d031a", + "0xa82f4819a86b89c9cbd6d164e959fe0061e6a9b705862be2952d3cf642b515bd5edae4e6338e4eeb975a9082ff205bb7", + "0x8ab3f4fbbea07b771705f27bb470481ab6c44c46afcb317500df564b1177fa6dc7a3d27506b9e2d672ac1edd888a7a65", + "0x85ddb75efa05baaa727d659b09d268b606f81029796e106b55ff8d47fdb74a7d237286dfeadde6cc26d53d56204eff65", + "0xb0e7791fb972fe014159aa33a98622da3cdc98ff707965e536d8636b5fcc5ac7a91a8c46e59a00dca575af0f18fb13dc", + "0xb20c190dd46da9fe928d277ccfa0b804b942f5a181adb37fc1219e028fb7b48d63261248c6d939d68d4d8cd2c13a4f80", + "0xa20cca122e38a06188877a9f8f0ca9889f1dd3ffb22dddf76152604c72fc91519e414c973d4616b986ff64aec8a3208b", + "0xa1555b4e598691b619c576bad04f322fc6fe5898a53865d330097460e035e9d0e9169089a276f15f8977a39f27f9aec3", + "0x97e827da16cbd1da013b125a96b24770e0cad7e5af0ccd9fb75a60d8ba426891489d44497b091e1b0383f457f1b2251c", + "0x908ee03816f68a78d1da050c8ec125d3dac2306178d4f547d9c90bd58b3985a20f6fef507dcc81f010d70262d9abab68", + "0xa572cbea904d67468808c8eb50a9450c9721db309128012543902d0ac358a62ae28f75bb8f1c7c42c39a8c5529bf0f4e", + "0x951f3707389db5012848b67ab77b63da2a73118b7df60f087fa9972d8f7fef33ed93e5f25268d4237c2987f032cd613f", + "0x8f021f52cbd6c46979619100350a397154df00cae2efe72b22ad0dd66747d7de4beecd9b194d0f7016e4df460a63a8ea", + "0xa272e9d1d50a4aea7d8f0583948090d0888be5777f2846800b8281139cd4aa9eee05f89b069857a3e77ccfaae1615f9c", + "0x8c7b0e11f9bc3f48d84013ef8e8575aeb764bc1b9bf15938d19eb191201011365c2b14d78139a0f27327cb21c1b8bf3d", + "0xab48aa2cc6f4a0bb63b5d67be54ac3aed10326dda304c5aeb9e942b40d6e7610478377680ab90e092ef1895e62786008", + "0x8515e7f61ca0470e165a44d247a23f17f24bf6e37185467bedb7981c1003ea70bbec875703f793dd8d11e56afa7f74ba", + "0x8f81b19ee2e4d4d0ff6384c63bacb785bc05c4fc22e6f553079cc4ff7e0270d458951533458a01d160b22d59a8bd9ab5", + "0xa6f68f09fc2b9df0ed7b58f213319dd050c11addaef31231853c01079fb225d0f8aa6860acd20bc1de87901f6103b95f", + "0x85ae0ef8d9ca996dbfebb49fa6ec7a1a95dff2d280b24f97c613b8e00b389e580f0f08aa5a9d5e4816a6532aaebc23bf", + "0xb88b54fe7990227c6d6baa95d668d2217626b088579ddb9773faf4e8f9386108c78ddd084a91e69e3bdb8a90456030c6", + "0xaa14e001d092db9dc99746fcfc22cd84a74adaa8fc483e6abf697bd8a93bda2ee9a075aca303f97f59615ed4e8709583", + "0x9717182463fbe215168e6762abcbb55c5c65290f2b5a2af616f8a6f50d625b46164178a11622d21913efdfa4b800648d", + "0xb2a3cedd685176071a98ab100494628c989d65e4578eec9c5919f2c0321c3fc3f573b71ef81a76501d88ed9ed6c68e13", + "0xb203b206005c6db2ecfab163e814bacb065872485d20ac2d65f982b4696617d12e30c169bf10dbe31d17bf04a7bdd3bc", + "0x8d08a52857017fd5cab3a821ccb8f5908c96cf63c5a5647209c037e2ea1c56f9650ec030b82ffdce76d37672d942e45b", + "0x84d1e4703d63ac280cd243c601def2b6cc0c72fb0a3de5e83149d3ac558c339f8b47a977b78fd6c9acf1f0033ae71a88", + "0x8e04ad5641cc0c949935785184c0b0237977e2282742bc0f81e58a7aa9bfee694027b60de0db0de0539a63d72fd57760", + "0x89ece308f9d1f0131765212deca99697b112d61f9be9a5f1f3780a51335b3ff981747a0b2ca2179b96d2c0c9024e5224", + "0xa06d4f9703440b365bdce45e08442ec380165c5051c30e9df4d25571cba350ce5ab5e07810e1d1476c097a51d7734630", + "0x950c598dc627cd58cd7d34e0dd055daf92c9bc89235c3a5d3aacf594af97f99eb0f02a6f353238386626ee67462cd9a2", + "0x8e876b110d8ad35997a0d4044ca03e8693a1532497bcbbb8cdb1cd4ce68fe685eb03209b3d2833494c0e79c1c1a8c60b", + "0x803968608f3f1447912bb635f200ed5b0bc2f3ade2736bccb05a70c83c7df55602a2723f6b9740e528456eeba51ced64", + "0x931cdb87f226ad70ec6e0ff47e8420481d080e57951443ad804411a7b78dc2f2e99cbdf2463dda39d6be2ad95c0730e1", + "0x931bea4bc76fad23ba9c339622ddc0e7d28904a71353c715363aa9e038f64e990ef6ef76fc1fc431b9c73036dd07b86c", + "0x9929f70ba8c05847beb74c26dd03b4ec04ca8895bc6d9f31d70bd4231329c2f35799d4404a64f737e918db55eec72d25", + "0x93abf6639e499a3d83e3e2369882ac8dbe3e084e7e766d166121897497eabee495728365d9d7b9d9399a14831d186ff1", + "0xb29e53ff7b1595375136703600d24237b3d62877a5e8462fad67fc33cbde5bd7fcfac10dde01f50944b9f8309ad77751", + "0x95906ec0660892c205634e21ad540cbe0b6f7729d101d5c4639b864dea09be7f42a4252c675d46dd90a2661b3a94e8ca", + "0xafdb131642e23aedfd7625d0107954a451aecc9574faeeec8534c50c6156c51d3d0bdb8174372d91c560a0b7799b4e8e", + "0x97631345700c2eddaeb839fc39837b954f83753ef9fe1d637abcfc9076fcb9090e68da08e795f97cfe5ef569911969ec", + "0x8bcfb0520b9d093bc59151b69e510089759364625589e07b8ca0b4d761ce8e3516dbdce90b74b9b8d83d9395091b18bf", + "0xb54d0e0f7d368cd60bc3f47e527e59ef5161c446320da4ed80b7af04a96461b2e372d1a1edf8fe099e40bff514a530af", + "0x8fbdab59d6171f31107ff330af9f2c1a8078bb630abe379868670c61f8fa5f05a27c78f6a1fd80cde658417ef5d6a951", + "0x9718567efc4776425b17ac2450ae0c117fdf6e9eeeabb4ede117f86bee413b31b2c07cf82e38c6ecaf14001453ce29d0", + "0xb0c9351b9604478fb83646d16008d09cedf9600f57b0adbf62dd8ad4a59af0f71b80717666eeec697488996b71a5a51e", + "0x8ce3b57b791798433fd323753489cac9bca43b98deaafaed91f4cb010730ae1e38b186ccd37a09b8aed62ce23b699c48", + "0x942d5ed35db7a30cac769b0349fec326953189b51be30b38189cd4bb4233cfe08ccc9abe5dd04bf691f60e5df533d98a", + "0xa4c90c14292dfd52d27d0e566bbfa92a2aebb0b4bcd33d246d8eeb44156c7f2fd42ba8afb8e32699724c365fc583e904", + "0xb29043a7273d0a2dbc2b747dcf6a5eccbd7ccb44b2d72e985537b117929bc3fd3a99001481327788ad040b4077c47c0d", + "0xb08d72a2c2656679f133a13661d9119ab3a586e17123c11ca17dc538d687576789d42ab7c81daa5af6506cc3bac9d089", + "0x98ff9389cf70ee9e0ae5df1474454ab5d7529cab72db2621e1b8b40b473168c59689a18838c950de286ea76dfdf9dc24", + "0x93b15273200e99dbbf91b24f87daa9079a023ccdf4debf84d2f9d0c2a1bf57d3b13591b62b1c513ec08ad20feb011875", + "0xb928f3beb93519eecf0145da903b40a4c97dca00b21f12ac0df3be9116ef2ef27b2ae6bcd4c5bc2d54ef5a70627efcb7", + "0x90239bd66450f4cc08a38402adc026444230fd893b752c7dfc4699539044a1fd39ba133cbdc330b7fc19538e224725cb", + "0x8ed36ed5fb9a1b099d84cba0686d8af9a2929a348797cd51c335cdcea1099e3d6f95126dfbc93abcfb3b56a7fc14477b", + "0x8215b57dd02553c973052c69b0fecefa813cc6f3420c9b2a1cffae5bd47e3a7a264eaec4ed77c21d1f2f01cf130423c0", + "0xa7a9bebe161505ba51f5fb812471f8fb8702a4c4ad2f23de1008985f93da644674edb2df1096920eaecb6c5b00de78cd", + "0x8fa4a674911c27c9306106ffcc797e156b27dab7a67ce7e301cfd73d979331f8edcd4d3397616dd2821b64e91b4d9247", + "0xb2277b279519ba0d28b17c7a32745d71ceb3a787e89e045fe84aaadf43a1d388336ec4c8096b17997f78d240ab067d07", + "0x8a3a08b7dae65f0e90a3bc589e13019340be199f092203c1f8d25ee9989378c5f89722430e12580f3be3e4b08ae04b1b", + "0x825abb120ae686f0e3c716b49f4086e92b0435413a137a31bcf992e4851ecdf9d74ceea3d6e063d7009ec8b8e504fb30", + "0xa8f5540a9977fd2ee7dea836ed3dafa5d0b1fc9c5d5f1689e91ec49cdef989976c51502c3764025ef8ff542ef3b170ea", + "0x87dc2da68d1641ffe8e6ca1b675767dc3303995c5e9e31564905c196e3109f11345b8877d28d116e8ae110e6a6a7c7a4", + "0x9725ff209f8243ab7aceda34f117b4c402e963cc2a3a85d890f6d6d3c0c96e0b0acbed787fe4fa7b37197c049ab307ea", + "0x99cdf3807146e68e041314ca93e1fee0991224ec2a74beb2866816fd0826ce7b6263ee31e953a86d1b72cc2215a57793", + "0xa69ec7c89252e2531c057ebeb86098e3b59ca01558afd5f6de4ec40370cb40de07856334770ecacbf23e123201266f67", + "0xb8ae7b57f57bf505dd2623a49017da70665f5b7f5ac74d45d51883aac06881467b5ef42964bd93ff0f3b904e8239e7b4", + "0x8aea7d8eb22063bcfe882e2b7efc0b3713e1a48dd8343bed523b1ab4546114be84d00f896d33c605d1f67456e8e2ed93", + "0xaf3dc44695d2a7f45dbe8b21939d5b4015ed1697131184ce19fc6bb8ff6bbc23882348b4c86278282dddf7d718e72e2b", + "0x96413b2d61a9fc6a545b40e5c2e0064c53418f491a25994f270af1b79c59d5cf21d2e8c58785a8df09e7265ac975cb28", + "0x8f207bd83dad262dd9de867748094f7141dade78704eca74a71fd9cfc9136b5278d934db83f4f3908d7a3de84d583fc9", + "0x86bdb0a034dab642e05cb3e441d67f60e0baf43fa1140e341f028a2c4b04f3f48a0cdc5ee1c7825dcdc4019b004ec073", + "0xb8f1a9edf68006f913b5377a0f37bed80efadc4d6bf9f1523e83b2311e14219c6aa0b8aaee79e47a9977e880bad37a8e", + "0xa3caedb9c2a5d8e922359ef69f9c35b8c819bcb081610343148dc3a2c50255c9caa6090f49f890ca31d853384fc80d00", + "0x851f8a0b82a6d86202a61cbc3b0f3db7d19650b914587bde4715ccd372e1e40cab95517779d840416e1679c84a6db24e", + "0xb614644e726aa24b10254dd0a639489211ec2f38a69966b5c39971069ea046b83ee17cf0e91da740e11e659c0c031215", + "0xa19dd710fbf120dbd2ce410c1abeb52c639d2c3be0ec285dc444d6edea01cee272988e051d5c9c37f06fea79b96ba57b", + "0xa2ca1572cca0b43a2652dd519063311003ca6eccab5e659fc4a39d2411608e12e28294973aae5be678da60b0c41ca5f0", + "0xb783a70a1cf9f53e7d2ddf386bea81a947e5360c5f1e0bf004fceedb2073e4dd180ef3d2d91bee7b1c5a88d1afd11c49", + "0xacb58c81ae0cae2e9d4d446b730922239923c345744eee58efaadb36e9a0925545b18a987acf0bad469035b291e37269", + "0xa9e1558a3ab00c369a1ce75b98f37fd753dbb1d5e86c4514858b1196dfd149aa7b818e084f22d1ad8d34eba29ce07788", + "0xa23cf58a430d6e52c8099ecee6756773c10183e1e3c6871eb74c7f8b933943a758872d061a961c9961f2e06b4c24f2c4", + "0x8b5b5399aefcd717d8fc97ea80b1f99d4137eb6fa67afd53762ee726876b6790f47850cf165901f1734487e4a2333b56", + "0x8e0b26637a9bc464c5a9ac490f6e673a0fb6279d7918c46a870307cf1f96109abf975d8453dc77273f9aba47c8eb68c2", + "0xb4d670b79d64e8a6b71e6be0c324ff0616ad1a49fbb287d7bf278ec5960a1192b02af89d04918d3344754fb3284b53a1", + "0x86de7221af8fd5bb4ee28dad543997cde0c5cd7fa5ec9ad2b92284e63e107154cc24bf41e25153a2a20bcae3add50542", + "0xa85ae765588126f5e860d019c0e26235f567a9c0c0b2d8ff30f3e8d436b1082596e5e7462d20f5be3764fd473e57f9cf", + "0xb422f8004e8e7c47cf4bc69c3a551b3491916e415b824c2d064204d55c465fb6839834a3f37d8a9271c75e5e2d1f3718", + "0x8a5898f52fe9b20f089d2aa31e9e0a3fe26c272ce087ffdfd3490d3f4fa1cacbec4879f5f7cd7708e241a658be5e4a2f", + "0x9294795d066f5e24d506f4b3aa7613b831399924cee51c160c92eb57aad864297d02bfda8694aafd0a24be6396eb022a", + "0xa339d48ea1916bad485abb8b6cbdcafdba851678bfe35163fa2572c84553386e6ee4345140eab46e9ddbffc59ded50d5", + "0xa325677c8eda841381e3ed9ea48689b344ed181c82937fa2651191686fd10b32885b869ce47ca09fbe8bd2dbcaa1c163", + "0x8fc502abb5d8bdd747f8faf599b0f62b1c41145d30ee3b6ff1e52f9370240758eac4fdb6d7fb45ed258a43edebf63e96", + "0x837d6c15c830728fc1de0e107ec3a88e8bbc0a9c442eb199a085e030b3bcdfb08e7155565506171fe838598b0429b9cc", + "0x8eb8b1b309a726fa5af6a6228385214a48788a1f23fe03cd46e16e200ed7d8909394d2e0b442ef71e519215765ca6625", + "0xa07d173f08193f50544b8f0d7e7826b0758a2bedfdd04dcee4537b610de9c647c6e40fdf089779f1ec7e16ca177c9c35", + "0x9780e853f8ce7eda772c6691d25e220ca1d2ab0db51a7824b700620f7ac94c06639e91c98bb6abd78128f0ec845df8ef", + "0x820c62fa9fe1ac9ba7e9b27573036e4e44e3b1c43723e9b950b7e28d7cf939923d74bec2ecd8dc2ade4bab4a3f573160", + "0x8353cad3430c0b22a8ec895547fc54ff5791382c4060f83c2314a4fcd82fb7e8e822a9e829bace6ec155db77c565bcb3", + "0xb91ab4aed4387ed938900552662885cdb648deaf73e6fca210df81c1703eb0a9cbed00cecf5ecf28337b4336830c30c8", + "0xb12332004f9ecc80d258fe5c7e6a0fba342b93890a5ea0ccda642e7b9d79f2d660be4b85d6ca744c48d07a1056bc376d", + "0x88eeb6e5e927aa49a4cd42a109705c50fa58ed3833a52a20506f56cc13428cbccb734784a648c56de15ef64b0772de71", + "0x83798f4dcc27c08dcd23315bee084a9821f39eed4c35ef45ba5079de93e7cf49633eea6d0f30b20c252c941f615f6ccb", + "0x8eb7dd3ccc06165c3862d4e32d7fd09a383e0226fa06909ddf4e693802fd5c4324407d86c32df1fdc4438853368db6ce", + "0xa98ae7e54d229bac164d3392cb4ab9deeb66108cd6871bd340cbc9170f29d4602a2c27682f9d2fa3ad8019e604b6016a", + "0x8345dd80ffef0eaec8920e39ebb7f5e9ae9c1d6179e9129b705923df7830c67f3690cbc48649d4079eadf5397339580c", + "0x8da7f6c67fb6018092a39f24db6ea661b1ead780c25c0de741db9ae0cfc023f06be36385de6a4785a47c9f92135ea37d", + "0x875a795a82ae224b00d4659eb1f6a3b024f686bfc8028b07bf92392b2311b945afc3d3ab346a1d4de2deac1b5f9c7e0d", + "0xabc2344dc831a4bc0e1ec920b5b0f774bd6465f70199b69675312c4993a3f3df50fe4f30693e32eb9c5f8e3a70e4e7c4", + "0xb8e551f550803ec5e67717c25f109673b79284e923c9b25558a65864e0d730aeaecab0ee24448226e5dd9da3070080a2", + "0xab83dfefb120fab7665a607d749ef1765fbb3cc0ba5827a20a135402c09d987c701ddb5b60f0f5495026817e8ab6ea2e", + "0x90c0c1f774e77d9fad044aa06009a15e33941477b4b9a79fa43f327608a0a54524b3fcef0a896cb0df790e9995b6ebf1", + "0xab23c89f138f4252fc3922e24b7254743af1259fa1aeae90e98315c664c50800cecfc72a4d45ee772f73c4bb22b8646f", + "0x865dfd7192acc296f26e74ae537cd8a54c28450f18d579ed752ad9e0c5dcb2862e160e52e87859d71f433a3d4f5ca393", + "0x82d333a47c24d4958e5b07be4abe85234c5ad1b685719a1f02131a612022ce0c726e58d52a53cf80b4a8afb21667dee1", + "0xb6ad11e5d15f77c1143b1697344911b9c590110fdd8dd09df2e58bfd757269169deefe8be3544d4e049fb3776fb0bcfb", + "0x8978bdb97d45647584b8b9971246421b2f93d9ac648b1ed6595ad8326f80c107344a2c85d1756cd2f56b748001d5fd30", + "0xb4e84be7005df300900c6f5f67cf288374e33c3f05c2f10b6d2ff754e92ea8577d55b91e22cea2782250a8bc7d2af46d", + "0xae5163dc807af48bc827d2fd86b7c37de5a364d0d504c2c29a1b0a243601016b21c0fda5d0a446b9cb2a333f0c08ab20", + "0xad297ab0ef5f34448ceffef73c7104791cacae92aed22df8def9034b0f111b2af4f4365259dccecb46a1208fd3354fcd", + "0x9081bebcd06b4976d992d98a499397a44da20650ad4a1e0fb15dc63db8744d60d70dff0c6e2c3bb43ee35d1940683d1b", + "0xb3b3c89c783ee18bc030384914fafb8608d54c370005c49085fe8de22df6e04828b082c2fe7b595bd884986d688345f5", + "0xa232213cdd2b3bbdf5f61e65d57e28ee988c2b48185c9ac59b7372bc05c5b5763e19086ceaefb597b8e2b21b30aaacde", + "0x8d8be92bde8af1b9df13d5a8ed8a3a01eab6ee4cf883d7987c1d78c0d7d9b53a8630541fddf5e324b6cf4900435b1df8", + "0xad84464b3966ec5bede84aa487facfca7823af383715078da03b387cc2f5d5597cdd7d025aa07db00a38b953bdeb6e3f", + "0x889586bc28e52a4510bc9e8f1e673835ff4f27732b3954b6b7cd371d10a453ba793cfdfacf4ce20ca819310e541198b5", + "0xb35220775df2432a8923a1e3e786869c78f1661ed4e16bd91b439105f549487fb84bbea0590124a1d7aa4e5b08a60143", + "0x911bb496153aa457e3302ea8e74427962c6eb57e97096f65cafe45a238f739b86d4b790debd5c7359f18f3642d7d774c", + "0x89db41a6183c2fe47cf54d1e00c3cfaae53df634a32cccd5cf0c0a73e95ee0450fc3d060bb6878780fbf5f30d9e29aac", + "0x8774d1d544c4cc583fb649d0bbba86c2d2b5abb4c0395d7d1dac08ab1a2cc795030bdbdce6e3213154d4f2c748ccdaef", + "0xa1dbd288ae846edbfba77f7342faf45bdc0c5d5ce8483877acce6d00e09ef49d30fb40d4764d6637658d5ac738e0e197", + "0xb74c0f5b4125900f20e11e4719f69bac8d9be792e6901800d93f7f49733bc42bfb047220c531373a224f5564b6e6ecbb", + "0xa73eb991aa22cdb794da6fcde55a427f0a4df5a4a70de23a988b5e5fc8c4d844f66d990273267a54dd21579b7ba6a086", + "0x80fd75ebcc0a21649e3177bcce15426da0e4f25d6828fbf4038d4d7ed3bd4421de3ef61d70f794687b12b2d571971a55", + "0x913e4eec6be4605946086d38f531d68fe6f4669777c2d066eff79b72a4616ad1538aae7b74066575669d7ce065a7f47d", + "0x97363100f195df58c141aa327440a105abe321f4ebc6aea2d5f56c1fb7732ebfa5402349f6da72a6182c6bbedaeb8567", + "0x8c8b694b04d98a749a0763c72fc020ef61b2bb3f63ebb182cb2e568f6a8b9ca3ae013ae78317599e7e7ba2a528ec754a", + "0xaf048ba47a86a6d110fc8e7723a99d69961112612f140062cca193d3fc937cf5148671a78b6caa9f43a5cf239c3db230", + "0x92e5cd122e484c8480c430738091f23f30773477d9850c3026824f1f58c75cf20365d950607e159717864c0760432edb", + "0xab03beff9e24a04f469555b1bc6af53aa8c49c27b97878ff3b4fbf5e9795072f4d2b928bff4abbbd72d9aa272d1f100e", + "0x9252a4ac3529f8b2b6e8189b95a60b8865f07f9a9b73f98d5df708511d3f68632c4c7d1e2b03e6b1d1e2c01839752ada", + "0x84614d2ae5bc594a0c639bed6b6a1dc15d608010848b475d389d43001346ed5f511da983cc5df62b6e49c32c0ef5b24c", + "0xa99987ba6c0eb0fd4fbd5020a2db501128eb9d6a9a173e74462571985403f33959fc2f526b9a424d6915a77910939fc3", + "0x87109a988e34933e29c2623b4e604d23195b0346a76f92d51c074f07ce322de8e1bef1993477777c0eb9a9e95c16785f", + "0x8e7cb413850ecb6f1d2ded9851e382d945a8fee01f8f55184c7b0817000073944c6b6c77164e0a2272c39410fde18e58", + "0xb4bf4717ad2d3fce3a11a84dee1b38469be9e783b298b200cc533be97e474bf94d6c7c591d3102992f908820bc63ac72", + "0x969b4bcd84cabd5ba5f31705de51e2c4096402f832fdf543d88eb41ebb55f03a8715c1ceea92335d24febbea17a3bdd7", + "0x92c057502d4de4935cf8af77f21ca5791f646286aead82753a62dfb06dbd1705df506a02f19517accb44177cb469f3e4", + "0x90f3659630d58bd08e2e0131f76283cf9de7aa89e0102c67e79ca05c5c7217b213c05668f3de82939d8414d1674dc6a1", + "0x8c3999317e8c6753e3e89651e5ba7fdea91ab1dda46fdb6902eccd4035ba1618a178d1cd31f6fbbacc773255d72995b3", + "0x881f1a1ac6a56a47f041f49266d0a2e146c35e42bf87c22a9bc23a363526959e4d3d0c7e7382be091246787ef25e33d5", + "0x866f9ebe3afe58f2fd3234c4635a215c7982a53df4fb5396d9614a50308020b33618606a434984ca408963093b8f916d", + "0xa49f744d9bbfbcdd106592646040a3322fbe36e628be501a13f5272ad545a149f06f59bd417df9ae1a38d08c5a2108fe", + "0xa60d5589316a5e16e1d9bb03db45136afb9a3d6e97d350256129ee32a8e33396907dc44d2211762967d88d3e2840f71b", + "0xb48e56bd66650adb1e4f0c68b745f35f08d9829a06dbd5c67b2cc03dcf4cc5f9a85c84654f9596163b59d693eab14c34", + "0xac9b60d5afcbd5663a8a44b7c5a02f19e9a77ab0a35bd65809bb5c67ec582c897feb04decc694b13e08587f3ff9b5b60", + "0x99fb4a03d71921b6a56f5e39f42f281b96ee017e859f738fab6fbc51edbcf3b02b1276336d1f82391e495723ecbe337e", + "0xa9761c83d922ced991557c9913bedfbe34509ec68d34a791242ac0f96e30f87e29a19099199a38aac29037e0c8e939c6", + "0xafad69e0702e02012b2419bdc7250c94816e40286a238e5f83858c7be2f93be2ec3657dd6cd0ded9184d6c9646092d3e", + "0xa29e520a73ec28f4e2e45050c93080eeaee57af1108e659d740897c3ced76ceb75d106cb00d7ed25ec221874bf4b235a", + "0x91d2fe0eded16c39a891ba065319dabfe2c0c300f5e5f5c84f31f6c52344084f0bb60d79650fc1dfe8d2a26fe34bd1fa", + "0x97063101e86c4e4fa689de9521bb79575ed727c5799cf69c17bfe325033200fcecca79a9ec9636b7d93e6d64f7275977", + "0xb194e855fa3d9ab53cbfbc97e7e0ce463723428bb1ad25952713eac04d086bf2407bdb78f8b8173f07aa795bd5e491dc", + "0xb271205227c7aa27f45f20b3ba380dfea8b51efae91fd32e552774c99e2a1237aa59c0c43f52aad99bba3783ea2f36a4", + "0xa4e8f4a4f81f855f46512af8cdcbc9ae8a7eb395a75f135e5569b758a8d92349681a0358500f2d41f4578d3f7ffaa90f", + "0x876a46a1e38a8ae4fbad9cb9336baed2f740b01fabb784233ae2f84ffc972aefbfc5458e815491ab63b42fcb67f6b7cb", + "0x8e62874e15daea5eb362fa4aaad371d6280b6ca3d4d86dae9c6d0d663186a9475c1d865cf0f37c22cb9e916c00f92f71", + "0x95eacc3adc09c827593f581e8e2de068bf4cf5d0c0eb29e5372f0d23364788ee0f9beb112c8a7e9c2f0c720433705cf0", + "0xacebcdddf7ac509202f9db4efbc0da9172f57b3e468f9b6c116c6b134c906256630d44c38a19ec0e4b569c5001a5a04c", + "0xa7b9a71c54b44f6738a77f457af08dc79f09826193197a53c1c880f15963c716cec9ff0fd0bcb8ab41bc2fe89c2711fa", + "0xa984a361f4eb059c693e8405075a81469157811e78c317bb3ca189b16cd5c3b2a567c65d78560ef2ca95e108dc5a211e", + "0xa1cd4b34c72719c9d2707d45cd91a213541dd467f294f225e11571fd2e1cea6aac4b94b904ec9e153ed3ac350856ad97", + "0x86fef261cd5bccd56c72bba1bfcb512c7b45015283dbea7458d6a33ab1edfb992139cfb0afd7b05a2dfb327b6c8f94dc", + "0xb098f178f84fc753a76bb63709e9be91eec3ff5f7f3a5f4836f34fe8a1a6d6c5578d8fd820573cef3a01e2bfef3eaf3a", + "0x8c62ca6abda1a9af02d5c477d2bbf4c00900328f3f03c45f5e1e6bc69a5be2b7acc2532a923f19cb4d4ab43d0d2f42ec", + "0x97f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bb", + "0xb0675bcee7652a66c92dc254157eef380726c396b1c2f5b4e1905fff912003b7e790f31fb5542df57f1f465e0915e7a0", + "0xb3d106c404056e440519d8a1e657f249d9aae11325796404bb048c1792a12f8addf7aa29c5822893c8cc408527793d6a", + "0xa0ec3e71a719a25208adc97106b122809210faf45a17db24f10ffb1ac014fac1ab95a4a1967e55b185d4df622685b9e8", + "0xb12d0c357016caa5c0ec0a6bdc07e60c2af4631c477366eeb6ab4fffbd0ca40ab9ec195091478a2698bf26349b785ae8", + "0xb4ff0075497094519c49b4b56687a1b8c84878e110dc7f2bd492608f3977dfdc538f1c8e3f8941552552af121eab9772", + "0x812b2d0546aa77dec2d55406b0131ed580c079c1aeb76eb2ca076b7b58289fa9d781069a2e11fe2199f1e02c5dd70e6a", + "0xae08c32bac1e3ec1e2250803b1781b8004efb2ad7f215e2fe8feb9f9ec5ec14157a9395f9f0e92060d18f4b73b33c0c3", + "0x815c0c9f90323633f00c1382199b8c8325d66fda9b93e7147f6dee80484c5fc4ef8b4b1ec6c64fab0e23f198beefa9ea", + "0xaa10e1055b14a89cc3261699524998732fddc4f30c76c1057eb83732a01416643eb015a932e4080c86f42e485973d240", + "0xab812b452a959fd9cbca07925045312f94e45eb1a7129b88ea701b2c23c70ae18a3c4a1e81389712c6c7d41e748b8c7d", + "0x80e8e7de168588f5ac5f3b9f2fabcadc0c4f50c764f6a4abf8231675fec11277d49e7357c3b5b681566e6a3d32b557e1", + "0xb3dc963ef53ae9b6d83ce417c5d417a9f6cc46beaa5fcf74dc59f190c6e9c513e1f57a124a0ef8b6836e4c8928125500", + "0x8ff7cc69f007f11481c91c6f9b20698998a0c2e9a2928bec8eea7507c7ad73a9d1d218cfdb279c4d2132d7da6c9e513e", + "0x8623144b531c2852fb755a4d8b4c9b303a026de6f99b1e88a1e91fa82bc10d6c7a9d8dad7926b6b7afd21ca4edb92408", + "0x84a3f285f8a8afc70b2c5b2c93e8ab82668def5e21601888fac3d2c0cdf947480c97089ba4ad04e786d4b771c8988c75", + "0xa7e53203bbed6adaa99c54f786622592dcaa4cd702e9aaaa355b8dcf302301f8b8dfec87625a9560079d3f8daf076c5d", + "0xb3f095233b798f4eb74be9d7d13b95800c9421875bc58f7bab4709840881fbfbe1eb133236eead9f469dde9603f06e46", + "0xb3c8a118a25b60416b4e6f9e0bc7cb4a520b22b1982f4d6ba47d3f484f0a98d000eed8f5019051847497f24fd9079a74", + "0x927e6e88fe7641155e68ff8328af706b5f152125206fe32aeab19432f17ec925ed6452489cf22bee1f563096cbd1dae6", + "0x9446407bcd8e5efe9f2ac0efbfa9e07d136e68b03c5ebc5bde43db3b94773de8605c30419eb2596513707e4e7448bb50", + "0x99b2f703619c4472a1039f532bf97f3771a870834f08d3b84fc914a75859fd0902725b40f1a6dabe7f901ac9c23f0842", + "0x8035a49b18a5e6223952e762185cc2f992f7eabdd1fbd9d0a7467605d65de6fe89ec90d778cb2835f4e2abe84fb67983", + "0xaf81da25ecf1c84b577fefbedd61077a81dc43b00304015b2b596ab67f00e41c86bb00ebd0f90d4b125eb0539891aeed", + "0xa74fb46295a7ba2f570e09c4b8047a5833db7bf9fea68be8401bd455430418fe5485be0b41c49bd369f850dbfd991ce3", + "0x82681717d96c5d63a931c4ee8447ca0201c5951f516a876e78dcbc1689b9c4cf57a00a61c6fd0d92361a4b723c307e2d", + "0xb57520f5150ed646e8c26a01bf0bd15a324cc66fa8903f33fa26c3b4dd16b9a7c5118fdac9ee3eceba5ff2138cdce8f0", + "0xa222487021cdd811ed4410ad0c3006e8724dc489a426a0e17b4c76a8cd8f524cd0e63fac45dc8186c5ce1127162bec83", + "0xa6ba3250cd25bd8965d83a177ff93cf273980a7939160b6814a1d2f3cf3006c5a61b0d1c060aa48d33da7b24487eaf43", + "0xa8b15373c351e26e5dc5baba55cb2e1e014f839a7938764ee2def671bd7ac56c3f8b4c9c330f6ae77500d3f7118eb6e8", + "0x8f3f78ee37dbcbbc784fa2a75e047e02f8748af86365f3961cfc1b21055e552b46ec0377085da06914e0cffec0d3f0a4", + "0x997b2de22feea1fb11d265cedac9b02020c54ebf7cbc76ffdfe2dbfda93696e5f83af8d2c4ff54ce8ee987edbab19252", + "0x81ccc19e3b938ec2405099e90022a4218baa5082a3ca0974b24be0bc8b07e5fffaed64bef0d02c4dbfb6a307829afc5c", + "0x995b103d85d9e60f971e05c57b1acebf45bd6968b409906c9efea53ce4dc571aa4345e49c34b444b9ab6b62d13e6630b", + "0x99bef05aaba1ea467fcbc9c420f5e3153c9d2b5f9bf2c7e2e7f6946f854043627b45b008607b9a9108bb96f3c1c089d3", + "0xa64609779de550798ce1b718904bfd6f15e41dc56a14928ab1e6f43bba84d706f5ce39022a34e3fb2e113af695c52473", + "0x8a75c55208585181c6cef64a26b56d6a1b27ef47b69162b2538724575c2dff045ec54a9d321fe662735871b825c5aa3c", + "0x82de0e98b08925f379d1b2c40e30195f610841409ab3724ad3f2d173513e1d884c8b27aff402cd0353f79e61c7b4addb", + "0xafb72b4c111da98379f195da4e5c18462acc7ece85cd66894fbaf69ddab3d3bb0b6957ea0042b7705937919189e6a531", + "0xb58160d3dc5419cfa1f22e54e5135d4f24f9c66565da543a3845f7959660fa1d15c815b9c8ae1160dd32821a035640c0", + "0x89bdc5f82877823776a841cd8e93877c0e5e0b55adcebaafaf304d6460ab22d32bcd7e46e942ec4d8832eaa735b08923", + "0xb4aa2583a999066ec6caa72a3fc19e80d8936f6856d447dd043aa9b126aa63bcaac876266d80913071777984d8d30563", + "0xa762624bc58176cdfa2d8f83629b897bb26a2fad86feb50f1b41603db2db787b42429e3c045d7df8f7ea55c0582c9069", + "0xb8357a39c42f80953e8bc9908cb6b79c1a5c50ed3bbc0e330577a215ac850e601909fa5b53bed90c744e0355863eaa6e", + "0x9847ef9b7f43678bb536a27ab3aecee8cc3eedfe834e1214eaaeb00dc07bc20fd69af3319c043e62a29effd5ffb37e16", + "0xa7d10210c48f84d67a8af3f894062397b22cb48fa3f0936c039400638908f5e976d9783295aad8af9ac602f6bf3b10a7", + "0xa8e1bc8a6493fc7ed293f44c99b28d31561c4818984891e5817c92d270c9408241ceaca44ab079409d13cc0df9e2e187", + "0x98a3e7179e2ad305857bf326d2c4b3924af478b704a944a416f4bc40be691fa53793ae77dcfa409adaee4bced903dfb1", + "0x826a146c3580b547594469b248195c9003205f48d778e8344caff117b210b24351892c5b0ace399a3a66edebc24c180f", + "0x95cc6e3d4e3ec850b01b866ccec0e8093a72311bcc4c149377af66586471ca442d5f61ecbb8878352f0193ddea928805", + "0x925ef08813aa7d99fbb6cc9d045921a43bcf8c9721c437478afd3d81e662df84497da96ddbf663996503b433fd46af28", + "0x8b737f47d5b2794819b5dc01236895e684f1406f8b9f0d9aa06b5fb36dba6c185efec755b77d9424d09b848468127559", + "0x8988349654c5fdf666ec4647d398199cc609bb8b3d5108b9e5678b8d0c7563438f3fbcf9d30ab3ef5df22aad9dc673b2", + "0xaa44163d9f9776392ce5f29f1ecbcc177f8a91f28927f5890c672433b4a3c9b2a34830842d9396dc561348501e885afb", + "0x8fe55d12257709ae842f8594f9a0a40de3d38dabdf82b21a60baac927e52ed00c5fd42f4c905410eacdaf8f8a9952490", + "0xaed3e9f4bb4553952b687ba7bcac3a5324f0cceecc83458dcb45d73073fb20cef4f9f0c64558a527ec26bad9a42e6c4c", + "0x86d386aaf3dff5b9331ace79f6e24cff8759e7e002bbe9af91c6de91ab693f6477551e7ee0a1e675d0fc614814d8a8aa", + "0x8856c31a50097c2cc0c9a09f89e09912c83b9c7838b2c33d645e95d0f35130569a347abc4b03f0cb12a89397b899d078", + "0xa65a82f7b291d33e28dd59d614657ac5871c3c60d1fb89c41dd873e41c30e0a7bc8d57b91fe50a4c96490ebf5769cb6b", + "0x98536b398e5b7f1276f7cb426fba0ec2b8b0b64fba7785ea528bebed6ae56c0dee59f5d295fa4c97a1c621ecacfc4ec3", + "0x8d9e19b3f4c7c233a6112e5397309f9812a4f61f754f11dd3dcb8b07d55a7b1dfea65f19a1488a14fef9a41495083582", + "0xa52cd15bb5cb9bdd7cef27b3644356318d0fa9331f9388edc12b204e2eb56face5604e4c3bb9631ef5bd438ff7821523", + "0x955bcc6bca53e7a6afa0e83c8443364e0e121f416d6024a442253d1e9d805407f2c7f7d9944770db370935e8722e5f51", + "0x95c38f73d6e65f67752ae3f382e8167d7d0d18ced0ca85a1d6b9ba5196f89cf9aed314a7d80b911806d5310584adc1b8", + "0x8e34d569ec169d15c9a0de70c15bf1a798ce9c36b30cca911ef17d6c183de72614575629475b57147f1c37602f25d76c", + "0xb0ea38f0b465ae0f0b019494aecd8a82cb7c496ecfab60af96d0bda1a52c29efd4d4e5b270f3d565eb3485b2aaf3d87c", + "0x90bc674d83e1b863fec40140a2827c942e575bd96bc5e60339c51089bab5fd445ae0c99ab9f1b5074b54682ac9c4a275", + "0x9417af4462cc8d542f6f6c479866f1c9fa4768069ef145f9acdd50221b8956b891ceec3ef4ec77c54006b00e38156cee", + "0xa0d79afac7df720f660881e20f49246f64543e1655a0ab9945030e14854b1dd988df308ed374fc6130586426c6cf16a4", + "0x899729f080571e25fee93538eb21304a10600d5ceb9807959d78c3967d9ba32b570d4f4105626e5972ccf2e24b723604", + "0xada7d351b72dcca4e46d7198e0a6fae51935f9d3363659be3dfaa5af8b1c033d4c52478f8b2fbf86f7318142f07af3a7", + "0xa72841987e4f219d54f2b6a9eac5fe6e78704644753c3579e776a3691bc123743f8c63770ed0f72a71e9e964dbf58f43", + "0xae6f240e7a9baa3e388eb3052c11d5b6ace127b87a7766970db3795b4bf5fc1de17a8ee8528d9bef0d6aefcfb67a7761", + "0xa6e82f6da4520f85c5d27d8f329eccfa05944fd1096b20734c894966d12a9e2a9a9744529d7212d33883113a0cadb909", + "0x95fa3538b8379ff2423656ab436df1632b74311aaef49bc9a3cbd70b1b01febaf2f869b4127d0e8e6d18d7d919f1f6d8", + "0x8025cdadf2afc5906b2602574a799f4089d90f36d73f94c1cf317cfc1a207c57f232bca6057924dd34cff5bde87f1930", + "0xa1402173873adf34e52c43feacd915eb141d77bf16bc5180e1ee86762b120411fffa7cb956cf0e625364e9a2d56f01f3", + "0x91887afbd7a83b8e9efb0111419c3d0197728d56ef96656432fbc51eb7ed736bb534dad59359629cf9c586461e251229", + "0x8e6ad45832f4ba45f5fe719022e6b869f61e1516d8835586b702764c474befe88591722045da41ab95aafbf0387ecd18", + "0x8a8409bd78ea4ff8d6e3e780ec93a3b017e639bbdaa5f399926e07ce2a939c8b478699496da2599b03a8fb62328cb1da", + "0x912b440c4d3c8177a012cea1cc58115cbc6795afc389363c7769bf419b9451bcde764586cf26c15e9906ea54837d031a", + "0xa82f4819a86b89c9cbd6d164e959fe0061e6a9b705862be2952d3cf642b515bd5edae4e6338e4eeb975a9082ff205bb7", + "0x8ab3f4fbbea07b771705f27bb470481ab6c44c46afcb317500df564b1177fa6dc7a3d27506b9e2d672ac1edd888a7a65", + "0x85ddb75efa05baaa727d659b09d268b606f81029796e106b55ff8d47fdb74a7d237286dfeadde6cc26d53d56204eff65", + "0xb0e7791fb972fe014159aa33a98622da3cdc98ff707965e536d8636b5fcc5ac7a91a8c46e59a00dca575af0f18fb13dc", + "0xb20c190dd46da9fe928d277ccfa0b804b942f5a181adb37fc1219e028fb7b48d63261248c6d939d68d4d8cd2c13a4f80", + "0xa20cca122e38a06188877a9f8f0ca9889f1dd3ffb22dddf76152604c72fc91519e414c973d4616b986ff64aec8a3208b", + "0xa1555b4e598691b619c576bad04f322fc6fe5898a53865d330097460e035e9d0e9169089a276f15f8977a39f27f9aec3", + "0x97e827da16cbd1da013b125a96b24770e0cad7e5af0ccd9fb75a60d8ba426891489d44497b091e1b0383f457f1b2251c", + "0x908ee03816f68a78d1da050c8ec125d3dac2306178d4f547d9c90bd58b3985a20f6fef507dcc81f010d70262d9abab68", + "0xa572cbea904d67468808c8eb50a9450c9721db309128012543902d0ac358a62ae28f75bb8f1c7c42c39a8c5529bf0f4e", + "0x951f3707389db5012848b67ab77b63da2a73118b7df60f087fa9972d8f7fef33ed93e5f25268d4237c2987f032cd613f", + "0x8f021f52cbd6c46979619100350a397154df00cae2efe72b22ad0dd66747d7de4beecd9b194d0f7016e4df460a63a8ea", + "0xa272e9d1d50a4aea7d8f0583948090d0888be5777f2846800b8281139cd4aa9eee05f89b069857a3e77ccfaae1615f9c", + "0x8c7b0e11f9bc3f48d84013ef8e8575aeb764bc1b9bf15938d19eb191201011365c2b14d78139a0f27327cb21c1b8bf3d", + "0xab48aa2cc6f4a0bb63b5d67be54ac3aed10326dda304c5aeb9e942b40d6e7610478377680ab90e092ef1895e62786008", + "0x8515e7f61ca0470e165a44d247a23f17f24bf6e37185467bedb7981c1003ea70bbec875703f793dd8d11e56afa7f74ba", + "0x8f81b19ee2e4d4d0ff6384c63bacb785bc05c4fc22e6f553079cc4ff7e0270d458951533458a01d160b22d59a8bd9ab5", + "0xa6f68f09fc2b9df0ed7b58f213319dd050c11addaef31231853c01079fb225d0f8aa6860acd20bc1de87901f6103b95f", + "0x85ae0ef8d9ca996dbfebb49fa6ec7a1a95dff2d280b24f97c613b8e00b389e580f0f08aa5a9d5e4816a6532aaebc23bf", + "0xb88b54fe7990227c6d6baa95d668d2217626b088579ddb9773faf4e8f9386108c78ddd084a91e69e3bdb8a90456030c6", + "0xaa14e001d092db9dc99746fcfc22cd84a74adaa8fc483e6abf697bd8a93bda2ee9a075aca303f97f59615ed4e8709583", + "0x9717182463fbe215168e6762abcbb55c5c65290f2b5a2af616f8a6f50d625b46164178a11622d21913efdfa4b800648d", + "0xb2a3cedd685176071a98ab100494628c989d65e4578eec9c5919f2c0321c3fc3f573b71ef81a76501d88ed9ed6c68e13", + "0xb203b206005c6db2ecfab163e814bacb065872485d20ac2d65f982b4696617d12e30c169bf10dbe31d17bf04a7bdd3bc", + "0x8d08a52857017fd5cab3a821ccb8f5908c96cf63c5a5647209c037e2ea1c56f9650ec030b82ffdce76d37672d942e45b", + "0x84d1e4703d63ac280cd243c601def2b6cc0c72fb0a3de5e83149d3ac558c339f8b47a977b78fd6c9acf1f0033ae71a88", + "0x8e04ad5641cc0c949935785184c0b0237977e2282742bc0f81e58a7aa9bfee694027b60de0db0de0539a63d72fd57760", + "0x89ece308f9d1f0131765212deca99697b112d61f9be9a5f1f3780a51335b3ff981747a0b2ca2179b96d2c0c9024e5224", + "0xa06d4f9703440b365bdce45e08442ec380165c5051c30e9df4d25571cba350ce5ab5e07810e1d1476c097a51d7734630", + "0x950c598dc627cd58cd7d34e0dd055daf92c9bc89235c3a5d3aacf594af97f99eb0f02a6f353238386626ee67462cd9a2", + "0x8e876b110d8ad35997a0d4044ca03e8693a1532497bcbbb8cdb1cd4ce68fe685eb03209b3d2833494c0e79c1c1a8c60b", + "0x803968608f3f1447912bb635f200ed5b0bc2f3ade2736bccb05a70c83c7df55602a2723f6b9740e528456eeba51ced64", + "0x931cdb87f226ad70ec6e0ff47e8420481d080e57951443ad804411a7b78dc2f2e99cbdf2463dda39d6be2ad95c0730e1", + "0x931bea4bc76fad23ba9c339622ddc0e7d28904a71353c715363aa9e038f64e990ef6ef76fc1fc431b9c73036dd07b86c", + "0x9929f70ba8c05847beb74c26dd03b4ec04ca8895bc6d9f31d70bd4231329c2f35799d4404a64f737e918db55eec72d25", + "0x93abf6639e499a3d83e3e2369882ac8dbe3e084e7e766d166121897497eabee495728365d9d7b9d9399a14831d186ff1", + "0xb29e53ff7b1595375136703600d24237b3d62877a5e8462fad67fc33cbde5bd7fcfac10dde01f50944b9f8309ad77751", + "0x95906ec0660892c205634e21ad540cbe0b6f7729d101d5c4639b864dea09be7f42a4252c675d46dd90a2661b3a94e8ca", + "0xafdb131642e23aedfd7625d0107954a451aecc9574faeeec8534c50c6156c51d3d0bdb8174372d91c560a0b7799b4e8e", + "0x97631345700c2eddaeb839fc39837b954f83753ef9fe1d637abcfc9076fcb9090e68da08e795f97cfe5ef569911969ec", + "0x8bcfb0520b9d093bc59151b69e510089759364625589e07b8ca0b4d761ce8e3516dbdce90b74b9b8d83d9395091b18bf", + "0xb54d0e0f7d368cd60bc3f47e527e59ef5161c446320da4ed80b7af04a96461b2e372d1a1edf8fe099e40bff514a530af", + "0x8fbdab59d6171f31107ff330af9f2c1a8078bb630abe379868670c61f8fa5f05a27c78f6a1fd80cde658417ef5d6a951", + "0x9718567efc4776425b17ac2450ae0c117fdf6e9eeeabb4ede117f86bee413b31b2c07cf82e38c6ecaf14001453ce29d0", + "0xb0c9351b9604478fb83646d16008d09cedf9600f57b0adbf62dd8ad4a59af0f71b80717666eeec697488996b71a5a51e", + "0x8ce3b57b791798433fd323753489cac9bca43b98deaafaed91f4cb010730ae1e38b186ccd37a09b8aed62ce23b699c48", + "0x942d5ed35db7a30cac769b0349fec326953189b51be30b38189cd4bb4233cfe08ccc9abe5dd04bf691f60e5df533d98a", + "0xa4c90c14292dfd52d27d0e566bbfa92a2aebb0b4bcd33d246d8eeb44156c7f2fd42ba8afb8e32699724c365fc583e904", + "0xb29043a7273d0a2dbc2b747dcf6a5eccbd7ccb44b2d72e985537b117929bc3fd3a99001481327788ad040b4077c47c0d", + "0xb08d72a2c2656679f133a13661d9119ab3a586e17123c11ca17dc538d687576789d42ab7c81daa5af6506cc3bac9d089", + "0x98ff9389cf70ee9e0ae5df1474454ab5d7529cab72db2621e1b8b40b473168c59689a18838c950de286ea76dfdf9dc24", + "0x93b15273200e99dbbf91b24f87daa9079a023ccdf4debf84d2f9d0c2a1bf57d3b13591b62b1c513ec08ad20feb011875", + "0xb928f3beb93519eecf0145da903b40a4c97dca00b21f12ac0df3be9116ef2ef27b2ae6bcd4c5bc2d54ef5a70627efcb7", + "0x90239bd66450f4cc08a38402adc026444230fd893b752c7dfc4699539044a1fd39ba133cbdc330b7fc19538e224725cb", + "0x8ed36ed5fb9a1b099d84cba0686d8af9a2929a348797cd51c335cdcea1099e3d6f95126dfbc93abcfb3b56a7fc14477b", + "0x8215b57dd02553c973052c69b0fecefa813cc6f3420c9b2a1cffae5bd47e3a7a264eaec4ed77c21d1f2f01cf130423c0", + "0xa7a9bebe161505ba51f5fb812471f8fb8702a4c4ad2f23de1008985f93da644674edb2df1096920eaecb6c5b00de78cd", + "0x8fa4a674911c27c9306106ffcc797e156b27dab7a67ce7e301cfd73d979331f8edcd4d3397616dd2821b64e91b4d9247", + "0xb2277b279519ba0d28b17c7a32745d71ceb3a787e89e045fe84aaadf43a1d388336ec4c8096b17997f78d240ab067d07", + "0x8a3a08b7dae65f0e90a3bc589e13019340be199f092203c1f8d25ee9989378c5f89722430e12580f3be3e4b08ae04b1b", + "0x825abb120ae686f0e3c716b49f4086e92b0435413a137a31bcf992e4851ecdf9d74ceea3d6e063d7009ec8b8e504fb30", + "0xa8f5540a9977fd2ee7dea836ed3dafa5d0b1fc9c5d5f1689e91ec49cdef989976c51502c3764025ef8ff542ef3b170ea", + "0x87dc2da68d1641ffe8e6ca1b675767dc3303995c5e9e31564905c196e3109f11345b8877d28d116e8ae110e6a6a7c7a4", + "0x9725ff209f8243ab7aceda34f117b4c402e963cc2a3a85d890f6d6d3c0c96e0b0acbed787fe4fa7b37197c049ab307ea", + "0x99cdf3807146e68e041314ca93e1fee0991224ec2a74beb2866816fd0826ce7b6263ee31e953a86d1b72cc2215a57793", + "0xa69ec7c89252e2531c057ebeb86098e3b59ca01558afd5f6de4ec40370cb40de07856334770ecacbf23e123201266f67", + "0xb8ae7b57f57bf505dd2623a49017da70665f5b7f5ac74d45d51883aac06881467b5ef42964bd93ff0f3b904e8239e7b4", + "0x8aea7d8eb22063bcfe882e2b7efc0b3713e1a48dd8343bed523b1ab4546114be84d00f896d33c605d1f67456e8e2ed93", + "0xaf3dc44695d2a7f45dbe8b21939d5b4015ed1697131184ce19fc6bb8ff6bbc23882348b4c86278282dddf7d718e72e2b", + "0x96413b2d61a9fc6a545b40e5c2e0064c53418f491a25994f270af1b79c59d5cf21d2e8c58785a8df09e7265ac975cb28", + "0x8f207bd83dad262dd9de867748094f7141dade78704eca74a71fd9cfc9136b5278d934db83f4f3908d7a3de84d583fc9", + "0x86bdb0a034dab642e05cb3e441d67f60e0baf43fa1140e341f028a2c4b04f3f48a0cdc5ee1c7825dcdc4019b004ec073", + "0xb8f1a9edf68006f913b5377a0f37bed80efadc4d6bf9f1523e83b2311e14219c6aa0b8aaee79e47a9977e880bad37a8e", + "0xa3caedb9c2a5d8e922359ef69f9c35b8c819bcb081610343148dc3a2c50255c9caa6090f49f890ca31d853384fc80d00", + "0x851f8a0b82a6d86202a61cbc3b0f3db7d19650b914587bde4715ccd372e1e40cab95517779d840416e1679c84a6db24e", + "0xb614644e726aa24b10254dd0a639489211ec2f38a69966b5c39971069ea046b83ee17cf0e91da740e11e659c0c031215", + "0xa19dd710fbf120dbd2ce410c1abeb52c639d2c3be0ec285dc444d6edea01cee272988e051d5c9c37f06fea79b96ba57b", + "0xa2ca1572cca0b43a2652dd519063311003ca6eccab5e659fc4a39d2411608e12e28294973aae5be678da60b0c41ca5f0", + "0xb783a70a1cf9f53e7d2ddf386bea81a947e5360c5f1e0bf004fceedb2073e4dd180ef3d2d91bee7b1c5a88d1afd11c49", + "0xacb58c81ae0cae2e9d4d446b730922239923c345744eee58efaadb36e9a0925545b18a987acf0bad469035b291e37269", + "0xa9e1558a3ab00c369a1ce75b98f37fd753dbb1d5e86c4514858b1196dfd149aa7b818e084f22d1ad8d34eba29ce07788", + "0xa23cf58a430d6e52c8099ecee6756773c10183e1e3c6871eb74c7f8b933943a758872d061a961c9961f2e06b4c24f2c4", + "0x8b5b5399aefcd717d8fc97ea80b1f99d4137eb6fa67afd53762ee726876b6790f47850cf165901f1734487e4a2333b56", + "0x8e0b26637a9bc464c5a9ac490f6e673a0fb6279d7918c46a870307cf1f96109abf975d8453dc77273f9aba47c8eb68c2", + "0xb4d670b79d64e8a6b71e6be0c324ff0616ad1a49fbb287d7bf278ec5960a1192b02af89d04918d3344754fb3284b53a1", + "0x86de7221af8fd5bb4ee28dad543997cde0c5cd7fa5ec9ad2b92284e63e107154cc24bf41e25153a2a20bcae3add50542", + "0xa85ae765588126f5e860d019c0e26235f567a9c0c0b2d8ff30f3e8d436b1082596e5e7462d20f5be3764fd473e57f9cf", + "0xb422f8004e8e7c47cf4bc69c3a551b3491916e415b824c2d064204d55c465fb6839834a3f37d8a9271c75e5e2d1f3718", + "0x8a5898f52fe9b20f089d2aa31e9e0a3fe26c272ce087ffdfd3490d3f4fa1cacbec4879f5f7cd7708e241a658be5e4a2f", + "0x9294795d066f5e24d506f4b3aa7613b831399924cee51c160c92eb57aad864297d02bfda8694aafd0a24be6396eb022a", + "0xa339d48ea1916bad485abb8b6cbdcafdba851678bfe35163fa2572c84553386e6ee4345140eab46e9ddbffc59ded50d5", + "0xa325677c8eda841381e3ed9ea48689b344ed181c82937fa2651191686fd10b32885b869ce47ca09fbe8bd2dbcaa1c163", + "0x8fc502abb5d8bdd747f8faf599b0f62b1c41145d30ee3b6ff1e52f9370240758eac4fdb6d7fb45ed258a43edebf63e96", + "0x837d6c15c830728fc1de0e107ec3a88e8bbc0a9c442eb199a085e030b3bcdfb08e7155565506171fe838598b0429b9cc", + "0x8eb8b1b309a726fa5af6a6228385214a48788a1f23fe03cd46e16e200ed7d8909394d2e0b442ef71e519215765ca6625", + "0xa07d173f08193f50544b8f0d7e7826b0758a2bedfdd04dcee4537b610de9c647c6e40fdf089779f1ec7e16ca177c9c35", + "0x9780e853f8ce7eda772c6691d25e220ca1d2ab0db51a7824b700620f7ac94c06639e91c98bb6abd78128f0ec845df8ef", + "0x820c62fa9fe1ac9ba7e9b27573036e4e44e3b1c43723e9b950b7e28d7cf939923d74bec2ecd8dc2ade4bab4a3f573160", + "0x8353cad3430c0b22a8ec895547fc54ff5791382c4060f83c2314a4fcd82fb7e8e822a9e829bace6ec155db77c565bcb3", + "0xb91ab4aed4387ed938900552662885cdb648deaf73e6fca210df81c1703eb0a9cbed00cecf5ecf28337b4336830c30c8", + "0xb12332004f9ecc80d258fe5c7e6a0fba342b93890a5ea0ccda642e7b9d79f2d660be4b85d6ca744c48d07a1056bc376d", + "0x88eeb6e5e927aa49a4cd42a109705c50fa58ed3833a52a20506f56cc13428cbccb734784a648c56de15ef64b0772de71", + "0x83798f4dcc27c08dcd23315bee084a9821f39eed4c35ef45ba5079de93e7cf49633eea6d0f30b20c252c941f615f6ccb", + "0x8eb7dd3ccc06165c3862d4e32d7fd09a383e0226fa06909ddf4e693802fd5c4324407d86c32df1fdc4438853368db6ce", + "0xa98ae7e54d229bac164d3392cb4ab9deeb66108cd6871bd340cbc9170f29d4602a2c27682f9d2fa3ad8019e604b6016a", + "0x8345dd80ffef0eaec8920e39ebb7f5e9ae9c1d6179e9129b705923df7830c67f3690cbc48649d4079eadf5397339580c", + "0x8da7f6c67fb6018092a39f24db6ea661b1ead780c25c0de741db9ae0cfc023f06be36385de6a4785a47c9f92135ea37d", + "0x875a795a82ae224b00d4659eb1f6a3b024f686bfc8028b07bf92392b2311b945afc3d3ab346a1d4de2deac1b5f9c7e0d", + "0xabc2344dc831a4bc0e1ec920b5b0f774bd6465f70199b69675312c4993a3f3df50fe4f30693e32eb9c5f8e3a70e4e7c4", + "0xb8e551f550803ec5e67717c25f109673b79284e923c9b25558a65864e0d730aeaecab0ee24448226e5dd9da3070080a2", + "0xab83dfefb120fab7665a607d749ef1765fbb3cc0ba5827a20a135402c09d987c701ddb5b60f0f5495026817e8ab6ea2e", + "0x90c0c1f774e77d9fad044aa06009a15e33941477b4b9a79fa43f327608a0a54524b3fcef0a896cb0df790e9995b6ebf1", + "0xab23c89f138f4252fc3922e24b7254743af1259fa1aeae90e98315c664c50800cecfc72a4d45ee772f73c4bb22b8646f", + "0x865dfd7192acc296f26e74ae537cd8a54c28450f18d579ed752ad9e0c5dcb2862e160e52e87859d71f433a3d4f5ca393", + "0x82d333a47c24d4958e5b07be4abe85234c5ad1b685719a1f02131a612022ce0c726e58d52a53cf80b4a8afb21667dee1", + "0xb6ad11e5d15f77c1143b1697344911b9c590110fdd8dd09df2e58bfd757269169deefe8be3544d4e049fb3776fb0bcfb", + "0x8978bdb97d45647584b8b9971246421b2f93d9ac648b1ed6595ad8326f80c107344a2c85d1756cd2f56b748001d5fd30", + "0xb4e84be7005df300900c6f5f67cf288374e33c3f05c2f10b6d2ff754e92ea8577d55b91e22cea2782250a8bc7d2af46d", + "0xae5163dc807af48bc827d2fd86b7c37de5a364d0d504c2c29a1b0a243601016b21c0fda5d0a446b9cb2a333f0c08ab20", + "0xad297ab0ef5f34448ceffef73c7104791cacae92aed22df8def9034b0f111b2af4f4365259dccecb46a1208fd3354fcd", + "0x9081bebcd06b4976d992d98a499397a44da20650ad4a1e0fb15dc63db8744d60d70dff0c6e2c3bb43ee35d1940683d1b", + "0xb3b3c89c783ee18bc030384914fafb8608d54c370005c49085fe8de22df6e04828b082c2fe7b595bd884986d688345f5", + "0xa232213cdd2b3bbdf5f61e65d57e28ee988c2b48185c9ac59b7372bc05c5b5763e19086ceaefb597b8e2b21b30aaacde", + "0x8d8be92bde8af1b9df13d5a8ed8a3a01eab6ee4cf883d7987c1d78c0d7d9b53a8630541fddf5e324b6cf4900435b1df8", + "0xad84464b3966ec5bede84aa487facfca7823af383715078da03b387cc2f5d5597cdd7d025aa07db00a38b953bdeb6e3f", + "0x889586bc28e52a4510bc9e8f1e673835ff4f27732b3954b6b7cd371d10a453ba793cfdfacf4ce20ca819310e541198b5", + "0xb35220775df2432a8923a1e3e786869c78f1661ed4e16bd91b439105f549487fb84bbea0590124a1d7aa4e5b08a60143", + "0x911bb496153aa457e3302ea8e74427962c6eb57e97096f65cafe45a238f739b86d4b790debd5c7359f18f3642d7d774c", + "0x89db41a6183c2fe47cf54d1e00c3cfaae53df634a32cccd5cf0c0a73e95ee0450fc3d060bb6878780fbf5f30d9e29aac", + "0x8774d1d544c4cc583fb649d0bbba86c2d2b5abb4c0395d7d1dac08ab1a2cc795030bdbdce6e3213154d4f2c748ccdaef", + "0xa1dbd288ae846edbfba77f7342faf45bdc0c5d5ce8483877acce6d00e09ef49d30fb40d4764d6637658d5ac738e0e197", + "0xb74c0f5b4125900f20e11e4719f69bac8d9be792e6901800d93f7f49733bc42bfb047220c531373a224f5564b6e6ecbb", + "0xa73eb991aa22cdb794da6fcde55a427f0a4df5a4a70de23a988b5e5fc8c4d844f66d990273267a54dd21579b7ba6a086", + "0x80fd75ebcc0a21649e3177bcce15426da0e4f25d6828fbf4038d4d7ed3bd4421de3ef61d70f794687b12b2d571971a55", + "0x913e4eec6be4605946086d38f531d68fe6f4669777c2d066eff79b72a4616ad1538aae7b74066575669d7ce065a7f47d", + "0x97363100f195df58c141aa327440a105abe321f4ebc6aea2d5f56c1fb7732ebfa5402349f6da72a6182c6bbedaeb8567", + "0x8c8b694b04d98a749a0763c72fc020ef61b2bb3f63ebb182cb2e568f6a8b9ca3ae013ae78317599e7e7ba2a528ec754a", + "0xaf048ba47a86a6d110fc8e7723a99d69961112612f140062cca193d3fc937cf5148671a78b6caa9f43a5cf239c3db230", + "0x92e5cd122e484c8480c430738091f23f30773477d9850c3026824f1f58c75cf20365d950607e159717864c0760432edb", + "0xab03beff9e24a04f469555b1bc6af53aa8c49c27b97878ff3b4fbf5e9795072f4d2b928bff4abbbd72d9aa272d1f100e", + "0x9252a4ac3529f8b2b6e8189b95a60b8865f07f9a9b73f98d5df708511d3f68632c4c7d1e2b03e6b1d1e2c01839752ada", + "0x84614d2ae5bc594a0c639bed6b6a1dc15d608010848b475d389d43001346ed5f511da983cc5df62b6e49c32c0ef5b24c", + "0xa99987ba6c0eb0fd4fbd5020a2db501128eb9d6a9a173e74462571985403f33959fc2f526b9a424d6915a77910939fc3", + "0x87109a988e34933e29c2623b4e604d23195b0346a76f92d51c074f07ce322de8e1bef1993477777c0eb9a9e95c16785f", + "0x8e7cb413850ecb6f1d2ded9851e382d945a8fee01f8f55184c7b0817000073944c6b6c77164e0a2272c39410fde18e58", +]; +const pub_keys_bytes = pub_keys.map((pub_key) => hexToBytes(pub_key)); +const message = "0x6943c268e56be6110509bae768705152c24382ae8d15a2c5e20677efdb40b3ef"; +const signature = + "0xa45ded60fac188920c0691ded62fdde57755c9da591061fc15acf8b4b4af1eebefdcf741aab41ba99281d284917a61231251db63f479246d8e7cdaec3d316bf9c603a5d8c53b75f17ec4c30fb64e4eced018b532e635b3f214c666e425832052"; + +const bls = new web3.eth.Contract( + blsInfo.abi as AbiItem[], + "0x0000000000000000000000000000000000000800" +); +bls.options.from = FAITH; +bls.options.gas = 10_000_000; +web3.eth.accounts.wallet.add(FAITH_P); + +describe("Test Bls precompile", () => { + it("Basic bls should works", async function () { + let result = await bls.methods + .fast_aggregate_verify(pub_keys_bytes, hexToBytes(message), hexToBytes(signature)) + .call(); + expect(result).to.be.true; + }).timeout(60000); + + it("Bls gas used should not be too large", async () => { + let receipt = await bls.methods + .fast_aggregate_verify(pub_keys_bytes, hexToBytes(message), hexToBytes(signature)) + .send(); + expect(receipt.transactionHash).to.not.be.null; + expect(receipt.gasUsed).to.be.equals(8597448); + + // Reserve enough space for the pre-contract operations + expect(BLOCK_GAS_LIMIT - receipt.gasUsed).to.be.gt(10_000_000); + }).timeout(60000); + + it("One bls operation each block", async () => { + let receipt1 = await bls.methods + .fast_aggregate_verify(pub_keys_bytes, hexToBytes(message), hexToBytes(signature)) + .send(); + expect(receipt1.transactionHash).to.not.be.null; + let receipt2 = await bls.methods + .fast_aggregate_verify(pub_keys_bytes, hexToBytes(message), hexToBytes(signature)) + .send(); + expect(receipt2.transactionHash).to.not.be.null; + + expect(receipt1.blockNumber).not.equal(receipt2.blockNumber); + }).timeout(60000); +}); diff --git a/tests/tests.ts b/tests/tests.ts index dc2fcf75d..37896d958 100644 --- a/tests/tests.ts +++ b/tests/tests.ts @@ -8,3 +8,4 @@ import "./ethereum/test-block"; import "./ethereum/test-opcodes"; import "./ethereum/test-events"; import "./ethereum/test-gas"; +import "./ethereum/test-bls";