Skip to content

Commit d10c45c

Browse files
committed
Updates
1 parent 8bf4e3e commit d10c45c

File tree

5 files changed

+78
-18
lines changed

5 files changed

+78
-18
lines changed

napi/__test__/index.spec.ts

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -270,5 +270,14 @@ test("mint and spend nft", (t) => {
270270

271271
simulator.spend(coinSpends, [p2.secretKey]);
272272

273-
t.pass();
273+
t.true(
274+
compareBytes(
275+
clvm
276+
.nftMetadata(
277+
clvm.parseNftMetadata(clvm.deserialize(result.nfts[0].info.metadata))
278+
)
279+
.serialize(),
280+
result.nfts[0].info.metadata
281+
)
282+
);
274283
});

napi/index.d.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ export interface Output {
88
cost: bigint
99
}
1010
export declare function curryTreeHash(treeHash: Uint8Array, args: Array<Uint8Array>): Uint8Array
11+
export declare function intToSignedBytes(bigInt: bigint): Uint8Array
12+
export declare function signedBytesToInt(bytes: Uint8Array): bigint
1113
export interface Coin {
1214
parentCoinInfo: Uint8Array
1315
puzzleHash: Uint8Array
@@ -35,7 +37,7 @@ export interface Nft {
3537
}
3638
export interface NftInfo {
3739
launcherId: Uint8Array
38-
metadata: NftMetadata
40+
metadata: Uint8Array
3941
metadataUpdaterPuzzleHash: Uint8Array
4042
currentOwner?: Uint8Array
4143
royaltyPuzzleHash: Uint8Array
@@ -92,6 +94,8 @@ export declare class ClvmAllocator {
9294
curry(program: Program, args: Array<Program>): Program
9395
pair(first: ClvmValue, rest: ClvmValue): Program
9496
alloc(value: ClvmValue): Program
97+
nftMetadata(value: NftMetadata): Program
98+
parseNftMetadata(value: Program): NftMetadata
9599
delegatedSpendForConditions(conditions: Array<Program>): Spend
96100
spendP2Standard(syntheticKey: Uint8Array, delegatedSpend: Spend): Spend
97101
spendP2DelegatedSingleton(launcherId: Uint8Array, coinId: Uint8Array, singletonInnerPuzzleHash: Uint8Array, delegatedSpend: Spend): Spend

napi/index.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -310,10 +310,12 @@ if (!nativeBinding) {
310310
throw new Error(`Failed to load native binding`)
311311
}
312312

313-
const { ClvmAllocator, curryTreeHash, toCoinId, Program, Simulator, compareBytes, sha256, fromHexRaw, fromHex, toHex } = nativeBinding
313+
const { ClvmAllocator, curryTreeHash, intToSignedBytes, signedBytesToInt, toCoinId, Program, Simulator, compareBytes, sha256, fromHexRaw, fromHex, toHex } = nativeBinding
314314

315315
module.exports.ClvmAllocator = ClvmAllocator
316316
module.exports.curryTreeHash = curryTreeHash
317+
module.exports.intToSignedBytes = intToSignedBytes
318+
module.exports.signedBytesToInt = signedBytesToInt
317319
module.exports.toCoinId = toCoinId
318320
module.exports.Program = Program
319321
module.exports.Simulator = Simulator

napi/src/clvm.rs

Lines changed: 54 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
use chia::{
22
bls::PublicKey,
3-
clvm_traits::{clvm_quote, ClvmEncoder, ToClvm},
3+
clvm_traits::{clvm_quote, ClvmEncoder, FromClvm, ToClvm},
44
clvm_utils::{self, CurriedProgram, TreeHash},
5-
protocol::Bytes32,
5+
protocol::{self, Bytes32},
66
puzzles::nft::{self, NFT_METADATA_UPDATER_PUZZLE_HASH},
77
};
88
use chia_wallet_sdk::{
@@ -13,8 +13,8 @@ use chia_wallet_sdk::{
1313
AssertHeightAbsolute, AssertHeightRelative, AssertMyAmount, AssertMyBirthHeight,
1414
AssertMyBirthSeconds, AssertMyCoinId, AssertMyParentId, AssertMyPuzzleHash,
1515
AssertPuzzleAnnouncement, AssertSecondsAbsolute, AssertSecondsRelative, CreateCoin,
16-
CreateCoinAnnouncement, CreatePuzzleAnnouncement, ReceiveMessage, Remark, ReserveFee,
17-
SendMessage, Softfork, SpendContext,
16+
CreateCoinAnnouncement, CreatePuzzleAnnouncement, HashedPtr, ReceiveMessage, Remark,
17+
ReserveFee, SendMessage, Softfork, SpendContext,
1818
};
1919
use clvmr::{
2020
run_program,
@@ -26,7 +26,7 @@ use napi::bindgen_prelude::*;
2626
use crate::{
2727
clvm_value::{Allocate, ClvmValue},
2828
traits::{FromJs, IntoJs, IntoRust},
29-
Coin, CoinSpend, MintedNfts, Nft, NftMint, ParsedNft, Program, Spend,
29+
Coin, CoinSpend, MintedNfts, Nft, NftMetadata, NftMint, ParsedNft, Program, Spend,
3030
};
3131

3232
type Clvm = Reference<ClvmAllocator>;
@@ -144,6 +144,25 @@ impl ClvmAllocator {
144144
Ok(Program::new(this, ptr))
145145
}
146146

147+
#[napi(ts_args_type = "value: NftMetadata")]
148+
pub fn nft_metadata(&mut self, this: This<Clvm>, value: NftMetadata) -> Result<Program> {
149+
let metadata = nft::NftMetadata::from_js(value)?;
150+
151+
let ptr = metadata
152+
.to_clvm(&mut self.0.allocator)
153+
.map_err(|error| Error::from_reason(error.to_string()))?;
154+
155+
Ok(Program::new(this, ptr))
156+
}
157+
158+
#[napi(ts_args_type = "value: Program")]
159+
pub fn parse_nft_metadata(&mut self, value: &Program) -> Result<NftMetadata> {
160+
let metadata = nft::NftMetadata::from_clvm(&self.0.allocator, value.ptr)
161+
.map_err(|error| Error::from_reason(error.to_string()))?;
162+
163+
metadata.into_js()
164+
}
165+
147166
#[napi(ts_args_type = "conditions: Array<Program>")]
148167
pub fn delegated_spend_for_conditions(
149168
&mut self,
@@ -252,7 +271,14 @@ impl ClvmAllocator {
252271
)
253272
.map_err(|error| Error::from_reason(error.to_string()))?;
254273

255-
result.nfts.push(nft.into_js()?);
274+
let serialized_metadata = self
275+
.0
276+
.serialize(&nft.info.metadata)
277+
.map_err(|error| Error::from_reason(error.to_string()))?;
278+
279+
result
280+
.nfts
281+
.push(nft.with_metadata(serialized_metadata).into_js()?);
256282

257283
for condition in conditions {
258284
let condition = condition
@@ -286,7 +312,7 @@ impl ClvmAllocator {
286312
let puzzle = sdk::Puzzle::parse(&self.0.allocator, puzzle.ptr);
287313

288314
let Some((nft_info, inner_puzzle)) =
289-
sdk::NftInfo::<nft::NftMetadata>::parse(&self.0.allocator, puzzle)
315+
sdk::NftInfo::<protocol::Program>::parse(&self.0.allocator, puzzle)
290316
.map_err(|error| Error::from_reason(error.to_string()))?
291317
else {
292318
return Ok(None);
@@ -307,7 +333,7 @@ impl ClvmAllocator {
307333
) -> Result<Option<Nft>> {
308334
let parent_puzzle = sdk::Puzzle::parse(&self.0.allocator, parent_puzzle.ptr);
309335

310-
let Some(nft) = sdk::Nft::<nft::NftMetadata>::parse_child(
336+
let Some(nft) = sdk::Nft::<HashedPtr>::parse_child(
311337
&mut self.0.allocator,
312338
parent_coin.into_rust()?,
313339
parent_puzzle,
@@ -318,13 +344,18 @@ impl ClvmAllocator {
318344
return Ok(None);
319345
};
320346

321-
Ok(Some(nft.into_js()?))
347+
let serialized_metadata = self
348+
.0
349+
.serialize(&nft.info.metadata)
350+
.map_err(|error| Error::from_reason(error.to_string()))?;
351+
352+
Ok(Some(nft.with_metadata(serialized_metadata).into_js()?))
322353
}
323354

324355
#[napi]
325356
pub fn spend_nft(&mut self, nft: Nft, inner_spend: Spend) -> Result<Vec<CoinSpend>> {
326357
let ctx = &mut self.0;
327-
let nft = sdk::Nft::<nft::NftMetadata>::from_js(nft)?;
358+
let nft = sdk::Nft::<protocol::Program>::from_js(nft)?;
328359

329360
nft.spend(
330361
ctx,
@@ -354,6 +385,19 @@ pub fn curry_tree_hash(tree_hash: Uint8Array, args: Vec<Uint8Array>) -> Result<U
354385
.into_js()
355386
}
356387

388+
#[napi]
389+
pub fn int_to_signed_bytes(big_int: BigInt) -> Result<Uint8Array> {
390+
let number: num_bigint::BigInt = big_int.into_rust()?;
391+
number.to_signed_bytes_be().into_js()
392+
}
393+
394+
#[napi]
395+
pub fn signed_bytes_to_int(bytes: Uint8Array) -> Result<BigInt> {
396+
let bytes: Vec<u8> = bytes.into_rust()?;
397+
let number = num_bigint::BigInt::from_signed_bytes_be(&bytes);
398+
number.into_js()
399+
}
400+
357401
macro_rules! conditions {
358402
( $( $condition:ident { $hint:literal $function:ident( $( $name:ident: $ty:ty $( => $remap:ty )? ),* ) }, )* ) => {
359403
$( #[napi]

napi/src/nft.rs

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
use chia::protocol;
12
use chia::puzzles::nft;
23
use chia_wallet_sdk as sdk;
34
use napi::bindgen_prelude::*;
@@ -14,7 +15,7 @@ pub struct Nft {
1415
pub info: NftInfo,
1516
}
1617

17-
impl IntoJs<Nft> for sdk::Nft<nft::NftMetadata> {
18+
impl IntoJs<Nft> for sdk::Nft<protocol::Program> {
1819
fn into_js(self) -> Result<Nft> {
1920
Ok(Nft {
2021
coin: self.coin.into_js()?,
@@ -24,7 +25,7 @@ impl IntoJs<Nft> for sdk::Nft<nft::NftMetadata> {
2425
}
2526
}
2627

27-
impl FromJs<Nft> for sdk::Nft<nft::NftMetadata> {
28+
impl FromJs<Nft> for sdk::Nft<protocol::Program> {
2829
fn from_js(nft: Nft) -> Result<Self> {
2930
Ok(sdk::Nft {
3031
coin: nft.coin.into_rust()?,
@@ -37,15 +38,15 @@ impl FromJs<Nft> for sdk::Nft<nft::NftMetadata> {
3738
#[napi(object)]
3839
pub struct NftInfo {
3940
pub launcher_id: Uint8Array,
40-
pub metadata: NftMetadata,
41+
pub metadata: Uint8Array,
4142
pub metadata_updater_puzzle_hash: Uint8Array,
4243
pub current_owner: Option<Uint8Array>,
4344
pub royalty_puzzle_hash: Uint8Array,
4445
pub royalty_ten_thousandths: u16,
4546
pub p2_puzzle_hash: Uint8Array,
4647
}
4748

48-
impl IntoJs<NftInfo> for sdk::NftInfo<nft::NftMetadata> {
49+
impl IntoJs<NftInfo> for sdk::NftInfo<protocol::Program> {
4950
fn into_js(self) -> Result<NftInfo> {
5051
Ok(NftInfo {
5152
launcher_id: self.launcher_id.into_js()?,
@@ -59,7 +60,7 @@ impl IntoJs<NftInfo> for sdk::NftInfo<nft::NftMetadata> {
5960
}
6061
}
6162

62-
impl FromJs<NftInfo> for sdk::NftInfo<nft::NftMetadata> {
63+
impl FromJs<NftInfo> for sdk::NftInfo<protocol::Program> {
6364
fn from_js(info: NftInfo) -> Result<Self> {
6465
Ok(sdk::NftInfo {
6566
launcher_id: info.launcher_id.into_rust()?,

0 commit comments

Comments
 (0)