@chipi-stack/backend 14.10.1 → 14.12.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.js CHANGED
@@ -966,8 +966,10 @@ var executePaymasterTransaction = async ({
966
966
  let walletType = wallet.walletType ?? "READY";
967
967
  if (!wallet.walletType) {
968
968
  try {
969
- const resolveProvider = new starknet.RpcProvider({ nodeUrl: shared.WALLET_RPC_ENDPOINTS.CHIPI });
970
- const onChainClassHash = await resolveProvider.getClassHashAt(wallet.publicKey, "latest");
969
+ const onChainClassHash = await shared.withRpcFallback(
970
+ (provider2) => provider2.getClassHashAt(wallet.publicKey, "latest"),
971
+ { fallbackUrl: shared.WALLET_RPC_ENDPOINTS.CHIPI }
972
+ );
971
973
  walletType = shared.getWalletTypeFromClassHash(onChainClassHash) ?? "READY";
972
974
  } catch {
973
975
  }
@@ -2392,18 +2394,18 @@ var ChipiSessions = class {
2392
2394
  async getSessionData(params) {
2393
2395
  const { walletAddress, sessionPublicKey } = params;
2394
2396
  try {
2395
- const provider = new starknet.RpcProvider({
2396
- nodeUrl: shared.WALLET_RPC_ENDPOINTS["CHIPI"]
2397
- });
2398
2397
  console.log("[ChipiSDK:Session:GetData] Querying session data", {
2399
2398
  walletAddress: walletAddress.slice(0, 15) + "...",
2400
2399
  sessionPubKey: sessionPublicKey.slice(0, 15) + "..."
2401
2400
  });
2402
- const result = await provider.callContract({
2403
- contractAddress: walletAddress,
2404
- entrypoint: shared.SESSION_ENTRYPOINTS.GET_DATA,
2405
- calldata: [sessionPublicKey]
2406
- });
2401
+ const result = await shared.withRpcFallback(
2402
+ (provider) => provider.callContract({
2403
+ contractAddress: walletAddress,
2404
+ entrypoint: shared.SESSION_ENTRYPOINTS.GET_DATA,
2405
+ calldata: [sessionPublicKey]
2406
+ }),
2407
+ { fallbackUrl: shared.WALLET_RPC_ENDPOINTS["CHIPI"] }
2408
+ );
2407
2409
  const resultArray = Array.isArray(result) ? result : result.result || [];
2408
2410
  if (resultArray.length < 4) {
2409
2411
  console.warn("[ChipiSDK:Session:GetData] Unexpected response format", {
@@ -2474,7 +2476,9 @@ var ChipiSessions = class {
2474
2476
  * 1. Generated via `createSessionKey()`
2475
2477
  * 2. Registered on-chain via `addSessionKeyToContract()`
2476
2478
  *
2477
- * CHIPI wallets only - will throw if wallet type is not CHIPI.
2479
+ * CHIPI v29 and SHHH V8.4 only: both embed the SNIP-163 sessions
2480
+ * component. Throws for any other wallet type, notably READY (Argent X),
2481
+ * which does not. See `validateWalletSupportsSessions`.
2478
2482
  *
2479
2483
  * @param params - Session execution parameters
2480
2484
  * @param bearerToken - Authentication token
@@ -2690,19 +2694,19 @@ var ChipiSessions = class {
2690
2694
  async getSpendingPolicy(params) {
2691
2695
  const { walletAddress, sessionPublicKey, token } = params;
2692
2696
  try {
2693
- const provider = new starknet.RpcProvider({
2694
- nodeUrl: shared.WALLET_RPC_ENDPOINTS["CHIPI"]
2695
- });
2696
2697
  console.log("[ChipiSDK:Session:GetSpendingPolicy] Querying spending policy", {
2697
2698
  walletAddress: walletAddress.slice(0, 15) + "...",
2698
2699
  sessionPubKey: sessionPublicKey.slice(0, 15) + "...",
2699
2700
  token: token.slice(0, 15) + "..."
2700
2701
  });
2701
- const result = await provider.callContract({
2702
- contractAddress: walletAddress,
2703
- entrypoint: shared.SESSION_ENTRYPOINTS.GET_SPENDING_POLICY,
2704
- calldata: [sessionPublicKey, token]
2705
- });
2702
+ const result = await shared.withRpcFallback(
2703
+ (provider) => provider.callContract({
2704
+ contractAddress: walletAddress,
2705
+ entrypoint: shared.SESSION_ENTRYPOINTS.GET_SPENDING_POLICY,
2706
+ calldata: [sessionPublicKey, token]
2707
+ }),
2708
+ { fallbackUrl: shared.WALLET_RPC_ENDPOINTS["CHIPI"] }
2709
+ );
2706
2710
  const resultArray = Array.isArray(result) ? result : result.result || [];
2707
2711
  if (resultArray.length < 8) {
2708
2712
  console.warn("[ChipiSDK:Session:GetSpendingPolicy] Unexpected response format", {
@@ -2863,6 +2867,83 @@ var ChipiTreasury = class {
2863
2867
  }
2864
2868
  return token;
2865
2869
  }
2870
+ /**
2871
+ * List every treasury owned by the api key's organization (`sk_`).
2872
+ *
2873
+ * This is the discovery entry point for {@link ForTreasuryConfig.treasuryId}.
2874
+ * The secret key resolves the org server-side, so there is no org id to
2875
+ * pass and nothing to look up in the dashboard first. Use it to recover a
2876
+ * `treasuryId` that fell out of your config, or to avoid pinning one in an
2877
+ * environment variable at all.
2878
+ *
2879
+ * Server-only: it needs a `sk_`, so never call it from the browser.
2880
+ *
2881
+ * @example
2882
+ * ```typescript
2883
+ * const { items } = await sdk.treasury.list();
2884
+ * const ops = items.find((t) => t.name === "Ops Treasury");
2885
+ * const transport = sdk.treasury.forTreasury({
2886
+ * treasuryId: ops.id,
2887
+ * ownerPubkey,
2888
+ * });
2889
+ * ```
2890
+ */
2891
+ async list(options = {}) {
2892
+ const { page, limit, includeArchived, bearerToken } = options;
2893
+ const params = {};
2894
+ if (page !== void 0) params.page = String(page);
2895
+ if (limit !== void 0) params.limit = String(limit);
2896
+ if (includeArchived !== void 0) {
2897
+ params.includeArchived = String(includeArchived);
2898
+ }
2899
+ const res = await this.client.get({
2900
+ endpoint: shared.API_ENDPOINTS.TREASURIES,
2901
+ params,
2902
+ bearerToken: this.secret(bearerToken)
2903
+ });
2904
+ return { ...res, items: res.items ?? [] };
2905
+ }
2906
+ /**
2907
+ * Read a treasury's risk-tier quorum policy (`sk_`).
2908
+ */
2909
+ async getPolicy(treasuryId, options = {}) {
2910
+ return this.client.get({
2911
+ endpoint: `${shared.API_ENDPOINTS.TREASURIES}/${treasuryId}/policy`,
2912
+ bearerToken: this.secret(options.bearerToken)
2913
+ });
2914
+ }
2915
+ /**
2916
+ * Set a treasury's risk-tier quorums (`sk_`).
2917
+ *
2918
+ * An omitted tier is left unchanged; passing `null` clears it. Configuring
2919
+ * this used to require the dashboard, so an integrator driving governance
2920
+ * from their own server could see a quorum applied to a proposal but never
2921
+ * choose it.
2922
+ *
2923
+ * IMPORTANT: a quorum can only RAISE `requiredApprovals` above the wallet's
2924
+ * on-chain threshold. The chain is the hard floor, so a quorum set below it
2925
+ * produces proposals that reach `APPROVED` here and then revert at execute.
2926
+ *
2927
+ * Server-only: it needs a `sk_`.
2928
+ *
2929
+ * @example
2930
+ * ```typescript
2931
+ * // Founding a pool and borrowing need 3 owners; repaying needs the
2932
+ * // wallet's own threshold.
2933
+ * await sdk.treasury.setPolicy(treasuryId, { sensitiveQuorum: 3 });
2934
+ * ```
2935
+ */
2936
+ async setPolicy(treasuryId, options = {}) {
2937
+ const { routineQuorum, sensitiveQuorum, bearerToken } = options;
2938
+ const body = {};
2939
+ if (routineQuorum !== void 0) body.routineQuorum = routineQuorum;
2940
+ if (sensitiveQuorum !== void 0) body.sensitiveQuorum = sensitiveQuorum;
2941
+ return this.client.patch({
2942
+ endpoint: `${shared.API_ENDPOINTS.TREASURIES}/${treasuryId}/policy`,
2943
+ bearerToken: this.secret(bearerToken),
2944
+ body
2945
+ });
2946
+ }
2866
2947
  /**
2867
2948
  * Build a {@link TreasuryTransport} for one treasury + owner. Wire the
2868
2949
  * returned object directly into chipi-react's `useProposeAction` /
@@ -3547,6 +3628,49 @@ var ChipiBrowserSDK = class extends ChipiSDK {
3547
3628
  // All methods are inherited from ChipiSDK
3548
3629
  // bearerToken parameter is required for each authenticated request
3549
3630
  };
3631
+ var DEFAULT_RETRY_INTERVAL_MS = 3e3;
3632
+ var DEFAULT_TIMEOUT_MS = 3e5;
3633
+ function isPending(finalityStatus) {
3634
+ return finalityStatus === void 0 || finalityStatus === "RECEIVED" || finalityStatus === "PENDING" || finalityStatus === "PRE_CONFIRMED";
3635
+ }
3636
+ async function waitForTransaction(transactionHash, options = {}) {
3637
+ const {
3638
+ nodeUrl = shared.WALLET_RPC_ENDPOINTS.CHIPI,
3639
+ retryIntervalMs = DEFAULT_RETRY_INTERVAL_MS,
3640
+ timeoutMs = DEFAULT_TIMEOUT_MS
3641
+ } = options;
3642
+ const deadline = Date.now() + timeoutMs;
3643
+ let lastError;
3644
+ for (; ; ) {
3645
+ try {
3646
+ const receipt = await shared.withRpcFallback(
3647
+ (provider) => provider.getTransactionReceipt(transactionHash),
3648
+ { fallbackUrl: nodeUrl }
3649
+ );
3650
+ if (!isPending(receipt?.finality_status)) {
3651
+ const reverted = receipt.execution_status === "REVERTED";
3652
+ return {
3653
+ transactionHash,
3654
+ success: !reverted,
3655
+ executionStatus: receipt.execution_status,
3656
+ finalityStatus: receipt.finality_status,
3657
+ ...reverted ? { revertReason: receipt.revert_reason ?? "reverted on chain" } : {},
3658
+ events: receipt.events ?? [],
3659
+ ...receipt.block_number !== void 0 ? { blockNumber: receipt.block_number } : {}
3660
+ };
3661
+ }
3662
+ } catch (err) {
3663
+ lastError = err;
3664
+ }
3665
+ if (Date.now() + retryIntervalMs >= deadline) {
3666
+ const detail = lastError instanceof Error ? `: ${lastError.message}` : "";
3667
+ throw new Error(
3668
+ `Timed out after ${timeoutMs}ms waiting for ${transactionHash}${detail}. The transaction may still land; re-check before treating it as failed.`
3669
+ );
3670
+ }
3671
+ await new Promise((resolve) => setTimeout(resolve, retryIntervalMs));
3672
+ }
3673
+ }
3550
3674
 
3551
3675
  // src/index.ts
3552
3676
  init_encryption2();
@@ -4875,6 +4999,7 @@ exports.snip12HashToHexAsciiBytes = snip12HashToHexAsciiBytes;
4875
4999
  exports.starkOwnerId = starkOwnerId;
4876
5000
  exports.starkPubkeyFelts = starkPubkeyFelts;
4877
5001
  exports.submitViaAccount = submitViaAccount;
5002
+ exports.waitForTransaction = waitForTransaction;
4878
5003
  exports.webauthnOwnerId = webauthnOwnerId;
4879
5004
  exports.webauthnOwnerPubkeyParam = webauthnOwnerPubkeyParam;
4880
5005
  exports.webauthnPubkeyFelts = webauthnPubkeyFelts;