@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/README.md +50 -0
- package/dist/index.d.mts +195 -2
- package/dist/index.d.ts +195 -2
- package/dist/index.js +144 -19
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +145 -21
- package/dist/index.mjs.map +1 -1
- package/dist/skuPurchases.js +4 -2
- package/dist/skuPurchases.js.map +1 -1
- package/dist/skuPurchases.mjs +5 -3
- package/dist/skuPurchases.mjs.map +1 -1
- package/dist/transactions.js +4 -2
- package/dist/transactions.js.map +1 -1
- package/dist/transactions.mjs +5 -3
- package/dist/transactions.mjs.map +1 -1
- package/dist/wallets.js +4 -2
- package/dist/wallets.js.map +1 -1
- package/dist/wallets.mjs +5 -3
- package/dist/wallets.mjs.map +1 -1
- package/package.json +4 -4
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
|
|
970
|
-
|
|
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
|
|
2403
|
-
|
|
2404
|
-
|
|
2405
|
-
|
|
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
|
|
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
|
|
2702
|
-
|
|
2703
|
-
|
|
2704
|
-
|
|
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;
|