Skip to content

Commit fb3f392

Browse files
authored
Merge pull request #178 from BitGo/BTC-3085.metadata-uint8array
refactor: change Material.metadata from string to Uint8Array
2 parents 71af785 + 4c92b2a commit fb3f392

12 files changed

Lines changed: 50 additions & 44 deletions

File tree

packages/wasm-dot/js/types.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,8 @@ export interface Material {
2424
specVersion: number;
2525
/** Transaction format version */
2626
txVersion: number;
27-
/** Runtime metadata bytes (hex encoded) - required for encoding calls */
28-
metadata: string;
27+
/** Runtime metadata bytes - required for encoding calls */
28+
metadata: Uint8Array;
2929
}
3030

3131
/**

packages/wasm-dot/src/address.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ pub fn decode_ss58(address: &str) -> Result<(Vec<u8>, u16), WasmDotError> {
7777
/// Validate an SS58 address
7878
pub fn validate_address(address: &str, expected_prefix: Option<u16>) -> bool {
7979
match decode_ss58(address) {
80-
Ok((_, prefix)) => expected_prefix.map_or(true, |expected| prefix == expected),
80+
Ok((_, prefix)) => expected_prefix.is_none_or(|expected| prefix == expected),
8181
Err(_) => false,
8282
}
8383
}

packages/wasm-dot/src/builder/calls.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -265,7 +265,7 @@ fn account_id(address: &str) -> Result<Value<()>, WasmDotError> {
265265
v.len()
266266
))
267267
})?;
268-
Ok(Value::from_bytes(&bytes))
268+
Ok(Value::from_bytes(bytes))
269269
}
270270

271271
#[cfg(test)]

packages/wasm-dot/src/builder/mod.rs

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -46,12 +46,9 @@ pub fn build_transaction(
4646
Ok(tx)
4747
}
4848

49-
/// Decode metadata from hex string
50-
fn decode_metadata(metadata_hex: &str) -> Result<subxt_core::metadata::Metadata, WasmDotError> {
51-
let bytes = hex::decode(metadata_hex.trim_start_matches("0x"))
52-
.map_err(|e| WasmDotError::InvalidInput(format!("Invalid metadata hex: {}", e)))?;
53-
54-
subxt_core::metadata::decode_from(&bytes[..])
49+
/// Decode metadata from raw bytes
50+
fn decode_metadata(metadata_bytes: &[u8]) -> Result<subxt_core::metadata::Metadata, WasmDotError> {
51+
subxt_core::metadata::decode_from(metadata_bytes)
5552
.map_err(|e| WasmDotError::InvalidInput(format!("Failed to decode metadata: {}", e)))
5653
}
5754

@@ -60,7 +57,7 @@ fn compute_era(validity: &Validity) -> Era {
6057
if validity.max_duration == 0 {
6158
Era::Immortal
6259
} else {
63-
let period = validity.max_duration.next_power_of_two().min(65536).max(4);
60+
let period = validity.max_duration.next_power_of_two().clamp(4, 65536);
6461
let phase = validity.first_valid % period;
6562
Era::Mortal { period, phase }
6663
}

packages/wasm-dot/src/builder/types.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -205,7 +205,7 @@ mod tests {
205205
"specName": "polkadot",
206206
"specVersion": 9150,
207207
"txVersion": 9,
208-
"metadata": "0x00"
208+
"metadata": [0]
209209
},
210210
"validity": {
211211
"firstValid": 1000,

packages/wasm-dot/src/parser.rs

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -99,12 +99,9 @@ pub fn parse_transaction(
9999
})
100100
}
101101

102-
/// Decode metadata from hex string (same pattern as builder)
103-
fn decode_metadata(metadata_hex: &str) -> Result<subxt_core::metadata::Metadata, WasmDotError> {
104-
let bytes = hex::decode(metadata_hex.trim_start_matches("0x"))
105-
.map_err(|e| WasmDotError::InvalidInput(format!("Invalid metadata hex: {}", e)))?;
106-
107-
subxt_core::metadata::decode_from(&bytes[..])
102+
/// Decode metadata from raw bytes
103+
fn decode_metadata(metadata_bytes: &[u8]) -> Result<subxt_core::metadata::Metadata, WasmDotError> {
104+
subxt_core::metadata::decode_from(metadata_bytes)
108105
.map_err(|e| WasmDotError::InvalidInput(format!("Failed to decode metadata: {}", e)))
109106
}
110107

packages/wasm-dot/src/transaction.rs

Lines changed: 15 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -399,12 +399,9 @@ impl Transaction {
399399
// Helper functions
400400
// =============================================================================
401401

402-
/// Decode metadata from hex string
403-
fn decode_metadata(metadata_hex: &str) -> Result<Metadata, WasmDotError> {
404-
let bytes = hex::decode(metadata_hex.trim_start_matches("0x"))
405-
.map_err(|e| WasmDotError::InvalidInput(format!("Invalid metadata hex: {}", e)))?;
406-
407-
subxt_core::metadata::decode_from(&bytes[..])
402+
/// Decode metadata from raw bytes
403+
fn decode_metadata(metadata_bytes: &[u8]) -> Result<Metadata, WasmDotError> {
404+
subxt_core::metadata::decode_from(metadata_bytes)
408405
.map_err(|e| WasmDotError::InvalidInput(format!("Failed to decode metadata: {}", e)))
409406
}
410407

@@ -438,22 +435,22 @@ pub(crate) fn encode_era(era: &Era) -> Vec<u8> {
438435
}
439436
}
440437

438+
/// Parsed extrinsic data: (is_signed, sender, signature, era, nonce, tip, call_data)
439+
type ParsedExtrinsic = (
440+
bool,
441+
Option<[u8; 32]>,
442+
Option<[u8; 64]>,
443+
Era,
444+
u32,
445+
u128,
446+
Vec<u8>,
447+
);
448+
441449
/// Parse a raw extrinsic
442450
fn parse_extrinsic(
443451
bytes: &[u8],
444452
metadata: Option<&Metadata>,
445-
) -> Result<
446-
(
447-
bool,
448-
Option<[u8; 32]>,
449-
Option<[u8; 64]>,
450-
Era,
451-
u32,
452-
u128,
453-
Vec<u8>,
454-
),
455-
WasmDotError,
456-
> {
453+
) -> Result<ParsedExtrinsic, WasmDotError> {
457454
use parity_scale_codec::{Compact, Decode};
458455

459456
let mut cursor = 0;

packages/wasm-dot/src/types.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,9 @@ pub struct Material {
1616
pub spec_version: u32,
1717
/// Transaction format version
1818
pub tx_version: u32,
19-
/// Runtime metadata bytes (hex encoded)
19+
/// Runtime metadata bytes
2020
/// Required for encoding calls - handles runtime upgrades automatically
21-
pub metadata: String,
21+
pub metadata: Vec<u8>,
2222
}
2323

2424
/// Validity window for mortal transactions

packages/wasm-dot/src/wasm/transaction.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -224,7 +224,7 @@ impl MaterialJs {
224224
spec_name: &str,
225225
spec_version: u32,
226226
tx_version: u32,
227-
metadata: &str,
227+
metadata: &[u8],
228228
) -> MaterialJs {
229229
MaterialJs {
230230
inner: Material {
@@ -233,7 +233,7 @@ impl MaterialJs {
233233
spec_name: spec_name.to_string(),
234234
spec_version,
235235
tx_version,
236-
metadata: metadata.to_string(),
236+
metadata: metadata.to_vec(),
237237
},
238238
}
239239
}

packages/wasm-dot/test/builder.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import * as assert from "assert";
22
import { buildTransaction, type TransactionIntent, type BuildContext } from "../js/index.js";
3-
import { westendMetadataRpc } from "./resources/westend.js";
3+
import { getWestendMetadata } from "./resources/westend.js";
44

55
/** Convert Uint8Array to hex string (no 0x prefix) */
66
function toHex(bytes: Uint8Array): string {
@@ -21,7 +21,7 @@ describe("buildTransaction", () => {
2121
specName: "westend",
2222
specVersion: 9420,
2323
txVersion: 16,
24-
metadata: westendMetadataRpc,
24+
metadata: getWestendMetadata(),
2525
};
2626

2727
// Reference block (use genesis for testing)

0 commit comments

Comments
 (0)