@fepvenancio/stela-sdk 0.7.1 → 0.8.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.
package/dist/index.cjs CHANGED
@@ -58,6 +58,10 @@ var ASSET_TYPE_NAMES = {
58
58
  2: "ERC1155",
59
59
  3: "ERC4626"
60
60
  };
61
+ var GRACE_PERIOD = 86400n;
62
+ var AUCTION_DURATION = 86400n;
63
+ var AUCTION_PENALTY_BPS = 500n;
64
+ var AUCTION_RESERVE_BPS = 1000n;
61
65
  var U128_MAX = (1n << 128n) - 1n;
62
66
  var U256_MAX = (1n << 256n) - 1n;
63
67
  var toU256 = (n) => {
@@ -568,6 +572,185 @@ function getBatchLendOfferTypedData(params) {
568
572
  }
569
573
  };
570
574
  }
575
+ function u256Message(value) {
576
+ return {
577
+ low: (value & (1n << 128n) - 1n).toString(),
578
+ high: (value >> 128n).toString()
579
+ };
580
+ }
581
+ var STARKNET_DOMAIN_TYPE = [
582
+ { name: "name", type: "shortstring" },
583
+ { name: "version", type: "shortstring" },
584
+ { name: "chainId", type: "shortstring" },
585
+ { name: "revision", type: "shortstring" }
586
+ ];
587
+ var U256_TYPE = [
588
+ { name: "low", type: "u128" },
589
+ { name: "high", type: "u128" }
590
+ ];
591
+ function getCollectionLendOfferTypedData(params) {
592
+ return {
593
+ types: {
594
+ StarknetDomain: STARKNET_DOMAIN_TYPE,
595
+ CollectionLendOffer: [
596
+ { name: "lender", type: "ContractAddress" },
597
+ { name: "debt_hash", type: "felt" },
598
+ { name: "interest_hash", type: "felt" },
599
+ { name: "debt_count", type: "u128" },
600
+ { name: "interest_count", type: "u128" },
601
+ { name: "collection_address", type: "ContractAddress" },
602
+ { name: "duration", type: "u128" },
603
+ { name: "deadline", type: "u128" },
604
+ { name: "nonce", type: "felt" }
605
+ ]
606
+ },
607
+ primaryType: "CollectionLendOffer",
608
+ domain: { ...STELA_DOMAIN, chainId: params.chainId },
609
+ message: {
610
+ lender: params.lender,
611
+ debt_hash: hashAssets(params.debtAssets),
612
+ interest_hash: hashAssets(params.interestAssets),
613
+ debt_count: params.debtCount.toString(),
614
+ interest_count: params.interestCount.toString(),
615
+ collection_address: params.collectionAddress,
616
+ duration: params.duration.toString(),
617
+ deadline: params.deadline.toString(),
618
+ nonce: params.nonce.toString()
619
+ }
620
+ };
621
+ }
622
+ function getCollectionBorrowAcceptanceTypedData(params) {
623
+ return {
624
+ types: {
625
+ StarknetDomain: STARKNET_DOMAIN_TYPE,
626
+ CollectionBorrowAcceptance: [
627
+ { name: "offer_hash", type: "felt" },
628
+ { name: "borrower", type: "ContractAddress" },
629
+ { name: "token_id", type: "u256" },
630
+ { name: "nonce", type: "felt" }
631
+ ],
632
+ u256: U256_TYPE
633
+ },
634
+ primaryType: "CollectionBorrowAcceptance",
635
+ domain: { ...STELA_DOMAIN, chainId: params.chainId },
636
+ message: {
637
+ offer_hash: params.offerHash,
638
+ borrower: params.borrower,
639
+ token_id: u256Message(params.tokenId),
640
+ nonce: params.nonce.toString()
641
+ }
642
+ };
643
+ }
644
+ function getRenegotiationProposalTypedData(params) {
645
+ return {
646
+ types: {
647
+ StarknetDomain: STARKNET_DOMAIN_TYPE,
648
+ RenegotiationProposal: [
649
+ { name: "inscription_id", type: "u256" },
650
+ { name: "proposer", type: "ContractAddress" },
651
+ { name: "new_duration", type: "u128" },
652
+ { name: "new_interest_hash", type: "felt" },
653
+ { name: "new_interest_count", type: "u128" },
654
+ { name: "proposal_deadline", type: "u128" },
655
+ { name: "nonce", type: "felt" }
656
+ ],
657
+ u256: U256_TYPE
658
+ },
659
+ primaryType: "RenegotiationProposal",
660
+ domain: { ...STELA_DOMAIN, chainId: params.chainId },
661
+ message: {
662
+ inscription_id: u256Message(params.inscriptionId),
663
+ proposer: params.proposer,
664
+ new_duration: params.newDuration.toString(),
665
+ new_interest_hash: hashAssets(params.newInterestAssets),
666
+ new_interest_count: params.newInterestCount.toString(),
667
+ proposal_deadline: params.proposalDeadline.toString(),
668
+ nonce: params.nonce.toString()
669
+ }
670
+ };
671
+ }
672
+ function getCollateralSaleOfferTypedData(params) {
673
+ return {
674
+ types: {
675
+ StarknetDomain: STARKNET_DOMAIN_TYPE,
676
+ CollateralSaleOffer: [
677
+ { name: "inscription_id", type: "u256" },
678
+ { name: "borrower", type: "ContractAddress" },
679
+ { name: "min_price", type: "u256" },
680
+ { name: "payment_token", type: "ContractAddress" },
681
+ { name: "allowed_buyer", type: "ContractAddress" },
682
+ { name: "deadline", type: "u128" },
683
+ { name: "nonce", type: "felt" }
684
+ ],
685
+ u256: U256_TYPE
686
+ },
687
+ primaryType: "CollateralSaleOffer",
688
+ domain: { ...STELA_DOMAIN, chainId: params.chainId },
689
+ message: {
690
+ inscription_id: u256Message(params.inscriptionId),
691
+ borrower: params.borrower,
692
+ min_price: u256Message(params.minPrice),
693
+ payment_token: params.paymentToken,
694
+ allowed_buyer: params.allowedBuyer,
695
+ deadline: params.deadline.toString(),
696
+ nonce: params.nonce.toString()
697
+ }
698
+ };
699
+ }
700
+ function getRefinanceOfferTypedData(params) {
701
+ return {
702
+ types: {
703
+ StarknetDomain: STARKNET_DOMAIN_TYPE,
704
+ RefinanceOffer: [
705
+ { name: "inscription_id", type: "u256" },
706
+ { name: "new_lender", type: "ContractAddress" },
707
+ { name: "new_debt_hash", type: "felt" },
708
+ { name: "new_interest_hash", type: "felt" },
709
+ { name: "new_debt_count", type: "u128" },
710
+ { name: "new_interest_count", type: "u128" },
711
+ { name: "new_duration", type: "u128" },
712
+ { name: "deadline", type: "u128" },
713
+ { name: "nonce", type: "felt" }
714
+ ],
715
+ u256: U256_TYPE
716
+ },
717
+ primaryType: "RefinanceOffer",
718
+ domain: { ...STELA_DOMAIN, chainId: params.chainId },
719
+ message: {
720
+ inscription_id: u256Message(params.inscriptionId),
721
+ new_lender: params.newLender,
722
+ new_debt_hash: hashAssets(params.newDebtAssets),
723
+ new_interest_hash: hashAssets(params.newInterestAssets),
724
+ new_debt_count: params.newDebtCount.toString(),
725
+ new_interest_count: params.newInterestCount.toString(),
726
+ new_duration: params.newDuration.toString(),
727
+ deadline: params.deadline.toString(),
728
+ nonce: params.nonce.toString()
729
+ }
730
+ };
731
+ }
732
+ function getRefinanceApprovalTypedData(params) {
733
+ return {
734
+ types: {
735
+ StarknetDomain: STARKNET_DOMAIN_TYPE,
736
+ RefinanceApproval: [
737
+ { name: "inscription_id", type: "u256" },
738
+ { name: "offer_hash", type: "felt" },
739
+ { name: "borrower", type: "ContractAddress" },
740
+ { name: "nonce", type: "felt" }
741
+ ],
742
+ u256: U256_TYPE
743
+ },
744
+ primaryType: "RefinanceApproval",
745
+ domain: { ...STELA_DOMAIN, chainId: params.chainId },
746
+ message: {
747
+ inscription_id: u256Message(params.inscriptionId),
748
+ offer_hash: params.offerHash,
749
+ borrower: params.borrower,
750
+ nonce: params.nonce.toString()
751
+ }
752
+ };
753
+ }
571
754
 
