{"payload":{"feedbackUrl":"https://github.com/orgs/community/discussions/53140","repo":{"id":515042357,"defaultBranch":"main","name":"zk-nullifier-sig","ownerLogin":"plume-sig","currentUserCanPush":false,"isFork":false,"isEmpty":false,"createdAt":"2022-07-18T05:09:05.000Z","ownerAvatar":"https://avatars.githubusercontent.com/u/109940546?v=4","public":true,"private":false,"isOrgOwned":true},"refInfo":{"name":"","listCacheKey":"v0:1723292683.0","currentOid":""},"activityList":{"items":[{"before":"1b8af975e159adbaf35739094b261924479a5a99","after":null,"ref":"refs/heads/release3","pushedAt":"2024-08-10T12:24:43.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"skaunov","name":"Sergey Kaunov","path":"/skaunov","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/65976143?s=80&v=4"}},{"before":"a17da7f347cb5d58cd14f914ca313f0f7146687b","after":"c835718a4c1432c79a18511743fc66adb9efa1f9","ref":"refs/heads/main","pushedAt":"2024-08-10T12:24:22.000Z","pushType":"pr_merge","commitsCount":2,"pusher":{"login":"skaunov","name":"Sergey Kaunov","path":"/skaunov","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/65976143?s=80&v=4"},"commit":{"message":"Merge pull request #116 from plume-sig/release3\n\npromote `rc`","shortMessageHtmlLink":"Merge pull request #116 from plume-sig/release3"}},{"before":null,"after":"1b8af975e159adbaf35739094b261924479a5a99","ref":"refs/heads/release3","pushedAt":"2024-08-10T12:19:59.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"skaunov","name":"Sergey Kaunov","path":"/skaunov","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/65976143?s=80&v=4"},"commit":{"message":"promote `rc`","shortMessageHtmlLink":"promote rc"}},{"before":"dd453066347a60159c0ec213930297c90af4576e","after":"a17da7f347cb5d58cd14f914ca313f0f7146687b","ref":"refs/heads/main","pushedAt":"2024-08-03T00:49:39.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"Divide-By-0","name":"Yush G","path":"/Divide-By-0","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/4804438?s=80&v=4"},"commit":{"message":"Added noir plume link","shortMessageHtmlLink":"Added noir plume link"}},{"before":"92315e24f4f67535fe590b86eed8955dee1dc07e","after":"dd453066347a60159c0ec213930297c90af4576e","ref":"refs/heads/main","pushedAt":"2024-08-03T00:49:17.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"Divide-By-0","name":"Yush G","path":"/Divide-By-0","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/4804438?s=80&v=4"},"commit":{"message":"Added link to Noir PLUME","shortMessageHtmlLink":"Added link to Noir PLUME"}},{"before":"d91bc1a6dd0c235c287c5d8386aa82192ecf7fb9","after":null,"ref":"refs/heads/wasm_readability","pushedAt":"2024-07-17T09:43:19.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"skaunov","name":"Sergey Kaunov","path":"/skaunov","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/65976143?s=80&v=4"}},{"before":"83e3ed91f00f73635c9bc6ecdb60a6ca6d136a89","after":"92315e24f4f67535fe590b86eed8955dee1dc07e","ref":"refs/heads/main","pushedAt":"2024-07-17T09:43:15.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"skaunov","name":"Sergey Kaunov","path":"/skaunov","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/65976143?s=80&v=4"},"commit":{"message":"Wasm readability (#115)\n\nreorg code for better reading through","shortMessageHtmlLink":"Wasm readability (#115)"}},{"before":null,"after":"d91bc1a6dd0c235c287c5d8386aa82192ecf7fb9","ref":"refs/heads/wasm_readability","pushedAt":"2024-07-17T09:42:30.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"skaunov","name":"Sergey Kaunov","path":"/skaunov","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/65976143?s=80&v=4"},"commit":{"message":"fmt","shortMessageHtmlLink":"fmt"}},{"before":"4b5828fd4bfabb6cf28c70e103df20052f87f3aa","after":null,"ref":"refs/heads/wasm","pushedAt":"2024-07-17T09:29:50.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"skaunov","name":"Sergey Kaunov","path":"/skaunov","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/65976143?s=80&v=4"}},{"before":"bb24ab0ecf94ef5643d3c6a2b5b4aec9f407c390","after":"83e3ed91f00f73635c9bc6ecdb60a6ca6d136a89","ref":"refs/heads/main","pushedAt":"2024-07-17T00:15:22.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"skaunov","name":"Sergey Kaunov","path":"/skaunov","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/65976143?s=80&v=4"},"commit":{"message":"Replaces NPM package with Wasm wrapper \n\nResolves #114\r\n\r\nremoves respective GA\r\nthis one should be tested like a package I guess,\r\nideas for such tests are welcome as issues\r\n\r\nCouple of things left out of the committed code.\r\n\r\n# Subtle\r\nI was really late to understand that Subtle crypto supports the different curve `secp256r`, *and* it doesn't provide a facility to store secret values. So implementation for `web_sys::SecretKey` turned out to be just extra miles leading nowhere.\r\n```toml\r\nweb-sys = { version = \"0.3\", features = [\"CryptoKey\", \"SubtleCrypto\", \"Crypto\", \"EcKeyImportParams\"] }\r\nwasm-bindgen-futures = \"0.4\"\r\n```\r\n```rust\r\n#[wasm_bindgen]\r\nextern \"C\" {\r\n // Return type of js_sys::global()\r\n type Global;\r\n // // Web Crypto API: Crypto interface (https://www.w3.org/TR/WebCryptoAPI/)\r\n // type WebCrypto;\r\n // Getters for the WebCrypto API\r\n #[wasm_bindgen(method, getter)]\r\n fn crypto(this: &Global) -> web_sys::Crypto;\r\n}\r\n\r\n// `fn sign`\r\nif sk.type_() != \"secret\" {return Err(JsError::new(\"`sk` must be secret key\"))}\r\nif !js_sys::Object::values(&sk.algorithm().map_err(\r\n |er|\r\n JsError::new(er.as_string().expect(\"TODO check this failing\").as_str())\r\n)?).includes(&JsValue::from_str(\"P-256\"), 0) {return Err(JsError::new(\"`sk` must be from `secp256`\"))}\r\n\r\n// this was my approach, but seems I got what they did at \r\n// js_sys::global().entries().find(); // TODO throw if no Crypto in global\r\n\r\nlet global_the: Global = js_sys::global().unchecked_into();\r\nlet crypto_the: web_sys::Crypto = global_the.crypto();\r\nlet subtle_the = crypto_the.subtle();\r\nlet sk = JsFuture::from(subtle_the.export_key(\"pkcs8\", &sk)?).await?;\r\n\r\n// ...\r\n::from_pkcs8_der(js_sys::ArrayBuffer::from(sk).try_into()?)?;\r\n zeroize::Zeroizing::new(js_sys::Uint8Array::from(JsFuture::from(subtle_the.export_key(\"pkcs8\", &sk).map_err(\r\n |er|\r\n Err(JsError::new(er.as_string().expect(\"TODO check this failing\").as_str()))\r\n )?).await?).to_vec());\r\n\r\n// ...\r\n\r\n// `fn try_into`\r\n\r\n// ...\r\n\r\n// zeroization protection ommitted here due to deprecation // \r\n// mostly boilerplate from signing; also some excessive ops left for the same reason\r\n// TODO align error-handling in this part\r\nif self.c.type_() != \"secret\" {return Err(JsError::new(\"`c` must be secret key\"))}\r\nif !js_sys::Object::values(&self.c.algorithm()?).includes(js_sys::JsString::from(\"P-256\").into(), 0) {return Err(JsError::new(\"`c` must be from `secp256`\"))}\r\nthis was my approach, but seems I got what they did at \r\njs_sys::global().entries().find(); // TODO throw if no Crypto in global\r\nlet global_the: Global = js_sys::global().unchecked_into();\r\nlet crypto_the: web_sys::Crypto = global_the.crypto();\r\nlet subtle_the = crypto_the.subtle();\r\nlet c_pkcs = //zeroize::Zeroizing::new(\r\n js_sys::Uint8Array::from(JsFuture::from(subtle_the.export_key(\"pkcs8\", &self.c)?).await?).to_vec();\r\n// );\r\nlet c_scalar = &plume_rustcrypto::SecretKey::from_pkcs8_der(&c_pkcs)?.to_nonzero_scalar();\r\nsk_z.zeroize();\r\n\r\n// ...\r\n```\r\n\r\n# randomness\r\nSomehow I thought Wasm doesn't have access to RNG, so I used a seedable one and required the seed. Here's how `sign` `fn` was different.\r\n```rust\r\n// Wasm environment doesn't have a suitable way to get randomness for the signing process, so this instantiates ChaCha20 RNG with the provided seed.\r\n// @throws a \"crypto error\" in case of a problem with the secret key, and a verbal error on a problem with `seed`\r\n// @param {Uint8Array} seed - must be exactly 32 bytes.\r\npub fn sign(seed: &mut [u8], v1: bool, sk: &mut [u8], msg: &[u8]) -> Result {\r\n // ...\r\n\r\n let seed_z: zeroize::Zeroizing<[u8; 32]> = zeroize::Zeroizing::new(seed.try_into()?);\r\n seed.zeroize();\r\n\r\n // TODO switch to `wasi-random` when that will be ready for crypto\r\n let sig = match v1 {\r\n true => plume_rustcrypto::PlumeSignature::sign_v1(\r\n &sk_z, msg, &mut rand_chacha::ChaCha20Rng::from_seed(seed_z)\r\n ),\r\n false => plume_rustcrypto::PlumeSignature::sign_v2(\r\n &sk_z, msg, &mut rand_chacha::ChaCha20Rng::from_seed(seed_z)\r\n ),\r\n };\r\n\r\n let sig = signer.sign_with_rng(\r\n &mut rand_chacha::ChaCha20Rng::from_seed(*seed_z), msg\r\n );\r\n\r\n // ...\r\n}\r\n```\r\n\r\n# `BigInt` conversion\r\nIt was appealing to leave `s` as `BigInt` (see the comments), but that seems to be confusing and hinder downstream code reusage. There's an util function left for anybody who would want to have it as `BigInt`, but leaving the contraty function makes less sense and also makes the thing larger. So let me left it here for reference.\r\n```rust\r\nlet scalar_from_bigint =\r\n |n: js_sys::BigInt| -> Result {\r\n let result = plume_rustcrypto::NonZeroScalar::from_repr(k256::FieldBytes::from_slice(\r\n hex::decode({\r\n let hexstring_freelen = n.to_string(16).map_err(\r\n |er|\r\n anyhow::Error::msg(er.as_string().expect(\"`RangeError` can be printed out\"))\r\n )?.as_string().expect(\"on `JsString` this always produce a `String`\");\r\n let l = hexstring_freelen.len();\r\n if l > 32*2 {return Err(anyhow::Error::msg(\"too many digits\"))}\r\n else {[\"0\".repeat(64-l), hexstring_freelen].concat()}\r\n })?.as_slice()\r\n ).to_owned());\r\n if result.is_none().into() {Err(anyhow::Error::msg(\"isn't valid `secp256` non-zero scalar\"))}\r\n else {Ok(result.expect(EXPECT_NONEALREADYCHECKED))}\r\n };\r\n```","shortMessageHtmlLink":"Replaces NPM package with Wasm wrapper"}},{"before":"c261a1ea4b05377c49f2fec7feb943342a79dbed","after":"4b5828fd4bfabb6cf28c70e103df20052f87f3aa","ref":"refs/heads/wasm","pushedAt":"2024-07-17T00:09:43.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"skaunov","name":"Sergey Kaunov","path":"/skaunov","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/65976143?s=80&v=4"},"commit":{"message":"conventional quotations","shortMessageHtmlLink":"conventional quotations"}},{"before":"6b18e3d069ee8e7dd55b3319d015dd67fbfaffa9","after":"c261a1ea4b05377c49f2fec7feb943342a79dbed","ref":"refs/heads/wasm","pushedAt":"2024-07-09T20:55:13.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"skaunov","name":"Sergey Kaunov","path":"/skaunov","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/65976143?s=80&v=4"},"commit":{"message":"seems people think that `rc` are 1-based","shortMessageHtmlLink":"seems people think that rc are 1-based"}},{"before":"533bf8423307e11d79544e1ca06070d1981d3cf7","after":"6b18e3d069ee8e7dd55b3319d015dd67fbfaffa9","ref":"refs/heads/wasm","pushedAt":"2024-07-09T20:54:08.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"skaunov","name":"Sergey Kaunov","path":"/skaunov","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/65976143?s=80&v=4"},"commit":{"message":"remove GA\n\nthis one should be tested like a package I guess,\nideas for such tests are welcome as issues","shortMessageHtmlLink":"remove GA"}},{"before":"e011081e707ef01fbf8729cb9870f9ba522c73f5","after":"533bf8423307e11d79544e1ca06070d1981d3cf7","ref":"refs/heads/wasm","pushedAt":"2024-07-08T20:54:44.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"skaunov","name":"Sergey Kaunov","path":"/skaunov","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/65976143?s=80&v=4"},"commit":{"message":"feels like the thing is finished\n\nwill give it a look like tomorrow\nI should check that `rc` makes it opt-in and publish to NPM","shortMessageHtmlLink":"feels like the thing is finished"}},{"before":"bd88b58d44a87f89f71291a42a2140b216f5a96a","after":"e011081e707ef01fbf8729cb9870f9ba522c73f5","ref":"refs/heads/wasm","pushedAt":"2024-07-07T12:32:07.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"skaunov","name":"Sergey Kaunov","path":"/skaunov","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/65976143?s=80&v=4"},"commit":{"message":"Logic finished\n\n# Subtle\nI was really late to understand that Subtle crypto supports the different curve `secp256r`, *and* it doesn't provide a facility to store secret values. So implementation for `web_sys::SecretKey` turned out to be just extra miles leading nowhere.\n```toml\nweb-sys = { version = \"0.3\", features = [\"CryptoKey\", \"SubtleCrypto\", \"Crypto\", \"EcKeyImportParams\"] }\nwasm-bindgen-futures = \"0.4\"\n```\n```rust\n#[wasm_bindgen]\nextern \"C\" {\n // Return type of js_sys::global()\n type Global;\n // // Web Crypto API: Crypto interface (https://www.w3.org/TR/WebCryptoAPI/)\n // type WebCrypto;\n // Getters for the WebCrypto API\n #[wasm_bindgen(method, getter)]\n fn crypto(this: &Global) -> web_sys::Crypto;\n}\n\n// `fn sign`\nif sk.type_() != \"secret\" {return Err(JsError::new(\"`sk` must be secret key\"))}\nif !js_sys::Object::values(&sk.algorithm().map_err(\n |er|\n JsError::new(er.as_string().expect(\"TODO check this failing\").as_str())\n)?).includes(&JsValue::from_str(\"P-256\"), 0) {return Err(JsError::new(\"`sk` must be from `secp256`\"))}\n\n// this was my approach, but seems I got what they did at \n// js_sys::global().entries().find(); // TODO throw if no Crypto in global\n\nlet global_the: Global = js_sys::global().unchecked_into();\nlet crypto_the: web_sys::Crypto = global_the.crypto();\nlet subtle_the = crypto_the.subtle();\nlet sk = JsFuture::from(subtle_the.export_key(\"pkcs8\", &sk)?).await?;\n\n// ...\n::from_pkcs8_der(js_sys::ArrayBuffer::from(sk).try_into()?)?;\n zeroize::Zeroizing::new(js_sys::Uint8Array::from(JsFuture::from(subtle_the.export_key(\"pkcs8\", &sk).map_err(\n |er|\n Err(JsError::new(er.as_string().expect(\"TODO check this failing\").as_str()))\n )?).await?).to_vec());\n\n// ...\n\n// `fn try_into`\n\n// ...\n\n// zeroization protection ommitted here due to deprecation // \n// mostly boilerplate from signing; also some excessive ops left for the same reason\n// TODO align error-handling in this part\nif self.c.type_() != \"secret\" {return Err(JsError::new(\"`c` must be secret key\"))}\nif !js_sys::Object::values(&self.c.algorithm()?).includes(js_sys::JsString::from(\"P-256\").into(), 0) {return Err(JsError::new(\"`c` must be from `secp256`\"))}\nthis was my approach, but seems I got what they did at \njs_sys::global().entries().find(); // TODO throw if no Crypto in global\nlet global_the: Global = js_sys::global().unchecked_into();\nlet crypto_the: web_sys::Crypto = global_the.crypto();\nlet subtle_the = crypto_the.subtle();\nlet c_pkcs = //zeroize::Zeroizing::new(\n js_sys::Uint8Array::from(JsFuture::from(subtle_the.export_key(\"pkcs8\", &self.c)?).await?).to_vec();\n// );\nlet c_scalar = &plume_rustcrypto::SecretKey::from_pkcs8_der(&c_pkcs)?.to_nonzero_scalar();\nsk_z.zeroize();\n\n// ...\n```\n\n# randomness\nSomehow I thought Wasm doesn't have access to RNG, so I used a seedable one and required the seed. Here's how `sign` `fn` was different.\n```rust\n// Wasm environment doesn't have a suitable way to get randomness for the signing process, so this instantiates ChaCha20 RNG with the provided seed.\n// @throws a \"crypto error\" in case of a problem with the secret key, and a verbal error on a problem with `seed`\n// @param {Uint8Array} seed - must be exactly 32 bytes.\npub fn sign(seed: &mut [u8], v1: bool, sk: &mut [u8], msg: &[u8]) -> Result {\n // ...\n\n let seed_z: zeroize::Zeroizing<[u8; 32]> = zeroize::Zeroizing::new(seed.try_into()?);\n seed.zeroize();\n\n // TODO switch to `wasi-random` when that will be ready for crypto\n let sig = match v1 {\n true => plume_rustcrypto::PlumeSignature::sign_v1(\n &sk_z, msg, &mut rand_chacha::ChaCha20Rng::from_seed(seed_z)\n ),\n false => plume_rustcrypto::PlumeSignature::sign_v2(\n &sk_z, msg, &mut rand_chacha::ChaCha20Rng::from_seed(seed_z)\n ),\n };\n\n let sig = signer.sign_with_rng(\n &mut rand_chacha::ChaCha20Rng::from_seed(*seed_z), msg\n );\n\n // ...\n}\n```\n\n# `BigInt` conversion\nIt was appealing to leave `s` as `BigInt` (see the comments), but that seems to be confusing and hinder downstream code reusage. There's an util function left for anybody who would want to have it as `BigInt`, but leaving the contraty function makes less sense and also makes the thing larger. So let me left it here for reference.\n```rust\nlet scalar_from_bigint =\n |n: js_sys::BigInt| -> Result {\n let result = plume_rustcrypto::NonZeroScalar::from_repr(k256::FieldBytes::from_slice(\n hex::decode({\n let hexstring_freelen = n.to_string(16).map_err(\n |er|\n anyhow::Error::msg(er.as_string().expect(\"`RangeError` can be printed out\"))\n )?.as_string().expect(\"on `JsString` this always produce a `String`\");\n let l = hexstring_freelen.len();\n if l > 32*2 {return Err(anyhow::Error::msg(\"too many digits\"))}\n else {[\"0\".repeat(64-l), hexstring_freelen].concat()}\n })?.as_slice()\n ).to_owned());\n if result.is_none().into() {Err(anyhow::Error::msg(\"isn't valid `secp256` non-zero scalar\"))}\n else {Ok(result.expect(EXPECT_NONEALREADYCHECKED))}\n };\n```","shortMessageHtmlLink":"Logic finished"}},{"before":null,"after":"bd88b58d44a87f89f71291a42a2140b216f5a96a","ref":"refs/heads/wasm","pushedAt":"2024-07-03T02:29:02.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"skaunov","name":"Sergey Kaunov","path":"/skaunov","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/65976143?s=80&v=4"},"commit":{"message":"Smoke test passes","shortMessageHtmlLink":"Smoke test passes"}},{"before":"1b11bdd4a9e179dfcdb62d612454aae891b166aa","after":null,"ref":"refs/heads/22_resolveConflict_","pushedAt":"2024-07-03T02:20:32.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"skaunov","name":"Sergey Kaunov","path":"/skaunov","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/65976143?s=80&v=4"}},{"before":"8a8723815154c4d509d4238fc76912dc5593a1ad","after":null,"ref":"refs/heads/npmRepositoryLink","pushedAt":"2024-07-03T02:19:56.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"skaunov","name":"Sergey Kaunov","path":"/skaunov","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/65976143?s=80&v=4"}},{"before":null,"after":"2e5a8b16c68451a5a71ddc3d9c0775930fddab65","ref":"refs/heads/dst","pushedAt":"2024-04-28T16:40:37.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"skaunov","name":"Sergey Kaunov","path":"/skaunov","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/65976143?s=80&v=4"},"commit":{"message":"proposes tackling of #72 and #101","shortMessageHtmlLink":"proposes tackling of #72 and #101"}},{"before":"eb4534ba335f9df470e4b85da5df01e152b635a9","after":null,"ref":"refs/heads/94","pushedAt":"2024-04-27T13:45:21.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"skaunov","name":"Sergey Kaunov","path":"/skaunov","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/65976143?s=80&v=4"}},{"before":"7893200dc94e09c0603a3cbb582db4e902783d38","after":"bb24ab0ecf94ef5643d3c6a2b5b4aec9f407c390","ref":"refs/heads/main","pushedAt":"2024-04-27T13:45:10.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"skaunov","name":"Sergey Kaunov","path":"/skaunov","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/65976143?s=80&v=4"},"commit":{"message":"Resolve #94 (#109)\n\n* semantically finished\r\n\r\n* `fmt`\r\n\r\n* Update Cargo.toml\r\n\r\nversion bump","shortMessageHtmlLink":"Resolve #94 (#109)"}},{"before":"ce357b4cc479c3673398424595ec8c8e2ba6e6ed","after":"eb4534ba335f9df470e4b85da5df01e152b635a9","ref":"refs/heads/94","pushedAt":"2024-04-23T18:20:23.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"skaunov","name":"Sergey Kaunov","path":"/skaunov","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/65976143?s=80&v=4"},"commit":{"message":"Update Cargo.toml\n\nversion bump","shortMessageHtmlLink":"Update Cargo.toml"}},{"before":null,"after":"ce357b4cc479c3673398424595ec8c8e2ba6e6ed","ref":"refs/heads/94","pushedAt":"2024-04-22T16:20:26.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"skaunov","name":"Sergey Kaunov","path":"/skaunov","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/65976143?s=80&v=4"},"commit":{"message":"`fmt`","shortMessageHtmlLink":"fmt"}},{"before":"82c0c567ab231fb9bb16849e518d25c1f37ce1b1","after":null,"ref":"refs/heads/npmKeywords","pushedAt":"2024-04-17T18:34:26.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"skaunov","name":"Sergey Kaunov","path":"/skaunov","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/65976143?s=80&v=4"}},{"before":"1fa9c09f3b75a47e1c6b386da5ec532bae088cfd","after":"7893200dc94e09c0603a3cbb582db4e902783d38","ref":"refs/heads/main","pushedAt":"2024-04-17T18:34:21.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"skaunov","name":"Sergey Kaunov","path":"/skaunov","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/65976143?s=80&v=4"},"commit":{"message":"Copy `keywords` from the crate (#108)\n\n> ...\r\nso, I will take the tags from a create, btw\r\n>> and the npm js package has no keywords, if we can add some for indexing, that would be great","shortMessageHtmlLink":"Copy keywords from the crate (#108)"}},{"before":null,"after":"82c0c567ab231fb9bb16849e518d25c1f37ce1b1","ref":"refs/heads/npmKeywords","pushedAt":"2024-04-17T18:33:51.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"skaunov","name":"Sergey Kaunov","path":"/skaunov","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/65976143?s=80&v=4"},"commit":{"message":"Copy `keywords` from the crate\n\n> ...\nso, I will take the tags from a create, btw\n>> and the npm js package has no keywords, if we can add some for indexing, that would be great","shortMessageHtmlLink":"Copy keywords from the crate"}},{"before":"784ee8e517cac280c950e48724a1ed8f8eb8e47a","after":null,"ref":"refs/heads/86","pushedAt":"2024-04-09T16:25:00.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"skaunov","name":"Sergey Kaunov","path":"/skaunov","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/65976143?s=80&v=4"}},{"before":"d0ceebc44dd47de208892439557e36b2fdb1f252","after":"1fa9c09f3b75a47e1c6b386da5ec532bae088cfd","ref":"refs/heads/main","pushedAt":"2024-04-09T16:24:56.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"skaunov","name":"Sergey Kaunov","path":"/skaunov","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/65976143?s=80&v=4"},"commit":{"message":"Resolve #86 (#104)\n\n`_arkworks` checked, `_rustcrypto` updated","shortMessageHtmlLink":"Resolve #86 (#104)"}},{"before":"9b5f4a14614d22266df15878e1111e237dbf64f0","after":null,"ref":"refs/heads/readme","pushedAt":"2024-03-10T13:43:41.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"skaunov","name":"Sergey Kaunov","path":"/skaunov","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/65976143?s=80&v=4"}},{"before":"83dc5ff82b8d79281c245e9ff84651ec491dace3","after":"d0ceebc44dd47de208892439557e36b2fdb1f252","ref":"refs/heads/main","pushedAt":"2024-03-10T13:43:38.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"skaunov","name":"Sergey Kaunov","path":"/skaunov","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/65976143?s=80&v=4"},"commit":{"message":"Readme (#107)\n\n* usage example correction\r\n\r\n* version bump for publishing","shortMessageHtmlLink":"Readme (#107)"}}],"hasNextPage":true,"hasPreviousPage":false,"activityType":"all","actor":null,"timePeriod":"all","sort":"DESC","perPage":30,"cursor":"Y3Vyc29yOnYyOpK7MjAyNC0wOC0xMFQxMjoyNDo0My4wMDAwMDBazwAAAASW8N63","startCursor":"Y3Vyc29yOnYyOpK7MjAyNC0wOC0xMFQxMjoyNDo0My4wMDAwMDBazwAAAASW8N63","endCursor":"Y3Vyc29yOnYyOpK7MjAyNC0wMy0xMFQxMzo0MzozOC4wMDAwMDBazwAAAAQRe9rD"}},"title":"Activity ยท plume-sig/zk-nullifier-sig"}