@prb/effect-evm 1.0.0-beta.3 → 1.0.0-beta.4
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/ens/ens.d.ts.map +1 -1
- package/dist/ens/ens.js +6 -6
- package/dist/ens/ens.js.map +1 -1
- package/dist/react-hooks/index.d.ts +3 -1
- package/dist/react-hooks/index.d.ts.map +1 -1
- package/dist/react-hooks/index.js +3 -1
- package/dist/react-hooks/index.js.map +1 -1
- package/dist/react-hooks/safe-origins.d.ts +8 -0
- package/dist/react-hooks/safe-origins.d.ts.map +1 -0
- package/dist/react-hooks/safe-origins.js +124 -0
- package/dist/react-hooks/safe-origins.js.map +1 -0
- package/dist/react-hooks/use-is-host-safe-multisig.d.ts +2 -0
- package/dist/react-hooks/use-is-host-safe-multisig.d.ts.map +1 -0
- package/dist/react-hooks/use-is-host-safe-multisig.js +16 -0
- package/dist/react-hooks/use-is-host-safe-multisig.js.map +1 -0
- package/dist/react-hooks/use-is-wallet-safe-multisig.d.ts +2 -0
- package/dist/react-hooks/use-is-wallet-safe-multisig.d.ts.map +1 -0
- package/dist/react-hooks/use-is-wallet-safe-multisig.js +24 -0
- package/dist/react-hooks/use-is-wallet-safe-multisig.js.map +1 -0
- package/dist/react-hooks/use-safe-context.d.ts.map +1 -1
- package/dist/react-hooks/use-safe-context.js.map +1 -1
- package/dist/safe/simulation/abis.d.ts.map +1 -1
- package/dist/safe/simulation/abis.js.map +1 -1
- package/dist/safe/simulation/addresses.d.ts.map +1 -1
- package/dist/safe/simulation/addresses.js +40 -26
- package/dist/safe/simulation/addresses.js.map +1 -1
- package/dist/safe/simulation/internal/calldata/calldata.d.ts +5 -0
- package/dist/safe/simulation/internal/calldata/calldata.d.ts.map +1 -0
- package/dist/safe/simulation/internal/calldata/calldata.js +17 -0
- package/dist/safe/simulation/internal/calldata/calldata.js.map +1 -0
- package/dist/safe/simulation/internal/calldata/index.d.ts +2 -0
- package/dist/safe/simulation/internal/calldata/index.d.ts.map +1 -0
- package/dist/safe/simulation/internal/calldata/index.js +2 -0
- package/dist/safe/simulation/internal/calldata/index.js.map +1 -0
- package/dist/safe/simulation/internal/contracts/contracts.d.ts +5 -0
- package/dist/safe/simulation/internal/contracts/contracts.d.ts.map +1 -0
- package/dist/safe/simulation/internal/contracts/contracts.js +25 -0
- package/dist/safe/simulation/internal/contracts/contracts.js.map +1 -0
- package/dist/safe/simulation/internal/contracts/index.d.ts +2 -0
- package/dist/safe/simulation/internal/contracts/index.d.ts.map +1 -0
- package/dist/safe/simulation/internal/contracts/index.js +2 -0
- package/dist/safe/simulation/internal/contracts/index.js.map +1 -0
- package/dist/safe/simulation/internal/evaluation/evaluation.d.ts +6 -0
- package/dist/safe/simulation/internal/evaluation/evaluation.d.ts.map +1 -0
- package/dist/safe/simulation/internal/evaluation/evaluation.js +20 -0
- package/dist/safe/simulation/internal/evaluation/evaluation.js.map +1 -0
- package/dist/safe/simulation/internal/evaluation/index.d.ts +2 -0
- package/dist/safe/simulation/internal/evaluation/index.d.ts.map +1 -0
- package/dist/safe/simulation/internal/evaluation/index.js +2 -0
- package/dist/safe/simulation/internal/evaluation/index.js.map +1 -0
- package/dist/safe/simulation/internal/execution/execution.d.ts +9 -0
- package/dist/safe/simulation/internal/execution/execution.d.ts.map +1 -0
- package/dist/safe/simulation/internal/execution/execution.js +65 -0
- package/dist/safe/simulation/internal/execution/execution.js.map +1 -0
- package/dist/safe/simulation/internal/execution/index.d.ts +2 -0
- package/dist/safe/simulation/internal/execution/index.d.ts.map +1 -0
- package/dist/safe/simulation/internal/execution/index.js +2 -0
- package/dist/safe/simulation/internal/execution/index.js.map +1 -0
- package/dist/safe/simulation/internal/limits/index.d.ts +2 -0
- package/dist/safe/simulation/internal/limits/index.d.ts.map +1 -0
- package/dist/safe/simulation/internal/limits/index.js +2 -0
- package/dist/safe/simulation/internal/limits/index.js.map +1 -0
- package/dist/safe/simulation/internal/limits/limits.d.ts +5 -0
- package/dist/safe/simulation/internal/limits/limits.d.ts.map +1 -0
- package/dist/safe/simulation/internal/limits/limits.js +18 -0
- package/dist/safe/simulation/internal/limits/limits.js.map +1 -0
- package/dist/safe/simulation/internal/types/index.d.ts +2 -0
- package/dist/safe/simulation/internal/types/index.d.ts.map +1 -0
- package/dist/safe/simulation/internal/types/index.js +2 -0
- package/dist/safe/simulation/internal/types/index.js.map +1 -0
- package/dist/safe/simulation/internal/types/types.d.ts +11 -0
- package/dist/safe/simulation/internal/types/types.d.ts.map +1 -0
- package/dist/safe/simulation/internal/types/types.js +2 -0
- package/dist/safe/simulation/internal/types/types.js.map +1 -0
- package/dist/safe/simulation/internal/validation/index.d.ts +2 -0
- package/dist/safe/simulation/internal/validation/index.d.ts.map +1 -0
- package/dist/safe/simulation/internal/validation/index.js +2 -0
- package/dist/safe/simulation/internal/validation/index.js.map +1 -0
- package/dist/safe/simulation/internal/validation/validation.d.ts +5 -0
- package/dist/safe/simulation/internal/validation/validation.d.ts.map +1 -0
- package/dist/safe/simulation/internal/validation/validation.js +27 -0
- package/dist/safe/simulation/internal/validation/validation.js.map +1 -0
- package/dist/safe/simulation/service.d.ts +1 -1
- package/dist/safe/simulation/service.d.ts.map +1 -1
- package/dist/safe/simulation/service.js +12 -127
- package/dist/safe/simulation/service.js.map +1 -1
- package/package.json +1 -1
- package/dist/react-hooks/use-is-safe-multisig.d.ts +0 -2
- package/dist/react-hooks/use-is-safe-multisig.d.ts.map +0 -1
- package/dist/react-hooks/use-is-safe-multisig.js +0 -44
- package/dist/react-hooks/use-is-safe-multisig.js.map +0 -1
package/dist/ens/ens.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ens.d.ts","sourceRoot":"","sources":["../../src/ens/ens.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAChD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"ens.d.ts","sourceRoot":"","sources":["../../src/ens/ens.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAChD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAGpC,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EACL,sBAAsB,EACtB,oBAAoB,EACpB,kBAAkB,EAClB,6BAA6B,EAC7B,2BAA2B,EAC3B,oBAAoB,EACrB,MAAM,qBAAqB,CAAC;AAG7B,KAAK,gBAAgB,GAAG;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AAQF,MAAM,MAAM,gBAAgB,GAAG;IAO7B,QAAQ,CAAC,UAAU,EAAE,CACnB,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,KACzB,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,oBAAoB,GAAG,kBAAkB,GAAG,mBAAmB,CAAC,CAAC;IAQ7F,QAAQ,CAAC,SAAS,EAAE,CAClB,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE;QAAE,gBAAgB,CAAC,EAAE,gBAAgB,CAAA;KAAE,KAC3C,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,sBAAsB,GAAG,kBAAkB,GAAG,mBAAmB,CAAC,CAAC;IAO9F,QAAQ,CAAC,OAAO,EAAE,CAChB,OAAO,EAAE,OAAO,KACb,MAAM,CAAC,MAAM,CAChB,MAAM,EACN,2BAA2B,GAAG,kBAAkB,GAAG,mBAAmB,CACvE,CAAC;IAOF,QAAQ,CAAC,WAAW,EAAE,CACpB,IAAI,EAAE,MAAM,KACT,MAAM,CAAC,MAAM,CAChB,OAAO,EACP,6BAA6B,GAAG,kBAAkB,GAAG,mBAAmB,CACzE,CAAC;IAQF,QAAQ,CAAC,OAAO,EAAE,CAChB,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,MAAM,KACR,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,oBAAoB,GAAG,kBAAkB,GAAG,mBAAmB,CAAC,CAAC;CAC7F,CAAC;;AAEF,qBAAa,WAAY,SAAQ,gBAA+D;CAAG;AAOnG,eAAO,MAAM,eAAe,sDAgM3B,CAAC"}
|
package/dist/ens/ens.js
CHANGED
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
import { Context, Effect, Layer } from "effect";
|
|
2
|
+
import { mainnet } from "viem/chains";
|
|
2
3
|
import { normalize } from "viem/ens";
|
|
3
4
|
import { PublicClientService } from "../core/index.js";
|
|
4
5
|
import { EnsAvatarNotFoundError, EnsNameNotFoundError, EnsResolutionError, EnsResolverNotConfiguredError, EnsReverseNameNotFoundError, EnsTextNotFoundError, } from "../ens/errors.js";
|
|
5
6
|
import { SpanNames } from "../telemetry/index.js";
|
|
6
|
-
const MAINNET_CHAIN_ID = 1;
|
|
7
7
|
export class EnsResolver extends Context.Tag("ew3/EnsResolver")() {
|
|
8
8
|
}
|
|
9
9
|
export const EnsResolverLive = Layer.effect(EnsResolver, Effect.gen(function* () {
|
|
10
10
|
const publicClientService = yield* PublicClientService;
|
|
11
11
|
return EnsResolver.of({
|
|
12
12
|
getAddress: (name, opts) => Effect.gen(function* () {
|
|
13
|
-
const client = yield* publicClientService.get(
|
|
13
|
+
const client = yield* publicClientService.get(mainnet.id);
|
|
14
14
|
const normalizedName = normalize(name);
|
|
15
15
|
const result = yield* Effect.tryPromise({
|
|
16
16
|
catch: (cause) => new EnsResolutionError({
|
|
@@ -37,7 +37,7 @@ export const EnsResolverLive = Layer.effect(EnsResolver, Effect.gen(function* ()
|
|
|
37
37
|
},
|
|
38
38
|
})),
|
|
39
39
|
getAvatar: (name, opts) => Effect.gen(function* () {
|
|
40
|
-
const client = yield* publicClientService.get(
|
|
40
|
+
const client = yield* publicClientService.get(mainnet.id);
|
|
41
41
|
const normalizedName = normalize(name);
|
|
42
42
|
const result = yield* Effect.tryPromise({
|
|
43
43
|
catch: (cause) => new EnsResolutionError({
|
|
@@ -63,7 +63,7 @@ export const EnsResolverLive = Layer.effect(EnsResolver, Effect.gen(function* ()
|
|
|
63
63
|
},
|
|
64
64
|
})),
|
|
65
65
|
getName: (address) => Effect.gen(function* () {
|
|
66
|
-
const client = yield* publicClientService.get(
|
|
66
|
+
const client = yield* publicClientService.get(mainnet.id);
|
|
67
67
|
const result = yield* Effect.tryPromise({
|
|
68
68
|
catch: (cause) => new EnsResolutionError({
|
|
69
69
|
cause,
|
|
@@ -87,7 +87,7 @@ export const EnsResolverLive = Layer.effect(EnsResolver, Effect.gen(function* ()
|
|
|
87
87
|
},
|
|
88
88
|
})),
|
|
89
89
|
getResolver: (name) => Effect.gen(function* () {
|
|
90
|
-
const client = yield* publicClientService.get(
|
|
90
|
+
const client = yield* publicClientService.get(mainnet.id);
|
|
91
91
|
const normalizedName = normalize(name);
|
|
92
92
|
const result = yield* Effect.tryPromise({
|
|
93
93
|
catch: (cause) => new EnsResolutionError({
|
|
@@ -112,7 +112,7 @@ export const EnsResolverLive = Layer.effect(EnsResolver, Effect.gen(function* ()
|
|
|
112
112
|
},
|
|
113
113
|
})),
|
|
114
114
|
getText: (name, key) => Effect.gen(function* () {
|
|
115
|
-
const client = yield* publicClientService.get(
|
|
115
|
+
const client = yield* publicClientService.get(mainnet.id);
|
|
116
116
|
const normalizedName = normalize(name);
|
|
117
117
|
const result = yield* Effect.tryPromise({
|
|
118
118
|
catch: (cause) => new EnsResolutionError({
|
package/dist/ens/ens.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ens.js","sourceRoot":"","sources":["../../src/ens/ens.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAEhD,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAErC,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EACL,sBAAsB,EACtB,oBAAoB,EACpB,kBAAkB,EAClB,6BAA6B,EAC7B,2BAA2B,EAC3B,oBAAoB,GACrB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAErD,MAAM,gBAAgB,GAAG,CAAC,CAAC;AAwE3B,MAAM,OAAO,WAAY,SAAQ,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,EAAiC;CAAG;AAOnG,MAAM,CAAC,MAAM,eAAe,GAAG,KAAK,CAAC,MAAM,CACzC,WAAW,EACX,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,mBAAmB,GAAG,KAAK,CAAC,CAAC,mBAAmB,CAAC;IAEvD,OAAO,WAAW,CAAC,EAAE,CAAC;QACpB,UAAU,EAAE,CAAC,IAAY,EAAE,IAA4B,EAAE,EAAE,CACzD,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;YAClB,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,mBAAmB,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;YAChE,MAAM,cAAc,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;YAEvC,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC;gBACtC,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CACf,IAAI,kBAAkB,CAAC;oBACrB,KAAK;oBACL,OAAO,EAAE,+BAA+B,MAAM,CAAC,KAAK,CAAC,EAAE;oBACvD,IAAI,EAAE,cAAc;iBACrB,CAAC;gBACJ,GAAG,EAAE,GAAG,EAAE,CACR,MAAM,CAAC,aAAa,CAAC;oBACnB,QAAQ,EAAE,IAAI,EAAE,QAAQ;oBACxB,IAAI,EAAE,cAAc;iBACrB,CAAC;aACL,CAAC,CAAC;YAEH,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;gBACpB,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CACvB,IAAI,oBAAoB,CAAC;oBACvB,OAAO,EAAE,kCAAkC,cAAc,GAAG;oBAC5D,IAAI,EAAE,cAAc;iBACrB,CAAC,CACH,CAAC;YACJ,CAAC;YAED,OAAO,MAAM,CAAC;QAChB,CAAC,CAAC,CAAC,IAAI,CACL,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,eAAe,EAAE;YACzC,UAAU,EAAE;gBACV,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE;gBACpC,IAAI;aACL;SACF,CAAC,CACH;QAEH,SAAS,EAAE,CAAC,IAAY,EAAE,IAA8C,EAAE,EAAE,CAC1E,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;YAClB,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,mBAAmB,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;YAChE,MAAM,cAAc,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;YAEvC,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC;gBACtC,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CACf,IAAI,kBAAkB,CAAC;oBACrB,KAAK;oBACL,OAAO,EAAE,6BAA6B,MAAM,CAAC,KAAK,CAAC,EAAE;oBACrD,IAAI,EAAE,cAAc;iBACrB,CAAC;gBACJ,GAAG,EAAE,GAAG,EAAE,CACR,MAAM,CAAC,YAAY,CAAC;oBAClB,gBAAgB,EAAE,IAAI,EAAE,gBAAgB;oBACxC,IAAI,EAAE,cAAc;iBACrB,CAAC;aACL,CAAC,CAAC;YAEH,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;gBACpB,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CACvB,IAAI,sBAAsB,CAAC;oBACzB,OAAO,EAAE,iCAAiC,cAAc,GAAG;oBAC3D,IAAI,EAAE,cAAc;iBACrB,CAAC,CACH,CAAC;YACJ,CAAC;YAED,OAAO,MAAM,CAAC;QAChB,CAAC,CAAC,CAAC,IAAI,CACL,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,cAAc,EAAE;YACxC,UAAU,EAAE;gBACV,IAAI;aACL;SACF,CAAC,CACH;QAEH,OAAO,EAAE,CAAC,OAAgB,EAAE,EAAE,CAC5B,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;YAClB,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,mBAAmB,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;YAEhE,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC;gBACtC,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CACf,IAAI,kBAAkB,CAAC;oBACrB,KAAK;oBACL,OAAO,EAAE,sCAAsC,MAAM,CAAC,KAAK,CAAC,EAAE;oBAC9D,IAAI,EAAE,OAAO;iBACd,CAAC;gBACJ,GAAG,EAAE,GAAG,EAAE,CACR,MAAM,CAAC,UAAU,CAAC;oBAChB,OAAO;iBACR,CAAC;aACL,CAAC,CAAC;YAEH,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;gBACpB,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CACvB,IAAI,2BAA2B,CAAC;oBAC9B,OAAO;oBACP,OAAO,EAAE,kCAAkC,OAAO,GAAG;iBACtD,CAAC,CACH,CAAC;YACJ,CAAC;YAED,OAAO,MAAM,CAAC;QAChB,CAAC,CAAC,CAAC,IAAI,CACL,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,YAAY,EAAE;YACtC,UAAU,EAAE;gBACV,OAAO;aACR;SACF,CAAC,CACH;QAEH,WAAW,EAAE,CAAC,IAAY,EAAE,EAAE,CAC5B,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;YAClB,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,mBAAmB,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;YAChE,MAAM,cAAc,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;YAEvC,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC;gBACtC,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CACf,IAAI,kBAAkB,CAAC;oBACrB,KAAK;oBACL,OAAO,EAAE,+BAA+B,MAAM,CAAC,KAAK,CAAC,EAAE;oBACvD,IAAI,EAAE,cAAc;iBACrB,CAAC;gBACJ,GAAG,EAAE,GAAG,EAAE,CACR,MAAM,CAAC,cAAc,CAAC;oBACpB,IAAI,EAAE,cAAc;iBACrB,CAAC;aACL,CAAC,CAAC;YAEH,IAAI,MAAM,KAAK,IAAI,IAAI,MAAM,KAAK,4CAA4C,EAAE,CAAC;gBAC/E,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CACvB,IAAI,6BAA6B,CAAC;oBAChC,OAAO,EAAE,wCAAwC,cAAc,GAAG;oBAClE,IAAI,EAAE,cAAc;iBACrB,CAAC,CACH,CAAC;YACJ,CAAC;YAED,OAAO,MAAM,CAAC;QAChB,CAAC,CAAC,CAAC,IAAI,CACL,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,gBAAgB,EAAE;YAC1C,UAAU,EAAE;gBACV,IAAI;aACL;SACF,CAAC,CACH;QAEH,OAAO,EAAE,CAAC,IAAY,EAAE,GAAW,EAAE,EAAE,CACrC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;YAClB,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,mBAAmB,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;YAChE,MAAM,cAAc,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;YAEvC,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC;gBACtC,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CACf,IAAI,kBAAkB,CAAC;oBACrB,KAAK;oBACL,OAAO,EAAE,kCAAkC,MAAM,CAAC,KAAK,CAAC,EAAE;oBAC1D,IAAI,EAAE,cAAc;iBACrB,CAAC;gBACJ,GAAG,EAAE,GAAG,EAAE,CACR,MAAM,CAAC,UAAU,CAAC;oBAChB,GAAG;oBACH,IAAI,EAAE,cAAc;iBACrB,CAAC;aACL,CAAC,CAAC;YAEH,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;gBACpB,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CACvB,IAAI,oBAAoB,CAAC;oBACvB,GAAG;oBACH,OAAO,EAAE,mBAAmB,GAAG,yBAAyB,cAAc,GAAG;oBACzE,IAAI,EAAE,cAAc;iBACrB,CAAC,CACH,CAAC;YACJ,CAAC;YAED,OAAO,MAAM,CAAC;QAChB,CAAC,CAAC,CAAC,IAAI,CACL,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,YAAY,EAAE;YACtC,UAAU,EAAE;gBACV,GAAG;gBACH,IAAI;aACL;SACF,CAAC,CACH;KACJ,CAAC,CAAC;AACL,CAAC,CAAC,CACH,CAAC","sourcesContent":["import { Context, Effect, Layer } from \"effect\";\nimport type { Address } from \"viem\";\nimport { normalize } from \"viem/ens\";\nimport type { ClientNotFoundError } from \"@/src/core/index.js\";\nimport { PublicClientService } from \"@/src/core/index.js\";\nimport {\n EnsAvatarNotFoundError,\n EnsNameNotFoundError,\n EnsResolutionError,\n EnsResolverNotConfiguredError,\n EnsReverseNameNotFoundError,\n EnsTextNotFoundError,\n} from \"@/src/ens/errors.js\";\nimport { SpanNames } from \"@/src/telemetry/index.js\";\n\nconst MAINNET_CHAIN_ID = 1;\n\ntype AssetGatewayUrls = {\n arweave?: string;\n ipfs?: string;\n};\n\n/**\n * Service for ENS (Ethereum Name Service) resolution\n *\n * All operations target Ethereum mainnet (chainId=1) since ENS\n * primarily lives there. Names are automatically normalized.\n */\nexport type EnsResolverShape = {\n /**\n * Resolve an ENS name to an address\n *\n * @param name - The ENS name to resolve (e.g., \"vitalik.eth\")\n * @param opts.coinType - Optional ENSIP-19 coinType for cross-chain resolution\n */\n readonly getAddress: (\n name: string,\n opts?: { coinType?: bigint }\n ) => Effect.Effect<Address, EnsNameNotFoundError | EnsResolutionError | ClientNotFoundError>;\n\n /**\n * Get the avatar URL for an ENS name\n *\n * @param name - The ENS name to get avatar for\n * @param opts.assetGatewayUrls - Optional gateway URLs for IPFS/Arweave\n */\n readonly getAvatar: (\n name: string,\n opts?: { assetGatewayUrls?: AssetGatewayUrls }\n ) => Effect.Effect<string, EnsAvatarNotFoundError | EnsResolutionError | ClientNotFoundError>;\n\n /**\n * Reverse resolve an address to its primary ENS name\n *\n * @param address - The address to resolve\n */\n readonly getName: (\n address: Address\n ) => Effect.Effect<\n string,\n EnsReverseNameNotFoundError | EnsResolutionError | ClientNotFoundError\n >;\n\n /**\n * Get the resolver contract address for an ENS name\n *\n * @param name - The ENS name to get resolver for\n */\n readonly getResolver: (\n name: string\n ) => Effect.Effect<\n Address,\n EnsResolverNotConfiguredError | EnsResolutionError | ClientNotFoundError\n >;\n\n /**\n * Get a text record for an ENS name\n *\n * @param name - The ENS name to query\n * @param key - The text record key (e.g., \"com.twitter\", \"url\", \"description\")\n */\n readonly getText: (\n name: string,\n key: string\n ) => Effect.Effect<string, EnsTextNotFoundError | EnsResolutionError | ClientNotFoundError>;\n};\n\nexport class EnsResolver extends Context.Tag(\"ew3/EnsResolver\")<EnsResolver, EnsResolverShape>() {}\n\n/**\n * Live implementation of EnsResolver service\n *\n * Requires PublicClientService with mainnet (chainId=1) configured\n */\nexport const EnsResolverLive = Layer.effect(\n EnsResolver,\n Effect.gen(function* () {\n const publicClientService = yield* PublicClientService;\n\n return EnsResolver.of({\n getAddress: (name: string, opts?: { coinType?: bigint }) =>\n Effect.gen(function* () {\n const client = yield* publicClientService.get(MAINNET_CHAIN_ID);\n const normalizedName = normalize(name);\n\n const result = yield* Effect.tryPromise({\n catch: (cause) =>\n new EnsResolutionError({\n cause,\n message: `Failed to resolve ENS name: ${String(cause)}`,\n name: normalizedName,\n }),\n try: () =>\n client.getEnsAddress({\n coinType: opts?.coinType,\n name: normalizedName,\n }),\n });\n\n if (result === null) {\n return yield* Effect.fail(\n new EnsNameNotFoundError({\n message: `No address found for ENS name \"${normalizedName}\"`,\n name: normalizedName,\n })\n );\n }\n\n return result;\n }).pipe(\n Effect.withSpan(SpanNames.ENS_GET_ADDRESS, {\n attributes: {\n coinType: opts?.coinType?.toString(),\n name,\n },\n })\n ),\n\n getAvatar: (name: string, opts?: { assetGatewayUrls?: AssetGatewayUrls }) =>\n Effect.gen(function* () {\n const client = yield* publicClientService.get(MAINNET_CHAIN_ID);\n const normalizedName = normalize(name);\n\n const result = yield* Effect.tryPromise({\n catch: (cause) =>\n new EnsResolutionError({\n cause,\n message: `Failed to get ENS avatar: ${String(cause)}`,\n name: normalizedName,\n }),\n try: () =>\n client.getEnsAvatar({\n assetGatewayUrls: opts?.assetGatewayUrls,\n name: normalizedName,\n }),\n });\n\n if (result === null) {\n return yield* Effect.fail(\n new EnsAvatarNotFoundError({\n message: `No avatar found for ENS name \"${normalizedName}\"`,\n name: normalizedName,\n })\n );\n }\n\n return result;\n }).pipe(\n Effect.withSpan(SpanNames.ENS_GET_AVATAR, {\n attributes: {\n name,\n },\n })\n ),\n\n getName: (address: Address) =>\n Effect.gen(function* () {\n const client = yield* publicClientService.get(MAINNET_CHAIN_ID);\n\n const result = yield* Effect.tryPromise({\n catch: (cause) =>\n new EnsResolutionError({\n cause,\n message: `Failed to reverse resolve address: ${String(cause)}`,\n name: address,\n }),\n try: () =>\n client.getEnsName({\n address,\n }),\n });\n\n if (result === null) {\n return yield* Effect.fail(\n new EnsReverseNameNotFoundError({\n address,\n message: `No ENS name found for address \"${address}\"`,\n })\n );\n }\n\n return result;\n }).pipe(\n Effect.withSpan(SpanNames.ENS_GET_NAME, {\n attributes: {\n address,\n },\n })\n ),\n\n getResolver: (name: string) =>\n Effect.gen(function* () {\n const client = yield* publicClientService.get(MAINNET_CHAIN_ID);\n const normalizedName = normalize(name);\n\n const result = yield* Effect.tryPromise({\n catch: (cause) =>\n new EnsResolutionError({\n cause,\n message: `Failed to get ENS resolver: ${String(cause)}`,\n name: normalizedName,\n }),\n try: () =>\n client.getEnsResolver({\n name: normalizedName,\n }),\n });\n\n if (result === null || result === \"0x0000000000000000000000000000000000000000\") {\n return yield* Effect.fail(\n new EnsResolverNotConfiguredError({\n message: `No resolver configured for ENS name \"${normalizedName}\"`,\n name: normalizedName,\n })\n );\n }\n\n return result;\n }).pipe(\n Effect.withSpan(SpanNames.ENS_GET_RESOLVER, {\n attributes: {\n name,\n },\n })\n ),\n\n getText: (name: string, key: string) =>\n Effect.gen(function* () {\n const client = yield* publicClientService.get(MAINNET_CHAIN_ID);\n const normalizedName = normalize(name);\n\n const result = yield* Effect.tryPromise({\n catch: (cause) =>\n new EnsResolutionError({\n cause,\n message: `Failed to get ENS text record: ${String(cause)}`,\n name: normalizedName,\n }),\n try: () =>\n client.getEnsText({\n key,\n name: normalizedName,\n }),\n });\n\n if (result === null) {\n return yield* Effect.fail(\n new EnsTextNotFoundError({\n key,\n message: `No text record \"${key}\" found for ENS name \"${normalizedName}\"`,\n name: normalizedName,\n })\n );\n }\n\n return result;\n }).pipe(\n Effect.withSpan(SpanNames.ENS_GET_TEXT, {\n attributes: {\n key,\n name,\n },\n })\n ),\n });\n })\n);\n"]}
|
|
1
|
+
{"version":3,"file":"ens.js","sourceRoot":"","sources":["../../src/ens/ens.ts"],"names":[],"mappings":"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","sourcesContent":["import { Context, Effect, Layer } from \"effect\";\nimport type { Address } from \"viem\";\nimport { mainnet } from \"viem/chains\";\nimport { normalize } from \"viem/ens\";\nimport type { ClientNotFoundError } from \"@/src/core/index.js\";\nimport { PublicClientService } from \"@/src/core/index.js\";\nimport {\n EnsAvatarNotFoundError,\n EnsNameNotFoundError,\n EnsResolutionError,\n EnsResolverNotConfiguredError,\n EnsReverseNameNotFoundError,\n EnsTextNotFoundError,\n} from \"@/src/ens/errors.js\";\nimport { SpanNames } from \"@/src/telemetry/index.js\";\n\ntype AssetGatewayUrls = {\n arweave?: string;\n ipfs?: string;\n};\n\n/**\n * Service for ENS (Ethereum Name Service) resolution\n *\n * All operations target Ethereum mainnet (chainId=1) since ENS\n * primarily lives there. Names are automatically normalized.\n */\nexport type EnsResolverShape = {\n /**\n * Resolve an ENS name to an address\n *\n * @param name - The ENS name to resolve (e.g., \"vitalik.eth\")\n * @param opts.coinType - Optional ENSIP-19 coinType for cross-chain resolution\n */\n readonly getAddress: (\n name: string,\n opts?: { coinType?: bigint }\n ) => Effect.Effect<Address, EnsNameNotFoundError | EnsResolutionError | ClientNotFoundError>;\n\n /**\n * Get the avatar URL for an ENS name\n *\n * @param name - The ENS name to get avatar for\n * @param opts.assetGatewayUrls - Optional gateway URLs for IPFS/Arweave\n */\n readonly getAvatar: (\n name: string,\n opts?: { assetGatewayUrls?: AssetGatewayUrls }\n ) => Effect.Effect<string, EnsAvatarNotFoundError | EnsResolutionError | ClientNotFoundError>;\n\n /**\n * Reverse resolve an address to its primary ENS name\n *\n * @param address - The address to resolve\n */\n readonly getName: (\n address: Address\n ) => Effect.Effect<\n string,\n EnsReverseNameNotFoundError | EnsResolutionError | ClientNotFoundError\n >;\n\n /**\n * Get the resolver contract address for an ENS name\n *\n * @param name - The ENS name to get resolver for\n */\n readonly getResolver: (\n name: string\n ) => Effect.Effect<\n Address,\n EnsResolverNotConfiguredError | EnsResolutionError | ClientNotFoundError\n >;\n\n /**\n * Get a text record for an ENS name\n *\n * @param name - The ENS name to query\n * @param key - The text record key (e.g., \"com.twitter\", \"url\", \"description\")\n */\n readonly getText: (\n name: string,\n key: string\n ) => Effect.Effect<string, EnsTextNotFoundError | EnsResolutionError | ClientNotFoundError>;\n};\n\nexport class EnsResolver extends Context.Tag(\"ew3/EnsResolver\")<EnsResolver, EnsResolverShape>() {}\n\n/**\n * Live implementation of EnsResolver service\n *\n * Requires PublicClientService with mainnet (chainId=1) configured\n */\nexport const EnsResolverLive = Layer.effect(\n EnsResolver,\n Effect.gen(function* () {\n const publicClientService = yield* PublicClientService;\n\n return EnsResolver.of({\n getAddress: (name: string, opts?: { coinType?: bigint }) =>\n Effect.gen(function* () {\n const client = yield* publicClientService.get(mainnet.id);\n const normalizedName = normalize(name);\n\n const result = yield* Effect.tryPromise({\n catch: (cause) =>\n new EnsResolutionError({\n cause,\n message: `Failed to resolve ENS name: ${String(cause)}`,\n name: normalizedName,\n }),\n try: () =>\n client.getEnsAddress({\n coinType: opts?.coinType,\n name: normalizedName,\n }),\n });\n\n if (result === null) {\n return yield* Effect.fail(\n new EnsNameNotFoundError({\n message: `No address found for ENS name \"${normalizedName}\"`,\n name: normalizedName,\n })\n );\n }\n\n return result;\n }).pipe(\n Effect.withSpan(SpanNames.ENS_GET_ADDRESS, {\n attributes: {\n coinType: opts?.coinType?.toString(),\n name,\n },\n })\n ),\n\n getAvatar: (name: string, opts?: { assetGatewayUrls?: AssetGatewayUrls }) =>\n Effect.gen(function* () {\n const client = yield* publicClientService.get(mainnet.id);\n const normalizedName = normalize(name);\n\n const result = yield* Effect.tryPromise({\n catch: (cause) =>\n new EnsResolutionError({\n cause,\n message: `Failed to get ENS avatar: ${String(cause)}`,\n name: normalizedName,\n }),\n try: () =>\n client.getEnsAvatar({\n assetGatewayUrls: opts?.assetGatewayUrls,\n name: normalizedName,\n }),\n });\n\n if (result === null) {\n return yield* Effect.fail(\n new EnsAvatarNotFoundError({\n message: `No avatar found for ENS name \"${normalizedName}\"`,\n name: normalizedName,\n })\n );\n }\n\n return result;\n }).pipe(\n Effect.withSpan(SpanNames.ENS_GET_AVATAR, {\n attributes: {\n name,\n },\n })\n ),\n\n getName: (address: Address) =>\n Effect.gen(function* () {\n const client = yield* publicClientService.get(mainnet.id);\n\n const result = yield* Effect.tryPromise({\n catch: (cause) =>\n new EnsResolutionError({\n cause,\n message: `Failed to reverse resolve address: ${String(cause)}`,\n name: address,\n }),\n try: () =>\n client.getEnsName({\n address,\n }),\n });\n\n if (result === null) {\n return yield* Effect.fail(\n new EnsReverseNameNotFoundError({\n address,\n message: `No ENS name found for address \"${address}\"`,\n })\n );\n }\n\n return result;\n }).pipe(\n Effect.withSpan(SpanNames.ENS_GET_NAME, {\n attributes: {\n address,\n },\n })\n ),\n\n getResolver: (name: string) =>\n Effect.gen(function* () {\n const client = yield* publicClientService.get(mainnet.id);\n const normalizedName = normalize(name);\n\n const result = yield* Effect.tryPromise({\n catch: (cause) =>\n new EnsResolutionError({\n cause,\n message: `Failed to get ENS resolver: ${String(cause)}`,\n name: normalizedName,\n }),\n try: () =>\n client.getEnsResolver({\n name: normalizedName,\n }),\n });\n\n if (result === null || result === \"0x0000000000000000000000000000000000000000\") {\n return yield* Effect.fail(\n new EnsResolverNotConfiguredError({\n message: `No resolver configured for ENS name \"${normalizedName}\"`,\n name: normalizedName,\n })\n );\n }\n\n return result;\n }).pipe(\n Effect.withSpan(SpanNames.ENS_GET_RESOLVER, {\n attributes: {\n name,\n },\n })\n ),\n\n getText: (name: string, key: string) =>\n Effect.gen(function* () {\n const client = yield* publicClientService.get(mainnet.id);\n const normalizedName = normalize(name);\n\n const result = yield* Effect.tryPromise({\n catch: (cause) =>\n new EnsResolutionError({\n cause,\n message: `Failed to get ENS text record: ${String(cause)}`,\n name: normalizedName,\n }),\n try: () =>\n client.getEnsText({\n key,\n name: normalizedName,\n }),\n });\n\n if (result === null) {\n return yield* Effect.fail(\n new EnsTextNotFoundError({\n key,\n message: `No text record \"${key}\" found for ENS name \"${normalizedName}\"`,\n name: normalizedName,\n })\n );\n }\n\n return result;\n }).pipe(\n Effect.withSpan(SpanNames.ENS_GET_TEXT, {\n attributes: {\n key,\n name,\n },\n })\n ),\n });\n })\n);\n"]}
|
|
@@ -4,6 +4,8 @@ export type { EffectEvmLayerProviderProps, EffectEvmProviderProps, } from "../in
|
|
|
4
4
|
export { EffectEvmLayerProvider, EffectEvmProvider, EffectEvmProviderSync, useEffectEvmLayer, useEffectEvmRuntime, } from "../integrations/react-hooks/provider.js";
|
|
5
5
|
export type { WalletProviderRefActions } from "../integrations/react-hooks/wallet-provider-ref.js";
|
|
6
6
|
export { useWalletProviderRef } from "../integrations/react-hooks/wallet-provider-ref.js";
|
|
7
|
-
export {
|
|
7
|
+
export { DEFAULT_SAFE_ORIGINS, extendSafeOrigins, getSafeOrigins, setSafeOrigins, } from "./safe-origins.js";
|
|
8
|
+
export { useIsHostSafeMultisig } from "./use-is-host-safe-multisig.js";
|
|
9
|
+
export { useIsWalletSafeMultisig } from "./use-is-wallet-safe-multisig.js";
|
|
8
10
|
export { useSafeContext } from "./use-safe-context.js";
|
|
9
11
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/react-hooks/index.ts"],"names":[],"mappings":"AAEA,YAAY,EACV,iBAAiB,EACjB,WAAW,EACX,eAAe,GAChB,MAAM,8CAA8C,CAAC;AACtD,OAAO,EACL,aAAa,EACb,oBAAoB,EACpB,aAAa,EACb,aAAa,EACb,SAAS,EACT,eAAe,EACf,cAAc,EACd,kBAAkB,EAClB,uBAAuB,GACxB,MAAM,8CAA8C,CAAC;AACtD,YAAY,EACV,2BAA2B,EAC3B,sBAAsB,GACvB,MAAM,4CAA4C,CAAC;AACpD,OAAO,EACL,sBAAsB,EACtB,iBAAiB,EACjB,qBAAqB,EACrB,iBAAiB,EACjB,mBAAmB,GACpB,MAAM,4CAA4C,CAAC;AACpD,YAAY,EAAE,wBAAwB,EAAE,MAAM,uDAAuD,CAAC;AACtG,OAAO,EAAE,oBAAoB,EAAE,MAAM,uDAAuD,CAAC;AAC7F,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/react-hooks/index.ts"],"names":[],"mappings":"AAEA,YAAY,EACV,iBAAiB,EACjB,WAAW,EACX,eAAe,GAChB,MAAM,8CAA8C,CAAC;AACtD,OAAO,EACL,aAAa,EACb,oBAAoB,EACpB,aAAa,EACb,aAAa,EACb,SAAS,EACT,eAAe,EACf,cAAc,EACd,kBAAkB,EAClB,uBAAuB,GACxB,MAAM,8CAA8C,CAAC;AACtD,YAAY,EACV,2BAA2B,EAC3B,sBAAsB,GACvB,MAAM,4CAA4C,CAAC;AACpD,OAAO,EACL,sBAAsB,EACtB,iBAAiB,EACjB,qBAAqB,EACrB,iBAAiB,EACjB,mBAAmB,GACpB,MAAM,4CAA4C,CAAC;AACpD,YAAY,EAAE,wBAAwB,EAAE,MAAM,uDAAuD,CAAC;AACtG,OAAO,EAAE,oBAAoB,EAAE,MAAM,uDAAuD,CAAC;AAC7F,OAAO,EACL,oBAAoB,EACpB,iBAAiB,EACjB,cAAc,EACd,cAAc,GACf,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AACvE,OAAO,EAAE,uBAAuB,EAAE,MAAM,kCAAkC,CAAC;AAC3E,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC"}
|
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
export { useEffectMemo, useEffectMemoFactory, useEffectOnce, useForkEffect, useStream, useStreamEffect, useStreamValue, useSubscriptionRef, useSubscriptionRefValue, } from "../integrations/react-hooks/primitives.js";
|
|
3
3
|
export { EffectEvmLayerProvider, EffectEvmProvider, EffectEvmProviderSync, useEffectEvmLayer, useEffectEvmRuntime, } from "../integrations/react-hooks/provider.js";
|
|
4
4
|
export { useWalletProviderRef } from "../integrations/react-hooks/wallet-provider-ref.js";
|
|
5
|
-
export {
|
|
5
|
+
export { DEFAULT_SAFE_ORIGINS, extendSafeOrigins, getSafeOrigins, setSafeOrigins, } from "./safe-origins.js";
|
|
6
|
+
export { useIsHostSafeMultisig } from "./use-is-host-safe-multisig.js";
|
|
7
|
+
export { useIsWalletSafeMultisig } from "./use-is-wallet-safe-multisig.js";
|
|
6
8
|
export { useSafeContext } from "./use-safe-context.js";
|
|
7
9
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/react-hooks/index.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAOb,OAAO,EACL,aAAa,EACb,oBAAoB,EACpB,aAAa,EACb,aAAa,EACb,SAAS,EACT,eAAe,EACf,cAAc,EACd,kBAAkB,EAClB,uBAAuB,GACxB,MAAM,8CAA8C,CAAC;AAKtD,OAAO,EACL,sBAAsB,EACtB,iBAAiB,EACjB,qBAAqB,EACrB,iBAAiB,EACjB,mBAAmB,GACpB,MAAM,4CAA4C,CAAC;AAEpD,OAAO,EAAE,oBAAoB,EAAE,MAAM,uDAAuD,CAAC;AAC7F,OAAO,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/react-hooks/index.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAOb,OAAO,EACL,aAAa,EACb,oBAAoB,EACpB,aAAa,EACb,aAAa,EACb,SAAS,EACT,eAAe,EACf,cAAc,EACd,kBAAkB,EAClB,uBAAuB,GACxB,MAAM,8CAA8C,CAAC;AAKtD,OAAO,EACL,sBAAsB,EACtB,iBAAiB,EACjB,qBAAqB,EACrB,iBAAiB,EACjB,mBAAmB,GACpB,MAAM,4CAA4C,CAAC;AAEpD,OAAO,EAAE,oBAAoB,EAAE,MAAM,uDAAuD,CAAC;AAC7F,OAAO,EACL,oBAAoB,EACpB,iBAAiB,EACjB,cAAc,EACd,cAAc,GACf,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AACvE,OAAO,EAAE,uBAAuB,EAAE,MAAM,kCAAkC,CAAC;AAC3E,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC","sourcesContent":["\"use client\";\n\nexport type {\n EffectMemoOptions,\n StreamState,\n UseEffectResult,\n} from \"@/src/integrations/react-hooks/primitives.js\";\nexport {\n useEffectMemo,\n useEffectMemoFactory,\n useEffectOnce,\n useForkEffect,\n useStream,\n useStreamEffect,\n useStreamValue,\n useSubscriptionRef,\n useSubscriptionRefValue,\n} from \"@/src/integrations/react-hooks/primitives.js\";\nexport type {\n EffectEvmLayerProviderProps,\n EffectEvmProviderProps,\n} from \"@/src/integrations/react-hooks/provider.js\";\nexport {\n EffectEvmLayerProvider,\n EffectEvmProvider,\n EffectEvmProviderSync,\n useEffectEvmLayer,\n useEffectEvmRuntime,\n} from \"@/src/integrations/react-hooks/provider.js\";\nexport type { WalletProviderRefActions } from \"@/src/integrations/react-hooks/wallet-provider-ref.js\";\nexport { useWalletProviderRef } from \"@/src/integrations/react-hooks/wallet-provider-ref.js\";\nexport {\n DEFAULT_SAFE_ORIGINS,\n extendSafeOrigins,\n getSafeOrigins,\n setSafeOrigins,\n} from \"./safe-origins.js\";\nexport { useIsHostSafeMultisig } from \"./use-is-host-safe-multisig.js\";\nexport { useIsWalletSafeMultisig } from \"./use-is-wallet-safe-multisig.js\";\nexport { useSafeContext } from \"./use-safe-context.js\";\n"]}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export declare const DEFAULT_SAFE_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 setSafeOrigins(origins: readonly string[]): void;
|
|
3
|
+
export declare function extendSafeOrigins(origins: readonly string[]): void;
|
|
4
|
+
export declare function getSafeOrigins(): readonly string[];
|
|
5
|
+
export declare function subscribeSafeOrigins(listener: () => void): () => void;
|
|
6
|
+
export declare function isValidSafeOrigin(): boolean;
|
|
7
|
+
export declare function isHostEmbedded(): boolean;
|
|
8
|
+
//# sourceMappingURL=safe-origins.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"safe-origins.d.ts","sourceRoot":"","sources":["../../src/react-hooks/safe-origins.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,oBAAoB,yMAUvB,CAAC;AASX,wBAAgB,cAAc,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,QAExD;AAGD,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,QAE3D;AAGD,wBAAgB,cAAc,IAAI,SAAS,MAAM,EAAE,CAElD;AAGD,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI,CAKrE;AAGD,wBAAgB,iBAAiB,IAAI,OAAO,CAM3C;AAGD,wBAAgB,cAAc,IAAI,OAAO,CAExC"}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
export const DEFAULT_SAFE_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 safeOrigins = normalizeOrigins(DEFAULT_SAFE_ORIGINS);
|
|
13
|
+
let safeOriginSet = new Set(safeOrigins);
|
|
14
|
+
const safeOriginListeners = new Set();
|
|
15
|
+
let safeOriginsConfigured = false;
|
|
16
|
+
export function setSafeOrigins(origins) {
|
|
17
|
+
configureSafeOrigins(normalizeOrigins(origins));
|
|
18
|
+
}
|
|
19
|
+
export function extendSafeOrigins(origins) {
|
|
20
|
+
configureSafeOrigins(normalizeOrigins([...safeOrigins, ...origins]));
|
|
21
|
+
}
|
|
22
|
+
export function getSafeOrigins() {
|
|
23
|
+
return [...safeOrigins];
|
|
24
|
+
}
|
|
25
|
+
export function subscribeSafeOrigins(listener) {
|
|
26
|
+
safeOriginListeners.add(listener);
|
|
27
|
+
return () => {
|
|
28
|
+
safeOriginListeners.delete(listener);
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
export function isValidSafeOrigin() {
|
|
32
|
+
const origin = getAncestorOrigin();
|
|
33
|
+
if (!origin) {
|
|
34
|
+
return false;
|
|
35
|
+
}
|
|
36
|
+
return safeOriginSet.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 updateSafeOrigins(nextOrigins) {
|
|
64
|
+
if (areSameOrigins(safeOrigins, nextOrigins)) {
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
safeOrigins = nextOrigins;
|
|
68
|
+
safeOriginSet = new Set(safeOrigins);
|
|
69
|
+
notifySafeOriginListeners();
|
|
70
|
+
}
|
|
71
|
+
function configureSafeOrigins(nextOrigins) {
|
|
72
|
+
if (safeOriginsConfigured) {
|
|
73
|
+
throw new Error("Safe origins already configured.");
|
|
74
|
+
}
|
|
75
|
+
safeOriginsConfigured = true;
|
|
76
|
+
updateSafeOrigins(nextOrigins);
|
|
77
|
+
}
|
|
78
|
+
function notifySafeOriginListeners() {
|
|
79
|
+
for (const listener of safeOriginListeners) {
|
|
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-origins.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"safe-origins.js","sourceRoot":"","sources":["../../src/react-hooks/safe-origins.ts"],"names":[],"mappings":"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","sourcesContent":["\"use client\";\n\n/**\n * Known Safe wallet domains for iframe origin validation.\n * Includes the main Safe app and chain-specific Safe deployments.\n */\nexport const DEFAULT_SAFE_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 safeOrigins = normalizeOrigins(DEFAULT_SAFE_ORIGINS);\nlet safeOriginSet = new Set(safeOrigins);\nconst safeOriginListeners = new Set<() => void>();\nlet safeOriginsConfigured = false;\n\n/** Replace the Safe origins list (one-time configuration). */\nexport function setSafeOrigins(origins: readonly string[]) {\n configureSafeOrigins(normalizeOrigins(origins));\n}\n\n/** Extend the Safe origins list (one-time configuration). */\nexport function extendSafeOrigins(origins: readonly string[]) {\n configureSafeOrigins(normalizeOrigins([...safeOrigins, ...origins]));\n}\n\n/** Read the currently configured Safe origins list. */\nexport function getSafeOrigins(): readonly string[] {\n return [...safeOrigins];\n}\n\n/** Subscribe to Safe origin changes. */\nexport function subscribeSafeOrigins(listener: () => void): () => void {\n safeOriginListeners.add(listener);\n return () => {\n safeOriginListeners.delete(listener);\n };\n}\n\n/** Check if the parent browsing context origin is a Safe domain. */\nexport function isValidSafeOrigin(): boolean {\n const origin = getAncestorOrigin();\n if (!origin) {\n return false;\n }\n return safeOriginSet.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 updateSafeOrigins(nextOrigins: string[]) {\n if (areSameOrigins(safeOrigins, nextOrigins)) {\n return;\n }\n\n safeOrigins = nextOrigins;\n safeOriginSet = new Set(safeOrigins);\n notifySafeOriginListeners();\n}\n\nfunction configureSafeOrigins(nextOrigins: string[]) {\n if (safeOriginsConfigured) {\n throw new Error(\"Safe origins already configured.\");\n }\n\n safeOriginsConfigured = true;\n updateSafeOrigins(nextOrigins);\n}\n\nfunction notifySafeOriginListeners() {\n for (const listener of safeOriginListeners) {\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"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-is-host-safe-multisig.d.ts","sourceRoot":"","sources":["../../src/react-hooks/use-is-host-safe-multisig.ts"],"names":[],"mappings":"AAkBA,wBAAgB,qBAAqB,IAAI,OAAO,CAS/C"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { useSyncExternalStore } from "react";
|
|
3
|
+
import { isHostEmbedded, isValidSafeOrigin, subscribeSafeOrigins } from "./safe-origins.js";
|
|
4
|
+
import { useSafeContext } from "./use-safe-context.js";
|
|
5
|
+
export function useIsHostSafeMultisig() {
|
|
6
|
+
const isSafeContext = useSafeContext();
|
|
7
|
+
const isSafeHost = useSyncExternalStore(subscribeSafeOrigins, getSafeHostSnapshot, getServerSnapshot);
|
|
8
|
+
return isSafeContext || isSafeHost;
|
|
9
|
+
}
|
|
10
|
+
function getSafeHostSnapshot() {
|
|
11
|
+
return isHostEmbedded() && isValidSafeOrigin();
|
|
12
|
+
}
|
|
13
|
+
function getServerSnapshot() {
|
|
14
|
+
return false;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=use-is-host-safe-multisig.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-is-host-safe-multisig.js","sourceRoot":"","sources":["../../src/react-hooks/use-is-host-safe-multisig.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb,OAAO,EAAE,oBAAoB,EAAE,MAAM,OAAO,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAC5F,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAcvD,MAAM,UAAU,qBAAqB;IACnC,MAAM,aAAa,GAAG,cAAc,EAAE,CAAC;IACvC,MAAM,UAAU,GAAG,oBAAoB,CACrC,oBAAoB,EACpB,mBAAmB,EACnB,iBAAiB,CAClB,CAAC;IAEF,OAAO,aAAa,IAAI,UAAU,CAAC;AACrC,CAAC;AAED,SAAS,mBAAmB;IAC1B,OAAO,cAAc,EAAE,IAAI,iBAAiB,EAAE,CAAC;AACjD,CAAC;AAED,SAAS,iBAAiB;IACxB,OAAO,KAAK,CAAC;AACf,CAAC","sourcesContent":["\"use client\";\n\nimport { useSyncExternalStore } from \"react\";\nimport { isHostEmbedded, isValidSafeOrigin, subscribeSafeOrigins } from \"./safe-origins.js\";\nimport { useSafeContext } from \"./use-safe-context.js\";\n\n/**\n * Detect if the app is running within a Safe 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-origin iframe (sync check).\n *\n * Notes:\n * - This answers “is the host Safe?” and will return true even without a wallet.\n * - For full wallet detection heuristics, use `useIsWalletSafeMultisig`.\n * - For SDK-only checks, use `useSafeContext`.\n */\nexport function useIsHostSafeMultisig(): boolean {\n const isSafeContext = useSafeContext();\n const isSafeHost = useSyncExternalStore(\n subscribeSafeOrigins,\n getSafeHostSnapshot,\n getServerSnapshot\n );\n\n return isSafeContext || isSafeHost;\n}\n\nfunction getSafeHostSnapshot(): boolean {\n return isHostEmbedded() && isValidSafeOrigin();\n}\n\nfunction getServerSnapshot(): boolean {\n return false;\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-is-wallet-safe-multisig.d.ts","sourceRoot":"","sources":["../../src/react-hooks/use-is-wallet-safe-multisig.ts"],"names":[],"mappings":"AAsBA,wBAAgB,uBAAuB,IAAI,OAAO,CAuBjD"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { useSyncExternalStore } from "react";
|
|
3
|
+
import { useAccount } from "wagmi";
|
|
4
|
+
import { isHostEmbedded, isValidSafeOrigin, subscribeSafeOrigins } from "./safe-origins.js";
|
|
5
|
+
import { useSafeContext } from "./use-safe-context.js";
|
|
6
|
+
export function useIsWalletSafeMultisig() {
|
|
7
|
+
const { connector, isConnected } = useAccount();
|
|
8
|
+
const isSafeContext = useSafeContext();
|
|
9
|
+
const isSafeIframe = useSyncExternalStore(subscribeSafeOrigins, 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() && isValidSafeOrigin();
|
|
20
|
+
}
|
|
21
|
+
function getServerSnapshot() {
|
|
22
|
+
return false;
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=use-is-wallet-safe-multisig.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-is-wallet-safe-multisig.js","sourceRoot":"","sources":["../../src/react-hooks/use-is-wallet-safe-multisig.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb,OAAO,EAAE,oBAAoB,EAAE,MAAM,OAAO,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AACnC,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAC5F,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAiBvD,MAAM,UAAU,uBAAuB;IACrC,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,GAAG,UAAU,EAAE,CAAC;IAChD,MAAM,aAAa,GAAG,cAAc,EAAE,CAAC;IAGvC,MAAM,YAAY,GAAG,oBAAoB,CACvC,oBAAoB,EACpB,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,iBAAiB,EAAE,CAAC;AACjD,CAAC;AAED,SAAS,iBAAiB;IACxB,OAAO,KAAK,CAAC;AACf,CAAC","sourcesContent":["\"use client\";\n\nimport { useSyncExternalStore } from \"react\";\nimport { useAccount } from \"wagmi\";\nimport { isHostEmbedded, isValidSafeOrigin, subscribeSafeOrigins } from \"./safe-origins.js\";\nimport { useSafeContext } from \"./use-safe-context.js\";\n\n/**\n * Detect if the connected wallet is a Safe multisig.\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 `useSafeContext`.\n * - For a sync host-only check, use `useIsHostSafeMultisig`.\n */\nexport function useIsWalletSafeMultisig(): boolean {\n const { connector, isConnected } = useAccount();\n const isSafeContext = useSafeContext();\n\n // Method 3: Iframe origin fallback (may fail cross-origin)\n const isSafeIframe = useSyncExternalStore(\n subscribeSafeOrigins,\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() && isValidSafeOrigin();\n}\n\nfunction getServerSnapshot(): boolean {\n return false;\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-safe-context.d.ts","sourceRoot":"","sources":["../../src/react-hooks/use-safe-context.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"use-safe-context.d.ts","sourceRoot":"","sources":["../../src/react-hooks/use-safe-context.ts"],"names":[],"mappings":"AAuCA,wBAAgB,cAAc,IAAI,OAAO,CA6CxC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-safe-context.js","sourceRoot":"","sources":["../../src/react-hooks/use-safe-context.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAM5C,MAAM,gBAAgB,GAAG,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"use-safe-context.js","sourceRoot":"","sources":["../../src/react-hooks/use-safe-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,cAAc;IAC5B,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 `useIsHostSafeMultisig`.\n * - For a full wallet detection heuristic, use `useIsWalletSafeMultisig`.\n *\n * @example\n * ```tsx\n * function MyComponent() {\n * const isSafeContext = useSafeContext();\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 useSafeContext(): 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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"abis.d.ts","sourceRoot":"","sources":["../../../src/safe/simulation/abis.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"abis.d.ts","sourceRoot":"","sources":["../../../src/safe/simulation/abis.ts"],"names":[],"mappings":"AAkEA,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAIX,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"abis.js","sourceRoot":"","sources":["../../../src/safe/simulation/abis.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"abis.js","sourceRoot":"","sources":["../../../src/safe/simulation/abis.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,GAAG;IAClB;QACE,MAAM,EAAE,EAAE;QACV,IAAI,EAAE,WAAW;QACjB,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,EAAE;gBACR,IAAI,EAAE,WAAW;aAClB;SACF;QACD,eAAe,EAAE,MAAM;QACvB,IAAI,EAAE,UAAU;KACjB;IACD;QACE,MAAM,EAAE;YACN,EAAE,YAAY,EAAE,SAAS,EAAE,IAAI,EAAE,gBAAgB,EAAE,IAAI,EAAE,SAAS,EAAE;YACpE,EAAE,YAAY,EAAE,OAAO,EAAE,IAAI,EAAE,iBAAiB,EAAE,IAAI,EAAE,OAAO,EAAE;SAClE;QACD,IAAI,EAAE,mBAAmB;QACzB,OAAO,EAAE,EAAE;QACX,eAAe,EAAE,YAAY;QAC7B,IAAI,EAAE,UAAU;KACjB;CACO,CAAC;AAEX,MAAM,YAAY,GAAG;IACnB;QACE,MAAM,EAAE,CAAC,EAAE,YAAY,EAAE,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;QACxE,IAAI,EAAE,WAAW;QACjB,OAAO,EAAE,EAAE;QACX,eAAe,EAAE,SAAS;QAC1B,IAAI,EAAE,UAAU;KACjB;CACO,CAAC;AAEX,MAAM,mBAAmB,GAAG;IAC1B;QACE,MAAM,EAAE;YACN,EAAE,YAAY,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE;YACxD,EAAE,YAAY,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE;YAC3D,EAAE,YAAY,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE;YACtD;gBACE,YAAY,EAAE,qBAAqB;gBACnC,IAAI,EAAE,WAAW;gBACjB,IAAI,EAAE,OAAO;aACd;SACF;QACD,IAAI,EAAE,UAAU;QAChB,OAAO,EAAE;YACP,EAAE,YAAY,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,EAAE;YAC9D,EAAE,YAAY,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE;YACvD,EAAE,YAAY,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,OAAO,EAAE;SAC7D;QACD,eAAe,EAAE,YAAY;QAC7B,IAAI,EAAE,UAAU;KACjB;CACO,CAAC;AAEX,MAAM,CAAC,MAAM,QAAQ,GAAG;IACtB,SAAS,EAAE,YAAY;IACvB,QAAQ,EAAE,WAAW;IACrB,gBAAgB,EAAE,mBAAmB;CAC7B,CAAC","sourcesContent":["/**\n * Safe multisig ABIs for gas simulation and multi-send operations.\n *\n * @see https://github.com/safe-global/safe-deployments\n * @see https://github.com/safe-global/safe-core-sdk/issues/1182\n * @see https://ethereum.stackexchange.com/q/168410/24693\n */\n\nconst multisigAbi = [\n {\n inputs: [],\n name: \"getOwners\",\n outputs: [\n {\n name: \"\",\n type: \"address[]\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n { internalType: \"address\", name: \"targetContract\", type: \"address\" },\n { internalType: \"bytes\", name: \"calldataPayload\", type: \"bytes\" },\n ],\n name: \"simulateAndRevert\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n] as const;\n\nconst multiSendAbi = [\n {\n inputs: [{ internalType: \"bytes\", name: \"transactions\", type: \"bytes\" }],\n name: \"multiSend\",\n outputs: [],\n stateMutability: \"payable\",\n type: \"function\",\n },\n] as const;\n\nconst simulateAccessorAbi = [\n {\n inputs: [\n { internalType: \"address\", name: \"to\", type: \"address\" },\n { internalType: \"uint256\", name: \"value\", type: \"uint256\" },\n { internalType: \"bytes\", name: \"data\", type: \"bytes\" },\n {\n internalType: \"enum Enum.Operation\",\n name: \"operation\",\n type: \"uint8\",\n },\n ],\n name: \"simulate\",\n outputs: [\n { internalType: \"uint256\", name: \"estimate\", type: \"uint256\" },\n { internalType: \"bool\", name: \"success\", type: \"bool\" },\n { internalType: \"bytes\", name: \"returnData\", type: \"bytes\" },\n ],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n] as const;\n\nexport const safeAbis = {\n multiSend: multiSendAbi,\n multisig: multisigAbi,\n simulateAccessor: simulateAccessorAbi,\n} as const;\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"addresses.d.ts","sourceRoot":"","sources":["../../../src/safe/simulation/addresses.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"addresses.d.ts","sourceRoot":"","sources":["../../../src/safe/simulation/addresses.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAwEpC,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAmBxE;AAOD,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAmB/E"}
|
|
@@ -1,40 +1,54 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
1
|
+
import { abstract, arbitrum, avalanche, base, baseSepolia, berachain, blast, bsc, gnosis, lightlinkPhoenix, linea, mainnet, mode, monad, morph, optimism, polygon, scroll, sei, sepolia, sonic, unichainSepolia, xdc, zksync, } from "viem/chains";
|
|
2
|
+
const SAFE_MULTI_SEND_CHAIN_IDS = [
|
|
3
|
+
abstract.id,
|
|
4
|
+
arbitrum.id,
|
|
5
|
+
avalanche.id,
|
|
6
|
+
base.id,
|
|
7
|
+
baseSepolia.id,
|
|
8
|
+
berachain.id,
|
|
9
|
+
blast.id,
|
|
10
|
+
bsc.id,
|
|
11
|
+
gnosis.id,
|
|
12
|
+
lightlinkPhoenix.id,
|
|
13
|
+
linea.id,
|
|
14
|
+
mainnet.id,
|
|
15
|
+
mode.id,
|
|
16
|
+
monad.id,
|
|
17
|
+
morph.id,
|
|
18
|
+
optimism.id,
|
|
19
|
+
polygon.id,
|
|
20
|
+
scroll.id,
|
|
21
|
+
sei.id,
|
|
22
|
+
sepolia.id,
|
|
23
|
+
sonic.id,
|
|
24
|
+
unichainSepolia.id,
|
|
25
|
+
xdc.id,
|
|
26
|
+
zksync.id,
|
|
15
27
|
];
|
|
28
|
+
const ZK_ROLLUP_CHAIN_IDS = [abstract.id, zksync.id];
|
|
29
|
+
const CUSTOM_DEPLOYMENT_CHAIN_IDS = [lightlinkPhoenix.id, xdc.id];
|
|
16
30
|
export function getMultiSendAddress(chainId) {
|
|
31
|
+
if (!SAFE_MULTI_SEND_CHAIN_IDS.includes(chainId)) {
|
|
32
|
+
return undefined;
|
|
33
|
+
}
|
|
17
34
|
if (ZK_ROLLUP_CHAIN_IDS.includes(chainId)) {
|
|
18
|
-
return "
|
|
35
|
+
return "0xf220D3b4DFb23C4ade8C88E526C1353AbAcbC38F";
|
|
19
36
|
}
|
|
20
37
|
if (CUSTOM_DEPLOYMENT_CHAIN_IDS.includes(chainId)) {
|
|
21
|
-
return "
|
|
22
|
-
}
|
|
23
|
-
if (UNSUPPORTED_CHAIN_IDS.includes(chainId)) {
|
|
24
|
-
return undefined;
|
|
38
|
+
return "0x40A2aCCbd92BCA938b02010E17A5b8929b49130D";
|
|
25
39
|
}
|
|
26
|
-
return "
|
|
40
|
+
return "0x9641d764fc13c8B624c04430C7356C1C7C8102e2";
|
|
27
41
|
}
|
|
28
42
|
export function getSimulateAccessorAddress(chainId) {
|
|
43
|
+
if (!SAFE_MULTI_SEND_CHAIN_IDS.includes(chainId)) {
|
|
44
|
+
return undefined;
|
|
45
|
+
}
|
|
29
46
|
if (ZK_ROLLUP_CHAIN_IDS.includes(chainId)) {
|
|
30
|
-
return "
|
|
47
|
+
return "0x4191E2e12E8BC5002424CE0c51f9947b02675a44";
|
|
31
48
|
}
|
|
32
49
|
if (CUSTOM_DEPLOYMENT_CHAIN_IDS.includes(chainId)) {
|
|
33
|
-
return "
|
|
34
|
-
}
|
|
35
|
-
if (UNSUPPORTED_CHAIN_IDS.includes(chainId)) {
|
|
36
|
-
return undefined;
|
|
50
|
+
return "0x59AD6735bCd8152B84860Cb256dD9e96b85F69Da";
|
|
37
51
|
}
|
|
38
|
-
return "
|
|
52
|
+
return "0x3d4BA2E0884aa488718476ca2FB8Efc291A46199";
|
|
39
53
|
}
|
|
40
54
|
//# sourceMappingURL=addresses.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"addresses.js","sourceRoot":"","sources":["../../../src/safe/simulation/addresses.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"addresses.js","sourceRoot":"","sources":["../../../src/safe/simulation/addresses.ts"],"names":[],"mappings":"AAOA,OAAO,EACL,QAAQ,EACR,QAAQ,EACR,SAAS,EACT,IAAI,EACJ,WAAW,EACX,SAAS,EACT,KAAK,EACL,GAAG,EACH,MAAM,EACN,gBAAgB,EAChB,KAAK,EACL,OAAO,EACP,IAAI,EACJ,KAAK,EACL,KAAK,EACL,QAAQ,EACR,OAAO,EACP,MAAM,EACN,GAAG,EACH,OAAO,EACP,KAAK,EACL,eAAe,EACf,GAAG,EACH,MAAM,GACP,MAAM,aAAa,CAAC;AAQrB,MAAM,yBAAyB,GAAG;IAChC,QAAQ,CAAC,EAAE;IACX,QAAQ,CAAC,EAAE;IACX,SAAS,CAAC,EAAE;IACZ,IAAI,CAAC,EAAE;IACP,WAAW,CAAC,EAAE;IACd,SAAS,CAAC,EAAE;IACZ,KAAK,CAAC,EAAE;IACR,GAAG,CAAC,EAAE;IACN,MAAM,CAAC,EAAE;IACT,gBAAgB,CAAC,EAAE;IACnB,KAAK,CAAC,EAAE;IACR,OAAO,CAAC,EAAE;IACV,IAAI,CAAC,EAAE;IACP,KAAK,CAAC,EAAE;IACR,KAAK,CAAC,EAAE;IACR,QAAQ,CAAC,EAAE;IACX,OAAO,CAAC,EAAE;IACV,MAAM,CAAC,EAAE;IACT,GAAG,CAAC,EAAE;IACN,OAAO,CAAC,EAAE;IACV,KAAK,CAAC,EAAE;IACR,eAAe,CAAC,EAAE;IAClB,GAAG,CAAC,EAAE;IACN,MAAM,CAAC,EAAE;CACD,CAAC;AAGX,MAAM,mBAAmB,GAAG,CAAC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC,EAAE,CAAU,CAAC;AAG9D,MAAM,2BAA2B,GAAG,CAAC,gBAAgB,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,CAAU,CAAC;AAO3E,MAAM,UAAU,mBAAmB,CAAC,OAAe;IACjD,IAAI,CAAC,yBAAyB,CAAC,QAAQ,CAAC,OAAqD,CAAC,EAAE,CAAC;QAC/F,OAAO,SAAS,CAAC;IACnB,CAAC;IAGD,IAAI,mBAAmB,CAAC,QAAQ,CAAC,OAA+C,CAAC,EAAE,CAAC;QAClF,OAAO,4CAA4C,CAAC;IACtD,CAAC;IAGD,IACE,2BAA2B,CAAC,QAAQ,CAAC,OAAuD,CAAC,EAC7F,CAAC;QACD,OAAO,4CAA4C,CAAC;IACtD,CAAC;IAGD,OAAO,4CAA4C,CAAC;AACtD,CAAC;AAOD,MAAM,UAAU,0BAA0B,CAAC,OAAe;IACxD,IAAI,CAAC,yBAAyB,CAAC,QAAQ,CAAC,OAAqD,CAAC,EAAE,CAAC;QAC/F,OAAO,SAAS,CAAC;IACnB,CAAC;IAGD,IAAI,mBAAmB,CAAC,QAAQ,CAAC,OAA+C,CAAC,EAAE,CAAC;QAClF,OAAO,4CAA4C,CAAC;IACtD,CAAC;IAGD,IACE,2BAA2B,CAAC,QAAQ,CAAC,OAAuD,CAAC,EAC7F,CAAC;QACD,OAAO,4CAA4C,CAAC;IACtD,CAAC;IAGD,OAAO,4CAA4C,CAAC;AACtD,CAAC","sourcesContent":["/**\n * Safe contract addresses for gas simulation and multi-send operations.\n *\n * @see https://github.com/safe-global/safe-deployments/blob/main/src/assets/v1.4.1/multi_send_call_only.json\n * @see https://github.com/safe-global/safe-deployments/blob/main/src/assets/v1.4.1/simulate_tx_accessor.json\n */\nimport type { Address } from \"viem\";\nimport {\n abstract,\n arbitrum,\n avalanche,\n base,\n baseSepolia,\n berachain,\n blast,\n bsc,\n gnosis,\n lightlinkPhoenix,\n linea,\n mainnet,\n mode,\n monad,\n morph,\n optimism,\n polygon,\n scroll,\n sei,\n sepolia,\n sonic,\n unichainSepolia,\n xdc,\n zksync,\n} from \"viem/chains\";\n\n/**\n * Chain IDs for address resolution.\n * These are defined as constants for clarity and maintainability.\n */\n\n/** Chains where Safe MultiSend is available (sourced from old-ui) */\nconst SAFE_MULTI_SEND_CHAIN_IDS = [\n abstract.id,\n arbitrum.id,\n avalanche.id,\n base.id,\n baseSepolia.id,\n berachain.id,\n blast.id,\n bsc.id,\n gnosis.id,\n lightlinkPhoenix.id,\n linea.id,\n mainnet.id,\n mode.id,\n monad.id,\n morph.id,\n optimism.id,\n polygon.id,\n scroll.id,\n sei.id,\n sepolia.id,\n sonic.id,\n unichainSepolia.id,\n xdc.id,\n zksync.id,\n] as const;\n\n/** ZK rollups with custom Safe deployments */\nconst ZK_ROLLUP_CHAIN_IDS = [abstract.id, zksync.id] as const;\n\n/** Chains with custom (non-canonical) Safe deployments */\nconst CUSTOM_DEPLOYMENT_CHAIN_IDS = [lightlinkPhoenix.id, xdc.id] as const;\n\n/**\n * Get the MultiSend contract address for a given chain.\n *\n * Returns undefined for chains where Safe is not deployed.\n */\nexport function getMultiSendAddress(chainId: number): Address | undefined {\n if (!SAFE_MULTI_SEND_CHAIN_IDS.includes(chainId as (typeof SAFE_MULTI_SEND_CHAIN_IDS)[number])) {\n return undefined;\n }\n\n // ZK rollups with custom deployments (Abstract, ZKsync)\n if (ZK_ROLLUP_CHAIN_IDS.includes(chainId as (typeof ZK_ROLLUP_CHAIN_IDS)[number])) {\n return \"0xf220D3b4DFb23C4ade8C88E526C1353AbAcbC38F\";\n }\n\n // Chains with custom deployments (Lightlink, XDC)\n if (\n CUSTOM_DEPLOYMENT_CHAIN_IDS.includes(chainId as (typeof CUSTOM_DEPLOYMENT_CHAIN_IDS)[number])\n ) {\n return \"0x40A2aCCbd92BCA938b02010E17A5b8929b49130D\";\n }\n\n // Canonical deployment for all other chains\n return \"0x9641d764fc13c8B624c04430C7356C1C7C8102e2\";\n}\n\n/**\n * Get the SimulateAccessor contract address for a given chain.\n *\n * Returns undefined for chains where Safe is not deployed.\n */\nexport function getSimulateAccessorAddress(chainId: number): Address | undefined {\n if (!SAFE_MULTI_SEND_CHAIN_IDS.includes(chainId as (typeof SAFE_MULTI_SEND_CHAIN_IDS)[number])) {\n return undefined;\n }\n\n // ZK rollups with custom deployments (Abstract, ZKsync)\n if (ZK_ROLLUP_CHAIN_IDS.includes(chainId as (typeof ZK_ROLLUP_CHAIN_IDS)[number])) {\n return \"0x4191E2e12E8BC5002424CE0c51f9947b02675a44\";\n }\n\n // Chains with custom deployments (Lightlink, XDC)\n if (\n CUSTOM_DEPLOYMENT_CHAIN_IDS.includes(chainId as (typeof CUSTOM_DEPLOYMENT_CHAIN_IDS)[number])\n ) {\n return \"0x59AD6735bCd8152B84860Cb256dD9e96b85F69Da\";\n }\n\n // Canonical deployment for all other chains\n return \"0x3d4BA2E0884aa488718476ca2FB8Efc291A46199\";\n}\n"]}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { Hex } from "viem";
|
|
2
|
+
import type { SafeSimulateBatchParams } from "../../types.js";
|
|
3
|
+
import type { SafeContracts } from "../types/index.js";
|
|
4
|
+
export declare function buildSafeCalldata(contracts: SafeContracts, transactions: SafeSimulateBatchParams["transactions"]): Hex;
|
|
5
|
+
//# sourceMappingURL=calldata.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"calldata.d.ts","sourceRoot":"","sources":["../../../../../src/safe/simulation/internal/calldata/calldata.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,MAAM,CAAC;AAIhC,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;AAC9D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAKvD,wBAAgB,iBAAiB,CAC/B,SAAS,EAAE,aAAa,EACxB,YAAY,EAAE,uBAAuB,CAAC,cAAc,CAAC,GACpD,GAAG,CAcL"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { encodeFunctionData } from "viem";
|
|
2
|
+
import { safeAbis } from "../../abis.js";
|
|
3
|
+
import { encodeMultiSend } from "../../encoding.js";
|
|
4
|
+
export function buildSafeCalldata(contracts, transactions) {
|
|
5
|
+
const multiSendCalldata = encodeMultiSend(transactions);
|
|
6
|
+
const simulateAccessorCalldata = encodeFunctionData({
|
|
7
|
+
abi: safeAbis.simulateAccessor,
|
|
8
|
+
args: [contracts.multiSendAddr, 0n, multiSendCalldata, 1],
|
|
9
|
+
functionName: "simulate",
|
|
10
|
+
});
|
|
11
|
+
return encodeFunctionData({
|
|
12
|
+
abi: safeAbis.multisig,
|
|
13
|
+
args: [contracts.simulateAccessorAddr, simulateAccessorCalldata],
|
|
14
|
+
functionName: "simulateAndRevert",
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=calldata.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"calldata.js","sourceRoot":"","sources":["../../../../../src/safe/simulation/internal/calldata/calldata.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,kBAAkB,EAAE,MAAM,MAAM,CAAC;AAC1C,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAOpD,MAAM,UAAU,iBAAiB,CAC/B,SAAwB,EACxB,YAAqD;IAErD,MAAM,iBAAiB,GAAG,eAAe,CAAC,YAAY,CAAC,CAAC;IAExD,MAAM,wBAAwB,GAAG,kBAAkB,CAAC;QAClD,GAAG,EAAE,QAAQ,CAAC,gBAAgB;QAC9B,IAAI,EAAE,CAAC,SAAS,CAAC,aAAa,EAAE,EAAE,EAAE,iBAAiB,EAAE,CAAC,CAAC;QACzD,YAAY,EAAE,UAAU;KACzB,CAAC,CAAC;IAEH,OAAO,kBAAkB,CAAC;QACxB,GAAG,EAAE,QAAQ,CAAC,QAAQ;QACtB,IAAI,EAAE,CAAC,SAAS,CAAC,oBAAoB,EAAE,wBAAwB,CAAC;QAChE,YAAY,EAAE,mBAAmB;KAClC,CAAC,CAAC;AACL,CAAC","sourcesContent":["/**\n * Calldata construction utilities for Safe simulation.\n */\nimport type { Hex } from \"viem\";\nimport { encodeFunctionData } from \"viem\";\nimport { safeAbis } from \"../../abis.js\";\nimport { encodeMultiSend } from \"../../encoding.js\";\nimport type { SafeSimulateBatchParams } from \"../../types.js\";\nimport type { SafeContracts } from \"../types/index.js\";\n\n/**\n * Build the final simulateAndRevert calldata for Safe.\n */\nexport function buildSafeCalldata(\n contracts: SafeContracts,\n transactions: SafeSimulateBatchParams[\"transactions\"]\n): Hex {\n const multiSendCalldata = encodeMultiSend(transactions);\n\n const simulateAccessorCalldata = encodeFunctionData({\n abi: safeAbis.simulateAccessor,\n args: [contracts.multiSendAddr, 0n, multiSendCalldata, 1], // 1 = DelegateCall\n functionName: \"simulate\",\n });\n\n return encodeFunctionData({\n abi: safeAbis.multisig,\n args: [contracts.simulateAccessorAddr, simulateAccessorCalldata],\n functionName: \"simulateAndRevert\",\n });\n}\n"]}
|