Repository: CosmWasm/cw-multi-test
Pull request #239 (2025-01-29 12:45:43)

Added `bls_*` to `Api` implementors


Patch:
diff --git a/Cargo.lock b/Cargo.lock
index a2da5b3..c769016 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -334,9 +334,9 @@ dependencies = [
 
 [[package]]
 name = "cpufeatures"
-version = "0.2.16"
+version = "0.2.17"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "16b80225097f2e5ae4e7179dd2266824648f3e2f49d9134d584b76389d31c4c3"
+checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280"
 dependencies = [
  "libc",
 ]
@@ -420,6 +420,7 @@ name = "cw-multi-test"
 version = "2.3.1"
 dependencies = [
  "anyhow",
+ "base64",
  "bech32",
  "cosmwasm-schema",
  "cosmwasm-std",
@@ -432,6 +433,7 @@ dependencies = [
  "prost",
  "schemars",
  "serde",
+ "serde_json",
  "sha2",
  "thiserror 2.0.11",
 ]
@@ -960,9 +962,9 @@ dependencies = [
 
 [[package]]
 name = "ryu"
-version = "1.0.18"
+version = "1.0.19"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f"
+checksum = "6ea1a2d0a644769cc99faa24c3ad26b379b786fe7c36fd3c546254801650e6dd"
 
 [[package]]
 name = "schemars"
@@ -1049,9 +1051,9 @@ dependencies = [
 
 [[package]]
 name = "serde_json"
-version = "1.0.137"
+version = "1.0.138"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "930cfb6e6abf99298aaad7d29abbef7a9999a9a8806a40088f55f0dcec03146b"
+checksum = "d434192e7da787e94a6ea7e9670b26a036d0ca41e0b7efb2676dd32bae872949"
 dependencies = [
  "itoa",
  "memchr",
@@ -1162,9 +1164,9 @@ checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825"
 
 [[package]]
 name = "unicode-ident"
-version = "1.0.15"
+version = "1.0.16"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "11cd88e12b17c6494200a9c1b683a04fcac9573ed74cd1b62aeb2727c5592243"
+checksum = "a210d160f08b701c8721ba1c726c11662f877ea6b7094007e1ca9a1041945034"
 
 [[package]]
 name = "unicode-xid"
diff --git a/Cargo.toml b/Cargo.toml
index d879417..4067990 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -42,6 +42,8 @@ sha2 = "0.10.8"
 thiserror = "2.0.11"
 
 [dev-dependencies]
+base64 = "0.22.1"
 hex = "0.4.3"
 hex-literal = "0.4.1"
 once_cell = "1.20.2"
+serde_json = "1.0.138"
diff --git a/src/api.rs b/src/api.rs
index c09d007..f908e66 100644
--- a/src/api.rs
+++ b/src/api.rs
@@ -2,7 +2,8 @@ use bech32::primitives::decode::CheckedHrpstring;
 use bech32::{encode, Bech32, Bech32m, Hrp};
 use cosmwasm_std::testing::MockApi;
 use cosmwasm_std::{
-    Addr, Api, CanonicalAddr, RecoverPubkeyError, StdError, StdResult, VerificationError,
+    Addr, Api, CanonicalAddr, HashFunction, RecoverPubkeyError, StdError, StdResult,
+    VerificationError,
 };
 use sha2::{Digest, Sha256};
 
@@ -67,6 +68,62 @@ impl<T: bech32::Checksum> Api for MockApiBech<T> {
             .secp256k1_recover_pubkey(message_hash, signature, recovery_param)
     }
 
+    fn bls12_381_aggregate_g1(&self, g1s: &[u8]) -> Result<[u8; 48], VerificationError> {
+        self.api.bls12_381_aggregate_g1(g1s)
+    }
+
+    fn bls12_381_aggregate_g2(&self, g2s: &[u8]) -> Result<[u8; 96], VerificationError> {
+        self.api.bls12_381_aggregate_g2(g2s)
+    }
+
+    fn bls12_381_pairing_equality(
+        &self,
+        ps: &[u8],
+        qs: &[u8],
+        r: &[u8],
+        s: &[u8],
+    ) -> Result<bool, VerificationError> {
+        self.api.bls12_381_pairing_equality(ps, qs, r, s)
+    }
+
+    fn bls12_381_hash_to_g1(
+        &self,
+        hash_function: HashFunction,
+        msg: &[u8],
+        dst: &[u8],
+    ) -> Result<[u8; 48], VerificationError> {
+        self.api.bls12_381_hash_to_g1(hash_function, msg, dst)
+    }
+
+    fn bls12_381_hash_to_g2(
+        &self,
+        hash_function: HashFunction,
+        msg: &[u8],
+        dst: &[u8],
+    ) -> Result<[u8; 96], VerificationError> {
+        self.api.bls12_381_hash_to_g2(hash_function, msg, dst)
+    }
+
+    fn secp256r1_verify(
+        &self,
+        message_hash: &[u8],
+        signature: &[u8],
+        public_key: &[u8],
+    ) -> Result<bool, VerificationError> {
+        self.api
+            .secp256r1_verify(message_hash, signature, public_key)
+    }
+
+    fn secp256r1_recover_pubkey(
+        &self,
+        message_hash: &[u8],
+        signature: &[u8],
+        recovery_param: u8,
+    ) -> Result<Vec<u8>, RecoverPubkeyError> {
+        self.api
+            .secp256r1_recover_pubkey(message_hash, signature, recovery_param)
+    }
+
     fn ed25519_verify(
         &self,
         message: &[u8],


Test patch:
diff --git a/tests/test_api/eth-block-header.json b/tests/test_api/eth-block-header.json
new file mode 100644
index 0000000..e203c3b
--- /dev/null
+++ b/tests/test_api/eth-block-header.json
@@ -0,0 +1,503 @@
+{
+  "public_keys": [
+    "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"
+  ],
+  "message": "ZOUaZJZMirvzYYwSTf3ZGcHH0QjxpkkkDHYqWWwZzZQ=",
+  "signature": "hvW2G4MSoCl6NfJAykQgoZNchj12ptXkrOYBeKlInOr0LkYMix3wkswqcZtZrOYkCH49XENcdVTzTFI22mzr6obbF/4nnoXIXPcferxUhLpBD25V354oUbNk3zFZnpoH",
+  "aggregate_pubkey": "gJo644kMo1WhhRi+FtFBB/4Gmw9hGjPq9ts2JKz06MmXrYqVBM2xphZ7oIUvQ4UU"
+}
diff --git a/tests/test_api/mod.rs b/tests/test_api/mod.rs
index d429f30..96a9a7d 100644
--- a/tests/test_api/mod.rs
+++ b/tests/test_api/mod.rs
@@ -1,45 +1,164 @@
-use cosmwasm_std::Api;
+use base64::engine::general_purpose::STANDARD as Base64;
+use base64::Engine;
+use cosmwasm_std::{Api, HashFunction, BLS12_381_G1_GENERATOR};
 use hex_literal::hex;
+use serde::Deserialize;
+use sha2::{Digest, Sha256};
 
 mod test_addr;
 mod test_bech32;
 mod test_bech32m;
 mod test_prefixed;
 
-const SECP256K1_MSG_HASH: [u8; 32] =
-    hex!("5ae8317d34d1e595e3fa7247db80c0af4320cce1116de187f8f7e2e099c0d8d0");
-const SECP256K1_SIG: [u8; 64] = hex!("207082eb2c3dfa0b454e0906051270ba4074ac93760ba9e7110cd9471475111151eb0dbbc9920e72146fb564f99d039802bf6ef2561446eb126ef364d21ee9c4");
-const SECP256K1_PUBKEY: [u8;65] = hex!("04051c1ee2190ecfb174bfe4f90763f2b4ff7517b70a2aec1876ebcfd644c4633fb03f3cfbd94b1f376e34592d9d41ccaf640bb751b00a1fadeb0c01157769eb73");
-const SECP256K1_SIG_RECOVER: [u8; 64] = hex!("45c0b7f8c09a9e1f1cea0c25785594427b6bf8f9f878a8af0b1abbb48e16d0920d8becd0c220f67c51217eecfd7184ef0732481c843857e6bc7fc095c4f6b788");
-const SECP256K1_PUBKEY_RECOVER: [u8;65] = hex!("044a071e8a6e10aada2b8cf39fa3b5fb3400b04e99ea8ae64ceea1a977dbeaf5d5f8c8fbd10b71ab14cd561f7df8eb6da50f8a8d81ba564342244d26d1d4211595");
-const ED25519_MSG: [u8; 1] = hex!("72");
-const ED25519_SIG: [u8;64] = hex!("92a009a9f0d4cab8720e820b5f642540a2b27b5416503f8fb3762223ebdb69da085ac1e43e15996e458f3613d0f11d8c387b2eaeb4302aeeb00d291612bb0c00");
-const ED25519_PUBKEY: [u8; 32] =
-    hex!("3d4017c3e843895a92b70aa74d1b7ebc9c982ccf2ec4968cc0cd55f12af4660c");
+#[rustfmt::skip]
+mod constants {
+    use super::*;
+
+    pub const SECP256K1_MSG: [u8; 128] = hex!("5c868fedb8026979ebd26f1ba07c27eedf4ff6d10443505a96ecaf21ba8c4f0937b3cd23ffdc3dd429d4cd1905fb8dbcceeff1350020e18b58d2ba70887baa3a9b783ad30d3fbf210331cdd7df8d77defa398cdacdfc2e359c7ba4cae46bb74401deb417f8b912a1aa966aeeba9c39c7dd22479ae2b30719dca2f2206c5eb4b7");
+    pub const SECP256K1_SIG: [u8; 64] = hex!("207082eb2c3dfa0b454e0906051270ba4074ac93760ba9e7110cd9471475111151eb0dbbc9920e72146fb564f99d039802bf6ef2561446eb126ef364d21ee9c4");
+    pub const SECP256K1_PUBKEY: [u8; 65] = hex!("04051c1ee2190ecfb174bfe4f90763f2b4ff7517b70a2aec1876ebcfd644c4633fb03f3cfbd94b1f376e34592d9d41ccaf640bb751b00a1fadeb0c01157769eb73");
+    pub const SECP256R1_MSG: [u8; 128] = hex!("5905238877c77421f73e43ee3da6f2d9e2ccad5fc942dcec0cbd25482935faaf416983fe165b1a045ee2bcd2e6dca3bdf46c4310a7461f9a37960ca672d3feb5473e253605fb1ddfd28065b53cb5858a8ad28175bf9bd386a5e471ea7a65c17cc934a9d791e91491eb3754d03799790fe2d308d16146d5c9b0d0debd97d79ce8");
+    pub const SECP256R1_SIG: [u8; 64] = hex!("f3ac8061b514795b8843e3d6629527ed2afd6b1f6a555a7acabb5e6f79c8c2ac8bf77819ca05a6b2786c76262bf7371cef97b218e96f175a3ccdda2acc058903");
+    pub const SECP256R1_PUBKEY: [u8; 65] = hex!("041ccbe91c075fc7f4f033bfa248db8fccd3565de94bbfb12f3c59ff46c271bf83ce4014c68811f9a21a1fdb2c0e6113e06db7ca93b7404e78dc7ccd5ca89a4ca9");
+    pub const ED25519_MSG_1: [u8; 1] = hex!("72");
+    pub const ED25519_MSG_2: [u8; 2] = hex!("af82");
+    pub const ED25519_SIG_1: [u8; 64] = hex!("92a009a9f0d4cab8720e820b5f642540a2b27b5416503f8fb3762223ebdb69da085ac1e43e15996e458f3613d0f11d8c387b2eaeb4302aeeb00d291612bb0c00");
+    pub const ED25519_SIG_2: [u8; 64] = hex!("6291d657deec24024827e69c3abe01a30ce548a284743a445e3680d7db5ac3ac18ff9b538d16f290ae67f760984dc6594a7c15e9716ed28dc027beceea1ec40a");
+    pub const ED25519_PUBKEY_1: [u8; 32] = hex!("3d4017c3e843895a92b70aa74d1b7ebc9c982ccf2ec4968cc0cd55f12af4660c");
+    pub const ED25519_PUBKEY_2: [u8; 32] = hex!("fc51cd8e6218a1a38da47ed00230f0580816ed13ba3303ac5deb911548908025");
+    pub const ETH_BLOCK_HEADER: &[u8] = include_bytes!("./eth-block-header.json");
+}
+
+use constants::*;
+
+// This test case was taken from:
+// https://github.com/CosmWasm/cosmwasm/blob/80473e14e92f63855659add0b61492f59f8b7d9c/packages/std/src/testing/mock.rs#L1385-L1407
+fn assert_bls12_381_aggregate_g1_works(api: &dyn Api) {
+    #[derive(Deserialize)]
+    struct EthHeader {
+        public_keys: Vec<String>,
+        aggregate_pubkey: String,
+    }
+    let header: EthHeader = serde_json::from_slice(ETH_BLOCK_HEADER).unwrap();
+    let expected = Base64.decode(header.aggregate_pubkey).unwrap();
+    let pub_keys: Vec<u8> = header
+        .public_keys
+        .into_iter()
+        .flat_map(|key| Base64.decode(key).unwrap())
+        .collect();
+    let actual = api.bls12_381_aggregate_g1(&pub_keys).unwrap();
+    assert_eq!(expected, actual);
+}
+
+// This test case was taken from:
+// https://github.com/CosmWasm/cosmwasm/blob/80473e14e92f63855659add0b61492f59f8b7d9c/packages/std/src/testing/mock.rs#L1409-L1426
+fn assert_bls12_381_aggregate_g2_works(api: &dyn Api) {
+    let points: Vec<u8> = [
+        hex!("b6ed936746e01f8ecf281f020953fbf1f01debd5657c4a383940b020b26507f6076334f91e2366c96e9ab279fb5158090352ea1c5b0c9274504f4f0e7053af24802e51e4568d164fe986834f41e55c8e850ce1f98458c0cfc9ab380b55285a55"),
+        hex!("b23c46be3a001c63ca711f87a005c200cc550b9429d5f4eb38d74322144f1b63926da3388979e5321012fb1a0526bcd100b5ef5fe72628ce4cd5e904aeaa3279527843fae5ca9ca675f4f51ed8f83bbf7155da9ecc9663100a885d5dc6df96d9"),
+        hex!("948a7cb99f76d616c2c564ce9bf4a519f1bea6b0a624a02276443c245854219fabb8d4ce061d255af5330b078d5380681751aa7053da2c98bae898edc218c75f07e24d8802a17cd1f6833b71e58f5eb5b94208b4d0bb3848cecb075ea21be115"),
+    ]
+        .into_iter()
+        .flatten()
+        .collect();
+    let expected = hex!("9683b3e6701f9a4b706709577963110043af78a5b41991b998475a3d3fd62abf35ce03b33908418efc95a058494a8ae504354b9f626231f6b3f3c849dfdeaf5017c4780e2aee1850ceaf4b4d9ce70971a3d2cfcd97b7e5ecf6759f8da5f76d31");
+    let actual = api.bls12_381_aggregate_g2(&points).unwrap();
+    assert_eq!(expected, actual);
+}
+
+// This test case was taken from:
+// https://github.com/CosmWasm/cosmwasm/blob/80473e14e92f63855659add0b61492f59f8b7d9c/packages/std/src/testing/mock.rs#L1428-L1451
+fn assert_bls12_381_pairing_equality_works(api: &dyn Api) {
+    let dst = b"BLS_SIG_BLS12381G2_XMD:SHA-256_SSWU_RO_POP_";
+    let ps = hex!("a491d1b0ecd9bb917989f0e74f0dea0422eac4a873e5e2644f368dffb9a6e20fd6e10c1b77654d067c0618f6e5a7f79ab301803f8b5ac4a1133581fc676dfedc60d891dd5fa99028805e5ea5b08d3491af75d0707adab3b70c6a6a580217bf81b53d21a4cfd562c469cc81514d4ce5a6b577d8403d32a394dc265dd190b47fa9f829fdd7963afdf972e5e77854051f6f");
+    let qs: Vec<u8> = [
+        hex!("0000000000000000000000000000000000000000000000000000000000000000"),
+        hex!("5656565656565656565656565656565656565656565656565656565656565656"),
+        hex!("abababababababababababababababababababababababababababababababab"),
+    ]
+    .into_iter()
+    .flat_map(|msg| {
+        api.bls12_381_hash_to_g2(HashFunction::Sha256, &msg, dst)
+            .unwrap()
+    })
+    .collect();
+    let s = hex!("9104e74b9dfd3ad502f25d6a5ef57db0ed7d9a0e00f3500586d8ce44231212542fcfaf87840539b398bf07626705cf1105d246ca1062c6c2e1a53029a0f790ed5e3cb1f52f8234dc5144c45fc847c0cd37a92d68e7c5ba7c648a8a339f171244");
+    assert!(api
+        .bls12_381_pairing_equality(&ps, &qs, &BLS12_381_G1_GENERATOR, &s)
+        .unwrap());
+}
+
+// This test case was taken from:
+// https://github.com/CosmWasm/cosmwasm/blob/80473e14e92f63855659add0b61492f59f8b7d9c/packages/std/src/testing/mock.rs#L1453-L1469
+fn assert_bls12_381_hash_to_g1_works(api: &dyn Api) {
+    let msg = b"abc";
+    let dst = b"QUUX-V01-CS02-with-BLS12381G1_XMD:SHA-256_SSWU_RO_";
+    let hashed_point = api
+        .bls12_381_hash_to_g1(HashFunction::Sha256, msg, dst)
+        .unwrap();
+    let mut serialized_expected_compressed = hex!("03567bc5ef9c690c2ab2ecdf6a96ef1c139cc0b2f284dca0a9a7943388a49a3aee664ba5379a7655d3c68900be2f6903");
+    serialized_expected_compressed[0] |= 0b1000_0000;
+    assert_eq!(hashed_point, serialized_expected_compressed);
+}
+
+// This test case was taken from:
+// https://github.com/CosmWasm/cosmwasm/blob/80473e14e92f63855659add0b61492f59f8b7d9c/packages/std/src/testing/mock.rs#L1471-L1485
+fn assert_bls12_381_hash_to_g2_works(api: &dyn Api) {
+    let msg = b"abc";
+    let dst = b"QUUX-V01-CS02-with-BLS12381G2_XMD:SHA-256_SSWU_RO_";
+    let hashed_point = api
+        .bls12_381_hash_to_g2(HashFunction::Sha256, msg, dst)
+        .unwrap();
+    let mut serialized_expected_compressed = hex!("139cddbccdc5e91b9623efd38c49f81a6f83f175e80b06fc374de9eb4b41dfe4ca3a230ed250fbe3a2acf73a41177fd802c2d18e033b960562aae3cab37a27ce00d80ccd5ba4b7fe0e7a210245129dbec7780ccc7954725f4168aff2787776e6");
+    serialized_expected_compressed[0] |= 0b1000_0000;
+    assert_eq!(hashed_point, serialized_expected_compressed);
+}
 
 fn assert_secp256k1_verify_works(api: &dyn Api) {
+    let message_hash = Sha256::digest(SECP256K1_MSG);
     assert!(api
-        .secp256k1_verify(&SECP256K1_MSG_HASH, &SECP256K1_SIG, &SECP256K1_PUBKEY)
+        .secp256k1_verify(&message_hash, &SECP256K1_SIG, &SECP256K1_PUBKEY)
         .unwrap());
 }
 
 fn assert_secp256k1_recover_pubkey_works(api: &dyn Api) {
+    let message_hash = Sha256::digest(SECP256K1_MSG);
+    assert_eq!(
+        api.secp256k1_recover_pubkey(&message_hash, &SECP256K1_SIG, 0)
+            .unwrap(),
+        SECP256K1_PUBKEY
+    );
+}
+
+fn assert_secp256r1_verify_works(api: &dyn Api) {
+    let message_hash = Sha256::digest(SECP256R1_MSG);
+    assert!(api
+        .secp256r1_verify(&message_hash, &SECP256R1_SIG, &SECP256R1_PUBKEY)
+        .unwrap());
+}
+
+fn assert_secp256r1_recover_pubkey_works(api: &dyn Api) {
+    let message_hash = Sha256::digest(SECP256R1_MSG);
     assert_eq!(
-        api.secp256k1_recover_pubkey(&SECP256K1_MSG_HASH, &SECP256K1_SIG_RECOVER, 1)
+        api.secp256r1_recover_pubkey(&message_hash, &SECP256R1_SIG, 0)
             .unwrap(),
-        SECP256K1_PUBKEY_RECOVER
+        SECP256R1_PUBKEY
     );
 }
 
 fn assert_ed25519_verify_works(api: &dyn Api) {
     assert!(api
-        .ed25519_verify(&ED25519_MSG, &ED25519_SIG, &ED25519_PUBKEY)
+        .ed25519_verify(&ED25519_MSG_1, &ED25519_SIG_1, &ED25519_PUBKEY_1)
         .unwrap());
 }
 
 fn assert_ed25519_batch_verify_works(api: &dyn Api) {
     assert!(api
-        .ed25519_batch_verify(&[&ED25519_MSG], &[&ED25519_SIG], &[&ED25519_PUBKEY])
+        .ed25519_batch_verify(
+            &[&ED25519_MSG_1, &ED25519_MSG_2],
+            &[&ED25519_SIG_1, &ED25519_SIG_2],
+            &[&ED25519_PUBKEY_1, &ED25519_PUBKEY_2]
+        )
         .unwrap());
 }
 
diff --git a/tests/test_api/test_bech32.rs b/tests/test_api/test_bech32.rs
index 35e8623..119cd43 100644
--- a/tests/test_api/test_bech32.rs
+++ b/tests/test_api/test_bech32.rs
@@ -117,6 +117,31 @@ fn address_make_prefix_too_long() {
     .addr_make("creator");
 }
 
+#[test]
+fn bls12_381_aggregate_g1_works() {
+    assert_bls12_381_aggregate_g1_works(&MockApiBech32::new("juno"));
+}
+
+#[test]
+fn bls12_381_aggregate_g2_works() {
+    assert_bls12_381_aggregate_g2_works(&MockApiBech32::new("juno"));
+}
+
+#[test]
+fn bls12_381_pairing_equality_works() {
+    assert_bls12_381_pairing_equality_works(&MockApiBech32::new("juno"));
+}
+
+#[test]
+fn bls12_381_hash_to_g1_works() {
+    assert_bls12_381_hash_to_g1_works(&MockApiBech32::new("juno"));
+}
+
+#[test]
+fn bls12_381_hash_to_g2_works() {
+    assert_bls12_381_hash_to_g2_works(&MockApiBech32::new("juno"));
+}
+
 #[test]
 fn secp256k1_verify_works() {
     assert_secp256k1_verify_works(&MockApiBech32::new("juno"));
@@ -127,6 +152,16 @@ fn secp256k1_recover_pubkey_works() {
     assert_secp256k1_recover_pubkey_works(&MockApiBech32::new("juno"));
 }
 
+#[test]
+fn secp256r1_verify_works() {
+    assert_secp256r1_verify_works(&MockApiBech32::new("juno"));
+}
+
+#[test]
+fn secp256r1_recover_pubkey_works() {
+    assert_secp256r1_recover_pubkey_works(&MockApiBech32::new("juno"));
+}
+
 #[test]
 fn ed25519_verify_works() {
     assert_ed25519_verify_works(&MockApiBech32::new("juno"));
diff --git a/tests/test_api/test_bech32m.rs b/tests/test_api/test_bech32m.rs
index 61af017..9e4a46c 100644
--- a/tests/test_api/test_bech32m.rs
+++ b/tests/test_api/test_bech32m.rs
@@ -117,6 +117,31 @@ fn address_make_prefix_too_long() {
     .addr_make("creator");
 }
 
+#[test]
+fn bls12_381_aggregate_g1_works() {
+    assert_bls12_381_aggregate_g1_works(&MockApiBech32m::new("juno"));
+}
+
+#[test]
+fn bls12_381_aggregate_g2_works() {
+    assert_bls12_381_aggregate_g2_works(&MockApiBech32m::new("juno"));
+}
+
+#[test]
+fn bls12_381_pairing_equality_works() {
+    assert_bls12_381_pairing_equality_works(&MockApiBech32m::new("juno"));
+}
+
+#[test]
+fn bls12_381_hash_to_g1_works() {
+    assert_bls12_381_hash_to_g1_works(&MockApiBech32m::new("juno"));
+}
+
+#[test]
+fn bls12_381_hash_to_g2_works() {
+    assert_bls12_381_hash_to_g2_works(&MockApiBech32m::new("juno"));
+}
+
 #[test]
 fn secp256k1_verify_works() {
     assert_secp256k1_verify_works(&MockApiBech32m::new("juno"));
@@ -127,6 +152,16 @@ fn secp256k1_recover_pubkey_works() {
     assert_secp256k1_recover_pubkey_works(&MockApiBech32m::new("juno"));
 }
 
+#[test]
+fn secp256r1_verify_works() {
+    assert_secp256r1_verify_works(&MockApiBech32m::new("juno"));
+}
+
+#[test]
+fn secp256r1_recover_pubkey_works() {
+    assert_secp256r1_recover_pubkey_works(&MockApiBech32m::new("juno"));
+}
+
 #[test]
 fn ed25519_verify_works() {
     assert_ed25519_verify_works(&MockApiBech32m::new("juno"));
diff --git a/tests/test_api/test_prefixed.rs b/tests/test_api/test_prefixed.rs
index 3890278..767b51b 100644
--- a/tests/test_api/test_prefixed.rs
+++ b/tests/test_api/test_prefixed.rs
@@ -76,6 +76,31 @@ fn address_make_prefix_too_long() {
     .addr_make("creator");
 }
 
+#[test]
+fn bls12_381_aggregate_g1_works() {
+    assert_bls12_381_aggregate_g1_works(&api_juno());
+}
+
+#[test]
+fn bls12_381_aggregate_g2_works() {
+    assert_bls12_381_aggregate_g2_works(&api_juno());
+}
+
+#[test]
+fn bls12_381_pairing_equality_works() {
+    assert_bls12_381_pairing_equality_works(&api_juno());
+}
+
+#[test]
+fn bls12_381_hash_to_g1_works() {
+    assert_bls12_381_hash_to_g1_works(&api_juno());
+}
+
+#[test]
+fn bls12_381_hash_to_g2_works() {
+    assert_bls12_381_hash_to_g2_works(&api_juno());
+}
+
 #[test]
 fn secp256k1_verify_works() {
     assert_secp256k1_verify_works(&api_juno());
@@ -86,6 +111,16 @@ fn secp256k1_recover_pubkey_works() {
     assert_secp256k1_recover_pubkey_works(&api_juno());
 }
 
+#[test]
+fn secp256r1_verify_works() {
+    assert_secp256r1_verify_works(&api_juno());
+}
+
+#[test]
+fn secp256r1_recover_pubkey_works() {
+    assert_secp256r1_recover_pubkey_works(&api_juno());
+}
+
 #[test]
 fn ed25519_verify_works() {
     assert_ed25519_verify_works(&api_juno());