572
755
  // src/offchain/signature.ts
573
756
  function serializeSignature(sig) {
@@ -2611,6 +2794,155 @@ var InscriptionClient = class {
2611
2794
  calldata: [minNonce]
2612
2795
  };
2613
2796
  }
2797
+ // ── T1 Call Builders ─────────────────────────────────────────────────
2798
+ /** T1-2: Settle a collection-wide lend offer */
2799
+ buildSettleCollection(params) {
2800
+ const calldata = [
2801
+ // CollectionLendOffer struct (9 fields)
2802
+ params.offer.lender,
2803
+ params.offer.debtHash,
2804
+ params.offer.interestHash,
2805
+ String(params.offer.debtCount),
2806
+ String(params.offer.interestCount),
2807
+ params.offer.collectionAddress,
2808
+ params.offer.duration.toString(),
2809
+ params.offer.deadline.toString(),
2810
+ params.offer.nonce.toString(),
2811
+ // CollectionBorrowAcceptance struct (4 fields)
2812
+ params.acceptance.offerHash,
2813
+ params.acceptance.borrower,
2814
+ ...toU256(params.acceptance.tokenId),
2815
+ params.acceptance.nonce.toString(),
2816
+ // debt_assets array
2817
+ ...serializeAssets(params.debtAssets),
2818
+ // interest_assets array
2819
+ ...serializeAssets(params.interestAssets),
2820
+ // lender_sig array
2821
+ String(params.lenderSig.length),
2822
+ ...params.lenderSig,
2823
+ // borrower_sig array
2824
+ String(params.borrowerSig.length),
2825
+ ...params.borrowerSig
2826
+ ];
2827
+ return { contractAddress: this.address, entrypoint: "settle_collection", calldata };
2828
+ }
2829
+ /** T1-4: Commit a renegotiation proposal hash on-chain */
2830
+ buildCommitRenegotiation(inscriptionId, proposalHash) {
2831
+ return {
2832
+ contractAddress: this.address,
2833
+ entrypoint: "commit_renegotiation",
2834
+ calldata: [...toU256(inscriptionId), proposalHash]
2835
+ };
2836
+ }
2837
+ /** T1-4: Execute a committed renegotiation proposal */
2838
+ buildExecuteRenegotiation(params) {
2839
+ const calldata = [
2840
+ ...toU256(params.inscriptionId),
2841
+ // RenegotiationProposal struct (7 fields)
2842
+ ...toU256(params.proposal.inscriptionId),
2843
+ params.proposal.proposer,
2844
+ params.proposal.newDuration.toString(),
2845
+ params.proposal.newInterestHash,
2846
+ String(params.proposal.newInterestCount),
2847
+ params.proposal.proposalDeadline.toString(),
2848
+ params.proposal.nonce.toString(),
2849
+ // proposer_sig array
2850
+ String(params.proposerSig.length),
2851
+ ...params.proposerSig,
2852
+ // new_interest_assets array
2853
+ ...serializeAssets(params.newInterestAssets)
2854
+ ];
2855
+ return { contractAddress: this.address, entrypoint: "execute_renegotiation", calldata };
2856
+ }
2857
+ /** T1-5: Buy collateral from a borrower's sale offer */
2858
+ buildBuyCollateral(params) {
2859
+ const calldata = [
2860
+ ...toU256(params.inscriptionId),
2861
+ // CollateralSaleOffer struct (7 fields)
2862
+ ...toU256(params.offer.inscriptionId),
2863
+ params.offer.borrower,
2864
+ ...toU256(params.offer.minPrice),
2865
+ params.offer.paymentToken,
2866
+ params.offer.allowedBuyer,
2867
+ params.offer.deadline.toString(),
2868
+ params.offer.nonce.toString(),
2869
+ // borrower_sig array
2870
+ String(params.borrowerSig.length),
2871
+ ...params.borrowerSig,
2872
+ // sale_price
2873
+ ...toU256(params.salePrice)
2874
+ ];
2875
+ return { contractAddress: this.address, entrypoint: "buy_collateral", calldata };
2876
+ }
2877
+ /** T1-1: Refinance an existing loan with a new lender */
2878
+ buildRefinance(params) {
2879
+ const calldata = [
2880
+ // RefinanceOffer struct (9 fields)
2881
+ ...toU256(params.offer.inscriptionId),
2882
+ params.offer.newLender,
2883
+ params.offer.newDebtHash,
2884
+ params.offer.newInterestHash,
2885
+ String(params.offer.newDebtCount),
2886
+ String(params.offer.newInterestCount),
2887
+ params.offer.newDuration.toString(),
2888
+ params.offer.deadline.toString(),
2889
+ params.offer.nonce.toString(),
2890
+ // new_debt_assets array
2891
+ ...serializeAssets(params.newDebtAssets),
2892
+ // new_interest_assets array
2893
+ ...serializeAssets(params.newInterestAssets),
2894
+ // new_lender_sig array
2895
+ String(params.newLenderSig.length),
2896
+ ...params.newLenderSig,
2897
+ // RefinanceApproval struct (4 fields)
2898
+ ...toU256(params.approval.inscriptionId),
2899
+ params.approval.offerHash,
2900
+ params.approval.borrower,
2901
+ params.approval.nonce.toString(),
2902
+ // borrower_sig array
2903
+ String(params.borrowerSig.length),
2904
+ ...params.borrowerSig
2905
+ ];
2906
+ return { contractAddress: this.address, entrypoint: "refinance", calldata };
2907
+ }
2908
+ /** T1-3: Start a Dutch auction on an expired, unfilled inscription */
2909
+ buildStartAuction(inscriptionId) {
2910
+ return {
2911
+ contractAddress: this.address,
2912
+ entrypoint: "start_auction",
2913
+ calldata: [...toU256(inscriptionId)]
2914
+ };
2915
+ }
2916
+ /** T1-3: Bid on an active Dutch auction */
2917
+ buildBid(inscriptionId) {
2918
+ return {
2919
+ contractAddress: this.address,
2920
+ entrypoint: "bid",
2921
+ calldata: [...toU256(inscriptionId)]
2922
+ };
2923
+ }
2924
+ /** T1-3: Claim collateral after an auction expires with no bids */
2925
+ buildClaimCollateral(inscriptionId) {
2926
+ return {
2927
+ contractAddress: this.address,
2928
+ entrypoint: "claim_collateral",
2929
+ calldata: [...toU256(inscriptionId)]
2930
+ };
2931
+ }
2932
+ // ── T1 Read Methods ──────────────────────────────────────────────────
2933
+ /** T1-3: Get the current Dutch auction price for a specific debt asset */
2934
+ async getAuctionPrice(inscriptionId, debtIndex) {
2935
+ const result = await this.contract.call("get_auction_price", [
2936
+ ...toU256(inscriptionId),
2937
+ String(debtIndex)
2938
+ ]);
2939
+ return extractU256(result);
2940
+ }
2941
+ /** T1-3: Get the auction end timestamp */
2942
+ async getAuctionEndTime(inscriptionId) {
2943
+ const result = await this.contract.call("get_auction_end_time", toU256(inscriptionId));
2944
+ return BigInt(String(result[0] ?? "0"));
2945
+ }
2614
2946
  // ── Execute Methods ────────────────────────────────────────────────
