1
1
use chia:: {
2
2
bls:: PublicKey ,
3
- clvm_traits:: { clvm_quote, ClvmEncoder , ToClvm } ,
3
+ clvm_traits:: { clvm_quote, ClvmEncoder , FromClvm , ToClvm } ,
4
4
clvm_utils:: { self , CurriedProgram , TreeHash } ,
5
- protocol:: Bytes32 ,
5
+ protocol:: { self , Bytes32 } ,
6
6
puzzles:: nft:: { self , NFT_METADATA_UPDATER_PUZZLE_HASH } ,
7
7
} ;
8
8
use chia_wallet_sdk:: {
@@ -13,8 +13,8 @@ use chia_wallet_sdk::{
13
13
AssertHeightAbsolute , AssertHeightRelative , AssertMyAmount , AssertMyBirthHeight ,
14
14
AssertMyBirthSeconds , AssertMyCoinId , AssertMyParentId , AssertMyPuzzleHash ,
15
15
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 ,
18
18
} ;
19
19
use clvmr:: {
20
20
run_program,
@@ -26,7 +26,7 @@ use napi::bindgen_prelude::*;
26
26
use crate :: {
27
27
clvm_value:: { Allocate , ClvmValue } ,
28
28
traits:: { FromJs , IntoJs , IntoRust } ,
29
- Coin , CoinSpend , MintedNfts , Nft , NftMint , ParsedNft , Program , Spend ,
29
+ Coin , CoinSpend , MintedNfts , Nft , NftMetadata , NftMint , ParsedNft , Program , Spend ,
30
30
} ;
31
31
32
32
type Clvm = Reference < ClvmAllocator > ;
@@ -144,6 +144,25 @@ impl ClvmAllocator {
144
144
Ok ( Program :: new ( this, ptr) )
145
145
}
146
146
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
+
147
166
#[ napi( ts_args_type = "conditions: Array<Program>" ) ]
148
167
pub fn delegated_spend_for_conditions (
149
168
& mut self ,
@@ -252,7 +271,14 @@ impl ClvmAllocator {
252
271
)
253
272
. map_err ( |error| Error :: from_reason ( error. to_string ( ) ) ) ?;
254
273
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 ( ) ?) ;
256
282
257
283
for condition in conditions {
258
284
let condition = condition
@@ -286,7 +312,7 @@ impl ClvmAllocator {
286
312
let puzzle = sdk:: Puzzle :: parse ( & self . 0 . allocator , puzzle. ptr ) ;
287
313
288
314
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)
290
316
. map_err ( |error| Error :: from_reason ( error. to_string ( ) ) ) ?
291
317
else {
292
318
return Ok ( None ) ;
@@ -307,7 +333,7 @@ impl ClvmAllocator {
307
333
) -> Result < Option < Nft > > {
308
334
let parent_puzzle = sdk:: Puzzle :: parse ( & self . 0 . allocator , parent_puzzle. ptr ) ;
309
335
310
- let Some ( nft) = sdk:: Nft :: < nft :: NftMetadata > :: parse_child (
336
+ let Some ( nft) = sdk:: Nft :: < HashedPtr > :: parse_child (
311
337
& mut self . 0 . allocator ,
312
338
parent_coin. into_rust ( ) ?,
313
339
parent_puzzle,
@@ -318,13 +344,18 @@ impl ClvmAllocator {
318
344
return Ok ( None ) ;
319
345
} ;
320
346
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 ( ) ?) )
322
353
}
323
354
324
355
#[ napi]
325
356
pub fn spend_nft ( & mut self , nft : Nft , inner_spend : Spend ) -> Result < Vec < CoinSpend > > {
326
357
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) ?;
328
359
329
360
nft. spend (
330
361
ctx,
@@ -354,6 +385,19 @@ pub fn curry_tree_hash(tree_hash: Uint8Array, args: Vec<Uint8Array>) -> Result<U
354
385
. into_js ( )
355
386
}
356
387
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
+
357
401
macro_rules! conditions {
358
402
( $( $condition: ident { $hint: literal $function: ident( $( $name: ident: $ty: ty $( => $remap: ty ) ? ) ,* ) } , ) * ) => {
359
403
$( #[ napi]
0 commit comments