@rango-dev/provider-safe 0.1.1-next.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/evm-signer.d.ts +23 -0
- package/dist/evm-signer.d.ts.map +1 -0
- package/dist/helpers.d.ts +8 -0
- package/dist/helpers.d.ts.map +1 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +7 -0
- package/dist/signer.d.ts +3 -0
- package/dist/signer.d.ts.map +1 -0
- package/package.json +33 -0
- package/readme.md +1 -0
- package/src/evm-signer.ts +61 -0
- package/src/helpers.ts +45 -0
- package/src/index.ts +88 -0
- package/src/signer.ts +13 -0
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { GenericSigner } from 'rango-types';
|
|
2
|
+
import { EvmTransaction } from 'rango-types/lib/api/main';
|
|
3
|
+
import { TransactionResponse } from '@ethersproject/abstract-provider';
|
|
4
|
+
export declare class CustomEvmSigner implements GenericSigner<EvmTransaction> {
|
|
5
|
+
private signer;
|
|
6
|
+
constructor(provider: any);
|
|
7
|
+
signMessage(msg: string): Promise<string>;
|
|
8
|
+
signAndSendTx(tx: EvmTransaction, address: string, chainId: string | null): Promise<{
|
|
9
|
+
hash: string;
|
|
10
|
+
response: TransactionResponse & {
|
|
11
|
+
hashRequiringUpdate: boolean;
|
|
12
|
+
};
|
|
13
|
+
}>;
|
|
14
|
+
wait(safeHash: string, chainId: string, response: TransactionResponse): Promise<{
|
|
15
|
+
hash: string;
|
|
16
|
+
response: TransactionResponse & {
|
|
17
|
+
hashWasUpdated: boolean;
|
|
18
|
+
isMultiSig: true;
|
|
19
|
+
};
|
|
20
|
+
chainId: string;
|
|
21
|
+
}>;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=evm-signer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evm-signer.d.ts","sourceRoot":"","sources":["../src/evm-signer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AAKvE,qBAAa,eAAgB,YAAW,aAAa,CAAC,cAAc,CAAC;IACnE,OAAO,CAAC,MAAM,CAAC;gBAEH,QAAQ,EAAE,GAAG;IAInB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAQzC,aAAa,CACjB,EAAE,EAAE,cAAc,EAClB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,GAAG,IAAI,GACrB,OAAO,CAAC;QACT,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,EAAE,mBAAmB,GAAG;YAAE,mBAAmB,EAAE,OAAO,CAAA;SAAE,CAAC;KAClE,CAAC;IAQI,IAAI,CACR,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,mBAAmB,GAC5B,OAAO,CAAC;QACT,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,EAAE,mBAAmB,GAAG;YAC9B,cAAc,EAAE,OAAO,CAAC;YACxB,UAAU,EAAE,IAAI,CAAC;SAClB,CAAC;QACF,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;CAYH"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import SafeAppsSDK from '@safe-global/safe-apps-sdk';
|
|
2
|
+
export declare const sdk: SafeAppsSDK;
|
|
3
|
+
export declare function getSafeInstance(): Promise<any>;
|
|
4
|
+
export declare function getTxHash(safeHash: string): Promise<{
|
|
5
|
+
txHash: string;
|
|
6
|
+
hashWasUpdated: boolean;
|
|
7
|
+
}>;
|
|
8
|
+
//# sourceMappingURL=helpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../src/helpers.ts"],"names":[],"mappings":"AAEA,OAAO,WAAkC,MAAM,4BAA4B,CAAC;AAM5E,eAAO,MAAM,GAAG,aAA2B,CAAC;AAC5C,wBAAsB,eAAe,IAAI,OAAO,CAAC,GAAG,CAAC,CAMpD;AAED,wBAAsB,SAAS,CAC7B,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,OAAO,CAAA;CAAE,CAAC,CAyBtD"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { WalletTypes, CanSwitchNetwork, Connect, Subscribe, WalletInfo, SwitchNetwork, GetInstance, CanEagerConnect } from '@rango-dev/wallets-shared';
|
|
2
|
+
import { SignerFactory, BlockchainMeta } from 'rango-types';
|
|
3
|
+
export declare const config: {
|
|
4
|
+
type: WalletTypes;
|
|
5
|
+
isAsyncInstance: boolean;
|
|
6
|
+
};
|
|
7
|
+
export declare const getInstance: GetInstance;
|
|
8
|
+
export declare const connect: Connect;
|
|
9
|
+
export declare const subscribe: Subscribe;
|
|
10
|
+
export declare const switchNetwork: SwitchNetwork;
|
|
11
|
+
export declare const canSwitchNetworkTo: CanSwitchNetwork;
|
|
12
|
+
export declare const getSigners: (provider: any) => SignerFactory;
|
|
13
|
+
export declare const canEagerConnect: CanEagerConnect;
|
|
14
|
+
export declare const getWalletInfo: (allBlockChains: BlockchainMeta[]) => WalletInfo;
|
|
15
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,WAAW,EACX,gBAAgB,EAChB,OAAO,EACP,SAAS,EACT,UAAU,EAGV,aAAa,EAEb,WAAW,EACX,eAAe,EAEhB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACL,aAAa,EACb,cAAc,EAGf,MAAM,aAAa,CAAC;AAMrB,eAAO,MAAM,MAAM;;;CAGlB,CAAC;AAEF,eAAO,MAAM,WAAW,EAAE,WAEzB,CAAC;AAEF,eAAO,MAAM,OAAO,EAAE,OAQrB,CAAC;AAEF,eAAO,MAAM,SAAS,EAAE,SAoBvB,CAAC;AAEF,eAAO,MAAM,aAAa,EAAE,aAAmC,CAAC;AAEhE,eAAO,MAAM,kBAAkB,EAAE,gBAAwC,CAAC;AAE1E,eAAO,MAAM,UAAU,EAAE,CAAC,QAAQ,EAAE,GAAG,KAAK,aAAsB,CAAC;AAEnE,eAAO,MAAM,eAAe,EAAE,eAAwC,CAAC;AAEvE,eAAO,MAAM,aAAa,EAAE,CAAC,cAAc,EAAE,cAAc,EAAE,KAAK,UAajE,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
var u=Object.defineProperty;var s=(e,t)=>u(e,"name",{value:t,configurable:!0});import{WalletTypes as E,subscribeToEvm as k,switchNetworkForEvm as b,canSwitchNetworkToEvm as v,canEagerlyConnectToEvm as C}from"@rango-dev/wallets-shared";import{evmBlockchains as A,isEvmBlockchain as N}from"rango-types";import{waitMs as w}from"@rango-dev/signer-evm";import{SafeAppProvider as S}from"@safe-global/safe-apps-provider";import d,{TransactionStatus as g}from"@safe-global/safe-apps-sdk";var x={allowedDomains:[/gnosis-safe.io$/,/app.safe.global$/],debug:!1},o=new d(x);async function p(){let e=await Promise.race([o.safe.getInfo(),new Promise(t=>setTimeout(t,200))]);return e?new S(e,o):null}s(p,"getSafeInstance");async function h(e){let t,n=!1;for(;!t;)try{let a=await o.txs.getBySafeTxHash(e);a.txStatus===g.AWAITING_CONFIRMATIONS||a.txStatus===g.AWAITING_EXECUTION?await w(5e3):a.txHash&&(t=a.txHash,n=!0)}catch{t=e,n=!0}return{txHash:t,hashWasUpdated:n}}s(h,"getTxHash");import{DefaultSignerFactory as y,TransactionType as I}from"rango-types";import{DefaultEvmSigner as T}from"@rango-dev/signer-evm";var i=class{constructor(t){this.signer=new T(t)}async signMessage(t){let{signature:n}=await o.txs.signMessage(t);return n}async signAndSendTx(t,n,a){let r=await this.signer.signAndSendTx(t,n,a);return{hash:r.hash,response:{...r.response,hashRequiringUpdate:!0}}}async wait(t,n,a){let r=await h(t);return{hash:r.txHash,response:{...a,hashWasUpdated:r.hashWasUpdated,isMultiSig:!0},chainId:n}}};s(i,"CustomEvmSigner");function c(e){let t=new y;return t.registerSigner(I.EVM,new i(e)),t}s(c,"getSigners");var M=E.SAFE,rt={type:M,isAsyncInstance:!0},ot=s(async()=>await p(),"getInstance"),it=s(async({instance:e})=>{let t=await e.request({method:"eth_accounts"}),{chainId:n}=e;return{accounts:t,chainId:n}},"connect"),ct=s(({instance:e,state:t,updateChainId:n,updateAccounts:a,meta:r,connect:m,disconnect:f})=>{let l=r.filter(N);k({instance:e,state:t,updateChainId:n,updateAccounts:a,meta:l,connect:m,disconnect:f})},"subscribe"),gt=b,pt=v,ht=c,mt=C,ft=s(e=>{let t=A(e);return{name:"Safe",img:"https://raw.githubusercontent.com/rango-exchange/rango-types/main/assets/icons/wallets/safe.svg",installLink:{DEFAULT:"https://app.safe.global/"},color:"#ffffff",supportedChains:t}},"getWalletInfo");export{mt as canEagerConnect,pt as canSwitchNetworkTo,rt as config,it as connect,ot as getInstance,ht as getSigners,ft as getWalletInfo,ct as subscribe,gt as switchNetwork};
|
|
2
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/index.ts", "../src/helpers.ts", "../src/signer.ts", "../src/evm-signer.ts"],
|
|
4
|
+
"sourcesContent": ["import {\n WalletTypes,\n CanSwitchNetwork,\n Connect,\n Subscribe,\n WalletInfo,\n subscribeToEvm,\n switchNetworkForEvm,\n SwitchNetwork,\n canSwitchNetworkToEvm,\n GetInstance,\n CanEagerConnect,\n canEagerlyConnectToEvm,\n} from '@rango-dev/wallets-shared';\nimport {\n SignerFactory,\n BlockchainMeta,\n evmBlockchains,\n isEvmBlockchain,\n} from 'rango-types';\nimport { getSafeInstance } from './helpers';\nimport signer from './signer';\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 subscribeToEvm({\n instance,\n state,\n updateChainId,\n updateAccounts,\n meta: evmBlockchainMeta,\n connect,\n disconnect,\n });\n};\n\nexport const switchNetwork: SwitchNetwork = switchNetworkForEvm;\n\nexport const canSwitchNetworkTo: CanSwitchNetwork = canSwitchNetworkToEvm;\n\nexport const getSigners: (provider: any) => 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/rango-types/main/assets/icons/wallets/safe.svg',\n installLink: {\n DEFAULT: 'https://app.safe.global/',\n },\n color: '#ffffff',\n supportedChains: evms,\n };\n};\n", "import { waitMs } from '@rango-dev/signer-evm';\nimport { SafeAppProvider } from '@safe-global/safe-apps-provider';\nimport SafeAppsSDK, { TransactionStatus } from '@safe-global/safe-apps-sdk';\n\nconst options = {\n allowedDomains: [/gnosis-safe.io$/, /app.safe.global$/],\n debug: false,\n};\nexport const sdk = new SafeAppsSDK(options);\nexport async function getSafeInstance(): Promise<any> {\n const accountInfo = await Promise.race([\n sdk.safe.getInfo(),\n new Promise<undefined>((resolve) => setTimeout(resolve, 200)),\n ]);\n return accountInfo ? new SafeAppProvider(accountInfo, sdk as any) : null;\n}\n\nexport async function getTxHash(\n safeHash: string\n): Promise<{ txHash: string; hashWasUpdated: boolean }> {\n let txHash;\n let hashWasUpdated = false;\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(5_000);\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 hashWasUpdated = true;\n }\n } catch {\n txHash = safeHash;\n hashWasUpdated = true;\n }\n }\n return { txHash, hashWasUpdated };\n}\n", "import {\n DefaultSignerFactory,\n SignerFactory,\n TransactionType as TxType,\n} from 'rango-types';\nimport { CustomEvmSigner } from './evm-signer';\n\nexport default function getSigners(provider: any): SignerFactory {\n const signers = new DefaultSignerFactory();\n signers.registerSigner(TxType.EVM, new CustomEvmSigner(provider));\n\n return signers;\n}\n", "import { GenericSigner } from 'rango-types';\nimport { EvmTransaction } from 'rango-types/lib/api/main';\nimport { TransactionResponse } from '@ethersproject/abstract-provider';\nimport { DefaultEvmSigner } from '@rango-dev/signer-evm';\nimport { sdk, getTxHash } from './helpers';\nimport { OffChainSignMessageResponse } from '@safe-global/safe-apps-sdk';\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: TransactionResponse & { hashRequiringUpdate: boolean };\n }> {\n const result = await this.signer.signAndSendTx(tx, address, chainId);\n return {\n hash: result.hash,\n response: { ...result.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 hashWasUpdated: boolean;\n isMultiSig: true;\n };\n chainId: string;\n }> {\n const result = await getTxHash(safeHash);\n return {\n hash: result.txHash,\n response: {\n ...response,\n hashWasUpdated: result.hashWasUpdated,\n isMultiSig: true,\n },\n chainId,\n };\n }\n}\n"],
|
|
5
|
+
"mappings": "+EAAA,OACE,eAAAA,EAKA,kBAAAC,EACA,uBAAAC,EAEA,yBAAAC,EAGA,0BAAAC,MACK,4BACP,OAGE,kBAAAC,EACA,mBAAAC,MACK,cCnBP,OAAS,UAAAC,MAAc,wBACvB,OAAS,mBAAAC,MAAuB,kCAChC,OAAOC,GAAe,qBAAAC,MAAyB,6BAE/C,IAAMC,EAAU,CACd,eAAgB,CAAC,kBAAmB,kBAAkB,EACtD,MAAO,EACT,EACaC,EAAM,IAAIC,EAAYF,CAAO,EAC1C,eAAsBG,GAAgC,CACpD,IAAMC,EAAc,MAAM,QAAQ,KAAK,CACrCH,EAAI,KAAK,QAAQ,EACjB,IAAI,QAAoBI,GAAY,WAAWA,EAAS,GAAG,CAAC,CAC9D,CAAC,EACD,OAAOD,EAAc,IAAIE,EAAgBF,EAAaH,CAAU,EAAI,IACtE,CANsBM,EAAAJ,EAAA,mBAQtB,eAAsBK,EACpBC,EACsD,CACtD,IAAIC,EACAC,EAAiB,GAErB,KAAO,CAACD,GACN,GAAI,CAEF,IAAME,EAAS,MAAMX,EAAI,IAAI,gBAAgBQ,CAAQ,EAEnDG,EAAO,WAAaC,EAAkB,wBACtCD,EAAO,WAAaC,EAAkB,mBAGtC,MAAMC,EAAO,GAAK,EACTF,EAAO,SAEhBF,EAASE,EAAO,OAChBD,EAAiB,GAErB,MAAE,CACAD,EAASD,EACTE,EAAiB,EACnB,CAEF,MAAO,CAAE,OAAAD,EAAQ,eAAAC,CAAe,CAClC,CA3BsBJ,EAAAC,EAAA,aCjBtB,OACE,wBAAAO,EAEA,mBAAmBC,MACd,cCDP,OAAS,oBAAAC,MAAwB,wBAI1B,IAAMC,EAAN,KAA+D,CAGpE,YAAYC,EAAe,CACzB,KAAK,OAAS,IAAIC,EAAiBD,CAAQ,CAC7C,CAEA,MAAM,YAAYE,EAA8B,CAC9C,GAAM,CAAE,UAAAC,CAAU,EAAK,MAAMC,EAAI,IAAI,YACnCF,CACF,EAEA,OAAOC,CACT,CAEA,MAAM,cACJE,EACAC,EACAC,EAIC,CACD,IAAMC,EAAS,MAAM,KAAK,OAAO,cAAcH,EAAIC,EAASC,CAAO,EACnE,MAAO,CACL,KAAMC,EAAO,KACb,SAAU,CAAE,GAAGA,EAAO,SAAU,oBAAqB,EAAK,CAC5D,CACF,CAEA,MAAM,KACJC,EACAF,EACAG,EAQC,CACD,IAAMF,EAAS,MAAMG,EAAUF,CAAQ,EACvC,MAAO,CACL,KAAMD,EAAO,OACb,SAAU,CACR,GAAGE,EACH,eAAgBF,EAAO,eACvB,WAAY,EACd,EACA,QAAAD,CACF,CACF,CACF,EArDaK,EAAAb,EAAA,mBDAE,SAARc,EAA4BC,EAA8B,CAC/D,IAAMC,EAAU,IAAIC,EACpB,OAAAD,EAAQ,eAAeE,EAAO,IAAK,IAAIC,EAAgBJ,CAAQ,CAAC,EAEzDC,CACT,CALwBI,EAAAN,EAAA,cFgBxB,IAAMO,EAASC,EAAY,KAEdC,GAAS,CACpB,KAAMF,EACN,gBAAiB,EACnB,EAEaG,GAA2BC,EAAA,SAC/B,MAAMC,EAAgB,EADS,eAI3BC,GAAmBF,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,GAAuBN,EAAA,CAAC,CACnC,SAAAG,EACA,MAAAI,EACA,cAAAC,EACA,eAAAC,EACA,KAAAC,EACA,QAAAR,EACA,WAAAS,CACF,IAAM,CACJ,IAAMC,EAAoBF,EAAK,OAAOG,CAAe,EAErDC,EAAe,CACb,SAAAX,EACA,MAAAI,EACA,cAAAC,EACA,eAAAC,EACA,KAAMG,EACN,QAAAV,EACA,WAAAS,CACF,CAAC,CACH,EApBoC,aAsBvBI,GAA+BC,EAE/BC,GAAuCC,EAEvCC,GAA+CA,EAE/CC,GAAmCC,EAEnCC,GAAkEtB,EAC7EuB,GACG,CACH,IAAMC,EAAOC,EAAeF,CAAc,EAC1C,MAAO,CACL,KAAM,OACN,IAAK,kGACL,YAAa,CACX,QAAS,0BACX,EACA,MAAO,UACP,gBAAiBC,CACnB,CACF,EAb+E",
|
|
6
|
+
"names": ["WalletTypes", "subscribeToEvm", "switchNetworkForEvm", "canSwitchNetworkToEvm", "canEagerlyConnectToEvm", "evmBlockchains", "isEvmBlockchain", "waitMs", "SafeAppProvider", "SafeAppsSDK", "TransactionStatus", "options", "sdk", "SafeAppsSDK", "getSafeInstance", "accountInfo", "resolve", "SafeAppProvider", "__name", "getTxHash", "safeHash", "txHash", "hashWasUpdated", "queued", "TransactionStatus", "waitMs", "DefaultSignerFactory", "TxType", "DefaultEvmSigner", "CustomEvmSigner", "provider", "DefaultEvmSigner", "msg", "signature", "sdk", "tx", "address", "chainId", "result", "safeHash", "response", "getTxHash", "__name", "getSigners", "provider", "signers", "DefaultSignerFactory", "TxType", "CustomEvmSigner", "__name", "WALLET", "WalletTypes", "config", "getInstance", "__name", "getSafeInstance", "connect", "instance", "accounts", "chainId", "subscribe", "state", "updateChainId", "updateAccounts", "meta", "disconnect", "evmBlockchainMeta", "isEvmBlockchain", "subscribeToEvm", "switchNetwork", "switchNetworkForEvm", "canSwitchNetworkTo", "canSwitchNetworkToEvm", "getSigners", "canEagerConnect", "canEagerlyConnectToEvm", "getWalletInfo", "allBlockChains", "evms", "evmBlockchains"]
|
|
7
|
+
}
|
package/dist/signer.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signer.d.ts","sourceRoot":"","sources":["../src/signer.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,aAAa,EAEd,MAAM,aAAa,CAAC;AAGrB,MAAM,CAAC,OAAO,UAAU,UAAU,CAAC,QAAQ,EAAE,GAAG,GAAG,aAAa,CAK/D"}
|
package/package.json
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@rango-dev/provider-safe",
|
|
3
|
+
"version": "0.1.1-next.0",
|
|
4
|
+
"license": "MIT",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"module": "./dist/index.js",
|
|
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",
|
|
18
|
+
"clean": "rimraf dist",
|
|
19
|
+
"format": "prettier --write '{.,src}/**/*.{ts,tsx}'",
|
|
20
|
+
"lint": "eslint \"**/*.{ts,tsx}\" --ignore-path ../../.eslintignore"
|
|
21
|
+
},
|
|
22
|
+
"dependencies": {
|
|
23
|
+
"@ethersproject/abstract-provider": "^5.7.0",
|
|
24
|
+
"@rango-dev/signer-evm": "^0.8.1-next.0",
|
|
25
|
+
"@rango-dev/wallets-shared": "^0.8.1-next.2",
|
|
26
|
+
"@safe-global/safe-apps-provider": "^0.17.0",
|
|
27
|
+
"@safe-global/safe-apps-sdk": "^7.11.0",
|
|
28
|
+
"rango-types": "^0.1.46"
|
|
29
|
+
},
|
|
30
|
+
"publishConfig": {
|
|
31
|
+
"access": "public"
|
|
32
|
+
}
|
|
33
|
+
}
|
package/readme.md
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
# @rango-dev/provider-safe
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { GenericSigner } from 'rango-types';
|
|
2
|
+
import { EvmTransaction } from 'rango-types/lib/api/main';
|
|
3
|
+
import { TransactionResponse } from '@ethersproject/abstract-provider';
|
|
4
|
+
import { DefaultEvmSigner } from '@rango-dev/signer-evm';
|
|
5
|
+
import { sdk, getTxHash } from './helpers';
|
|
6
|
+
import { OffChainSignMessageResponse } from '@safe-global/safe-apps-sdk';
|
|
7
|
+
|
|
8
|
+
export class CustomEvmSigner implements GenericSigner<EvmTransaction> {
|
|
9
|
+
private signer;
|
|
10
|
+
|
|
11
|
+
constructor(provider: any) {
|
|
12
|
+
this.signer = new DefaultEvmSigner(provider);
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
async signMessage(msg: string): Promise<string> {
|
|
16
|
+
const { signature } = (await sdk.txs.signMessage(
|
|
17
|
+
msg
|
|
18
|
+
)) as OffChainSignMessageResponse & { signature: string };
|
|
19
|
+
|
|
20
|
+
return signature;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
async signAndSendTx(
|
|
24
|
+
tx: EvmTransaction,
|
|
25
|
+
address: string,
|
|
26
|
+
chainId: string | null
|
|
27
|
+
): Promise<{
|
|
28
|
+
hash: string;
|
|
29
|
+
response: TransactionResponse & { hashRequiringUpdate: boolean };
|
|
30
|
+
}> {
|
|
31
|
+
const result = await this.signer.signAndSendTx(tx, address, chainId);
|
|
32
|
+
return {
|
|
33
|
+
hash: result.hash,
|
|
34
|
+
response: { ...result.response, hashRequiringUpdate: true },
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
async wait(
|
|
39
|
+
safeHash: string,
|
|
40
|
+
chainId: string,
|
|
41
|
+
response: TransactionResponse
|
|
42
|
+
): Promise<{
|
|
43
|
+
hash: string;
|
|
44
|
+
response: TransactionResponse & {
|
|
45
|
+
hashWasUpdated: boolean;
|
|
46
|
+
isMultiSig: true;
|
|
47
|
+
};
|
|
48
|
+
chainId: string;
|
|
49
|
+
}> {
|
|
50
|
+
const result = await getTxHash(safeHash);
|
|
51
|
+
return {
|
|
52
|
+
hash: result.txHash,
|
|
53
|
+
response: {
|
|
54
|
+
...response,
|
|
55
|
+
hashWasUpdated: result.hashWasUpdated,
|
|
56
|
+
isMultiSig: true,
|
|
57
|
+
},
|
|
58
|
+
chainId,
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
}
|
package/src/helpers.ts
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { waitMs } from '@rango-dev/signer-evm';
|
|
2
|
+
import { SafeAppProvider } from '@safe-global/safe-apps-provider';
|
|
3
|
+
import SafeAppsSDK, { TransactionStatus } from '@safe-global/safe-apps-sdk';
|
|
4
|
+
|
|
5
|
+
const options = {
|
|
6
|
+
allowedDomains: [/gnosis-safe.io$/, /app.safe.global$/],
|
|
7
|
+
debug: false,
|
|
8
|
+
};
|
|
9
|
+
export const sdk = new SafeAppsSDK(options);
|
|
10
|
+
export async function getSafeInstance(): Promise<any> {
|
|
11
|
+
const accountInfo = await Promise.race([
|
|
12
|
+
sdk.safe.getInfo(),
|
|
13
|
+
new Promise<undefined>((resolve) => setTimeout(resolve, 200)),
|
|
14
|
+
]);
|
|
15
|
+
return accountInfo ? new SafeAppProvider(accountInfo, sdk as any) : null;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export async function getTxHash(
|
|
19
|
+
safeHash: string
|
|
20
|
+
): Promise<{ txHash: string; hashWasUpdated: boolean }> {
|
|
21
|
+
let txHash;
|
|
22
|
+
let hashWasUpdated = false;
|
|
23
|
+
|
|
24
|
+
while (!txHash) {
|
|
25
|
+
try {
|
|
26
|
+
/** The SDK will be pinged until a txHash is available and the txStatus is in an end-state */
|
|
27
|
+
const queued = await sdk.txs.getBySafeTxHash(safeHash);
|
|
28
|
+
if (
|
|
29
|
+
queued.txStatus === TransactionStatus.AWAITING_CONFIRMATIONS ||
|
|
30
|
+
queued.txStatus === TransactionStatus.AWAITING_EXECUTION
|
|
31
|
+
) {
|
|
32
|
+
/** Mimic a status watcher by checking once every 5 seconds */
|
|
33
|
+
await waitMs(5_000);
|
|
34
|
+
} else if (queued.txHash) {
|
|
35
|
+
/** The txStatus is in an end-state (e.g. success) so we probably have a valid, on chain txHash*/
|
|
36
|
+
txHash = queued.txHash;
|
|
37
|
+
hashWasUpdated = true;
|
|
38
|
+
}
|
|
39
|
+
} catch {
|
|
40
|
+
txHash = safeHash;
|
|
41
|
+
hashWasUpdated = true;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
return { txHash, hashWasUpdated };
|
|
45
|
+
}
|
package/src/index.ts
ADDED
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import {
|
|
2
|
+
WalletTypes,
|
|
3
|
+
CanSwitchNetwork,
|
|
4
|
+
Connect,
|
|
5
|
+
Subscribe,
|
|
6
|
+
WalletInfo,
|
|
7
|
+
subscribeToEvm,
|
|
8
|
+
switchNetworkForEvm,
|
|
9
|
+
SwitchNetwork,
|
|
10
|
+
canSwitchNetworkToEvm,
|
|
11
|
+
GetInstance,
|
|
12
|
+
CanEagerConnect,
|
|
13
|
+
canEagerlyConnectToEvm,
|
|
14
|
+
} from '@rango-dev/wallets-shared';
|
|
15
|
+
import {
|
|
16
|
+
SignerFactory,
|
|
17
|
+
BlockchainMeta,
|
|
18
|
+
evmBlockchains,
|
|
19
|
+
isEvmBlockchain,
|
|
20
|
+
} from 'rango-types';
|
|
21
|
+
import { getSafeInstance } from './helpers';
|
|
22
|
+
import signer from './signer';
|
|
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
|
+
subscribeToEvm({
|
|
57
|
+
instance,
|
|
58
|
+
state,
|
|
59
|
+
updateChainId,
|
|
60
|
+
updateAccounts,
|
|
61
|
+
meta: evmBlockchainMeta,
|
|
62
|
+
connect,
|
|
63
|
+
disconnect,
|
|
64
|
+
});
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
export const switchNetwork: SwitchNetwork = switchNetworkForEvm;
|
|
68
|
+
|
|
69
|
+
export const canSwitchNetworkTo: CanSwitchNetwork = canSwitchNetworkToEvm;
|
|
70
|
+
|
|
71
|
+
export const getSigners: (provider: any) => SignerFactory = signer;
|
|
72
|
+
|
|
73
|
+
export const canEagerConnect: CanEagerConnect = canEagerlyConnectToEvm;
|
|
74
|
+
|
|
75
|
+
export const getWalletInfo: (allBlockChains: BlockchainMeta[]) => WalletInfo = (
|
|
76
|
+
allBlockChains
|
|
77
|
+
) => {
|
|
78
|
+
const evms = evmBlockchains(allBlockChains);
|
|
79
|
+
return {
|
|
80
|
+
name: 'Safe',
|
|
81
|
+
img: 'https://raw.githubusercontent.com/rango-exchange/rango-types/main/assets/icons/wallets/safe.svg',
|
|
82
|
+
installLink: {
|
|
83
|
+
DEFAULT: 'https://app.safe.global/',
|
|
84
|
+
},
|
|
85
|
+
color: '#ffffff',
|
|
86
|
+
supportedChains: evms,
|
|
87
|
+
};
|
|
88
|
+
};
|
package/src/signer.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import {
|
|
2
|
+
DefaultSignerFactory,
|
|
3
|
+
SignerFactory,
|
|
4
|
+
TransactionType as TxType,
|
|
5
|
+
} from 'rango-types';
|
|
6
|
+
import { CustomEvmSigner } from './evm-signer';
|
|
7
|
+
|
|
8
|
+
export default function getSigners(provider: any): SignerFactory {
|
|
9
|
+
const signers = new DefaultSignerFactory();
|
|
10
|
+
signers.registerSigner(TxType.EVM, new CustomEvmSigner(provider));
|
|
11
|
+
|
|
12
|
+
return signers;
|
|
13
|
+
}
|