2615
2947
  /**
2616
2948
  * Execute one or more calls via the connected account.
@@ -2652,6 +2984,35 @@ var InscriptionClient = class {
2652
2984
  async cancelOrdersByNonce(minNonce) {
2653
2985
  return this.execute([this.buildCancelOrdersByNonce(minNonce)]);
2654
2986
  }
2987
+ // ── T1 Execute Methods ───────────────────────────────────────────────
2988
+ async settleCollection(params) {
2989
+ return this.execute([this.buildSettleCollection(params)]);
2990
+ }
2991
+ async commitRenegotiation(inscriptionId, proposalHash) {
2992
+ return this.execute([this.buildCommitRenegotiation(inscriptionId, proposalHash)]);
2993
+ }
2994
+ async executeRenegotiation(params, approvals) {
2995
+ const calls = [...approvals ?? [], this.buildExecuteRenegotiation(params)];
2996
+ return this.execute(calls);
2997
+ }
2998
+ async buyCollateral(params, approvals) {
2999
+ const calls = [...approvals ?? [], this.buildBuyCollateral(params)];
3000
+ return this.execute(calls);
3001
+ }
3002
+ async refinance(params, approvals) {
3003
+ const calls = [...approvals ?? [], this.buildRefinance(params)];
3004
+ return this.execute(calls);
3005
+ }
3006
+ async startAuction(inscriptionId) {
3007
+ return this.execute([this.buildStartAuction(inscriptionId)]);
3008
+ }
3009
+ async bid(inscriptionId, approvals) {
3010
+ const calls = [...approvals ?? [], this.buildBid(inscriptionId)];
3011
+ return this.execute(calls);
3012
+ }
3013
+ async claimCollateral(inscriptionId) {
3014
+ return this.execute([this.buildClaimCollateral(inscriptionId)]);
3015
+ }
2655
3016
  };
2656
3017
  function serializeAssets(assets) {
2657
3018
  const calldata = [String(assets.length)];
@@ -2691,7 +3052,9 @@ function parseStoredInscription(result) {
2691
3052
  multi_lender: Boolean(get("multi_lender", 8)),
2692
3053
  debt_asset_count: Number(get("debt_asset_count", 9)),
2693
3054
  interest_asset_count: Number(get("interest_asset_count", 10)),
2694
- collateral_asset_count: Number(get("collateral_asset_count", 11))
3055
+ collateral_asset_count: Number(get("collateral_asset_count", 11)),
3056
+ auction_started: Boolean(get("auction_started", 12)),
3057
+ auction_start_time: BigInt(String(get("auction_start_time", 13) ?? "0"))
2695
3058
  };
2696
3059
  }
2697
3060
  function extractFieldU256(val) {
@@ -3023,10 +3386,14 @@ var StelaSdk = class {
3023
3386
 
3024
3387
  exports.ASSET_TYPE_ENUM = ASSET_TYPE_ENUM;
3025
3388
  exports.ASSET_TYPE_NAMES = ASSET_TYPE_NAMES;
3389
+ exports.AUCTION_DURATION = AUCTION_DURATION;
3390
+ exports.AUCTION_PENALTY_BPS = AUCTION_PENALTY_BPS;
3391
+ exports.AUCTION_RESERVE_BPS = AUCTION_RESERVE_BPS;
3026
3392
  exports.ApiClient = ApiClient;
3027
3393
  exports.ApiError = ApiError;
3028
3394
  exports.CHAIN_ID = CHAIN_ID;
3029
3395
  exports.EXPLORER_TX_URL = EXPLORER_TX_URL;
3396
+ exports.GRACE_PERIOD = GRACE_PERIOD;
3030
3397
  exports.InscriptionClient = InscriptionClient;
3031
3398
  exports.LockerClient = LockerClient;
3032
3399
  exports.MAX_BPS = MAX_BPS;
@@ -3050,8 +3417,14 @@ exports.formatTimestamp = formatTimestamp;
3050
3417
  exports.formatTokenValue = formatTokenValue;
3051
3418
  exports.fromU256 = fromU256;
3052
3419
  exports.getBatchLendOfferTypedData = getBatchLendOfferTypedData;
3420
+ exports.getCollateralSaleOfferTypedData = getCollateralSaleOfferTypedData;
3421
+ exports.getCollectionBorrowAcceptanceTypedData = getCollectionBorrowAcceptanceTypedData;
3422
+ exports.getCollectionLendOfferTypedData = getCollectionLendOfferTypedData;
3053
3423
  exports.getInscriptionOrderTypedData = getInscriptionOrderTypedData;
3054
3424
  exports.getLendOfferTypedData = getLendOfferTypedData;
3425
+ exports.getRefinanceApprovalTypedData = getRefinanceApprovalTypedData;
3426
+ exports.getRefinanceOfferTypedData = getRefinanceOfferTypedData;
3427
+ exports.getRenegotiationProposalTypedData = getRenegotiationProposalTypedData;
3055
3428
  exports.getTokensForNetwork = getTokensForNetwork;
3056
3429
  exports.hashAssets = hashAssets;
3057
3430
  exports.hashBatchEntries = hashBatchEntries;