@polyester/sdk 0.26.0 → 0.27.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/CHANGELOG.md +24 -0
- package/dist/gen/auth/v1/auth_pb.d.ts +30 -21
- package/dist/gen/auth/v1/auth_pb.d.ts.map +1 -1
- package/dist/gen/auth/v1/auth_pb.js +25 -8
- package/dist/gen/auth/v1/auth_pb.js.map +1 -1
- package/dist/gen/auth/v1/mfa_pb.js +1 -1
- package/dist/gen/auth/v1/mfa_pb.js.map +1 -1
- package/dist/gen/auth/v1/profile_pb.d.ts +2 -2
- package/dist/gen/auth/v1/profile_pb.d.ts.map +1 -1
- package/dist/gen/auth/v1/profile_pb.js +2 -1
- package/dist/gen/auth/v1/profile_pb.js.map +1 -1
- package/dist/gen/auth/v1/resolve_pb.d.ts.map +1 -1
- package/dist/gen/auth/v1/resolve_pb.js +2 -1
- package/dist/gen/auth/v1/resolve_pb.js.map +1 -1
- package/dist/gen/auth/v1/social_verification_pb.d.ts +3 -0
- package/dist/gen/auth/v1/social_verification_pb.d.ts.map +1 -1
- package/dist/gen/auth/v1/social_verification_pb.js +2 -1
- package/dist/gen/auth/v1/social_verification_pb.js.map +1 -1
- package/dist/gen/auth/v1/subaccounts_pb.d.ts +90 -10
- package/dist/gen/auth/v1/subaccounts_pb.d.ts.map +1 -1
- package/dist/gen/auth/v1/subaccounts_pb.js +40 -28
- package/dist/gen/auth/v1/subaccounts_pb.js.map +1 -1
- package/dist/gen/claims/v1/claims_pb.d.ts +108 -2
- package/dist/gen/claims/v1/claims_pb.d.ts.map +1 -1
- package/dist/gen/claims/v1/claims_pb.js +109 -11
- package/dist/gen/claims/v1/claims_pb.js.map +1 -1
- package/dist/gen/index.d.ts +1 -1
- package/dist/gen/index.js +1 -1
- package/dist/gen/ledger/read/v1/ledger_read_pb.d.ts.map +1 -1
- package/dist/gen/ledger/read/v1/ledger_read_pb.js +6 -1
- package/dist/gen/ledger/read/v1/ledger_read_pb.js.map +1 -1
- package/dist/gen/orderbook/v1/orderbook_pb.d.ts +1 -1
- package/dist/gen/orderbook/v1/orderbook_pb.js.map +1 -1
- package/dist/gen/orders/v1/orders_read_pb.d.ts +10 -0
- package/dist/gen/orders/v1/orders_read_pb.d.ts.map +1 -1
- package/dist/gen/orders/v1/orders_read_pb.js +1 -1
- package/dist/gen/orders/v1/orders_read_pb.js.map +1 -1
- package/dist/gen/polyester/api/options_pb.d.ts +39 -2
- package/dist/gen/polyester/api/options_pb.d.ts.map +1 -1
- package/dist/gen/polyester/api/options_pb.js +43 -2
- package/dist/gen/polyester/api/options_pb.js.map +1 -1
- package/dist/index.d.ts +4 -4
- package/dist/index.js +2 -2
- package/dist/services/auth/account-signer-auth.d.ts +10 -3
- package/dist/services/auth/account-signer-auth.d.ts.map +1 -1
- package/dist/services/auth/account-signer-auth.js +14 -12
- package/dist/services/auth/account-signer-auth.js.map +1 -1
- package/dist/services/auth/auth.d.ts +3 -4
- package/dist/services/auth/auth.d.ts.map +1 -1
- package/dist/services/auth/auth.js +4 -6
- package/dist/services/auth/auth.js.map +1 -1
- package/dist/services/auth/auth.types.d.ts +2 -2
- package/dist/services/claims/claims.js +1 -1
- package/dist/services/heatmap/heatmap.schemas.d.ts +4 -4
- package/dist/services/orderbook/orderbook.schemas.d.ts +1 -1
- package/dist/services/orders/orders-output.schemas.d.ts +6 -0
- package/dist/services/orders/orders-output.schemas.d.ts.map +1 -1
- package/dist/services/orders/orders-output.schemas.js +2 -0
- package/dist/services/orders/orders-output.schemas.js.map +1 -1
- package/dist/services/subaccounts/index.d.ts +2 -2
- package/dist/services/subaccounts/subaccounts.d.ts +9 -3
- package/dist/services/subaccounts/subaccounts.d.ts.map +1 -1
- package/dist/services/subaccounts/subaccounts.js +13 -3
- package/dist/services/subaccounts/subaccounts.js.map +1 -1
- package/dist/services/subaccounts/subaccounts.schemas.d.ts +23 -4
- package/dist/services/subaccounts/subaccounts.schemas.d.ts.map +1 -1
- package/dist/services/subaccounts/subaccounts.schemas.js +13 -2
- package/dist/services/subaccounts/subaccounts.schemas.js.map +1 -1
- package/dist/services/subaccounts/subaccounts.types.d.ts +2 -2
- package/dist/shared/connect-error-mapping.d.ts.map +1 -1
- package/dist/shared/connect-error-mapping.js +6 -4
- package/dist/shared/connect-error-mapping.js.map +1 -1
- package/dist/shared/error-detail.d.ts +12 -8
- package/dist/shared/error-detail.d.ts.map +1 -1
- package/dist/shared/error-detail.js +30 -19
- package/dist/shared/error-detail.js.map +1 -1
- package/dist/shared/errors.d.ts +10 -1
- package/dist/shared/errors.d.ts.map +1 -1
- package/dist/shared/errors.js +12 -1
- package/dist/shared/errors.js.map +1 -1
- package/dist/smart-account/smart-account.d.ts +6 -7
- package/dist/smart-account/smart-account.d.ts.map +1 -1
- package/dist/smart-account/smart-account.js +10 -25
- package/dist/smart-account/smart-account.js.map +1 -1
- package/dist/wired-services.js +1 -1
- package/package.json +1 -1
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import { AuthErrorCode, AuthErrorDetailSchema } from "../gen/auth/v1/auth_pb.js";
|
|
2
2
|
import { ProfileErrorCode, ProfileErrorDetailSchema } from "../gen/auth/v1/profile_pb.js";
|
|
3
|
-
import { ErrorCode, ErrorDetailSchema } from "../gen/
|
|
4
|
-
import { ErrorCode as ErrorCode$1, ErrorDetailSchema as ErrorDetailSchema$1 } from "../gen/
|
|
5
|
-
import { ErrorCode as ErrorCode$2, ErrorDetailSchema as ErrorDetailSchema$2 } from "../gen/
|
|
6
|
-
import { ErrorDetailSchema as ErrorDetailSchema$3 } from "../gen/
|
|
7
|
-
import {
|
|
3
|
+
import { ErrorCode, ErrorDetailSchema } from "../gen/claims/v1/claims_pb.js";
|
|
4
|
+
import { ErrorCode as ErrorCode$1, ErrorDetailSchema as ErrorDetailSchema$1 } from "../gen/chain/withdraw/v1/withdraw_pb.js";
|
|
5
|
+
import { ErrorCode as ErrorCode$2, ErrorDetailSchema as ErrorDetailSchema$2 } from "../gen/ledger/read/v1/ledger_read_pb.js";
|
|
6
|
+
import { ErrorCode as ErrorCode$3, ErrorDetailSchema as ErrorDetailSchema$3 } from "../gen/marketoverview/v1/marketoverview_pb.js";
|
|
7
|
+
import { ErrorDetailSchema as ErrorDetailSchema$4 } from "../gen/orders/v1/orders_pb.js";
|
|
8
|
+
import { ErrorCode as ErrorCode$4, ErrorDetailSchema as ErrorDetailSchema$5 } from "../gen/transfer/v1/internal_transfer_pb.js";
|
|
8
9
|
import { OrderErrorDetailSchema } from "../services/orders/order-errors.schemas.js";
|
|
9
10
|
import { create, fromBinary } from "@bufbuild/protobuf";
|
|
10
11
|
import * as v from "valibot";
|
|
@@ -48,8 +49,8 @@ function parseConnectErrorDetail(error) {
|
|
|
48
49
|
};
|
|
49
50
|
break;
|
|
50
51
|
}
|
|
51
|
-
case ErrorDetailSchema$
|
|
52
|
-
const order = decodeDetail(raw, ErrorDetailSchema$
|
|
52
|
+
case ErrorDetailSchema$4.typeName: {
|
|
53
|
+
const order = decodeDetail(raw, ErrorDetailSchema$4);
|
|
53
54
|
if (!order) break;
|
|
54
55
|
const parsed = v.safeParse(OrderErrorDetailSchema, order);
|
|
55
56
|
if (parsed.success) return {
|
|
@@ -58,46 +59,56 @@ function parseConnectErrorDetail(error) {
|
|
|
58
59
|
};
|
|
59
60
|
break;
|
|
60
61
|
}
|
|
61
|
-
case ErrorDetailSchema.typeName: {
|
|
62
|
-
const withdraw = decodeDetail(raw, ErrorDetailSchema);
|
|
62
|
+
case ErrorDetailSchema$1.typeName: {
|
|
63
|
+
const withdraw = decodeDetail(raw, ErrorDetailSchema$1);
|
|
63
64
|
if (!withdraw) break;
|
|
64
|
-
const code = codeName(ErrorCode, withdraw.code);
|
|
65
|
+
const code = codeName(ErrorCode$1, withdraw.code);
|
|
65
66
|
if (code) return {
|
|
66
67
|
service: "withdraw",
|
|
67
68
|
code
|
|
68
69
|
};
|
|
69
70
|
break;
|
|
70
71
|
}
|
|
71
|
-
case ErrorDetailSchema$
|
|
72
|
-
const transfer = decodeDetail(raw, ErrorDetailSchema$
|
|
72
|
+
case ErrorDetailSchema$5.typeName: {
|
|
73
|
+
const transfer = decodeDetail(raw, ErrorDetailSchema$5);
|
|
73
74
|
if (!transfer) break;
|
|
74
|
-
const code = codeName(ErrorCode$
|
|
75
|
+
const code = codeName(ErrorCode$4, transfer.code);
|
|
75
76
|
if (code) return {
|
|
76
77
|
service: "internal_transfer",
|
|
77
78
|
code
|
|
78
79
|
};
|
|
79
80
|
break;
|
|
80
81
|
}
|
|
81
|
-
case ErrorDetailSchema$
|
|
82
|
-
const ledger = decodeDetail(raw, ErrorDetailSchema$
|
|
82
|
+
case ErrorDetailSchema$2.typeName: {
|
|
83
|
+
const ledger = decodeDetail(raw, ErrorDetailSchema$2);
|
|
83
84
|
if (!ledger) break;
|
|
84
|
-
const code = codeName(ErrorCode$
|
|
85
|
+
const code = codeName(ErrorCode$2, ledger.code);
|
|
85
86
|
if (code) return {
|
|
86
87
|
service: "ledger",
|
|
87
88
|
code
|
|
88
89
|
};
|
|
89
90
|
break;
|
|
90
91
|
}
|
|
91
|
-
case ErrorDetailSchema$
|
|
92
|
-
const marketOverview = decodeDetail(raw, ErrorDetailSchema$
|
|
92
|
+
case ErrorDetailSchema$3.typeName: {
|
|
93
|
+
const marketOverview = decodeDetail(raw, ErrorDetailSchema$3);
|
|
93
94
|
if (!marketOverview) break;
|
|
94
|
-
const code = codeName(ErrorCode$
|
|
95
|
+
const code = codeName(ErrorCode$3, marketOverview.code);
|
|
95
96
|
if (code) return {
|
|
96
97
|
service: "market_overview",
|
|
97
98
|
code
|
|
98
99
|
};
|
|
99
100
|
break;
|
|
100
101
|
}
|
|
102
|
+
case ErrorDetailSchema.typeName: {
|
|
103
|
+
const claims = decodeDetail(raw, ErrorDetailSchema);
|
|
104
|
+
if (!claims) break;
|
|
105
|
+
const code = codeName(ErrorCode, claims.code);
|
|
106
|
+
if (code) return {
|
|
107
|
+
service: "claims",
|
|
108
|
+
code
|
|
109
|
+
};
|
|
110
|
+
break;
|
|
111
|
+
}
|
|
101
112
|
}
|
|
102
113
|
}
|
|
103
114
|
//#endregion
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"error-detail.js","names":["OrderErrorDetailSchema","ParsedOrderErrorDetailSchema","WithdrawErrorDetailSchema","WithdrawErrorCode","InternalTransferErrorDetailSchema","InternalTransferErrorCode","LedgerErrorDetailSchema","LedgerErrorCode","MarketOverviewErrorDetailSchema","MarketOverviewErrorCode"],"sources":["../../src/shared/error-detail.ts"],"sourcesContent":["import {\n create,\n fromBinary,\n type DescMessage,\n type MessageInitShape,\n type MessageShape,\n} from \"@bufbuild/protobuf\";\nimport type { ConnectError } from \"@connectrpc/connect\";\nimport * as v from \"valibot\";\nimport { AuthErrorCode, AuthErrorDetailSchema } from \"../gen/auth/v1/auth_pb.js\";\nimport { ProfileErrorCode, ProfileErrorDetailSchema } from \"../gen/auth/v1/profile_pb.js\";\nimport {\n ErrorCode as WithdrawErrorCode,\n ErrorDetailSchema as WithdrawErrorDetailSchema,\n} from \"../gen/chain/withdraw/v1/withdraw_pb.js\";\nimport {\n ErrorCode as LedgerErrorCode,\n ErrorDetailSchema as LedgerErrorDetailSchema,\n} from \"../gen/ledger/read/v1/ledger_read_pb.js\";\nimport {\n ErrorCode as MarketOverviewErrorCode,\n ErrorDetailSchema as MarketOverviewErrorDetailSchema,\n} from \"../gen/marketoverview/v1/marketoverview_pb.js\";\nimport { ErrorDetailSchema as OrderErrorDetailSchema } from \"../gen/orders/v1/orders_pb.js\";\nimport {\n ErrorCode as InternalTransferErrorCode,\n ErrorDetailSchema as InternalTransferErrorDetailSchema,\n} from \"../gen/transfer/v1/internal_transfer_pb.js\";\nimport {\n OrderErrorDetailSchema as ParsedOrderErrorDetailSchema,\n type OrderErrorDetail,\n} from \"../services/orders/order-errors.schemas.js\";\n\ntype NamedCode<Enum extends Record<number, string>> = keyof Enum;\n\nexport type PolyesterErrorDetail =\n | { service: \"auth\"; code: NamedCode<typeof AuthErrorCode>; message: string }\n | {\n service: \"profile\";\n code: NamedCode<typeof ProfileErrorCode>;\n field: string;\n message: string;\n }\n | ({ service: \"orders\" } & OrderErrorDetail)\n | { service: \"withdraw\"; code: NamedCode<typeof WithdrawErrorCode> }\n | {\n service: \"internal_transfer\";\n code: NamedCode<typeof InternalTransferErrorCode>;\n }\n | { service: \"ledger\"; code: NamedCode<typeof LedgerErrorCode> }\n | {\n service: \"market_overview\";\n code: NamedCode<typeof MarketOverviewErrorCode>;\n };\n\nfunction codeName<Enum extends Record<number, string>>(\n codes: Enum,\n code: number,\n): NamedCode<Enum> | undefined {\n if (typeof code !== \"number\") return undefined;\n const name = codes[code];\n return typeof name === \"string\" ? (name as NamedCode<Enum>) : undefined;\n}\n\nfunction decodeDetail<Desc extends DescMessage>(\n detail: ConnectError[\"details\"][number],\n schema: Desc,\n): MessageShape<Desc> | undefined {\n try {\n if (\"desc\" in detail) {\n return create(schema, detail.value as MessageInitShape<Desc>);\n }\n return fromBinary(schema, detail.value);\n } catch {\n return undefined;\n }\n}\n\n/** Decodes the first valid backend rejection detail, preserving wire-detail order. */\nexport function parseConnectErrorDetail(error: ConnectError): PolyesterErrorDetail | undefined {\n for (const raw of error.details) {\n const typeName = \"desc\" in raw ? raw.desc.typeName : raw.type;\n switch (typeName) {\n case AuthErrorDetailSchema.typeName: {\n const auth = decodeDetail(raw, AuthErrorDetailSchema);\n if (!auth) break;\n const code = codeName(AuthErrorCode, auth.code);\n if (code) {\n return { service: \"auth\", code, message: auth.message };\n }\n break;\n }\n case ProfileErrorDetailSchema.typeName: {\n const profile = decodeDetail(raw, ProfileErrorDetailSchema);\n if (!profile) break;\n const code = codeName(ProfileErrorCode, profile.code);\n if (code) {\n return {\n service: \"profile\",\n code,\n field: profile.field,\n message: profile.message,\n };\n }\n break;\n }\n case OrderErrorDetailSchema.typeName: {\n const order = decodeDetail(raw, OrderErrorDetailSchema);\n if (!order) break;\n const parsed = v.safeParse(ParsedOrderErrorDetailSchema, order);\n if (parsed.success) return { service: \"orders\", ...parsed.output };\n break;\n }\n case WithdrawErrorDetailSchema.typeName: {\n const withdraw = decodeDetail(raw, WithdrawErrorDetailSchema);\n if (!withdraw) break;\n const code = codeName(WithdrawErrorCode, withdraw.code);\n if (code) return { service: \"withdraw\", code };\n break;\n }\n case InternalTransferErrorDetailSchema.typeName: {\n const transfer = decodeDetail(raw, InternalTransferErrorDetailSchema);\n if (!transfer) break;\n const code = codeName(InternalTransferErrorCode, transfer.code);\n if (code) return { service: \"internal_transfer\", code };\n break;\n }\n case LedgerErrorDetailSchema.typeName: {\n const ledger = decodeDetail(raw, LedgerErrorDetailSchema);\n if (!ledger) break;\n const code = codeName(LedgerErrorCode, ledger.code);\n if (code) return { service: \"ledger\", code };\n break;\n }\n case MarketOverviewErrorDetailSchema.typeName: {\n const marketOverview = decodeDetail(raw, MarketOverviewErrorDetailSchema);\n if (!marketOverview) break;\n const code = codeName(MarketOverviewErrorCode, marketOverview.code);\n if (code) return { service: \"market_overview\", code };\n break;\n }\n }\n }\n return undefined;\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"error-detail.js","names":["OrderErrorDetailSchema","ParsedOrderErrorDetailSchema","WithdrawErrorDetailSchema","WithdrawErrorCode","InternalTransferErrorDetailSchema","InternalTransferErrorCode","LedgerErrorDetailSchema","LedgerErrorCode","MarketOverviewErrorDetailSchema","MarketOverviewErrorCode","ClaimsErrorDetailSchema","ClaimsErrorCode"],"sources":["../../src/shared/error-detail.ts"],"sourcesContent":["import {\n create,\n fromBinary,\n type DescMessage,\n type MessageInitShape,\n type MessageShape,\n} from \"@bufbuild/protobuf\";\nimport type { ConnectError } from \"@connectrpc/connect\";\nimport * as v from \"valibot\";\nimport { AuthErrorCode, AuthErrorDetailSchema } from \"../gen/auth/v1/auth_pb.js\";\nimport { ProfileErrorCode, ProfileErrorDetailSchema } from \"../gen/auth/v1/profile_pb.js\";\nimport {\n ErrorCode as ClaimsErrorCode,\n ErrorDetailSchema as ClaimsErrorDetailSchema,\n} from \"../gen/claims/v1/claims_pb.js\";\nimport {\n ErrorCode as WithdrawErrorCode,\n ErrorDetailSchema as WithdrawErrorDetailSchema,\n} from \"../gen/chain/withdraw/v1/withdraw_pb.js\";\nimport {\n ErrorCode as LedgerErrorCode,\n ErrorDetailSchema as LedgerErrorDetailSchema,\n} from \"../gen/ledger/read/v1/ledger_read_pb.js\";\nimport {\n ErrorCode as MarketOverviewErrorCode,\n ErrorDetailSchema as MarketOverviewErrorDetailSchema,\n} from \"../gen/marketoverview/v1/marketoverview_pb.js\";\nimport { ErrorDetailSchema as OrderErrorDetailSchema } from \"../gen/orders/v1/orders_pb.js\";\nimport {\n ErrorCode as InternalTransferErrorCode,\n ErrorDetailSchema as InternalTransferErrorDetailSchema,\n} from \"../gen/transfer/v1/internal_transfer_pb.js\";\nimport {\n OrderErrorDetailSchema as ParsedOrderErrorDetailSchema,\n type OrderErrorDetail,\n} from \"../services/orders/order-errors.schemas.js\";\n\ntype NamedCode<Enum extends Record<number, string>> = keyof Enum;\n\nexport type PolyesterErrorDetail =\n | { service: \"auth\"; code: NamedCode<typeof AuthErrorCode>; message: string }\n | {\n service: \"profile\";\n code: NamedCode<typeof ProfileErrorCode>;\n field: string;\n message: string;\n }\n | ({ service: \"orders\" } & OrderErrorDetail)\n | { service: \"withdraw\"; code: NamedCode<typeof WithdrawErrorCode> }\n | {\n service: \"internal_transfer\";\n code: NamedCode<typeof InternalTransferErrorCode>;\n }\n | { service: \"ledger\"; code: NamedCode<typeof LedgerErrorCode> }\n | {\n service: \"market_overview\";\n code: NamedCode<typeof MarketOverviewErrorCode>;\n }\n | { service: \"claims\"; code: NamedCode<typeof ClaimsErrorCode> };\n\nfunction codeName<Enum extends Record<number, string>>(\n codes: Enum,\n code: number,\n): NamedCode<Enum> | undefined {\n if (typeof code !== \"number\") return undefined;\n const name = codes[code];\n return typeof name === \"string\" ? (name as NamedCode<Enum>) : undefined;\n}\n\nfunction decodeDetail<Desc extends DescMessage>(\n detail: ConnectError[\"details\"][number],\n schema: Desc,\n): MessageShape<Desc> | undefined {\n try {\n if (\"desc\" in detail) {\n return create(schema, detail.value as MessageInitShape<Desc>);\n }\n return fromBinary(schema, detail.value);\n } catch {\n return undefined;\n }\n}\n\n/** Decodes the first valid backend rejection detail, preserving wire-detail order. */\nexport function parseConnectErrorDetail(error: ConnectError): PolyesterErrorDetail | undefined {\n for (const raw of error.details) {\n const typeName = \"desc\" in raw ? raw.desc.typeName : raw.type;\n switch (typeName) {\n case AuthErrorDetailSchema.typeName: {\n const auth = decodeDetail(raw, AuthErrorDetailSchema);\n if (!auth) break;\n const code = codeName(AuthErrorCode, auth.code);\n if (code) {\n return { service: \"auth\", code, message: auth.message };\n }\n break;\n }\n case ProfileErrorDetailSchema.typeName: {\n const profile = decodeDetail(raw, ProfileErrorDetailSchema);\n if (!profile) break;\n const code = codeName(ProfileErrorCode, profile.code);\n if (code) {\n return {\n service: \"profile\",\n code,\n field: profile.field,\n message: profile.message,\n };\n }\n break;\n }\n case OrderErrorDetailSchema.typeName: {\n const order = decodeDetail(raw, OrderErrorDetailSchema);\n if (!order) break;\n const parsed = v.safeParse(ParsedOrderErrorDetailSchema, order);\n if (parsed.success) return { service: \"orders\", ...parsed.output };\n break;\n }\n case WithdrawErrorDetailSchema.typeName: {\n const withdraw = decodeDetail(raw, WithdrawErrorDetailSchema);\n if (!withdraw) break;\n const code = codeName(WithdrawErrorCode, withdraw.code);\n if (code) return { service: \"withdraw\", code };\n break;\n }\n case InternalTransferErrorDetailSchema.typeName: {\n const transfer = decodeDetail(raw, InternalTransferErrorDetailSchema);\n if (!transfer) break;\n const code = codeName(InternalTransferErrorCode, transfer.code);\n if (code) return { service: \"internal_transfer\", code };\n break;\n }\n case LedgerErrorDetailSchema.typeName: {\n const ledger = decodeDetail(raw, LedgerErrorDetailSchema);\n if (!ledger) break;\n const code = codeName(LedgerErrorCode, ledger.code);\n if (code) return { service: \"ledger\", code };\n break;\n }\n case MarketOverviewErrorDetailSchema.typeName: {\n const marketOverview = decodeDetail(raw, MarketOverviewErrorDetailSchema);\n if (!marketOverview) break;\n const code = codeName(MarketOverviewErrorCode, marketOverview.code);\n if (code) return { service: \"market_overview\", code };\n break;\n }\n case ClaimsErrorDetailSchema.typeName: {\n const claims = decodeDetail(raw, ClaimsErrorDetailSchema);\n if (!claims) break;\n const code = codeName(ClaimsErrorCode, claims.code);\n if (code) return { service: \"claims\", code };\n break;\n }\n }\n }\n return undefined;\n}\n"],"mappings":";;;;;;;;;;;;AA4DA,SAAS,SACL,OACA,MAC2B;CAC3B,IAAI,OAAO,SAAS,UAAU,OAAO,KAAA;CACrC,MAAM,OAAO,MAAM;CACnB,OAAO,OAAO,SAAS,WAAY,OAA2B,KAAA;AAClE;AAEA,SAAS,aACL,QACA,QAC8B;CAC9B,IAAI;EACA,IAAI,UAAU,QACV,OAAO,OAAO,QAAQ,OAAO,KAA+B;EAEhE,OAAO,WAAW,QAAQ,OAAO,KAAK;CAC1C,QAAQ;EACJ;CACJ;AACJ;;AAGA,SAAgB,wBAAwB,OAAuD;CAC3F,KAAK,MAAM,OAAO,MAAM,SAEpB,QADiB,UAAU,MAAM,IAAI,KAAK,WAAW,IAAI,MACzD;EACI,KAAK,sBAAsB,UAAU;GACjC,MAAM,OAAO,aAAa,KAAK,qBAAqB;GACpD,IAAI,CAAC,MAAM;GACX,MAAM,OAAO,SAAS,eAAe,KAAK,IAAI;GAC9C,IAAI,MACA,OAAO;IAAE,SAAS;IAAQ;IAAM,SAAS,KAAK;GAAQ;GAE1D;EACJ;EACA,KAAK,yBAAyB,UAAU;GACpC,MAAM,UAAU,aAAa,KAAK,wBAAwB;GAC1D,IAAI,CAAC,SAAS;GACd,MAAM,OAAO,SAAS,kBAAkB,QAAQ,IAAI;GACpD,IAAI,MACA,OAAO;IACH,SAAS;IACT;IACA,OAAO,QAAQ;IACf,SAAS,QAAQ;GACrB;GAEJ;EACJ;EACA,KAAKA,oBAAuB,UAAU;GAClC,MAAM,QAAQ,aAAa,KAAKA,mBAAsB;GACtD,IAAI,CAAC,OAAO;GACZ,MAAM,SAAS,EAAE,UAAUC,wBAA8B,KAAK;GAC9D,IAAI,OAAO,SAAS,OAAO;IAAE,SAAS;IAAU,GAAG,OAAO;GAAO;GACjE;EACJ;EACA,KAAKC,oBAA0B,UAAU;GACrC,MAAM,WAAW,aAAa,KAAKA,mBAAyB;GAC5D,IAAI,CAAC,UAAU;GACf,MAAM,OAAO,SAASC,aAAmB,SAAS,IAAI;GACtD,IAAI,MAAM,OAAO;IAAE,SAAS;IAAY;GAAK;GAC7C;EACJ;EACA,KAAKC,oBAAkC,UAAU;GAC7C,MAAM,WAAW,aAAa,KAAKA,mBAAiC;GACpE,IAAI,CAAC,UAAU;GACf,MAAM,OAAO,SAASC,aAA2B,SAAS,IAAI;GAC9D,IAAI,MAAM,OAAO;IAAE,SAAS;IAAqB;GAAK;GACtD;EACJ;EACA,KAAKC,oBAAwB,UAAU;GACnC,MAAM,SAAS,aAAa,KAAKA,mBAAuB;GACxD,IAAI,CAAC,QAAQ;GACb,MAAM,OAAO,SAASC,aAAiB,OAAO,IAAI;GAClD,IAAI,MAAM,OAAO;IAAE,SAAS;IAAU;GAAK;GAC3C;EACJ;EACA,KAAKC,oBAAgC,UAAU;GAC3C,MAAM,iBAAiB,aAAa,KAAKA,mBAA+B;GACxE,IAAI,CAAC,gBAAgB;GACrB,MAAM,OAAO,SAASC,aAAyB,eAAe,IAAI;GAClE,IAAI,MAAM,OAAO;IAAE,SAAS;IAAmB;GAAK;GACpD;EACJ;EACA,KAAKC,kBAAwB,UAAU;GACnC,MAAM,SAAS,aAAa,KAAKA,iBAAuB;GACxD,IAAI,CAAC,QAAQ;GACb,MAAM,OAAO,SAASC,WAAiB,OAAO,IAAI;GAClD,IAAI,MAAM,OAAO;IAAE,SAAS;IAAU;GAAK;GAC3C;EACJ;CACJ;AAGR"}
|
package/dist/shared/errors.d.ts
CHANGED
|
@@ -27,6 +27,7 @@ import { RateLimitDetail } from "./rate-limit.schemas.js";
|
|
|
27
27
|
* │ │ ├── RevisionConflictError REVISION_CONFLICT
|
|
28
28
|
* │ │ ├── PolicyInUseError POLICY_IN_USE
|
|
29
29
|
* │ │ ├── PolicyLockedError POLICY_LOCKED
|
|
30
|
+
* │ │ ├── SubaccountChallengeInvalidError SUBACCOUNT_CHALLENGE_INVALID
|
|
30
31
|
* │ │ └── MfaLastFactorRequiredError MFA_LAST_FACTOR_REQUIRED
|
|
31
32
|
* │ ├── ConfigurationError INVALID_CONFIGURATION false
|
|
32
33
|
* │ ├── MfaRequiredError MFA_REQUIRED false
|
|
@@ -171,6 +172,14 @@ declare class RevisionConflictError extends PreconditionFailedError {
|
|
|
171
172
|
readonly code: string;
|
|
172
173
|
constructor(message: string, options?: PolyesterErrorOptions);
|
|
173
174
|
}
|
|
175
|
+
/**
|
|
176
|
+
* The subaccount authorization is expired, replaced by a newer challenge, replayed,
|
|
177
|
+
* or otherwise invalid. Request a fresh challenge via `subaccounts.createChallenge`.
|
|
178
|
+
*/
|
|
179
|
+
declare class SubaccountChallengeInvalidError extends PreconditionFailedError {
|
|
180
|
+
readonly code: string;
|
|
181
|
+
constructor(message: string, options?: PolyesterErrorOptions);
|
|
182
|
+
}
|
|
174
183
|
/** The policy cannot be removed while accounts or API keys still use it. */
|
|
175
184
|
declare class PolicyInUseError extends PreconditionFailedError {
|
|
176
185
|
readonly code: string;
|
|
@@ -249,5 +258,5 @@ declare function isAbortError(err: unknown): boolean;
|
|
|
249
258
|
/** Maps a plain HTTP status code onto the SDK error tree. */
|
|
250
259
|
declare function errorFromHttpStatus(status: number, message: string, options?: PolyesterErrorOptions): PolyesterError;
|
|
251
260
|
//#endregion
|
|
252
|
-
export { AlreadyExistsError, AuthenticationError, ConfigurationError, InternalServerError, MfaEnrollmentRequiredError, MfaLastFactorRequiredError, MfaRequiredError, MfaVerificationError, MfaVerificationFailureReason, NetworkError, PermissionError, PolicyInUseError, PolicyLockedError, PolicyScopeMismatchError, PolyesterError, PolyesterErrorCode, type PolyesterErrorDetail, PolyesterErrorOptions, PreconditionFailedError, RateLimitError, RateLimitErrorOptions, RequestError, ResourceNotFoundError, RevisionConflictError, ServiceUnavailableError, SessionElevationRequiredError, StaleQuoteError, StepUpRequiredError, TimeoutError, TransientError, ValidationError, errorFromHttpStatus, isAbortError, normalizeErrorMessage };
|
|
261
|
+
export { AlreadyExistsError, AuthenticationError, ConfigurationError, InternalServerError, MfaEnrollmentRequiredError, MfaLastFactorRequiredError, MfaRequiredError, MfaVerificationError, MfaVerificationFailureReason, NetworkError, PermissionError, PolicyInUseError, PolicyLockedError, PolicyScopeMismatchError, PolyesterError, PolyesterErrorCode, type PolyesterErrorDetail, PolyesterErrorOptions, PreconditionFailedError, RateLimitError, RateLimitErrorOptions, RequestError, ResourceNotFoundError, RevisionConflictError, ServiceUnavailableError, SessionElevationRequiredError, StaleQuoteError, StepUpRequiredError, SubaccountChallengeInvalidError, TimeoutError, TransientError, ValidationError, errorFromHttpStatus, isAbortError, normalizeErrorMessage };
|
|
253
262
|
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.d.ts","names":[],"sources":["../../src/shared/errors.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"errors.d.ts","names":[],"sources":["../../src/shared/errors.ts"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KA4DY;UA+BK;;EAEb;;EAEA,SAAS;;iBAKG,sBAAsB;;;;;;;;uBAWhB,uBAAuB;;oBAEvB;;oBAEA;WACT,QAAQ;EAEL,YAAA,iBAAiB,UAAU;;;;;;;;cAe9B,uBAAuB;WACvB;WACA;EAEG,YAAA,iBAAiB,UAAU;;;cAO9B,qBAAqB;WACZ;EAEN,YAAA,iBAAiB,UAAU;;;cAO9B,qBAAqB;WACZ;EAEN,YAAA,iBAAiB,UAAU;;UAM1B,8BAA8B;;EAE3C;;EAEA,YAAY;;;cAIH,uBAAuB;WACd;;WAET;;WAEA,YAAY;EAET,YAAA,iBAAiB,UAAU;;;cAS9B,gCAAgC;WACvB;EAEN,YAAA,iBAAiB,UAAU;;;;;;cAU9B,qBAAqB;WACrB;WACA;EAEG,YAAA,iBAAiB,UAAU;;;cAO9B,wBAAwB;WACf;EAEN,YAAA,iBAAiB,UAAU;;;cAO9B,wBAAwB;WACf;EAEN,YAAA,iBAAiB,UAAU;;;cAO9B,8BAA8B;WACrB;EAEN,YAAA,iBAAiB,UAAU;;;cAO9B,2BAA2B;WAClB;EAEN,YAAA,iBAAiB,UAAU;;;cAO9B,wBAAwB;WACf;EAEN,YAAA,iBAAiB,UAAU;;;cAO9B,4BAA4B;WACnB;EAEN,YAAA,iBAAiB,UAAU;;;cAO9B,gCAAgC;WACvB;EAEN,YAAA,iBAAiB,UAAU;;;;;;cAU9B,8BAA8B;WACrB;EAEN,YAAA,iBAAiB,UAAU;;;;;;cAU9B,wCAAwC;WAC/B;EAEN,YAAA,iBAAiB,UAAU;;;cAO9B,yBAAyB;WAChB;EAEN,YAAA,iBAAiB,UAAU;;;cAO9B,0BAA0B;WACjB;EAEN,YAAA,iBAAiB,UAAU;;;cAO9B,iCAAiC;WACxB;EAEN,YAAA,iBAAiB,UAAU;;;cAO9B,2BAA2B;WAClB;EAEN,YAAA,iBAAiB,UAAU;;;;;;cAU9B,yBAAyB;WAChB;EAEN,YAAA,iBAAiB,UAAU;;;cAO9B,mCAAmC;WAC1B;EAEN,YAAA,iBAAiB,UAAU;;;cAO9B,4BAA4B;WACnB;EAEN,YAAA,iBAAiB,UAAU;;;cAO9B,sCAAsC;WAC7B;EAEN,YAAA,iBAAiB,UAAU;;;cAO9B,mCAAmC;WAC1B;EAEN,YAAA,iBAAiB,UAAU;;;KAO/B;;;;;cAWC,6BAA6B;WAKzB,QAAQ;WAJH;EAGd,YAAA,iBACS,QAAQ,8BACjB,UAAU;;;;;;;cAYL,4BAA4B;WAC5B;WACA;EAEG,YAAA,iBAAiB,UAAU;;;;;;;iBAW3B,aAAa;;iBAKb,oBACZ,gBACA,iBACA,UAAU,wBACX"}
|
package/dist/shared/errors.js
CHANGED
|
@@ -149,6 +149,17 @@ var RevisionConflictError = class extends PreconditionFailedError {
|
|
|
149
149
|
this.name = "RevisionConflictError";
|
|
150
150
|
}
|
|
151
151
|
};
|
|
152
|
+
/**
|
|
153
|
+
* The subaccount authorization is expired, replaced by a newer challenge, replayed,
|
|
154
|
+
* or otherwise invalid. Request a fresh challenge via `subaccounts.createChallenge`.
|
|
155
|
+
*/
|
|
156
|
+
var SubaccountChallengeInvalidError = class extends PreconditionFailedError {
|
|
157
|
+
code = "SUBACCOUNT_CHALLENGE_INVALID";
|
|
158
|
+
constructor(message, options) {
|
|
159
|
+
super(message, options);
|
|
160
|
+
this.name = "SubaccountChallengeInvalidError";
|
|
161
|
+
}
|
|
162
|
+
};
|
|
152
163
|
/** The policy cannot be removed while accounts or API keys still use it. */
|
|
153
164
|
var PolicyInUseError = class extends PreconditionFailedError {
|
|
154
165
|
code = "POLICY_IN_USE";
|
|
@@ -272,6 +283,6 @@ function errorFromHttpStatus(status, message, options) {
|
|
|
272
283
|
return new NetworkError(message, options);
|
|
273
284
|
}
|
|
274
285
|
//#endregion
|
|
275
|
-
export { AlreadyExistsError, AuthenticationError, ConfigurationError, InternalServerError, MfaEnrollmentRequiredError, MfaLastFactorRequiredError, MfaRequiredError, MfaVerificationError, NetworkError, PermissionError, PolicyInUseError, PolicyLockedError, PolicyScopeMismatchError, PolyesterError, PreconditionFailedError, RateLimitError, RequestError, ResourceNotFoundError, RevisionConflictError, ServiceUnavailableError, SessionElevationRequiredError, StaleQuoteError, StepUpRequiredError, TimeoutError, TransientError, ValidationError, errorFromHttpStatus, isAbortError, normalizeErrorMessage };
|
|
286
|
+
export { AlreadyExistsError, AuthenticationError, ConfigurationError, InternalServerError, MfaEnrollmentRequiredError, MfaLastFactorRequiredError, MfaRequiredError, MfaVerificationError, NetworkError, PermissionError, PolicyInUseError, PolicyLockedError, PolicyScopeMismatchError, PolyesterError, PreconditionFailedError, RateLimitError, RequestError, ResourceNotFoundError, RevisionConflictError, ServiceUnavailableError, SessionElevationRequiredError, StaleQuoteError, StepUpRequiredError, SubaccountChallengeInvalidError, TimeoutError, TransientError, ValidationError, errorFromHttpStatus, isAbortError, normalizeErrorMessage };
|
|
276
287
|
|
|
277
288
|
//# sourceMappingURL=errors.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.js","names":[],"sources":["../../src/shared/errors.ts"],"sourcesContent":["import type { PolyesterErrorDetail } from \"./error-detail.js\";\nexport type { PolyesterErrorDetail } from \"./error-detail.js\";\nimport type { RateLimitDetail } from \"./rate-limit.schemas.js\";\n\n/**\n * Typed error hierarchy for the Polyester SDK.\n *\n * Every error raised by the SDK extends {@link PolyesterError}, which carries a\n * stable machine-readable `code` and a `retryable` flag. The tree splits on\n * retryability so callers can triage with a single `instanceof` check:\n *\n * ```\n * PolyesterError code retryable\n * ├── TransientError TRANSIENT_FAILURE true\n * │ ├── NetworkError NETWORK_ERROR true\n * │ ├── TimeoutError TIMEOUT true\n * │ ├── RateLimitError RATE_LIMITED true\n * │ └── ServiceUnavailableError SERVICE_UNAVAILABLE true\n * ├── RequestError REQUEST_FAILED false\n * │ ├── ValidationError VALIDATION_FAILED false\n * │ │ ├── StaleQuoteError STALE_QUOTE\n * │ │ └── PolicyScopeMismatchError POLICY_SCOPE_MISMATCH\n * │ ├── ResourceNotFoundError RESOURCE_NOT_FOUND false\n * │ ├── AlreadyExistsError ALREADY_EXISTS false\n * │ ├── PermissionError PERMISSION_DENIED false\n * │ ├── AuthenticationError UNAUTHENTICATED false\n * │ ├── PreconditionFailedError PRECONDITION_FAILED false\n * │ │ ├── RevisionConflictError REVISION_CONFLICT\n * │ │ ├── PolicyInUseError POLICY_IN_USE\n * │ │ ├── PolicyLockedError POLICY_LOCKED\n * │ │ └── MfaLastFactorRequiredError MFA_LAST_FACTOR_REQUIRED\n * │ ├── ConfigurationError INVALID_CONFIGURATION false\n * │ ├── MfaRequiredError MFA_REQUIRED false\n * │ │ ├── MfaEnrollmentRequiredError MFA_ENROLLMENT_REQUIRED\n * │ │ ├── StepUpRequiredError STEP_UP_REQUIRED\n * │ │ └── SessionElevationRequiredError SESSION_ELEVATION_REQUIRED\n * │ └── MfaVerificationError MFA_VERIFICATION_FAILED false\n * └── InternalServerError INTERNAL_SERVER_ERROR false\n * ```\n *\n * Catalog errors (`CatalogLookupError`, `CatalogConversionError`, …) plug into\n * the same tree under `RequestError`/`ValidationError`.\n *\n * Errors mapped from RPC failures keep the original `ConnectError` as `cause`.\n *\n * @example\n * ```ts\n * try {\n * await client.orders.createSpotOrder(input);\n * } catch (err) {\n * if (err instanceof RateLimitError) await sleep(err.retryAfterMs ?? 1000);\n * else if (err instanceof TransientError) retry();\n * else if (err instanceof StepUpRequiredError) promptForMfa();\n * else throw err;\n * }\n * ```\n */\n\n/** Stable machine-readable codes carried by built-in SDK errors. */\nexport type PolyesterErrorCode =\n | \"TRANSIENT_FAILURE\"\n | \"NETWORK_ERROR\"\n | \"TIMEOUT\"\n | \"RATE_LIMITED\"\n | \"SERVICE_UNAVAILABLE\"\n | \"REQUEST_FAILED\"\n | \"VALIDATION_FAILED\"\n | \"STALE_QUOTE\"\n | \"RESOURCE_NOT_FOUND\"\n | \"ALREADY_EXISTS\"\n | \"PERMISSION_DENIED\"\n | \"UNAUTHENTICATED\"\n | \"PRECONDITION_FAILED\"\n | \"REVISION_CONFLICT\"\n | \"POLICY_IN_USE\"\n | \"POLICY_LOCKED\"\n | \"POLICY_SCOPE_MISMATCH\"\n | \"INVALID_CONFIGURATION\"\n | \"MFA_REQUIRED\"\n | \"MFA_ENROLLMENT_REQUIRED\"\n | \"STEP_UP_REQUIRED\"\n | \"SESSION_ELEVATION_REQUIRED\"\n | \"MFA_LAST_FACTOR_REQUIRED\"\n | \"MFA_VERIFICATION_FAILED\"\n | \"INTERNAL_SERVER_ERROR\"\n | \"CATALOG_LOOKUP_MISS\"\n | \"CATALOG_NOT_READY\"\n | \"CATALOG_CONVERSION_INVALID\"\n | \"CATALOG_VALIDATION_FAILED\";\n\nexport interface PolyesterErrorOptions {\n /** Underlying error, typically the original `ConnectError` for RPC failures. */\n cause?: unknown;\n /** Recognized structured backend rejection, decoded at the RPC boundary. */\n detail?: PolyesterErrorDetail;\n}\n\nconst CONNECT_ERROR_PREFIX_RE = /^(?:\\[[a-z][a-z0-9_-]*]\\s*)+/i;\n\nexport function normalizeErrorMessage(message: string): string {\n return message.replace(CONNECT_ERROR_PREFIX_RE, \"\").trim();\n}\n\n/**\n * Base class for every error raised by the Polyester SDK.\n *\n * Check `retryable` (or `instanceof TransientError`) to decide whether the\n * same call can be safely retried, and switch on `code` for exhaustive,\n * minification-safe handling.\n */\nexport abstract class PolyesterError extends Error {\n /** Stable machine-readable error code, e.g. `\"RATE_LIMITED\"`. */\n abstract readonly code: string;\n /** Whether retrying the same operation may succeed. */\n abstract readonly retryable: boolean;\n readonly detail: PolyesterErrorDetail | undefined;\n\n constructor(message: string, options?: PolyesterErrorOptions) {\n super(normalizeErrorMessage(message), options);\n this.name = \"PolyesterError\";\n this.detail =\n options?.detail ??\n (options?.cause instanceof PolyesterError ? options.cause.detail : undefined);\n }\n}\n\n/**\n * A transient failure — the request may never have reached the backend or the\n * backend was temporarily unable to serve it. Follow the operation's retry\n * contract: reuse requestId for idempotent mutations. For single-order creation,\n * reconcile by clientOrderId; reusing it returns a conflict rather than replay.\n */\nexport class TransientError extends PolyesterError {\n readonly code: string = \"TRANSIENT_FAILURE\";\n readonly retryable = true;\n\n constructor(message: string, options?: PolyesterErrorOptions) {\n super(message, options);\n this.name = \"TransientError\";\n }\n}\n\n/** The request could not be sent or the connection failed mid-flight. */\nexport class NetworkError extends TransientError {\n override readonly code: string = \"NETWORK_ERROR\";\n\n constructor(message: string, options?: PolyesterErrorOptions) {\n super(message, options);\n this.name = \"NetworkError\";\n }\n}\n\n/** The request timed out before the backend produced a response. */\nexport class TimeoutError extends TransientError {\n override readonly code: string = \"TIMEOUT\";\n\n constructor(message: string, options?: PolyesterErrorOptions) {\n super(message, options);\n this.name = \"TimeoutError\";\n }\n}\n\nexport interface RateLimitErrorOptions extends PolyesterErrorOptions {\n /** Suggested wait before retrying, when the backend provided one. */\n retryAfterMs?: number;\n /** Structured quota state attached to the rejection, when provided. */\n rateLimit?: RateLimitDetail;\n}\n\n/** The backend rejected the request due to rate limiting. */\nexport class RateLimitError extends TransientError {\n override readonly code: string = \"RATE_LIMITED\";\n /** Suggested wait before retrying, in milliseconds, when known. */\n readonly retryAfterMs?: number;\n /** Structured quota state attached to the rejection, when provided. */\n readonly rateLimit?: RateLimitDetail;\n\n constructor(message: string, options?: RateLimitErrorOptions) {\n super(message, options);\n this.name = \"RateLimitError\";\n this.retryAfterMs = options?.retryAfterMs;\n this.rateLimit = options?.rateLimit;\n }\n}\n\n/** The backend is temporarily unavailable (e.g. overloaded or restarting). */\nexport class ServiceUnavailableError extends TransientError {\n override readonly code: string = \"SERVICE_UNAVAILABLE\";\n\n constructor(message: string, options?: PolyesterErrorOptions) {\n super(message, options);\n this.name = \"ServiceUnavailableError\";\n }\n}\n\n/**\n * The request itself was rejected — retrying the identical call will fail the\n * same way. Fix the input, authentication, or permissions first.\n */\nexport class RequestError extends PolyesterError {\n readonly code: string = \"REQUEST_FAILED\";\n readonly retryable = false;\n\n constructor(message: string, options?: PolyesterErrorOptions) {\n super(message, options);\n this.name = \"RequestError\";\n }\n}\n\n/** The request input failed validation (client- or server-side). */\nexport class ValidationError extends RequestError {\n override readonly code: string = \"VALIDATION_FAILED\";\n\n constructor(message: string, options?: PolyesterErrorOptions) {\n super(message, options);\n this.name = \"ValidationError\";\n }\n}\n\n/** The submitted client reference quote exceeded the market's configured drift limit. */\nexport class StaleQuoteError extends ValidationError {\n override readonly code = \"STALE_QUOTE\" as const;\n\n constructor(message: string, options?: PolyesterErrorOptions) {\n super(message, options);\n this.name = \"StaleQuoteError\";\n }\n}\n\n/** The requested resource does not exist (or is not visible to the caller). */\nexport class ResourceNotFoundError extends RequestError {\n override readonly code: string = \"RESOURCE_NOT_FOUND\";\n\n constructor(message: string, options?: PolyesterErrorOptions) {\n super(message, options);\n this.name = \"ResourceNotFoundError\";\n }\n}\n\n/** The resource already exists (e.g. a duplicate `clientOrderId`). */\nexport class AlreadyExistsError extends RequestError {\n override readonly code: string = \"ALREADY_EXISTS\";\n\n constructor(message: string, options?: PolyesterErrorOptions) {\n super(message, options);\n this.name = \"AlreadyExistsError\";\n }\n}\n\n/** The caller is authenticated but not allowed to perform this operation. */\nexport class PermissionError extends RequestError {\n override readonly code: string = \"PERMISSION_DENIED\";\n\n constructor(message: string, options?: PolyesterErrorOptions) {\n super(message, options);\n this.name = \"PermissionError\";\n }\n}\n\n/** The caller is not authenticated (missing, expired, or invalid credentials). */\nexport class AuthenticationError extends RequestError {\n override readonly code: string = \"UNAUTHENTICATED\";\n\n constructor(message: string, options?: PolyesterErrorOptions) {\n super(message, options);\n this.name = \"AuthenticationError\";\n }\n}\n\n/** The system is not in a state that allows this operation (e.g. insufficient balance). */\nexport class PreconditionFailedError extends RequestError {\n override readonly code: string = \"PRECONDITION_FAILED\";\n\n constructor(message: string, options?: PolyesterErrorOptions) {\n super(message, options);\n this.name = \"PreconditionFailedError\";\n }\n}\n\n/**\n * The resource changed after it was read, so the submitted expected revision\n * is stale. Refetch and let the caller reconcile; do not blindly retry.\n */\nexport class RevisionConflictError extends PreconditionFailedError {\n override readonly code: string = \"REVISION_CONFLICT\";\n\n constructor(message: string, options?: PolyesterErrorOptions) {\n super(message, options);\n this.name = \"RevisionConflictError\";\n }\n}\n\n/** The policy cannot be removed while accounts or API keys still use it. */\nexport class PolicyInUseError extends PreconditionFailedError {\n override readonly code: string = \"POLICY_IN_USE\";\n\n constructor(message: string, options?: PolyesterErrorOptions) {\n super(message, options);\n this.name = \"PolicyInUseError\";\n }\n}\n\n/** The policy is locked against the requested mutation. */\nexport class PolicyLockedError extends PreconditionFailedError {\n override readonly code: string = \"POLICY_LOCKED\";\n\n constructor(message: string, options?: PolyesterErrorOptions) {\n super(message, options);\n this.name = \"PolicyLockedError\";\n }\n}\n\n/** The policy does not belong to the account scope targeted by the request. */\nexport class PolicyScopeMismatchError extends ValidationError {\n override readonly code: string = \"POLICY_SCOPE_MISMATCH\";\n\n constructor(message: string, options?: PolyesterErrorOptions) {\n super(message, options);\n this.name = \"PolicyScopeMismatchError\";\n }\n}\n\n/** The SDK was configured incorrectly (bad environment, missing credentials, …). */\nexport class ConfigurationError extends RequestError {\n override readonly code: string = \"INVALID_CONFIGURATION\";\n\n constructor(message: string, options?: PolyesterErrorOptions) {\n super(message, options);\n this.name = \"ConfigurationError\";\n }\n}\n\n/**\n * The operation requires additional multi-factor authentication. Catch this\n * class to handle all MFA flows, or the subclasses to branch per flow.\n */\nexport class MfaRequiredError extends RequestError {\n override readonly code: string = \"MFA_REQUIRED\";\n\n constructor(message: string, options?: PolyesterErrorOptions) {\n super(message, options);\n this.name = \"MfaRequiredError\";\n }\n}\n\n/** The user must enroll in MFA before this operation can proceed. */\nexport class MfaEnrollmentRequiredError extends MfaRequiredError {\n override readonly code: string = \"MFA_ENROLLMENT_REQUIRED\";\n\n constructor(message: string, options?: PolyesterErrorOptions) {\n super(message, options);\n this.name = \"MfaEnrollmentRequiredError\";\n }\n}\n\n/** The operation requires a fresh MFA step-up proof (retry with `X-Auth-Step-Up`). */\nexport class StepUpRequiredError extends MfaRequiredError {\n override readonly code: string = \"STEP_UP_REQUIRED\";\n\n constructor(message: string, options?: PolyesterErrorOptions) {\n super(message, options);\n this.name = \"StepUpRequiredError\";\n }\n}\n\n/** The operation requires a recent MFA-elevated session, not a one-use step-up proof. */\nexport class SessionElevationRequiredError extends MfaRequiredError {\n override readonly code: string = \"SESSION_ELEVATION_REQUIRED\";\n\n constructor(message: string, options?: PolyesterErrorOptions) {\n super(message, options);\n this.name = \"SessionElevationRequiredError\";\n }\n}\n\n/** The requested deletion would leave the account without an active MFA factor. */\nexport class MfaLastFactorRequiredError extends PreconditionFailedError {\n override readonly code: string = \"MFA_LAST_FACTOR_REQUIRED\";\n\n constructor(message: string, options?: PolyesterErrorOptions) {\n super(message, options);\n this.name = \"MfaLastFactorRequiredError\";\n }\n}\n\n/** The reason an MFA challenge could not be completed. */\nexport type MfaVerificationFailureReason =\n | \"challenge-invalid\"\n | \"challenge-locked\"\n | \"otp-invalid\"\n | \"recovery-code-invalid\"\n | \"passkey-invalid\";\n\n/**\n * An expected MFA verification rejection. Callers should select their own\n * user-facing copy from `reason` instead of displaying the backend message.\n */\nexport class MfaVerificationError extends RequestError {\n override readonly code: string = \"MFA_VERIFICATION_FAILED\";\n\n constructor(\n message: string,\n readonly reason: MfaVerificationFailureReason,\n options?: PolyesterErrorOptions,\n ) {\n super(message, options);\n this.name = \"MfaVerificationError\";\n }\n}\n\n/**\n * The backend failed unexpectedly or returned a malformed response. Not\n * automatically retryable — the failure may recur and mutations may have\n * partially applied.\n */\nexport class InternalServerError extends PolyesterError {\n readonly code: string = \"INTERNAL_SERVER_ERROR\";\n readonly retryable = false;\n\n constructor(message: string, options?: PolyesterErrorOptions) {\n super(message, options);\n this.name = \"InternalServerError\";\n }\n}\n\n/**\n * Checks whether an error represents an aborted request (caller-initiated via\n * `AbortSignal`). Aborts are intentionally NOT part of the {@link PolyesterError}\n * tree and are never retryable.\n */\nexport function isAbortError(err: unknown): boolean {\n return err instanceof DOMException && err.name === \"AbortError\";\n}\n\n/** Maps a plain HTTP status code onto the SDK error tree. */\nexport function errorFromHttpStatus(\n status: number,\n message: string,\n options?: PolyesterErrorOptions,\n): PolyesterError {\n if (status === 401) return new AuthenticationError(message, options);\n if (status === 403) return new PermissionError(message, options);\n if (status === 404) return new ResourceNotFoundError(message, options);\n if (status === 408) return new TimeoutError(message, options);\n if (status === 409) return new AlreadyExistsError(message, options);\n if (status === 429) return new RateLimitError(message, options);\n if (status === 502 || status === 503 || status === 504) {\n return new ServiceUnavailableError(message, options);\n }\n if (status >= 500) return new InternalServerError(message, options);\n if (status >= 400) return new RequestError(message, options);\n return new NetworkError(message, options);\n}\n"],"mappings":";AAiGA,MAAM,0BAA0B;AAEhC,SAAgB,sBAAsB,SAAyB;CAC3D,OAAO,QAAQ,QAAQ,yBAAyB,EAAE,CAAC,CAAC,KAAK;AAC7D;;;;;;;;AASA,IAAsB,iBAAtB,MAAsB,uBAAuB,MAAM;CAK/C;CAEA,YAAY,SAAiB,SAAiC;EAC1D,MAAM,sBAAsB,OAAO,GAAG,OAAO;EAC7C,KAAK,OAAO;EACZ,KAAK,SACD,SAAS,WACR,SAAS,iBAAiB,iBAAiB,QAAQ,MAAM,SAAS,KAAA;CAC3E;AACJ;;;;;;;AAQA,IAAa,iBAAb,cAAoC,eAAe;CAC/C,OAAwB;CACxB,YAAqB;CAErB,YAAY,SAAiB,SAAiC;EAC1D,MAAM,SAAS,OAAO;EACtB,KAAK,OAAO;CAChB;AACJ;;AAGA,IAAa,eAAb,cAAkC,eAAe;CAC7C,OAAiC;CAEjC,YAAY,SAAiB,SAAiC;EAC1D,MAAM,SAAS,OAAO;EACtB,KAAK,OAAO;CAChB;AACJ;;AAGA,IAAa,eAAb,cAAkC,eAAe;CAC7C,OAAiC;CAEjC,YAAY,SAAiB,SAAiC;EAC1D,MAAM,SAAS,OAAO;EACtB,KAAK,OAAO;CAChB;AACJ;;AAUA,IAAa,iBAAb,cAAoC,eAAe;CAC/C,OAAiC;;CAEjC;;CAEA;CAEA,YAAY,SAAiB,SAAiC;EAC1D,MAAM,SAAS,OAAO;EACtB,KAAK,OAAO;EACZ,KAAK,eAAe,SAAS;EAC7B,KAAK,YAAY,SAAS;CAC9B;AACJ;;AAGA,IAAa,0BAAb,cAA6C,eAAe;CACxD,OAAiC;CAEjC,YAAY,SAAiB,SAAiC;EAC1D,MAAM,SAAS,OAAO;EACtB,KAAK,OAAO;CAChB;AACJ;;;;;AAMA,IAAa,eAAb,cAAkC,eAAe;CAC7C,OAAwB;CACxB,YAAqB;CAErB,YAAY,SAAiB,SAAiC;EAC1D,MAAM,SAAS,OAAO;EACtB,KAAK,OAAO;CAChB;AACJ;;AAGA,IAAa,kBAAb,cAAqC,aAAa;CAC9C,OAAiC;CAEjC,YAAY,SAAiB,SAAiC;EAC1D,MAAM,SAAS,OAAO;EACtB,KAAK,OAAO;CAChB;AACJ;;AAGA,IAAa,kBAAb,cAAqC,gBAAgB;CACjD,OAAyB;CAEzB,YAAY,SAAiB,SAAiC;EAC1D,MAAM,SAAS,OAAO;EACtB,KAAK,OAAO;CAChB;AACJ;;AAGA,IAAa,wBAAb,cAA2C,aAAa;CACpD,OAAiC;CAEjC,YAAY,SAAiB,SAAiC;EAC1D,MAAM,SAAS,OAAO;EACtB,KAAK,OAAO;CAChB;AACJ;;AAGA,IAAa,qBAAb,cAAwC,aAAa;CACjD,OAAiC;CAEjC,YAAY,SAAiB,SAAiC;EAC1D,MAAM,SAAS,OAAO;EACtB,KAAK,OAAO;CAChB;AACJ;;AAGA,IAAa,kBAAb,cAAqC,aAAa;CAC9C,OAAiC;CAEjC,YAAY,SAAiB,SAAiC;EAC1D,MAAM,SAAS,OAAO;EACtB,KAAK,OAAO;CAChB;AACJ;;AAGA,IAAa,sBAAb,cAAyC,aAAa;CAClD,OAAiC;CAEjC,YAAY,SAAiB,SAAiC;EAC1D,MAAM,SAAS,OAAO;EACtB,KAAK,OAAO;CAChB;AACJ;;AAGA,IAAa,0BAAb,cAA6C,aAAa;CACtD,OAAiC;CAEjC,YAAY,SAAiB,SAAiC;EAC1D,MAAM,SAAS,OAAO;EACtB,KAAK,OAAO;CAChB;AACJ;;;;;AAMA,IAAa,wBAAb,cAA2C,wBAAwB;CAC/D,OAAiC;CAEjC,YAAY,SAAiB,SAAiC;EAC1D,MAAM,SAAS,OAAO;EACtB,KAAK,OAAO;CAChB;AACJ;;AAGA,IAAa,mBAAb,cAAsC,wBAAwB;CAC1D,OAAiC;CAEjC,YAAY,SAAiB,SAAiC;EAC1D,MAAM,SAAS,OAAO;EACtB,KAAK,OAAO;CAChB;AACJ;;AAGA,IAAa,oBAAb,cAAuC,wBAAwB;CAC3D,OAAiC;CAEjC,YAAY,SAAiB,SAAiC;EAC1D,MAAM,SAAS,OAAO;EACtB,KAAK,OAAO;CAChB;AACJ;;AAGA,IAAa,2BAAb,cAA8C,gBAAgB;CAC1D,OAAiC;CAEjC,YAAY,SAAiB,SAAiC;EAC1D,MAAM,SAAS,OAAO;EACtB,KAAK,OAAO;CAChB;AACJ;;AAGA,IAAa,qBAAb,cAAwC,aAAa;CACjD,OAAiC;CAEjC,YAAY,SAAiB,SAAiC;EAC1D,MAAM,SAAS,OAAO;EACtB,KAAK,OAAO;CAChB;AACJ;;;;;AAMA,IAAa,mBAAb,cAAsC,aAAa;CAC/C,OAAiC;CAEjC,YAAY,SAAiB,SAAiC;EAC1D,MAAM,SAAS,OAAO;EACtB,KAAK,OAAO;CAChB;AACJ;;AAGA,IAAa,6BAAb,cAAgD,iBAAiB;CAC7D,OAAiC;CAEjC,YAAY,SAAiB,SAAiC;EAC1D,MAAM,SAAS,OAAO;EACtB,KAAK,OAAO;CAChB;AACJ;;AAGA,IAAa,sBAAb,cAAyC,iBAAiB;CACtD,OAAiC;CAEjC,YAAY,SAAiB,SAAiC;EAC1D,MAAM,SAAS,OAAO;EACtB,KAAK,OAAO;CAChB;AACJ;;AAGA,IAAa,gCAAb,cAAmD,iBAAiB;CAChE,OAAiC;CAEjC,YAAY,SAAiB,SAAiC;EAC1D,MAAM,SAAS,OAAO;EACtB,KAAK,OAAO;CAChB;AACJ;;AAGA,IAAa,6BAAb,cAAgD,wBAAwB;CACpE,OAAiC;CAEjC,YAAY,SAAiB,SAAiC;EAC1D,MAAM,SAAS,OAAO;EACtB,KAAK,OAAO;CAChB;AACJ;;;;;AAcA,IAAa,uBAAb,cAA0C,aAAa;CAKtC;CAJb,OAAiC;CAEjC,YACI,SACA,QACA,SACF;EACE,MAAM,SAAS,OAAO;EAHb,KAAA,SAAA;EAIT,KAAK,OAAO;CAChB;AACJ;;;;;;AAOA,IAAa,sBAAb,cAAyC,eAAe;CACpD,OAAwB;CACxB,YAAqB;CAErB,YAAY,SAAiB,SAAiC;EAC1D,MAAM,SAAS,OAAO;EACtB,KAAK,OAAO;CAChB;AACJ;;;;;;AAOA,SAAgB,aAAa,KAAuB;CAChD,OAAO,eAAe,gBAAgB,IAAI,SAAS;AACvD;;AAGA,SAAgB,oBACZ,QACA,SACA,SACc;CACd,IAAI,WAAW,KAAK,OAAO,IAAI,oBAAoB,SAAS,OAAO;CACnE,IAAI,WAAW,KAAK,OAAO,IAAI,gBAAgB,SAAS,OAAO;CAC/D,IAAI,WAAW,KAAK,OAAO,IAAI,sBAAsB,SAAS,OAAO;CACrE,IAAI,WAAW,KAAK,OAAO,IAAI,aAAa,SAAS,OAAO;CAC5D,IAAI,WAAW,KAAK,OAAO,IAAI,mBAAmB,SAAS,OAAO;CAClE,IAAI,WAAW,KAAK,OAAO,IAAI,eAAe,SAAS,OAAO;CAC9D,IAAI,WAAW,OAAO,WAAW,OAAO,WAAW,KAC/C,OAAO,IAAI,wBAAwB,SAAS,OAAO;CAEvD,IAAI,UAAU,KAAK,OAAO,IAAI,oBAAoB,SAAS,OAAO;CAClE,IAAI,UAAU,KAAK,OAAO,IAAI,aAAa,SAAS,OAAO;CAC3D,OAAO,IAAI,aAAa,SAAS,OAAO;AAC5C"}
|
|
1
|
+
{"version":3,"file":"errors.js","names":[],"sources":["../../src/shared/errors.ts"],"sourcesContent":["import type { PolyesterErrorDetail } from \"./error-detail.js\";\nexport type { PolyesterErrorDetail } from \"./error-detail.js\";\nimport type { RateLimitDetail } from \"./rate-limit.schemas.js\";\n\n/**\n * Typed error hierarchy for the Polyester SDK.\n *\n * Every error raised by the SDK extends {@link PolyesterError}, which carries a\n * stable machine-readable `code` and a `retryable` flag. The tree splits on\n * retryability so callers can triage with a single `instanceof` check:\n *\n * ```\n * PolyesterError code retryable\n * ├── TransientError TRANSIENT_FAILURE true\n * │ ├── NetworkError NETWORK_ERROR true\n * │ ├── TimeoutError TIMEOUT true\n * │ ├── RateLimitError RATE_LIMITED true\n * │ └── ServiceUnavailableError SERVICE_UNAVAILABLE true\n * ├── RequestError REQUEST_FAILED false\n * │ ├── ValidationError VALIDATION_FAILED false\n * │ │ ├── StaleQuoteError STALE_QUOTE\n * │ │ └── PolicyScopeMismatchError POLICY_SCOPE_MISMATCH\n * │ ├── ResourceNotFoundError RESOURCE_NOT_FOUND false\n * │ ├── AlreadyExistsError ALREADY_EXISTS false\n * │ ├── PermissionError PERMISSION_DENIED false\n * │ ├── AuthenticationError UNAUTHENTICATED false\n * │ ├── PreconditionFailedError PRECONDITION_FAILED false\n * │ │ ├── RevisionConflictError REVISION_CONFLICT\n * │ │ ├── PolicyInUseError POLICY_IN_USE\n * │ │ ├── PolicyLockedError POLICY_LOCKED\n * │ │ ├── SubaccountChallengeInvalidError SUBACCOUNT_CHALLENGE_INVALID\n * │ │ └── MfaLastFactorRequiredError MFA_LAST_FACTOR_REQUIRED\n * │ ├── ConfigurationError INVALID_CONFIGURATION false\n * │ ├── MfaRequiredError MFA_REQUIRED false\n * │ │ ├── MfaEnrollmentRequiredError MFA_ENROLLMENT_REQUIRED\n * │ │ ├── StepUpRequiredError STEP_UP_REQUIRED\n * │ │ └── SessionElevationRequiredError SESSION_ELEVATION_REQUIRED\n * │ └── MfaVerificationError MFA_VERIFICATION_FAILED false\n * └── InternalServerError INTERNAL_SERVER_ERROR false\n * ```\n *\n * Catalog errors (`CatalogLookupError`, `CatalogConversionError`, …) plug into\n * the same tree under `RequestError`/`ValidationError`.\n *\n * Errors mapped from RPC failures keep the original `ConnectError` as `cause`.\n *\n * @example\n * ```ts\n * try {\n * await client.orders.createSpotOrder(input);\n * } catch (err) {\n * if (err instanceof RateLimitError) await sleep(err.retryAfterMs ?? 1000);\n * else if (err instanceof TransientError) retry();\n * else if (err instanceof StepUpRequiredError) promptForMfa();\n * else throw err;\n * }\n * ```\n */\n\n/** Stable machine-readable codes carried by built-in SDK errors. */\nexport type PolyesterErrorCode =\n | \"TRANSIENT_FAILURE\"\n | \"NETWORK_ERROR\"\n | \"TIMEOUT\"\n | \"RATE_LIMITED\"\n | \"SERVICE_UNAVAILABLE\"\n | \"REQUEST_FAILED\"\n | \"VALIDATION_FAILED\"\n | \"STALE_QUOTE\"\n | \"RESOURCE_NOT_FOUND\"\n | \"ALREADY_EXISTS\"\n | \"PERMISSION_DENIED\"\n | \"UNAUTHENTICATED\"\n | \"PRECONDITION_FAILED\"\n | \"REVISION_CONFLICT\"\n | \"POLICY_IN_USE\"\n | \"POLICY_LOCKED\"\n | \"POLICY_SCOPE_MISMATCH\"\n | \"INVALID_CONFIGURATION\"\n | \"MFA_REQUIRED\"\n | \"MFA_ENROLLMENT_REQUIRED\"\n | \"STEP_UP_REQUIRED\"\n | \"SESSION_ELEVATION_REQUIRED\"\n | \"MFA_LAST_FACTOR_REQUIRED\"\n | \"MFA_VERIFICATION_FAILED\"\n | \"INTERNAL_SERVER_ERROR\"\n | \"CATALOG_LOOKUP_MISS\"\n | \"CATALOG_NOT_READY\"\n | \"CATALOG_CONVERSION_INVALID\"\n | \"CATALOG_VALIDATION_FAILED\";\n\nexport interface PolyesterErrorOptions {\n /** Underlying error, typically the original `ConnectError` for RPC failures. */\n cause?: unknown;\n /** Recognized structured backend rejection, decoded at the RPC boundary. */\n detail?: PolyesterErrorDetail;\n}\n\nconst CONNECT_ERROR_PREFIX_RE = /^(?:\\[[a-z][a-z0-9_-]*]\\s*)+/i;\n\nexport function normalizeErrorMessage(message: string): string {\n return message.replace(CONNECT_ERROR_PREFIX_RE, \"\").trim();\n}\n\n/**\n * Base class for every error raised by the Polyester SDK.\n *\n * Check `retryable` (or `instanceof TransientError`) to decide whether the\n * same call can be safely retried, and switch on `code` for exhaustive,\n * minification-safe handling.\n */\nexport abstract class PolyesterError extends Error {\n /** Stable machine-readable error code, e.g. `\"RATE_LIMITED\"`. */\n abstract readonly code: string;\n /** Whether retrying the same operation may succeed. */\n abstract readonly retryable: boolean;\n readonly detail: PolyesterErrorDetail | undefined;\n\n constructor(message: string, options?: PolyesterErrorOptions) {\n super(normalizeErrorMessage(message), options);\n this.name = \"PolyesterError\";\n this.detail =\n options?.detail ??\n (options?.cause instanceof PolyesterError ? options.cause.detail : undefined);\n }\n}\n\n/**\n * A transient failure — the request may never have reached the backend or the\n * backend was temporarily unable to serve it. Follow the operation's retry\n * contract: reuse requestId for idempotent mutations. For single-order creation,\n * reconcile by clientOrderId; reusing it returns a conflict rather than replay.\n */\nexport class TransientError extends PolyesterError {\n readonly code: string = \"TRANSIENT_FAILURE\";\n readonly retryable = true;\n\n constructor(message: string, options?: PolyesterErrorOptions) {\n super(message, options);\n this.name = \"TransientError\";\n }\n}\n\n/** The request could not be sent or the connection failed mid-flight. */\nexport class NetworkError extends TransientError {\n override readonly code: string = \"NETWORK_ERROR\";\n\n constructor(message: string, options?: PolyesterErrorOptions) {\n super(message, options);\n this.name = \"NetworkError\";\n }\n}\n\n/** The request timed out before the backend produced a response. */\nexport class TimeoutError extends TransientError {\n override readonly code: string = \"TIMEOUT\";\n\n constructor(message: string, options?: PolyesterErrorOptions) {\n super(message, options);\n this.name = \"TimeoutError\";\n }\n}\n\nexport interface RateLimitErrorOptions extends PolyesterErrorOptions {\n /** Suggested wait before retrying, when the backend provided one. */\n retryAfterMs?: number;\n /** Structured quota state attached to the rejection, when provided. */\n rateLimit?: RateLimitDetail;\n}\n\n/** The backend rejected the request due to rate limiting. */\nexport class RateLimitError extends TransientError {\n override readonly code: string = \"RATE_LIMITED\";\n /** Suggested wait before retrying, in milliseconds, when known. */\n readonly retryAfterMs?: number;\n /** Structured quota state attached to the rejection, when provided. */\n readonly rateLimit?: RateLimitDetail;\n\n constructor(message: string, options?: RateLimitErrorOptions) {\n super(message, options);\n this.name = \"RateLimitError\";\n this.retryAfterMs = options?.retryAfterMs;\n this.rateLimit = options?.rateLimit;\n }\n}\n\n/** The backend is temporarily unavailable (e.g. overloaded or restarting). */\nexport class ServiceUnavailableError extends TransientError {\n override readonly code: string = \"SERVICE_UNAVAILABLE\";\n\n constructor(message: string, options?: PolyesterErrorOptions) {\n super(message, options);\n this.name = \"ServiceUnavailableError\";\n }\n}\n\n/**\n * The request itself was rejected — retrying the identical call will fail the\n * same way. Fix the input, authentication, or permissions first.\n */\nexport class RequestError extends PolyesterError {\n readonly code: string = \"REQUEST_FAILED\";\n readonly retryable = false;\n\n constructor(message: string, options?: PolyesterErrorOptions) {\n super(message, options);\n this.name = \"RequestError\";\n }\n}\n\n/** The request input failed validation (client- or server-side). */\nexport class ValidationError extends RequestError {\n override readonly code: string = \"VALIDATION_FAILED\";\n\n constructor(message: string, options?: PolyesterErrorOptions) {\n super(message, options);\n this.name = \"ValidationError\";\n }\n}\n\n/** The submitted client reference quote exceeded the market's configured drift limit. */\nexport class StaleQuoteError extends ValidationError {\n override readonly code = \"STALE_QUOTE\" as const;\n\n constructor(message: string, options?: PolyesterErrorOptions) {\n super(message, options);\n this.name = \"StaleQuoteError\";\n }\n}\n\n/** The requested resource does not exist (or is not visible to the caller). */\nexport class ResourceNotFoundError extends RequestError {\n override readonly code: string = \"RESOURCE_NOT_FOUND\";\n\n constructor(message: string, options?: PolyesterErrorOptions) {\n super(message, options);\n this.name = \"ResourceNotFoundError\";\n }\n}\n\n/** The resource already exists (e.g. a duplicate `clientOrderId`). */\nexport class AlreadyExistsError extends RequestError {\n override readonly code: string = \"ALREADY_EXISTS\";\n\n constructor(message: string, options?: PolyesterErrorOptions) {\n super(message, options);\n this.name = \"AlreadyExistsError\";\n }\n}\n\n/** The caller is authenticated but not allowed to perform this operation. */\nexport class PermissionError extends RequestError {\n override readonly code: string = \"PERMISSION_DENIED\";\n\n constructor(message: string, options?: PolyesterErrorOptions) {\n super(message, options);\n this.name = \"PermissionError\";\n }\n}\n\n/** The caller is not authenticated (missing, expired, or invalid credentials). */\nexport class AuthenticationError extends RequestError {\n override readonly code: string = \"UNAUTHENTICATED\";\n\n constructor(message: string, options?: PolyesterErrorOptions) {\n super(message, options);\n this.name = \"AuthenticationError\";\n }\n}\n\n/** The system is not in a state that allows this operation (e.g. insufficient balance). */\nexport class PreconditionFailedError extends RequestError {\n override readonly code: string = \"PRECONDITION_FAILED\";\n\n constructor(message: string, options?: PolyesterErrorOptions) {\n super(message, options);\n this.name = \"PreconditionFailedError\";\n }\n}\n\n/**\n * The resource changed after it was read, so the submitted expected revision\n * is stale. Refetch and let the caller reconcile; do not blindly retry.\n */\nexport class RevisionConflictError extends PreconditionFailedError {\n override readonly code: string = \"REVISION_CONFLICT\";\n\n constructor(message: string, options?: PolyesterErrorOptions) {\n super(message, options);\n this.name = \"RevisionConflictError\";\n }\n}\n\n/**\n * The subaccount authorization is expired, replaced by a newer challenge, replayed,\n * or otherwise invalid. Request a fresh challenge via `subaccounts.createChallenge`.\n */\nexport class SubaccountChallengeInvalidError extends PreconditionFailedError {\n override readonly code: string = \"SUBACCOUNT_CHALLENGE_INVALID\";\n\n constructor(message: string, options?: PolyesterErrorOptions) {\n super(message, options);\n this.name = \"SubaccountChallengeInvalidError\";\n }\n}\n\n/** The policy cannot be removed while accounts or API keys still use it. */\nexport class PolicyInUseError extends PreconditionFailedError {\n override readonly code: string = \"POLICY_IN_USE\";\n\n constructor(message: string, options?: PolyesterErrorOptions) {\n super(message, options);\n this.name = \"PolicyInUseError\";\n }\n}\n\n/** The policy is locked against the requested mutation. */\nexport class PolicyLockedError extends PreconditionFailedError {\n override readonly code: string = \"POLICY_LOCKED\";\n\n constructor(message: string, options?: PolyesterErrorOptions) {\n super(message, options);\n this.name = \"PolicyLockedError\";\n }\n}\n\n/** The policy does not belong to the account scope targeted by the request. */\nexport class PolicyScopeMismatchError extends ValidationError {\n override readonly code: string = \"POLICY_SCOPE_MISMATCH\";\n\n constructor(message: string, options?: PolyesterErrorOptions) {\n super(message, options);\n this.name = \"PolicyScopeMismatchError\";\n }\n}\n\n/** The SDK was configured incorrectly (bad environment, missing credentials, …). */\nexport class ConfigurationError extends RequestError {\n override readonly code: string = \"INVALID_CONFIGURATION\";\n\n constructor(message: string, options?: PolyesterErrorOptions) {\n super(message, options);\n this.name = \"ConfigurationError\";\n }\n}\n\n/**\n * The operation requires additional multi-factor authentication. Catch this\n * class to handle all MFA flows, or the subclasses to branch per flow.\n */\nexport class MfaRequiredError extends RequestError {\n override readonly code: string = \"MFA_REQUIRED\";\n\n constructor(message: string, options?: PolyesterErrorOptions) {\n super(message, options);\n this.name = \"MfaRequiredError\";\n }\n}\n\n/** The user must enroll in MFA before this operation can proceed. */\nexport class MfaEnrollmentRequiredError extends MfaRequiredError {\n override readonly code: string = \"MFA_ENROLLMENT_REQUIRED\";\n\n constructor(message: string, options?: PolyesterErrorOptions) {\n super(message, options);\n this.name = \"MfaEnrollmentRequiredError\";\n }\n}\n\n/** The operation requires a fresh MFA step-up proof (retry with `X-Auth-Step-Up`). */\nexport class StepUpRequiredError extends MfaRequiredError {\n override readonly code: string = \"STEP_UP_REQUIRED\";\n\n constructor(message: string, options?: PolyesterErrorOptions) {\n super(message, options);\n this.name = \"StepUpRequiredError\";\n }\n}\n\n/** The operation requires a recent MFA-elevated session, not a one-use step-up proof. */\nexport class SessionElevationRequiredError extends MfaRequiredError {\n override readonly code: string = \"SESSION_ELEVATION_REQUIRED\";\n\n constructor(message: string, options?: PolyesterErrorOptions) {\n super(message, options);\n this.name = \"SessionElevationRequiredError\";\n }\n}\n\n/** The requested deletion would leave the account without an active MFA factor. */\nexport class MfaLastFactorRequiredError extends PreconditionFailedError {\n override readonly code: string = \"MFA_LAST_FACTOR_REQUIRED\";\n\n constructor(message: string, options?: PolyesterErrorOptions) {\n super(message, options);\n this.name = \"MfaLastFactorRequiredError\";\n }\n}\n\n/** The reason an MFA challenge could not be completed. */\nexport type MfaVerificationFailureReason =\n | \"challenge-invalid\"\n | \"challenge-locked\"\n | \"otp-invalid\"\n | \"recovery-code-invalid\"\n | \"passkey-invalid\";\n\n/**\n * An expected MFA verification rejection. Callers should select their own\n * user-facing copy from `reason` instead of displaying the backend message.\n */\nexport class MfaVerificationError extends RequestError {\n override readonly code: string = \"MFA_VERIFICATION_FAILED\";\n\n constructor(\n message: string,\n readonly reason: MfaVerificationFailureReason,\n options?: PolyesterErrorOptions,\n ) {\n super(message, options);\n this.name = \"MfaVerificationError\";\n }\n}\n\n/**\n * The backend failed unexpectedly or returned a malformed response. Not\n * automatically retryable — the failure may recur and mutations may have\n * partially applied.\n */\nexport class InternalServerError extends PolyesterError {\n readonly code: string = \"INTERNAL_SERVER_ERROR\";\n readonly retryable = false;\n\n constructor(message: string, options?: PolyesterErrorOptions) {\n super(message, options);\n this.name = \"InternalServerError\";\n }\n}\n\n/**\n * Checks whether an error represents an aborted request (caller-initiated via\n * `AbortSignal`). Aborts are intentionally NOT part of the {@link PolyesterError}\n * tree and are never retryable.\n */\nexport function isAbortError(err: unknown): boolean {\n return err instanceof DOMException && err.name === \"AbortError\";\n}\n\n/** Maps a plain HTTP status code onto the SDK error tree. */\nexport function errorFromHttpStatus(\n status: number,\n message: string,\n options?: PolyesterErrorOptions,\n): PolyesterError {\n if (status === 401) return new AuthenticationError(message, options);\n if (status === 403) return new PermissionError(message, options);\n if (status === 404) return new ResourceNotFoundError(message, options);\n if (status === 408) return new TimeoutError(message, options);\n if (status === 409) return new AlreadyExistsError(message, options);\n if (status === 429) return new RateLimitError(message, options);\n if (status === 502 || status === 503 || status === 504) {\n return new ServiceUnavailableError(message, options);\n }\n if (status >= 500) return new InternalServerError(message, options);\n if (status >= 400) return new RequestError(message, options);\n return new NetworkError(message, options);\n}\n"],"mappings":"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"}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { PolyesterEnvironment } from "../environment.js";
|
|
2
2
|
import { Address, LocalAccount, PublicClient } from "viem";
|
|
3
|
-
import { UserOperation } from "viem/account-abstraction";
|
|
4
3
|
import { toSafeSmartAccount } from "permissionless/accounts";
|
|
5
4
|
//#region src/smart-account/smart-account.d.ts
|
|
6
5
|
type SafeSmartAccountInstance = Awaited<ReturnType<typeof toSafeSmartAccount>>;
|
|
@@ -1552,7 +1551,7 @@ declare function createPolyesterSmartAccountClient(account: SafeSmartAccountInst
|
|
|
1552
1551
|
message: import("viem").SignableMessage;
|
|
1553
1552
|
}) => Promise<import("viem").Hex>;
|
|
1554
1553
|
signTypedData: <const typedData extends import("viem").TypedData | Record<string, unknown>, primaryType extends keyof typedData | "EIP712Domain" = keyof typedData>(parameters: import("viem").TypedDataDefinition<typedData, primaryType>) => Promise<import("viem").Hex>;
|
|
1555
|
-
signUserOperation: (parameters: import("viem").UnionPartialBy<UserOperation, "sender"> & {
|
|
1554
|
+
signUserOperation: (parameters: import("viem").UnionPartialBy<import("viem").UserOperation, "sender"> & {
|
|
1556
1555
|
chainId?: number | undefined;
|
|
1557
1556
|
}) => Promise<import("viem").Hex>;
|
|
1558
1557
|
userOperation?: {
|
|
@@ -3081,7 +3080,7 @@ declare function createPolyesterSmartAccountClient(account: SafeSmartAccountInst
|
|
|
3081
3080
|
message: import("viem").SignableMessage;
|
|
3082
3081
|
}) => Promise<import("viem").Hex>;
|
|
3083
3082
|
signTypedData: <const typedData extends import("viem").TypedData | Record<string, unknown>, primaryType extends keyof typedData | "EIP712Domain" = keyof typedData>(parameters: import("viem").TypedDataDefinition<typedData, primaryType>) => Promise<import("viem").Hex>;
|
|
3084
|
-
signUserOperation: (parameters: import("viem").UnionPartialBy<UserOperation, "sender"> & {
|
|
3083
|
+
signUserOperation: (parameters: import("viem").UnionPartialBy<import("viem").UserOperation, "sender"> & {
|
|
3085
3084
|
chainId?: number | undefined;
|
|
3086
3085
|
}) => Promise<import("viem").Hex>;
|
|
3087
3086
|
userOperation?: {
|
|
@@ -4614,7 +4613,7 @@ declare function buildPolyesterSmartAccountClient(account: SafeSmartAccountInsta
|
|
|
4614
4613
|
message: import("viem").SignableMessage;
|
|
4615
4614
|
}) => Promise<import("viem").Hex>;
|
|
4616
4615
|
signTypedData: <const typedData extends import("viem").TypedData | Record<string, unknown>, primaryType extends keyof typedData | "EIP712Domain" = keyof typedData>(parameters: import("viem").TypedDataDefinition<typedData, primaryType>) => Promise<import("viem").Hex>;
|
|
4617
|
-
signUserOperation: (parameters: import("viem").UnionPartialBy<UserOperation, "sender"> & {
|
|
4616
|
+
signUserOperation: (parameters: import("viem").UnionPartialBy<import("viem").UserOperation, "sender"> & {
|
|
4618
4617
|
chainId?: number | undefined;
|
|
4619
4618
|
}) => Promise<import("viem").Hex>;
|
|
4620
4619
|
userOperation?: {
|
|
@@ -6143,7 +6142,7 @@ declare function buildPolyesterSmartAccountClient(account: SafeSmartAccountInsta
|
|
|
6143
6142
|
message: import("viem").SignableMessage;
|
|
6144
6143
|
}) => Promise<import("viem").Hex>;
|
|
6145
6144
|
signTypedData: <const typedData extends import("viem").TypedData | Record<string, unknown>, primaryType extends keyof typedData | "EIP712Domain" = keyof typedData>(parameters: import("viem").TypedDataDefinition<typedData, primaryType>) => Promise<import("viem").Hex>;
|
|
6146
|
-
signUserOperation: (parameters: import("viem").UnionPartialBy<UserOperation, "sender"> & {
|
|
6145
|
+
signUserOperation: (parameters: import("viem").UnionPartialBy<import("viem").UserOperation, "sender"> & {
|
|
6147
6146
|
chainId?: number | undefined;
|
|
6148
6147
|
}) => Promise<import("viem").Hex>;
|
|
6149
6148
|
userOperation?: {
|
|
@@ -6160,8 +6159,8 @@ declare function buildPolyesterSmartAccountClient(account: SafeSmartAccountInsta
|
|
|
6160
6159
|
type: "smart";
|
|
6161
6160
|
}), undefined, undefined>;
|
|
6162
6161
|
/**
|
|
6163
|
-
* Warms the network path for an upcoming submission: primes the gas-price
|
|
6164
|
-
*
|
|
6162
|
+
* Warms the network path for an upcoming submission: primes the gas-price
|
|
6163
|
+
* cache and opens connections to the RPC endpoint. Never
|
|
6165
6164
|
* throws; the nonce is intentionally not cached — fetching it here is
|
|
6166
6165
|
* connection warm-up only.
|
|
6167
6166
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"smart-account.d.ts","names":[],"sources":["../../src/smart-account/smart-account.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"smart-account.d.ts","names":[],"sources":["../../src/smart-account/smart-account.ts"],"mappings":";;;;KAWY,2BAA2B,QAAQ,kBAAkB;KACrD,8BAA8B,kBAAkB;UAqB3C;EACb,aAAa;EACb,OAAO;EACP;EACA,eAAe;;UAGF;EACb,aAAa;EACb,cAAc;EACd;;iBAGY,sCACZ,aACA,cACA,aACD,4CAA4C;;;;iBAuBzB,8BAClB,aACA,OACA,WACA,gBACD,2BAA2B,QAAQ;UAuBrB;;EAEb;;EAEA;;;;;;;iBAQY,kCACZ,SAAS,0BACT;EACI,aAAa;EACb,UAAU;6BACb,kCAAA,gDAAA;;;;;;;;;;;IA3F0B,kBAAA,kCAAA,sCAAA,0CAAA,sCAAA,0BAAA,oBAAA,WAAA,iBAAA,WAAA,gBAAA,aAAA,aAAA;MAAuB,aAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IA4D8B,UAAC;IAGvD,6BAAC;;EAOP,aAAA;IAAgB;;EAO+B,mBAAA,4BAAA,qCAAA,uBAAA;;;;;;;;;;IA4C9D;;;IAMF,gBAAD,8BAAA,yBAAA,uBAAA,4BAAA;;;;;;;;;;;;;;;;;;;IA/HwB,kBAAA,kCAAA,sCAAA,0CAAA,sCAAA,0BAAA,oBAAA,WAAA,iBAAA,WAAA,gBAAA,aAAA,aAAA;MAAuB,aAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IA4D8B,UAAC;IAGvD,6BAAC;;EAOP,aAAA;IAAgB;;EAO+B,mBAAA,4BAAA,qCAAA,uBAAA;;;;;;;;;;IA4C9D;;;IAMF,gBAAD,8BAAA,yBAAA,uBAAA,4BAAA;;;;;;;;;;;;iBAXE,iCACL,SAAS,0BACT,aAAa,sBACb,SAAS,0EAA8C,kCAAA,gDAAA;;;;;;;;;;;IAvH5B,kBAAA,kCAAA,sCAAA,0CAAA,sCAAA,0BAAA,oBAAA,WAAA,iBAAA,WAAA,gBAAA,aAAA,aAAA;MAAuB,aAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IA4D8B,UAAC;IAGvD,6BAAC;;EAOP,aAAA;IAAgB;;EAO+B,mBAAA,4BAAA,qCAAA,uBAAA;;;;;;;;;;IA4C9D;;;IAMF,gBAAD,8BAAA,yBAAA,uBAAA,4BAAA;;;;;;;;;;;;;;;;;;;IA/HwB,kBAAA,kCAAA,sCAAA,0CAAA,sCAAA,0BAAA,oBAAA,WAAA,iBAAA,WAAA,gBAAA,aAAA,aAAA;MAAuB,aAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IA4D8B,UAAC;IAGvD,6BAAC;;EAOP,aAAA;IAAgB;;EAO+B,mBAAA,4BAAA,qCAAA,uBAAA;;;;;;;;;;IA4C9D;;;IAMF,gBAAD,8BAAA,yBAAA,uBAAA,4BAAA;;;;;;;;;;;;;;;;;;iBA2He,gCAClB,QAAQ,8BACT;KAQS;UAEK;;;;;EAKb;;;;;;;EAOA,WAAW,OAAO,6BAA6B;;iBAG7B,2BAClB,QAAQ,6BACR,YAAY,WAAW,sDACvB,UAAS,oCACV,QAAQ,QAAQ,WAAW;UAqDb;;EAEb;;EAEA,UAAU;;;;;;;;;;iBAWQ,qCAClB,QAAQ,6BACR,qBACA,UAAS,8CACV,QAAQ,QAAQ,WAAW"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { predictSafeAddress } from "../account-signer/predict-safe-address.js";
|
|
2
2
|
import { createPublicClient, http, withTimeout } from "viem";
|
|
3
|
-
import { estimateUserOperationGas,
|
|
3
|
+
import { estimateUserOperationGas, prepareUserOperation } from "viem/account-abstraction";
|
|
4
4
|
import { createSmartAccountClient } from "permissionless";
|
|
5
5
|
import { getUserOperationStatus } from "permissionless/actions/pimlico";
|
|
6
6
|
import { toSafeSmartAccount } from "permissionless/accounts";
|
|
@@ -84,27 +84,12 @@ function buildPolyesterSmartAccountClient(account, environment, options) {
|
|
|
84
84
|
});
|
|
85
85
|
const gasPrice = cachedForTtl(() => paymaster.getUserOperationGasPrice(), gasPriceCacheTtlMs);
|
|
86
86
|
const getGasPrice = gasPrice.get;
|
|
87
|
-
const stubData = cachedForTtl(() => paymaster.getPaymasterStubData({
|
|
88
|
-
chainId: environment.chain.id,
|
|
89
|
-
entryPointAddress: environment.accountAbstraction.entryPoint.address,
|
|
90
|
-
sender: account.address,
|
|
91
|
-
nonce: 0n,
|
|
92
|
-
callData: "0x",
|
|
93
|
-
maxFeePerGas: 0n,
|
|
94
|
-
maxPriorityFeePerGas: 0n
|
|
95
|
-
}), Number.POSITIVE_INFINITY);
|
|
96
|
-
const getStubData = stubData.get;
|
|
97
87
|
const client = createSmartAccountClient({
|
|
98
88
|
account,
|
|
99
89
|
chain: environment.chain,
|
|
100
90
|
paymaster: {
|
|
101
|
-
getPaymasterStubData: (
|
|
102
|
-
getPaymasterData:
|
|
103
|
-
return paymaster.sponsorUserOperation({
|
|
104
|
-
userOperation: formatUserOperationRequest(parameters),
|
|
105
|
-
paymasterContext: parameters.context
|
|
106
|
-
});
|
|
107
|
-
}
|
|
91
|
+
getPaymasterStubData: (parameters) => paymaster.getPaymasterStubData(parameters),
|
|
92
|
+
getPaymasterData: (parameters) => paymaster.getPaymasterData(parameters)
|
|
108
93
|
},
|
|
109
94
|
bundlerTransport: http(environment.accountAbstraction.bundlerUrl),
|
|
110
95
|
pollingInterval: pollingIntervalMs,
|
|
@@ -119,10 +104,9 @@ function buildPolyesterSmartAccountClient(account, environment, options) {
|
|
|
119
104
|
}
|
|
120
105
|
}
|
|
121
106
|
});
|
|
122
|
-
smartAccountClientPrimers.set(client, () => Promise.allSettled([getGasPrice()
|
|
107
|
+
smartAccountClientPrimers.set(client, () => Promise.allSettled([getGasPrice()]));
|
|
123
108
|
smartAccountClientCacheResets.set(client, () => {
|
|
124
109
|
gasPrice.clear();
|
|
125
|
-
stubData.clear();
|
|
126
110
|
});
|
|
127
111
|
return client;
|
|
128
112
|
}
|
|
@@ -153,20 +137,21 @@ function addUserOperationGasBuffer(gas) {
|
|
|
153
137
|
return gas + (percentBuffer > USER_OPERATION_MIN_GAS_BUFFER ? percentBuffer : USER_OPERATION_MIN_GAS_BUFFER);
|
|
154
138
|
}
|
|
155
139
|
/**
|
|
156
|
-
* Pads account gas limits (+20%, 50k floor) before
|
|
157
|
-
* limits are left alone: the paymaster sets and signs its own.
|
|
140
|
+
* Pads account and paymaster gas limits (+20%, 50k floor) before getPaymasterData.
|
|
158
141
|
*/
|
|
159
142
|
function bufferPolyesterUserOperationGas(gas) {
|
|
160
143
|
return {
|
|
161
144
|
...gas,
|
|
162
145
|
...typeof gas.callGasLimit === "bigint" ? { callGasLimit: addUserOperationGasBuffer(gas.callGasLimit) } : {},
|
|
163
146
|
...typeof gas.preVerificationGas === "bigint" ? { preVerificationGas: addUserOperationGasBuffer(gas.preVerificationGas) } : {},
|
|
164
|
-
...typeof gas.verificationGasLimit === "bigint" ? { verificationGasLimit: addUserOperationGasBuffer(gas.verificationGasLimit) } : {}
|
|
147
|
+
...typeof gas.verificationGasLimit === "bigint" ? { verificationGasLimit: addUserOperationGasBuffer(gas.verificationGasLimit) } : {},
|
|
148
|
+
...typeof gas.paymasterPostOpGasLimit === "bigint" ? { paymasterPostOpGasLimit: addUserOperationGasBuffer(gas.paymasterPostOpGasLimit) } : {},
|
|
149
|
+
...typeof gas.paymasterVerificationGasLimit === "bigint" ? { paymasterVerificationGasLimit: addUserOperationGasBuffer(gas.paymasterVerificationGasLimit) } : {}
|
|
165
150
|
};
|
|
166
151
|
}
|
|
167
152
|
/**
|
|
168
|
-
* Warms the network path for an upcoming submission: primes the gas-price
|
|
169
|
-
*
|
|
153
|
+
* Warms the network path for an upcoming submission: primes the gas-price
|
|
154
|
+
* cache and opens connections to the RPC endpoint. Never
|
|
170
155
|
* throws; the nonce is intentionally not cached — fetching it here is
|
|
171
156
|
* connection warm-up only.
|
|
172
157
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"smart-account.js","names":[],"sources":["../../src/smart-account/smart-account.ts"],"sourcesContent":["import type { Address, LocalAccount, PublicClient } from \"viem\";\nimport { createPublicClient, http, withTimeout } from \"viem\";\nimport type {\n EstimateUserOperationGasParameters,\n GetPaymasterDataParameters,\n GetPaymasterStubDataParameters,\n UserOperation,\n} from \"viem/account-abstraction\";\nimport {\n estimateUserOperationGas,\n formatUserOperationRequest,\n prepareUserOperation,\n} from \"viem/account-abstraction\";\nimport { createSmartAccountClient } from \"permissionless\";\nimport { getUserOperationStatus } from \"permissionless/actions/pimlico\";\nimport { toSafeSmartAccount } from \"permissionless/accounts\";\nimport { createPimlicoClient } from \"permissionless/clients/pimlico\";\nimport type { PolyesterEnvironment } from \"../environment.js\";\nimport { predictSafeAddress } from \"../account-signer/predict-safe-address.js\";\n\nexport type SafeSmartAccountInstance = Awaited<ReturnType<typeof toSafeSmartAccount>>;\nexport type PolyesterSmartAccountClient = ReturnType<typeof buildPolyesterSmartAccountClient>;\n\nconst smartAccountEnvironmentFingerprints = new WeakMap<SafeSmartAccountInstance, string>();\nconst smartAccountClientPrimers = new WeakMap<object, () => Promise<unknown>>();\nconst smartAccountClientCacheResets = new WeakMap<object, () => void>();\nconst smartAccountClients = new WeakMap<\n SafeSmartAccountInstance,\n Map<string, PolyesterSmartAccountClient>\n>();\nconst USER_OPERATION_GAS_PRICE_TTL_MS = 60_000;\nconst USER_OPERATION_GAS_BUFFER_BPS = 2_000n;\nconst USER_OPERATION_MIN_GAS_BUFFER = 50_000n;\nconst USER_OPERATION_RECEIPT_POLLING_INTERVAL_MS = 250;\n/**\n * While the bundler reports `not_found`, the chain is checked for a receipt\n * on every Nth poll (once per second at the default interval). `not_found` is\n * not definitive — a bundler restart forgets ops whose bundle is still\n * pending — so polling continues until the deadline.\n */\nconst NOT_FOUND_RECEIPT_CHECK_EVERY = 4;\n\nexport interface CreateSmartAccountParams {\n environment: PolyesterEnvironment;\n owner: LocalAccount;\n saltNonce?: bigint;\n publicClient?: PublicClient;\n}\n\nexport interface PredictPolyesterSmartAccountAddressParams {\n environment: PolyesterEnvironment;\n ownerAddress: Address;\n saltNonce?: bigint;\n}\n\nexport function predictPolyesterSmartAccountAddress({\n environment,\n ownerAddress,\n saltNonce = 0n,\n}: PredictPolyesterSmartAccountAddressParams): Address {\n const {\n safeProxyFactoryAddress,\n safeSingletonAddress,\n safeModuleSetupAddress,\n safe4337ModuleAddress,\n multiSendAddress,\n } = environment.accountAbstraction.safe;\n\n return predictSafeAddress({\n owners: [ownerAddress],\n saltNonce,\n safeProxyFactoryAddress,\n safeSingletonAddress,\n safeModuleSetupAddress,\n safe4337ModuleAddress,\n multiSendAddress,\n });\n}\n\n/**\n * Creates a Polyester smart account instance.\n */\nexport async function createPolyesterSmartAccount({\n environment,\n owner,\n saltNonce,\n publicClient,\n}: CreateSmartAccountParams): Promise<SafeSmartAccountInstance> {\n const client =\n publicClient ??\n createPublicClient({\n chain: environment.chain,\n transport: http(environment.rpcUrl),\n });\n\n if (client.chain?.id && client.chain.id !== environment.chain.id) {\n throw new Error(\"Smart account public client chain does not match environment.\");\n }\n\n const account = await toSafeSmartAccount({\n client,\n owners: [owner],\n saltNonce,\n entryPoint: environment.accountAbstraction.entryPoint,\n ...environment.accountAbstraction.safe,\n });\n smartAccountEnvironmentFingerprints.set(account, environment.fingerprint);\n return account;\n}\n\nexport interface PolyesterSmartAccountClientOptions {\n /** How long a fetched gas price is reused, in milliseconds. Defaults to 60s. */\n gasPriceCacheTtlMs?: number;\n /** How often to poll for UserOperation inclusion, in milliseconds. Defaults to 250ms. */\n pollingIntervalMs?: number;\n}\n\n/**\n * Creates a viem client bound to a Polyester smart account. Memoized per\n * (account, environment, options): repeat calls return the same client, so\n * the gas price cache and warmed connections survive across submissions.\n */\nexport function createPolyesterSmartAccountClient(\n account: SafeSmartAccountInstance,\n params: {\n environment: PolyesterEnvironment;\n options?: PolyesterSmartAccountClientOptions;\n },\n) {\n const { environment, options } = params;\n const accountEnvironmentFingerprint = smartAccountEnvironmentFingerprints.get(account);\n if (\n accountEnvironmentFingerprint &&\n accountEnvironmentFingerprint !== environment.fingerprint\n ) {\n throw new Error(\"Smart account environment does not match client environment.\");\n }\n let clients = smartAccountClients.get(account);\n if (!clients) smartAccountClients.set(account, (clients = new Map()));\n const key = JSON.stringify([\n environment.fingerprint,\n options?.gasPriceCacheTtlMs ?? USER_OPERATION_GAS_PRICE_TTL_MS,\n options?.pollingIntervalMs ?? USER_OPERATION_RECEIPT_POLLING_INTERVAL_MS,\n ]);\n let client = clients.get(key);\n if (!client) {\n client = buildPolyesterSmartAccountClient(account, environment, options);\n clients.set(key, client);\n }\n return client;\n}\n\nfunction buildPolyesterSmartAccountClient(\n account: SafeSmartAccountInstance,\n environment: PolyesterEnvironment,\n options: PolyesterSmartAccountClientOptions | undefined,\n) {\n const {\n gasPriceCacheTtlMs = USER_OPERATION_GAS_PRICE_TTL_MS,\n pollingIntervalMs = USER_OPERATION_RECEIPT_POLLING_INTERVAL_MS,\n } = options ?? {};\n\n const paymaster = createPimlicoClient({\n chain: environment.chain,\n transport: http(environment.accountAbstraction.paymasterUrl),\n entryPoint: environment.accountAbstraction.entryPoint,\n });\n\n const gasPrice = cachedForTtl(() => paymaster.getUserOperationGasPrice(), gasPriceCacheTtlMs);\n const getGasPrice = gasPrice.get;\n // The stub is a per-paymaster constant (address + dummy signature): fetched\n // once, primed by warm-up, and only dropped when a submission fails.\n // `paymasterContext` is not forwarded to it; no Polyester paymaster\n // policy keys off context, and the sponsor call below does forward it.\n const stubData = cachedForTtl(\n () =>\n paymaster.getPaymasterStubData({\n chainId: environment.chain.id,\n entryPointAddress: environment.accountAbstraction.entryPoint.address,\n sender: account.address,\n nonce: 0n,\n callData: \"0x\",\n maxFeePerGas: 0n,\n maxPriorityFeePerGas: 0n,\n }),\n Number.POSITIVE_INFINITY,\n );\n const getStubData = stubData.get;\n\n const client = createSmartAccountClient({\n account,\n chain: environment.chain,\n paymaster: {\n getPaymasterStubData: (_parameters: GetPaymasterStubDataParameters) => getStubData(),\n // `pm_sponsorUserOperation` replaces `pm_getPaymasterData`: it signs\n // over the (already buffered) account gas limits it receives and\n // sets its own paymaster limits. Nothing may adjust gas afterwards.\n getPaymasterData: async (parameters: GetPaymasterDataParameters) => {\n // viem hands over every original parameter (`calls`, `chainId`,\n // ...); the paymaster rejects unknown keys, so keep only\n // UserOperation fields.\n return paymaster.sponsorUserOperation({\n userOperation: formatUserOperationRequest(\n parameters as unknown as UserOperation<\"0.7\">,\n ) as unknown as UserOperation<\"0.7\">,\n paymasterContext: parameters.context,\n });\n },\n },\n bundlerTransport: http(environment.accountAbstraction.bundlerUrl),\n pollingInterval: pollingIntervalMs,\n userOperation: {\n estimateFeesPerGas: async () => (await getGasPrice()).fast,\n // Single prepare pass: viem resolves gas estimation via\n // `getAction(client, estimateUserOperationGas, ...)`, so handing\n // `prepareUserOperation` a client whose estimate action buffers the\n // result makes the buffered limits flow into the sponsor call\n // before signing — the sponsorship signature commits to them.\n prepareUserOperation: (prepareClient, prepareParameters) => {\n const bufferingClient = {\n ...prepareClient,\n estimateUserOperationGas: async (\n estimateParameters: EstimateUserOperationGasParameters,\n ) =>\n bufferPolyesterUserOperationGas(\n await estimateUserOperationGas(prepareClient, estimateParameters),\n ),\n };\n return prepareUserOperation(\n bufferingClient as typeof prepareClient,\n prepareParameters as Parameters<typeof prepareUserOperation>[1],\n );\n },\n },\n });\n smartAccountClientPrimers.set(client, () => Promise.allSettled([getGasPrice(), getStubData()]));\n smartAccountClientCacheResets.set(client, () => {\n gasPrice.clear();\n stubData.clear();\n });\n return client;\n}\n\n/** Memoizes a promise-returning fetch for `ttlMs`; a rejected fetch is not cached. */\nfunction cachedForTtl<T>(\n fetch: () => Promise<T>,\n ttlMs: number,\n): { get: () => Promise<T>; clear: () => void } {\n let cached: { fetchedAt: number; result: Promise<T> } | undefined;\n return {\n get: () => {\n if (!cached || Date.now() - cached.fetchedAt >= ttlMs) {\n const entry = { fetchedAt: Date.now(), result: fetch() };\n cached = entry;\n entry.result.catch(() => {\n if (cached === entry) cached = undefined;\n });\n }\n return cached.result;\n },\n clear: () => {\n cached = undefined;\n },\n };\n}\n\nfunction addUserOperationGasBuffer(gas: bigint): bigint {\n const percentBuffer = (gas * USER_OPERATION_GAS_BUFFER_BPS) / 10_000n;\n return (\n gas +\n (percentBuffer > USER_OPERATION_MIN_GAS_BUFFER\n ? percentBuffer\n : USER_OPERATION_MIN_GAS_BUFFER)\n );\n}\n\n/**\n * Pads account gas limits (+20%, 50k floor) before sponsorship. Paymaster\n * limits are left alone: the paymaster sets and signs its own.\n */\nfunction bufferPolyesterUserOperationGas<\n T extends { callGasLimit?: bigint; preVerificationGas?: bigint; verificationGasLimit?: bigint },\n>(gas: T): T {\n return {\n ...gas,\n ...(typeof gas.callGasLimit === \"bigint\"\n ? { callGasLimit: addUserOperationGasBuffer(gas.callGasLimit) }\n : {}),\n ...(typeof gas.preVerificationGas === \"bigint\"\n ? { preVerificationGas: addUserOperationGasBuffer(gas.preVerificationGas) }\n : {}),\n ...(typeof gas.verificationGasLimit === \"bigint\"\n ? { verificationGasLimit: addUserOperationGasBuffer(gas.verificationGasLimit) }\n : {}),\n };\n}\n\n/**\n * Warms the network path for an upcoming submission: primes the gas-price and\n * paymaster-stub caches and opens connections to the RPC endpoint. Never\n * throws; the nonce is intentionally not cached — fetching it here is\n * connection warm-up only.\n */\nexport async function warmPolyesterSmartAccountClient(\n client: PolyesterSmartAccountClient,\n): Promise<void> {\n await Promise.allSettled([\n smartAccountClientPrimers.get(client)?.(),\n client.account.getNonce(),\n client.account.isDeployed(),\n ]);\n}\n\nexport type PolyesterUserOperationPhase = \"prepare\" | \"sign\" | \"send\" | \"receipt\";\n\nexport interface SendPolyesterUserOperationOptions {\n /**\n * Fires once per submission, immediately before the wallet is asked to\n * sign the fully prepared operation — the prepare→sign boundary.\n */\n onWalletSignatureRequested?: () => void;\n /**\n * Reports how long each submission phase took. `prepare` covers nonce,\n * fees and sponsorship; `sign` the wallet signature; `send`\n * `eth_sendUserOperation`. Pass the same callback to\n * {@link waitForPolyesterUserOperationReceipt} to get `receipt`.\n */\n onPhase?: (phase: PolyesterUserOperationPhase, ms: number) => void;\n}\n\nexport async function sendPolyesterUserOperation(\n client: PolyesterSmartAccountClient,\n parameters: Parameters<PolyesterSmartAccountClient[\"sendUserOperation\"]>[0],\n options: SendPolyesterUserOperationOptions = {},\n): Promise<Awaited<ReturnType<PolyesterSmartAccountClient[\"sendUserOperation\"]>>> {\n const { onWalletSignatureRequested, onPhase } = options;\n const account =\n (parameters as { account?: SafeSmartAccountInstance }).account ?? client.account;\n let phaseStartedAt = Date.now();\n const endPhase = (phase: PolyesterUserOperationPhase) => {\n const now = Date.now();\n reportPhase(onPhase, phase, now - phaseStartedAt);\n phaseStartedAt = now;\n };\n let signed = false;\n try {\n const hash = await client.sendUserOperation({\n ...parameters,\n account: {\n ...account,\n signUserOperation: async (\n userOperation: Parameters<SafeSmartAccountInstance[\"signUserOperation\"]>[0],\n ) => {\n endPhase(\"prepare\");\n onWalletSignatureRequested?.();\n const signature = await account.signUserOperation(userOperation);\n signed = true;\n endPhase(\"sign\");\n return signature;\n },\n },\n } as Parameters<PolyesterSmartAccountClient[\"sendUserOperation\"]>[0]);\n endPhase(\"send\");\n return hash;\n } catch (error) {\n // Only a failure after signing (i.e. from `eth_sendUserOperation`) can\n // mean the bundler rejected the cached gas price or stub. Earlier\n // failures — a cancelled wallet prompt above all — keep both caches so\n // the retry stays cheap.\n if (signed) smartAccountClientCacheResets.get(client)?.();\n throw error;\n }\n}\n\n/** Observers must never affect the result: a throwing `onPhase` is swallowed. */\nfunction reportPhase(\n onPhase: SendPolyesterUserOperationOptions[\"onPhase\"],\n phase: PolyesterUserOperationPhase,\n ms: number,\n): void {\n try {\n onPhase?.(phase, ms);\n } catch {\n // ignore\n }\n}\n\nexport interface WaitForPolyesterUserOperationReceiptOptions {\n /** Overall deadline in milliseconds. Defaults to viem's 120s. */\n timeoutMs?: number;\n /** Receives `(\"receipt\", ms)` once the receipt is available. */\n onPhase?: SendPolyesterUserOperationOptions[\"onPhase\"];\n}\n\n/**\n * Waits for a UserOperation to land. Polls the bundler's cheap\n * `pimlico_getUserOperationStatus` at the client's polling interval, checking\n * immediately, and only fetches the receipt once the bundler reports it has\n * been mined. Status lives in bundler memory, so `not_found` (e.g. after a\n * bundler restart) also checks the chain for a receipt until the deadline.\n * `timeoutMs` bounds every request, not just the gaps between them.\n */\nexport async function waitForPolyesterUserOperationReceipt(\n client: PolyesterSmartAccountClient,\n hash: `0x${string}`,\n options: WaitForPolyesterUserOperationReceiptOptions = {},\n): Promise<Awaited<ReturnType<PolyesterSmartAccountClient[\"waitForUserOperationReceipt\"]>>> {\n const { timeoutMs = 120_000, onPhase } = options;\n const startedAt = Date.now();\n const deadline = startedAt + timeoutMs;\n const timedOut = () => new Error(`Timed out waiting for UserOperation ${hash}.`);\n const untilDeadline = <T>(fn: () => Promise<T>): Promise<T> => {\n const timeout = deadline - Date.now();\n if (timeout <= 0) return Promise.reject(timedOut());\n return withTimeout(fn, { timeout, errorInstance: timedOut() });\n };\n const statusClient = client as unknown as Parameters<typeof getUserOperationStatus>[0];\n\n let consecutiveNotFound = 0;\n for (;;) {\n const { status } = await untilDeadline(() =>\n getUserOperationStatus(statusClient, { hash }),\n );\n if (status === \"included\" || status === \"reverted\") {\n const receipt = await untilDeadline(() =>\n client.waitForUserOperationReceipt({ hash, timeout: deadline - Date.now() }),\n );\n reportPhase(onPhase, \"receipt\", Date.now() - startedAt);\n return receipt;\n }\n if (status === \"failed\") {\n throw new Error(\n `UserOperation ${hash} was bundled but the bundle transaction reverted; it was not executed.`,\n );\n }\n if (status === \"rejected\") {\n // Re-simulation failures are often fee-too-low: drop cached prices.\n smartAccountClientCacheResets.get(client)?.();\n throw new Error(`UserOperation ${hash} was rejected by the bundler.`);\n }\n if (status === \"not_found\") {\n if (consecutiveNotFound++ % NOT_FOUND_RECEIPT_CHECK_EVERY === 0) {\n const receipt = await untilDeadline(() =>\n client.getUserOperationReceipt({ hash }),\n ).catch((error: Error) => {\n if (error.name === \"UserOperationReceiptNotFoundError\") return undefined;\n throw error;\n });\n if (receipt) {\n reportPhase(onPhase, \"receipt\", Date.now() - startedAt);\n return receipt;\n }\n }\n } else {\n consecutiveNotFound = 0;\n }\n const remaining = deadline - Date.now();\n if (remaining <= 0) throw timedOut();\n await new Promise((resolve) =>\n setTimeout(resolve, Math.min(client.pollingInterval, remaining)),\n );\n }\n}\n"],"mappings":";;;;;;;;AAuBA,MAAM,sDAAsC,IAAI,QAA0C;AAC1F,MAAM,4CAA4B,IAAI,QAAwC;AAC9E,MAAM,gDAAgC,IAAI,QAA4B;AACtE,MAAM,sCAAsB,IAAI,QAG9B;AACF,MAAM,kCAAkC;AACxC,MAAM,gCAAgC;AACtC,MAAM,gCAAgC;AACtC,MAAM,6CAA6C;;;;;;;AAOnD,MAAM,gCAAgC;AAetC,SAAgB,oCAAoC,EAChD,aACA,cACA,YAAY,MACuC;CACnD,MAAM,EACF,yBACA,sBACA,wBACA,uBACA,qBACA,YAAY,mBAAmB;CAEnC,OAAO,mBAAmB;EACtB,QAAQ,CAAC,YAAY;EACrB;EACA;EACA;EACA;EACA;EACA;CACJ,CAAC;AACL;;;;AAKA,eAAsB,4BAA4B,EAC9C,aACA,OACA,WACA,gBAC4D;CAC5D,MAAM,SACF,gBACA,mBAAmB;EACf,OAAO,YAAY;EACnB,WAAW,KAAK,YAAY,MAAM;CACtC,CAAC;CAEL,IAAI,OAAO,OAAO,MAAM,OAAO,MAAM,OAAO,YAAY,MAAM,IAC1D,MAAM,IAAI,MAAM,+DAA+D;CAGnF,MAAM,UAAU,MAAM,mBAAmB;EACrC;EACA,QAAQ,CAAC,KAAK;EACd;EACA,YAAY,YAAY,mBAAmB;EAC3C,GAAG,YAAY,mBAAmB;CACtC,CAAC;CACD,oCAAoC,IAAI,SAAS,YAAY,WAAW;CACxE,OAAO;AACX;;;;;;AAcA,SAAgB,kCACZ,SACA,QAIF;CACE,MAAM,EAAE,aAAa,YAAY;CACjC,MAAM,gCAAgC,oCAAoC,IAAI,OAAO;CACrF,IACI,iCACA,kCAAkC,YAAY,aAE9C,MAAM,IAAI,MAAM,8DAA8D;CAElF,IAAI,UAAU,oBAAoB,IAAI,OAAO;CAC7C,IAAI,CAAC,SAAS,oBAAoB,IAAI,SAAU,0BAAU,IAAI,IAAI,CAAE;CACpE,MAAM,MAAM,KAAK,UAAU;EACvB,YAAY;EACZ,SAAS,sBAAsB;EAC/B,SAAS,qBAAqB;CAClC,CAAC;CACD,IAAI,SAAS,QAAQ,IAAI,GAAG;CAC5B,IAAI,CAAC,QAAQ;EACT,SAAS,iCAAiC,SAAS,aAAa,OAAO;EACvE,QAAQ,IAAI,KAAK,MAAM;CAC3B;CACA,OAAO;AACX;AAEA,SAAS,iCACL,SACA,aACA,SACF;CACE,MAAM,EACF,qBAAqB,iCACrB,oBAAoB,+CACpB,WAAW,CAAC;CAEhB,MAAM,YAAY,oBAAoB;EAClC,OAAO,YAAY;EACnB,WAAW,KAAK,YAAY,mBAAmB,YAAY;EAC3D,YAAY,YAAY,mBAAmB;CAC/C,CAAC;CAED,MAAM,WAAW,mBAAmB,UAAU,yBAAyB,GAAG,kBAAkB;CAC5F,MAAM,cAAc,SAAS;CAK7B,MAAM,WAAW,mBAET,UAAU,qBAAqB;EAC3B,SAAS,YAAY,MAAM;EAC3B,mBAAmB,YAAY,mBAAmB,WAAW;EAC7D,QAAQ,QAAQ;EAChB,OAAO;EACP,UAAU;EACV,cAAc;EACd,sBAAsB;CAC1B,CAAC,GACL,OAAO,iBACX;CACA,MAAM,cAAc,SAAS;CAE7B,MAAM,SAAS,yBAAyB;EACpC;EACA,OAAO,YAAY;EACnB,WAAW;GACP,uBAAuB,gBAAgD,YAAY;GAInF,kBAAkB,OAAO,eAA2C;IAIhE,OAAO,UAAU,qBAAqB;KAClC,eAAe,2BACX,UACJ;KACA,kBAAkB,WAAW;IACjC,CAAC;GACL;EACJ;EACA,kBAAkB,KAAK,YAAY,mBAAmB,UAAU;EAChE,iBAAiB;EACjB,eAAe;GACX,oBAAoB,aAAa,MAAM,YAAY,EAAA,CAAG;GAMtD,uBAAuB,eAAe,sBAAsB;IACxD,MAAM,kBAAkB;KACpB,GAAG;KACH,0BAA0B,OACtB,uBAEA,gCACI,MAAM,yBAAyB,eAAe,kBAAkB,CACpE;IACR;IACA,OAAO,qBACH,iBACA,iBACJ;GACJ;EACJ;CACJ,CAAC;CACD,0BAA0B,IAAI,cAAc,QAAQ,WAAW,CAAC,YAAY,GAAG,YAAY,CAAC,CAAC,CAAC;CAC9F,8BAA8B,IAAI,cAAc;EAC5C,SAAS,MAAM;EACf,SAAS,MAAM;CACnB,CAAC;CACD,OAAO;AACX;;AAGA,SAAS,aACL,OACA,OAC4C;CAC5C,IAAI;CACJ,OAAO;EACH,WAAW;GACP,IAAI,CAAC,UAAU,KAAK,IAAI,IAAI,OAAO,aAAa,OAAO;IACnD,MAAM,QAAQ;KAAE,WAAW,KAAK,IAAI;KAAG,QAAQ,MAAM;IAAE;IACvD,SAAS;IACT,MAAM,OAAO,YAAY;KACrB,IAAI,WAAW,OAAO,SAAS,KAAA;IACnC,CAAC;GACL;GACA,OAAO,OAAO;EAClB;EACA,aAAa;GACT,SAAS,KAAA;EACb;CACJ;AACJ;AAEA,SAAS,0BAA0B,KAAqB;CACpD,MAAM,gBAAiB,MAAM,gCAAiC;CAC9D,OACI,OACC,gBAAgB,gCACX,gBACA;AAEd;;;;;AAMA,SAAS,gCAEP,KAAW;CACT,OAAO;EACH,GAAG;EACH,GAAI,OAAO,IAAI,iBAAiB,WAC1B,EAAE,cAAc,0BAA0B,IAAI,YAAY,EAAE,IAC5D,CAAC;EACP,GAAI,OAAO,IAAI,uBAAuB,WAChC,EAAE,oBAAoB,0BAA0B,IAAI,kBAAkB,EAAE,IACxE,CAAC;EACP,GAAI,OAAO,IAAI,yBAAyB,WAClC,EAAE,sBAAsB,0BAA0B,IAAI,oBAAoB,EAAE,IAC5E,CAAC;CACX;AACJ;;;;;;;AAQA,eAAsB,gCAClB,QACa;CACb,MAAM,QAAQ,WAAW;EACrB,0BAA0B,IAAI,MAAM,CAAC,GAAG;EACxC,OAAO,QAAQ,SAAS;EACxB,OAAO,QAAQ,WAAW;CAC9B,CAAC;AACL;AAmBA,eAAsB,2BAClB,QACA,YACA,UAA6C,CAAC,GACgC;CAC9E,MAAM,EAAE,4BAA4B,YAAY;CAChD,MAAM,UACD,WAAsD,WAAW,OAAO;CAC7E,IAAI,iBAAiB,KAAK,IAAI;CAC9B,MAAM,YAAY,UAAuC;EACrD,MAAM,MAAM,KAAK,IAAI;EACrB,YAAY,SAAS,OAAO,MAAM,cAAc;EAChD,iBAAiB;CACrB;CACA,IAAI,SAAS;CACb,IAAI;EACA,MAAM,OAAO,MAAM,OAAO,kBAAkB;GACxC,GAAG;GACH,SAAS;IACL,GAAG;IACH,mBAAmB,OACf,kBACC;KACD,SAAS,SAAS;KAClB,6BAA6B;KAC7B,MAAM,YAAY,MAAM,QAAQ,kBAAkB,aAAa;KAC/D,SAAS;KACT,SAAS,MAAM;KACf,OAAO;IACX;GACJ;EACJ,CAAoE;EACpE,SAAS,MAAM;EACf,OAAO;CACX,SAAS,OAAO;EAKZ,IAAI,QAAQ,8BAA8B,IAAI,MAAM,CAAC,GAAG;EACxD,MAAM;CACV;AACJ;;AAGA,SAAS,YACL,SACA,OACA,IACI;CACJ,IAAI;EACA,UAAU,OAAO,EAAE;CACvB,QAAQ,CAER;AACJ;;;;;;;;;AAiBA,eAAsB,qCAClB,QACA,MACA,UAAuD,CAAC,GACgC;CACxF,MAAM,EAAE,YAAY,MAAS,YAAY;CACzC,MAAM,YAAY,KAAK,IAAI;CAC3B,MAAM,WAAW,YAAY;CAC7B,MAAM,iCAAiB,IAAI,MAAM,uCAAuC,KAAK,EAAE;CAC/E,MAAM,iBAAoB,OAAqC;EAC3D,MAAM,UAAU,WAAW,KAAK,IAAI;EACpC,IAAI,WAAW,GAAG,OAAO,QAAQ,OAAO,SAAS,CAAC;EAClD,OAAO,YAAY,IAAI;GAAE;GAAS,eAAe,SAAS;EAAE,CAAC;CACjE;CACA,MAAM,eAAe;CAErB,IAAI,sBAAsB;CAC1B,SAAS;EACL,MAAM,EAAE,WAAW,MAAM,oBACrB,uBAAuB,cAAc,EAAE,KAAK,CAAC,CACjD;EACA,IAAI,WAAW,cAAc,WAAW,YAAY;GAChD,MAAM,UAAU,MAAM,oBAClB,OAAO,4BAA4B;IAAE;IAAM,SAAS,WAAW,KAAK,IAAI;GAAE,CAAC,CAC/E;GACA,YAAY,SAAS,WAAW,KAAK,IAAI,IAAI,SAAS;GACtD,OAAO;EACX;EACA,IAAI,WAAW,UACX,MAAM,IAAI,MACN,iBAAiB,KAAK,uEAC1B;EAEJ,IAAI,WAAW,YAAY;GAEvB,8BAA8B,IAAI,MAAM,CAAC,GAAG;GAC5C,MAAM,IAAI,MAAM,iBAAiB,KAAK,8BAA8B;EACxE;EACA,IAAI,WAAW,aACP;OAAA,wBAAwB,kCAAkC,GAAG;IAC7D,MAAM,UAAU,MAAM,oBAClB,OAAO,wBAAwB,EAAE,KAAK,CAAC,CAC3C,CAAC,CAAC,OAAO,UAAiB;KACtB,IAAI,MAAM,SAAS,qCAAqC,OAAO,KAAA;KAC/D,MAAM;IACV,CAAC;IACD,IAAI,SAAS;KACT,YAAY,SAAS,WAAW,KAAK,IAAI,IAAI,SAAS;KACtD,OAAO;IACX;GACJ;SAEA,sBAAsB;EAE1B,MAAM,YAAY,WAAW,KAAK,IAAI;EACtC,IAAI,aAAa,GAAG,MAAM,SAAS;EACnC,MAAM,IAAI,SAAS,YACf,WAAW,SAAS,KAAK,IAAI,OAAO,iBAAiB,SAAS,CAAC,CACnE;CACJ;AACJ"}
|
|
1
|
+
{"version":3,"file":"smart-account.js","names":[],"sources":["../../src/smart-account/smart-account.ts"],"sourcesContent":["import type { Address, LocalAccount, PublicClient } from \"viem\";\nimport { createPublicClient, http, withTimeout } from \"viem\";\nimport type { EstimateUserOperationGasParameters } from \"viem/account-abstraction\";\nimport { estimateUserOperationGas, prepareUserOperation } from \"viem/account-abstraction\";\nimport { createSmartAccountClient } from \"permissionless\";\nimport { getUserOperationStatus } from \"permissionless/actions/pimlico\";\nimport { toSafeSmartAccount } from \"permissionless/accounts\";\nimport { createPimlicoClient } from \"permissionless/clients/pimlico\";\nimport type { PolyesterEnvironment } from \"../environment.js\";\nimport { predictSafeAddress } from \"../account-signer/predict-safe-address.js\";\n\nexport type SafeSmartAccountInstance = Awaited<ReturnType<typeof toSafeSmartAccount>>;\nexport type PolyesterSmartAccountClient = ReturnType<typeof buildPolyesterSmartAccountClient>;\n\nconst smartAccountEnvironmentFingerprints = new WeakMap<SafeSmartAccountInstance, string>();\nconst smartAccountClientPrimers = new WeakMap<object, () => Promise<unknown>>();\nconst smartAccountClientCacheResets = new WeakMap<object, () => void>();\nconst smartAccountClients = new WeakMap<\n SafeSmartAccountInstance,\n Map<string, PolyesterSmartAccountClient>\n>();\nconst USER_OPERATION_GAS_PRICE_TTL_MS = 60_000;\nconst USER_OPERATION_GAS_BUFFER_BPS = 2_000n;\nconst USER_OPERATION_MIN_GAS_BUFFER = 50_000n;\nconst USER_OPERATION_RECEIPT_POLLING_INTERVAL_MS = 250;\n/**\n * While the bundler reports `not_found`, the chain is checked for a receipt\n * on every Nth poll (once per second at the default interval). `not_found` is\n * not definitive — a bundler restart forgets ops whose bundle is still\n * pending — so polling continues until the deadline.\n */\nconst NOT_FOUND_RECEIPT_CHECK_EVERY = 4;\n\nexport interface CreateSmartAccountParams {\n environment: PolyesterEnvironment;\n owner: LocalAccount;\n saltNonce?: bigint;\n publicClient?: PublicClient;\n}\n\nexport interface PredictPolyesterSmartAccountAddressParams {\n environment: PolyesterEnvironment;\n ownerAddress: Address;\n saltNonce?: bigint;\n}\n\nexport function predictPolyesterSmartAccountAddress({\n environment,\n ownerAddress,\n saltNonce = 0n,\n}: PredictPolyesterSmartAccountAddressParams): Address {\n const {\n safeProxyFactoryAddress,\n safeSingletonAddress,\n safeModuleSetupAddress,\n safe4337ModuleAddress,\n multiSendAddress,\n } = environment.accountAbstraction.safe;\n\n return predictSafeAddress({\n owners: [ownerAddress],\n saltNonce,\n safeProxyFactoryAddress,\n safeSingletonAddress,\n safeModuleSetupAddress,\n safe4337ModuleAddress,\n multiSendAddress,\n });\n}\n\n/**\n * Creates a Polyester smart account instance.\n */\nexport async function createPolyesterSmartAccount({\n environment,\n owner,\n saltNonce,\n publicClient,\n}: CreateSmartAccountParams): Promise<SafeSmartAccountInstance> {\n const client =\n publicClient ??\n createPublicClient({\n chain: environment.chain,\n transport: http(environment.rpcUrl),\n });\n\n if (client.chain?.id && client.chain.id !== environment.chain.id) {\n throw new Error(\"Smart account public client chain does not match environment.\");\n }\n\n const account = await toSafeSmartAccount({\n client,\n owners: [owner],\n saltNonce,\n entryPoint: environment.accountAbstraction.entryPoint,\n ...environment.accountAbstraction.safe,\n });\n smartAccountEnvironmentFingerprints.set(account, environment.fingerprint);\n return account;\n}\n\nexport interface PolyesterSmartAccountClientOptions {\n /** How long a fetched gas price is reused, in milliseconds. Defaults to 60s. */\n gasPriceCacheTtlMs?: number;\n /** How often to poll for UserOperation inclusion, in milliseconds. Defaults to 250ms. */\n pollingIntervalMs?: number;\n}\n\n/**\n * Creates a viem client bound to a Polyester smart account. Memoized per\n * (account, environment, options): repeat calls return the same client, so\n * the gas price cache and warmed connections survive across submissions.\n */\nexport function createPolyesterSmartAccountClient(\n account: SafeSmartAccountInstance,\n params: {\n environment: PolyesterEnvironment;\n options?: PolyesterSmartAccountClientOptions;\n },\n) {\n const { environment, options } = params;\n const accountEnvironmentFingerprint = smartAccountEnvironmentFingerprints.get(account);\n if (\n accountEnvironmentFingerprint &&\n accountEnvironmentFingerprint !== environment.fingerprint\n ) {\n throw new Error(\"Smart account environment does not match client environment.\");\n }\n let clients = smartAccountClients.get(account);\n if (!clients) smartAccountClients.set(account, (clients = new Map()));\n const key = JSON.stringify([\n environment.fingerprint,\n options?.gasPriceCacheTtlMs ?? USER_OPERATION_GAS_PRICE_TTL_MS,\n options?.pollingIntervalMs ?? USER_OPERATION_RECEIPT_POLLING_INTERVAL_MS,\n ]);\n let client = clients.get(key);\n if (!client) {\n client = buildPolyesterSmartAccountClient(account, environment, options);\n clients.set(key, client);\n }\n return client;\n}\n\nfunction buildPolyesterSmartAccountClient(\n account: SafeSmartAccountInstance,\n environment: PolyesterEnvironment,\n options: PolyesterSmartAccountClientOptions | undefined,\n) {\n const {\n gasPriceCacheTtlMs = USER_OPERATION_GAS_PRICE_TTL_MS,\n pollingIntervalMs = USER_OPERATION_RECEIPT_POLLING_INTERVAL_MS,\n } = options ?? {};\n\n const paymaster = createPimlicoClient({\n chain: environment.chain,\n transport: http(environment.accountAbstraction.paymasterUrl),\n entryPoint: environment.accountAbstraction.entryPoint,\n });\n\n const gasPrice = cachedForTtl(() => paymaster.getUserOperationGasPrice(), gasPriceCacheTtlMs);\n const getGasPrice = gasPrice.get;\n\n const client = createSmartAccountClient({\n account,\n chain: environment.chain,\n paymaster: {\n getPaymasterStubData: (parameters) => paymaster.getPaymasterStubData(parameters),\n getPaymasterData: (parameters) => paymaster.getPaymasterData(parameters),\n },\n bundlerTransport: http(environment.accountAbstraction.bundlerUrl),\n pollingInterval: pollingIntervalMs,\n userOperation: {\n estimateFeesPerGas: async () => (await getGasPrice()).fast,\n // Single prepare pass: viem resolves gas estimation via\n // `getAction(client, estimateUserOperationGas, ...)`, so handing\n // `prepareUserOperation` a client whose estimate action buffers the\n // result makes the buffered limits flow into getPaymasterData\n // before signing — the sponsorship signature commits to them.\n prepareUserOperation: (prepareClient, prepareParameters) => {\n const bufferingClient = {\n ...prepareClient,\n estimateUserOperationGas: async (\n estimateParameters: EstimateUserOperationGasParameters,\n ) =>\n bufferPolyesterUserOperationGas(\n await estimateUserOperationGas(prepareClient, estimateParameters),\n ),\n };\n return prepareUserOperation(\n bufferingClient as typeof prepareClient,\n prepareParameters as Parameters<typeof prepareUserOperation>[1],\n );\n },\n },\n });\n smartAccountClientPrimers.set(client, () => Promise.allSettled([getGasPrice()]));\n smartAccountClientCacheResets.set(client, () => {\n gasPrice.clear();\n });\n return client;\n}\n\n/** Memoizes a promise-returning fetch for `ttlMs`; a rejected fetch is not cached. */\nfunction cachedForTtl<T>(\n fetch: () => Promise<T>,\n ttlMs: number,\n): { get: () => Promise<T>; clear: () => void } {\n let cached: { fetchedAt: number; result: Promise<T> } | undefined;\n return {\n get: () => {\n if (!cached || Date.now() - cached.fetchedAt >= ttlMs) {\n const entry = { fetchedAt: Date.now(), result: fetch() };\n cached = entry;\n entry.result.catch(() => {\n if (cached === entry) cached = undefined;\n });\n }\n return cached.result;\n },\n clear: () => {\n cached = undefined;\n },\n };\n}\n\nfunction addUserOperationGasBuffer(gas: bigint): bigint {\n const percentBuffer = (gas * USER_OPERATION_GAS_BUFFER_BPS) / 10_000n;\n return (\n gas +\n (percentBuffer > USER_OPERATION_MIN_GAS_BUFFER\n ? percentBuffer\n : USER_OPERATION_MIN_GAS_BUFFER)\n );\n}\n\n/**\n * Pads account and paymaster gas limits (+20%, 50k floor) before getPaymasterData.\n */\nfunction bufferPolyesterUserOperationGas<\n T extends {\n callGasLimit?: bigint;\n preVerificationGas?: bigint;\n verificationGasLimit?: bigint;\n paymasterPostOpGasLimit?: bigint;\n paymasterVerificationGasLimit?: bigint;\n },\n>(gas: T): T {\n return {\n ...gas,\n ...(typeof gas.callGasLimit === \"bigint\"\n ? { callGasLimit: addUserOperationGasBuffer(gas.callGasLimit) }\n : {}),\n ...(typeof gas.preVerificationGas === \"bigint\"\n ? { preVerificationGas: addUserOperationGasBuffer(gas.preVerificationGas) }\n : {}),\n ...(typeof gas.verificationGasLimit === \"bigint\"\n ? { verificationGasLimit: addUserOperationGasBuffer(gas.verificationGasLimit) }\n : {}),\n ...(typeof gas.paymasterPostOpGasLimit === \"bigint\"\n ? { paymasterPostOpGasLimit: addUserOperationGasBuffer(gas.paymasterPostOpGasLimit) }\n : {}),\n ...(typeof gas.paymasterVerificationGasLimit === \"bigint\"\n ? {\n paymasterVerificationGasLimit: addUserOperationGasBuffer(\n gas.paymasterVerificationGasLimit,\n ),\n }\n : {}),\n };\n}\n\n/**\n * Warms the network path for an upcoming submission: primes the gas-price\n * cache and opens connections to the RPC endpoint. Never\n * throws; the nonce is intentionally not cached — fetching it here is\n * connection warm-up only.\n */\nexport async function warmPolyesterSmartAccountClient(\n client: PolyesterSmartAccountClient,\n): Promise<void> {\n await Promise.allSettled([\n smartAccountClientPrimers.get(client)?.(),\n client.account.getNonce(),\n client.account.isDeployed(),\n ]);\n}\n\nexport type PolyesterUserOperationPhase = \"prepare\" | \"sign\" | \"send\" | \"receipt\";\n\nexport interface SendPolyesterUserOperationOptions {\n /**\n * Fires once per submission, immediately before the wallet is asked to\n * sign the fully prepared operation — the prepare→sign boundary.\n */\n onWalletSignatureRequested?: () => void;\n /**\n * Reports how long each submission phase took. `prepare` covers nonce,\n * fees and sponsorship; `sign` the wallet signature; `send`\n * `eth_sendUserOperation`. Pass the same callback to\n * {@link waitForPolyesterUserOperationReceipt} to get `receipt`.\n */\n onPhase?: (phase: PolyesterUserOperationPhase, ms: number) => void;\n}\n\nexport async function sendPolyesterUserOperation(\n client: PolyesterSmartAccountClient,\n parameters: Parameters<PolyesterSmartAccountClient[\"sendUserOperation\"]>[0],\n options: SendPolyesterUserOperationOptions = {},\n): Promise<Awaited<ReturnType<PolyesterSmartAccountClient[\"sendUserOperation\"]>>> {\n const { onWalletSignatureRequested, onPhase } = options;\n const account =\n (parameters as { account?: SafeSmartAccountInstance }).account ?? client.account;\n let phaseStartedAt = Date.now();\n const endPhase = (phase: PolyesterUserOperationPhase) => {\n const now = Date.now();\n reportPhase(onPhase, phase, now - phaseStartedAt);\n phaseStartedAt = now;\n };\n let signed = false;\n try {\n const hash = await client.sendUserOperation({\n ...parameters,\n account: {\n ...account,\n signUserOperation: async (\n userOperation: Parameters<SafeSmartAccountInstance[\"signUserOperation\"]>[0],\n ) => {\n endPhase(\"prepare\");\n onWalletSignatureRequested?.();\n const signature = await account.signUserOperation(userOperation);\n signed = true;\n endPhase(\"sign\");\n return signature;\n },\n },\n } as Parameters<PolyesterSmartAccountClient[\"sendUserOperation\"]>[0]);\n endPhase(\"send\");\n return hash;\n } catch (error) {\n // Only a failure after signing (i.e. from `eth_sendUserOperation`) can\n // mean the bundler rejected the cached gas price. Earlier\n // failures — a cancelled wallet prompt above all — keep the cache so\n // the retry stays cheap.\n if (signed) smartAccountClientCacheResets.get(client)?.();\n throw error;\n }\n}\n\n/** Observers must never affect the result: a throwing `onPhase` is swallowed. */\nfunction reportPhase(\n onPhase: SendPolyesterUserOperationOptions[\"onPhase\"],\n phase: PolyesterUserOperationPhase,\n ms: number,\n): void {\n try {\n onPhase?.(phase, ms);\n } catch {\n // ignore\n }\n}\n\nexport interface WaitForPolyesterUserOperationReceiptOptions {\n /** Overall deadline in milliseconds. Defaults to viem's 120s. */\n timeoutMs?: number;\n /** Receives `(\"receipt\", ms)` once the receipt is available. */\n onPhase?: SendPolyesterUserOperationOptions[\"onPhase\"];\n}\n\n/**\n * Waits for a UserOperation to land. Polls the bundler's cheap\n * `pimlico_getUserOperationStatus` at the client's polling interval, checking\n * immediately, and only fetches the receipt once the bundler reports it has\n * been mined. Status lives in bundler memory, so `not_found` (e.g. after a\n * bundler restart) also checks the chain for a receipt until the deadline.\n * `timeoutMs` bounds every request, not just the gaps between them.\n */\nexport async function waitForPolyesterUserOperationReceipt(\n client: PolyesterSmartAccountClient,\n hash: `0x${string}`,\n options: WaitForPolyesterUserOperationReceiptOptions = {},\n): Promise<Awaited<ReturnType<PolyesterSmartAccountClient[\"waitForUserOperationReceipt\"]>>> {\n const { timeoutMs = 120_000, onPhase } = options;\n const startedAt = Date.now();\n const deadline = startedAt + timeoutMs;\n const timedOut = () => new Error(`Timed out waiting for UserOperation ${hash}.`);\n const untilDeadline = <T>(fn: () => Promise<T>): Promise<T> => {\n const timeout = deadline - Date.now();\n if (timeout <= 0) return Promise.reject(timedOut());\n return withTimeout(fn, { timeout, errorInstance: timedOut() });\n };\n const statusClient = client as unknown as Parameters<typeof getUserOperationStatus>[0];\n\n let consecutiveNotFound = 0;\n for (;;) {\n const { status } = await untilDeadline(() =>\n getUserOperationStatus(statusClient, { hash }),\n );\n if (status === \"included\" || status === \"reverted\") {\n const receipt = await untilDeadline(() =>\n client.waitForUserOperationReceipt({ hash, timeout: deadline - Date.now() }),\n );\n reportPhase(onPhase, \"receipt\", Date.now() - startedAt);\n return receipt;\n }\n if (status === \"failed\") {\n throw new Error(\n `UserOperation ${hash} was bundled but the bundle transaction reverted; it was not executed.`,\n );\n }\n if (status === \"rejected\") {\n // Re-simulation failures are often fee-too-low: drop cached prices.\n smartAccountClientCacheResets.get(client)?.();\n throw new Error(`UserOperation ${hash} was rejected by the bundler.`);\n }\n if (status === \"not_found\") {\n if (consecutiveNotFound++ % NOT_FOUND_RECEIPT_CHECK_EVERY === 0) {\n const receipt = await untilDeadline(() =>\n client.getUserOperationReceipt({ hash }),\n ).catch((error: Error) => {\n if (error.name === \"UserOperationReceiptNotFoundError\") return undefined;\n throw error;\n });\n if (receipt) {\n reportPhase(onPhase, \"receipt\", Date.now() - startedAt);\n return receipt;\n }\n }\n } else {\n consecutiveNotFound = 0;\n }\n const remaining = deadline - Date.now();\n if (remaining <= 0) throw timedOut();\n await new Promise((resolve) =>\n setTimeout(resolve, Math.min(client.pollingInterval, remaining)),\n );\n }\n}\n"],"mappings":";;;;;;;;AAcA,MAAM,sDAAsC,IAAI,QAA0C;AAC1F,MAAM,4CAA4B,IAAI,QAAwC;AAC9E,MAAM,gDAAgC,IAAI,QAA4B;AACtE,MAAM,sCAAsB,IAAI,QAG9B;AACF,MAAM,kCAAkC;AACxC,MAAM,gCAAgC;AACtC,MAAM,gCAAgC;AACtC,MAAM,6CAA6C;;;;;;;AAOnD,MAAM,gCAAgC;AAetC,SAAgB,oCAAoC,EAChD,aACA,cACA,YAAY,MACuC;CACnD,MAAM,EACF,yBACA,sBACA,wBACA,uBACA,qBACA,YAAY,mBAAmB;CAEnC,OAAO,mBAAmB;EACtB,QAAQ,CAAC,YAAY;EACrB;EACA;EACA;EACA;EACA;EACA;CACJ,CAAC;AACL;;;;AAKA,eAAsB,4BAA4B,EAC9C,aACA,OACA,WACA,gBAC4D;CAC5D,MAAM,SACF,gBACA,mBAAmB;EACf,OAAO,YAAY;EACnB,WAAW,KAAK,YAAY,MAAM;CACtC,CAAC;CAEL,IAAI,OAAO,OAAO,MAAM,OAAO,MAAM,OAAO,YAAY,MAAM,IAC1D,MAAM,IAAI,MAAM,+DAA+D;CAGnF,MAAM,UAAU,MAAM,mBAAmB;EACrC;EACA,QAAQ,CAAC,KAAK;EACd;EACA,YAAY,YAAY,mBAAmB;EAC3C,GAAG,YAAY,mBAAmB;CACtC,CAAC;CACD,oCAAoC,IAAI,SAAS,YAAY,WAAW;CACxE,OAAO;AACX;;;;;;AAcA,SAAgB,kCACZ,SACA,QAIF;CACE,MAAM,EAAE,aAAa,YAAY;CACjC,MAAM,gCAAgC,oCAAoC,IAAI,OAAO;CACrF,IACI,iCACA,kCAAkC,YAAY,aAE9C,MAAM,IAAI,MAAM,8DAA8D;CAElF,IAAI,UAAU,oBAAoB,IAAI,OAAO;CAC7C,IAAI,CAAC,SAAS,oBAAoB,IAAI,SAAU,0BAAU,IAAI,IAAI,CAAE;CACpE,MAAM,MAAM,KAAK,UAAU;EACvB,YAAY;EACZ,SAAS,sBAAsB;EAC/B,SAAS,qBAAqB;CAClC,CAAC;CACD,IAAI,SAAS,QAAQ,IAAI,GAAG;CAC5B,IAAI,CAAC,QAAQ;EACT,SAAS,iCAAiC,SAAS,aAAa,OAAO;EACvE,QAAQ,IAAI,KAAK,MAAM;CAC3B;CACA,OAAO;AACX;AAEA,SAAS,iCACL,SACA,aACA,SACF;CACE,MAAM,EACF,qBAAqB,iCACrB,oBAAoB,+CACpB,WAAW,CAAC;CAEhB,MAAM,YAAY,oBAAoB;EAClC,OAAO,YAAY;EACnB,WAAW,KAAK,YAAY,mBAAmB,YAAY;EAC3D,YAAY,YAAY,mBAAmB;CAC/C,CAAC;CAED,MAAM,WAAW,mBAAmB,UAAU,yBAAyB,GAAG,kBAAkB;CAC5F,MAAM,cAAc,SAAS;CAE7B,MAAM,SAAS,yBAAyB;EACpC;EACA,OAAO,YAAY;EACnB,WAAW;GACP,uBAAuB,eAAe,UAAU,qBAAqB,UAAU;GAC/E,mBAAmB,eAAe,UAAU,iBAAiB,UAAU;EAC3E;EACA,kBAAkB,KAAK,YAAY,mBAAmB,UAAU;EAChE,iBAAiB;EACjB,eAAe;GACX,oBAAoB,aAAa,MAAM,YAAY,EAAA,CAAG;GAMtD,uBAAuB,eAAe,sBAAsB;IACxD,MAAM,kBAAkB;KACpB,GAAG;KACH,0BAA0B,OACtB,uBAEA,gCACI,MAAM,yBAAyB,eAAe,kBAAkB,CACpE;IACR;IACA,OAAO,qBACH,iBACA,iBACJ;GACJ;EACJ;CACJ,CAAC;CACD,0BAA0B,IAAI,cAAc,QAAQ,WAAW,CAAC,YAAY,CAAC,CAAC,CAAC;CAC/E,8BAA8B,IAAI,cAAc;EAC5C,SAAS,MAAM;CACnB,CAAC;CACD,OAAO;AACX;;AAGA,SAAS,aACL,OACA,OAC4C;CAC5C,IAAI;CACJ,OAAO;EACH,WAAW;GACP,IAAI,CAAC,UAAU,KAAK,IAAI,IAAI,OAAO,aAAa,OAAO;IACnD,MAAM,QAAQ;KAAE,WAAW,KAAK,IAAI;KAAG,QAAQ,MAAM;IAAE;IACvD,SAAS;IACT,MAAM,OAAO,YAAY;KACrB,IAAI,WAAW,OAAO,SAAS,KAAA;IACnC,CAAC;GACL;GACA,OAAO,OAAO;EAClB;EACA,aAAa;GACT,SAAS,KAAA;EACb;CACJ;AACJ;AAEA,SAAS,0BAA0B,KAAqB;CACpD,MAAM,gBAAiB,MAAM,gCAAiC;CAC9D,OACI,OACC,gBAAgB,gCACX,gBACA;AAEd;;;;AAKA,SAAS,gCAQP,KAAW;CACT,OAAO;EACH,GAAG;EACH,GAAI,OAAO,IAAI,iBAAiB,WAC1B,EAAE,cAAc,0BAA0B,IAAI,YAAY,EAAE,IAC5D,CAAC;EACP,GAAI,OAAO,IAAI,uBAAuB,WAChC,EAAE,oBAAoB,0BAA0B,IAAI,kBAAkB,EAAE,IACxE,CAAC;EACP,GAAI,OAAO,IAAI,yBAAyB,WAClC,EAAE,sBAAsB,0BAA0B,IAAI,oBAAoB,EAAE,IAC5E,CAAC;EACP,GAAI,OAAO,IAAI,4BAA4B,WACrC,EAAE,yBAAyB,0BAA0B,IAAI,uBAAuB,EAAE,IAClF,CAAC;EACP,GAAI,OAAO,IAAI,kCAAkC,WAC3C,EACI,+BAA+B,0BAC3B,IAAI,6BACR,EACJ,IACA,CAAC;CACX;AACJ;;;;;;;AAQA,eAAsB,gCAClB,QACa;CACb,MAAM,QAAQ,WAAW;EACrB,0BAA0B,IAAI,MAAM,CAAC,GAAG;EACxC,OAAO,QAAQ,SAAS;EACxB,OAAO,QAAQ,WAAW;CAC9B,CAAC;AACL;AAmBA,eAAsB,2BAClB,QACA,YACA,UAA6C,CAAC,GACgC;CAC9E,MAAM,EAAE,4BAA4B,YAAY;CAChD,MAAM,UACD,WAAsD,WAAW,OAAO;CAC7E,IAAI,iBAAiB,KAAK,IAAI;CAC9B,MAAM,YAAY,UAAuC;EACrD,MAAM,MAAM,KAAK,IAAI;EACrB,YAAY,SAAS,OAAO,MAAM,cAAc;EAChD,iBAAiB;CACrB;CACA,IAAI,SAAS;CACb,IAAI;EACA,MAAM,OAAO,MAAM,OAAO,kBAAkB;GACxC,GAAG;GACH,SAAS;IACL,GAAG;IACH,mBAAmB,OACf,kBACC;KACD,SAAS,SAAS;KAClB,6BAA6B;KAC7B,MAAM,YAAY,MAAM,QAAQ,kBAAkB,aAAa;KAC/D,SAAS;KACT,SAAS,MAAM;KACf,OAAO;IACX;GACJ;EACJ,CAAoE;EACpE,SAAS,MAAM;EACf,OAAO;CACX,SAAS,OAAO;EAKZ,IAAI,QAAQ,8BAA8B,IAAI,MAAM,CAAC,GAAG;EACxD,MAAM;CACV;AACJ;;AAGA,SAAS,YACL,SACA,OACA,IACI;CACJ,IAAI;EACA,UAAU,OAAO,EAAE;CACvB,QAAQ,CAER;AACJ;;;;;;;;;AAiBA,eAAsB,qCAClB,QACA,MACA,UAAuD,CAAC,GACgC;CACxF,MAAM,EAAE,YAAY,MAAS,YAAY;CACzC,MAAM,YAAY,KAAK,IAAI;CAC3B,MAAM,WAAW,YAAY;CAC7B,MAAM,iCAAiB,IAAI,MAAM,uCAAuC,KAAK,EAAE;CAC/E,MAAM,iBAAoB,OAAqC;EAC3D,MAAM,UAAU,WAAW,KAAK,IAAI;EACpC,IAAI,WAAW,GAAG,OAAO,QAAQ,OAAO,SAAS,CAAC;EAClD,OAAO,YAAY,IAAI;GAAE;GAAS,eAAe,SAAS;EAAE,CAAC;CACjE;CACA,MAAM,eAAe;CAErB,IAAI,sBAAsB;CAC1B,SAAS;EACL,MAAM,EAAE,WAAW,MAAM,oBACrB,uBAAuB,cAAc,EAAE,KAAK,CAAC,CACjD;EACA,IAAI,WAAW,cAAc,WAAW,YAAY;GAChD,MAAM,UAAU,MAAM,oBAClB,OAAO,4BAA4B;IAAE;IAAM,SAAS,WAAW,KAAK,IAAI;GAAE,CAAC,CAC/E;GACA,YAAY,SAAS,WAAW,KAAK,IAAI,IAAI,SAAS;GACtD,OAAO;EACX;EACA,IAAI,WAAW,UACX,MAAM,IAAI,MACN,iBAAiB,KAAK,uEAC1B;EAEJ,IAAI,WAAW,YAAY;GAEvB,8BAA8B,IAAI,MAAM,CAAC,GAAG;GAC5C,MAAM,IAAI,MAAM,iBAAiB,KAAK,8BAA8B;EACxE;EACA,IAAI,WAAW,aACP;OAAA,wBAAwB,kCAAkC,GAAG;IAC7D,MAAM,UAAU,MAAM,oBAClB,OAAO,wBAAwB,EAAE,KAAK,CAAC,CAC3C,CAAC,CAAC,OAAO,UAAiB;KACtB,IAAI,MAAM,SAAS,qCAAqC,OAAO,KAAA;KAC/D,MAAM;IACV,CAAC;IACD,IAAI,SAAS;KACT,YAAY,SAAS,WAAW,KAAK,IAAI,IAAI,SAAS;KACtD,OAAO;IACX;GACJ;SAEA,sBAAsB;EAE1B,MAAM,YAAY,WAAW,KAAK,IAAI;EACtC,IAAI,aAAa,GAAG,MAAM,SAAS;EACnC,MAAM,IAAI,SAAS,YACf,WAAW,SAAS,KAAK,IAAI,OAAO,iBAAiB,SAAS,CAAC,CACnE;CACJ;AACJ"}
|