@@ -17,21 +17,27 @@ export interface IDatumBuilderNftCheckArgs {
1717 */
1818export class DatumBuilderNftCheck extends DatumBuilderCondition {
1919 public buildConditionDatum ( args : IDatumBuilderNftCheckArgs ) : Core . PlutusData {
20- const asset_map : { [ policy_id : string ] : { [ assetName : string ] : bigint } } =
21- { } ;
20+ // Use Map objects to prevent prototype pollution
21+ const asset_map : Map < string , Map < string , bigint > > = new Map ( ) ;
2222 args . value . forEach ( ( asset ) => {
2323 const [ policy_id , asset_name ] = asset . metadata . assetId . split ( "." ) ;
24- if ( ! ( policy_id in asset_map ) ) {
25- asset_map [ policy_id ] = { } ;
24+ if ( ! asset_map . has ( policy_id ) ) {
25+ asset_map . set ( policy_id , new Map ( ) ) ;
2626 }
27- if ( ! ( asset_name in asset_map [ policy_id ] ) ) {
28- asset_map [ policy_id ] [ asset_name ] = asset . amount ;
27+ const assets_for_policy = asset_map . get ( policy_id ) ! ;
28+ if ( ! assets_for_policy . has ( asset_name ) ) {
29+ assets_for_policy . set ( asset_name , asset . amount ) ;
2930 } else {
30- asset_map [ policy_id ] [ asset_name ] += asset . amount ;
31+ assets_for_policy . set ( asset_name , assets_for_policy . get ( asset_name ) ! + asset . amount ) ;
3132 }
3233 } ) ;
34+ // Convert Map back to plain object for datum construction
35+ const object_asset_map : { [ policy_id : string ] : { [ assetName : string ] : bigint } } = { } ;
36+ for ( const [ policy_id , assets_map ] of asset_map . entries ( ) ) {
37+ object_asset_map [ policy_id ] = Object . fromEntries ( assets_map ) ;
38+ }
3339 const datum : NftCheckTypes . NftCheckDatum = {
34- value : asset_map ,
40+ value : object_asset_map ,
3541 check : args . check ,
3642 } ;
3743
0 commit comments