mirror of
https://github.com/serai-dex/serai.git
synced 2025-12-08 20:29:23 +00:00
Merge branch 'next' into next-polkadot-sdk
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
use ciphersuite::{group::GroupEncoding, Ciphersuite};
|
||||
use ciphersuite::{group::GroupEncoding, *};
|
||||
use dkg::{ThresholdKeys, Curves, Secp256k1};
|
||||
|
||||
use crate::{primitives::x_coord_to_even_point, scan::scanner};
|
||||
@@ -18,7 +18,7 @@ impl key_gen::KeyGenParams for KeyGenParams {
|
||||
}
|
||||
|
||||
fn encode_key(
|
||||
key: <<Self::ExternalNetworkCiphersuite as Curves>::ToweringCurve as Ciphersuite>::G,
|
||||
key: <<Self::ExternalNetworkCiphersuite as Curves>::ToweringCurve as WrappedGroup>::G,
|
||||
) -> Vec<u8> {
|
||||
let key = key.to_bytes();
|
||||
let key: &[u8] = key.as_ref();
|
||||
@@ -28,7 +28,7 @@ impl key_gen::KeyGenParams for KeyGenParams {
|
||||
|
||||
fn decode_key(
|
||||
key: &[u8],
|
||||
) -> Option<<<Self::ExternalNetworkCiphersuite as Curves>::ToweringCurve as Ciphersuite>::G> {
|
||||
) -> Option<<<Self::ExternalNetworkCiphersuite as Curves>::ToweringCurve as WrappedGroup>::G> {
|
||||
x_coord_to_even_point(key)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
use core::fmt;
|
||||
use std::collections::HashMap;
|
||||
|
||||
use ciphersuite::Ciphersuite;
|
||||
use ciphersuite::*;
|
||||
use ciphersuite_kp256::Secp256k1;
|
||||
|
||||
use bitcoin_serai::bitcoin::block::{Header, Block as BBlock};
|
||||
@@ -35,7 +35,7 @@ impl<D: Db> fmt::Debug for Block<D> {
|
||||
impl<D: Db> primitives::Block for Block<D> {
|
||||
type Header = BlockHeader;
|
||||
|
||||
type Key = <Secp256k1 as Ciphersuite>::G;
|
||||
type Key = <Secp256k1 as WrappedGroup>::G;
|
||||
type Address = Address;
|
||||
type Output = Output;
|
||||
type Eventuality = Eventuality;
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
use ciphersuite::Ciphersuite;
|
||||
use ciphersuite::*;
|
||||
use ciphersuite_kp256::Secp256k1;
|
||||
|
||||
use bitcoin_serai::bitcoin::key::{Parity, XOnlyPublicKey};
|
||||
@@ -7,7 +7,7 @@ pub(crate) mod output;
|
||||
pub(crate) mod transaction;
|
||||
pub(crate) mod block;
|
||||
|
||||
pub(crate) fn x_coord_to_even_point(key: &[u8]) -> Option<<Secp256k1 as Ciphersuite>::G> {
|
||||
pub(crate) fn x_coord_to_even_point(key: &[u8]) -> Option<<Secp256k1 as WrappedGroup>::G> {
|
||||
if key.len() != 32 {
|
||||
None?
|
||||
};
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
use std::io;
|
||||
|
||||
use ciphersuite::Ciphersuite;
|
||||
use ciphersuite::*;
|
||||
use ciphersuite_kp256::Secp256k1;
|
||||
|
||||
use bitcoin_serai::{
|
||||
@@ -58,7 +58,7 @@ pub(crate) struct Output {
|
||||
impl Output {
|
||||
pub(crate) fn new(
|
||||
getter: &impl Get,
|
||||
key: <Secp256k1 as Ciphersuite>::G,
|
||||
key: <Secp256k1 as WrappedGroup>::G,
|
||||
tx: &Transaction,
|
||||
output: WalletOutput,
|
||||
) -> Self {
|
||||
@@ -74,7 +74,7 @@ impl Output {
|
||||
}
|
||||
|
||||
pub(crate) fn new_with_presumed_origin(
|
||||
key: <Secp256k1 as Ciphersuite>::G,
|
||||
key: <Secp256k1 as WrappedGroup>::G,
|
||||
tx: &Transaction,
|
||||
presumed_origin: Option<Address>,
|
||||
output: WalletOutput,
|
||||
@@ -91,7 +91,7 @@ impl Output {
|
||||
}
|
||||
}
|
||||
|
||||
impl ReceivedOutput<<Secp256k1 as Ciphersuite>::G, Address> for Output {
|
||||
impl ReceivedOutput<<Secp256k1 as WrappedGroup>::G, Address> for Output {
|
||||
type Id = OutputId;
|
||||
type TransactionId = [u8; 32];
|
||||
|
||||
@@ -111,7 +111,7 @@ impl ReceivedOutput<<Secp256k1 as Ciphersuite>::G, Address> for Output {
|
||||
res
|
||||
}
|
||||
|
||||
fn key(&self) -> <Secp256k1 as Ciphersuite>::G {
|
||||
fn key(&self) -> <Secp256k1 as WrappedGroup>::G {
|
||||
// We read the key from the script pubkey so we don't have to independently store it
|
||||
let script = &self.output.output().script_pubkey;
|
||||
|
||||
@@ -124,7 +124,7 @@ impl ReceivedOutput<<Secp256k1 as Ciphersuite>::G, Address> for Output {
|
||||
.expect("last item in scanned v1 Taproot script wasn't a valid x-only public key");
|
||||
|
||||
// The output's key minus the output's offset is the root key
|
||||
key - (<Secp256k1 as Ciphersuite>::G::GENERATOR * self.output.offset())
|
||||
key - (<Secp256k1 as WrappedGroup>::G::GENERATOR * self.output.offset())
|
||||
}
|
||||
|
||||
fn presumed_origin(&self) -> Option<Address> {
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
use std::{sync::LazyLock, collections::HashMap};
|
||||
|
||||
use ciphersuite::Ciphersuite;
|
||||
use ciphersuite::*;
|
||||
use ciphersuite_kp256::Secp256k1;
|
||||
|
||||
use bitcoin_serai::{
|
||||
@@ -20,20 +20,20 @@ use primitives::OutputType;
|
||||
use crate::hash_bytes;
|
||||
|
||||
// TODO: Bitcoin HD derivation, instead of these bespoke labels?
|
||||
static BRANCH_BASE_OFFSET: LazyLock<<Secp256k1 as Ciphersuite>::F> =
|
||||
static BRANCH_BASE_OFFSET: LazyLock<<Secp256k1 as WrappedGroup>::F> =
|
||||
LazyLock::new(|| Secp256k1::hash_to_F(b"branch"));
|
||||
static CHANGE_BASE_OFFSET: LazyLock<<Secp256k1 as Ciphersuite>::F> =
|
||||
static CHANGE_BASE_OFFSET: LazyLock<<Secp256k1 as WrappedGroup>::F> =
|
||||
LazyLock::new(|| Secp256k1::hash_to_F(b"change"));
|
||||
static FORWARD_BASE_OFFSET: LazyLock<<Secp256k1 as Ciphersuite>::F> =
|
||||
static FORWARD_BASE_OFFSET: LazyLock<<Secp256k1 as WrappedGroup>::F> =
|
||||
LazyLock::new(|| Secp256k1::hash_to_F(b"forward"));
|
||||
|
||||
// Unfortunately, we have per-key offsets as it's the root key plus the base offset may not be
|
||||
// even. While we could tweak the key until all derivations are even, that'd require significantly
|
||||
// more tweaking. This algorithmic complexity is preferred.
|
||||
pub(crate) fn offsets_for_key(
|
||||
key: <Secp256k1 as Ciphersuite>::G,
|
||||
) -> HashMap<OutputType, <Secp256k1 as Ciphersuite>::F> {
|
||||
let mut offsets = HashMap::from([(OutputType::External, <Secp256k1 as Ciphersuite>::F::ZERO)]);
|
||||
key: <Secp256k1 as WrappedGroup>::G,
|
||||
) -> HashMap<OutputType, <Secp256k1 as WrappedGroup>::F> {
|
||||
let mut offsets = HashMap::from([(OutputType::External, <Secp256k1 as WrappedGroup>::F::ZERO)]);
|
||||
|
||||
// We create an actual Bitcoin scanner as upon adding an offset, it yields the tweaked offset
|
||||
// actually used
|
||||
@@ -50,7 +50,7 @@ pub(crate) fn offsets_for_key(
|
||||
offsets
|
||||
}
|
||||
|
||||
pub(crate) fn scanner(key: <Secp256k1 as Ciphersuite>::G) -> Scanner {
|
||||
pub(crate) fn scanner(key: <Secp256k1 as WrappedGroup>::G) -> Scanner {
|
||||
let mut scanner = Scanner::new(key).unwrap();
|
||||
for (_, offset) in offsets_for_key(key) {
|
||||
let tweaked_offset = scanner.register_offset(offset).unwrap();
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
use core::future::Future;
|
||||
|
||||
use ciphersuite::Ciphersuite;
|
||||
use ciphersuite::*;
|
||||
use ciphersuite_kp256::Secp256k1;
|
||||
|
||||
use bitcoin_serai::{
|
||||
@@ -26,8 +26,8 @@ use crate::{
|
||||
rpc::Rpc,
|
||||
};
|
||||
|
||||
fn address_from_serai_key(key: <Secp256k1 as Ciphersuite>::G, kind: OutputType) -> Address {
|
||||
let offset = <Secp256k1 as Ciphersuite>::G::GENERATOR * offsets_for_key(key)[&kind];
|
||||
fn address_from_serai_key(key: <Secp256k1 as WrappedGroup>::G, kind: OutputType) -> Address {
|
||||
let offset = <Secp256k1 as WrappedGroup>::G::GENERATOR * offsets_for_key(key)[&kind];
|
||||
Address::new(
|
||||
p2tr_script_buf(key + offset)
|
||||
.expect("creating address from Serai key which wasn't properly tweaked"),
|
||||
@@ -72,7 +72,7 @@ fn signable_transaction<D: Db>(
|
||||
*/
|
||||
payments.push((
|
||||
// The generator is even so this is valid
|
||||
p2tr_script_buf(<Secp256k1 as Ciphersuite>::G::GENERATOR).unwrap(),
|
||||
p2tr_script_buf(<Secp256k1 as WrappedGroup>::G::GENERATOR).unwrap(),
|
||||
// This uses the minimum output value allowed, as defined as a constant in bitcoin-serai
|
||||
// TODO: Add a test for this comparing to bitcoin's `minimal_non_dust`
|
||||
bitcoin_serai::wallet::DUST,
|
||||
|
||||
Reference in New Issue
Block a user