@rango-dev/provider-safe 0.0.0-experimental-936229e8-20251208

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md ADDED
@@ -0,0 +1,198 @@
1
+ # [0.48.0](https://github.com/rango-exchange/rango-client/compare/provider-safe@0.47.1...provider-safe@0.48.0) (2025-12-02)
2
+
3
+
4
+
5
+ ## [0.47.1](https://github.com/rango-exchange/rango-client/compare/provider-safe@0.47.0...provider-safe@0.47.1) (2025-11-22)
6
+
7
+
8
+
9
+ # [0.45.0](https://github.com/rango-exchange/rango-client/compare/provider-safe@0.44.0...provider-safe@0.45.0) (2025-10-29)
10
+
11
+
12
+
13
+ # [0.44.0](https://github.com/rango-exchange/rango-client/compare/provider-safe@0.43.0...provider-safe@0.44.0) (2025-09-29)
14
+
15
+
16
+
17
+ # [0.43.0](https://github.com/rango-exchange/rango-client/compare/provider-safe@0.42.0...provider-safe@0.43.0) (2025-09-06)
18
+
19
+
20
+
21
+ # [0.42.0](https://github.com/rango-exchange/rango-client/compare/provider-safe@0.41.0...provider-safe@0.42.0) (2025-08-19)
22
+
23
+
24
+ ### Bug Fixes
25
+
26
+ * add rango-dev/wallets-core to dependencies of providers ([84b4b2b](https://github.com/rango-exchange/rango-client/commit/84b4b2b7c3a7f5631228fb6ebf04617c3c4428e9))
27
+ * remove retry dynamic import and throw refined error on dynamic import failure ([a2944ac](https://github.com/rango-exchange/rango-client/commit/a2944ac3c05a0e945f6e5621fa5693ab89625485))
28
+
29
+
30
+ ### Features
31
+
32
+ * implement retry mechanism for lazy imports ([9a8e191](https://github.com/rango-exchange/rango-client/commit/9a8e191711d2319990ca4d0613e8188a5f86842f))
33
+
34
+
35
+
36
+ # [0.41.0](https://github.com/rango-exchange/rango-client/compare/provider-safe@0.40.0...provider-safe@0.41.0) (2025-08-05)
37
+
38
+
39
+
40
+ # [0.40.0](https://github.com/rango-exchange/rango-client/compare/provider-safe@0.39.0...provider-safe@0.40.0) (2025-07-22)
41
+
42
+
43
+ ### Reverts
44
+
45
+ * Revert "chore(release): publish" ([064ce15](https://github.com/rango-exchange/rango-client/commit/064ce157a2f819856f647f83aeb1c0410542e8d7))
46
+
47
+
48
+
49
+ # [0.38.0](https://github.com/rango-exchange/rango-client/compare/provider-safe@0.37.1...provider-safe@0.38.0) (2025-06-09)
50
+
51
+
52
+
53
+ ## [0.37.1](https://github.com/rango-exchange/rango-client/compare/provider-safe@0.37.0...provider-safe@0.37.1) (2025-05-04)
54
+
55
+
56
+
57
+ # [0.37.0](https://github.com/rango-exchange/rango-client/compare/provider-safe@0.36.0...provider-safe@0.37.0) (2025-04-30)
58
+
59
+
60
+ ### Bug Fixes
61
+
62
+ * rename pbt to ptb for sui ([3d6d89f](https://github.com/rango-exchange/rango-client/commit/3d6d89f2265766607a15d61e0df92643fb33072b))
63
+
64
+
65
+ ### Features
66
+
67
+ * update sui to consider recent api changes ([d764b25](https://github.com/rango-exchange/rango-client/commit/d764b2501df9bb295f63cdbc0b05acd4a3abb4b9))
68
+
69
+
70
+
71
+ # [0.36.0](https://github.com/rango-exchange/rango-client/compare/provider-safe@0.35.0...provider-safe@0.36.0) (2025-03-11)
72
+
73
+
74
+
75
+ # [0.35.0](https://github.com/rango-exchange/rango-client/compare/provider-safe@0.34.0...provider-safe@0.35.0) (2025-02-23)
76
+
77
+
78
+
79
+ # [0.34.0](https://github.com/rango-exchange/rango-client/compare/provider-safe@0.33.0...provider-safe@0.34.0) (2024-12-30)
80
+
81
+
82
+
83
+ # [0.33.0](https://github.com/rango-exchange/rango-client/compare/provider-safe@0.32.0...provider-safe@0.33.0) (2024-11-27)
84
+
85
+
86
+
87
+ # [0.32.0](https://github.com/rango-exchange/rango-client/compare/provider-safe@0.31.0...provider-safe@0.32.0) (2024-11-12)
88
+
89
+
90
+
91
+ # [0.31.0](https://github.com/rango-exchange/rango-client/compare/provider-safe@0.30.0...provider-safe@0.31.0) (2024-10-12)
92
+
93
+
94
+ ### Bug Fixes
95
+
96
+ * bump sdk and fix type issues ([d442208](https://github.com/rango-exchange/rango-client/commit/d4422083bf5dd27d5f509ce1db7f9560d05428c8))
97
+
98
+
99
+ ### Performance Improvements
100
+
101
+ * enable code splitting in build process ([fe5a41e](https://github.com/rango-exchange/rango-client/commit/fe5a41e0e297298de11cd74ca5825544742aa03a))
102
+ * lazy load signer packages ([7b88f18](https://github.com/rango-exchange/rango-client/commit/7b88f1834f7b29b4b81ab6c81a07bb88e8ccf55c))
103
+
104
+
105
+
106
+ # [0.30.0](https://github.com/rango-exchange/rango-client/compare/provider-safe@0.29.0...provider-safe@0.30.0) (2024-09-10)
107
+
108
+
109
+
110
+ # [0.29.0](https://github.com/rango-exchange/rango-client/compare/provider-safe@0.28.1...provider-safe@0.29.0) (2024-08-11)
111
+
112
+
113
+
114
+ ## [0.28.1](https://github.com/rango-exchange/rango-client/compare/provider-safe@0.28.0...provider-safe@0.28.1) (2024-07-14)
115
+
116
+
117
+
118
+ # [0.28.0](https://github.com/rango-exchange/rango-client/compare/provider-safe@0.26.2...provider-safe@0.28.0) (2024-07-09)
119
+
120
+
121
+
122
+ # [0.27.0](https://github.com/rango-exchange/rango-client/compare/provider-safe@0.26.2...provider-safe@0.27.0) (2024-06-01)
123
+
124
+
125
+
126
+ ## [0.26.2](https://github.com/rango-exchange/rango-client/compare/provider-safe@0.26.1...provider-safe@0.26.2) (2024-05-26)
127
+
128
+
129
+
130
+ ## [0.26.1](https://github.com/rango-exchange/rango-client/compare/provider-safe@0.26.0...provider-safe@0.26.1) (2024-05-25)
131
+
132
+
133
+
134
+ # [0.26.0](https://github.com/rango-exchange/rango-client/compare/provider-safe@0.25.0...provider-safe@0.26.0) (2024-05-14)
135
+
136
+
137
+
138
+ # [0.25.0](https://github.com/rango-exchange/rango-client/compare/provider-safe@0.24.0...provider-safe@0.25.0) (2024-04-24)
139
+
140
+
141
+
142
+ # [0.24.0](https://github.com/rango-exchange/rango-client/compare/provider-safe@0.23.0...provider-safe@0.24.0) (2024-04-23)
143
+
144
+
145
+
146
+ # [0.23.0](https://github.com/rango-exchange/rango-client/compare/provider-safe@0.22.0...provider-safe@0.23.0) (2024-04-09)
147
+
148
+
149
+
150
+ # [0.22.0](https://github.com/rango-exchange/rango-client/compare/provider-safe@0.21.0...provider-safe@0.22.0) (2024-03-12)
151
+
152
+
153
+
154
+ # [0.21.0](https://github.com/rango-exchange/rango-client/compare/provider-safe@0.20.0...provider-safe@0.21.0) (2024-02-20)
155
+
156
+
157
+
158
+ # [0.20.0](https://github.com/rango-exchange/rango-client/compare/provider-safe@0.19.0...provider-safe@0.20.0) (2024-02-07)
159
+
160
+
161
+
162
+ # [0.19.0](https://github.com/rango-exchange/rango-client/compare/provider-safe@0.18.0...provider-safe@0.19.0) (2024-01-22)
163
+
164
+
165
+ ### Bug Fixes
166
+
167
+ * cleanup wallets' subscriber when setProvider get null ([88d6a42](https://github.com/rango-exchange/rango-client/commit/88d6a423c49b34b3d9ff567e22df36c3b009bb76))
168
+
169
+
170
+
171
+ # [0.18.0](https://github.com/rango-exchange/rango-client/compare/provider-safe@0.16.0...provider-safe@0.18.0) (2023-12-24)
172
+
173
+
174
+ ### Bug Fixes
175
+
176
+ * display transaction url after refreshing ([c976bff](https://github.com/rango-exchange/rango-client/commit/c976bffd3827ee20de5dd0f21be6d430432fff28))
177
+ * fix HMR for widget and playground ([8524820](https://github.com/rango-exchange/rango-client/commit/8524820f10cf0b8921f3db0c4f620ff98daa4103))
178
+ * handle safe wallet in widget ([52fcca4](https://github.com/rango-exchange/rango-client/commit/52fcca49315f7e2edb4655ae7b9cd0792c2800d7))
179
+
180
+
181
+
182
+ # [0.7.0](https://github.com/rango-exchange/rango-client/compare/provider-safe@0.6.0...provider-safe@0.7.0) (2023-08-03)
183
+
184
+
185
+
186
+ # [0.6.0](https://github.com/rango-exchange/rango-client/compare/provider-safe@0.5.0...provider-safe@0.6.0) (2023-08-01)
187
+
188
+
189
+
190
+ # 0.2.0 (2023-07-31)
191
+
192
+
193
+ ### Features
194
+
195
+ * support safe wallet ([d04cbcd](https://github.com/rango-exchange/rango-client/commit/d04cbcd2a612755563512d9dff6f2312088d8b4d))
196
+
197
+
198
+
@@ -0,0 +1,2 @@
1
+ var i=Object.defineProperty;var o=(n,e)=>i(n,"name",{value:e,configurable:!0});import{SafeAppProvider as u}from"@safe-global/safe-apps-provider";import t from"@safe-global/safe-apps-sdk";var p={debug:!1},a=t;typeof t!="function"&&typeof t.default=="function"&&(a=t.default);var f=new a(p);async function d(){let e=await Promise.race([f.safe.getInfo(),new Promise(s=>setTimeout(s,200))]);return e?new u(e,f):null}o(d,"getSafeInstance");export{o as a,f as b,d as c};
2
+ //# sourceMappingURL=chunk-5CP7BBMP.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/helpers.ts"],
4
+ "sourcesContent": ["import { SafeAppProvider } from '@safe-global/safe-apps-provider';\nimport SafeAppsSDK from '@safe-global/safe-apps-sdk';\n\nconst options = {\n debug: false,\n};\n\n/*\n * similar to:\n * https://github.com/wagmi-dev/references/pull/114\n */\nlet SDK = SafeAppsSDK;\nif (\n typeof SafeAppsSDK !== 'function' &&\n // @ts-expect-error This import error is not visible to TypeScript\n typeof SafeAppsSDK.default === 'function'\n) {\n SDK = (SafeAppsSDK as unknown as { default: typeof SafeAppsSDK }).default;\n}\nexport const sdk = new SDK(options);\n\nexport async function getSafeInstance(): Promise<any> {\n const timeout = 200;\n const accountInfo = await Promise.race([\n sdk.safe.getInfo(),\n new Promise<undefined>((resolve) => setTimeout(resolve, timeout)),\n ]);\n return accountInfo ? new SafeAppProvider(accountInfo, sdk as any) : null;\n}\n"],
5
+ "mappings": "+EAAA,OAAS,mBAAAA,MAAuB,kCAChC,OAAOC,MAAiB,6BAExB,IAAMC,EAAU,CACd,MAAO,EACT,EAMIC,EAAMC,EAER,OAAOA,GAAgB,YAEvB,OAAOA,EAAY,SAAY,aAE/BD,EAAOC,EAA2D,SAE7D,IAAMC,EAAM,IAAIF,EAAID,CAAO,EAElC,eAAsBI,GAAgC,CAEpD,IAAMC,EAAc,MAAM,QAAQ,KAAK,CACrCF,EAAI,KAAK,QAAQ,EACjB,IAAI,QAAoBG,GAAY,WAAWA,EAAS,GAAO,CAAC,CAClE,CAAC,EACD,OAAOD,EAAc,IAAIE,EAAgBF,EAAaF,CAAU,EAAI,IACtE,CAPsBK,EAAAJ,EAAA",
6
+ "names": ["SafeAppProvider", "SafeAppsSDK", "options", "SDK", "SafeAppsSDK", "sdk", "getSafeInstance", "accountInfo", "resolve", "SafeAppProvider", "__name"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{a as i,b as r}from"./chunk-5CP7BBMP.js";import{DefaultEvmSigner as c,waitMs as h}from"@rango-dev/signer-evm";import{TransactionStatus as o}from"@safe-global/safe-apps-sdk";async function m(e){let s;for(;!s;)try{let t=await r.txs.getBySafeTxHash(e);t.txStatus===o.AWAITING_CONFIRMATIONS||t.txStatus===o.AWAITING_EXECUTION?await h(5e3):t.txHash&&(s=t.txHash)}catch{s=e}return{txHash:s}}i(m,"getTxHash");var g=class{static{i(this,"CustomEvmSigner")}signer;constructor(s){this.signer=new c(s)}async signMessage(s){let{signature:n}=await r.txs.signMessage(s);return n}async signAndSendTx(s,n,t){let{hash:a,response:p}=await this.signer.signAndSendTx(s,n,t);return{hash:a,response:{...p,hashRequiringUpdate:!0}}}async wait(s,n,t){let{txHash:a}=await m(s);return{hash:a,response:t,chainId:n}}};export{g as CustomEvmSigner,m as getTxHash};
2
+ //# sourceMappingURL=evm-TZ6OXXGG.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/signers/evm.ts"],
4
+ "sourcesContent": ["import type { OffChainSignMessageResponse } from '@safe-global/safe-apps-sdk';\nimport type { TransactionResponse } from 'ethers';\nimport type { GenericSigner } from 'rango-types';\nimport type { EvmTransaction } from 'rango-types/mainApi';\n\nimport { DefaultEvmSigner, waitMs } from '@rango-dev/signer-evm';\nimport { TransactionStatus } from '@safe-global/safe-apps-sdk';\n\nimport { sdk } from '../helpers.js';\n\nexport async function getTxHash(safeHash: string): Promise<{ txHash: string }> {\n let txHash;\n const timeout = 5_000;\n\n while (!txHash) {\n try {\n /** The SDK will be pinged until a txHash is available and the txStatus is in an end-state */\n const queued = await sdk.txs.getBySafeTxHash(safeHash);\n if (\n queued.txStatus === TransactionStatus.AWAITING_CONFIRMATIONS ||\n queued.txStatus === TransactionStatus.AWAITING_EXECUTION\n ) {\n /** Mimic a status watcher by checking once every 5 seconds */\n await waitMs(timeout);\n } else if (queued.txHash) {\n /** The txStatus is in an end-state (e.g. success) so we probably have a valid, on chain txHash*/\n txHash = queued.txHash;\n }\n } catch {\n txHash = safeHash;\n }\n }\n return { txHash };\n}\n\nexport class CustomEvmSigner implements GenericSigner<EvmTransaction> {\n private signer;\n\n constructor(provider: any) {\n this.signer = new DefaultEvmSigner(provider);\n }\n\n async signMessage(msg: string): Promise<string> {\n const { signature } = (await sdk.txs.signMessage(\n msg\n )) as OffChainSignMessageResponse & { signature: string };\n\n return signature;\n }\n\n async signAndSendTx(\n tx: EvmTransaction,\n address: string,\n chainId: string | null\n ): Promise<{\n hash: string;\n response: Partial<TransactionResponse> & { hashRequiringUpdate: boolean };\n }> {\n const { hash, response } = await this.signer.signAndSendTx(\n tx,\n address,\n chainId\n );\n return {\n hash,\n response: { ...response, hashRequiringUpdate: true },\n };\n }\n\n async wait(\n safeHash: string,\n chainId: string,\n response: TransactionResponse\n ): Promise<{\n hash: string;\n response: TransactionResponse;\n chainId: string;\n }> {\n const { txHash: hash } = await getTxHash(safeHash);\n return {\n hash,\n response,\n chainId,\n };\n }\n}\n"],
5
+ "mappings": "+CAKA,OAAS,oBAAAA,EAAkB,UAAAC,MAAc,wBACzC,OAAS,qBAAAC,MAAyB,6BAIlC,eAAsBC,EAAUC,EAA+C,CAC7E,IAAIC,EAGJ,KAAO,CAACA,GACN,GAAI,CAEF,IAAMC,EAAS,MAAMC,EAAI,IAAI,gBAAgBH,CAAQ,EAEnDE,EAAO,WAAaE,EAAkB,wBACtCF,EAAO,WAAaE,EAAkB,mBAGtC,MAAMC,EAAO,GAAO,EACXH,EAAO,SAEhBD,EAASC,EAAO,OAEpB,MAAQ,CACND,EAASD,CACX,CAEF,MAAO,CAAE,OAAAC,CAAO,CAClB,CAvBsBK,EAAAP,EAAA,aAyBf,IAAMQ,EAAN,KAA+D,CAnCtE,MAmCsE,CAAAD,EAAA,wBAC5D,OAER,YAAYE,EAAe,CACzB,KAAK,OAAS,IAAIC,EAAiBD,CAAQ,CAC7C,CAEA,MAAM,YAAYE,EAA8B,CAC9C,GAAM,CAAE,UAAAC,CAAU,EAAK,MAAMR,EAAI,IAAI,YACnCO,CACF,EAEA,OAAOC,CACT,CAEA,MAAM,cACJC,EACAC,EACAC,EAIC,CACD,GAAM,CAAE,KAAAC,EAAM,SAAAC,CAAS,EAAI,MAAM,KAAK,OAAO,cAC3CJ,EACAC,EACAC,CACF,EACA,MAAO,CACL,KAAAC,EACA,SAAU,CAAE,GAAGC,EAAU,oBAAqB,EAAK,CACrD,CACF,CAEA,MAAM,KACJhB,EACAc,EACAE,EAKC,CACD,GAAM,CAAE,OAAQD,CAAK,EAAI,MAAMhB,EAAUC,CAAQ,EACjD,MAAO,CACL,KAAAe,EACA,SAAAC,EACA,QAAAF,CACF,CACF,CACF",
6
+ "names": ["DefaultEvmSigner", "waitMs", "TransactionStatus", "getTxHash", "safeHash", "txHash", "queued", "sdk", "TransactionStatus", "waitMs", "__name", "CustomEvmSigner", "provider", "DefaultEvmSigner", "msg", "signature", "tx", "address", "chainId", "hash", "response"]
7
+ }
@@ -0,0 +1,3 @@
1
+ import SafeAppsSDK from '@safe-global/safe-apps-sdk';
2
+ export declare const sdk: SafeAppsSDK;
3
+ export declare function getSafeInstance(): Promise<any>;
@@ -0,0 +1,15 @@
1
+ import type { CanEagerConnect, CanSwitchNetwork, Connect, GetInstance, Subscribe, SwitchNetwork, WalletInfo } from '@rango-dev/wallets-shared';
2
+ import type { BlockchainMeta, SignerFactory } from 'rango-types';
3
+ import { WalletTypes } from '@rango-dev/wallets-shared';
4
+ export declare const config: {
5
+ type: WalletTypes;
6
+ isAsyncInstance: boolean;
7
+ };
8
+ export declare const getInstance: GetInstance;
9
+ export declare const connect: Connect;
10
+ export declare const subscribe: Subscribe;
11
+ export declare const switchNetwork: SwitchNetwork;
12
+ export declare const canSwitchNetworkTo: CanSwitchNetwork;
13
+ export declare const getSigners: (provider: any) => Promise<SignerFactory>;
14
+ export declare const canEagerConnect: CanEagerConnect;
15
+ export declare const getWalletInfo: (allBlockChains: BlockchainMeta[]) => WalletInfo;
package/dist/index.js ADDED
@@ -0,0 +1,2 @@
1
+ import{a as o,c}from"./chunk-5CP7BBMP.js";import{canEagerlyConnectToEvm as h,canSwitchNetworkToEvm as y,subscribeToEvm as u,switchNetworkForEvm as S,WalletTypes as v}from"@rango-dev/wallets-shared";import{evmBlockchains as k,isEvmBlockchain as E}from"rango-types";import{dynamicImportWithRefinedError as g}from"@rango-dev/wallets-shared";import{DefaultSignerFactory as f,TransactionType as w}from"rango-types";async function r(t){let e=new f,{CustomEvmSigner:n}=await g(async()=>await import("./evm-TZ6OXXGG.js"));return e.registerSigner(w.EVM,new n(t)),e}o(r,"getSigners");var C=v.SAFE,A={type:C,isAsyncInstance:!0},B=o(async()=>await c(),"getInstance"),P=o(async({instance:t})=>{let e=await t.request({method:"eth_accounts"}),{chainId:n}=t;return{accounts:e,chainId:n}},"connect"),L=o(({instance:t,state:e,updateChainId:n,updateAccounts:s,meta:i,connect:m,disconnect:p})=>{let l=i.filter(E),a=u({instance:t,state:e,updateChainId:n,updateAccounts:s,meta:l,connect:m,disconnect:p});return()=>{a&&a()}},"subscribe"),M=S,D=y,G=r,q=h,R=o(t=>{let e=k(t);return{name:"Safe",img:"https://raw.githubusercontent.com/rango-exchange/assets/main/wallets/safe/icon.svg",installLink:{DEFAULT:"https://app.safe.global/"},color:"#ffffff",supportedChains:e,isContractWallet:!0}},"getWalletInfo");export{q as canEagerConnect,D as canSwitchNetworkTo,A as config,P as connect,B as getInstance,G as getSigners,R as getWalletInfo,L as subscribe,M as switchNetwork};
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/index.ts", "../src/signer.ts"],
4
+ "sourcesContent": ["import type {\n CanEagerConnect,\n CanSwitchNetwork,\n Connect,\n GetInstance,\n Subscribe,\n SwitchNetwork,\n WalletInfo,\n} from '@rango-dev/wallets-shared';\nimport type { BlockchainMeta, SignerFactory } from 'rango-types';\n\nimport {\n canEagerlyConnectToEvm,\n canSwitchNetworkToEvm,\n subscribeToEvm,\n switchNetworkForEvm,\n WalletTypes,\n} from '@rango-dev/wallets-shared';\nimport { evmBlockchains, isEvmBlockchain } from 'rango-types';\n\nimport { getSafeInstance } from './helpers.js';\nimport signer from './signer.js';\n\nconst WALLET = WalletTypes.SAFE;\n\nexport const config = {\n type: WALLET,\n isAsyncInstance: true,\n};\n\nexport const getInstance: GetInstance = async () => {\n return await getSafeInstance();\n};\n\nexport const connect: Connect = async ({ instance }) => {\n const accounts = await instance.request({\n method: 'eth_accounts',\n });\n\n const { chainId } = instance;\n\n return { accounts, chainId };\n};\n\nexport const subscribe: Subscribe = ({\n instance,\n state,\n updateChainId,\n updateAccounts,\n meta,\n connect,\n disconnect,\n}) => {\n const evmBlockchainMeta = meta.filter(isEvmBlockchain);\n\n const cleanup = subscribeToEvm({\n instance,\n state,\n updateChainId,\n updateAccounts,\n meta: evmBlockchainMeta,\n connect,\n disconnect,\n });\n return () => {\n if (cleanup) {\n cleanup();\n }\n };\n};\n\nexport const switchNetwork: SwitchNetwork = switchNetworkForEvm;\n\nexport const canSwitchNetworkTo: CanSwitchNetwork = canSwitchNetworkToEvm;\n\nexport const getSigners: (provider: any) => Promise<SignerFactory> = signer;\n\nexport const canEagerConnect: CanEagerConnect = canEagerlyConnectToEvm;\n\nexport const getWalletInfo: (allBlockChains: BlockchainMeta[]) => WalletInfo = (\n allBlockChains\n) => {\n const evms = evmBlockchains(allBlockChains);\n return {\n name: 'Safe',\n img: 'https://raw.githubusercontent.com/rango-exchange/assets/main/wallets/safe/icon.svg',\n installLink: {\n DEFAULT: 'https://app.safe.global/',\n },\n color: '#ffffff',\n supportedChains: evms,\n isContractWallet: true,\n };\n};\n", "import type { ProviderAPI } from '@rango-dev/wallets-core/namespaces/evm';\nimport type { SignerFactory } from 'rango-types';\n\nimport { dynamicImportWithRefinedError } from '@rango-dev/wallets-shared';\nimport { DefaultSignerFactory, TransactionType as TxType } from 'rango-types';\n\nexport default async function getSigners(\n provider: ProviderAPI\n): Promise<SignerFactory> {\n const signers = new DefaultSignerFactory();\n const { CustomEvmSigner } = await dynamicImportWithRefinedError(\n async () => await import('./signers/evm.js')\n );\n signers.registerSigner(TxType.EVM, new CustomEvmSigner(provider));\n\n return signers;\n}\n"],
5
+ "mappings": "0CAWA,OACE,0BAAAA,EACA,yBAAAC,EACA,kBAAAC,EACA,uBAAAC,EACA,eAAAC,MACK,4BACP,OAAS,kBAAAC,EAAgB,mBAAAC,MAAuB,cCfhD,OAAS,iCAAAC,MAAqC,4BAC9C,OAAS,wBAAAC,EAAsB,mBAAmBC,MAAc,cAEhE,eAAOC,EACLC,EACwB,CACxB,IAAMC,EAAU,IAAIC,EACd,CAAE,gBAAAC,CAAgB,EAAI,MAAMC,EAChC,SAAY,KAAM,QAAO,mBAAkB,CAC7C,EACA,OAAAH,EAAQ,eAAeI,EAAO,IAAK,IAAIF,EAAgBH,CAAQ,CAAC,EAEzDC,CACT,CAV8BK,EAAAP,EAAA,cDiB9B,IAAMQ,EAASC,EAAY,KAEdC,EAAS,CACpB,KAAMF,EACN,gBAAiB,EACnB,EAEaG,EAA2BC,EAAA,SAC/B,MAAMC,EAAgB,EADS,eAI3BC,EAAmBF,EAAA,MAAO,CAAE,SAAAG,CAAS,IAAM,CACtD,IAAMC,EAAW,MAAMD,EAAS,QAAQ,CACtC,OAAQ,cACV,CAAC,EAEK,CAAE,QAAAE,CAAQ,EAAIF,EAEpB,MAAO,CAAE,SAAAC,EAAU,QAAAC,CAAQ,CAC7B,EARgC,WAUnBC,EAAuBN,EAAA,CAAC,CACnC,SAAAG,EACA,MAAAI,EACA,cAAAC,EACA,eAAAC,EACA,KAAAC,EACA,QAAAR,EACA,WAAAS,CACF,IAAM,CACJ,IAAMC,EAAoBF,EAAK,OAAOG,CAAe,EAE/CC,EAAUC,EAAe,CAC7B,SAAAZ,EACA,MAAAI,EACA,cAAAC,EACA,eAAAC,EACA,KAAMG,EACN,QAAAV,EACA,WAAAS,CACF,CAAC,EACD,MAAO,IAAM,CACPG,GACFA,EAAQ,CAEZ,CACF,EAzBoC,aA2BvBE,EAA+BC,EAE/BC,EAAuCC,EAEvCC,EAAwDA,EAExDC,EAAmCC,EAEnCC,EAAkEvB,EAC7EwB,GACG,CACH,IAAMC,EAAOC,EAAeF,CAAc,EAC1C,MAAO,CACL,KAAM,OACN,IAAK,qFACL,YAAa,CACX,QAAS,0BACX,EACA,MAAO,UACP,gBAAiBC,EACjB,iBAAkB,EACpB,CACF,EAd+E",
6
+ "names": ["canEagerlyConnectToEvm", "canSwitchNetworkToEvm", "subscribeToEvm", "switchNetworkForEvm", "WalletTypes", "evmBlockchains", "isEvmBlockchain", "dynamicImportWithRefinedError", "DefaultSignerFactory", "TxType", "getSigners", "provider", "signers", "DefaultSignerFactory", "CustomEvmSigner", "dynamicImportWithRefinedError", "TxType", "__name", "WALLET", "WalletTypes", "config", "getInstance", "__name", "getSafeInstance", "connect", "instance", "accounts", "chainId", "subscribe", "state", "updateChainId", "updateAccounts", "meta", "disconnect", "evmBlockchainMeta", "isEvmBlockchain", "cleanup", "subscribeToEvm", "switchNetwork", "switchNetworkForEvm", "canSwitchNetworkTo", "canSwitchNetworkToEvm", "getSigners", "canEagerConnect", "canEagerlyConnectToEvm", "getWalletInfo", "allBlockChains", "evms", "evmBlockchains"]
7
+ }
@@ -0,0 +1 @@
1
+ {"inputs":{"src/helpers.ts":{"bytes":836,"imports":[{"path":"@safe-global/safe-apps-provider","kind":"import-statement","external":true},{"path":"@safe-global/safe-apps-sdk","kind":"import-statement","external":true},{"path":"<runtime>","kind":"import-statement","external":true}],"format":"esm"},"src/signers/evm.ts":{"bytes":2352,"imports":[{"path":"@rango-dev/signer-evm","kind":"import-statement","external":true},{"path":"@safe-global/safe-apps-sdk","kind":"import-statement","external":true},{"path":"src/helpers.ts","kind":"import-statement","original":"../helpers.js"},{"path":"<runtime>","kind":"import-statement","external":true}],"format":"esm"},"src/signer.ts":{"bytes":632,"imports":[{"path":"@rango-dev/wallets-shared","kind":"import-statement","external":true},{"path":"rango-types","kind":"import-statement","external":true},{"path":"src/signers/evm.ts","kind":"dynamic-import","original":"./signers/evm.js"},{"path":"<runtime>","kind":"import-statement","external":true}],"format":"esm"},"src/index.ts":{"bytes":2075,"imports":[{"path":"@rango-dev/wallets-shared","kind":"import-statement","external":true},{"path":"rango-types","kind":"import-statement","external":true},{"path":"src/helpers.ts","kind":"import-statement","original":"./helpers.js"},{"path":"src/signer.ts","kind":"import-statement","original":"./signer.js"},{"path":"<runtime>","kind":"import-statement","external":true}],"format":"esm"}},"outputs":{"dist/index.js.map":{"imports":[],"exports":[],"inputs":{},"bytes":4951},"dist/index.js":{"imports":[{"path":"dist/chunk-5CP7BBMP.js","kind":"import-statement"},{"path":"@rango-dev/wallets-shared","kind":"import-statement","external":true},{"path":"rango-types","kind":"import-statement","external":true},{"path":"@rango-dev/wallets-shared","kind":"import-statement","external":true},{"path":"rango-types","kind":"import-statement","external":true},{"path":"dist/evm-TZ6OXXGG.js","kind":"dynamic-import"}],"exports":["canEagerConnect","canSwitchNetworkTo","config","connect","getInstance","getSigners","getWalletInfo","subscribe","switchNetwork"],"entryPoint":"src/index.ts","inputs":{"src/index.ts":{"bytesInOutput":928},"src/signer.ts":{"bytesInOutput":310}},"bytes":1479},"dist/evm-TZ6OXXGG.js.map":{"imports":[],"exports":[],"inputs":{},"bytes":3700},"dist/evm-TZ6OXXGG.js":{"imports":[{"path":"dist/chunk-5CP7BBMP.js","kind":"import-statement"},{"path":"@rango-dev/signer-evm","kind":"import-statement","external":true},{"path":"@safe-global/safe-apps-sdk","kind":"import-statement","external":true}],"exports":["CustomEvmSigner","getTxHash"],"entryPoint":"src/signers/evm.ts","inputs":{"src/signers/evm.ts":{"bytesInOutput":747}},"bytes":880},"dist/chunk-5CP7BBMP.js.map":{"imports":[],"exports":[],"inputs":{},"bytes":1501},"dist/chunk-5CP7BBMP.js":{"imports":[{"path":"@safe-global/safe-apps-provider","kind":"import-statement","external":true},{"path":"@safe-global/safe-apps-sdk","kind":"import-statement","external":true}],"exports":["a","b","c"],"inputs":{"src/helpers.ts":{"bytesInOutput":356}},"bytes":508}}}
@@ -0,0 +1,3 @@
1
+ import type { ProviderAPI } from '@rango-dev/wallets-core/namespaces/evm';
2
+ import type { SignerFactory } from 'rango-types';
3
+ export default function getSigners(provider: ProviderAPI): Promise<SignerFactory>;
@@ -0,0 +1,22 @@
1
+ import type { TransactionResponse } from 'ethers';
2
+ import type { GenericSigner } from 'rango-types';
3
+ import type { EvmTransaction } from 'rango-types/mainApi';
4
+ export declare function getTxHash(safeHash: string): Promise<{
5
+ txHash: string;
6
+ }>;
7
+ export declare class CustomEvmSigner implements GenericSigner<EvmTransaction> {
8
+ private signer;
9
+ constructor(provider: any);
10
+ signMessage(msg: string): Promise<string>;
11
+ signAndSendTx(tx: EvmTransaction, address: string, chainId: string | null): Promise<{
12
+ hash: string;
13
+ response: Partial<TransactionResponse> & {
14
+ hashRequiringUpdate: boolean;
15
+ };
16
+ }>;
17
+ wait(safeHash: string, chainId: string, response: TransactionResponse): Promise<{
18
+ hash: string;
19
+ response: TransactionResponse;
20
+ chainId: string;
21
+ }>;
22
+ }
package/package.json ADDED
@@ -0,0 +1,35 @@
1
+ {
2
+ "name": "@rango-dev/provider-safe",
3
+ "version": "0.0.0-experimental-936229e8-20251208",
4
+ "license": "MIT",
5
+ "type": "module",
6
+ "source": "./src/index.ts",
7
+ "main": "./dist/index.js",
8
+ "exports": {
9
+ ".": "./dist/index.js"
10
+ },
11
+ "typings": "dist/index.d.ts",
12
+ "files": [
13
+ "dist",
14
+ "src"
15
+ ],
16
+ "scripts": {
17
+ "build": "node ../../scripts/build/command.mjs --path wallets/provider-safe --splitting",
18
+ "ts-check": "tsc --declaration --emitDeclarationOnly -p ./tsconfig.json",
19
+ "clean": "rimraf dist",
20
+ "format": "prettier --write '{.,src}/**/*.{ts,tsx}'",
21
+ "lint": "eslint \"**/*.{ts,tsx}\""
22
+ },
23
+ "dependencies": {
24
+ "@rango-dev/signer-evm": "^0.40.0",
25
+ "@rango-dev/wallets-core": "^0.0.0-experimental-936229e8-20251208",
26
+ "@rango-dev/wallets-shared": "^0.0.0-experimental-936229e8-20251208",
27
+ "@safe-global/safe-apps-provider": "^0.17.0",
28
+ "@safe-global/safe-apps-sdk": "^9.1.0",
29
+ "ethers": "^6.13.2",
30
+ "rango-types": "^0.1.89"
31
+ },
32
+ "publishConfig": {
33
+ "access": "public"
34
+ }
35
+ }
package/readme.md ADDED
@@ -0,0 +1 @@
1
+ # @rango-dev/provider-safe
package/src/helpers.ts ADDED
@@ -0,0 +1,29 @@
1
+ import { SafeAppProvider } from '@safe-global/safe-apps-provider';
2
+ import SafeAppsSDK from '@safe-global/safe-apps-sdk';
3
+
4
+ const options = {
5
+ debug: false,
6
+ };
7
+
8
+ /*
9
+ * similar to:
10
+ * https://github.com/wagmi-dev/references/pull/114
11
+ */
12
+ let SDK = SafeAppsSDK;
13
+ if (
14
+ typeof SafeAppsSDK !== 'function' &&
15
+ // @ts-expect-error This import error is not visible to TypeScript
16
+ typeof SafeAppsSDK.default === 'function'
17
+ ) {
18
+ SDK = (SafeAppsSDK as unknown as { default: typeof SafeAppsSDK }).default;
19
+ }
20
+ export const sdk = new SDK(options);
21
+
22
+ export async function getSafeInstance(): Promise<any> {
23
+ const timeout = 200;
24
+ const accountInfo = await Promise.race([
25
+ sdk.safe.getInfo(),
26
+ new Promise<undefined>((resolve) => setTimeout(resolve, timeout)),
27
+ ]);
28
+ return accountInfo ? new SafeAppProvider(accountInfo, sdk as any) : null;
29
+ }
package/src/index.ts ADDED
@@ -0,0 +1,94 @@
1
+ import type {
2
+ CanEagerConnect,
3
+ CanSwitchNetwork,
4
+ Connect,
5
+ GetInstance,
6
+ Subscribe,
7
+ SwitchNetwork,
8
+ WalletInfo,
9
+ } from '@rango-dev/wallets-shared';
10
+ import type { BlockchainMeta, SignerFactory } from 'rango-types';
11
+
12
+ import {
13
+ canEagerlyConnectToEvm,
14
+ canSwitchNetworkToEvm,
15
+ subscribeToEvm,
16
+ switchNetworkForEvm,
17
+ WalletTypes,
18
+ } from '@rango-dev/wallets-shared';
19
+ import { evmBlockchains, isEvmBlockchain } from 'rango-types';
20
+
21
+ import { getSafeInstance } from './helpers.js';
22
+ import signer from './signer.js';
23
+
24
+ const WALLET = WalletTypes.SAFE;
25
+
26
+ export const config = {
27
+ type: WALLET,
28
+ isAsyncInstance: true,
29
+ };
30
+
31
+ export const getInstance: GetInstance = async () => {
32
+ return await getSafeInstance();
33
+ };
34
+
35
+ export const connect: Connect = async ({ instance }) => {
36
+ const accounts = await instance.request({
37
+ method: 'eth_accounts',
38
+ });
39
+
40
+ const { chainId } = instance;
41
+
42
+ return { accounts, chainId };
43
+ };
44
+
45
+ export const subscribe: Subscribe = ({
46
+ instance,
47
+ state,
48
+ updateChainId,
49
+ updateAccounts,
50
+ meta,
51
+ connect,
52
+ disconnect,
53
+ }) => {
54
+ const evmBlockchainMeta = meta.filter(isEvmBlockchain);
55
+
56
+ const cleanup = subscribeToEvm({
57
+ instance,
58
+ state,
59
+ updateChainId,
60
+ updateAccounts,
61
+ meta: evmBlockchainMeta,
62
+ connect,
63
+ disconnect,
64
+ });
65
+ return () => {
66
+ if (cleanup) {
67
+ cleanup();
68
+ }
69
+ };
70
+ };
71
+
72
+ export const switchNetwork: SwitchNetwork = switchNetworkForEvm;
73
+
74
+ export const canSwitchNetworkTo: CanSwitchNetwork = canSwitchNetworkToEvm;
75
+
76
+ export const getSigners: (provider: any) => Promise<SignerFactory> = signer;
77
+
78
+ export const canEagerConnect: CanEagerConnect = canEagerlyConnectToEvm;
79
+
80
+ export const getWalletInfo: (allBlockChains: BlockchainMeta[]) => WalletInfo = (
81
+ allBlockChains
82
+ ) => {
83
+ const evms = evmBlockchains(allBlockChains);
84
+ return {
85
+ name: 'Safe',
86
+ img: 'https://raw.githubusercontent.com/rango-exchange/assets/main/wallets/safe/icon.svg',
87
+ installLink: {
88
+ DEFAULT: 'https://app.safe.global/',
89
+ },
90
+ color: '#ffffff',
91
+ supportedChains: evms,
92
+ isContractWallet: true,
93
+ };
94
+ };
package/src/signer.ts ADDED
@@ -0,0 +1,17 @@
1
+ import type { ProviderAPI } from '@rango-dev/wallets-core/namespaces/evm';
2
+ import type { SignerFactory } from 'rango-types';
3
+
4
+ import { dynamicImportWithRefinedError } from '@rango-dev/wallets-shared';
5
+ import { DefaultSignerFactory, TransactionType as TxType } from 'rango-types';
6
+
7
+ export default async function getSigners(
8
+ provider: ProviderAPI
9
+ ): Promise<SignerFactory> {
10
+ const signers = new DefaultSignerFactory();
11
+ const { CustomEvmSigner } = await dynamicImportWithRefinedError(
12
+ async () => await import('./signers/evm.js')
13
+ );
14
+ signers.registerSigner(TxType.EVM, new CustomEvmSigner(provider));
15
+
16
+ return signers;
17
+ }
@@ -0,0 +1,86 @@
1
+ import type { OffChainSignMessageResponse } from '@safe-global/safe-apps-sdk';
2
+ import type { TransactionResponse } from 'ethers';
3
+ import type { GenericSigner } from 'rango-types';
4
+ import type { EvmTransaction } from 'rango-types/mainApi';
5
+
6
+ import { DefaultEvmSigner, waitMs } from '@rango-dev/signer-evm';
7
+ import { TransactionStatus } from '@safe-global/safe-apps-sdk';
8
+
9
+ import { sdk } from '../helpers.js';
10
+
11
+ export async function getTxHash(safeHash: string): Promise<{ txHash: string }> {
12
+ let txHash;
13
+ const timeout = 5_000;
14
+
15
+ while (!txHash) {
16
+ try {
17
+ /** The SDK will be pinged until a txHash is available and the txStatus is in an end-state */
18
+ const queued = await sdk.txs.getBySafeTxHash(safeHash);
19
+ if (
20
+ queued.txStatus === TransactionStatus.AWAITING_CONFIRMATIONS ||
21
+ queued.txStatus === TransactionStatus.AWAITING_EXECUTION
22
+ ) {
23
+ /** Mimic a status watcher by checking once every 5 seconds */
24
+ await waitMs(timeout);
25
+ } else if (queued.txHash) {
26
+ /** The txStatus is in an end-state (e.g. success) so we probably have a valid, on chain txHash*/
27
+ txHash = queued.txHash;
28
+ }
29
+ } catch {
30
+ txHash = safeHash;
31
+ }
32
+ }
33
+ return { txHash };
34
+ }
35
+
36
+ export class CustomEvmSigner implements GenericSigner<EvmTransaction> {
37
+ private signer;
38
+
39
+ constructor(provider: any) {
40
+ this.signer = new DefaultEvmSigner(provider);
41
+ }
42
+
43
+ async signMessage(msg: string): Promise<string> {
44
+ const { signature } = (await sdk.txs.signMessage(
45
+ msg
46
+ )) as OffChainSignMessageResponse & { signature: string };
47
+
48
+ return signature;
49
+ }
50
+
51
+ async signAndSendTx(
52
+ tx: EvmTransaction,
53
+ address: string,
54
+ chainId: string | null
55
+ ): Promise<{
56
+ hash: string;
57
+ response: Partial<TransactionResponse> & { hashRequiringUpdate: boolean };
58
+ }> {
59
+ const { hash, response } = await this.signer.signAndSendTx(
60
+ tx,
61
+ address,
62
+ chainId
63
+ );
64
+ return {
65
+ hash,
66
+ response: { ...response, hashRequiringUpdate: true },
67
+ };
68
+ }
69
+
70
+ async wait(
71
+ safeHash: string,
72
+ chainId: string,
73
+ response: TransactionResponse
74
+ ): Promise<{
75
+ hash: string;
76
+ response: TransactionResponse;
77
+ chainId: string;
78
+ }> {
79
+ const { txHash: hash } = await getTxHash(safeHash);
80
+ return {
81
+ hash,
82
+ response,
83
+ chainId,
84
+ };
85
+ }
86
+ }