@prb/effect-evm 1.0.0-beta.5 → 1.0.0-beta.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/constants/index.d.ts +0 -4
- package/dist/constants/index.d.ts.map +1 -1
- package/dist/constants/index.js +0 -4
- package/dist/constants/index.js.map +1 -1
- package/dist/contract/pipeline/internal/core.d.ts +2 -2
- package/dist/contract/pipeline/internal/core.d.ts.map +1 -1
- package/dist/contract/pipeline/internal/core.js.map +1 -1
- package/dist/contract/pipeline/internal/receipt.d.ts +2 -2
- package/dist/contract/pipeline/internal/receipt.d.ts.map +1 -1
- package/dist/contract/pipeline/internal/receipt.js +1 -1
- package/dist/contract/pipeline/internal/receipt.js.map +1 -1
- package/dist/contract/pipeline/service.d.ts +3 -3
- package/dist/contract/pipeline/service.d.ts.map +1 -1
- package/dist/contract/pipeline/service.js.map +1 -1
- package/dist/contract/pipeline/types.d.ts +2 -2
- package/dist/contract/pipeline/types.d.ts.map +1 -1
- package/dist/contract/pipeline/types.js.map +1 -1
- package/dist/contract/pipeline/write-and-track.js +1 -1
- package/dist/contract/pipeline/write-and-track.js.map +1 -1
- package/dist/contract/pipeline/write-and-wait.d.ts +1 -1
- package/dist/contract/pipeline/write-and-wait.d.ts.map +1 -1
- package/dist/core/errors/transaction.d.ts +7 -7
- package/dist/core/errors/transaction.d.ts.map +1 -1
- package/dist/core/errors/transaction.js +2 -2
- package/dist/core/errors/transaction.js.map +1 -1
- package/dist/core/errors/viem-mapper.d.ts +3 -3
- package/dist/core/errors/viem-mapper.d.ts.map +1 -1
- package/dist/core/errors/viem-mapper.js +3 -3
- package/dist/core/errors/viem-mapper.js.map +1 -1
- package/dist/deploy/service.d.ts +3 -3
- package/dist/deploy/service.d.ts.map +1 -1
- package/dist/deploy/service.js.map +1 -1
- package/dist/eip7702/errors.d.ts +3 -3
- package/dist/eip7702/errors.d.ts.map +1 -1
- package/dist/eip7702/errors.js +1 -1
- package/dist/eip7702/errors.js.map +1 -1
- package/dist/eip7702/service.d.ts +8 -8
- package/dist/eip7702/service.d.ts.map +1 -1
- package/dist/eip7702/service.js +2 -2
- package/dist/eip7702/service.js.map +1 -1
- package/dist/react-hooks/index.d.ts +0 -4
- package/dist/react-hooks/index.d.ts.map +1 -1
- package/dist/react-hooks/index.js +0 -4
- package/dist/react-hooks/index.js.map +1 -1
- package/dist/subscriptions/pending-tx.d.ts +1 -1
- package/dist/subscriptions/pending-tx.d.ts.map +1 -1
- package/dist/subscriptions/pending-tx.js +1 -1
- package/dist/subscriptions/pending-tx.js.map +1 -1
- package/dist/subscriptions/service.d.ts +2 -2
- package/dist/subscriptions/service.d.ts.map +1 -1
- package/dist/subscriptions/service.js +4 -4
- package/dist/subscriptions/service.js.map +1 -1
- package/dist/testing-kit/mock-subscription-service.d.ts +2 -2
- package/dist/testing-kit/mock-subscription-service.d.ts.map +1 -1
- package/dist/testing-kit/mock-subscription-service.js +5 -5
- package/dist/testing-kit/mock-subscription-service.js.map +1 -1
- package/dist/testing-kit/mock-transfer-service.d.ts +3 -3
- package/dist/testing-kit/mock-transfer-service.d.ts.map +1 -1
- package/dist/testing-kit/mock-transfer-service.js.map +1 -1
- package/dist/transfer/service.d.ts +3 -3
- package/dist/transfer/service.d.ts.map +1 -1
- package/dist/transfer/service.js +3 -3
- package/dist/transfer/service.js.map +1 -1
- package/dist/tx/manager.d.ts +2 -2
- package/dist/tx/manager.d.ts.map +1 -1
- package/dist/tx/manager.js +5 -5
- package/dist/tx/manager.js.map +1 -1
- package/dist/tx/manager.test.integration.js +4 -4
- package/dist/tx/manager.test.integration.js.map +1 -1
- package/dist/tx/replacement.d.ts +3 -3
- package/dist/tx/replacement.d.ts.map +1 -1
- package/dist/tx/replacement.js +3 -3
- package/dist/tx/replacement.js.map +1 -1
- package/dist/tx/tracker.d.ts +6 -6
- package/dist/tx/tracker.d.ts.map +1 -1
- package/dist/tx/tracker.js +9 -9
- package/dist/tx/tracker.js.map +1 -1
- package/dist/types/params.d.ts +1 -1
- package/dist/types/params.d.ts.map +1 -1
- package/dist/types/params.js.map +1 -1
- package/dist/wallet/errors.d.ts +3 -3
- package/dist/wallet/errors.d.ts.map +1 -1
- package/dist/wallet/errors.js +1 -1
- package/dist/wallet/errors.js.map +1 -1
- package/dist/wallet/operations.d.ts +2 -2
- package/dist/wallet/operations.d.ts.map +1 -1
- package/dist/wallet/operations.js +2 -2
- package/dist/wallet/operations.js.map +1 -1
- package/dist/wallet/service.d.ts +2 -2
- package/dist/wallet/service.d.ts.map +1 -1
- package/dist/wallet/service.js.map +1 -1
- package/package.json +1 -6
- package/dist/react-hooks/safe-app-origins.d.ts +0 -8
- package/dist/react-hooks/safe-app-origins.d.ts.map +0 -1
- package/dist/react-hooks/safe-app-origins.js +0 -124
- package/dist/react-hooks/safe-app-origins.js.map +0 -1
- package/dist/react-hooks/use-is-host-safe-app.d.ts +0 -2
- package/dist/react-hooks/use-is-host-safe-app.d.ts.map +0 -1
- package/dist/react-hooks/use-is-host-safe-app.js +0 -16
- package/dist/react-hooks/use-is-host-safe-app.js.map +0 -1
- package/dist/react-hooks/use-is-safe-app-context.d.ts +0 -2
- package/dist/react-hooks/use-is-safe-app-context.d.ts.map +0 -1
- package/dist/react-hooks/use-is-safe-app-context.js +0 -41
- package/dist/react-hooks/use-is-safe-app-context.js.map +0 -1
- package/dist/react-hooks/use-is-safe-multisig-wallet.d.ts +0 -2
- package/dist/react-hooks/use-is-safe-multisig-wallet.d.ts.map +0 -1
- package/dist/react-hooks/use-is-safe-multisig-wallet.js +0 -24
- package/dist/react-hooks/use-is-safe-multisig-wallet.js.map +0 -1
- package/dist/safe/adapter.d.ts +0 -9
- package/dist/safe/adapter.d.ts.map +0 -1
- package/dist/safe/adapter.js +0 -13
- package/dist/safe/adapter.js.map +0 -1
- package/dist/safe/detection.d.ts +0 -26
- package/dist/safe/detection.d.ts.map +0 -1
- package/dist/safe/detection.js +0 -102
- package/dist/safe/detection.js.map +0 -1
- package/dist/safe/detection.test.integration.d.ts +0 -2
- package/dist/safe/detection.test.integration.d.ts.map +0 -1
- package/dist/safe/detection.test.integration.js +0 -92
- package/dist/safe/detection.test.integration.js.map +0 -1
- package/dist/safe/errors.d.ts +0 -79
- package/dist/safe/errors.d.ts.map +0 -1
- package/dist/safe/errors.js +0 -34
- package/dist/safe/errors.js.map +0 -1
- package/dist/safe/index.d.ts +0 -8
- package/dist/safe/index.d.ts.map +0 -1
- package/dist/safe/index.js +0 -6
- package/dist/safe/index.js.map +0 -1
- package/dist/safe/live.d.ts +0 -8
- package/dist/safe/live.d.ts.map +0 -1
- package/dist/safe/live.js +0 -250
- package/dist/safe/live.js.map +0 -1
- package/dist/safe/service.d.ts +0 -26
- package/dist/safe/service.d.ts.map +0 -1
- package/dist/safe/service.js +0 -4
- package/dist/safe/service.js.map +0 -1
- package/dist/safe/service.test.integration.d.ts +0 -2
- package/dist/safe/service.test.integration.d.ts.map +0 -1
- package/dist/safe/service.test.integration.js +0 -171
- package/dist/safe/service.test.integration.js.map +0 -1
- package/dist/safe/simulation/abis.d.ts +0 -73
- package/dist/safe/simulation/abis.d.ts.map +0 -1
- package/dist/safe/simulation/abis.js +0 -61
- package/dist/safe/simulation/abis.js.map +0 -1
- package/dist/safe/simulation/addresses.d.ts +0 -4
- package/dist/safe/simulation/addresses.d.ts.map +0 -1
- package/dist/safe/simulation/addresses.js +0 -54
- package/dist/safe/simulation/addresses.js.map +0 -1
- package/dist/safe/simulation/encoding.d.ts +0 -16
- package/dist/safe/simulation/encoding.d.ts.map +0 -1
- package/dist/safe/simulation/encoding.js +0 -36
- package/dist/safe/simulation/encoding.js.map +0 -1
- package/dist/safe/simulation/errors.d.ts +0 -56
- package/dist/safe/simulation/errors.d.ts.map +0 -1
- package/dist/safe/simulation/errors.js +0 -37
- package/dist/safe/simulation/errors.js.map +0 -1
- package/dist/safe/simulation/index.d.ts +0 -7
- package/dist/safe/simulation/index.d.ts.map +0 -1
- package/dist/safe/simulation/index.js +0 -6
- package/dist/safe/simulation/index.js.map +0 -1
- package/dist/safe/simulation/internal/calldata/calldata.d.ts +0 -5
- package/dist/safe/simulation/internal/calldata/calldata.d.ts.map +0 -1
- package/dist/safe/simulation/internal/calldata/calldata.js +0 -17
- package/dist/safe/simulation/internal/calldata/calldata.js.map +0 -1
- package/dist/safe/simulation/internal/calldata/index.d.ts +0 -2
- package/dist/safe/simulation/internal/calldata/index.d.ts.map +0 -1
- package/dist/safe/simulation/internal/calldata/index.js +0 -2
- package/dist/safe/simulation/internal/calldata/index.js.map +0 -1
- package/dist/safe/simulation/internal/contracts/contracts.d.ts +0 -5
- package/dist/safe/simulation/internal/contracts/contracts.d.ts.map +0 -1
- package/dist/safe/simulation/internal/contracts/contracts.js +0 -25
- package/dist/safe/simulation/internal/contracts/contracts.js.map +0 -1
- package/dist/safe/simulation/internal/contracts/index.d.ts +0 -2
- package/dist/safe/simulation/internal/contracts/index.d.ts.map +0 -1
- package/dist/safe/simulation/internal/contracts/index.js +0 -2
- package/dist/safe/simulation/internal/contracts/index.js.map +0 -1
- package/dist/safe/simulation/internal/evaluation/evaluation.d.ts +0 -6
- package/dist/safe/simulation/internal/evaluation/evaluation.d.ts.map +0 -1
- package/dist/safe/simulation/internal/evaluation/evaluation.js +0 -20
- package/dist/safe/simulation/internal/evaluation/evaluation.js.map +0 -1
- package/dist/safe/simulation/internal/evaluation/index.d.ts +0 -2
- package/dist/safe/simulation/internal/evaluation/index.d.ts.map +0 -1
- package/dist/safe/simulation/internal/evaluation/index.js +0 -2
- package/dist/safe/simulation/internal/evaluation/index.js.map +0 -1
- package/dist/safe/simulation/internal/execution/execution.d.ts +0 -9
- package/dist/safe/simulation/internal/execution/execution.d.ts.map +0 -1
- package/dist/safe/simulation/internal/execution/execution.js +0 -65
- package/dist/safe/simulation/internal/execution/execution.js.map +0 -1
- package/dist/safe/simulation/internal/execution/index.d.ts +0 -2
- package/dist/safe/simulation/internal/execution/index.d.ts.map +0 -1
- package/dist/safe/simulation/internal/execution/index.js +0 -2
- package/dist/safe/simulation/internal/execution/index.js.map +0 -1
- package/dist/safe/simulation/internal/limits/index.d.ts +0 -2
- package/dist/safe/simulation/internal/limits/index.d.ts.map +0 -1
- package/dist/safe/simulation/internal/limits/index.js +0 -2
- package/dist/safe/simulation/internal/limits/index.js.map +0 -1
- package/dist/safe/simulation/internal/limits/limits.d.ts +0 -5
- package/dist/safe/simulation/internal/limits/limits.d.ts.map +0 -1
- package/dist/safe/simulation/internal/limits/limits.js +0 -18
- package/dist/safe/simulation/internal/limits/limits.js.map +0 -1
- package/dist/safe/simulation/internal/types/index.d.ts +0 -2
- package/dist/safe/simulation/internal/types/index.d.ts.map +0 -1
- package/dist/safe/simulation/internal/types/index.js +0 -2
- package/dist/safe/simulation/internal/types/index.js.map +0 -1
- package/dist/safe/simulation/internal/types/types.d.ts +0 -11
- package/dist/safe/simulation/internal/types/types.d.ts.map +0 -1
- package/dist/safe/simulation/internal/types/types.js +0 -2
- package/dist/safe/simulation/internal/types/types.js.map +0 -1
- package/dist/safe/simulation/internal/validation/index.d.ts +0 -2
- package/dist/safe/simulation/internal/validation/index.d.ts.map +0 -1
- package/dist/safe/simulation/internal/validation/index.js +0 -2
- package/dist/safe/simulation/internal/validation/index.js.map +0 -1
- package/dist/safe/simulation/internal/validation/validation.d.ts +0 -5
- package/dist/safe/simulation/internal/validation/validation.d.ts.map +0 -1
- package/dist/safe/simulation/internal/validation/validation.js +0 -27
- package/dist/safe/simulation/internal/validation/validation.js.map +0 -1
- package/dist/safe/simulation/service.d.ts +0 -14
- package/dist/safe/simulation/service.d.ts.map +0 -1
- package/dist/safe/simulation/service.js +0 -25
- package/dist/safe/simulation/service.js.map +0 -1
- package/dist/safe/simulation/types.d.ts +0 -20
- package/dist/safe/simulation/types.d.ts.map +0 -1
- package/dist/safe/simulation/types.js +0 -2
- package/dist/safe/simulation/types.js.map +0 -1
- package/dist/safe/types.d.ts +0 -61
- package/dist/safe/types.d.ts.map +0 -1
- package/dist/safe/types.js +0 -2
- package/dist/safe/types.js.map +0 -1
package/dist/wallet/errors.js
CHANGED
|
@@ -9,7 +9,7 @@ export class SignTypedDataError extends Schema.TaggedError()("SignTypedDataError
|
|
|
9
9
|
message: Schema.String,
|
|
10
10
|
}) {
|
|
11
11
|
}
|
|
12
|
-
export class
|
|
12
|
+
export class SignTxError extends Schema.TaggedError()("SignTxError", {
|
|
13
13
|
cause: Schema.optional(Schema.Unknown),
|
|
14
14
|
message: Schema.String,
|
|
15
15
|
}) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/wallet/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEhC,MAAM,OAAO,gBAAiB,SAAQ,MAAM,CAAC,WAAW,EAAoB,CAAC,kBAAkB,EAAE;IAC/F,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC;IACtC,OAAO,EAAE,MAAM,CAAC,MAAM;CACvB,CAAC;CAAG;AAEL,MAAM,OAAO,kBAAmB,SAAQ,MAAM,CAAC,WAAW,EAAsB,CAC9E,oBAAoB,EACpB;IACE,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC;IACtC,OAAO,EAAE,MAAM,CAAC,MAAM;CACvB,CACF;CAAG;AAEJ,MAAM,OAAO,
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/wallet/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEhC,MAAM,OAAO,gBAAiB,SAAQ,MAAM,CAAC,WAAW,EAAoB,CAAC,kBAAkB,EAAE;IAC/F,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC;IACtC,OAAO,EAAE,MAAM,CAAC,MAAM;CACvB,CAAC;CAAG;AAEL,MAAM,OAAO,kBAAmB,SAAQ,MAAM,CAAC,WAAW,EAAsB,CAC9E,oBAAoB,EACpB;IACE,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC;IACtC,OAAO,EAAE,MAAM,CAAC,MAAM;CACvB,CACF;CAAG;AAEJ,MAAM,OAAO,WAAY,SAAQ,MAAM,CAAC,WAAW,EAAe,CAAC,aAAa,EAAE;IAChF,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC;IACtC,OAAO,EAAE,MAAM,CAAC,MAAM;CACvB,CAAC;CAAG;AAEL,MAAM,OAAO,qBAAsB,SAAQ,MAAM,CAAC,WAAW,EAAyB,CACpF,uBAAuB,EACvB;IACE,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC;IACtC,OAAO,EAAE,MAAM,CAAC,MAAM;CACvB,CACF;CAAG;AAEJ,MAAM,OAAO,gBAAiB,SAAQ,MAAM,CAAC,WAAW,EAAoB,CAAC,kBAAkB,EAAE;IAC/F,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC;IACtC,OAAO,EAAE,MAAM,CAAC,MAAM;IACtB,OAAO,EAAE,MAAM,CAAC,MAAM;CACvB,CAAC;CAAG;AAEL,MAAM,OAAO,aAAc,SAAQ,MAAM,CAAC,WAAW,EAAiB,CAAC,eAAe,EAAE;IACtF,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC;IACtC,OAAO,EAAE,MAAM,CAAC,MAAM;IACtB,OAAO,EAAE,MAAM,CAAC,MAAM;CACvB,CAAC;CAAG;AAEL,MAAM,OAAO,wBAAyB,SAAQ,MAAM,CAAC,WAAW,EAA4B,CAC1F,0BAA0B,EAC1B;IACE,OAAO,EAAE,MAAM,CAAC,MAAM;CACvB,CACF;CAAG;AAEJ,MAAM,OAAO,eAAgB,SAAQ,MAAM,CAAC,WAAW,EAAmB,CAAC,iBAAiB,EAAE;IAC5F,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC;IACtC,OAAO,EAAE,MAAM,CAAC,MAAM;CACvB,CAAC;CAAG","sourcesContent":["import { Schema } from \"effect\";\n\nexport class SignMessageError extends Schema.TaggedError<SignMessageError>()(\"SignMessageError\", {\n cause: Schema.optional(Schema.Unknown),\n message: Schema.String,\n}) {}\n\nexport class SignTypedDataError extends Schema.TaggedError<SignTypedDataError>()(\n \"SignTypedDataError\",\n {\n cause: Schema.optional(Schema.Unknown),\n message: Schema.String,\n }\n) {}\n\nexport class SignTxError extends Schema.TaggedError<SignTxError>()(\"SignTxError\", {\n cause: Schema.optional(Schema.Unknown),\n message: Schema.String,\n}) {}\n\nexport class WalletConnectionError extends Schema.TaggedError<WalletConnectionError>()(\n \"WalletConnectionError\",\n {\n cause: Schema.optional(Schema.Unknown),\n message: Schema.String,\n }\n) {}\n\nexport class ChainSwitchError extends Schema.TaggedError<ChainSwitchError>()(\"ChainSwitchError\", {\n cause: Schema.optional(Schema.Unknown),\n chainId: Schema.Number,\n message: Schema.String,\n}) {}\n\nexport class AddChainError extends Schema.TaggedError<AddChainError>()(\"AddChainError\", {\n cause: Schema.optional(Schema.Unknown),\n chainId: Schema.Number,\n message: Schema.String,\n}) {}\n\nexport class AccountNotConnectedError extends Schema.TaggedError<AccountNotConnectedError>()(\n \"AccountNotConnectedError\",\n {\n message: Schema.String,\n }\n) {}\n\nexport class WatchAssetError extends Schema.TaggedError<WatchAssetError>()(\"WatchAssetError\", {\n cause: Schema.optional(Schema.Unknown),\n message: Schema.String,\n}) {}\n"]}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { Effect } from "effect";
|
|
2
2
|
import type { Hex, TypedData } from "viem";
|
|
3
3
|
import type { SignMessageParams, SignTransactionParams, SignTypedDataParams, WalletProvider } from "../wallet/index.js";
|
|
4
|
-
import { AccountNotConnectedError, SignMessageError,
|
|
4
|
+
import { AccountNotConnectedError, SignMessageError, SignTxError, SignTypedDataError } from "../wallet/index.js";
|
|
5
5
|
export declare function signMessage(provider: WalletProvider, params: SignMessageParams): Effect.Effect<Hex, SignMessageError | AccountNotConnectedError>;
|
|
6
6
|
export declare function signTypedData<const typedData extends TypedData | Record<string, unknown>, primaryType extends keyof typedData | "EIP712Domain">(provider: WalletProvider, params: SignTypedDataParams<typedData, primaryType>): Effect.Effect<Hex, SignTypedDataError | AccountNotConnectedError>;
|
|
7
|
-
export declare function signTransaction(provider: WalletProvider, params: SignTransactionParams): Effect.Effect<Hex,
|
|
7
|
+
export declare function signTransaction(provider: WalletProvider, params: SignTransactionParams): Effect.Effect<Hex, SignTxError | AccountNotConnectedError>;
|
|
8
8
|
//# sourceMappingURL=operations.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"operations.d.ts","sourceRoot":"","sources":["../../src/wallet/operations.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,KAAK,EAAW,GAAG,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AAGpD,OAAO,KAAK,EACV,iBAAiB,EACjB,qBAAqB,EACrB,mBAAmB,EACnB,cAAc,EACf,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,wBAAwB,EACxB,gBAAgB,EAChB,
|
|
1
|
+
{"version":3,"file":"operations.d.ts","sourceRoot":"","sources":["../../src/wallet/operations.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,KAAK,EAAW,GAAG,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AAGpD,OAAO,KAAK,EACV,iBAAiB,EACjB,qBAAqB,EACrB,mBAAmB,EACnB,cAAc,EACf,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,wBAAwB,EACxB,gBAAgB,EAChB,WAAW,EACX,kBAAkB,EACnB,MAAM,uBAAuB,CAAC;AA+F/B,wBAAgB,WAAW,CACzB,QAAQ,EAAE,cAAc,EACxB,MAAM,EAAE,iBAAiB,GACxB,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,gBAAgB,GAAG,wBAAwB,CAAC,CAkEjE;AAKD,wBAAgB,aAAa,CAC3B,KAAK,CAAC,SAAS,SAAS,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC3D,WAAW,SAAS,MAAM,SAAS,GAAG,cAAc,EAEpD,QAAQ,EAAE,cAAc,EACxB,MAAM,EAAE,mBAAmB,CAAC,SAAS,EAAE,WAAW,CAAC,GAClD,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,kBAAkB,GAAG,wBAAwB,CAAC,CAiDnE;AAKD,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,cAAc,EACxB,MAAM,EAAE,qBAAqB,GAC5B,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,WAAW,GAAG,wBAAwB,CAAC,CAwC5D"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Effect } from "effect";
|
|
2
2
|
import { isLikelyUserRejectedError, isUserRejectedError } from "../core/errors/index.js";
|
|
3
3
|
import { SpanNames } from "../telemetry/index.js";
|
|
4
|
-
import { AccountNotConnectedError, SignMessageError,
|
|
4
|
+
import { AccountNotConnectedError, SignMessageError, SignTxError, SignTypedDataError, } from "../wallet/index.js";
|
|
5
5
|
const isUserRejection = (error) => isUserRejectedError(error);
|
|
6
6
|
const isLikelyUserRejection = (error) => isLikelyUserRejectedError(error);
|
|
7
7
|
const errorCode = (error) => {
|
|
@@ -186,7 +186,7 @@ export function signTransaction(provider, params) {
|
|
|
186
186
|
catch: (cause) => {
|
|
187
187
|
const errorMessage = cause instanceof Error ? cause.message : "Failed to sign transaction";
|
|
188
188
|
const isRejection = isLikelyUserRejection(cause);
|
|
189
|
-
return new
|
|
189
|
+
return new SignTxError({
|
|
190
190
|
cause,
|
|
191
191
|
message: isRejection ? "User rejected the request" : errorMessage,
|
|
192
192
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"operations.js","sourceRoot":"","sources":["../../src/wallet/operations.ts"],"names":[],"mappings":"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","sourcesContent":["import { Effect } from \"effect\";\nimport type { Address, Hex, TypedData } from \"viem\";\nimport { isLikelyUserRejectedError, isUserRejectedError } from \"@/src/core/errors/index.js\";\nimport { SpanNames } from \"@/src/telemetry/index.js\";\nimport type {\n SignMessageParams,\n SignTransactionParams,\n SignTypedDataParams,\n WalletProvider,\n} from \"@/src/wallet/index.js\";\nimport {\n AccountNotConnectedError,\n SignMessageError,\n SignTransactionError,\n SignTypedDataError,\n} from \"@/src/wallet/index.js\";\n\n/**\n * Detect if an error is a user rejection\n */\nconst isUserRejection = (error: unknown): boolean => isUserRejectedError(error);\nconst isLikelyUserRejection = (error: unknown): boolean => isLikelyUserRejectedError(error);\n\nconst errorCode = (error: unknown): number | undefined => {\n if (!error || typeof error !== \"object\") {\n return;\n }\n const code = (error as { code?: unknown }).code;\n return typeof code === \"number\" ? code : undefined;\n};\n\nconst messageOf = (error: unknown): string => {\n if (error instanceof Error) {\n return error.message;\n }\n if (typeof error === \"string\") {\n return error;\n }\n return String(error);\n};\n\nconst isMethodNotFound = (error: unknown): boolean => {\n const code = errorCode(error);\n if (code === -32_601) {\n return true;\n }\n const msg = messageOf(error).toLowerCase();\n return msg.includes(\"method not found\") || msg.includes(\"does not exist\");\n};\n\nconst isInvalidParams = (error: unknown): boolean => {\n const code = errorCode(error);\n if (code === -32_602) {\n return true;\n }\n const msg = messageOf(error).toLowerCase();\n return msg.includes(\"invalid params\") || msg.includes(\"invalid parameter\");\n};\n\nconst requestHex = async (\n provider: WalletProvider,\n method: string,\n methodParams: unknown[]\n): Promise<Hex> => {\n const result = await provider.request({\n method,\n params: methodParams,\n });\n return result as Hex;\n};\n\nconst signTypedDataFallbacks = async (\n provider: WalletProvider,\n account: Address,\n typedDataPayload: unknown\n): Promise<Hex> => {\n const json = JSON.stringify(typedDataPayload);\n const attempts: ReadonlyArray<{\n method: string;\n params: readonly unknown[];\n }> = [\n { method: \"eth_signTypedData_v4\", params: [account, json] },\n { method: \"eth_signTypedData_v3\", params: [account, json] },\n { method: \"eth_signTypedData\", params: [account, typedDataPayload] },\n ];\n\n let lastError: unknown;\n for (const attempt of attempts) {\n try {\n return await requestHex(provider, attempt.method, [...attempt.params]);\n } catch (e) {\n if (isUserRejection(e)) {\n throw e;\n }\n lastError = e;\n\n const shouldTryNext = attempt.method !== \"eth_signTypedData\" && isMethodNotFound(e);\n\n if (!shouldTryNext) {\n throw e;\n }\n }\n }\n\n throw lastError;\n};\n\n/**\n * Sign a message using the wallet's personal_sign method\n */\nexport function signMessage(\n provider: WalletProvider,\n params: SignMessageParams\n): Effect.Effect<Hex, SignMessageError | AccountNotConnectedError> {\n return Effect.gen(function* () {\n // Get the current account if not provided\n const account =\n params.account ??\n (yield* Effect.tryPromise({\n catch: (error) =>\n new AccountNotConnectedError({\n message: error instanceof Error ? error.message : \"Failed to get wallet account\",\n }),\n try: async () => {\n const accounts = (await provider.request({\n method: \"eth_accounts\",\n })) as Address[];\n if (accounts.length === 0) {\n throw new Error(\"No wallet account connected\");\n }\n return accounts[0];\n },\n }));\n\n // Prepare the message\n const message = typeof params.message === \"string\" ? params.message : params.message.raw;\n\n // Sign the message\n return yield* Effect.tryPromise({\n catch: (cause) => {\n const errorMessage = messageOf(cause) || \"Failed to sign message\";\n const isRejection = isLikelyUserRejection(cause);\n return new SignMessageError({\n cause,\n message: isRejection ? \"User rejected the request\" : errorMessage,\n });\n },\n try: async () => {\n try {\n const result = await provider.request({\n method: \"personal_sign\",\n params: [message, account],\n });\n return result as Hex;\n } catch (e) {\n if (isUserRejection(e)) {\n throw e;\n }\n\n if (!isInvalidParams(e)) {\n throw e;\n }\n\n // Fallback for providers that expect reversed parameter order.\n const result = await provider.request({\n method: \"personal_sign\",\n params: [account, message],\n });\n return result as Hex;\n }\n },\n });\n }).pipe(\n Effect.withSpan(SpanNames.WALLET_SIGN_MESSAGE, {\n attributes: {\n account: params.account,\n },\n })\n );\n}\n\n/**\n * Sign typed data using the wallet's eth_signTypedData_v4 method\n */\nexport function signTypedData<\n const typedData extends TypedData | Record<string, unknown>,\n primaryType extends keyof typedData | \"EIP712Domain\",\n>(\n provider: WalletProvider,\n params: SignTypedDataParams<typedData, primaryType>\n): Effect.Effect<Hex, SignTypedDataError | AccountNotConnectedError> {\n return Effect.gen(function* () {\n // Get the current account if not provided\n const account =\n params.account ??\n (yield* Effect.tryPromise({\n catch: (error) =>\n new AccountNotConnectedError({\n message: error instanceof Error ? error.message : \"Failed to get wallet account\",\n }),\n try: async () => {\n const accounts = (await provider.request({\n method: \"eth_accounts\",\n })) as Address[];\n if (accounts.length === 0) {\n throw new Error(\"No wallet account connected\");\n }\n return accounts[0];\n },\n }));\n\n // Prepare the typed data payload\n const typedDataPayload = {\n domain: params.domain,\n message: params.message,\n primaryType: params.primaryType,\n types: params.types,\n };\n\n // Sign the typed data\n return yield* Effect.tryPromise({\n catch: (cause) => {\n const errorMessage = messageOf(cause) || \"Failed to sign typed data\";\n const isRejection = isLikelyUserRejection(cause);\n return new SignTypedDataError({\n cause,\n message: isRejection ? \"User rejected the request\" : errorMessage,\n });\n },\n try: async () => await signTypedDataFallbacks(provider, account, typedDataPayload),\n });\n }).pipe(\n Effect.withSpan(SpanNames.WALLET_SIGN_TYPED_DATA, {\n attributes: {\n account: params.account,\n primaryType: params.primaryType,\n },\n })\n );\n}\n\n/**\n * Sign a transaction using the wallet's eth_signTransaction method\n */\nexport function signTransaction(\n provider: WalletProvider,\n params: SignTransactionParams\n): Effect.Effect<Hex, SignTransactionError | AccountNotConnectedError> {\n return Effect.gen(function* () {\n // Get the current account if not provided\n const account =\n params.from ??\n (yield* Effect.tryPromise({\n catch: (error) =>\n new AccountNotConnectedError({\n message: error instanceof Error ? error.message : \"Failed to get wallet account\",\n }),\n try: async () => {\n const accounts = (await provider.request({\n method: \"eth_accounts\",\n })) as Address[];\n if (accounts.length === 0) {\n throw new Error(\"No wallet account connected\");\n }\n return accounts[0];\n },\n }));\n\n // Sign the transaction\n return yield* Effect.tryPromise({\n catch: (cause) => {\n const errorMessage = cause instanceof Error ? cause.message : \"Failed to sign transaction\";\n const isRejection = isLikelyUserRejection(cause);\n return new SignTransactionError({\n cause,\n message: isRejection ? \"User rejected the request\" : errorMessage,\n });\n },\n try: async () => {\n const result = await provider.request({\n method: \"eth_signTransaction\",\n params: [{ ...params, from: account }],\n });\n return result as Hex;\n },\n });\n });\n}\n"]}
|
|
1
|
+
{"version":3,"file":"operations.js","sourceRoot":"","sources":["../../src/wallet/operations.ts"],"names":[],"mappings":"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","sourcesContent":["import { Effect } from \"effect\";\nimport type { Address, Hex, TypedData } from \"viem\";\nimport { isLikelyUserRejectedError, isUserRejectedError } from \"@/src/core/errors/index.js\";\nimport { SpanNames } from \"@/src/telemetry/index.js\";\nimport type {\n SignMessageParams,\n SignTransactionParams,\n SignTypedDataParams,\n WalletProvider,\n} from \"@/src/wallet/index.js\";\nimport {\n AccountNotConnectedError,\n SignMessageError,\n SignTxError,\n SignTypedDataError,\n} from \"@/src/wallet/index.js\";\n\n/**\n * Detect if an error is a user rejection\n */\nconst isUserRejection = (error: unknown): boolean => isUserRejectedError(error);\nconst isLikelyUserRejection = (error: unknown): boolean => isLikelyUserRejectedError(error);\n\nconst errorCode = (error: unknown): number | undefined => {\n if (!error || typeof error !== \"object\") {\n return;\n }\n const code = (error as { code?: unknown }).code;\n return typeof code === \"number\" ? code : undefined;\n};\n\nconst messageOf = (error: unknown): string => {\n if (error instanceof Error) {\n return error.message;\n }\n if (typeof error === \"string\") {\n return error;\n }\n return String(error);\n};\n\nconst isMethodNotFound = (error: unknown): boolean => {\n const code = errorCode(error);\n if (code === -32_601) {\n return true;\n }\n const msg = messageOf(error).toLowerCase();\n return msg.includes(\"method not found\") || msg.includes(\"does not exist\");\n};\n\nconst isInvalidParams = (error: unknown): boolean => {\n const code = errorCode(error);\n if (code === -32_602) {\n return true;\n }\n const msg = messageOf(error).toLowerCase();\n return msg.includes(\"invalid params\") || msg.includes(\"invalid parameter\");\n};\n\nconst requestHex = async (\n provider: WalletProvider,\n method: string,\n methodParams: unknown[]\n): Promise<Hex> => {\n const result = await provider.request({\n method,\n params: methodParams,\n });\n return result as Hex;\n};\n\nconst signTypedDataFallbacks = async (\n provider: WalletProvider,\n account: Address,\n typedDataPayload: unknown\n): Promise<Hex> => {\n const json = JSON.stringify(typedDataPayload);\n const attempts: ReadonlyArray<{\n method: string;\n params: readonly unknown[];\n }> = [\n { method: \"eth_signTypedData_v4\", params: [account, json] },\n { method: \"eth_signTypedData_v3\", params: [account, json] },\n { method: \"eth_signTypedData\", params: [account, typedDataPayload] },\n ];\n\n let lastError: unknown;\n for (const attempt of attempts) {\n try {\n return await requestHex(provider, attempt.method, [...attempt.params]);\n } catch (e) {\n if (isUserRejection(e)) {\n throw e;\n }\n lastError = e;\n\n const shouldTryNext = attempt.method !== \"eth_signTypedData\" && isMethodNotFound(e);\n\n if (!shouldTryNext) {\n throw e;\n }\n }\n }\n\n throw lastError;\n};\n\n/**\n * Sign a message using the wallet's personal_sign method\n */\nexport function signMessage(\n provider: WalletProvider,\n params: SignMessageParams\n): Effect.Effect<Hex, SignMessageError | AccountNotConnectedError> {\n return Effect.gen(function* () {\n // Get the current account if not provided\n const account =\n params.account ??\n (yield* Effect.tryPromise({\n catch: (error) =>\n new AccountNotConnectedError({\n message: error instanceof Error ? error.message : \"Failed to get wallet account\",\n }),\n try: async () => {\n const accounts = (await provider.request({\n method: \"eth_accounts\",\n })) as Address[];\n if (accounts.length === 0) {\n throw new Error(\"No wallet account connected\");\n }\n return accounts[0];\n },\n }));\n\n // Prepare the message\n const message = typeof params.message === \"string\" ? params.message : params.message.raw;\n\n // Sign the message\n return yield* Effect.tryPromise({\n catch: (cause) => {\n const errorMessage = messageOf(cause) || \"Failed to sign message\";\n const isRejection = isLikelyUserRejection(cause);\n return new SignMessageError({\n cause,\n message: isRejection ? \"User rejected the request\" : errorMessage,\n });\n },\n try: async () => {\n try {\n const result = await provider.request({\n method: \"personal_sign\",\n params: [message, account],\n });\n return result as Hex;\n } catch (e) {\n if (isUserRejection(e)) {\n throw e;\n }\n\n if (!isInvalidParams(e)) {\n throw e;\n }\n\n // Fallback for providers that expect reversed parameter order.\n const result = await provider.request({\n method: \"personal_sign\",\n params: [account, message],\n });\n return result as Hex;\n }\n },\n });\n }).pipe(\n Effect.withSpan(SpanNames.WALLET_SIGN_MESSAGE, {\n attributes: {\n account: params.account,\n },\n })\n );\n}\n\n/**\n * Sign typed data using the wallet's eth_signTypedData_v4 method\n */\nexport function signTypedData<\n const typedData extends TypedData | Record<string, unknown>,\n primaryType extends keyof typedData | \"EIP712Domain\",\n>(\n provider: WalletProvider,\n params: SignTypedDataParams<typedData, primaryType>\n): Effect.Effect<Hex, SignTypedDataError | AccountNotConnectedError> {\n return Effect.gen(function* () {\n // Get the current account if not provided\n const account =\n params.account ??\n (yield* Effect.tryPromise({\n catch: (error) =>\n new AccountNotConnectedError({\n message: error instanceof Error ? error.message : \"Failed to get wallet account\",\n }),\n try: async () => {\n const accounts = (await provider.request({\n method: \"eth_accounts\",\n })) as Address[];\n if (accounts.length === 0) {\n throw new Error(\"No wallet account connected\");\n }\n return accounts[0];\n },\n }));\n\n // Prepare the typed data payload\n const typedDataPayload = {\n domain: params.domain,\n message: params.message,\n primaryType: params.primaryType,\n types: params.types,\n };\n\n // Sign the typed data\n return yield* Effect.tryPromise({\n catch: (cause) => {\n const errorMessage = messageOf(cause) || \"Failed to sign typed data\";\n const isRejection = isLikelyUserRejection(cause);\n return new SignTypedDataError({\n cause,\n message: isRejection ? \"User rejected the request\" : errorMessage,\n });\n },\n try: async () => await signTypedDataFallbacks(provider, account, typedDataPayload),\n });\n }).pipe(\n Effect.withSpan(SpanNames.WALLET_SIGN_TYPED_DATA, {\n attributes: {\n account: params.account,\n primaryType: params.primaryType,\n },\n })\n );\n}\n\n/**\n * Sign a transaction using the wallet's eth_signTransaction method\n */\nexport function signTransaction(\n provider: WalletProvider,\n params: SignTransactionParams\n): Effect.Effect<Hex, SignTxError | AccountNotConnectedError> {\n return Effect.gen(function* () {\n // Get the current account if not provided\n const account =\n params.from ??\n (yield* Effect.tryPromise({\n catch: (error) =>\n new AccountNotConnectedError({\n message: error instanceof Error ? error.message : \"Failed to get wallet account\",\n }),\n try: async () => {\n const accounts = (await provider.request({\n method: \"eth_accounts\",\n })) as Address[];\n if (accounts.length === 0) {\n throw new Error(\"No wallet account connected\");\n }\n return accounts[0];\n },\n }));\n\n // Sign the transaction\n return yield* Effect.tryPromise({\n catch: (cause) => {\n const errorMessage = cause instanceof Error ? cause.message : \"Failed to sign transaction\";\n const isRejection = isLikelyUserRejection(cause);\n return new SignTxError({\n cause,\n message: isRejection ? \"User rejected the request\" : errorMessage,\n });\n },\n try: async () => {\n const result = await provider.request({\n method: \"eth_signTransaction\",\n params: [{ ...params, from: account }],\n });\n return result as Hex;\n },\n });\n });\n}\n"]}
|
package/dist/wallet/service.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Context, Effect, Layer, Stream } from "effect";
|
|
2
2
|
import type { Address, Hex, TypedData } from "viem";
|
|
3
|
-
import type { SignMessageError, SignMessageParams,
|
|
3
|
+
import type { SignMessageError, SignMessageParams, SignTransactionParams, SignTxError, SignTypedDataError, SignTypedDataParams, WalletProvider } from "../wallet/index.js";
|
|
4
4
|
import { AccountNotConnectedError, WalletProviderRef } from "../wallet/index.js";
|
|
5
5
|
export declare const UNKNOWN_CHAIN_ID = 0;
|
|
6
6
|
export type WalletServiceShape = {
|
|
@@ -10,7 +10,7 @@ export type WalletServiceShape = {
|
|
|
10
10
|
readonly currentChainId: Effect.Effect<number, AccountNotConnectedError>;
|
|
11
11
|
readonly signMessage: (params: SignMessageParams) => Effect.Effect<Hex, SignMessageError | AccountNotConnectedError>;
|
|
12
12
|
readonly signTypedData: <const typedData extends TypedData | Record<string, unknown>, primaryType extends keyof typedData | "EIP712Domain">(params: SignTypedDataParams<typedData, primaryType>) => Effect.Effect<Hex, SignTypedDataError | AccountNotConnectedError>;
|
|
13
|
-
readonly signTransaction: (params: SignTransactionParams) => Effect.Effect<Hex,
|
|
13
|
+
readonly signTransaction: (params: SignTransactionParams) => Effect.Effect<Hex, SignTxError | AccountNotConnectedError>;
|
|
14
14
|
};
|
|
15
15
|
declare const WalletService_base: Context.TagClass<WalletService, "ew3/WalletService", WalletServiceShape>;
|
|
16
16
|
export declare class WalletService extends WalletService_base {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../src/wallet/service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAU,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChE,OAAO,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AAEpD,OAAO,KAAK,EACV,gBAAgB,EAChB,iBAAiB,EACjB,
|
|
1
|
+
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../src/wallet/service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAU,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChE,OAAO,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AAEpD,OAAO,KAAK,EACV,gBAAgB,EAChB,iBAAiB,EACjB,qBAAqB,EACrB,WAAW,EACX,kBAAkB,EAClB,mBAAmB,EACnB,cAAc,EACf,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,wBAAwB,EAIxB,iBAAiB,EAClB,MAAM,uBAAuB,CAAC;AAE/B,eAAO,MAAM,gBAAgB,IAAI,CAAC;AA+ElC,MAAM,MAAM,kBAAkB,GAAG;IAC/B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,KAAK,CAAC,EAAE,KAAK,CAAC,CAAC;IACzE,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,wBAAwB,CAAC,CAAC;IAC1E,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,KAAK,CAAC,CAAC;IACrE,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,wBAAwB,CAAC,CAAC;IACzE,QAAQ,CAAC,WAAW,EAAE,CACpB,MAAM,EAAE,iBAAiB,KACtB,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,gBAAgB,GAAG,wBAAwB,CAAC,CAAC;IACrE,QAAQ,CAAC,aAAa,EAAE,CACtB,KAAK,CAAC,SAAS,SAAS,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC3D,WAAW,SAAS,MAAM,SAAS,GAAG,cAAc,EAEpD,MAAM,EAAE,mBAAmB,CAAC,SAAS,EAAE,WAAW,CAAC,KAChD,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,kBAAkB,GAAG,wBAAwB,CAAC,CAAC;IACvE,QAAQ,CAAC,eAAe,EAAE,CACxB,MAAM,EAAE,qBAAqB,KAC1B,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,WAAW,GAAG,wBAAwB,CAAC,CAAC;CACjE,CAAC;;AAEF,qBAAa,aAAc,SAAQ,kBAGhC;CAAG;AAKN,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,cAAc,GAAG,KAAK,CAAC,KAAK,CAAC,aAAa,CAAC,CA2D1F;AAED,eAAO,MAAM,gCAAgC,sDA+F5C,CAAC;AAKF,eAAO,MAAM,iBAAiB,0CAO7B,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/wallet/service.ts"],"names":[],"mappings":"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","sourcesContent":["import { Context, Effect, Layer, Option, Stream } from \"effect\";\nimport type { Address, Hex, TypedData } from \"viem\";\nimport { parseHexInt } from \"@/src/internal/index.js\";\nimport type {\n SignMessageError,\n SignMessageParams,\n SignTransactionError,\n SignTransactionParams,\n SignTypedDataError,\n SignTypedDataParams,\n WalletProvider,\n} from \"@/src/wallet/index.js\";\nimport {\n AccountNotConnectedError,\n signMessage,\n signTransaction,\n signTypedData,\n WalletProviderRef,\n} from \"@/src/wallet/index.js\";\n\nexport const UNKNOWN_CHAIN_ID = 0;\n\nconst accountsStreamFromProvider = (provider: WalletProvider) =>\n Stream.async<Address[], never>((emit) => {\n provider\n .request({ method: \"eth_accounts\" })\n .then((result) => {\n const accounts = (result as Address[]) || [];\n emit.single(accounts);\n })\n .catch(() => {\n emit.single([]);\n });\n\n const handleAccountsChanged = (...args: unknown[]) => {\n const accounts = args[0] as Address[];\n emit.single(accounts);\n };\n\n if (\"on\" in provider && typeof provider.on === \"function\") {\n (\n provider as {\n on: (event: string, handler: (...args: unknown[]) => void) => void;\n }\n ).on(\"accountsChanged\", handleAccountsChanged);\n }\n\n return Effect.sync(() => {\n if (\"removeListener\" in provider && typeof provider.removeListener === \"function\") {\n (\n provider as {\n removeListener: (event: string, handler: (...args: unknown[]) => void) => void;\n }\n ).removeListener(\"accountsChanged\", handleAccountsChanged);\n }\n });\n });\n\nconst chainIdStreamFromProvider = (provider: WalletProvider) =>\n Stream.async<number, never>((emit) => {\n provider\n .request({ method: \"eth_chainId\" })\n .then((result) => {\n const chainIdHex = result as string;\n const parsed = Option.getOrElse(parseHexInt(chainIdHex), () => UNKNOWN_CHAIN_ID);\n emit.single(parsed);\n })\n .catch(() => {\n emit.single(UNKNOWN_CHAIN_ID);\n });\n\n const handleChainChanged = (...args: unknown[]) => {\n const chainIdHex = args[0] as string;\n const parsed = Option.getOrElse(parseHexInt(chainIdHex), () => UNKNOWN_CHAIN_ID);\n emit.single(parsed);\n };\n\n if (\"on\" in provider && typeof provider.on === \"function\") {\n (\n provider as {\n on: (event: string, handler: (...args: unknown[]) => void) => void;\n }\n ).on(\"chainChanged\", handleChainChanged);\n }\n\n return Effect.sync(() => {\n if (\"removeListener\" in provider && typeof provider.removeListener === \"function\") {\n (\n provider as {\n removeListener: (event: string, handler: (...args: unknown[]) => void) => void;\n }\n ).removeListener(\"chainChanged\", handleChainChanged);\n }\n });\n });\n\n/**\n * Service for wallet account management and signing operations\n */\nexport type WalletServiceShape = {\n readonly accounts: Effect.Effect<Stream.Stream<Address[], never>, never>;\n readonly currentAccount: Effect.Effect<Address, AccountNotConnectedError>;\n readonly chainId: Effect.Effect<Stream.Stream<number, never>, never>;\n readonly currentChainId: Effect.Effect<number, AccountNotConnectedError>;\n readonly signMessage: (\n params: SignMessageParams\n ) => Effect.Effect<Hex, SignMessageError | AccountNotConnectedError>;\n readonly signTypedData: <\n const typedData extends TypedData | Record<string, unknown>,\n primaryType extends keyof typedData | \"EIP712Domain\",\n >(\n params: SignTypedDataParams<typedData, primaryType>\n ) => Effect.Effect<Hex, SignTypedDataError | AccountNotConnectedError>;\n readonly signTransaction: (\n params: SignTransactionParams\n ) => Effect.Effect<Hex, SignTransactionError | AccountNotConnectedError>;\n};\n\nexport class WalletService extends Context.Tag(\"ew3/WalletService\")<\n WalletService,\n WalletServiceShape\n>() {}\n\n/**\n * Create a live implementation of WalletService\n */\nexport function makeWalletServiceLive(provider: WalletProvider): Layer.Layer<WalletService> {\n return Layer.succeed(WalletService, {\n accounts: Effect.succeed(accountsStreamFromProvider(provider)),\n\n chainId: Effect.succeed(chainIdStreamFromProvider(provider)),\n\n currentAccount: Effect.gen(function* () {\n const accounts = yield* Effect.tryPromise({\n catch: (error) =>\n new AccountNotConnectedError({\n message: error instanceof Error ? error.message : \"Failed to get accounts\",\n }),\n try: async () => {\n const result = await provider.request({\n method: \"eth_accounts\",\n });\n return result as Address[];\n },\n });\n\n if (accounts.length === 0) {\n return yield* Effect.fail(\n new AccountNotConnectedError({\n message: \"No wallet account connected\",\n })\n );\n }\n\n return accounts[0];\n }),\n\n currentChainId: Effect.gen(function* () {\n const chainIdHex = yield* Effect.tryPromise({\n catch: (error) =>\n new AccountNotConnectedError({\n message: error instanceof Error ? error.message : \"Failed to get chain ID\",\n }),\n try: async () => {\n const result = await provider.request({\n method: \"eth_chainId\",\n });\n return result as string;\n },\n });\n\n return Option.getOrElse(parseHexInt(chainIdHex), () => UNKNOWN_CHAIN_ID);\n }),\n\n signMessage: (params: SignMessageParams) => signMessage(provider, params),\n\n signTransaction: (params: SignTransactionParams) => signTransaction(provider, params),\n\n signTypedData: <\n const typedData extends TypedData | Record<string, unknown>,\n primaryType extends keyof typedData | \"EIP712Domain\",\n >(\n params: SignTypedDataParams<typedData, primaryType>\n ) => signTypedData(provider, params),\n });\n}\n\nexport const WalletServiceFromProviderRefLive = Layer.effect(\n WalletService,\n Effect.gen(function* () {\n const providerRef = yield* WalletProviderRef;\n\n const getProviderOrFail = Effect.gen(function* () {\n const current = yield* providerRef.get;\n if (Option.isNone(current)) {\n return yield* Effect.fail(\n new AccountNotConnectedError({\n message: \"No wallet provider set\",\n })\n );\n }\n return current.value;\n });\n\n const accountsStream = providerRef.ref.changes.pipe(\n Stream.flatMap(\n (current) =>\n Option.isNone(current)\n ? Stream.succeed([] as Address[])\n : accountsStreamFromProvider(current.value),\n { switch: true }\n )\n );\n\n const chainIdStream = providerRef.ref.changes.pipe(\n Stream.flatMap(\n (current) =>\n Option.isNone(current)\n ? Stream.succeed(UNKNOWN_CHAIN_ID)\n : chainIdStreamFromProvider(current.value),\n { switch: true }\n )\n );\n\n return WalletService.of({\n accounts: Effect.succeed(accountsStream),\n chainId: Effect.succeed(chainIdStream),\n\n currentAccount: Effect.gen(function* () {\n const provider = yield* getProviderOrFail;\n const accounts = yield* Effect.tryPromise({\n catch: (error) =>\n new AccountNotConnectedError({\n message: error instanceof Error ? error.message : \"Failed to get accounts\",\n }),\n try: async () => {\n const result = await provider.request({ method: \"eth_accounts\" });\n return result as Address[];\n },\n });\n\n if (accounts.length === 0) {\n return yield* Effect.fail(\n new AccountNotConnectedError({\n message: \"No wallet account connected\",\n })\n );\n }\n\n return accounts[0];\n }),\n\n currentChainId: Effect.gen(function* () {\n const provider = yield* getProviderOrFail;\n const chainIdHex = yield* Effect.tryPromise({\n catch: (error) =>\n new AccountNotConnectedError({\n message: error instanceof Error ? error.message : \"Failed to get chain ID\",\n }),\n try: async () => {\n const result = await provider.request({ method: \"eth_chainId\" });\n return result as string;\n },\n });\n\n return Option.getOrElse(parseHexInt(chainIdHex), () => UNKNOWN_CHAIN_ID);\n }),\n\n signMessage: (params) =>\n getProviderOrFail.pipe(Effect.flatMap((provider) => signMessage(provider, params))),\n\n signTransaction: (params) =>\n getProviderOrFail.pipe(Effect.flatMap((provider) => signTransaction(provider, params))),\n\n signTypedData: <\n const typedData extends TypedData | Record<string, unknown>,\n primaryType extends keyof typedData | \"EIP712Domain\",\n >(\n params: SignTypedDataParams<typedData, primaryType>\n ) => getProviderOrFail.pipe(Effect.flatMap((provider) => signTypedData(provider, params))),\n });\n })\n);\n\n/**\n * Default live layer that requires a WalletProvider to be provided separately\n */\nexport const WalletServiceLive = Layer.effect(\n WalletService,\n Effect.sync(() => {\n // This is a placeholder that will be replaced by makeWalletServiceLive\n // when a provider is available\n throw new Error(\"WalletServiceLive requires a provider. Use makeWalletServiceLive instead.\");\n })\n);\n"]}
|
|
1
|
+
{"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/wallet/service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEhE,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAUtD,OAAO,EACL,wBAAwB,EACxB,WAAW,EACX,eAAe,EACf,aAAa,EACb,iBAAiB,GAClB,MAAM,uBAAuB,CAAC;AAE/B,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC;AAElC,MAAM,0BAA0B,GAAG,CAAC,QAAwB,EAAE,EAAE,CAC9D,MAAM,CAAC,KAAK,CAAmB,CAAC,IAAI,EAAE,EAAE;IACtC,QAAQ;SACL,OAAO,CAAC,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC;SACnC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE;QACf,MAAM,QAAQ,GAAI,MAAoB,IAAI,EAAE,CAAC;QAC7C,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IACxB,CAAC,CAAC;SACD,KAAK,CAAC,GAAG,EAAE;QACV,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;IAEL,MAAM,qBAAqB,GAAG,CAAC,GAAG,IAAe,EAAE,EAAE;QACnD,MAAM,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAc,CAAC;QACtC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IACxB,CAAC,CAAC;IAEF,IAAI,IAAI,IAAI,QAAQ,IAAI,OAAO,QAAQ,CAAC,EAAE,KAAK,UAAU,EAAE,CAAC;QAExD,QAGD,CAAC,EAAE,CAAC,iBAAiB,EAAE,qBAAqB,CAAC,CAAC;IACjD,CAAC;IAED,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE;QACtB,IAAI,gBAAgB,IAAI,QAAQ,IAAI,OAAO,QAAQ,CAAC,cAAc,KAAK,UAAU,EAAE,CAAC;YAEhF,QAGD,CAAC,cAAc,CAAC,iBAAiB,EAAE,qBAAqB,CAAC,CAAC;QAC7D,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEL,MAAM,yBAAyB,GAAG,CAAC,QAAwB,EAAE,EAAE,CAC7D,MAAM,CAAC,KAAK,CAAgB,CAAC,IAAI,EAAE,EAAE;IACnC,QAAQ;SACL,OAAO,CAAC,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC;SAClC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE;QACf,MAAM,UAAU,GAAG,MAAgB,CAAC;QACpC,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,WAAW,CAAC,UAAU,CAAC,EAAE,GAAG,EAAE,CAAC,gBAAgB,CAAC,CAAC;QACjF,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACtB,CAAC,CAAC;SACD,KAAK,CAAC,GAAG,EAAE;QACV,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC;IAChC,CAAC,CAAC,CAAC;IAEL,MAAM,kBAAkB,GAAG,CAAC,GAAG,IAAe,EAAE,EAAE;QAChD,MAAM,UAAU,GAAG,IAAI,CAAC,CAAC,CAAW,CAAC;QACrC,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,WAAW,CAAC,UAAU,CAAC,EAAE,GAAG,EAAE,CAAC,gBAAgB,CAAC,CAAC;QACjF,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACtB,CAAC,CAAC;IAEF,IAAI,IAAI,IAAI,QAAQ,IAAI,OAAO,QAAQ,CAAC,EAAE,KAAK,UAAU,EAAE,CAAC;QAExD,QAGD,CAAC,EAAE,CAAC,cAAc,EAAE,kBAAkB,CAAC,CAAC;IAC3C,CAAC;IAED,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE;QACtB,IAAI,gBAAgB,IAAI,QAAQ,IAAI,OAAO,QAAQ,CAAC,cAAc,KAAK,UAAU,EAAE,CAAC;YAEhF,QAGD,CAAC,cAAc,CAAC,cAAc,EAAE,kBAAkB,CAAC,CAAC;QACvD,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAwBL,MAAM,OAAO,aAAc,SAAQ,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,EAGhE;CAAG;AAKN,MAAM,UAAU,qBAAqB,CAAC,QAAwB;IAC5D,OAAO,KAAK,CAAC,OAAO,CAAC,aAAa,EAAE;QAClC,QAAQ,EAAE,MAAM,CAAC,OAAO,CAAC,0BAA0B,CAAC,QAAQ,CAAC,CAAC;QAE9D,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,yBAAyB,CAAC,QAAQ,CAAC,CAAC;QAE5D,cAAc,EAAE,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;YAClC,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC;gBACxC,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CACf,IAAI,wBAAwB,CAAC;oBAC3B,OAAO,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,wBAAwB;iBAC3E,CAAC;gBACJ,GAAG,EAAE,KAAK,IAAI,EAAE;oBACd,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC;wBACpC,MAAM,EAAE,cAAc;qBACvB,CAAC,CAAC;oBACH,OAAO,MAAmB,CAAC;gBAC7B,CAAC;aACF,CAAC,CAAC;YAEH,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC1B,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CACvB,IAAI,wBAAwB,CAAC;oBAC3B,OAAO,EAAE,6BAA6B;iBACvC,CAAC,CACH,CAAC;YACJ,CAAC;YAED,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAC;QACrB,CAAC,CAAC;QAEF,cAAc,EAAE,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;YAClC,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC;gBAC1C,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CACf,IAAI,wBAAwB,CAAC;oBAC3B,OAAO,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,wBAAwB;iBAC3E,CAAC;gBACJ,GAAG,EAAE,KAAK,IAAI,EAAE;oBACd,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC;wBACpC,MAAM,EAAE,aAAa;qBACtB,CAAC,CAAC;oBACH,OAAO,MAAgB,CAAC;gBAC1B,CAAC;aACF,CAAC,CAAC;YAEH,OAAO,MAAM,CAAC,SAAS,CAAC,WAAW,CAAC,UAAU,CAAC,EAAE,GAAG,EAAE,CAAC,gBAAgB,CAAC,CAAC;QAC3E,CAAC,CAAC;QAEF,WAAW,EAAE,CAAC,MAAyB,EAAE,EAAE,CAAC,WAAW,CAAC,QAAQ,EAAE,MAAM,CAAC;QAEzE,eAAe,EAAE,CAAC,MAA6B,EAAE,EAAE,CAAC,eAAe,CAAC,QAAQ,EAAE,MAAM,CAAC;QAErF,aAAa,EAAE,CAIb,MAAmD,EACnD,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,MAAM,CAAC;KACrC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,MAAM,gCAAgC,GAAG,KAAK,CAAC,MAAM,CAC1D,aAAa,EACb,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,WAAW,GAAG,KAAK,CAAC,CAAC,iBAAiB,CAAC;IAE7C,MAAM,iBAAiB,GAAG,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;QAC5C,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC;QACvC,IAAI,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;YAC3B,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CACvB,IAAI,wBAAwB,CAAC;gBAC3B,OAAO,EAAE,wBAAwB;aAClC,CAAC,CACH,CAAC;QACJ,CAAC;QACD,OAAO,OAAO,CAAC,KAAK,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,MAAM,cAAc,GAAG,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CACjD,MAAM,CAAC,OAAO,CACZ,CAAC,OAAO,EAAE,EAAE,CACV,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC;QACpB,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,EAAe,CAAC;QACjC,CAAC,CAAC,0BAA0B,CAAC,OAAO,CAAC,KAAK,CAAC,EAC/C,EAAE,MAAM,EAAE,IAAI,EAAE,CACjB,CACF,CAAC;IAEF,MAAM,aAAa,GAAG,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAChD,MAAM,CAAC,OAAO,CACZ,CAAC,OAAO,EAAE,EAAE,CACV,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC;QACpB,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,gBAAgB,CAAC;QAClC,CAAC,CAAC,yBAAyB,CAAC,OAAO,CAAC,KAAK,CAAC,EAC9C,EAAE,MAAM,EAAE,IAAI,EAAE,CACjB,CACF,CAAC;IAEF,OAAO,aAAa,CAAC,EAAE,CAAC;QACtB,QAAQ,EAAE,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC;QACxC,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC;QAEtC,cAAc,EAAE,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;YAClC,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,iBAAiB,CAAC;YAC1C,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC;gBACxC,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CACf,IAAI,wBAAwB,CAAC;oBAC3B,OAAO,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,wBAAwB;iBAC3E,CAAC;gBACJ,GAAG,EAAE,KAAK,IAAI,EAAE;oBACd,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC,CAAC;oBAClE,OAAO,MAAmB,CAAC;gBAC7B,CAAC;aACF,CAAC,CAAC;YAEH,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC1B,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CACvB,IAAI,wBAAwB,CAAC;oBAC3B,OAAO,EAAE,6BAA6B;iBACvC,CAAC,CACH,CAAC;YACJ,CAAC;YAED,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAC;QACrB,CAAC,CAAC;QAEF,cAAc,EAAE,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;YAClC,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,iBAAiB,CAAC;YAC1C,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC;gBAC1C,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CACf,IAAI,wBAAwB,CAAC;oBAC3B,OAAO,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,wBAAwB;iBAC3E,CAAC;gBACJ,GAAG,EAAE,KAAK,IAAI,EAAE;oBACd,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC,CAAC;oBACjE,OAAO,MAAgB,CAAC;gBAC1B,CAAC;aACF,CAAC,CAAC;YAEH,OAAO,MAAM,CAAC,SAAS,CAAC,WAAW,CAAC,UAAU,CAAC,EAAE,GAAG,EAAE,CAAC,gBAAgB,CAAC,CAAC;QAC3E,CAAC,CAAC;QAEF,WAAW,EAAE,CAAC,MAAM,EAAE,EAAE,CACtB,iBAAiB,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,WAAW,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC;QAErF,eAAe,EAAE,CAAC,MAAM,EAAE,EAAE,CAC1B,iBAAiB,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,eAAe,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC;QAEzF,aAAa,EAAE,CAIb,MAAmD,EACnD,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC;KAC3F,CAAC,CAAC;AACL,CAAC,CAAC,CACH,CAAC;AAKF,MAAM,CAAC,MAAM,iBAAiB,GAAG,KAAK,CAAC,MAAM,CAC3C,aAAa,EACb,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE;IAGf,MAAM,IAAI,KAAK,CAAC,2EAA2E,CAAC,CAAC;AAC/F,CAAC,CAAC,CACH,CAAC","sourcesContent":["import { Context, Effect, Layer, Option, Stream } from \"effect\";\nimport type { Address, Hex, TypedData } from \"viem\";\nimport { parseHexInt } from \"@/src/internal/index.js\";\nimport type {\n SignMessageError,\n SignMessageParams,\n SignTransactionParams,\n SignTxError,\n SignTypedDataError,\n SignTypedDataParams,\n WalletProvider,\n} from \"@/src/wallet/index.js\";\nimport {\n AccountNotConnectedError,\n signMessage,\n signTransaction,\n signTypedData,\n WalletProviderRef,\n} from \"@/src/wallet/index.js\";\n\nexport const UNKNOWN_CHAIN_ID = 0;\n\nconst accountsStreamFromProvider = (provider: WalletProvider) =>\n Stream.async<Address[], never>((emit) => {\n provider\n .request({ method: \"eth_accounts\" })\n .then((result) => {\n const accounts = (result as Address[]) || [];\n emit.single(accounts);\n })\n .catch(() => {\n emit.single([]);\n });\n\n const handleAccountsChanged = (...args: unknown[]) => {\n const accounts = args[0] as Address[];\n emit.single(accounts);\n };\n\n if (\"on\" in provider && typeof provider.on === \"function\") {\n (\n provider as {\n on: (event: string, handler: (...args: unknown[]) => void) => void;\n }\n ).on(\"accountsChanged\", handleAccountsChanged);\n }\n\n return Effect.sync(() => {\n if (\"removeListener\" in provider && typeof provider.removeListener === \"function\") {\n (\n provider as {\n removeListener: (event: string, handler: (...args: unknown[]) => void) => void;\n }\n ).removeListener(\"accountsChanged\", handleAccountsChanged);\n }\n });\n });\n\nconst chainIdStreamFromProvider = (provider: WalletProvider) =>\n Stream.async<number, never>((emit) => {\n provider\n .request({ method: \"eth_chainId\" })\n .then((result) => {\n const chainIdHex = result as string;\n const parsed = Option.getOrElse(parseHexInt(chainIdHex), () => UNKNOWN_CHAIN_ID);\n emit.single(parsed);\n })\n .catch(() => {\n emit.single(UNKNOWN_CHAIN_ID);\n });\n\n const handleChainChanged = (...args: unknown[]) => {\n const chainIdHex = args[0] as string;\n const parsed = Option.getOrElse(parseHexInt(chainIdHex), () => UNKNOWN_CHAIN_ID);\n emit.single(parsed);\n };\n\n if (\"on\" in provider && typeof provider.on === \"function\") {\n (\n provider as {\n on: (event: string, handler: (...args: unknown[]) => void) => void;\n }\n ).on(\"chainChanged\", handleChainChanged);\n }\n\n return Effect.sync(() => {\n if (\"removeListener\" in provider && typeof provider.removeListener === \"function\") {\n (\n provider as {\n removeListener: (event: string, handler: (...args: unknown[]) => void) => void;\n }\n ).removeListener(\"chainChanged\", handleChainChanged);\n }\n });\n });\n\n/**\n * Service for wallet account management and signing operations\n */\nexport type WalletServiceShape = {\n readonly accounts: Effect.Effect<Stream.Stream<Address[], never>, never>;\n readonly currentAccount: Effect.Effect<Address, AccountNotConnectedError>;\n readonly chainId: Effect.Effect<Stream.Stream<number, never>, never>;\n readonly currentChainId: Effect.Effect<number, AccountNotConnectedError>;\n readonly signMessage: (\n params: SignMessageParams\n ) => Effect.Effect<Hex, SignMessageError | AccountNotConnectedError>;\n readonly signTypedData: <\n const typedData extends TypedData | Record<string, unknown>,\n primaryType extends keyof typedData | \"EIP712Domain\",\n >(\n params: SignTypedDataParams<typedData, primaryType>\n ) => Effect.Effect<Hex, SignTypedDataError | AccountNotConnectedError>;\n readonly signTransaction: (\n params: SignTransactionParams\n ) => Effect.Effect<Hex, SignTxError | AccountNotConnectedError>;\n};\n\nexport class WalletService extends Context.Tag(\"ew3/WalletService\")<\n WalletService,\n WalletServiceShape\n>() {}\n\n/**\n * Create a live implementation of WalletService\n */\nexport function makeWalletServiceLive(provider: WalletProvider): Layer.Layer<WalletService> {\n return Layer.succeed(WalletService, {\n accounts: Effect.succeed(accountsStreamFromProvider(provider)),\n\n chainId: Effect.succeed(chainIdStreamFromProvider(provider)),\n\n currentAccount: Effect.gen(function* () {\n const accounts = yield* Effect.tryPromise({\n catch: (error) =>\n new AccountNotConnectedError({\n message: error instanceof Error ? error.message : \"Failed to get accounts\",\n }),\n try: async () => {\n const result = await provider.request({\n method: \"eth_accounts\",\n });\n return result as Address[];\n },\n });\n\n if (accounts.length === 0) {\n return yield* Effect.fail(\n new AccountNotConnectedError({\n message: \"No wallet account connected\",\n })\n );\n }\n\n return accounts[0];\n }),\n\n currentChainId: Effect.gen(function* () {\n const chainIdHex = yield* Effect.tryPromise({\n catch: (error) =>\n new AccountNotConnectedError({\n message: error instanceof Error ? error.message : \"Failed to get chain ID\",\n }),\n try: async () => {\n const result = await provider.request({\n method: \"eth_chainId\",\n });\n return result as string;\n },\n });\n\n return Option.getOrElse(parseHexInt(chainIdHex), () => UNKNOWN_CHAIN_ID);\n }),\n\n signMessage: (params: SignMessageParams) => signMessage(provider, params),\n\n signTransaction: (params: SignTransactionParams) => signTransaction(provider, params),\n\n signTypedData: <\n const typedData extends TypedData | Record<string, unknown>,\n primaryType extends keyof typedData | \"EIP712Domain\",\n >(\n params: SignTypedDataParams<typedData, primaryType>\n ) => signTypedData(provider, params),\n });\n}\n\nexport const WalletServiceFromProviderRefLive = Layer.effect(\n WalletService,\n Effect.gen(function* () {\n const providerRef = yield* WalletProviderRef;\n\n const getProviderOrFail = Effect.gen(function* () {\n const current = yield* providerRef.get;\n if (Option.isNone(current)) {\n return yield* Effect.fail(\n new AccountNotConnectedError({\n message: \"No wallet provider set\",\n })\n );\n }\n return current.value;\n });\n\n const accountsStream = providerRef.ref.changes.pipe(\n Stream.flatMap(\n (current) =>\n Option.isNone(current)\n ? Stream.succeed([] as Address[])\n : accountsStreamFromProvider(current.value),\n { switch: true }\n )\n );\n\n const chainIdStream = providerRef.ref.changes.pipe(\n Stream.flatMap(\n (current) =>\n Option.isNone(current)\n ? Stream.succeed(UNKNOWN_CHAIN_ID)\n : chainIdStreamFromProvider(current.value),\n { switch: true }\n )\n );\n\n return WalletService.of({\n accounts: Effect.succeed(accountsStream),\n chainId: Effect.succeed(chainIdStream),\n\n currentAccount: Effect.gen(function* () {\n const provider = yield* getProviderOrFail;\n const accounts = yield* Effect.tryPromise({\n catch: (error) =>\n new AccountNotConnectedError({\n message: error instanceof Error ? error.message : \"Failed to get accounts\",\n }),\n try: async () => {\n const result = await provider.request({ method: \"eth_accounts\" });\n return result as Address[];\n },\n });\n\n if (accounts.length === 0) {\n return yield* Effect.fail(\n new AccountNotConnectedError({\n message: \"No wallet account connected\",\n })\n );\n }\n\n return accounts[0];\n }),\n\n currentChainId: Effect.gen(function* () {\n const provider = yield* getProviderOrFail;\n const chainIdHex = yield* Effect.tryPromise({\n catch: (error) =>\n new AccountNotConnectedError({\n message: error instanceof Error ? error.message : \"Failed to get chain ID\",\n }),\n try: async () => {\n const result = await provider.request({ method: \"eth_chainId\" });\n return result as string;\n },\n });\n\n return Option.getOrElse(parseHexInt(chainIdHex), () => UNKNOWN_CHAIN_ID);\n }),\n\n signMessage: (params) =>\n getProviderOrFail.pipe(Effect.flatMap((provider) => signMessage(provider, params))),\n\n signTransaction: (params) =>\n getProviderOrFail.pipe(Effect.flatMap((provider) => signTransaction(provider, params))),\n\n signTypedData: <\n const typedData extends TypedData | Record<string, unknown>,\n primaryType extends keyof typedData | \"EIP712Domain\",\n >(\n params: SignTypedDataParams<typedData, primaryType>\n ) => getProviderOrFail.pipe(Effect.flatMap((provider) => signTypedData(provider, params))),\n });\n })\n);\n\n/**\n * Default live layer that requires a WalletProvider to be provided separately\n */\nexport const WalletServiceLive = Layer.effect(\n WalletService,\n Effect.sync(() => {\n // This is a placeholder that will be replaced by makeWalletServiceLive\n // when a provider is available\n throw new Error(\"WalletServiceLive requires a provider. Use makeWalletServiceLive instead.\");\n })\n);\n"]}
|
package/package.json
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
"sideEffects": false,
|
|
7
7
|
"type": "module",
|
|
8
8
|
"types": "./dist/index.d.ts",
|
|
9
|
-
"version": "1.0.0-beta.
|
|
9
|
+
"version": "1.0.0-beta.6",
|
|
10
10
|
"scripts": {
|
|
11
11
|
"build": "just build",
|
|
12
12
|
"prepack": "bun install --frozen-lockfile && just build"
|
|
@@ -29,7 +29,6 @@
|
|
|
29
29
|
"@effect/platform": "catalog:effect",
|
|
30
30
|
"@effect/vitest": "catalog:dev",
|
|
31
31
|
"@sablier/devkit": "catalog:dev",
|
|
32
|
-
"@safe-global/safe-apps-sdk": "9.1.0",
|
|
33
32
|
"@types/node": "catalog:dev",
|
|
34
33
|
"@types/react": "catalog:dev",
|
|
35
34
|
"@types/react-dom": "catalog:dev",
|
|
@@ -76,7 +75,6 @@
|
|
|
76
75
|
],
|
|
77
76
|
"peerDependencies": {
|
|
78
77
|
"@effect/platform": "catalog:peers",
|
|
79
|
-
"@safe-global/safe-apps-sdk": "catalog:peers",
|
|
80
78
|
"@wagmi/core": "catalog:peers",
|
|
81
79
|
"effect": "catalog:peers",
|
|
82
80
|
"react": "catalog:peers",
|
|
@@ -84,9 +82,6 @@
|
|
|
84
82
|
"viem": "catalog:peers"
|
|
85
83
|
},
|
|
86
84
|
"peerDependenciesMeta": {
|
|
87
|
-
"@safe-global/safe-apps-sdk": {
|
|
88
|
-
"optional": true
|
|
89
|
-
},
|
|
90
85
|
"@wagmi/core": {
|
|
91
86
|
"optional": true
|
|
92
87
|
},
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
export declare const DEFAULT_SAFE_APP_ORIGINS: readonly ["https://app.safe.global", "https://gnosis-safe.io", "https://safe.global", "https://safe.berachain.com", "https://safe.chiliz.com", "https://safe.lightlink.io", "https://safe.optimism.io"];
|
|
2
|
-
export declare function setSafeAppOrigins(origins: readonly string[]): void;
|
|
3
|
-
export declare function extendSafeAppOrigins(origins: readonly string[]): void;
|
|
4
|
-
export declare function getSafeAppOrigins(): readonly string[];
|
|
5
|
-
export declare function subscribeSafeAppOrigins(listener: () => void): () => void;
|
|
6
|
-
export declare function isValidSafeAppOrigin(): boolean;
|
|
7
|
-
export declare function isHostEmbedded(): boolean;
|
|
8
|
-
//# sourceMappingURL=safe-app-origins.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"safe-app-origins.d.ts","sourceRoot":"","sources":["../../src/react-hooks/safe-app-origins.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,wBAAwB,yMAU3B,CAAC;AASX,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,QAE3D;AAGD,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,QAE9D;AAGD,wBAAgB,iBAAiB,IAAI,SAAS,MAAM,EAAE,CAErD;AAGD,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI,CAKxE;AAGD,wBAAgB,oBAAoB,IAAI,OAAO,CAM9C;AAGD,wBAAgB,cAAc,IAAI,OAAO,CAExC"}
|
|
@@ -1,124 +0,0 @@
|
|
|
1
|
-
"use client";
|
|
2
|
-
export const DEFAULT_SAFE_APP_ORIGINS = [
|
|
3
|
-
"https://app.safe.global",
|
|
4
|
-
"https://gnosis-safe.io",
|
|
5
|
-
"https://safe.global",
|
|
6
|
-
"https://safe.berachain.com",
|
|
7
|
-
"https://safe.chiliz.com",
|
|
8
|
-
"https://safe.lightlink.io",
|
|
9
|
-
"https://safe.optimism.io",
|
|
10
|
-
];
|
|
11
|
-
const ORIGIN_PROTOCOL_PATTERN = /^[a-z]+:\/\//i;
|
|
12
|
-
let safeAppOrigins = normalizeOrigins(DEFAULT_SAFE_APP_ORIGINS);
|
|
13
|
-
let safeAppOriginSet = new Set(safeAppOrigins);
|
|
14
|
-
const safeAppOriginListeners = new Set();
|
|
15
|
-
let safeAppOriginsConfigured = false;
|
|
16
|
-
export function setSafeAppOrigins(origins) {
|
|
17
|
-
configureSafeAppOrigins(normalizeOrigins(origins));
|
|
18
|
-
}
|
|
19
|
-
export function extendSafeAppOrigins(origins) {
|
|
20
|
-
configureSafeAppOrigins(normalizeOrigins([...safeAppOrigins, ...origins]));
|
|
21
|
-
}
|
|
22
|
-
export function getSafeAppOrigins() {
|
|
23
|
-
return [...safeAppOrigins];
|
|
24
|
-
}
|
|
25
|
-
export function subscribeSafeAppOrigins(listener) {
|
|
26
|
-
safeAppOriginListeners.add(listener);
|
|
27
|
-
return () => {
|
|
28
|
-
safeAppOriginListeners.delete(listener);
|
|
29
|
-
};
|
|
30
|
-
}
|
|
31
|
-
export function isValidSafeAppOrigin() {
|
|
32
|
-
const origin = getAncestorOrigin();
|
|
33
|
-
if (!origin) {
|
|
34
|
-
return false;
|
|
35
|
-
}
|
|
36
|
-
return safeAppOriginSet.has(origin);
|
|
37
|
-
}
|
|
38
|
-
export function isHostEmbedded() {
|
|
39
|
-
return typeof window !== "undefined" && window.parent !== window;
|
|
40
|
-
}
|
|
41
|
-
function getAncestorOrigin() {
|
|
42
|
-
if (typeof window === "undefined") {
|
|
43
|
-
return null;
|
|
44
|
-
}
|
|
45
|
-
try {
|
|
46
|
-
return window.parent.location.origin;
|
|
47
|
-
}
|
|
48
|
-
catch {
|
|
49
|
-
if (window.location.ancestorOrigins?.length) {
|
|
50
|
-
return window.location.ancestorOrigins[0];
|
|
51
|
-
}
|
|
52
|
-
if (document.referrer) {
|
|
53
|
-
try {
|
|
54
|
-
return new URL(document.referrer).origin;
|
|
55
|
-
}
|
|
56
|
-
catch {
|
|
57
|
-
return null;
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
return null;
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
function updateSafeAppOrigins(nextOrigins) {
|
|
64
|
-
if (areSameOrigins(safeAppOrigins, nextOrigins)) {
|
|
65
|
-
return;
|
|
66
|
-
}
|
|
67
|
-
safeAppOrigins = nextOrigins;
|
|
68
|
-
safeAppOriginSet = new Set(safeAppOrigins);
|
|
69
|
-
notifySafeAppOriginListeners();
|
|
70
|
-
}
|
|
71
|
-
function configureSafeAppOrigins(nextOrigins) {
|
|
72
|
-
if (safeAppOriginsConfigured) {
|
|
73
|
-
throw new Error("Safe App origins already configured.");
|
|
74
|
-
}
|
|
75
|
-
safeAppOriginsConfigured = true;
|
|
76
|
-
updateSafeAppOrigins(nextOrigins);
|
|
77
|
-
}
|
|
78
|
-
function notifySafeAppOriginListeners() {
|
|
79
|
-
for (const listener of safeAppOriginListeners) {
|
|
80
|
-
listener();
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
function normalizeOrigins(origins) {
|
|
84
|
-
const normalized = [];
|
|
85
|
-
const seen = new Set();
|
|
86
|
-
for (const origin of origins) {
|
|
87
|
-
const normalizedOrigin = normalizeOrigin(origin);
|
|
88
|
-
if (!normalizedOrigin || seen.has(normalizedOrigin)) {
|
|
89
|
-
continue;
|
|
90
|
-
}
|
|
91
|
-
seen.add(normalizedOrigin);
|
|
92
|
-
normalized.push(normalizedOrigin);
|
|
93
|
-
}
|
|
94
|
-
return normalized;
|
|
95
|
-
}
|
|
96
|
-
function normalizeOrigin(origin) {
|
|
97
|
-
const trimmed = origin.trim();
|
|
98
|
-
if (!trimmed) {
|
|
99
|
-
return null;
|
|
100
|
-
}
|
|
101
|
-
const candidate = ORIGIN_PROTOCOL_PATTERN.test(trimmed) ? trimmed : `https://${trimmed}`;
|
|
102
|
-
try {
|
|
103
|
-
const url = new URL(candidate);
|
|
104
|
-
if (url.protocol !== "https:" && url.protocol !== "http:") {
|
|
105
|
-
return null;
|
|
106
|
-
}
|
|
107
|
-
return url.origin;
|
|
108
|
-
}
|
|
109
|
-
catch {
|
|
110
|
-
return null;
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
function areSameOrigins(left, right) {
|
|
114
|
-
if (left.length !== right.length) {
|
|
115
|
-
return false;
|
|
116
|
-
}
|
|
117
|
-
for (let index = 0; index < left.length; index += 1) {
|
|
118
|
-
if (left[index] !== right[index]) {
|
|
119
|
-
return false;
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
return true;
|
|
123
|
-
}
|
|
124
|
-
//# sourceMappingURL=safe-app-origins.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"safe-app-origins.js","sourceRoot":"","sources":["../../src/react-hooks/safe-app-origins.ts"],"names":[],"mappings":"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","sourcesContent":["\"use client\";\n\n/**\n * Known Safe App domains for iframe origin validation.\n * Includes the main Safe App and chain-specific Safe deployments.\n */\nexport const DEFAULT_SAFE_APP_ORIGINS = [\n // Main Safe domains\n \"https://app.safe.global\",\n \"https://gnosis-safe.io\",\n \"https://safe.global\",\n // Chain-specific Safe deployments\n \"https://safe.berachain.com\",\n \"https://safe.chiliz.com\",\n \"https://safe.lightlink.io\",\n \"https://safe.optimism.io\",\n] as const;\n\nconst ORIGIN_PROTOCOL_PATTERN = /^[a-z]+:\\/\\//i;\nlet safeAppOrigins = normalizeOrigins(DEFAULT_SAFE_APP_ORIGINS);\nlet safeAppOriginSet = new Set(safeAppOrigins);\nconst safeAppOriginListeners = new Set<() => void>();\nlet safeAppOriginsConfigured = false;\n\n/** Replace the Safe App origins list (one-time configuration). */\nexport function setSafeAppOrigins(origins: readonly string[]) {\n configureSafeAppOrigins(normalizeOrigins(origins));\n}\n\n/** Extend the Safe App origins list (one-time configuration). */\nexport function extendSafeAppOrigins(origins: readonly string[]) {\n configureSafeAppOrigins(normalizeOrigins([...safeAppOrigins, ...origins]));\n}\n\n/** Read the currently configured Safe App origins list. */\nexport function getSafeAppOrigins(): readonly string[] {\n return [...safeAppOrigins];\n}\n\n/** Subscribe to Safe App origin changes. */\nexport function subscribeSafeAppOrigins(listener: () => void): () => void {\n safeAppOriginListeners.add(listener);\n return () => {\n safeAppOriginListeners.delete(listener);\n };\n}\n\n/** Check if the parent browsing context origin is a Safe App domain. */\nexport function isValidSafeAppOrigin(): boolean {\n const origin = getAncestorOrigin();\n if (!origin) {\n return false;\n }\n return safeAppOriginSet.has(origin);\n}\n\n/** Check whether the app is running inside an iframe. */\nexport function isHostEmbedded(): boolean {\n return typeof window !== \"undefined\" && window.parent !== window;\n}\n\n/**\n * Get the origin of the parent browsing context.\n * Returns null if it cannot be determined due to cross-origin restrictions.\n */\nfunction getAncestorOrigin(): string | null {\n if (typeof window === \"undefined\") {\n return null;\n }\n\n try {\n return window.parent.location.origin;\n } catch {\n if (window.location.ancestorOrigins?.length) {\n return window.location.ancestorOrigins[0];\n }\n\n if (document.referrer) {\n try {\n return new URL(document.referrer).origin;\n } catch {\n return null;\n }\n }\n\n return null;\n }\n}\n\nfunction updateSafeAppOrigins(nextOrigins: string[]) {\n if (areSameOrigins(safeAppOrigins, nextOrigins)) {\n return;\n }\n\n safeAppOrigins = nextOrigins;\n safeAppOriginSet = new Set(safeAppOrigins);\n notifySafeAppOriginListeners();\n}\n\nfunction configureSafeAppOrigins(nextOrigins: string[]) {\n if (safeAppOriginsConfigured) {\n throw new Error(\"Safe App origins already configured.\");\n }\n\n safeAppOriginsConfigured = true;\n updateSafeAppOrigins(nextOrigins);\n}\n\nfunction notifySafeAppOriginListeners() {\n for (const listener of safeAppOriginListeners) {\n listener();\n }\n}\n\nfunction normalizeOrigins(origins: readonly string[]): string[] {\n const normalized: string[] = [];\n const seen = new Set<string>();\n\n for (const origin of origins) {\n const normalizedOrigin = normalizeOrigin(origin);\n if (!normalizedOrigin || seen.has(normalizedOrigin)) {\n continue;\n }\n seen.add(normalizedOrigin);\n normalized.push(normalizedOrigin);\n }\n\n return normalized;\n}\n\nfunction normalizeOrigin(origin: string): string | null {\n const trimmed = origin.trim();\n if (!trimmed) {\n return null;\n }\n\n const candidate = ORIGIN_PROTOCOL_PATTERN.test(trimmed) ? trimmed : `https://${trimmed}`;\n\n try {\n const url = new URL(candidate);\n if (url.protocol !== \"https:\" && url.protocol !== \"http:\") {\n return null;\n }\n return url.origin;\n } catch {\n return null;\n }\n}\n\nfunction areSameOrigins(left: readonly string[], right: readonly string[]): boolean {\n if (left.length !== right.length) {\n return false;\n }\n\n for (let index = 0; index < left.length; index += 1) {\n if (left[index] !== right[index]) {\n return false;\n }\n }\n\n return true;\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"use-is-host-safe-app.d.ts","sourceRoot":"","sources":["../../src/react-hooks/use-is-host-safe-app.ts"],"names":[],"mappings":"AAsBA,wBAAgB,gBAAgB,IAAI,OAAO,CAS1C"}
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
"use client";
|
|
2
|
-
import { useSyncExternalStore } from "react";
|
|
3
|
-
import { isHostEmbedded, isValidSafeAppOrigin, subscribeSafeAppOrigins, } from "./safe-app-origins.js";
|
|
4
|
-
import { useIsSafeAppContext } from "./use-is-safe-app-context.js";
|
|
5
|
-
export function useIsHostSafeApp() {
|
|
6
|
-
const isSafeContext = useIsSafeAppContext();
|
|
7
|
-
const isSafeHost = useSyncExternalStore(subscribeSafeAppOrigins, getSafeHostSnapshot, getServerSnapshot);
|
|
8
|
-
return isSafeContext || isSafeHost;
|
|
9
|
-
}
|
|
10
|
-
function getSafeHostSnapshot() {
|
|
11
|
-
return isHostEmbedded() && isValidSafeAppOrigin();
|
|
12
|
-
}
|
|
13
|
-
function getServerSnapshot() {
|
|
14
|
-
return false;
|
|
15
|
-
}
|
|
16
|
-
//# sourceMappingURL=use-is-host-safe-app.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"use-is-host-safe-app.js","sourceRoot":"","sources":["../../src/react-hooks/use-is-host-safe-app.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb,OAAO,EAAE,oBAAoB,EAAE,MAAM,OAAO,CAAC;AAC7C,OAAO,EACL,cAAc,EACd,oBAAoB,EACpB,uBAAuB,GACxB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AAcnE,MAAM,UAAU,gBAAgB;IAC9B,MAAM,aAAa,GAAG,mBAAmB,EAAE,CAAC;IAC5C,MAAM,UAAU,GAAG,oBAAoB,CACrC,uBAAuB,EACvB,mBAAmB,EACnB,iBAAiB,CAClB,CAAC;IAEF,OAAO,aAAa,IAAI,UAAU,CAAC;AACrC,CAAC;AAED,SAAS,mBAAmB;IAC1B,OAAO,cAAc,EAAE,IAAI,oBAAoB,EAAE,CAAC;AACpD,CAAC;AAED,SAAS,iBAAiB;IACxB,OAAO,KAAK,CAAC;AACf,CAAC","sourcesContent":["\"use client\";\n\nimport { useSyncExternalStore } from \"react\";\nimport {\n isHostEmbedded,\n isValidSafeAppOrigin,\n subscribeSafeAppOrigins,\n} from \"./safe-app-origins.js\";\nimport { useIsSafeAppContext } from \"./use-is-safe-app-context.js\";\n\n/**\n * Detect if the app is running within a Safe App context.\n *\n * This hook returns `true` when either:\n * - Safe Apps SDK confirms the Safe context (async, most reliable), or\n * - The app is embedded in a Safe App-origin iframe (sync check).\n *\n * Notes:\n * - This answers “is the host Safe App?” and will return true even without a wallet.\n * - For full wallet detection heuristics, use `useIsSafeMultisigWallet`.\n * - For SDK-only checks, use `useIsSafeAppContext`.\n */\nexport function useIsHostSafeApp(): boolean {\n const isSafeContext = useIsSafeAppContext();\n const isSafeHost = useSyncExternalStore(\n subscribeSafeAppOrigins,\n getSafeHostSnapshot,\n getServerSnapshot\n );\n\n return isSafeContext || isSafeHost;\n}\n\nfunction getSafeHostSnapshot(): boolean {\n return isHostEmbedded() && isValidSafeAppOrigin();\n}\n\nfunction getServerSnapshot(): boolean {\n return false;\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"use-is-safe-app-context.d.ts","sourceRoot":"","sources":["../../src/react-hooks/use-is-safe-app-context.ts"],"names":[],"mappings":"AAuCA,wBAAgB,mBAAmB,IAAI,OAAO,CA6C7C"}
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
"use client";
|
|
2
|
-
import { useEffect, useState } from "react";
|
|
3
|
-
const SAFE_SDK_TIMEOUT = 3000;
|
|
4
|
-
export function useIsSafeAppContext() {
|
|
5
|
-
const [isSafe, setIsSafe] = useState(false);
|
|
6
|
-
useEffect(() => {
|
|
7
|
-
if (typeof window === "undefined") {
|
|
8
|
-
return;
|
|
9
|
-
}
|
|
10
|
-
let cancelled = false;
|
|
11
|
-
const timeout = setTimeout(() => {
|
|
12
|
-
if (!cancelled) {
|
|
13
|
-
setIsSafe(false);
|
|
14
|
-
}
|
|
15
|
-
}, SAFE_SDK_TIMEOUT);
|
|
16
|
-
import("@safe-global/safe-apps-sdk")
|
|
17
|
-
.then(({ default: SafeAppsSDK }) => {
|
|
18
|
-
const sdk = new SafeAppsSDK();
|
|
19
|
-
return sdk.safe.getInfo();
|
|
20
|
-
})
|
|
21
|
-
.then(() => {
|
|
22
|
-
if (!cancelled) {
|
|
23
|
-
setIsSafe(true);
|
|
24
|
-
}
|
|
25
|
-
})
|
|
26
|
-
.catch(() => {
|
|
27
|
-
if (!cancelled) {
|
|
28
|
-
setIsSafe(false);
|
|
29
|
-
}
|
|
30
|
-
})
|
|
31
|
-
.finally(() => {
|
|
32
|
-
clearTimeout(timeout);
|
|
33
|
-
});
|
|
34
|
-
return () => {
|
|
35
|
-
cancelled = true;
|
|
36
|
-
clearTimeout(timeout);
|
|
37
|
-
};
|
|
38
|
-
}, []);
|
|
39
|
-
return isSafe;
|
|
40
|
-
}
|
|
41
|
-
//# sourceMappingURL=use-is-safe-app-context.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"use-is-safe-app-context.js","sourceRoot":"","sources":["../../src/react-hooks/use-is-safe-app-context.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAM5C,MAAM,gBAAgB,GAAG,IAAI,CAAC;AA+B9B,MAAM,UAAU,mBAAmB;IACjC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAE5C,SAAS,CAAC,GAAG,EAAE;QAEb,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE,CAAC;YAClC,OAAO;QACT,CAAC;QAED,IAAI,SAAS,GAAG,KAAK,CAAC;QAGtB,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE;YAC9B,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,SAAS,CAAC,KAAK,CAAC,CAAC;YACnB,CAAC;QACH,CAAC,EAAE,gBAAgB,CAAC,CAAC;QAGrB,MAAM,CAAC,4BAA4B,CAAC;aACjC,IAAI,CAAC,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,EAAE,EAAE;YACjC,MAAM,GAAG,GAAG,IAAI,WAAW,EAAE,CAAC;YAC9B,OAAO,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;QAC5B,CAAC,CAAC;aACD,IAAI,CAAC,GAAG,EAAE;YACT,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,SAAS,CAAC,IAAI,CAAC,CAAC;YAClB,CAAC;QACH,CAAC,CAAC;aACD,KAAK,CAAC,GAAG,EAAE;YACV,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,SAAS,CAAC,KAAK,CAAC,CAAC;YACnB,CAAC;QACH,CAAC,CAAC;aACD,OAAO,CAAC,GAAG,EAAE;YACZ,YAAY,CAAC,OAAO,CAAC,CAAC;QACxB,CAAC,CAAC,CAAC;QAEL,OAAO,GAAG,EAAE;YACV,SAAS,GAAG,IAAI,CAAC;YACjB,YAAY,CAAC,OAAO,CAAC,CAAC;QACxB,CAAC,CAAC;IACJ,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,OAAO,MAAM,CAAC;AAChB,CAAC","sourcesContent":["\"use client\";\n\nimport { useEffect, useState } from \"react\";\n\n/**\n * Timeout for Safe SDK detection in milliseconds.\n * Safe Apps SDK uses postMessage which can hang if not in Safe context.\n */\nconst SAFE_SDK_TIMEOUT = 3000;\n\n/**\n * Detect if the app is running in a Safe App context using the Safe Apps SDK.\n *\n * This hook asynchronously checks with the Safe Apps SDK to determine if\n * we're running inside a Safe App iframe. More reliable than iframe origin\n * detection because:\n * - Uses postMessage (works cross-origin)\n * - Gets definitive answer from Safe\n * - Includes timeout to prevent hangs\n *\n * @returns true if running in Safe App context, false otherwise\n *\n * Notes:\n * - This only verifies the Safe Apps SDK context (async).\n * - For a host-based sync check, use `useIsHostSafeApp`.\n * - For a full wallet detection heuristic, use `useIsSafeMultisigWallet`.\n *\n * @example\n * ```tsx\n * function MyComponent() {\n * const isSafeContext = useIsSafeAppContext();\n *\n * if (isSafeContext) {\n * return <p>Running in Safe App</p>;\n * }\n * return <p>Regular browser context</p>;\n * }\n * ```\n */\nexport function useIsSafeAppContext(): boolean {\n const [isSafe, setIsSafe] = useState(false);\n\n useEffect(() => {\n // SSR guard\n if (typeof window === \"undefined\") {\n return;\n }\n\n let cancelled = false;\n\n // Timeout fallback - resolve to false if SDK doesn't respond\n const timeout = setTimeout(() => {\n if (!cancelled) {\n setIsSafe(false);\n }\n }, SAFE_SDK_TIMEOUT);\n\n // Dynamically import SDK to keep it optional\n import(\"@safe-global/safe-apps-sdk\")\n .then(({ default: SafeAppsSDK }) => {\n const sdk = new SafeAppsSDK();\n return sdk.safe.getInfo();\n })\n .then(() => {\n if (!cancelled) {\n setIsSafe(true);\n }\n })\n .catch(() => {\n if (!cancelled) {\n setIsSafe(false);\n }\n })\n .finally(() => {\n clearTimeout(timeout);\n });\n\n return () => {\n cancelled = true;\n clearTimeout(timeout);\n };\n }, []);\n\n return isSafe;\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"use-is-safe-multisig-wallet.d.ts","sourceRoot":"","sources":["../../src/react-hooks/use-is-safe-multisig-wallet.ts"],"names":[],"mappings":"AA0BA,wBAAgB,uBAAuB,IAAI,OAAO,CAuBjD"}
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
"use client";
|
|
2
|
-
import { useSyncExternalStore } from "react";
|
|
3
|
-
import { useAccount } from "wagmi";
|
|
4
|
-
import { isHostEmbedded, isValidSafeAppOrigin, subscribeSafeAppOrigins, } from "./safe-app-origins.js";
|
|
5
|
-
import { useIsSafeAppContext } from "./use-is-safe-app-context.js";
|
|
6
|
-
export function useIsSafeMultisigWallet() {
|
|
7
|
-
const { connector, isConnected } = useAccount();
|
|
8
|
-
const isSafeContext = useIsSafeAppContext();
|
|
9
|
-
const isSafeIframe = useSyncExternalStore(subscribeSafeAppOrigins, getSafeIframeSnapshot, getServerSnapshot);
|
|
10
|
-
if (isSafeContext) {
|
|
11
|
-
return true;
|
|
12
|
-
}
|
|
13
|
-
if (isConnected && connector?.id === "safe") {
|
|
14
|
-
return true;
|
|
15
|
-
}
|
|
16
|
-
return isSafeIframe;
|
|
17
|
-
}
|
|
18
|
-
function getSafeIframeSnapshot() {
|
|
19
|
-
return isHostEmbedded() && isValidSafeAppOrigin();
|
|
20
|
-
}
|
|
21
|
-
function getServerSnapshot() {
|
|
22
|
-
return false;
|
|
23
|
-
}
|
|
24
|
-
//# sourceMappingURL=use-is-safe-multisig-wallet.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"use-is-safe-multisig-wallet.js","sourceRoot":"","sources":["../../src/react-hooks/use-is-safe-multisig-wallet.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb,OAAO,EAAE,oBAAoB,EAAE,MAAM,OAAO,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AACnC,OAAO,EACL,cAAc,EACd,oBAAoB,EACpB,uBAAuB,GACxB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AAiBnE,MAAM,UAAU,uBAAuB;IACrC,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,GAAG,UAAU,EAAE,CAAC;IAChD,MAAM,aAAa,GAAG,mBAAmB,EAAE,CAAC;IAG5C,MAAM,YAAY,GAAG,oBAAoB,CACvC,uBAAuB,EACvB,qBAAqB,EACrB,iBAAiB,CAClB,CAAC;IAGF,IAAI,aAAa,EAAE,CAAC;QAClB,OAAO,IAAI,CAAC;IACd,CAAC;IAGD,IAAI,WAAW,IAAI,SAAS,EAAE,EAAE,KAAK,MAAM,EAAE,CAAC;QAC5C,OAAO,IAAI,CAAC;IACd,CAAC;IAGD,OAAO,YAAY,CAAC;AACtB,CAAC;AAED,SAAS,qBAAqB;IAC5B,OAAO,cAAc,EAAE,IAAI,oBAAoB,EAAE,CAAC;AACpD,CAAC;AAED,SAAS,iBAAiB;IACxB,OAAO,KAAK,CAAC;AACf,CAAC","sourcesContent":["\"use client\";\n\nimport { useSyncExternalStore } from \"react\";\nimport { useAccount } from \"wagmi\";\nimport {\n isHostEmbedded,\n isValidSafeAppOrigin,\n subscribeSafeAppOrigins,\n} from \"./safe-app-origins.js\";\nimport { useIsSafeAppContext } from \"./use-is-safe-app-context.js\";\n\n/**\n * Detect if the connected wallet is a Safe multisig wallet.\n *\n * Detection strategy (in order of reliability):\n * 1. Safe Apps SDK detection via postMessage (most reliable, works cross-origin)\n * 2. Wagmi connector ID check\n * 3. Iframe origin validation (fallback, may fail cross-origin)\n *\n * @returns true if wallet is a Safe multisig\n *\n * Notes:\n * - This is a broader heuristic: SDK context, connector ID, then host origin.\n * - For just SDK context, use `useIsSafeAppContext`.\n * - For a sync host-only check, use `useIsHostSafeApp`.\n */\nexport function useIsSafeMultisigWallet(): boolean {\n const { connector, isConnected } = useAccount();\n const isSafeContext = useIsSafeAppContext();\n\n // Method 3: Iframe origin fallback (may fail cross-origin)\n const isSafeIframe = useSyncExternalStore(\n subscribeSafeAppOrigins,\n getSafeIframeSnapshot,\n getServerSnapshot\n );\n\n // Method 1: Safe Apps SDK (most reliable - uses postMessage)\n if (isSafeContext) {\n return true;\n }\n\n // Method 2: Connected via Safe connector\n if (isConnected && connector?.id === \"safe\") {\n return true;\n }\n\n // Method 3: Fallback\n return isSafeIframe;\n}\n\nfunction getSafeIframeSnapshot(): boolean {\n return isHostEmbedded() && isValidSafeAppOrigin();\n}\n\nfunction getServerSnapshot(): boolean {\n return false;\n}\n"]}
|
package/dist/safe/adapter.d.ts
DELETED
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import { Effect } from "effect";
|
|
2
|
-
import { SafeSdkUnavailableError } from "./errors.js";
|
|
3
|
-
export type SafeAppsSdkConfig = {
|
|
4
|
-
allowedDomains?: RegExp[];
|
|
5
|
-
debug?: boolean;
|
|
6
|
-
};
|
|
7
|
-
export declare const loadSafeSdk: (config?: SafeAppsSdkConfig) => Effect.Effect<import("@safe-global/safe-apps-sdk").default, SafeSdkUnavailableError, never>;
|
|
8
|
-
export type SafeAppsSDKInstance = any;
|
|
9
|
-
//# sourceMappingURL=adapter.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../src/safe/adapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AAGtD,MAAM,MAAM,iBAAiB,GAAG;IAC9B,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB,CAAC;AAGF,eAAO,MAAM,WAAW,GAAI,SAAS,iBAAiB,gGAYlD,CAAC;AAIL,MAAM,MAAM,mBAAmB,GAAG,GAAG,CAAC"}
|