@campnetwork/origin 1.3.0-alpha.8 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,6 @@
1
1
  'use client';
2
2
  import React, { createContext, useState, useContext, useEffect, useLayoutEffect, useRef, useSyncExternalStore } from 'react';
3
- import { custom, createWalletClient, createPublicClient, http, encodeFunctionData, checksumAddress, zeroAddress, keccak256, toBytes, erc20Abi, getAbiItem, formatEther, formatUnits, parseEther } from 'viem';
3
+ import { custom, createWalletClient, createPublicClient, http, zeroAddress, erc20Abi, getAbiItem, formatEther, formatUnits, encodeFunctionData, checksumAddress, parseEther } from 'viem';
4
4
  import { toAccount } from 'viem/accounts';
5
5
  import { createSiweMessage } from 'viem/siwe';
6
6
  import axios from 'axios';
@@ -3330,7 +3330,7 @@ var tbaAbi = [
3330
3330
  }
3331
3331
  ];
3332
3332
 
3333
- var batchPurchaseAbi = [
3333
+ var batchOperationsAbi = [
3334
3334
  {
3335
3335
  inputs: [
3336
3336
  {
@@ -3342,23 +3342,56 @@ var batchPurchaseAbi = [
3342
3342
  internalType: "address",
3343
3343
  name: "_ipNFT",
3344
3344
  type: "address"
3345
+ },
3346
+ {
3347
+ internalType: "address",
3348
+ name: "_appRegistry",
3349
+ type: "address"
3345
3350
  }
3346
3351
  ],
3347
3352
  stateMutability: "nonpayable",
3348
3353
  type: "constructor"
3349
3354
  },
3355
+ {
3356
+ inputs: [
3357
+ ],
3358
+ name: "EmptyMintList",
3359
+ type: "error"
3360
+ },
3350
3361
  {
3351
3362
  inputs: [
3352
3363
  ],
3353
3364
  name: "EmptyPurchaseList",
3354
3365
  type: "error"
3355
3366
  },
3367
+ {
3368
+ inputs: [
3369
+ ],
3370
+ name: "InsufficientAllowance",
3371
+ type: "error"
3372
+ },
3356
3373
  {
3357
3374
  inputs: [
3358
3375
  ],
3359
3376
  name: "InvalidTotalPayment",
3360
3377
  type: "error"
3361
3378
  },
3379
+ {
3380
+ inputs: [
3381
+ {
3382
+ internalType: "uint256",
3383
+ name: "tokenId",
3384
+ type: "uint256"
3385
+ },
3386
+ {
3387
+ internalType: "string",
3388
+ name: "reason",
3389
+ type: "string"
3390
+ }
3391
+ ],
3392
+ name: "MintFailed",
3393
+ type: "error"
3394
+ },
3362
3395
  {
3363
3396
  inputs: [
3364
3397
  {
@@ -3375,6 +3408,12 @@ var batchPurchaseAbi = [
3375
3408
  name: "PurchaseFailed",
3376
3409
  type: "error"
3377
3410
  },
3411
+ {
3412
+ inputs: [
3413
+ ],
3414
+ name: "ReentrancyGuardReentrantCall",
3415
+ type: "error"
3416
+ },
3378
3417
  {
3379
3418
  inputs: [
3380
3419
  ],
@@ -3387,6 +3426,56 @@ var batchPurchaseAbi = [
3387
3426
  name: "ZeroAddress",
3388
3427
  type: "error"
3389
3428
  },
3429
+ {
3430
+ anonymous: false,
3431
+ inputs: [
3432
+ {
3433
+ indexed: true,
3434
+ internalType: "address",
3435
+ name: "minter",
3436
+ type: "address"
3437
+ },
3438
+ {
3439
+ indexed: false,
3440
+ internalType: "uint256",
3441
+ name: "count",
3442
+ type: "uint256"
3443
+ }
3444
+ ],
3445
+ name: "BulkMintExecuted",
3446
+ type: "event"
3447
+ },
3448
+ {
3449
+ anonymous: false,
3450
+ inputs: [
3451
+ {
3452
+ indexed: true,
3453
+ internalType: "address",
3454
+ name: "minter",
3455
+ type: "address"
3456
+ },
3457
+ {
3458
+ indexed: false,
3459
+ internalType: "uint256",
3460
+ name: "successCount",
3461
+ type: "uint256"
3462
+ },
3463
+ {
3464
+ indexed: false,
3465
+ internalType: "uint256",
3466
+ name: "failureCount",
3467
+ type: "uint256"
3468
+ },
3469
+ {
3470
+ indexed: false,
3471
+ internalType: "uint256[]",
3472
+ name: "failedTokenIds",
3473
+ type: "uint256[]"
3474
+ }
3475
+ ],
3476
+ name: "BulkMintPartial",
3477
+ type: "event"
3478
+ },
3390
3479
  {
3391
3480
  anonymous: false,
3392
3481
  inputs: [
@@ -3443,6 +3532,71 @@ var batchPurchaseAbi = [
3443
3532
  name: "BulkPurchasePartial",
3444
3533
  type: "event"
3445
3534
  },
3535
+ {
3536
+ inputs: [
3537
+ ],
3538
+ name: "appRegistry",
3539
+ outputs: [
3540
+ {
3541
+ internalType: "contract IAppRegistry",
3542
+ name: "",
3543
+ type: "address"
3544
+ }
3545
+ ],
3546
+ stateMutability: "view",
3547
+ type: "function"
3548
+ },
3549
+ {
3550
+ inputs: [
3551
+ {
3552
+ internalType: "uint256[]",
3553
+ name: "tokenIds",
3554
+ type: "uint256[]"
3555
+ }
3556
+ ],
3557
+ name: "buildPurchaseParams",
3558
+ outputs: [
3559
+ {
3560
+ components: [
3561
+ {
3562
+ internalType: "uint256",
3563
+ name: "tokenId",
3564
+ type: "uint256"
3565
+ },
3566
+ {
3567
+ internalType: "uint256",
3568
+ name: "expectedPrice",
3569
+ type: "uint256"
3570
+ },
3571
+ {
3572
+ internalType: "uint32",
3573
+ name: "expectedDuration",
3574
+ type: "uint32"
3575
+ },
3576
+ {
3577
+ internalType: "address",
3578
+ name: "expectedPaymentToken",
3579
+ type: "address"
3580
+ },
3581
+ {
3582
+ internalType: "uint16",
3583
+ name: "expectedProtocolFeeBps",
3584
+ type: "uint16"
3585
+ },
3586
+ {
3587
+ internalType: "uint16",
3588
+ name: "expectedAppFeeBps",
3589
+ type: "uint16"
3590
+ }
3591
+ ],
3592
+ internalType: "struct IBatchOperations.BuyParams[]",
3593
+ name: "purchases",
3594
+ type: "tuple[]"
3595
+ }
3596
+ ],
3597
+ stateMutability: "view",
3598
+ type: "function"
3599
+ },
3446
3600
  {
3447
3601
  inputs: [
3448
3602
  {
@@ -3471,9 +3625,19 @@ var batchPurchaseAbi = [
3471
3625
  internalType: "address",
3472
3626
  name: "expectedPaymentToken",
3473
3627
  type: "address"
3628
+ },
3629
+ {
3630
+ internalType: "uint16",
3631
+ name: "expectedProtocolFeeBps",
3632
+ type: "uint16"
3633
+ },
3634
+ {
3635
+ internalType: "uint16",
3636
+ name: "expectedAppFeeBps",
3637
+ type: "uint16"
3474
3638
  }
3475
3639
  ],
3476
- internalType: "struct IBatchPurchase.BuyParams[]",
3640
+ internalType: "struct IBatchOperations.BuyParams[]",
3477
3641
  name: "purchases",
3478
3642
  type: "tuple[]"
3479
3643
  }
@@ -3517,9 +3681,19 @@ var batchPurchaseAbi = [
3517
3681
  internalType: "address",
3518
3682
  name: "expectedPaymentToken",
3519
3683
  type: "address"
3684
+ },
3685
+ {
3686
+ internalType: "uint16",
3687
+ name: "expectedProtocolFeeBps",
3688
+ type: "uint16"
3689
+ },
3690
+ {
3691
+ internalType: "uint16",
3692
+ name: "expectedAppFeeBps",
3693
+ type: "uint16"
3520
3694
  }
3521
3695
  ],
3522
- internalType: "struct IBatchPurchase.BuyParams[]",
3696
+ internalType: "struct IBatchOperations.BuyParams[]",
3523
3697
  name: "purchases",
3524
3698
  type: "tuple[]"
3525
3699
  }
@@ -3554,7 +3728,7 @@ var batchPurchaseAbi = [
3554
3728
  type: "uint256[]"
3555
3729
  }
3556
3730
  ],
3557
- internalType: "struct IBatchPurchase.TolerantResult",
3731
+ internalType: "struct IBatchOperations.TolerantResult",
3558
3732
  name: "result",
3559
3733
  type: "tuple"
3560
3734
  }
@@ -3564,108 +3738,275 @@ var batchPurchaseAbi = [
3564
3738
  },
3565
3739
  {
3566
3740
  inputs: [
3567
- {
3568
- internalType: "uint256[]",
3569
- name: "tokenIds",
3570
- type: "uint256[]"
3571
- }
3572
- ],
3573
- name: "buildPurchaseParams",
3574
- outputs: [
3575
3741
  {
3576
3742
  components: [
3743
+ {
3744
+ internalType: "address",
3745
+ name: "to",
3746
+ type: "address"
3747
+ },
3577
3748
  {
3578
3749
  internalType: "uint256",
3579
3750
  name: "tokenId",
3580
3751
  type: "uint256"
3581
3752
  },
3753
+ {
3754
+ internalType: "bytes32",
3755
+ name: "creatorContentHash",
3756
+ type: "bytes32"
3757
+ },
3758
+ {
3759
+ internalType: "string",
3760
+ name: "uri",
3761
+ type: "string"
3762
+ },
3763
+ {
3764
+ components: [
3765
+ {
3766
+ internalType: "uint128",
3767
+ name: "price",
3768
+ type: "uint128"
3769
+ },
3770
+ {
3771
+ internalType: "uint32",
3772
+ name: "duration",
3773
+ type: "uint32"
3774
+ },
3775
+ {
3776
+ internalType: "uint16",
3777
+ name: "royaltyBps",
3778
+ type: "uint16"
3779
+ },
3780
+ {
3781
+ internalType: "address",
3782
+ name: "paymentToken",
3783
+ type: "address"
3784
+ },
3785
+ {
3786
+ internalType: "uint8",
3787
+ name: "licenseType",
3788
+ type: "uint8"
3789
+ }
3790
+ ],
3791
+ internalType: "struct IBatchOperations.LicenseTermsParam",
3792
+ name: "licenseTerms",
3793
+ type: "tuple"
3794
+ },
3582
3795
  {
3583
3796
  internalType: "uint256",
3584
- name: "expectedPrice",
3797
+ name: "deadline",
3585
3798
  type: "uint256"
3586
3799
  },
3587
3800
  {
3588
- internalType: "uint32",
3589
- name: "expectedDuration",
3590
- type: "uint32"
3801
+ internalType: "uint256[]",
3802
+ name: "parents",
3803
+ type: "uint256[]"
3591
3804
  },
3592
3805
  {
3593
- internalType: "address",
3594
- name: "expectedPaymentToken",
3595
- type: "address"
3806
+ internalType: "bool",
3807
+ name: "isIP",
3808
+ type: "bool"
3809
+ },
3810
+ {
3811
+ internalType: "string",
3812
+ name: "appId",
3813
+ type: "string"
3814
+ },
3815
+ {
3816
+ internalType: "bytes",
3817
+ name: "signature",
3818
+ type: "bytes"
3596
3819
  }
3597
3820
  ],
3598
- internalType: "struct IBatchPurchase.BuyParams[]",
3599
- name: "purchases",
3821
+ internalType: "struct IBatchOperations.MintParams[]",
3822
+ name: "mints",
3600
3823
  type: "tuple[]"
3601
3824
  }
3602
3825
  ],
3603
- stateMutability: "view",
3604
- type: "function"
3605
- },
3606
- {
3607
- inputs: [
3608
- {
3609
- internalType: "uint256[]",
3610
- name: "tokenIds",
3611
- type: "uint256[]"
3612
- }
3613
- ],
3614
- name: "checkActiveStatus",
3615
- outputs: [
3616
- {
3617
- internalType: "bool[]",
3618
- name: "activeFlags",
3619
- type: "bool[]"
3620
- }
3621
- ],
3622
- stateMutability: "view",
3623
- type: "function"
3624
- },
3625
- {
3626
- inputs: [
3627
- ],
3628
- name: "ipNFT",
3629
- outputs: [
3630
- {
3631
- internalType: "contract IIpNFT",
3632
- name: "",
3633
- type: "address"
3634
- }
3635
- ],
3636
- stateMutability: "view",
3637
- type: "function"
3638
- },
3639
- {
3640
- inputs: [
3641
- ],
3642
- name: "marketplace",
3826
+ name: "bulkMint",
3643
3827
  outputs: [
3644
- {
3645
- internalType: "contract IMarketplace",
3646
- name: "",
3647
- type: "address"
3648
- }
3649
3828
  ],
3650
- stateMutability: "view",
3829
+ stateMutability: "nonpayable",
3651
3830
  type: "function"
3652
3831
  },
3653
3832
  {
3654
3833
  inputs: [
3655
- {
3656
- internalType: "uint256[]",
3657
- name: "tokenIds",
3658
- type: "uint256[]"
3659
- }
3660
- ],
3661
- name: "previewBulkCost",
3662
- outputs: [
3663
3834
  {
3664
3835
  components: [
3665
3836
  {
3666
- internalType: "uint256",
3667
- name: "totalNativeCost",
3668
- type: "uint256"
3837
+ internalType: "address",
3838
+ name: "to",
3839
+ type: "address"
3840
+ },
3841
+ {
3842
+ internalType: "uint256",
3843
+ name: "tokenId",
3844
+ type: "uint256"
3845
+ },
3846
+ {
3847
+ internalType: "bytes32",
3848
+ name: "creatorContentHash",
3849
+ type: "bytes32"
3850
+ },
3851
+ {
3852
+ internalType: "string",
3853
+ name: "uri",
3854
+ type: "string"
3855
+ },
3856
+ {
3857
+ components: [
3858
+ {
3859
+ internalType: "uint128",
3860
+ name: "price",
3861
+ type: "uint128"
3862
+ },
3863
+ {
3864
+ internalType: "uint32",
3865
+ name: "duration",
3866
+ type: "uint32"
3867
+ },
3868
+ {
3869
+ internalType: "uint16",
3870
+ name: "royaltyBps",
3871
+ type: "uint16"
3872
+ },
3873
+ {
3874
+ internalType: "address",
3875
+ name: "paymentToken",
3876
+ type: "address"
3877
+ },
3878
+ {
3879
+ internalType: "uint8",
3880
+ name: "licenseType",
3881
+ type: "uint8"
3882
+ }
3883
+ ],
3884
+ internalType: "struct IBatchOperations.LicenseTermsParam",
3885
+ name: "licenseTerms",
3886
+ type: "tuple"
3887
+ },
3888
+ {
3889
+ internalType: "uint256",
3890
+ name: "deadline",
3891
+ type: "uint256"
3892
+ },
3893
+ {
3894
+ internalType: "uint256[]",
3895
+ name: "parents",
3896
+ type: "uint256[]"
3897
+ },
3898
+ {
3899
+ internalType: "bool",
3900
+ name: "isIP",
3901
+ type: "bool"
3902
+ },
3903
+ {
3904
+ internalType: "string",
3905
+ name: "appId",
3906
+ type: "string"
3907
+ },
3908
+ {
3909
+ internalType: "bytes",
3910
+ name: "signature",
3911
+ type: "bytes"
3912
+ }
3913
+ ],
3914
+ internalType: "struct IBatchOperations.MintParams[]",
3915
+ name: "mints",
3916
+ type: "tuple[]"
3917
+ }
3918
+ ],
3919
+ name: "bulkMintTolerant",
3920
+ outputs: [
3921
+ {
3922
+ components: [
3923
+ {
3924
+ internalType: "uint256",
3925
+ name: "successCount",
3926
+ type: "uint256"
3927
+ },
3928
+ {
3929
+ internalType: "uint256",
3930
+ name: "failureCount",
3931
+ type: "uint256"
3932
+ },
3933
+ {
3934
+ internalType: "uint256[]",
3935
+ name: "failedTokenIds",
3936
+ type: "uint256[]"
3937
+ }
3938
+ ],
3939
+ internalType: "struct IBatchOperations.TolerantMintResult",
3940
+ name: "result",
3941
+ type: "tuple"
3942
+ }
3943
+ ],
3944
+ stateMutability: "nonpayable",
3945
+ type: "function"
3946
+ },
3947
+ {
3948
+ inputs: [
3949
+ {
3950
+ internalType: "uint256[]",
3951
+ name: "tokenIds",
3952
+ type: "uint256[]"
3953
+ }
3954
+ ],
3955
+ name: "checkActiveStatus",
3956
+ outputs: [
3957
+ {
3958
+ internalType: "bool[]",
3959
+ name: "activeFlags",
3960
+ type: "bool[]"
3961
+ }
3962
+ ],
3963
+ stateMutability: "view",
3964
+ type: "function"
3965
+ },
3966
+ {
3967
+ inputs: [
3968
+ ],
3969
+ name: "ipNFT",
3970
+ outputs: [
3971
+ {
3972
+ internalType: "contract IIpNFT",
3973
+ name: "",
3974
+ type: "address"
3975
+ }
3976
+ ],
3977
+ stateMutability: "view",
3978
+ type: "function"
3979
+ },
3980
+ {
3981
+ inputs: [
3982
+ ],
3983
+ name: "marketplace",
3984
+ outputs: [
3985
+ {
3986
+ internalType: "contract IMarketplace",
3987
+ name: "",
3988
+ type: "address"
3989
+ }
3990
+ ],
3991
+ stateMutability: "view",
3992
+ type: "function"
3993
+ },
3994
+ {
3995
+ inputs: [
3996
+ {
3997
+ internalType: "uint256[]",
3998
+ name: "tokenIds",
3999
+ type: "uint256[]"
4000
+ }
4001
+ ],
4002
+ name: "previewBulkCost",
4003
+ outputs: [
4004
+ {
4005
+ components: [
4006
+ {
4007
+ internalType: "uint256",
4008
+ name: "totalNativeCost",
4009
+ type: "uint256"
3669
4010
  },
3670
4011
  {
3671
4012
  internalType: "uint256",
@@ -3683,13 +4024,68 @@ var batchPurchaseAbi = [
3683
4024
  type: "uint256[]"
3684
4025
  }
3685
4026
  ],
3686
- internalType: "struct IBatchPurchase.BulkCostPreview",
4027
+ internalType: "struct IBatchOperations.BulkCostPreview",
3687
4028
  name: "preview",
3688
4029
  type: "tuple"
3689
4030
  }
3690
4031
  ],
3691
4032
  stateMutability: "view",
3692
4033
  type: "function"
4034
+ },
4035
+ {
4036
+ inputs: [
4037
+ {
4038
+ internalType: "address",
4039
+ name: "buyer",
4040
+ type: "address"
4041
+ },
4042
+ {
4043
+ components: [
4044
+ {
4045
+ internalType: "uint256",
4046
+ name: "tokenId",
4047
+ type: "uint256"
4048
+ },
4049
+ {
4050
+ internalType: "uint256",
4051
+ name: "expectedPrice",
4052
+ type: "uint256"
4053
+ },
4054
+ {
4055
+ internalType: "uint32",
4056
+ name: "expectedDuration",
4057
+ type: "uint32"
4058
+ },
4059
+ {
4060
+ internalType: "address",
4061
+ name: "expectedPaymentToken",
4062
+ type: "address"
4063
+ },
4064
+ {
4065
+ internalType: "uint16",
4066
+ name: "expectedProtocolFeeBps",
4067
+ type: "uint16"
4068
+ },
4069
+ {
4070
+ internalType: "uint16",
4071
+ name: "expectedAppFeeBps",
4072
+ type: "uint16"
4073
+ }
4074
+ ],
4075
+ internalType: "struct IBatchOperations.BuyParams",
4076
+ name: "params",
4077
+ type: "tuple"
4078
+ }
4079
+ ],
4080
+ name: "tryERC20Purchase",
4081
+ outputs: [
4082
+ ],
4083
+ stateMutability: "nonpayable",
4084
+ type: "function"
4085
+ },
4086
+ {
4087
+ stateMutability: "payable",
4088
+ type: "receive"
3693
4089
  }
3694
4090
  ];
3695
4091
 
@@ -5698,38 +6094,36 @@ const ENVIRONMENTS = {
5698
6094
  ORIGIN_DASHBOARD: "https://origin.campnetwork.xyz",
5699
6095
  DATANFT_CONTRACT_ADDRESS: "0x4d9aF5800701A4A686Df6b096A27B81486de36eB",
5700
6096
  MARKETPLACE_CONTRACT_ADDRESS: "0x68B202caA162C418d3A2DF92F29fA1CAF90C58c1",
5701
- BATCH_PURCHASE_CONTRACT_ADDRESS: "0xaF0cF04DBfeeAcEdC77Dc68A91381AFB967B8518",
6097
+ BATCH_OPERATIONS_CONTRACT_ADDRESS: "0xe1247F1663925B99Db62e60480B53e37f2bb8738",
5702
6098
  DISPUTE_CONTRACT_ADDRESS: "0x45719337b1450b0D105cA671972be4263E6A9380",
5703
6099
  APP_REGISTRY_CONTRACT_ADDRESS: "0x2096eb980Dd590DDF690Cb698572b80552B6F9Bb",
5704
- // TODO: Add actual contract addresse when deployed
5705
6100
  FRACTIONALIZER_CONTRACT_ADDRESS: "",
5706
6101
  USDC_CONTRACT_ADDRESS: "0x8a2B28364102Bea189D99A475C494330Ef2bDD0B",
5707
6102
  CHAIN: testnet,
5708
6103
  IPNFT_ABI: ipnftMainnetAbi,
5709
6104
  MARKETPLACE_ABI: marketplaceMainnetAbi,
5710
6105
  TBA_ABI: tbaAbi,
5711
- BATCH_PURCHASE_ABI: batchPurchaseAbi,
6106
+ BATCH_OPERATIONS_ABI: batchOperationsAbi,
5712
6107
  DISPUTE_ABI: disputeAbi,
5713
6108
  FRACTIONALIZER_ABI: fractionalizerAbi,
5714
6109
  APP_REGISTRY_ABI: appRegistryAbi,
5715
6110
  },
5716
6111
  PRODUCTION: {
5717
6112
  NAME: "PRODUCTION",
5718
- AUTH_HUB_BASE_API: "https://wv2h4to5qa.execute-api.us-east-2.amazonaws.com/dev",
6113
+ AUTH_HUB_BASE_API: "https://origin-backend-mainnet.vercel.app",
5719
6114
  ORIGIN_DASHBOARD: "https://origin.campnetwork.xyz",
5720
6115
  DATANFT_CONTRACT_ADDRESS: "0x39EeE1C3989f0dD543Dee60f8582F7F81F522C38",
5721
6116
  MARKETPLACE_CONTRACT_ADDRESS: "0xc69BAa987757d054455fC0f2d9797684E9FB8b9C",
5722
- BATCH_PURCHASE_CONTRACT_ADDRESS: "0x31885cD2A445322067dF890bACf6CeFE9b233BCC",
5723
- // TODO: Add actual contract addresses when deployed
5724
- DISPUTE_CONTRACT_ADDRESS: "",
6117
+ BATCH_OPERATIONS_CONTRACT_ADDRESS: "0x31885cD2A445322067dF890bACf6CeFE9b233BCC",
6118
+ DISPUTE_CONTRACT_ADDRESS: "0x947A3C4A45f7039e77643026A090025D5412EDa2",
5725
6119
  FRACTIONALIZER_CONTRACT_ADDRESS: "",
5726
- APP_REGISTRY_CONTRACT_ADDRESS: "",
6120
+ APP_REGISTRY_CONTRACT_ADDRESS: "0xd09F15aA280F9109aCd403cA920e67D40Cb6C3FA",
5727
6121
  USDC_CONTRACT_ADDRESS: "",
5728
6122
  CHAIN: mainnet,
5729
6123
  IPNFT_ABI: ipnftMainnetAbi,
5730
6124
  MARKETPLACE_ABI: marketplaceMainnetAbi,
5731
6125
  TBA_ABI: tbaAbi,
5732
- BATCH_PURCHASE_ABI: batchPurchaseAbi,
6126
+ BATCH_OPERATIONS_ABI: batchOperationsAbi,
5733
6127
  DISPUTE_ABI: disputeAbi,
5734
6128
  FRACTIONALIZER_ABI: fractionalizerAbi,
5735
6129
  APP_REGISTRY_ABI: appRegistryAbi,
@@ -5944,8 +6338,7 @@ const splitFileIntoChunks = (file, chunkSize) => {
5944
6338
  return chunks;
5945
6339
  };
5946
6340
  const getBaseApiUrl = (environment) => {
5947
- const authEndpoint = environment.NAME === "PRODUCTION" ? "/auth-mainnet" : "";
5948
- return environment.AUTH_HUB_BASE_API + authEndpoint;
6341
+ return environment.AUTH_HUB_BASE_API;
5949
6342
  };
5950
6343
 
5951
6344
  /**
@@ -6087,706 +6480,105 @@ function ownerOf(tokenId) {
6087
6480
  /**
6088
6481
  * Returns the number of IPNFTs owned by the given address.
6089
6482
  * @param owner The address to query.
6090
- * @returns The number of IPNFTs owned by the address.
6091
- */
6092
- function balanceOf(owner) {
6093
- return this.callContractMethod(this.environment.DATANFT_CONTRACT_ADDRESS, this.environment.IPNFT_ABI, "balanceOf", [owner]);
6094
- }
6095
-
6096
- /**
6097
- * Returns the metadata URI associated with a specific token ID.
6098
- * @param tokenId The token ID to query.
6099
- * @returns The metadata URI of the token ID.
6100
- */
6101
- function tokenURI(tokenId) {
6102
- return this.callContractMethod(this.environment.DATANFT_CONTRACT_ADDRESS, this.environment.IPNFT_ABI, "tokenURI", [tokenId]);
6103
- }
6104
-
6105
- /**
6106
- * Returns the data status of the given token ID.
6107
- * @param tokenId The token ID to query.
6108
- * @returns The data status of the token ID.
6109
- */
6110
- function dataStatus(tokenId) {
6111
- return this.callContractMethod(this.environment.DATANFT_CONTRACT_ADDRESS, this.environment.IPNFT_ABI, "dataStatus", [tokenId]);
6112
- }
6113
-
6114
- /**
6115
- * Checks if an operator is approved to manage all assets of a given owner.
6116
- * @param owner The address of the asset owner.
6117
- * @param operator The address of the operator to check.
6118
- * @return A promise that resolves to a boolean indicating if the operator is approved for all assets of the owner.
6119
- */
6120
- function isApprovedForAll(owner, operator) {
6121
- return this.callContractMethod(this.environment.DATANFT_CONTRACT_ADDRESS, this.environment.IPNFT_ABI, "isApprovedForAll", [owner, operator]);
6122
- }
6123
-
6124
- function transferFrom(from, to, tokenId) {
6125
- return this.callContractMethod(this.environment.DATANFT_CONTRACT_ADDRESS, this.environment.IPNFT_ABI, "transferFrom", [from, to, tokenId]);
6126
- }
6127
-
6128
- function safeTransferFrom(from, to, tokenId, data) {
6129
- const args = data ? [from, to, tokenId, data] : [from, to, tokenId];
6130
- return this.callContractMethod(this.environment.DATANFT_CONTRACT_ADDRESS, this.environment.IPNFT_ABI, "safeTransferFrom", args);
6131
- }
6132
-
6133
- function approve(to, tokenId) {
6134
- return this.callContractMethod(this.environment.DATANFT_CONTRACT_ADDRESS, this.environment.IPNFT_ABI, "approve", [to, tokenId]);
6135
- }
6136
-
6137
- function setApprovalForAll(operator, approved) {
6138
- return this.callContractMethod(this.environment.DATANFT_CONTRACT_ADDRESS, this.environment.IPNFT_ABI, "setApprovalForAll", [operator, approved]);
6139
- }
6140
-
6141
- /**
6142
- * Buys access to a data NFT for a specified duration.
6143
- * @param buyer The address of the buyer.
6144
- * @param tokenId The ID of the data NFT.
6145
- * @param expectedPrice The expected price for the access.
6146
- * @param expectedDuration The expected duration of the access in seconds.
6147
- * @param expectedPaymentToken The address of the payment token (use zero address for native token).
6148
- * @param expectedProtocolFeeBps The expected protocol fee in basis points (0-10000). Defaults to 0.
6149
- * @param expectedAppFeeBps The expected app fee in basis points (0-10000). Defaults to 0.
6150
- * @param value The amount of native token to send (only required if paying with native token).
6151
- * @returns A promise that resolves when the transaction is confirmed.
6152
- */
6153
- function buyAccess(buyer, tokenId, expectedPrice, expectedDuration, expectedPaymentToken, expectedProtocolFeeBps = 0, expectedAppFeeBps = 0, value // only for native token payments
6154
- ) {
6155
- return this.callContractMethod(this.environment.MARKETPLACE_CONTRACT_ADDRESS, this.environment.MARKETPLACE_ABI, "buyAccess", [
6156
- buyer,
6157
- tokenId,
6158
- expectedPrice,
6159
- expectedDuration,
6160
- expectedPaymentToken,
6161
- expectedProtocolFeeBps,
6162
- expectedAppFeeBps,
6163
- ], { waitForReceipt: true, value });
6164
- }
6165
-
6166
- /**
6167
- * Checks if a user has access to a specific token based on subscription expiry.
6168
- * @param user - The address of the user.
6169
- * @param tokenId - The ID of the token.
6170
- * @returns A promise that resolves to a boolean indicating if the user has access.
6171
- */
6172
- function hasAccess(user, tokenId) {
6173
- return __awaiter(this, void 0, void 0, function* () {
6174
- try {
6175
- const expiryTimestamp = yield this.subscriptionExpiry(tokenId, user);
6176
- const currentTimestamp = BigInt(Math.floor(Date.now() / 1000));
6177
- return expiryTimestamp > currentTimestamp;
6178
- }
6179
- catch (error) {
6180
- return false;
6181
- }
6182
- });
6183
- }
6184
-
6185
- function subscriptionExpiry(tokenId, user) {
6186
- return this.callContractMethod(this.environment.MARKETPLACE_CONTRACT_ADDRESS, this.environment.MARKETPLACE_ABI, "subscriptionExpiry", [tokenId, user]);
6187
- }
6188
-
6189
- /**
6190
- * Adapter for viem WalletClient
6191
- */
6192
- class ViemSignerAdapter {
6193
- constructor(signer) {
6194
- this.type = "viem";
6195
- this.signer = signer;
6196
- }
6197
- getAddress() {
6198
- return __awaiter(this, void 0, void 0, function* () {
6199
- if (this.signer.account) {
6200
- return this.signer.account.address;
6201
- }
6202
- const accounts = yield this.signer.request({
6203
- method: "eth_requestAccounts",
6204
- params: [],
6205
- });
6206
- if (!accounts || accounts.length === 0) {
6207
- throw new Error("No accounts found in viem wallet client");
6208
- }
6209
- return accounts[0];
6210
- });
6211
- }
6212
- signMessage(message) {
6213
- return __awaiter(this, void 0, void 0, function* () {
6214
- const address = yield this.getAddress();
6215
- return yield this.signer.signMessage({
6216
- account: address,
6217
- message,
6218
- });
6219
- });
6220
- }
6221
- signTypedData(domain, types, value) {
6222
- return __awaiter(this, void 0, void 0, function* () {
6223
- throw new Error("Viem WalletClient does not support signTypedData");
6224
- });
6225
- }
6226
- getChainId() {
6227
- return __awaiter(this, void 0, void 0, function* () {
6228
- var _a;
6229
- return ((_a = this.signer.chain) === null || _a === void 0 ? void 0 : _a.id) || 1;
6230
- });
6231
- }
6232
- }
6233
- /**
6234
- * Adapter for ethers Signer (v5 and v6)
6235
- */
6236
- class EthersSignerAdapter {
6237
- constructor(signer) {
6238
- this.type = "ethers";
6239
- this.signer = signer;
6240
- }
6241
- getAddress() {
6242
- return __awaiter(this, void 0, void 0, function* () {
6243
- // Works for both ethers v5 and v6
6244
- if (typeof this.signer.getAddress === "function") {
6245
- return yield this.signer.getAddress();
6246
- }
6247
- if (this.signer.address) {
6248
- return this.signer.address;
6249
- }
6250
- throw new Error("Unable to get address from ethers signer");
6251
- });
6252
- }
6253
- signMessage(message) {
6254
- return __awaiter(this, void 0, void 0, function* () {
6255
- if (typeof this.signer.signMessage !== "function") {
6256
- throw new Error("Signer does not support signMessage");
6257
- }
6258
- return yield this.signer.signMessage(message);
6259
- });
6260
- }
6261
- signTypedData(domain, types, value) {
6262
- return __awaiter(this, void 0, void 0, function* () {
6263
- if (typeof this.signer._signTypedData === "function") {
6264
- return yield this.signer._signTypedData(domain, types, value);
6265
- }
6266
- if (typeof this.signer.signTypedData !== "function") {
6267
- throw new Error("Signer does not support signTypedData or _signTypedData");
6268
- }
6269
- return yield this.signer.signTypedData(domain, types, value);
6270
- });
6271
- }
6272
- getChainId() {
6273
- return __awaiter(this, void 0, void 0, function* () {
6274
- // Try ethers v6 first
6275
- if (this.signer.provider &&
6276
- typeof this.signer.provider.getNetwork === "function") {
6277
- const network = yield this.signer.provider.getNetwork();
6278
- // ethers v6 returns bigint, v5 returns number
6279
- return typeof network.chainId === "bigint"
6280
- ? Number(network.chainId)
6281
- : network.chainId;
6282
- }
6283
- // Fallback for ethers v5
6284
- if (typeof this.signer.getChainId === "function") {
6285
- return yield this.signer.getChainId();
6286
- }
6287
- // Default to mainnet if we can't determine
6288
- return 484;
6289
- });
6290
- }
6291
- }
6292
- /**
6293
- * Adapter for custom signer implementations
6294
- */
6295
- class CustomSignerAdapter {
6296
- constructor(signer) {
6297
- this.type = "custom";
6298
- this.signer = signer;
6299
- }
6300
- getAddress() {
6301
- return __awaiter(this, void 0, void 0, function* () {
6302
- if (typeof this.signer.getAddress === "function") {
6303
- return yield this.signer.getAddress();
6304
- }
6305
- if (this.signer.address) {
6306
- return this.signer.address;
6307
- }
6308
- throw new Error("Custom signer must implement getAddress() or have address property");
6309
- });
6310
- }
6311
- signMessage(message) {
6312
- return __awaiter(this, void 0, void 0, function* () {
6313
- if (typeof this.signer.signMessage !== "function") {
6314
- throw new Error("Custom signer must implement signMessage()");
6315
- }
6316
- return yield this.signer.signMessage(message);
6317
- });
6318
- }
6319
- signTypedData(domain, types, value) {
6320
- return __awaiter(this, void 0, void 0, function* () {
6321
- if (typeof this.signer.signTypedData !== "function") {
6322
- throw new Error("Custom signer must implement signTypedData()");
6323
- }
6324
- return yield this.signer.signTypedData(domain, types, value);
6325
- });
6326
- }
6327
- getChainId() {
6328
- return __awaiter(this, void 0, void 0, function* () {
6329
- if (typeof this.signer.getChainId === "function") {
6330
- const chainId = yield this.signer.getChainId();
6331
- return typeof chainId === "bigint" ? Number(chainId) : chainId;
6332
- }
6333
- if (this.signer.chainId !== undefined) {
6334
- return typeof this.signer.chainId === "bigint"
6335
- ? Number(this.signer.chainId)
6336
- : this.signer.chainId;
6337
- }
6338
- // Default to mainnet
6339
- return 484;
6340
- });
6341
- }
6342
- }
6343
- /**
6344
- * Factory function to create appropriate adapter based on signer type
6345
- */
6346
- function createSignerAdapter(signer) {
6347
- // Check for viem WalletClient
6348
- if (signer.transport &&
6349
- signer.chain &&
6350
- typeof signer.signMessage === "function") {
6351
- return new ViemSignerAdapter(signer);
6352
- }
6353
- // Check for ethers signer (v5 or v6)
6354
- if (signer._isSigner ||
6355
- (signer.provider && typeof signer.signMessage === "function")) {
6356
- return new EthersSignerAdapter(signer);
6357
- }
6358
- // Try custom adapter
6359
- return new CustomSignerAdapter(signer);
6360
- }
6361
-
6362
- /**
6363
- * Fetches the protocol fee from the marketplace contract.
6364
- */
6365
- function getProtocolFeeBps(origin) {
6366
- return __awaiter(this, void 0, void 0, function* () {
6367
- try {
6368
- const protocolFeeBps = yield origin.callContractMethod(origin.environment.MARKETPLACE_CONTRACT_ADDRESS, origin.environment.MARKETPLACE_ABI, "protocolFeeBps", []);
6369
- return Number(protocolFeeBps);
6370
- }
6371
- catch (error) {
6372
- console.warn("Failed to fetch protocol fee, defaulting to 0:", error);
6373
- return 0;
6374
- }
6375
- });
6376
- }
6377
- /**
6378
- * Fetches the app fee for a specific token from the AppRegistry.
6379
- */
6380
- function getAppFeeBpsForToken(origin, tokenId) {
6381
- return __awaiter(this, void 0, void 0, function* () {
6382
- try {
6383
- const tokenInfo = yield origin.callContractMethod(origin.environment.DATANFT_CONTRACT_ADDRESS, origin.environment.IPNFT_ABI, "tokenInfo", [tokenId]);
6384
- const appId = tokenInfo === null || tokenInfo === void 0 ? void 0 : tokenInfo.appId;
6385
- if (!appId || appId === "")
6386
- return 0;
6387
- if (!origin.environment.APP_REGISTRY_CONTRACT_ADDRESS ||
6388
- !origin.environment.APP_REGISTRY_ABI) {
6389
- return 0;
6390
- }
6391
- const appInfo = yield origin.callContractMethod(origin.environment.APP_REGISTRY_CONTRACT_ADDRESS, origin.environment.APP_REGISTRY_ABI, "getAppInfo", [appId]);
6392
- if (appInfo === null || appInfo === void 0 ? void 0 : appInfo.isActive) {
6393
- return Number(appInfo.revenueShareBps);
6394
- }
6395
- return 0;
6396
- }
6397
- catch (error) {
6398
- console.warn("Failed to fetch app fee, defaulting to 0:", error);
6399
- return 0;
6400
- }
6401
- });
6402
- }
6403
- /**
6404
- * EXPERIMENTAL METHOD
6405
- * Settles a payment intent response by purchasing access if needed.
6406
- * This method checks if the user already has access to the item, and if not,
6407
- * it calls buyAccess with the parameters from the payment intent response.
6408
- * Supports viem WalletClient, ethers Signer, and custom signer implementations.
6409
- *
6410
- * @param paymentIntentResponse - The response from getDataWithIntent containing payment details.
6411
- * @param signer - Optional signer object used to interact with the blockchain. If not provided, uses the connected wallet client.
6412
- * @returns A promise that resolves with the transaction hash and receipt, or null if access already exists.
6413
- * @throws {Error} If the response doesn't contain marketplace action or if the method is not buyAccess.
6414
- */
6415
- function settlePaymentIntent(paymentIntentResponse, signer) {
6416
- return __awaiter(this, void 0, void 0, function* () {
6417
- if (!paymentIntentResponse.marketplaceAction) {
6418
- throw new ValidationError("Invalid X402 response: no marketplace action found. The response may be malformed or the server returned an error.");
6419
- }
6420
- const { marketplaceAction } = paymentIntentResponse;
6421
- if (marketplaceAction.method !== "buyAccess") {
6422
- throw new ValidationError(`Unsupported marketplace action method "${marketplaceAction.method}". Only "buyAccess" is currently supported.`);
6423
- }
6424
- const tokenId = BigInt(marketplaceAction.tokenId);
6425
- const payerAddress = marketplaceAction.payer;
6426
- const alreadyHasAccess = yield this.hasAccess(payerAddress, tokenId);
6427
- if (alreadyHasAccess) {
6428
- console.log("User already has access to this item");
6429
- return null;
6430
- }
6431
- const expectedPrice = BigInt(marketplaceAction.amount);
6432
- const expectedDuration = BigInt(marketplaceAction.duration);
6433
- const expectedPaymentToken = marketplaceAction.asset;
6434
- const isNativeToken = expectedPaymentToken === "0x0000000000000000000000000000000000000000";
6435
- const value = isNativeToken ? expectedPrice : BigInt(0);
6436
- const [protocolFeeBps, appFeeBps] = yield Promise.all([
6437
- getProtocolFeeBps(this),
6438
- getAppFeeBpsForToken(this, tokenId),
6439
- ]);
6440
- if (signer) {
6441
- const signerAdapter = createSignerAdapter(signer);
6442
- const marketplaceAddress = this.environment
6443
- .MARKETPLACE_CONTRACT_ADDRESS;
6444
- const abi = this.environment.MARKETPLACE_ABI;
6445
- const data = encodeFunctionData({
6446
- abi,
6447
- functionName: "buyAccess",
6448
- args: [
6449
- payerAddress,
6450
- tokenId,
6451
- expectedPrice,
6452
- expectedDuration,
6453
- expectedPaymentToken,
6454
- protocolFeeBps,
6455
- appFeeBps,
6456
- ],
6457
- });
6458
- if (signerAdapter.type === "viem") {
6459
- const viemSigner = signerAdapter.signer;
6460
- const txHash = yield viemSigner.sendTransaction({
6461
- to: marketplaceAddress,
6462
- data,
6463
- value,
6464
- account: (yield signerAdapter.getAddress()),
6465
- });
6466
- const receipt = yield viemSigner.waitForTransactionReceipt({
6467
- hash: txHash,
6468
- });
6469
- return { txHash, receipt };
6470
- }
6471
- else if (signerAdapter.type === "ethers") {
6472
- const ethersSigner = signerAdapter.signer;
6473
- const tx = yield ethersSigner.sendTransaction({
6474
- to: marketplaceAddress,
6475
- data,
6476
- value: value.toString(),
6477
- });
6478
- const receipt = yield tx.wait();
6479
- return { txHash: tx.hash, receipt };
6480
- }
6481
- else {
6482
- const customSigner = signerAdapter.signer;
6483
- if (typeof customSigner.sendTransaction !== "function") {
6484
- throw new ValidationError("Custom signer must implement sendTransaction() method to settle payment intents");
6485
- }
6486
- const tx = yield customSigner.sendTransaction({
6487
- to: marketplaceAddress,
6488
- data,
6489
- value: value.toString(),
6490
- });
6491
- if (tx.wait && typeof tx.wait === "function") {
6492
- const receipt = yield tx.wait();
6493
- return { txHash: tx.hash, receipt };
6494
- }
6495
- return { txHash: tx.hash || tx };
6496
- }
6497
- }
6498
- if (!this.viemClient) {
6499
- throw new WalletError("Cannot settle payment intent: no signer or wallet connected. Please connect a wallet or provide a signer.");
6500
- }
6501
- return yield this.buyAccess(payerAddress, tokenId, expectedPrice, expectedDuration, expectedPaymentToken, protocolFeeBps, appFeeBps, isNativeToken ? value : undefined);
6502
- });
6503
- }
6504
-
6505
- /**
6506
- * Resolves a wallet address from an optional address parameter or connected wallet.
6507
- * Checks viemClient.account first, then falls back to eth_requestAccounts.
6508
- *
6509
- * @param viemClient The viem WalletClient instance.
6510
- * @param address Optional address to use directly.
6511
- * @returns The resolved wallet address.
6512
- * @throws Error if no address provided and no wallet connected or no accounts found.
6513
- */
6514
- function resolveWalletAddress(viemClient, address) {
6515
- return __awaiter(this, void 0, void 0, function* () {
6516
- if (address) {
6517
- return address;
6518
- }
6519
- if (!viemClient) {
6520
- throw new Error("No address provided and no wallet connected. Please provide an address or connect a wallet.");
6521
- }
6522
- if (viemClient.account) {
6523
- return viemClient.account.address;
6524
- }
6525
- const accounts = yield viemClient.request({
6526
- method: "eth_requestAccounts",
6527
- params: [],
6528
- });
6529
- if (!accounts || accounts.length === 0) {
6530
- throw new Error("No accounts found in connected wallet.");
6531
- }
6532
- return accounts[0];
6533
- });
6534
- }
6535
- /**
6536
- * Enum representing the type of license for an IP NFT.
6537
- * - DURATION_BASED: License expires after a set duration (subscription model).
6538
- * - SINGLE_PAYMENT: One-time payment for perpetual access.
6539
- * - X402: HTTP 402-based micropayment license (no on-chain payments).
6540
- */
6541
- var LicenseType;
6542
- (function (LicenseType) {
6543
- LicenseType[LicenseType["DURATION_BASED"] = 0] = "DURATION_BASED";
6544
- LicenseType[LicenseType["SINGLE_PAYMENT"] = 1] = "SINGLE_PAYMENT";
6545
- LicenseType[LicenseType["X402"] = 2] = "X402";
6546
- })(LicenseType || (LicenseType = {}));
6547
- /**
6548
- * Enum representing the status of data in the system.
6549
- * - ACTIVE: The data is currently active and available.
6550
- * - DELETED: The data has been deleted and is no longer available.
6551
- * - DISPUTED: The data has been disputed and marked as potentially infringing.
6552
- */
6553
- var DataStatus;
6554
- (function (DataStatus) {
6555
- DataStatus[DataStatus["ACTIVE"] = 0] = "ACTIVE";
6556
- DataStatus[DataStatus["DELETED"] = 1] = "DELETED";
6557
- DataStatus[DataStatus["DISPUTED"] = 2] = "DISPUTED";
6558
- })(DataStatus || (DataStatus = {}));
6559
- /**
6560
- * Enum representing the status of a dispute.
6561
- * - Uninitialized: Dispute does not exist.
6562
- * - Raised: Dispute has been raised but not yet asserted by IP owner.
6563
- * - Asserted: IP owner has responded to the dispute.
6564
- * - Resolved: Dispute has been resolved (either valid or invalid).
6565
- * - Cancelled: Dispute was cancelled by the initiator.
6566
- */
6567
- var DisputeStatus;
6568
- (function (DisputeStatus) {
6569
- DisputeStatus[DisputeStatus["Uninitialized"] = 0] = "Uninitialized";
6570
- DisputeStatus[DisputeStatus["Raised"] = 1] = "Raised";
6571
- DisputeStatus[DisputeStatus["Asserted"] = 2] = "Asserted";
6572
- DisputeStatus[DisputeStatus["Resolved"] = 3] = "Resolved";
6573
- DisputeStatus[DisputeStatus["Cancelled"] = 4] = "Cancelled";
6574
- })(DisputeStatus || (DisputeStatus = {}));
6575
- /**
6576
- * Creates license terms for a digital asset.
6577
- * @param price The price of the asset in wei.
6578
- * @param duration The duration of the license in seconds (use 0 for SINGLE_PAYMENT and X402).
6579
- * @param royaltyBps The royalty percentage in basis points (0-10000).
6580
- * @param paymentToken The address of the payment token (ERC20 / address(0) for native currency).
6581
- * @param licenseType The type of license (defaults to DURATION_BASED).
6582
- * @returns The created license terms.
6483
+ * @returns The number of IPNFTs owned by the address.
6583
6484
  */
6584
- const createLicenseTerms = (price, duration, royaltyBps, paymentToken, licenseType = LicenseType.DURATION_BASED) => {
6585
- if (royaltyBps < constants.MIN_ROYALTY_BPS ||
6586
- royaltyBps > constants.MAX_ROYALTY_BPS) {
6587
- throw new Error(`Royalty basis points must be between ${constants.MIN_ROYALTY_BPS} and ${constants.MAX_ROYALTY_BPS}`);
6588
- }
6589
- if (licenseType === LicenseType.DURATION_BASED) {
6590
- if (duration < constants.MIN_LICENSE_DURATION ||
6591
- duration > constants.MAX_LICENSE_DURATION) {
6592
- throw new Error(`Duration must be between ${constants.MIN_LICENSE_DURATION} and ${constants.MAX_LICENSE_DURATION} seconds for DURATION_BASED licenses`);
6593
- }
6594
- }
6595
- else if ((licenseType === LicenseType.SINGLE_PAYMENT ||
6596
- licenseType === LicenseType.X402) &&
6597
- duration > 0) {
6598
- throw new Error(`Duration must be 0 for ${LicenseType[licenseType]} licenses`);
6599
- }
6600
- if (price < constants.MIN_PRICE) {
6601
- throw new Error(`Price must be at least ${constants.MIN_PRICE} wei`);
6602
- }
6603
- return {
6604
- price,
6605
- duration,
6606
- royaltyBps,
6607
- paymentToken,
6608
- licenseType,
6609
- };
6610
- };
6485
+ function balanceOf(owner) {
6486
+ return this.callContractMethod(this.environment.DATANFT_CONTRACT_ADDRESS, this.environment.IPNFT_ABI, "balanceOf", [owner]);
6487
+ }
6488
+
6611
6489
  /**
6612
- * Defines the EIP-712 typed data structure for X402 Intent signatures.
6490
+ * Returns the metadata URI associated with a specific token ID.
6491
+ * @param tokenId The token ID to query.
6492
+ * @returns The metadata URI of the token ID.
6613
6493
  */
6614
- const X402_INTENT_TYPES = {
6615
- X402Intent: [
6616
- { name: "payer", type: "address" },
6617
- { name: "asset", type: "address" },
6618
- { name: "amount", type: "uint256" },
6619
- { name: "httpMethod", type: "string" },
6620
- { name: "payTo", type: "address" },
6621
- { name: "tokenId", type: "uint256" },
6622
- { name: "duration", type: "uint32" },
6623
- { name: "expiresAt", type: "uint256" },
6624
- { name: "nonce", type: "bytes32" },
6625
- ],
6626
- };
6494
+ function tokenURI(tokenId) {
6495
+ return this.callContractMethod(this.environment.DATANFT_CONTRACT_ADDRESS, this.environment.IPNFT_ABI, "tokenURI", [tokenId]);
6496
+ }
6627
6497
 
6628
- const fetchTokenData = (origin, tokenId, headers) => __awaiter(void 0, void 0, void 0, function* () {
6629
- const response = yield fetch(`${origin.environment.AUTH_HUB_BASE_API}/origin/data/${tokenId}`, {
6630
- method: "GET",
6631
- headers: Object.assign({ "Content-Type": "application/json" }, headers),
6632
- });
6633
- return response;
6634
- });
6635
6498
  /**
6636
- * EXPERIMENTAL METHOD
6637
- * Fetch data with X402 payment handling.
6638
- * @param {bigint} tokenId The token ID to fetch data for.
6639
- * @param {any} [signer] Optional signer object for signing the X402 intent.
6640
- * @returns {Promise<any>} A promise that resolves with the fetched data.
6641
- * @throws {Error} Throws an error if the data cannot be fetched or if no signer/wallet client is provided.
6499
+ * Returns the data status of the given token ID.
6500
+ * @param tokenId The token ID to query.
6501
+ * @returns The data status of the token ID.
6642
6502
  */
6643
- function getDataWithIntent(tokenId, signer, decide) {
6644
- return __awaiter(this, void 0, void 0, function* () {
6645
- var _a;
6646
- const viemClient = this.viemClient;
6647
- if (!signer && !viemClient) {
6648
- throw new WalletError(`Cannot fetch data for token ${tokenId}: no signer or wallet client provided. Please connect a wallet or provide a signer.`);
6649
- }
6650
- const initialResponse = yield fetchTokenData(this, tokenId, {});
6651
- if (initialResponse.status !== 402) {
6652
- if (!initialResponse.ok) {
6653
- const errorText = yield initialResponse
6654
- .text()
6655
- .catch(() => initialResponse.statusText);
6656
- throw new APIError(`Failed to fetch data for token ${tokenId} (HTTP ${initialResponse.status}): ${errorText}`, initialResponse.status);
6657
- }
6658
- return initialResponse.json();
6659
- }
6660
- const sig = viemClient || createSignerAdapter(signer);
6661
- const walletAddress = viemClient
6662
- ? yield getCurrentAccount.call(this)
6663
- : yield sig.getAddress();
6664
- const intentData = yield initialResponse.json();
6665
- if (intentData.error) {
6666
- throw new APIError(`Failed to process X402 intent for token ${tokenId}: ${intentData.error}`);
6667
- }
6668
- const requirements = intentData.accepts[0];
6669
- const x402Payload = yield buildX402Payload.call(this, requirements, checksumAddress(walletAddress), sig);
6670
- const header = btoa(JSON.stringify(x402Payload));
6671
- const retryResponse = yield fetchTokenData(this, tokenId, {
6672
- "X-PAYMENT": header,
6673
- });
6674
- if (retryResponse.status === 402) {
6675
- // subscription required
6676
- if (decide) {
6677
- const resJson = yield retryResponse.json();
6678
- const accepted = yield decide(resJson.marketplaceAction);
6679
- if (accepted) {
6680
- const settlement = yield this.settlePaymentIntent(resJson, signer || viemClient);
6681
- if (settlement && !settlement.txHash) {
6682
- throw new APIError(`Failed to settle X402 payment for token ${tokenId}: no transaction hash returned`);
6683
- }
6684
- // retry fetching data after settlement
6685
- const finalResponse = yield this.getDataWithIntent(tokenId, signer, undefined);
6686
- return finalResponse;
6687
- }
6688
- else {
6689
- // user declined to proceed with payment
6690
- return {
6691
- error: "User declined to proceed with payment",
6692
- data: null,
6693
- };
6694
- }
6695
- }
6696
- else {
6697
- return retryResponse.json();
6698
- }
6699
- }
6700
- if (!retryResponse.ok) {
6701
- const errorText = yield retryResponse
6702
- .text()
6703
- .catch(() => retryResponse.statusText);
6704
- throw new APIError(`Failed to fetch data for token ${tokenId} after X402 payment (HTTP ${retryResponse.status}): ${errorText}`, retryResponse.status);
6705
- }
6706
- const res = yield retryResponse.json();
6707
- return {
6708
- error: null,
6709
- data: (_a = res.data) !== null && _a !== void 0 ? _a : res,
6710
- };
6711
- });
6503
+ function dataStatus(tokenId) {
6504
+ return this.callContractMethod(this.environment.DATANFT_CONTRACT_ADDRESS, this.environment.IPNFT_ABI, "dataStatus", [tokenId]);
6712
6505
  }
6506
+
6713
6507
  /**
6714
- * Build the X402 payment payload.
6715
- * @private
6508
+ * Checks if an operator is approved to manage all assets of a given owner.
6509
+ * @param owner The address of the asset owner.
6510
+ * @param operator The address of the operator to check.
6511
+ * @return A promise that resolves to a boolean indicating if the operator is approved for all assets of the owner.
6716
6512
  */
6717
- function buildX402Payload(requirements, payer, signer) {
6718
- return __awaiter(this, void 0, void 0, function* () {
6719
- const asset = requirements.asset === "native" ? zeroAddress : requirements.asset;
6720
- const amount = BigInt(requirements.maxAmountRequired || 0);
6721
- const duration = requirements.extra.duration;
6722
- const domain = makeX402IntentDomain.call(this);
6723
- const types = X402_INTENT_TYPES;
6724
- const nonce = crypto.randomUUID();
6725
- const nonceBytes32 = keccak256(toBytes(nonce));
6726
- const payment = {
6727
- payer: payer,
6728
- asset: asset,
6729
- amount: amount.toString(),
6730
- httpMethod: "GET",
6731
- payTo: checksumAddress(this.environment.MARKETPLACE_CONTRACT_ADDRESS),
6732
- tokenId: requirements.extra.tokenId,
6733
- duration: duration,
6734
- expiresAt: Math.floor(Date.now() / 1000) + requirements.maxTimeoutSeconds,
6735
- nonce: nonceBytes32,
6736
- };
6737
- const signerAdapter = createSignerAdapter(signer);
6738
- const signature = yield signerAdapter.signTypedData(domain, types, payment);
6739
- const x402Payload = {
6740
- x402Version: 1,
6741
- scheme: "exact",
6742
- network: requirements.network,
6743
- payload: Object.assign(Object.assign({}, payment), { sigType: "eip712", signature: signature, license: {
6744
- tokenId: requirements.extra.tokenId,
6745
- duration: duration,
6746
- } }),
6747
- };
6748
- return x402Payload;
6749
- });
6513
+ function isApprovedForAll(owner, operator) {
6514
+ return this.callContractMethod(this.environment.DATANFT_CONTRACT_ADDRESS, this.environment.IPNFT_ABI, "isApprovedForAll", [owner, operator]);
6515
+ }
6516
+
6517
+ function transferFrom(from, to, tokenId) {
6518
+ return this.callContractMethod(this.environment.DATANFT_CONTRACT_ADDRESS, this.environment.IPNFT_ABI, "transferFrom", [from, to, tokenId]);
6519
+ }
6520
+
6521
+ function safeTransferFrom(from, to, tokenId, data) {
6522
+ const args = data ? [from, to, tokenId, data] : [from, to, tokenId];
6523
+ return this.callContractMethod(this.environment.DATANFT_CONTRACT_ADDRESS, this.environment.IPNFT_ABI, "safeTransferFrom", args);
6524
+ }
6525
+
6526
+ function approve(to, tokenId) {
6527
+ return this.callContractMethod(this.environment.DATANFT_CONTRACT_ADDRESS, this.environment.IPNFT_ABI, "approve", [to, tokenId]);
6528
+ }
6529
+
6530
+ function setApprovalForAll(operator, approved) {
6531
+ return this.callContractMethod(this.environment.DATANFT_CONTRACT_ADDRESS, this.environment.IPNFT_ABI, "setApprovalForAll", [operator, approved]);
6750
6532
  }
6533
+
6751
6534
  /**
6752
- * Create the X402 Intent domain for EIP-712 signing.
6753
- * @private
6535
+ * Buys access to a data NFT for a specified duration.
6536
+ * @param buyer The address of the buyer.
6537
+ * @param tokenId The ID of the data NFT.
6538
+ * @param expectedPrice The expected price for the access.
6539
+ * @param expectedDuration The expected duration of the access in seconds.
6540
+ * @param expectedPaymentToken The address of the payment token (use zero address for native token).
6541
+ * @param expectedProtocolFeeBps The expected protocol fee in basis points (0-10000). Defaults to 0.
6542
+ * @param expectedAppFeeBps The expected app fee in basis points (0-10000). Defaults to 0.
6543
+ * @param value The amount of native token to send (only required if paying with native token).
6544
+ * @returns A promise that resolves when the transaction is confirmed.
6754
6545
  */
6755
- function makeX402IntentDomain() {
6756
- return {
6757
- name: "Origin X402 Intent",
6758
- version: "1",
6759
- chainId: this.environment.CHAIN.id,
6760
- verifyingContract: this.environment
6761
- .MARKETPLACE_CONTRACT_ADDRESS,
6762
- };
6546
+ function buyAccess(buyer, tokenId, expectedPrice, expectedDuration, expectedPaymentToken, expectedProtocolFeeBps = 0, expectedAppFeeBps = 0, value // only for native token payments
6547
+ ) {
6548
+ return this.callContractMethod(this.environment.MARKETPLACE_CONTRACT_ADDRESS, this.environment.MARKETPLACE_ABI, "buyAccess", [
6549
+ buyer,
6550
+ tokenId,
6551
+ expectedPrice,
6552
+ expectedDuration,
6553
+ expectedPaymentToken,
6554
+ expectedProtocolFeeBps,
6555
+ expectedAppFeeBps,
6556
+ ], { waitForReceipt: true, value });
6763
6557
  }
6558
+
6764
6559
  /**
6765
- * Get the current account address.
6766
- * @private
6560
+ * Checks if a user has access to a specific token based on subscription expiry.
6561
+ * @param user - The address of the user.
6562
+ * @param tokenId - The ID of the token.
6563
+ * @returns A promise that resolves to a boolean indicating if the user has access.
6767
6564
  */
6768
- function getCurrentAccount() {
6565
+ function hasAccess(user, tokenId) {
6769
6566
  return __awaiter(this, void 0, void 0, function* () {
6770
- const viemClient = this.viemClient;
6771
- if (!viemClient) {
6772
- throw new WalletError("No wallet connected. Please connect a wallet to perform this action.");
6773
- }
6774
- // If account is already set on the client, return it directly
6775
- if (viemClient.account) {
6776
- return viemClient.account.address;
6567
+ try {
6568
+ const expiryTimestamp = yield this.subscriptionExpiry(tokenId, user);
6569
+ const currentTimestamp = BigInt(Math.floor(Date.now() / 1000));
6570
+ return expiryTimestamp > currentTimestamp;
6777
6571
  }
6778
- // Otherwise request accounts (browser wallet flow)
6779
- const accounts = yield viemClient.request({
6780
- method: "eth_requestAccounts",
6781
- params: [],
6782
- });
6783
- if (!accounts || accounts.length === 0) {
6784
- throw new WalletError("No accounts found in connected wallet. Please unlock your wallet or add an account.");
6572
+ catch (error) {
6573
+ return false;
6785
6574
  }
6786
- return accounts[0];
6787
6575
  });
6788
6576
  }
6789
6577
 
6578
+ function subscriptionExpiry(tokenId, user) {
6579
+ return this.callContractMethod(this.environment.MARKETPLACE_CONTRACT_ADDRESS, this.environment.MARKETPLACE_ABI, "subscriptionExpiry", [tokenId, user]);
6580
+ }
6581
+
6790
6582
  /**
6791
6583
  * Raises a dispute against an IP NFT.
6792
6584
  * Automatically handles token approval for ERC20 bonds or native token value.
@@ -6972,17 +6764,65 @@ function base (ALPHABET) {
6972
6764
  var ALPHABET = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz';
6973
6765
  var bs58 = base(ALPHABET);
6974
6766
 
6767
+ // RFC 4648 base32 alphabet (lowercase)
6768
+ const BASE32_ALPHABET = "abcdefghijklmnopqrstuvwxyz234567";
6769
+ function base32Decode(str) {
6770
+ const lookup = {};
6771
+ for (let i = 0; i < BASE32_ALPHABET.length; i++) {
6772
+ lookup[BASE32_ALPHABET[i]] = i;
6773
+ }
6774
+ let bits = 0;
6775
+ let value = 0;
6776
+ const result = [];
6777
+ for (const char of str.toLowerCase()) {
6778
+ if (!(char in lookup)) {
6779
+ throw new Error(`Invalid base32 character: ${char}`);
6780
+ }
6781
+ value = (value << 5) | lookup[char];
6782
+ bits += 5;
6783
+ if (bits >= 8) {
6784
+ bits -= 8;
6785
+ result.push((value >> bits) & 0xff);
6786
+ }
6787
+ }
6788
+ return new Uint8Array(result);
6789
+ }
6975
6790
  /**
6976
- * Encode CIDv0 to bytes32 by stripping the 0x1220 multihash prefix.
6977
- * Only works with CIDv0 (SHA-256 hash, starts with "Qm").
6791
+ * Encode a CID to bytes32 by extracting the 32-byte SHA-256 digest.
6792
+ * Supports both CIDv0 (starts with "Qm") and CIDv1 (starts with "bafy").
6978
6793
  */
6979
6794
  function encodeCidToBytes32(cid) {
6980
- const decoded = bs58.decode(cid);
6981
- if (decoded[0] !== 0x12 || decoded[1] !== 0x20 || decoded.length !== 34) {
6982
- throw new Error("Only CIDv0 with SHA-256 is supported");
6795
+ let digest;
6796
+ if (cid.startsWith("Qm")) {
6797
+ // CIDv0: base58-encoded multihash (0x1220 + 32-byte digest)
6798
+ const decoded = bs58.decode(cid);
6799
+ if (decoded[0] !== 0x12 || decoded[1] !== 0x20 || decoded.length !== 34) {
6800
+ throw new Error("Invalid CIDv0: expected SHA-256 multihash");
6801
+ }
6802
+ digest = decoded.slice(2);
6803
+ }
6804
+ else if (cid.startsWith("b")) {
6805
+ // CIDv1: multibase 'b' prefix + base32-encoded (version + codec + multihash)
6806
+ const decoded = base32Decode(cid.slice(1));
6807
+ // CIDv1 structure: version (1 byte) + codec (varint) + multihash
6808
+ // For raw codec with sha2-256: 0x01 + 0x55 + 0x12 + 0x20 + 32-byte digest
6809
+ // For dag-pb with sha2-256: 0x01 + 0x70 + 0x12 + 0x20 + 32-byte digest
6810
+ if (decoded[0] !== 0x01 || decoded.length !== 36) {
6811
+ throw new Error("Invalid CIDv1: expected version 1 with 36 bytes");
6812
+ }
6813
+ const codec = decoded[1];
6814
+ if (codec !== 0x55 && codec !== 0x70) {
6815
+ throw new Error(`Invalid CIDv1: unsupported codec 0x${codec.toString(16)}`);
6816
+ }
6817
+ if (decoded[2] !== 0x12 || decoded[3] !== 0x20) {
6818
+ throw new Error("Invalid CIDv1: expected SHA-256 hash");
6819
+ }
6820
+ digest = decoded.slice(4);
6821
+ }
6822
+ else {
6823
+ throw new Error("Unsupported CID format: must start with 'Qm' or 'b'");
6983
6824
  }
6984
- // Return only the 32-byte digest (skip 0x1220 prefix)
6985
- return `0x${Buffer.from(decoded.slice(2)).toString("hex")}`;
6825
+ return `0x${Buffer.from(digest).toString("hex")}`;
6986
6826
  }
6987
6827
 
6988
6828
  /**
@@ -7207,6 +7047,113 @@ function getDispute(disputeId) {
7207
7047
  });
7208
7048
  }
7209
7049
 
7050
+ /**
7051
+ * Resolves a wallet address from an optional address parameter or connected wallet.
7052
+ * Checks viemClient.account first, then falls back to eth_requestAccounts.
7053
+ *
7054
+ * @param viemClient The viem WalletClient instance.
7055
+ * @param address Optional address to use directly.
7056
+ * @returns The resolved wallet address.
7057
+ * @throws Error if no address provided and no wallet connected or no accounts found.
7058
+ */
7059
+ function resolveWalletAddress(viemClient, address) {
7060
+ return __awaiter(this, void 0, void 0, function* () {
7061
+ if (address) {
7062
+ return address;
7063
+ }
7064
+ if (!viemClient) {
7065
+ throw new Error("No address provided and no wallet connected. Please provide an address or connect a wallet.");
7066
+ }
7067
+ if (viemClient.account) {
7068
+ return viemClient.account.address;
7069
+ }
7070
+ const accounts = yield viemClient.request({
7071
+ method: "eth_requestAccounts",
7072
+ params: [],
7073
+ });
7074
+ if (!accounts || accounts.length === 0) {
7075
+ throw new Error("No accounts found in connected wallet.");
7076
+ }
7077
+ return accounts[0];
7078
+ });
7079
+ }
7080
+ /**
7081
+ * Enum representing the type of license for an IP NFT.
7082
+ * - DURATION_BASED: License expires after a set duration (subscription model).
7083
+ * - SINGLE_PAYMENT: One-time payment for perpetual access.
7084
+ * - X402: HTTP 402-based micropayment license (no on-chain payments).
7085
+ */
7086
+ var LicenseType;
7087
+ (function (LicenseType) {
7088
+ LicenseType[LicenseType["DURATION_BASED"] = 0] = "DURATION_BASED";
7089
+ LicenseType[LicenseType["SINGLE_PAYMENT"] = 1] = "SINGLE_PAYMENT";
7090
+ LicenseType[LicenseType["X402"] = 2] = "X402";
7091
+ })(LicenseType || (LicenseType = {}));
7092
+ /**
7093
+ * Enum representing the status of data in the system.
7094
+ * - ACTIVE: The data is currently active and available.
7095
+ * - DELETED: The data has been deleted and is no longer available.
7096
+ * - DISPUTED: The data has been disputed and marked as potentially infringing.
7097
+ */
7098
+ var DataStatus;
7099
+ (function (DataStatus) {
7100
+ DataStatus[DataStatus["ACTIVE"] = 0] = "ACTIVE";
7101
+ DataStatus[DataStatus["DELETED"] = 1] = "DELETED";
7102
+ DataStatus[DataStatus["DISPUTED"] = 2] = "DISPUTED";
7103
+ })(DataStatus || (DataStatus = {}));
7104
+ /**
7105
+ * Enum representing the status of a dispute.
7106
+ * - Uninitialized: Dispute does not exist.
7107
+ * - Raised: Dispute has been raised but not yet asserted by IP owner.
7108
+ * - Asserted: IP owner has responded to the dispute.
7109
+ * - Resolved: Dispute has been resolved (either valid or invalid).
7110
+ * - Cancelled: Dispute was cancelled by the initiator.
7111
+ */
7112
+ var DisputeStatus;
7113
+ (function (DisputeStatus) {
7114
+ DisputeStatus[DisputeStatus["Uninitialized"] = 0] = "Uninitialized";
7115
+ DisputeStatus[DisputeStatus["Raised"] = 1] = "Raised";
7116
+ DisputeStatus[DisputeStatus["Asserted"] = 2] = "Asserted";
7117
+ DisputeStatus[DisputeStatus["Resolved"] = 3] = "Resolved";
7118
+ DisputeStatus[DisputeStatus["Cancelled"] = 4] = "Cancelled";
7119
+ })(DisputeStatus || (DisputeStatus = {}));
7120
+ /**
7121
+ * Creates license terms for a digital asset.
7122
+ * @param price The price of the asset in wei.
7123
+ * @param duration The duration of the license in seconds (use 0 for SINGLE_PAYMENT and X402).
7124
+ * @param royaltyBps The royalty percentage in basis points (0-10000).
7125
+ * @param paymentToken The address of the payment token (ERC20 / address(0) for native currency).
7126
+ * @param licenseType The type of license (defaults to DURATION_BASED).
7127
+ * @returns The created license terms.
7128
+ */
7129
+ const createLicenseTerms = (price, duration, royaltyBps, paymentToken, licenseType = LicenseType.DURATION_BASED) => {
7130
+ if (royaltyBps < constants.MIN_ROYALTY_BPS ||
7131
+ royaltyBps > constants.MAX_ROYALTY_BPS) {
7132
+ throw new Error(`Royalty basis points must be between ${constants.MIN_ROYALTY_BPS} and ${constants.MAX_ROYALTY_BPS}`);
7133
+ }
7134
+ if (licenseType === LicenseType.DURATION_BASED) {
7135
+ if (duration < constants.MIN_LICENSE_DURATION ||
7136
+ duration > constants.MAX_LICENSE_DURATION) {
7137
+ throw new Error(`Duration must be between ${constants.MIN_LICENSE_DURATION} and ${constants.MAX_LICENSE_DURATION} seconds for DURATION_BASED licenses`);
7138
+ }
7139
+ }
7140
+ else if ((licenseType === LicenseType.SINGLE_PAYMENT ||
7141
+ licenseType === LicenseType.X402) &&
7142
+ duration > 0) {
7143
+ throw new Error(`Duration must be 0 for ${LicenseType[licenseType]} licenses`);
7144
+ }
7145
+ if (price < constants.MIN_PRICE) {
7146
+ throw new Error(`Price must be at least ${constants.MIN_PRICE} wei`);
7147
+ }
7148
+ return {
7149
+ price,
7150
+ duration,
7151
+ royaltyBps,
7152
+ paymentToken,
7153
+ licenseType,
7154
+ };
7155
+ };
7156
+
7210
7157
  // minimal ABI for staking vault
7211
7158
  const STAKING_VAULT_ABI = [
7212
7159
  {
@@ -7972,7 +7919,7 @@ function approveIfNeeded(_a) {
7972
7919
  * ```
7973
7920
  */
7974
7921
  function bulkBuyAccess(buyer, purchases, value) {
7975
- return this.callContractMethod(this.environment.BATCH_PURCHASE_CONTRACT_ADDRESS, this.environment.BATCH_PURCHASE_ABI, "bulkBuyAccess", [buyer, purchases], { waitForReceipt: true, value });
7922
+ return this.callContractMethod(this.environment.BATCH_OPERATIONS_CONTRACT_ADDRESS, this.environment.BATCH_OPERATIONS_ABI, "bulkBuyAccess", [buyer, purchases], { waitForReceipt: true, value });
7976
7923
  }
7977
7924
  /**
7978
7925
  * Executes a fault-tolerant bulk purchase of multiple IP-NFT licenses.
@@ -7992,7 +7939,7 @@ function bulkBuyAccess(buyer, purchases, value) {
7992
7939
  * ```
7993
7940
  */
7994
7941
  function bulkBuyAccessTolerant(buyer, purchases, value) {
7995
- return this.callContractMethod(this.environment.BATCH_PURCHASE_CONTRACT_ADDRESS, this.environment.BATCH_PURCHASE_ABI, "bulkBuyAccessTolerant", [buyer, purchases], { waitForReceipt: true, value });
7942
+ return this.callContractMethod(this.environment.BATCH_OPERATIONS_CONTRACT_ADDRESS, this.environment.BATCH_OPERATIONS_ABI, "bulkBuyAccessTolerant", [buyer, purchases], { waitForReceipt: true, value });
7996
7943
  }
7997
7944
  /**
7998
7945
  * Previews the total cost of purchasing multiple IP-NFT licenses.
@@ -8009,7 +7956,7 @@ function bulkBuyAccessTolerant(buyer, purchases, value) {
8009
7956
  * ```
8010
7957
  */
8011
7958
  function previewBulkCost(tokenIds) {
8012
- return this.callContractMethod(this.environment.BATCH_PURCHASE_CONTRACT_ADDRESS, this.environment.BATCH_PURCHASE_ABI, "previewBulkCost", [tokenIds]);
7959
+ return this.callContractMethod(this.environment.BATCH_OPERATIONS_CONTRACT_ADDRESS, this.environment.BATCH_OPERATIONS_ABI, "previewBulkCost", [tokenIds]);
8013
7960
  }
8014
7961
  /**
8015
7962
  * Builds purchase parameters for multiple tokens by fetching their current license terms.
@@ -8025,7 +7972,7 @@ function previewBulkCost(tokenIds) {
8025
7972
  * ```
8026
7973
  */
8027
7974
  function buildPurchaseParams(tokenIds) {
8028
- return this.callContractMethod(this.environment.BATCH_PURCHASE_CONTRACT_ADDRESS, this.environment.BATCH_PURCHASE_ABI, "buildPurchaseParams", [tokenIds]);
7975
+ return this.callContractMethod(this.environment.BATCH_OPERATIONS_CONTRACT_ADDRESS, this.environment.BATCH_OPERATIONS_ABI, "buildPurchaseParams", [tokenIds]);
8029
7976
  }
8030
7977
  /**
8031
7978
  * Checks the active status of multiple tokens.
@@ -8040,7 +7987,7 @@ function buildPurchaseParams(tokenIds) {
8040
7987
  * ```
8041
7988
  */
8042
7989
  function checkActiveStatus(tokenIds) {
8043
- return this.callContractMethod(this.environment.BATCH_PURCHASE_CONTRACT_ADDRESS, this.environment.BATCH_PURCHASE_ABI, "checkActiveStatus", [tokenIds]);
7990
+ return this.callContractMethod(this.environment.BATCH_OPERATIONS_CONTRACT_ADDRESS, this.environment.BATCH_OPERATIONS_ABI, "checkActiveStatus", [tokenIds]);
8044
7991
  }
8045
7992
  /**
8046
7993
  * Smart bulk purchase that automatically fetches terms and handles the entire purchase flow.
@@ -8114,7 +8061,7 @@ function bulkBuyAccessSmart(tokenIds, options) {
8114
8061
  publicClient,
8115
8062
  tokenAddress: erc20.token,
8116
8063
  owner: buyer,
8117
- spender: this.environment.BATCH_PURCHASE_CONTRACT_ADDRESS,
8064
+ spender: this.environment.BATCH_OPERATIONS_CONTRACT_ADDRESS,
8118
8065
  amount: erc20.amount,
8119
8066
  chain: this.environment.CHAIN,
8120
8067
  });
@@ -8129,6 +8076,53 @@ function bulkBuyAccessSmart(tokenIds, options) {
8129
8076
  });
8130
8077
  }
8131
8078
 
8079
+ /**
8080
+ * Executes an atomic bulk mint of multiple IP-NFTs.
8081
+ * All mints succeed or all fail together.
8082
+ *
8083
+ * @param mints Array of mint parameters for each token.
8084
+ * @returns A promise that resolves with the transaction result.
8085
+ *
8086
+ * @example
8087
+ * ```typescript
8088
+ * const mints = [
8089
+ * {
8090
+ * to: "0x...",
8091
+ * tokenId: 1n,
8092
+ * creatorContentHash: "0x...",
8093
+ * uri: "ipfs://...",
8094
+ * licenseTerms: { price: 1000n, duration: 86400, royaltyBps: 500, paymentToken: zeroAddress, licenseType: 0 },
8095
+ * deadline: BigInt(Date.now() + 600000),
8096
+ * parents: [],
8097
+ * isIP: true,
8098
+ * appId: "myApp",
8099
+ * signature: "0x...",
8100
+ * },
8101
+ * ];
8102
+ * await origin.bulkMint(mints);
8103
+ * ```
8104
+ */
8105
+ function bulkMint(mints) {
8106
+ return this.callContractMethod(this.environment.BATCH_OPERATIONS_CONTRACT_ADDRESS, this.environment.BATCH_OPERATIONS_ABI, "bulkMint", [mints], { waitForReceipt: true });
8107
+ }
8108
+ /**
8109
+ * Executes a fault-tolerant bulk mint of multiple IP-NFTs.
8110
+ * Individual mints can fail without reverting the entire transaction.
8111
+ *
8112
+ * @param mints Array of mint parameters for each token.
8113
+ * @returns A promise that resolves with the tolerant mint result including success/failure counts.
8114
+ *
8115
+ * @example
8116
+ * ```typescript
8117
+ * const result = await origin.bulkMintTolerant(mints);
8118
+ * console.log(`Minted ${result.successCount} of ${mints.length} tokens`);
8119
+ * console.log(`Failed tokens: ${result.failedTokenIds}`);
8120
+ * ```
8121
+ */
8122
+ function bulkMintTolerant(mints) {
8123
+ return this.callContractMethod(this.environment.BATCH_OPERATIONS_CONTRACT_ADDRESS, this.environment.BATCH_OPERATIONS_ABI, "bulkMintTolerant", [mints], { waitForReceipt: true });
8124
+ }
8125
+
8132
8126
  var _Origin_instances, _Origin_generateURL, _Origin_setOriginStatus, _Origin_uploadToIPFS, _Origin_uploadFile, _Origin_waitForTxReceipt, _Origin_ensureChainId, _Origin_getCurrentAccount, _Origin_getProtocolFeeBps, _Origin_getAppFeeBpsForToken, _Origin_resolveWalletAddress;
8133
8127
  /**
8134
8128
  * The Origin class
@@ -8148,8 +8142,6 @@ class Origin {
8148
8142
  typeof environment === "string"
8149
8143
  ? ENVIRONMENTS[environment]
8150
8144
  : environment || ENVIRONMENTS["DEVELOPMENT"];
8151
- this.environment.AUTH_HUB_BASE_API +=
8152
- environment === "PRODUCTION" ? "/auth-mainnet" : "";
8153
8145
  this.baseParentId = baseParentId;
8154
8146
  this.appId = appId;
8155
8147
  // DataNFT methods
@@ -8172,8 +8164,6 @@ class Origin {
8172
8164
  this.buyAccess = buyAccess.bind(this);
8173
8165
  this.hasAccess = hasAccess.bind(this);
8174
8166
  this.subscriptionExpiry = subscriptionExpiry.bind(this);
8175
- this.settlePaymentIntent = settlePaymentIntent.bind(this);
8176
- this.getDataWithIntent = getDataWithIntent.bind(this);
8177
8167
  // Bulk purchase methods
8178
8168
  this.bulkBuyAccess = bulkBuyAccess.bind(this);
8179
8169
  this.bulkBuyAccessTolerant = bulkBuyAccessTolerant.bind(this);
@@ -8181,6 +8171,9 @@ class Origin {
8181
8171
  this.previewBulkCost = previewBulkCost.bind(this);
8182
8172
  this.buildPurchaseParams = buildPurchaseParams.bind(this);
8183
8173
  this.checkActiveStatus = checkActiveStatus.bind(this);
8174
+ // Bulk mint methods
8175
+ this.bulkMint = bulkMint.bind(this);
8176
+ this.bulkMintTolerant = bulkMintTolerant.bind(this);
8184
8177
  // Dispute module methods
8185
8178
  this.raiseDispute = raiseDispute.bind(this);
8186
8179
  this.raiseDisputeSmart = raiseDisputeSmart.bind(this);
@@ -8334,6 +8327,152 @@ class Origin {
8334
8327
  return tokenId.toString();
8335
8328
  });
8336
8329
  }
8330
+ /**
8331
+ * Mints multiple file-based IpNFTs in a single transaction using the BatchOperations contract.
8332
+ * Each file is uploaded and registered individually, then all mints are batched into one on-chain call.
8333
+ *
8334
+ * @param entries Array of file entries to mint, each containing a file, metadata, license terms, and optional parents/preview.
8335
+ * @param options Optional configuration including tolerant mode and progress callback.
8336
+ * @returns A promise that resolves with an array of token ID strings for each entry, and the transaction result.
8337
+ *
8338
+ * @example
8339
+ * ```typescript
8340
+ * const result = await origin.bulkMintFile([
8341
+ * { file: file1, metadata: { name: "Asset 1" }, license: myLicense },
8342
+ * { file: file2, metadata: { name: "Asset 2" }, license: myLicense },
8343
+ * ]);
8344
+ * console.log(`Minted token IDs: ${result.tokenIds}`);
8345
+ *
8346
+ * // Tolerant mode - continue even if some mints fail
8347
+ * const result = await origin.bulkMintFile(entries, { tolerant: true });
8348
+ * ```
8349
+ */
8350
+ bulkMintFile(entries, options) {
8351
+ return __awaiter(this, void 0, void 0, function* () {
8352
+ var _a, _b;
8353
+ if (!entries || entries.length === 0) {
8354
+ throw new ValidationError("No file entries provided for bulk mint. Please provide at least one entry.");
8355
+ }
8356
+ let account = null;
8357
+ try {
8358
+ account = yield __classPrivateFieldGet(this, _Origin_instances, "m", _Origin_getCurrentAccount).call(this);
8359
+ }
8360
+ catch (error) {
8361
+ throw new WalletError("Cannot bulk mint files: wallet not connected. Please connect a wallet first.");
8362
+ }
8363
+ const mintParams = [];
8364
+ const tokenIds = [];
8365
+ const uploadInfos = [];
8366
+ for (let i = 0; i < entries.length; i++) {
8367
+ const entry = entries[i];
8368
+ const { file, metadata, license } = entry;
8369
+ let { parents } = entry;
8370
+ // Upload file
8371
+ let info;
8372
+ try {
8373
+ info = yield __classPrivateFieldGet(this, _Origin_instances, "m", _Origin_uploadFile).call(this, file, {
8374
+ progressCallback: (percent) => {
8375
+ var _a;
8376
+ (_a = options === null || options === void 0 ? void 0 : options.progressCallback) === null || _a === void 0 ? void 0 : _a.call(options, {
8377
+ fileIndex: i,
8378
+ fileCount: entries.length,
8379
+ stage: "uploading",
8380
+ percent,
8381
+ });
8382
+ },
8383
+ });
8384
+ if (!info || !info.key) {
8385
+ throw new APIError(`Failed to upload file "${file.name}": no upload info returned from server`);
8386
+ }
8387
+ }
8388
+ catch (error) {
8389
+ if (error instanceof APIError || error instanceof WalletError)
8390
+ throw error;
8391
+ throw new APIError(`Failed to upload file "${file.name}": ${getErrorMessage(error)}`);
8392
+ }
8393
+ uploadInfos.push(info);
8394
+ // Set mimetype
8395
+ if (file.type) {
8396
+ metadata.mimetype = file.type;
8397
+ }
8398
+ // Handle preview image
8399
+ let previewImageIpfsHash = null;
8400
+ if (entry.previewImage && entry.previewImage.type.startsWith("image/")) {
8401
+ previewImageIpfsHash = yield __classPrivateFieldGet(this, _Origin_instances, "m", _Origin_uploadToIPFS).call(this, entry.previewImage);
8402
+ }
8403
+ else if (entry.useAssetAsPreview && file.type.startsWith("image/")) {
8404
+ previewImageIpfsHash = yield __classPrivateFieldGet(this, _Origin_instances, "m", _Origin_uploadToIPFS).call(this, file);
8405
+ }
8406
+ if (previewImageIpfsHash) {
8407
+ metadata.image = `ipfs://${previewImageIpfsHash}`;
8408
+ }
8409
+ const deadline = BigInt(Date.now() + 600000); // 10 minutes from now
8410
+ // Prepare parents
8411
+ if (this.baseParentId) {
8412
+ if (!parents) {
8413
+ parents = [];
8414
+ }
8415
+ parents = [this.baseParentId, ...parents];
8416
+ }
8417
+ // Register IpNFT to get signature
8418
+ (_a = options === null || options === void 0 ? void 0 : options.progressCallback) === null || _a === void 0 ? void 0 : _a.call(options, {
8419
+ fileIndex: i,
8420
+ fileCount: entries.length,
8421
+ stage: "registering",
8422
+ percent: 100,
8423
+ });
8424
+ let registration;
8425
+ try {
8426
+ registration = yield this.registerIpNFT("file", deadline, license, metadata, true, // isIp
8427
+ info.key, // fileKey
8428
+ parents, this.appId);
8429
+ }
8430
+ catch (error) {
8431
+ yield __classPrivateFieldGet(this, _Origin_instances, "m", _Origin_setOriginStatus).call(this, info.key, info.uploadId, []);
8432
+ throw new Error(`Failed to register IpNFT for file "${file.name}": ${error instanceof Error ? error.message : String(error)}`);
8433
+ }
8434
+ const { tokenId, creatorContentHash, signature, uri } = registration;
8435
+ if (!tokenId || !creatorContentHash || signature === undefined || !uri) {
8436
+ yield __classPrivateFieldGet(this, _Origin_instances, "m", _Origin_setOriginStatus).call(this, info.key, info.uploadId, []);
8437
+ throw new Error(`Failed to register IpNFT for file "${file.name}": Missing required fields in registration response.`);
8438
+ }
8439
+ tokenIds.push(tokenId.toString());
8440
+ mintParams.push({
8441
+ to: account,
8442
+ tokenId: BigInt(tokenId),
8443
+ creatorContentHash: creatorContentHash,
8444
+ uri,
8445
+ licenseTerms: license,
8446
+ deadline,
8447
+ parents: parents || [],
8448
+ isIP: true,
8449
+ appId: (_b = this.appId) !== null && _b !== void 0 ? _b : "",
8450
+ signature: signature,
8451
+ });
8452
+ }
8453
+ // Execute bulk mint
8454
+ try {
8455
+ let result;
8456
+ if (options === null || options === void 0 ? void 0 : options.tolerant) {
8457
+ result = yield this.bulkMintTolerant(mintParams);
8458
+ }
8459
+ else {
8460
+ result = yield this.bulkMint(mintParams);
8461
+ }
8462
+ return { tokenIds, result };
8463
+ }
8464
+ catch (error) {
8465
+ // Mark all uploads as failed
8466
+ for (const info of uploadInfos) {
8467
+ try {
8468
+ yield __classPrivateFieldGet(this, _Origin_instances, "m", _Origin_setOriginStatus).call(this, info.key, info.uploadId, []);
8469
+ }
8470
+ catch (_c) { }
8471
+ }
8472
+ throw new Error(`Bulk mint transaction failed: ${error instanceof Error ? error.message : String(error)}`);
8473
+ }
8474
+ });
8475
+ }
8337
8476
  /**
8338
8477
  * Mints a social IpNFT.
8339
8478
  * @param source The social media source (spotify, twitter, tiktok).
@@ -9071,6 +9210,179 @@ _Origin_instances = new WeakSet(), _Origin_generateURL = function _Origin_genera
9071
9210
  });
9072
9211
  };
9073
9212
 
9213
+ /**
9214
+ * Adapter for viem WalletClient
9215
+ */
9216
+ class ViemSignerAdapter {
9217
+ constructor(signer) {
9218
+ this.type = "viem";
9219
+ this.signer = signer;
9220
+ }
9221
+ getAddress() {
9222
+ return __awaiter(this, void 0, void 0, function* () {
9223
+ if (this.signer.account) {
9224
+ return this.signer.account.address;
9225
+ }
9226
+ const accounts = yield this.signer.request({
9227
+ method: "eth_requestAccounts",
9228
+ params: [],
9229
+ });
9230
+ if (!accounts || accounts.length === 0) {
9231
+ throw new Error("No accounts found in viem wallet client");
9232
+ }
9233
+ return accounts[0];
9234
+ });
9235
+ }
9236
+ signMessage(message) {
9237
+ return __awaiter(this, void 0, void 0, function* () {
9238
+ const address = yield this.getAddress();
9239
+ return yield this.signer.signMessage({
9240
+ account: address,
9241
+ message,
9242
+ });
9243
+ });
9244
+ }
9245
+ signTypedData(domain, types, value) {
9246
+ return __awaiter(this, void 0, void 0, function* () {
9247
+ throw new Error("Viem WalletClient does not support signTypedData");
9248
+ });
9249
+ }
9250
+ getChainId() {
9251
+ return __awaiter(this, void 0, void 0, function* () {
9252
+ var _a;
9253
+ return ((_a = this.signer.chain) === null || _a === void 0 ? void 0 : _a.id) || 1;
9254
+ });
9255
+ }
9256
+ }
9257
+ /**
9258
+ * Adapter for ethers Signer (v5 and v6)
9259
+ */
9260
+ class EthersSignerAdapter {
9261
+ constructor(signer) {
9262
+ this.type = "ethers";
9263
+ this.signer = signer;
9264
+ }
9265
+ getAddress() {
9266
+ return __awaiter(this, void 0, void 0, function* () {
9267
+ // Works for both ethers v5 and v6
9268
+ if (typeof this.signer.getAddress === "function") {
9269
+ return yield this.signer.getAddress();
9270
+ }
9271
+ if (this.signer.address) {
9272
+ return this.signer.address;
9273
+ }
9274
+ throw new Error("Unable to get address from ethers signer");
9275
+ });
9276
+ }
9277
+ signMessage(message) {
9278
+ return __awaiter(this, void 0, void 0, function* () {
9279
+ if (typeof this.signer.signMessage !== "function") {
9280
+ throw new Error("Signer does not support signMessage");
9281
+ }
9282
+ return yield this.signer.signMessage(message);
9283
+ });
9284
+ }
9285
+ signTypedData(domain, types, value) {
9286
+ return __awaiter(this, void 0, void 0, function* () {
9287
+ if (typeof this.signer._signTypedData === "function") {
9288
+ return yield this.signer._signTypedData(domain, types, value);
9289
+ }
9290
+ if (typeof this.signer.signTypedData !== "function") {
9291
+ throw new Error("Signer does not support signTypedData or _signTypedData");
9292
+ }
9293
+ return yield this.signer.signTypedData(domain, types, value);
9294
+ });
9295
+ }
9296
+ getChainId() {
9297
+ return __awaiter(this, void 0, void 0, function* () {
9298
+ // Try ethers v6 first
9299
+ if (this.signer.provider &&
9300
+ typeof this.signer.provider.getNetwork === "function") {
9301
+ const network = yield this.signer.provider.getNetwork();
9302
+ // ethers v6 returns bigint, v5 returns number
9303
+ return typeof network.chainId === "bigint"
9304
+ ? Number(network.chainId)
9305
+ : network.chainId;
9306
+ }
9307
+ // Fallback for ethers v5
9308
+ if (typeof this.signer.getChainId === "function") {
9309
+ return yield this.signer.getChainId();
9310
+ }
9311
+ // Default to mainnet if we can't determine
9312
+ return 484;
9313
+ });
9314
+ }
9315
+ }
9316
+ /**
9317
+ * Adapter for custom signer implementations
9318
+ */
9319
+ class CustomSignerAdapter {
9320
+ constructor(signer) {
9321
+ this.type = "custom";
9322
+ this.signer = signer;
9323
+ }
9324
+ getAddress() {
9325
+ return __awaiter(this, void 0, void 0, function* () {
9326
+ if (typeof this.signer.getAddress === "function") {
9327
+ return yield this.signer.getAddress();
9328
+ }
9329
+ if (this.signer.address) {
9330
+ return this.signer.address;
9331
+ }
9332
+ throw new Error("Custom signer must implement getAddress() or have address property");
9333
+ });
9334
+ }
9335
+ signMessage(message) {
9336
+ return __awaiter(this, void 0, void 0, function* () {
9337
+ if (typeof this.signer.signMessage !== "function") {
9338
+ throw new Error("Custom signer must implement signMessage()");
9339
+ }
9340
+ return yield this.signer.signMessage(message);
9341
+ });
9342
+ }
9343
+ signTypedData(domain, types, value) {
9344
+ return __awaiter(this, void 0, void 0, function* () {
9345
+ if (typeof this.signer.signTypedData !== "function") {
9346
+ throw new Error("Custom signer must implement signTypedData()");
9347
+ }
9348
+ return yield this.signer.signTypedData(domain, types, value);
9349
+ });
9350
+ }
9351
+ getChainId() {
9352
+ return __awaiter(this, void 0, void 0, function* () {
9353
+ if (typeof this.signer.getChainId === "function") {
9354
+ const chainId = yield this.signer.getChainId();
9355
+ return typeof chainId === "bigint" ? Number(chainId) : chainId;
9356
+ }
9357
+ if (this.signer.chainId !== undefined) {
9358
+ return typeof this.signer.chainId === "bigint"
9359
+ ? Number(this.signer.chainId)
9360
+ : this.signer.chainId;
9361
+ }
9362
+ // Default to mainnet
9363
+ return 484;
9364
+ });
9365
+ }
9366
+ }
9367
+ /**
9368
+ * Factory function to create appropriate adapter based on signer type
9369
+ */
9370
+ function createSignerAdapter(signer) {
9371
+ // Check for viem WalletClient
9372
+ if (signer.transport &&
9373
+ signer.chain &&
9374
+ typeof signer.signMessage === "function") {
9375
+ return new ViemSignerAdapter(signer);
9376
+ }
9377
+ // Check for ethers signer (v5 or v6)
9378
+ if (signer._isSigner ||
9379
+ (signer.provider && typeof signer.signMessage === "function")) {
9380
+ return new EthersSignerAdapter(signer);
9381
+ }
9382
+ // Try custom adapter
9383
+ return new CustomSignerAdapter(signer);
9384
+ }
9385
+
9074
9386
  /**
9075
9387
  * Browser localStorage adapter
9076
9388
  */
@@ -9185,8 +9497,6 @@ class Auth {
9185
9497
  (__classPrivateFieldGet(this, _Auth_isNodeEnvironment, "f") ? new MemoryStorage() : new BrowserStorage()), "f");
9186
9498
  this.viem = null;
9187
9499
  this.environment = ENVIRONMENTS[environment];
9188
- this.environment.AUTH_HUB_BASE_API +=
9189
- environment === "PRODUCTION" ? "/auth-mainnet" : "";
9190
9500
  this.baseParentId = baseParentId;
9191
9501
  this.redirectUri = createRedirectUriObject(redirectUri);
9192
9502
  this.clientId = clientId;