@halliday-sdk/payments 0.1.0-beta-2 → 0.2.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/README.md ADDED
@@ -0,0 +1,80 @@
1
+ # @halliday-sdk/payments
2
+
3
+ 📖 **[Full Documentation](https://docs.halliday.xyz/pages/payments-widget)**
4
+
5
+ **Main Features:**
6
+ - **Payments Widget** - Embeddable cryptocurrency payments widget for seamless onramp/swap transactions
7
+ - **Multi-wallet Integration** - Built-in support for Ethers.js wallet interactions
8
+ - **Flexible Display Modes** - Support for both popup and embedded widget display
9
+ - **TypeScript Support** - Full type safety with Zod schema validation
10
+
11
+ **Key Widget Capabilities:**
12
+ - **Asset Filtering** - Configure input/output assets and supported ramp providers
13
+ - **Custom Branding** - Customize colors, styling, and logo to match your application
14
+ - **Wallet Integration** - Handle message signing, typed data signing, and transaction sending
15
+
16
+ **Display Options:**
17
+ - **Popup Mode** - Opens widget in a separate popup window (default)
18
+ - **Embedded Mode** - Embeds widget directly into a specified DOM element
19
+
20
+ **Role-based Access:**
21
+ - **Owner Role** - Full access with signing and transaction capabilities
22
+ - **Funder Role** - Transaction sending capabilities for funding operations
23
+ - **Flexible Configuration** - Mix and match roles based on your application needs
24
+
25
+ ## Installation
26
+
27
+ ```bash
28
+ npm install @halliday-sdk/payments
29
+ ```
30
+
31
+ ## Usage
32
+
33
+ ### Basic Popup Widget
34
+
35
+ ```typescript
36
+ import { openHallidayPayments } from '@halliday-sdk/payments';
37
+
38
+ await openHallidayPayments({
39
+ apiKey: 'your-api-key',
40
+ outputs: ['ethereum:0x'], // ether on ethereum mainnet
41
+ });
42
+ ```
43
+
44
+ ### Embedded Widget
45
+
46
+ ```typescript
47
+ import { openHallidayPayments } from '@halliday-sdk/payments';
48
+
49
+ await openHallidayPayments({
50
+ apiKey: 'your-api-key',
51
+ outputs: ['ethereum:0x'], // ether on ethereum mainnet
52
+ windowType: 'EMBED',
53
+ targetElementId: 'payments-container'
54
+ });
55
+ ```
56
+
57
+ ### With Wallet Integration (Ethers.js)
58
+ This requires `ethers` as a peer dependency.
59
+
60
+ ```
61
+ npm install ethers @halliday-sdk/payments
62
+ ```
63
+
64
+ ```typescript
65
+ import { openHallidayPayments } from '@halliday-sdk/payments';
66
+ import { connectSigner } from '@halliday-sdk/payments/ethers';
67
+
68
+ const provider = new ethers.BrowserProvider(window.ethereum);
69
+ const ownerMethods = connectSigner(provider.getSigner);
70
+
71
+ await openHallidayPayments({
72
+ apiKey: 'your-api-key',
73
+ outputs: ['ethereum:0x'], // ether on ethereum mainnet
74
+ destinationAddress: await signer.getAddress(),
75
+ owner: {
76
+ address: await signer.getAddress(),
77
+ ...ownerMethods,
78
+ }
79
+ });
80
+ ```
@@ -1,2 +1,2 @@
1
- "use strict";require("ethers");const r=async(r,a,e)=>{if(!a.provider)throw new Error("Signer does not have a provider");try{await a.provider.send("wallet_switchEthereumChain",[{chainId:`0x${r.toString(16)}`}])}catch(t){if(console.error("Error switching chain",t),!e)throw t;try{await(async(r,a)=>{if(!r.provider)throw new Error("Signer does not have a provider");await r.provider.send("wallet_addEthereumChain",[a])})(a,(r=>({chainId:String(r.chain_id),blockExplorerUrls:[r.explorer],chainName:r.network,iconUrls:[r.image],nativeCurrency:r.native_currency,rpcUrls:[r.rpc]}))(e)),await a.provider.send("wallet_switchEthereumChain",[{chainId:`0x${r.toString(16)}`}])}catch(r){throw console.error("Error adding chain",r),r}}};exports.connectSigner=a=>({getAddress:async()=>(await a()).getAddress(),signMessage:async({message:r,ownerAddress:e})=>{const t=await a(e);if(e){if(e!==await t.getAddress())throw new Error("Owner address does not match")}return await t.signMessage(r)},sendTransaction:async(e,t)=>{let n=await a();const i=await(n.provider?.getNetwork());i?.chainId?.toString()!==e.chainId.toString()&&(await r(e.chainId,n,t),n=await a());const s=await(async({signer:r,transaction:a,confirmations:e,timeout:t})=>{const n=await r.sendTransaction(a);return await n.wait(e,t)})({signer:n,transaction:e});return{transactionHash:(o=s).hash,blockHash:o.blockHash,blockNumber:o.blockNumber,from:o.from,to:o.to||void 0,rawReceipt:o};var o},signTypedData:async({typedData:r,ownerAddress:e})=>{const t=await a(e);if(e){if(e!==await t.getAddress())throw new Error("Owner address does not match")}return await(t.provider?.send("eth_signTypedData_v4",[e,r]))}});
1
+ "use strict";require("ethers");const r=async(r,a,e)=>{if(!a.provider)throw new Error("Signer does not have a provider");try{await a.provider.send("wallet_switchEthereumChain",[{chainId:`0x${r.toString(16)}`}])}catch(t){if(console.error("Error switching chain",t),!e)throw t;try{await(async(r,a)=>{if(!r.provider)throw new Error("Signer does not have a provider");await r.provider.send("wallet_addEthereumChain",[a])})(a,(r=>({chainId:`0x${r.chain_id.toString(16)}`,blockExplorerUrls:[r.explorer],chainName:r.network,iconUrls:[r.image],nativeCurrency:r.native_currency,rpcUrls:[r.rpc]}))(e)),await a.provider.send("wallet_switchEthereumChain",[{chainId:`0x${r.toString(16)}`}])}catch(r){throw console.error("Error adding chain",r),r}}};exports.connectSigner=a=>({getAddress:async()=>(await a()).getAddress(),signMessage:async({message:r,ownerAddress:e})=>{const t=await a(e);if(e){if(e!==await t.getAddress())throw new Error("Owner address does not match")}return await t.signMessage(r)},sendTransaction:async(e,t)=>{let n=await a();const i=await(n.provider?.getNetwork());i?.chainId?.toString()!==e.chainId.toString()&&(await r(e.chainId,n,t),n=await a());const o=await(async({signer:r,transaction:a,confirmations:e,timeout:t})=>{const n=await r.sendTransaction(a);return await n.wait(e,t)})({signer:n,transaction:e});return{transactionHash:(s=o).hash,blockHash:s.blockHash,blockNumber:s.blockNumber,from:s.from,to:s.to||void 0,rawReceipt:s};var s},signTypedData:async({typedData:r,ownerAddress:e})=>{const t=await a(e);if(e){if(e!==await t.getAddress())throw new Error("Owner address does not match")}return await(t.provider?.send("eth_signTypedData_v4",[e,r]))}});
2
2
  //# sourceMappingURL=index.cjs.min.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs.min.js","sources":["../../../../_shared/utils/signerUtils.ts","../../../src/paymentsWidget/ethers/index.ts"],"sourcesContent":["import { TransactionReceipt, TransactionRequest, JsonRpcSigner, verifyMessage, toBeArray } from \"ethers\";\nimport { EVMChainConfig } from \"@shared/types\";\n\n// https://eips.ethereum.org/EIPS/eip-3085\ntype AddEthereumChainParameter = {\n chainId: string;\n blockExplorerUrls?: string[];\n chainName?: string;\n iconUrls?: string[];\n nativeCurrency?: {\n name: string;\n symbol: string;\n decimals: number;\n };\n rpcUrls?: string[];\n};\n\nexport const _getEVMChainParamFromChainConfig = (chainConfig: EVMChainConfig): AddEthereumChainParameter => ({\n chainId: String(chainConfig.chain_id),\n blockExplorerUrls: [chainConfig.explorer],\n chainName: chainConfig.network,\n iconUrls: [chainConfig.image],\n nativeCurrency: chainConfig.native_currency,\n rpcUrls: [chainConfig.rpc],\n});\n\nexport const getChainIdFromSigner = async (signer: JsonRpcSigner): Promise<number> => {\n if (!signer.provider) {\n throw new Error(\"Signer does not have a provider\");\n }\n\n const network = await signer.provider.getNetwork();\n return Number(network.chainId.toString());\n};\n\nexport const addChain = async (signer: JsonRpcSigner, chainConfig: AddEthereumChainParameter) => {\n if (!signer.provider) {\n throw new Error(\"Signer does not have a provider\");\n }\n\n await signer.provider.send(\"wallet_addEthereumChain\", [chainConfig]);\n};\n\nexport const switchChain = async (chainId: number, signer: JsonRpcSigner, chainConfig?: EVMChainConfig) => {\n if (!signer.provider) {\n throw new Error(\"Signer does not have a provider\");\n }\n\n try {\n await signer.provider.send(\"wallet_switchEthereumChain\", [{ chainId: `0x${chainId.toString(16)}` }]);\n } catch (error) {\n console.error(\"Error switching chain\", error);\n if (chainConfig) {\n try {\n await addChain(signer, _getEVMChainParamFromChainConfig(chainConfig));\n await signer.provider.send(\"wallet_switchEthereumChain\", [{ chainId: `0x${chainId.toString(16)}` }]);\n } catch (error) {\n console.error(\"Error adding chain\", error);\n throw error;\n }\n } else {\n throw error;\n }\n }\n};\n\n/**\n * Send a transaction using the signer.\n *\n * @param {JsonRpcSigner} signer {{@link JsonRpcSigner}} The signer to send the transaction.\n * @param {TransactionRequest} transaction {{@link TransactionRequest}} The transaction to send.\n * @param {number} confirmations {{@link number}} (optional) The number of confirmations to wait for default to 1.\n * @param {number} timeout {{@link number}} (optional) The timeout to wait for.\n * @returns {Promise<TransactionReceipt | null>} ``receipt`` {{@link TransactionReceipt}} The transaction receipt.\n *\n * If confirmations is 0, the promise will resolve to ``null``.\n * Check the {@link https://docs.ethers.org/v6/api/providers/#TransactionResponse-wait ethers v6 documentation} for more information.\n */\nexport const sendTransaction = async <C extends number = 1>({\n signer,\n transaction,\n confirmations,\n timeout,\n}: {\n signer: JsonRpcSigner;\n transaction: TransactionRequest;\n confirmations?: C;\n timeout?: number;\n}): Promise<C extends 0 ? null : TransactionReceipt> => {\n const txResponse = await signer.sendTransaction(transaction);\n\n return (await txResponse.wait(confirmations, timeout)) as C extends 0 ? null : TransactionReceipt;\n};\n\nexport const getSignerAddressFromMessage = (message: string, signedMessage: string) =>\n verifyMessage(toBeArray(message), signedMessage);\n","import { JsonRpcSigner, TransactionReceipt as EthersTransactionReceipt } from \"ethers\";\n\nimport { switchChain, sendTransaction as _sendTransaction } from \"@shared/utils/signerUtils\";\nimport { TransactionReceipt, Address } from \"@shared/types\";\n\nimport type { SignMessage, SendTransaction, SignTypedData } from \"../types\";\n\n/**\n * Get the transaction receipt from the ethers transaction receipt.\n *\n * @param {EthersTransactionReceipt} txReceipt The ethers transaction receipt.\n * @returns {TransactionReceipt} The transaction receipt.\n */\nconst _getTransactionReceipt = (txReceipt: EthersTransactionReceipt): TransactionReceipt => {\n return {\n transactionHash: txReceipt.hash,\n blockHash: txReceipt.blockHash,\n blockNumber: txReceipt.blockNumber,\n from: txReceipt.from,\n to: txReceipt.to || undefined,\n rawReceipt: txReceipt,\n };\n};\n\n/**\n * Connect to a signer.\n *\n * @param {function} getSigner {function} The function to get the signer.\n * @returns {function} ``getAddress`` {function} Function that returns the address of the signer.\n * @returns {function} ``signMessage`` {{@link SignMessage}} Function that signs a message.\n * @returns {function} ``sendTransaction`` {{@link SendTransaction}} Function that sends an EVM transaction.\n */\nexport const connectSigner = (\n getSigner: (address?: Address) => Promise<JsonRpcSigner>\n): {\n getAddress: () => Promise<Address>;\n signMessage: SignMessage;\n sendTransaction: SendTransaction;\n signTypedData: SignTypedData;\n} => {\n const getAddress = async (): Promise<Address> => {\n const signer = await getSigner();\n return signer.getAddress();\n };\n\n const signMessage: SignMessage = async ({ message, ownerAddress }) => {\n const signer = await getSigner(ownerAddress);\n if (ownerAddress) {\n const address = await signer.getAddress();\n if (ownerAddress !== address) {\n throw new Error(\"Owner address does not match\");\n }\n }\n const signature = await signer.signMessage(message);\n return signature;\n };\n\n const sendTransaction: SendTransaction = async (transaction, chainConfig) => {\n let signer = await getSigner();\n const signerNetwork = await signer.provider?.getNetwork();\n if (signerNetwork?.chainId?.toString() !== transaction.chainId.toString()) {\n await switchChain(transaction.chainId, signer, chainConfig);\n signer = await getSigner();\n }\n const ethersTxReceipt = await _sendTransaction({ signer, transaction });\n return _getTransactionReceipt(ethersTxReceipt);\n };\n\n const signTypedData: SignTypedData = async ({ typedData, ownerAddress }) => {\n const signer = await getSigner(ownerAddress);\n if (ownerAddress) {\n const address = await signer.getAddress();\n if (ownerAddress !== address) {\n throw new Error(\"Owner address does not match\");\n }\n }\n return await signer.provider?.send(\"eth_signTypedData_v4\", [ownerAddress, typedData]);\n };\n\n return { getAddress, signMessage, sendTransaction, signTypedData };\n};\n"],"names":["switchChain","async","chainId","signer","chainConfig","provider","Error","send","toString","error","console","addChain","String","chain_id","blockExplorerUrls","explorer","chainName","network","iconUrls","image","nativeCurrency","native_currency","rpcUrls","rpc","_getEVMChainParamFromChainConfig","getSigner","getAddress","signMessage","message","ownerAddress","sendTransaction","transaction","signerNetwork","getNetwork","ethersTxReceipt","confirmations","timeout","txResponse","wait","_sendTransaction","transactionHash","txReceipt","hash","blockHash","blockNumber","from","to","undefined","rawReceipt","signTypedData","typedData"],"mappings":"+BAiBO,MA0BMA,EAAcC,MAAOC,EAAiBC,EAAuBC,KACtE,IAAKD,EAAOE,SACR,MAAM,IAAIC,MAAM,mCAGpB,UACUH,EAAOE,SAASE,KAAK,6BAA8B,CAAC,CAAEL,QAAS,KAAKA,EAAQM,SAAS,SAC7F,MAAOC,GAEL,GADAC,QAAQD,MAAM,wBAAyBA,IACnCL,EASA,MAAMK,EARN,SAlBYR,OAAOE,EAAuBC,KAClD,IAAKD,EAAOE,SACR,MAAM,IAAIC,MAAM,yCAGdH,EAAOE,SAASE,KAAK,0BAA2B,CAACH,GAAa,EAclDO,CAASR,EArCiB,CAACC,IAA4D,CACzGF,QAASU,OAAOR,EAAYS,UAC5BC,kBAAmB,CAACV,EAAYW,UAChCC,UAAWZ,EAAYa,QACvBC,SAAU,CAACd,EAAYe,OACvBC,eAAgBhB,EAAYiB,gBAC5BC,QAAS,CAAClB,EAAYmB,OA+BaC,CAAiCpB,UAClDD,EAAOE,SAASE,KAAK,6BAA8B,CAAC,CAAEL,QAAS,KAAKA,EAAQM,SAAS,SAC7F,MAAOC,GAEL,MADAC,QAAQD,MAAM,qBAAsBA,GAC9BA,2BCzBlBgB,IA8CO,CAAEC,WAvCUzB,gBACMwB,KACPC,aAqCGC,YAlCY1B,OAAS2B,UAASC,mBAC/C,MAAM1B,QAAesB,EAAUI,GAC/B,GAAIA,EAAc,CAEd,GAAIA,UADkB1B,EAAOuB,aAEzB,MAAM,IAAIpB,MAAM,gCAIxB,aADwBH,EAAOwB,YAAYC,EAC3B,EAyBcE,gBAtBO7B,MAAO8B,EAAa3B,KACzD,IAAID,QAAesB,IACnB,MAAMO,QAAsB7B,EAAOE,UAAU4B,cACzCD,GAAe9B,SAASM,aAAeuB,EAAY7B,QAAQM,mBACrDR,EAAY+B,EAAY7B,QAASC,EAAQC,GAC/CD,QAAesB,KAEnB,MAAMS,ODciBjC,QAC3BE,SACA4B,cACAI,gBACAC,cAOA,MAAMC,QAAmBlC,EAAO2B,gBAAgBC,GAEhD,aAAcM,EAAWC,KAAKH,EAAeC,EAAQ,EC3BnBG,CAAiB,CAAEpC,SAAQ4B,gBACzD,MAnDG,CACHS,iBAFwBC,EAoDMP,GAlDHQ,KAC3BC,UAAWF,EAAUE,UACrBC,YAAaH,EAAUG,YACvBC,KAAMJ,EAAUI,KAChBC,GAAIL,EAAUK,SAAMC,EACpBC,WAAYP,GAPW,IAACA,CAoDsB,EAcCQ,cAXdhD,OAASiD,YAAWrB,mBACrD,MAAM1B,QAAesB,EAAUI,GAC/B,GAAIA,EAAc,CAEd,GAAIA,UADkB1B,EAAOuB,aAEzB,MAAM,IAAIpB,MAAM,gCAGxB,aAAaH,EAAOE,UAAUE,KAAK,uBAAwB,CAACsB,EAAcqB,IAAW"}
1
+ {"version":3,"file":"index.cjs.min.js","sources":["../../../../_shared/utils/signerUtils.ts","../../../src/paymentsWidget/ethers/index.ts"],"sourcesContent":["import { TransactionReceipt, TransactionRequest, JsonRpcSigner, verifyMessage, toBeArray } from \"ethers\";\nimport { EVMChainConfig } from \"@shared/types\";\n\n// https://eips.ethereum.org/EIPS/eip-3085\ntype AddEthereumChainParameter = {\n chainId: string;\n blockExplorerUrls?: string[];\n chainName?: string;\n iconUrls?: string[];\n nativeCurrency?: {\n name: string;\n symbol: string;\n decimals: number;\n };\n rpcUrls?: string[];\n};\n\nexport const _getEVMChainParamFromChainConfig = (chainConfig: EVMChainConfig): AddEthereumChainParameter => ({\n chainId: `0x${chainConfig.chain_id.toString(16)}`,\n blockExplorerUrls: [chainConfig.explorer],\n chainName: chainConfig.network,\n iconUrls: [chainConfig.image],\n nativeCurrency: chainConfig.native_currency,\n rpcUrls: [chainConfig.rpc],\n});\n\nexport const getChainIdFromSigner = async (signer: JsonRpcSigner): Promise<number> => {\n if (!signer.provider) {\n throw new Error(\"Signer does not have a provider\");\n }\n\n const network = await signer.provider.getNetwork();\n return Number(network.chainId.toString());\n};\n\nexport const addChain = async (signer: JsonRpcSigner, chainConfig: AddEthereumChainParameter) => {\n if (!signer.provider) {\n throw new Error(\"Signer does not have a provider\");\n }\n\n await signer.provider.send(\"wallet_addEthereumChain\", [chainConfig]);\n};\n\nexport const switchChain = async (chainId: number, signer: JsonRpcSigner, chainConfig?: EVMChainConfig) => {\n if (!signer.provider) {\n throw new Error(\"Signer does not have a provider\");\n }\n\n try {\n await signer.provider.send(\"wallet_switchEthereumChain\", [{ chainId: `0x${chainId.toString(16)}` }]);\n } catch (error) {\n console.error(\"Error switching chain\", error);\n if (chainConfig) {\n try {\n await addChain(signer, _getEVMChainParamFromChainConfig(chainConfig));\n await signer.provider.send(\"wallet_switchEthereumChain\", [{ chainId: `0x${chainId.toString(16)}` }]);\n } catch (error) {\n console.error(\"Error adding chain\", error);\n throw error;\n }\n } else {\n throw error;\n }\n }\n};\n\n/**\n * Send a transaction using the signer.\n *\n * @param {JsonRpcSigner} signer {{@link JsonRpcSigner}} The signer to send the transaction.\n * @param {TransactionRequest} transaction {{@link TransactionRequest}} The transaction to send.\n * @param {number} confirmations {{@link number}} (optional) The number of confirmations to wait for default to 1.\n * @param {number} timeout {{@link number}} (optional) The timeout to wait for.\n * @returns {Promise<TransactionReceipt | null>} ``receipt`` {{@link TransactionReceipt}} The transaction receipt.\n *\n * If confirmations is 0, the promise will resolve to ``null``.\n * Check the {@link https://docs.ethers.org/v6/api/providers/#TransactionResponse-wait ethers v6 documentation} for more information.\n */\nexport const sendTransaction = async <C extends number = 1>({\n signer,\n transaction,\n confirmations,\n timeout,\n}: {\n signer: JsonRpcSigner;\n transaction: TransactionRequest;\n confirmations?: C;\n timeout?: number;\n}): Promise<C extends 0 ? null : TransactionReceipt> => {\n const txResponse = await signer.sendTransaction(transaction);\n\n return (await txResponse.wait(confirmations, timeout)) as C extends 0 ? null : TransactionReceipt;\n};\n\nexport const getSignerAddressFromMessage = (message: string, signedMessage: string) =>\n verifyMessage(toBeArray(message), signedMessage);\n","import { JsonRpcSigner, TransactionReceipt as EthersTransactionReceipt } from \"ethers\";\n\nimport { switchChain, sendTransaction as _sendTransaction } from \"@shared/utils/signerUtils\";\nimport { TransactionReceipt, Address } from \"@shared/types\";\n\nimport type { SignMessage, SendTransaction, SignTypedData, WalletActionsType } from \"../types\";\n\n/**\n * Get the transaction receipt from the ethers transaction receipt.\n *\n * @param {EthersTransactionReceipt} txReceipt The ethers transaction receipt.\n * @returns {TransactionReceipt} The transaction receipt.\n */\nconst _getTransactionReceipt = (txReceipt: EthersTransactionReceipt): TransactionReceipt => {\n return {\n transactionHash: txReceipt.hash,\n blockHash: txReceipt.blockHash,\n blockNumber: txReceipt.blockNumber,\n from: txReceipt.from,\n to: txReceipt.to || undefined,\n rawReceipt: txReceipt,\n };\n};\n\n/**\n * Connect to a signer.\n *\n * @param {function} getSigner {function} The function to get the signer.\n * @returns {function} ``getAddress`` {function} Function that returns the address of the signer.\n * @returns {function} ``signMessage`` {{@link SignMessage}} Function that signs a message.\n * @returns {function} ``sendTransaction`` {{@link SendTransaction}} Function that sends an EVM transaction.\n */\nexport const connectSigner = (\n getSigner: (address?: Address) => Promise<JsonRpcSigner>\n): Required<WalletActionsType> => {\n const getAddress = async (): Promise<Address> => {\n const signer = await getSigner();\n return signer.getAddress();\n };\n\n const signMessage: SignMessage = async ({ message, ownerAddress }) => {\n const signer = await getSigner(ownerAddress);\n if (ownerAddress) {\n const address = await signer.getAddress();\n if (ownerAddress !== address) {\n throw new Error(\"Owner address does not match\");\n }\n }\n const signature = await signer.signMessage(message);\n return signature;\n };\n\n const sendTransaction: SendTransaction = async (transaction, chainConfig) => {\n let signer = await getSigner();\n const signerNetwork = await signer.provider?.getNetwork();\n if (signerNetwork?.chainId?.toString() !== transaction.chainId.toString()) {\n await switchChain(transaction.chainId, signer, chainConfig);\n signer = await getSigner();\n }\n const ethersTxReceipt = await _sendTransaction({ signer, transaction });\n return _getTransactionReceipt(ethersTxReceipt);\n };\n\n const signTypedData: SignTypedData = async ({ typedData, ownerAddress }) => {\n const signer = await getSigner(ownerAddress);\n if (ownerAddress) {\n const address = await signer.getAddress();\n if (ownerAddress !== address) {\n throw new Error(\"Owner address does not match\");\n }\n }\n return await signer.provider?.send(\"eth_signTypedData_v4\", [ownerAddress, typedData]);\n };\n\n return { getAddress, signMessage, sendTransaction, signTypedData };\n};\n"],"names":["switchChain","async","chainId","signer","chainConfig","provider","Error","send","toString","error","console","addChain","chain_id","blockExplorerUrls","explorer","chainName","network","iconUrls","image","nativeCurrency","native_currency","rpcUrls","rpc","_getEVMChainParamFromChainConfig","getSigner","getAddress","signMessage","message","ownerAddress","sendTransaction","transaction","signerNetwork","getNetwork","ethersTxReceipt","confirmations","timeout","txResponse","wait","_sendTransaction","transactionHash","txReceipt","hash","blockHash","blockNumber","from","to","undefined","rawReceipt","signTypedData","typedData"],"mappings":"+BAiBO,MA0BMA,EAAcC,MAAOC,EAAiBC,EAAuBC,KACtE,IAAKD,EAAOE,SACR,MAAM,IAAIC,MAAM,mCAGpB,UACUH,EAAOE,SAASE,KAAK,6BAA8B,CAAC,CAAEL,QAAS,KAAKA,EAAQM,SAAS,SAC7F,MAAOC,GAEL,GADAC,QAAQD,MAAM,wBAAyBA,IACnCL,EASA,MAAMK,EARN,SAlBYR,OAAOE,EAAuBC,KAClD,IAAKD,EAAOE,SACR,MAAM,IAAIC,MAAM,yCAGdH,EAAOE,SAASE,KAAK,0BAA2B,CAACH,GAAa,EAclDO,CAASR,EArCiB,CAACC,IAA4D,CACzGF,QAAS,KAAKE,EAAYQ,SAASJ,SAAS,MAC5CK,kBAAmB,CAACT,EAAYU,UAChCC,UAAWX,EAAYY,QACvBC,SAAU,CAACb,EAAYc,OACvBC,eAAgBf,EAAYgB,gBAC5BC,QAAS,CAACjB,EAAYkB,OA+BaC,CAAiCnB,UAClDD,EAAOE,SAASE,KAAK,6BAA8B,CAAC,CAAEL,QAAS,KAAKA,EAAQM,SAAS,SAC7F,MAAOC,GAEL,MADAC,QAAQD,MAAM,qBAAsBA,GAC9BA,2BCzBlBe,IAyCO,CAAEC,WAvCUxB,gBACMuB,KACPC,aAqCGC,YAlCYzB,OAAS0B,UAASC,mBAC/C,MAAMzB,QAAeqB,EAAUI,GAC/B,GAAIA,EAAc,CAEd,GAAIA,UADkBzB,EAAOsB,aAEzB,MAAM,IAAInB,MAAM,gCAIxB,aADwBH,EAAOuB,YAAYC,EAC3B,EAyBcE,gBAtBO5B,MAAO6B,EAAa1B,KACzD,IAAID,QAAeqB,IACnB,MAAMO,QAAsB5B,EAAOE,UAAU2B,cACzCD,GAAe7B,SAASM,aAAesB,EAAY5B,QAAQM,mBACrDR,EAAY8B,EAAY5B,QAASC,EAAQC,GAC/CD,QAAeqB,KAEnB,MAAMS,ODmBiBhC,QAC3BE,SACA2B,cACAI,gBACAC,cAOA,MAAMC,QAAmBjC,EAAO0B,gBAAgBC,GAEhD,aAAcM,EAAWC,KAAKH,EAAeC,EAAQ,EChCnBG,CAAiB,CAAEnC,SAAQ2B,gBACzD,MA9CG,CACHS,iBAFwBC,EA+CMP,GA7CHQ,KAC3BC,UAAWF,EAAUE,UACrBC,YAAaH,EAAUG,YACvBC,KAAMJ,EAAUI,KAChBC,GAAIL,EAAUK,SAAMC,EACpBC,WAAYP,GAPW,IAACA,CA+CsB,EAcCQ,cAXd/C,OAASgD,YAAWrB,mBACrD,MAAMzB,QAAeqB,EAAUI,GAC/B,GAAIA,EAAc,CAEd,GAAIA,UADkBzB,EAAOsB,aAEzB,MAAM,IAAInB,MAAM,gCAGxB,aAAaH,EAAOE,UAAUE,KAAK,uBAAwB,CAACqB,EAAcqB,IAAW"}
@@ -0,0 +1,72 @@
1
+ import { JsonRpcSigner } from 'ethers';
2
+ import { z } from 'zod/v4';
3
+
4
+ declare const Address: z.ZodUnion<readonly [z.ZodString, z.ZodString]>;
5
+ type Address = z.infer<typeof Address>;
6
+ declare const TransactionRequest: z.ZodObject<{
7
+ to: z.ZodString;
8
+ from: z.ZodOptional<z.ZodString>;
9
+ nonce: z.ZodOptional<z.ZodNumber>;
10
+ gasLimit: z.ZodOptional<z.ZodBigInt>;
11
+ gasPrice: z.ZodOptional<z.ZodBigInt>;
12
+ maxPriorityFeePerGas: z.ZodOptional<z.ZodBigInt>;
13
+ maxFeePerGas: z.ZodOptional<z.ZodBigInt>;
14
+ data: z.ZodOptional<z.ZodString>;
15
+ value: z.ZodOptional<z.ZodBigInt>;
16
+ chainId: z.ZodNumber;
17
+ }, z.core.$strip>;
18
+ type TransactionRequest = z.infer<typeof TransactionRequest>;
19
+ declare const TransactionReceipt: z.ZodObject<{
20
+ transactionHash: z.ZodOptional<z.ZodString>;
21
+ blockHash: z.ZodOptional<z.ZodString>;
22
+ blockNumber: z.ZodOptional<z.ZodNumber>;
23
+ from: z.ZodOptional<z.ZodString>;
24
+ to: z.ZodOptional<z.ZodString>;
25
+ rawReceipt: z.ZodAny;
26
+ }, z.core.$strip>;
27
+ type TransactionReceipt = z.infer<typeof TransactionReceipt>;
28
+ declare const EVMChainConfig: z.ZodObject<{
29
+ chain_id: z.ZodNumber;
30
+ network: z.ZodString;
31
+ native_currency: z.ZodObject<{
32
+ name: z.ZodString;
33
+ symbol: z.ZodString;
34
+ decimals: z.ZodNumber;
35
+ }, z.core.$strip>;
36
+ rpc: z.ZodString;
37
+ image: z.ZodString;
38
+ is_testnet: z.ZodBoolean;
39
+ explorer: z.ZodString;
40
+ }, z.core.$strip>;
41
+ type EVMChainConfig = z.infer<typeof EVMChainConfig>;
42
+
43
+ declare const TypedData: z.ZodString;
44
+ type TypedData = z.infer<typeof TypedData>;
45
+
46
+ type SignMessage = (input: {
47
+ message: string;
48
+ ownerAddress?: Address;
49
+ }) => Promise<string>;
50
+ type SignTypedData = (input: {
51
+ typedData: TypedData;
52
+ ownerAddress?: Address;
53
+ }) => Promise<string>;
54
+ type SendTransaction = (transaction: TransactionRequest, chainConfig: EVMChainConfig) => Promise<TransactionReceipt>;
55
+ type WalletActionsType = {
56
+ getAddress: () => Promise<Address>;
57
+ signMessage?: SignMessage;
58
+ sendTransaction?: SendTransaction;
59
+ signTypedData?: SignTypedData;
60
+ };
61
+
62
+ /**
63
+ * Connect to a signer.
64
+ *
65
+ * @param {function} getSigner {function} The function to get the signer.
66
+ * @returns {function} ``getAddress`` {function} Function that returns the address of the signer.
67
+ * @returns {function} ``signMessage`` {{@link SignMessage}} Function that signs a message.
68
+ * @returns {function} ``sendTransaction`` {{@link SendTransaction}} Function that sends an EVM transaction.
69
+ */
70
+ declare const connectSigner: (getSigner: (address?: Address) => Promise<JsonRpcSigner>) => Required<WalletActionsType>;
71
+
72
+ export { connectSigner };
@@ -1,2 +1,2 @@
1
- import"ethers";const r=async(r,a,t)=>{if(!a.provider)throw new Error("Signer does not have a provider");try{await a.provider.send("wallet_switchEthereumChain",[{chainId:`0x${r.toString(16)}`}])}catch(e){if(console.error("Error switching chain",e),!t)throw e;try{await(async(r,a)=>{if(!r.provider)throw new Error("Signer does not have a provider");await r.provider.send("wallet_addEthereumChain",[a])})(a,(r=>({chainId:String(r.chain_id),blockExplorerUrls:[r.explorer],chainName:r.network,iconUrls:[r.image],nativeCurrency:r.native_currency,rpcUrls:[r.rpc]}))(t)),await a.provider.send("wallet_switchEthereumChain",[{chainId:`0x${r.toString(16)}`}])}catch(r){throw console.error("Error adding chain",r),r}}},a=a=>({getAddress:async()=>(await a()).getAddress(),signMessage:async({message:r,ownerAddress:t})=>{const e=await a(t);if(t){if(t!==await e.getAddress())throw new Error("Owner address does not match")}return await e.signMessage(r)},sendTransaction:async(t,e)=>{let n=await a();const i=await(n.provider?.getNetwork());i?.chainId?.toString()!==t.chainId.toString()&&(await r(t.chainId,n,e),n=await a());const o=await(async({signer:r,transaction:a,confirmations:t,timeout:e})=>{const n=await r.sendTransaction(a);return await n.wait(t,e)})({signer:n,transaction:t});return{transactionHash:(s=o).hash,blockHash:s.blockHash,blockNumber:s.blockNumber,from:s.from,to:s.to||void 0,rawReceipt:s};var s},signTypedData:async({typedData:r,ownerAddress:t})=>{const e=await a(t);if(t){if(t!==await e.getAddress())throw new Error("Owner address does not match")}return await(e.provider?.send("eth_signTypedData_v4",[t,r]))}});export{a as connectSigner};
1
+ import"ethers";const r=async(r,a,t)=>{if(!a.provider)throw new Error("Signer does not have a provider");try{await a.provider.send("wallet_switchEthereumChain",[{chainId:`0x${r.toString(16)}`}])}catch(e){if(console.error("Error switching chain",e),!t)throw e;try{await(async(r,a)=>{if(!r.provider)throw new Error("Signer does not have a provider");await r.provider.send("wallet_addEthereumChain",[a])})(a,(r=>({chainId:`0x${r.chain_id.toString(16)}`,blockExplorerUrls:[r.explorer],chainName:r.network,iconUrls:[r.image],nativeCurrency:r.native_currency,rpcUrls:[r.rpc]}))(t)),await a.provider.send("wallet_switchEthereumChain",[{chainId:`0x${r.toString(16)}`}])}catch(r){throw console.error("Error adding chain",r),r}}},a=a=>({getAddress:async()=>(await a()).getAddress(),signMessage:async({message:r,ownerAddress:t})=>{const e=await a(t);if(t){if(t!==await e.getAddress())throw new Error("Owner address does not match")}return await e.signMessage(r)},sendTransaction:async(t,e)=>{let n=await a();const i=await(n.provider?.getNetwork());i?.chainId?.toString()!==t.chainId.toString()&&(await r(t.chainId,n,e),n=await a());const o=await(async({signer:r,transaction:a,confirmations:t,timeout:e})=>{const n=await r.sendTransaction(a);return await n.wait(t,e)})({signer:n,transaction:t});return{transactionHash:(s=o).hash,blockHash:s.blockHash,blockNumber:s.blockNumber,from:s.from,to:s.to||void 0,rawReceipt:s};var s},signTypedData:async({typedData:r,ownerAddress:t})=>{const e=await a(t);if(t){if(t!==await e.getAddress())throw new Error("Owner address does not match")}return await(e.provider?.send("eth_signTypedData_v4",[t,r]))}});export{a as connectSigner};
2
2
  //# sourceMappingURL=index.esm.min.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.esm.min.js","sources":["../../../../_shared/utils/signerUtils.ts","../../../src/paymentsWidget/ethers/index.ts"],"sourcesContent":["import { TransactionReceipt, TransactionRequest, JsonRpcSigner, verifyMessage, toBeArray } from \"ethers\";\nimport { EVMChainConfig } from \"@shared/types\";\n\n// https://eips.ethereum.org/EIPS/eip-3085\ntype AddEthereumChainParameter = {\n chainId: string;\n blockExplorerUrls?: string[];\n chainName?: string;\n iconUrls?: string[];\n nativeCurrency?: {\n name: string;\n symbol: string;\n decimals: number;\n };\n rpcUrls?: string[];\n};\n\nexport const _getEVMChainParamFromChainConfig = (chainConfig: EVMChainConfig): AddEthereumChainParameter => ({\n chainId: String(chainConfig.chain_id),\n blockExplorerUrls: [chainConfig.explorer],\n chainName: chainConfig.network,\n iconUrls: [chainConfig.image],\n nativeCurrency: chainConfig.native_currency,\n rpcUrls: [chainConfig.rpc],\n});\n\nexport const getChainIdFromSigner = async (signer: JsonRpcSigner): Promise<number> => {\n if (!signer.provider) {\n throw new Error(\"Signer does not have a provider\");\n }\n\n const network = await signer.provider.getNetwork();\n return Number(network.chainId.toString());\n};\n\nexport const addChain = async (signer: JsonRpcSigner, chainConfig: AddEthereumChainParameter) => {\n if (!signer.provider) {\n throw new Error(\"Signer does not have a provider\");\n }\n\n await signer.provider.send(\"wallet_addEthereumChain\", [chainConfig]);\n};\n\nexport const switchChain = async (chainId: number, signer: JsonRpcSigner, chainConfig?: EVMChainConfig) => {\n if (!signer.provider) {\n throw new Error(\"Signer does not have a provider\");\n }\n\n try {\n await signer.provider.send(\"wallet_switchEthereumChain\", [{ chainId: `0x${chainId.toString(16)}` }]);\n } catch (error) {\n console.error(\"Error switching chain\", error);\n if (chainConfig) {\n try {\n await addChain(signer, _getEVMChainParamFromChainConfig(chainConfig));\n await signer.provider.send(\"wallet_switchEthereumChain\", [{ chainId: `0x${chainId.toString(16)}` }]);\n } catch (error) {\n console.error(\"Error adding chain\", error);\n throw error;\n }\n } else {\n throw error;\n }\n }\n};\n\n/**\n * Send a transaction using the signer.\n *\n * @param {JsonRpcSigner} signer {{@link JsonRpcSigner}} The signer to send the transaction.\n * @param {TransactionRequest} transaction {{@link TransactionRequest}} The transaction to send.\n * @param {number} confirmations {{@link number}} (optional) The number of confirmations to wait for default to 1.\n * @param {number} timeout {{@link number}} (optional) The timeout to wait for.\n * @returns {Promise<TransactionReceipt | null>} ``receipt`` {{@link TransactionReceipt}} The transaction receipt.\n *\n * If confirmations is 0, the promise will resolve to ``null``.\n * Check the {@link https://docs.ethers.org/v6/api/providers/#TransactionResponse-wait ethers v6 documentation} for more information.\n */\nexport const sendTransaction = async <C extends number = 1>({\n signer,\n transaction,\n confirmations,\n timeout,\n}: {\n signer: JsonRpcSigner;\n transaction: TransactionRequest;\n confirmations?: C;\n timeout?: number;\n}): Promise<C extends 0 ? null : TransactionReceipt> => {\n const txResponse = await signer.sendTransaction(transaction);\n\n return (await txResponse.wait(confirmations, timeout)) as C extends 0 ? null : TransactionReceipt;\n};\n\nexport const getSignerAddressFromMessage = (message: string, signedMessage: string) =>\n verifyMessage(toBeArray(message), signedMessage);\n","import { JsonRpcSigner, TransactionReceipt as EthersTransactionReceipt } from \"ethers\";\n\nimport { switchChain, sendTransaction as _sendTransaction } from \"@shared/utils/signerUtils\";\nimport { TransactionReceipt, Address } from \"@shared/types\";\n\nimport type { SignMessage, SendTransaction, SignTypedData } from \"../types\";\n\n/**\n * Get the transaction receipt from the ethers transaction receipt.\n *\n * @param {EthersTransactionReceipt} txReceipt The ethers transaction receipt.\n * @returns {TransactionReceipt} The transaction receipt.\n */\nconst _getTransactionReceipt = (txReceipt: EthersTransactionReceipt): TransactionReceipt => {\n return {\n transactionHash: txReceipt.hash,\n blockHash: txReceipt.blockHash,\n blockNumber: txReceipt.blockNumber,\n from: txReceipt.from,\n to: txReceipt.to || undefined,\n rawReceipt: txReceipt,\n };\n};\n\n/**\n * Connect to a signer.\n *\n * @param {function} getSigner {function} The function to get the signer.\n * @returns {function} ``getAddress`` {function} Function that returns the address of the signer.\n * @returns {function} ``signMessage`` {{@link SignMessage}} Function that signs a message.\n * @returns {function} ``sendTransaction`` {{@link SendTransaction}} Function that sends an EVM transaction.\n */\nexport const connectSigner = (\n getSigner: (address?: Address) => Promise<JsonRpcSigner>\n): {\n getAddress: () => Promise<Address>;\n signMessage: SignMessage;\n sendTransaction: SendTransaction;\n signTypedData: SignTypedData;\n} => {\n const getAddress = async (): Promise<Address> => {\n const signer = await getSigner();\n return signer.getAddress();\n };\n\n const signMessage: SignMessage = async ({ message, ownerAddress }) => {\n const signer = await getSigner(ownerAddress);\n if (ownerAddress) {\n const address = await signer.getAddress();\n if (ownerAddress !== address) {\n throw new Error(\"Owner address does not match\");\n }\n }\n const signature = await signer.signMessage(message);\n return signature;\n };\n\n const sendTransaction: SendTransaction = async (transaction, chainConfig) => {\n let signer = await getSigner();\n const signerNetwork = await signer.provider?.getNetwork();\n if (signerNetwork?.chainId?.toString() !== transaction.chainId.toString()) {\n await switchChain(transaction.chainId, signer, chainConfig);\n signer = await getSigner();\n }\n const ethersTxReceipt = await _sendTransaction({ signer, transaction });\n return _getTransactionReceipt(ethersTxReceipt);\n };\n\n const signTypedData: SignTypedData = async ({ typedData, ownerAddress }) => {\n const signer = await getSigner(ownerAddress);\n if (ownerAddress) {\n const address = await signer.getAddress();\n if (ownerAddress !== address) {\n throw new Error(\"Owner address does not match\");\n }\n }\n return await signer.provider?.send(\"eth_signTypedData_v4\", [ownerAddress, typedData]);\n };\n\n return { getAddress, signMessage, sendTransaction, signTypedData };\n};\n"],"names":["switchChain","async","chainId","signer","chainConfig","provider","Error","send","toString","error","console","addChain","String","chain_id","blockExplorerUrls","explorer","chainName","network","iconUrls","image","nativeCurrency","native_currency","rpcUrls","rpc","_getEVMChainParamFromChainConfig","connectSigner","getSigner","getAddress","signMessage","message","ownerAddress","sendTransaction","transaction","signerNetwork","getNetwork","ethersTxReceipt","confirmations","timeout","txResponse","wait","_sendTransaction","transactionHash","txReceipt","hash","blockHash","blockNumber","from","to","undefined","rawReceipt","signTypedData","typedData"],"mappings":"eAiBO,MA0BMA,EAAcC,MAAOC,EAAiBC,EAAuBC,KACtE,IAAKD,EAAOE,SACR,MAAM,IAAIC,MAAM,mCAGpB,UACUH,EAAOE,SAASE,KAAK,6BAA8B,CAAC,CAAEL,QAAS,KAAKA,EAAQM,SAAS,SAC7F,MAAOC,GAEL,GADAC,QAAQD,MAAM,wBAAyBA,IACnCL,EASA,MAAMK,EARN,SAlBYR,OAAOE,EAAuBC,KAClD,IAAKD,EAAOE,SACR,MAAM,IAAIC,MAAM,yCAGdH,EAAOE,SAASE,KAAK,0BAA2B,CAACH,GAAa,EAclDO,CAASR,EArCiB,CAACC,IAA4D,CACzGF,QAASU,OAAOR,EAAYS,UAC5BC,kBAAmB,CAACV,EAAYW,UAChCC,UAAWZ,EAAYa,QACvBC,SAAU,CAACd,EAAYe,OACvBC,eAAgBhB,EAAYiB,gBAC5BC,QAAS,CAAClB,EAAYmB,OA+BaC,CAAiCpB,UAClDD,EAAOE,SAASE,KAAK,6BAA8B,CAAC,CAAEL,QAAS,KAAKA,EAAQM,SAAS,SAC7F,MAAOC,GAEL,MADAC,QAAQD,MAAM,qBAAsBA,GAC9BA,KC1BTgB,EACTC,IA8CO,CAAEC,WAvCU1B,gBACMyB,KACPC,aAqCGC,YAlCY3B,OAAS4B,UAASC,mBAC/C,MAAM3B,QAAeuB,EAAUI,GAC/B,GAAIA,EAAc,CAEd,GAAIA,UADkB3B,EAAOwB,aAEzB,MAAM,IAAIrB,MAAM,gCAIxB,aADwBH,EAAOyB,YAAYC,EAC3B,EAyBcE,gBAtBO9B,MAAO+B,EAAa5B,KACzD,IAAID,QAAeuB,IACnB,MAAMO,QAAsB9B,EAAOE,UAAU6B,cACzCD,GAAe/B,SAASM,aAAewB,EAAY9B,QAAQM,mBACrDR,EAAYgC,EAAY9B,QAASC,EAAQC,GAC/CD,QAAeuB,KAEnB,MAAMS,ODciBlC,QAC3BE,SACA6B,cACAI,gBACAC,cAOA,MAAMC,QAAmBnC,EAAO4B,gBAAgBC,GAEhD,aAAcM,EAAWC,KAAKH,EAAeC,EAAQ,EC3BnBG,CAAiB,CAAErC,SAAQ6B,gBACzD,MAnDG,CACHS,iBAFwBC,EAoDMP,GAlDHQ,KAC3BC,UAAWF,EAAUE,UACrBC,YAAaH,EAAUG,YACvBC,KAAMJ,EAAUI,KAChBC,GAAIL,EAAUK,SAAMC,EACpBC,WAAYP,GAPW,IAACA,CAoDsB,EAcCQ,cAXdjD,OAASkD,YAAWrB,mBACrD,MAAM3B,QAAeuB,EAAUI,GAC/B,GAAIA,EAAc,CAEd,GAAIA,UADkB3B,EAAOwB,aAEzB,MAAM,IAAIrB,MAAM,gCAGxB,aAAaH,EAAOE,UAAUE,KAAK,uBAAwB,CAACuB,EAAcqB,IAAW"}
1
+ {"version":3,"file":"index.esm.min.js","sources":["../../../../_shared/utils/signerUtils.ts","../../../src/paymentsWidget/ethers/index.ts"],"sourcesContent":["import { TransactionReceipt, TransactionRequest, JsonRpcSigner, verifyMessage, toBeArray } from \"ethers\";\nimport { EVMChainConfig } from \"@shared/types\";\n\n// https://eips.ethereum.org/EIPS/eip-3085\ntype AddEthereumChainParameter = {\n chainId: string;\n blockExplorerUrls?: string[];\n chainName?: string;\n iconUrls?: string[];\n nativeCurrency?: {\n name: string;\n symbol: string;\n decimals: number;\n };\n rpcUrls?: string[];\n};\n\nexport const _getEVMChainParamFromChainConfig = (chainConfig: EVMChainConfig): AddEthereumChainParameter => ({\n chainId: `0x${chainConfig.chain_id.toString(16)}`,\n blockExplorerUrls: [chainConfig.explorer],\n chainName: chainConfig.network,\n iconUrls: [chainConfig.image],\n nativeCurrency: chainConfig.native_currency,\n rpcUrls: [chainConfig.rpc],\n});\n\nexport const getChainIdFromSigner = async (signer: JsonRpcSigner): Promise<number> => {\n if (!signer.provider) {\n throw new Error(\"Signer does not have a provider\");\n }\n\n const network = await signer.provider.getNetwork();\n return Number(network.chainId.toString());\n};\n\nexport const addChain = async (signer: JsonRpcSigner, chainConfig: AddEthereumChainParameter) => {\n if (!signer.provider) {\n throw new Error(\"Signer does not have a provider\");\n }\n\n await signer.provider.send(\"wallet_addEthereumChain\", [chainConfig]);\n};\n\nexport const switchChain = async (chainId: number, signer: JsonRpcSigner, chainConfig?: EVMChainConfig) => {\n if (!signer.provider) {\n throw new Error(\"Signer does not have a provider\");\n }\n\n try {\n await signer.provider.send(\"wallet_switchEthereumChain\", [{ chainId: `0x${chainId.toString(16)}` }]);\n } catch (error) {\n console.error(\"Error switching chain\", error);\n if (chainConfig) {\n try {\n await addChain(signer, _getEVMChainParamFromChainConfig(chainConfig));\n await signer.provider.send(\"wallet_switchEthereumChain\", [{ chainId: `0x${chainId.toString(16)}` }]);\n } catch (error) {\n console.error(\"Error adding chain\", error);\n throw error;\n }\n } else {\n throw error;\n }\n }\n};\n\n/**\n * Send a transaction using the signer.\n *\n * @param {JsonRpcSigner} signer {{@link JsonRpcSigner}} The signer to send the transaction.\n * @param {TransactionRequest} transaction {{@link TransactionRequest}} The transaction to send.\n * @param {number} confirmations {{@link number}} (optional) The number of confirmations to wait for default to 1.\n * @param {number} timeout {{@link number}} (optional) The timeout to wait for.\n * @returns {Promise<TransactionReceipt | null>} ``receipt`` {{@link TransactionReceipt}} The transaction receipt.\n *\n * If confirmations is 0, the promise will resolve to ``null``.\n * Check the {@link https://docs.ethers.org/v6/api/providers/#TransactionResponse-wait ethers v6 documentation} for more information.\n */\nexport const sendTransaction = async <C extends number = 1>({\n signer,\n transaction,\n confirmations,\n timeout,\n}: {\n signer: JsonRpcSigner;\n transaction: TransactionRequest;\n confirmations?: C;\n timeout?: number;\n}): Promise<C extends 0 ? null : TransactionReceipt> => {\n const txResponse = await signer.sendTransaction(transaction);\n\n return (await txResponse.wait(confirmations, timeout)) as C extends 0 ? null : TransactionReceipt;\n};\n\nexport const getSignerAddressFromMessage = (message: string, signedMessage: string) =>\n verifyMessage(toBeArray(message), signedMessage);\n","import { JsonRpcSigner, TransactionReceipt as EthersTransactionReceipt } from \"ethers\";\n\nimport { switchChain, sendTransaction as _sendTransaction } from \"@shared/utils/signerUtils\";\nimport { TransactionReceipt, Address } from \"@shared/types\";\n\nimport type { SignMessage, SendTransaction, SignTypedData, WalletActionsType } from \"../types\";\n\n/**\n * Get the transaction receipt from the ethers transaction receipt.\n *\n * @param {EthersTransactionReceipt} txReceipt The ethers transaction receipt.\n * @returns {TransactionReceipt} The transaction receipt.\n */\nconst _getTransactionReceipt = (txReceipt: EthersTransactionReceipt): TransactionReceipt => {\n return {\n transactionHash: txReceipt.hash,\n blockHash: txReceipt.blockHash,\n blockNumber: txReceipt.blockNumber,\n from: txReceipt.from,\n to: txReceipt.to || undefined,\n rawReceipt: txReceipt,\n };\n};\n\n/**\n * Connect to a signer.\n *\n * @param {function} getSigner {function} The function to get the signer.\n * @returns {function} ``getAddress`` {function} Function that returns the address of the signer.\n * @returns {function} ``signMessage`` {{@link SignMessage}} Function that signs a message.\n * @returns {function} ``sendTransaction`` {{@link SendTransaction}} Function that sends an EVM transaction.\n */\nexport const connectSigner = (\n getSigner: (address?: Address) => Promise<JsonRpcSigner>\n): Required<WalletActionsType> => {\n const getAddress = async (): Promise<Address> => {\n const signer = await getSigner();\n return signer.getAddress();\n };\n\n const signMessage: SignMessage = async ({ message, ownerAddress }) => {\n const signer = await getSigner(ownerAddress);\n if (ownerAddress) {\n const address = await signer.getAddress();\n if (ownerAddress !== address) {\n throw new Error(\"Owner address does not match\");\n }\n }\n const signature = await signer.signMessage(message);\n return signature;\n };\n\n const sendTransaction: SendTransaction = async (transaction, chainConfig) => {\n let signer = await getSigner();\n const signerNetwork = await signer.provider?.getNetwork();\n if (signerNetwork?.chainId?.toString() !== transaction.chainId.toString()) {\n await switchChain(transaction.chainId, signer, chainConfig);\n signer = await getSigner();\n }\n const ethersTxReceipt = await _sendTransaction({ signer, transaction });\n return _getTransactionReceipt(ethersTxReceipt);\n };\n\n const signTypedData: SignTypedData = async ({ typedData, ownerAddress }) => {\n const signer = await getSigner(ownerAddress);\n if (ownerAddress) {\n const address = await signer.getAddress();\n if (ownerAddress !== address) {\n throw new Error(\"Owner address does not match\");\n }\n }\n return await signer.provider?.send(\"eth_signTypedData_v4\", [ownerAddress, typedData]);\n };\n\n return { getAddress, signMessage, sendTransaction, signTypedData };\n};\n"],"names":["switchChain","async","chainId","signer","chainConfig","provider","Error","send","toString","error","console","addChain","chain_id","blockExplorerUrls","explorer","chainName","network","iconUrls","image","nativeCurrency","native_currency","rpcUrls","rpc","_getEVMChainParamFromChainConfig","connectSigner","getSigner","getAddress","signMessage","message","ownerAddress","sendTransaction","transaction","signerNetwork","getNetwork","ethersTxReceipt","confirmations","timeout","txResponse","wait","_sendTransaction","transactionHash","txReceipt","hash","blockHash","blockNumber","from","to","undefined","rawReceipt","signTypedData","typedData"],"mappings":"eAiBO,MA0BMA,EAAcC,MAAOC,EAAiBC,EAAuBC,KACtE,IAAKD,EAAOE,SACR,MAAM,IAAIC,MAAM,mCAGpB,UACUH,EAAOE,SAASE,KAAK,6BAA8B,CAAC,CAAEL,QAAS,KAAKA,EAAQM,SAAS,SAC7F,MAAOC,GAEL,GADAC,QAAQD,MAAM,wBAAyBA,IACnCL,EASA,MAAMK,EARN,SAlBYR,OAAOE,EAAuBC,KAClD,IAAKD,EAAOE,SACR,MAAM,IAAIC,MAAM,yCAGdH,EAAOE,SAASE,KAAK,0BAA2B,CAACH,GAAa,EAclDO,CAASR,EArCiB,CAACC,IAA4D,CACzGF,QAAS,KAAKE,EAAYQ,SAASJ,SAAS,MAC5CK,kBAAmB,CAACT,EAAYU,UAChCC,UAAWX,EAAYY,QACvBC,SAAU,CAACb,EAAYc,OACvBC,eAAgBf,EAAYgB,gBAC5BC,QAAS,CAACjB,EAAYkB,OA+BaC,CAAiCnB,UAClDD,EAAOE,SAASE,KAAK,6BAA8B,CAAC,CAAEL,QAAS,KAAKA,EAAQM,SAAS,SAC7F,MAAOC,GAEL,MADAC,QAAQD,MAAM,qBAAsBA,GAC9BA,KC1BTe,EACTC,IAyCO,CAAEC,WAvCUzB,gBACMwB,KACPC,aAqCGC,YAlCY1B,OAAS2B,UAASC,mBAC/C,MAAM1B,QAAesB,EAAUI,GAC/B,GAAIA,EAAc,CAEd,GAAIA,UADkB1B,EAAOuB,aAEzB,MAAM,IAAIpB,MAAM,gCAIxB,aADwBH,EAAOwB,YAAYC,EAC3B,EAyBcE,gBAtBO7B,MAAO8B,EAAa3B,KACzD,IAAID,QAAesB,IACnB,MAAMO,QAAsB7B,EAAOE,UAAU4B,cACzCD,GAAe9B,SAASM,aAAeuB,EAAY7B,QAAQM,mBACrDR,EAAY+B,EAAY7B,QAASC,EAAQC,GAC/CD,QAAesB,KAEnB,MAAMS,ODmBiBjC,QAC3BE,SACA4B,cACAI,gBACAC,cAOA,MAAMC,QAAmBlC,EAAO2B,gBAAgBC,GAEhD,aAAcM,EAAWC,KAAKH,EAAeC,EAAQ,EChCnBG,CAAiB,CAAEpC,SAAQ4B,gBACzD,MA9CG,CACHS,iBAFwBC,EA+CMP,GA7CHQ,KAC3BC,UAAWF,EAAUE,UACrBC,YAAaH,EAAUG,YACvBC,KAAMJ,EAAUI,KAChBC,GAAIL,EAAUK,SAAMC,EACpBC,WAAYP,GAPW,IAACA,CA+CsB,EAcCQ,cAXdhD,OAASiD,YAAWrB,mBACrD,MAAM1B,QAAesB,EAAUI,GAC/B,GAAIA,EAAc,CAEd,GAAIA,UADkB1B,EAAOuB,aAEzB,MAAM,IAAIpB,MAAM,gCAGxB,aAAaH,EAAOE,UAAUE,KAAK,uBAAwB,CAACsB,EAAcqB,IAAW"}
@@ -1,2 +1,2 @@
1
- !function(e,r){"object"==typeof exports&&"undefined"!=typeof module?r(exports,require("ethers")):"function"==typeof define&&define.amd?define(["exports","ethers"],r):r((e="undefined"!=typeof globalThis?globalThis:e||self).ethers={})}(this,(function(e){"use strict";const r=async(e,r,t)=>{if(!r.provider)throw new Error("Signer does not have a provider");try{await r.provider.send("wallet_switchEthereumChain",[{chainId:`0x${e.toString(16)}`}])}catch(a){if(console.error("Error switching chain",a),!t)throw a;try{await(async(e,r)=>{if(!e.provider)throw new Error("Signer does not have a provider");await e.provider.send("wallet_addEthereumChain",[r])})(r,(e=>({chainId:String(e.chain_id),blockExplorerUrls:[e.explorer],chainName:e.network,iconUrls:[e.image],nativeCurrency:e.native_currency,rpcUrls:[e.rpc]}))(t)),await r.provider.send("wallet_switchEthereumChain",[{chainId:`0x${e.toString(16)}`}])}catch(e){throw console.error("Error adding chain",e),e}}};e.connectSigner=e=>({getAddress:async()=>(await e()).getAddress(),signMessage:async({message:r,ownerAddress:t})=>{const a=await e(t);if(t){if(t!==await a.getAddress())throw new Error("Owner address does not match")}return await a.signMessage(r)},sendTransaction:async(t,a)=>{let n=await e();const i=await(n.provider?.getNetwork());i?.chainId?.toString()!==t.chainId.toString()&&(await r(t.chainId,n,a),n=await e());const o=await(async({signer:e,transaction:r,confirmations:t,timeout:a})=>{const n=await e.sendTransaction(r);return await n.wait(t,a)})({signer:n,transaction:t});return{transactionHash:(s=o).hash,blockHash:s.blockHash,blockNumber:s.blockNumber,from:s.from,to:s.to||void 0,rawReceipt:s};var s},signTypedData:async({typedData:r,ownerAddress:t})=>{const a=await e(t);if(t){if(t!==await a.getAddress())throw new Error("Owner address does not match")}return await(a.provider?.send("eth_signTypedData_v4",[t,r]))}})}));
1
+ !function(e,r){"object"==typeof exports&&"undefined"!=typeof module?r(exports,require("ethers")):"function"==typeof define&&define.amd?define(["exports","ethers"],r):r((e="undefined"!=typeof globalThis?globalThis:e||self).ethers={})}(this,(function(e){"use strict";const r=async(e,r,t)=>{if(!r.provider)throw new Error("Signer does not have a provider");try{await r.provider.send("wallet_switchEthereumChain",[{chainId:`0x${e.toString(16)}`}])}catch(a){if(console.error("Error switching chain",a),!t)throw a;try{await(async(e,r)=>{if(!e.provider)throw new Error("Signer does not have a provider");await e.provider.send("wallet_addEthereumChain",[r])})(r,(e=>({chainId:`0x${e.chain_id.toString(16)}`,blockExplorerUrls:[e.explorer],chainName:e.network,iconUrls:[e.image],nativeCurrency:e.native_currency,rpcUrls:[e.rpc]}))(t)),await r.provider.send("wallet_switchEthereumChain",[{chainId:`0x${e.toString(16)}`}])}catch(e){throw console.error("Error adding chain",e),e}}};e.connectSigner=e=>({getAddress:async()=>(await e()).getAddress(),signMessage:async({message:r,ownerAddress:t})=>{const a=await e(t);if(t){if(t!==await a.getAddress())throw new Error("Owner address does not match")}return await a.signMessage(r)},sendTransaction:async(t,a)=>{let n=await e();const i=await(n.provider?.getNetwork());i?.chainId?.toString()!==t.chainId.toString()&&(await r(t.chainId,n,a),n=await e());const o=await(async({signer:e,transaction:r,confirmations:t,timeout:a})=>{const n=await e.sendTransaction(r);return await n.wait(t,a)})({signer:n,transaction:t});return{transactionHash:(s=o).hash,blockHash:s.blockHash,blockNumber:s.blockNumber,from:s.from,to:s.to||void 0,rawReceipt:s};var s},signTypedData:async({typedData:r,ownerAddress:t})=>{const a=await e(t);if(t){if(t!==await a.getAddress())throw new Error("Owner address does not match")}return await(a.provider?.send("eth_signTypedData_v4",[t,r]))}})}));
2
2
  //# sourceMappingURL=index.umd.min.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.umd.min.js","sources":["../../../../_shared/utils/signerUtils.ts","../../../src/paymentsWidget/ethers/index.ts"],"sourcesContent":["import { TransactionReceipt, TransactionRequest, JsonRpcSigner, verifyMessage, toBeArray } from \"ethers\";\nimport { EVMChainConfig } from \"@shared/types\";\n\n// https://eips.ethereum.org/EIPS/eip-3085\ntype AddEthereumChainParameter = {\n chainId: string;\n blockExplorerUrls?: string[];\n chainName?: string;\n iconUrls?: string[];\n nativeCurrency?: {\n name: string;\n symbol: string;\n decimals: number;\n };\n rpcUrls?: string[];\n};\n\nexport const _getEVMChainParamFromChainConfig = (chainConfig: EVMChainConfig): AddEthereumChainParameter => ({\n chainId: String(chainConfig.chain_id),\n blockExplorerUrls: [chainConfig.explorer],\n chainName: chainConfig.network,\n iconUrls: [chainConfig.image],\n nativeCurrency: chainConfig.native_currency,\n rpcUrls: [chainConfig.rpc],\n});\n\nexport const getChainIdFromSigner = async (signer: JsonRpcSigner): Promise<number> => {\n if (!signer.provider) {\n throw new Error(\"Signer does not have a provider\");\n }\n\n const network = await signer.provider.getNetwork();\n return Number(network.chainId.toString());\n};\n\nexport const addChain = async (signer: JsonRpcSigner, chainConfig: AddEthereumChainParameter) => {\n if (!signer.provider) {\n throw new Error(\"Signer does not have a provider\");\n }\n\n await signer.provider.send(\"wallet_addEthereumChain\", [chainConfig]);\n};\n\nexport const switchChain = async (chainId: number, signer: JsonRpcSigner, chainConfig?: EVMChainConfig) => {\n if (!signer.provider) {\n throw new Error(\"Signer does not have a provider\");\n }\n\n try {\n await signer.provider.send(\"wallet_switchEthereumChain\", [{ chainId: `0x${chainId.toString(16)}` }]);\n } catch (error) {\n console.error(\"Error switching chain\", error);\n if (chainConfig) {\n try {\n await addChain(signer, _getEVMChainParamFromChainConfig(chainConfig));\n await signer.provider.send(\"wallet_switchEthereumChain\", [{ chainId: `0x${chainId.toString(16)}` }]);\n } catch (error) {\n console.error(\"Error adding chain\", error);\n throw error;\n }\n } else {\n throw error;\n }\n }\n};\n\n/**\n * Send a transaction using the signer.\n *\n * @param {JsonRpcSigner} signer {{@link JsonRpcSigner}} The signer to send the transaction.\n * @param {TransactionRequest} transaction {{@link TransactionRequest}} The transaction to send.\n * @param {number} confirmations {{@link number}} (optional) The number of confirmations to wait for default to 1.\n * @param {number} timeout {{@link number}} (optional) The timeout to wait for.\n * @returns {Promise<TransactionReceipt | null>} ``receipt`` {{@link TransactionReceipt}} The transaction receipt.\n *\n * If confirmations is 0, the promise will resolve to ``null``.\n * Check the {@link https://docs.ethers.org/v6/api/providers/#TransactionResponse-wait ethers v6 documentation} for more information.\n */\nexport const sendTransaction = async <C extends number = 1>({\n signer,\n transaction,\n confirmations,\n timeout,\n}: {\n signer: JsonRpcSigner;\n transaction: TransactionRequest;\n confirmations?: C;\n timeout?: number;\n}): Promise<C extends 0 ? null : TransactionReceipt> => {\n const txResponse = await signer.sendTransaction(transaction);\n\n return (await txResponse.wait(confirmations, timeout)) as C extends 0 ? null : TransactionReceipt;\n};\n\nexport const getSignerAddressFromMessage = (message: string, signedMessage: string) =>\n verifyMessage(toBeArray(message), signedMessage);\n","import { JsonRpcSigner, TransactionReceipt as EthersTransactionReceipt } from \"ethers\";\n\nimport { switchChain, sendTransaction as _sendTransaction } from \"@shared/utils/signerUtils\";\nimport { TransactionReceipt, Address } from \"@shared/types\";\n\nimport type { SignMessage, SendTransaction, SignTypedData } from \"../types\";\n\n/**\n * Get the transaction receipt from the ethers transaction receipt.\n *\n * @param {EthersTransactionReceipt} txReceipt The ethers transaction receipt.\n * @returns {TransactionReceipt} The transaction receipt.\n */\nconst _getTransactionReceipt = (txReceipt: EthersTransactionReceipt): TransactionReceipt => {\n return {\n transactionHash: txReceipt.hash,\n blockHash: txReceipt.blockHash,\n blockNumber: txReceipt.blockNumber,\n from: txReceipt.from,\n to: txReceipt.to || undefined,\n rawReceipt: txReceipt,\n };\n};\n\n/**\n * Connect to a signer.\n *\n * @param {function} getSigner {function} The function to get the signer.\n * @returns {function} ``getAddress`` {function} Function that returns the address of the signer.\n * @returns {function} ``signMessage`` {{@link SignMessage}} Function that signs a message.\n * @returns {function} ``sendTransaction`` {{@link SendTransaction}} Function that sends an EVM transaction.\n */\nexport const connectSigner = (\n getSigner: (address?: Address) => Promise<JsonRpcSigner>\n): {\n getAddress: () => Promise<Address>;\n signMessage: SignMessage;\n sendTransaction: SendTransaction;\n signTypedData: SignTypedData;\n} => {\n const getAddress = async (): Promise<Address> => {\n const signer = await getSigner();\n return signer.getAddress();\n };\n\n const signMessage: SignMessage = async ({ message, ownerAddress }) => {\n const signer = await getSigner(ownerAddress);\n if (ownerAddress) {\n const address = await signer.getAddress();\n if (ownerAddress !== address) {\n throw new Error(\"Owner address does not match\");\n }\n }\n const signature = await signer.signMessage(message);\n return signature;\n };\n\n const sendTransaction: SendTransaction = async (transaction, chainConfig) => {\n let signer = await getSigner();\n const signerNetwork = await signer.provider?.getNetwork();\n if (signerNetwork?.chainId?.toString() !== transaction.chainId.toString()) {\n await switchChain(transaction.chainId, signer, chainConfig);\n signer = await getSigner();\n }\n const ethersTxReceipt = await _sendTransaction({ signer, transaction });\n return _getTransactionReceipt(ethersTxReceipt);\n };\n\n const signTypedData: SignTypedData = async ({ typedData, ownerAddress }) => {\n const signer = await getSigner(ownerAddress);\n if (ownerAddress) {\n const address = await signer.getAddress();\n if (ownerAddress !== address) {\n throw new Error(\"Owner address does not match\");\n }\n }\n return await signer.provider?.send(\"eth_signTypedData_v4\", [ownerAddress, typedData]);\n };\n\n return { getAddress, signMessage, sendTransaction, signTypedData };\n};\n"],"names":["switchChain","async","chainId","signer","chainConfig","provider","Error","send","toString","error","console","addChain","String","chain_id","blockExplorerUrls","explorer","chainName","network","iconUrls","image","nativeCurrency","native_currency","rpcUrls","rpc","_getEVMChainParamFromChainConfig","getSigner","getAddress","signMessage","message","ownerAddress","sendTransaction","transaction","signerNetwork","getNetwork","ethersTxReceipt","confirmations","timeout","txResponse","wait","_sendTransaction","transactionHash","txReceipt","hash","blockHash","blockNumber","from","to","undefined","rawReceipt","signTypedData","typedData"],"mappings":"yQAiBO,MA0BMA,EAAcC,MAAOC,EAAiBC,EAAuBC,KACtE,IAAKD,EAAOE,SACR,MAAM,IAAIC,MAAM,mCAGpB,UACUH,EAAOE,SAASE,KAAK,6BAA8B,CAAC,CAAEL,QAAS,KAAKA,EAAQM,SAAS,SAC7F,MAAOC,GAEL,GADAC,QAAQD,MAAM,wBAAyBA,IACnCL,EASA,MAAMK,EARN,SAlBYR,OAAOE,EAAuBC,KAClD,IAAKD,EAAOE,SACR,MAAM,IAAIC,MAAM,yCAGdH,EAAOE,SAASE,KAAK,0BAA2B,CAACH,GAAa,EAclDO,CAASR,EArCiB,CAACC,IAA4D,CACzGF,QAASU,OAAOR,EAAYS,UAC5BC,kBAAmB,CAACV,EAAYW,UAChCC,UAAWZ,EAAYa,QACvBC,SAAU,CAACd,EAAYe,OACvBC,eAAgBhB,EAAYiB,gBAC5BC,QAAS,CAAClB,EAAYmB,OA+BaC,CAAiCpB,UAClDD,EAAOE,SAASE,KAAK,6BAA8B,CAAC,CAAEL,QAAS,KAAKA,EAAQM,SAAS,SAC7F,MAAOC,GAEL,MADAC,QAAQD,MAAM,qBAAsBA,GAC9BA,qBCzBlBgB,IA8CO,CAAEC,WAvCUzB,gBACMwB,KACPC,aAqCGC,YAlCY1B,OAAS2B,UAASC,mBAC/C,MAAM1B,QAAesB,EAAUI,GAC/B,GAAIA,EAAc,CAEd,GAAIA,UADkB1B,EAAOuB,aAEzB,MAAM,IAAIpB,MAAM,gCAIxB,aADwBH,EAAOwB,YAAYC,EAC3B,EAyBcE,gBAtBO7B,MAAO8B,EAAa3B,KACzD,IAAID,QAAesB,IACnB,MAAMO,QAAsB7B,EAAOE,UAAU4B,cACzCD,GAAe9B,SAASM,aAAeuB,EAAY7B,QAAQM,mBACrDR,EAAY+B,EAAY7B,QAASC,EAAQC,GAC/CD,QAAesB,KAEnB,MAAMS,ODciBjC,QAC3BE,SACA4B,cACAI,gBACAC,cAOA,MAAMC,QAAmBlC,EAAO2B,gBAAgBC,GAEhD,aAAcM,EAAWC,KAAKH,EAAeC,EAAQ,EC3BnBG,CAAiB,CAAEpC,SAAQ4B,gBACzD,MAnDG,CACHS,iBAFwBC,EAoDMP,GAlDHQ,KAC3BC,UAAWF,EAAUE,UACrBC,YAAaH,EAAUG,YACvBC,KAAMJ,EAAUI,KAChBC,GAAIL,EAAUK,SAAMC,EACpBC,WAAYP,GAPW,IAACA,CAoDsB,EAcCQ,cAXdhD,OAASiD,YAAWrB,mBACrD,MAAM1B,QAAesB,EAAUI,GAC/B,GAAIA,EAAc,CAEd,GAAIA,UADkB1B,EAAOuB,aAEzB,MAAM,IAAIpB,MAAM,gCAGxB,aAAaH,EAAOE,UAAUE,KAAK,uBAAwB,CAACsB,EAAcqB,IAAW"}
1
+ {"version":3,"file":"index.umd.min.js","sources":["../../../../_shared/utils/signerUtils.ts","../../../src/paymentsWidget/ethers/index.ts"],"sourcesContent":["import { TransactionReceipt, TransactionRequest, JsonRpcSigner, verifyMessage, toBeArray } from \"ethers\";\nimport { EVMChainConfig } from \"@shared/types\";\n\n// https://eips.ethereum.org/EIPS/eip-3085\ntype AddEthereumChainParameter = {\n chainId: string;\n blockExplorerUrls?: string[];\n chainName?: string;\n iconUrls?: string[];\n nativeCurrency?: {\n name: string;\n symbol: string;\n decimals: number;\n };\n rpcUrls?: string[];\n};\n\nexport const _getEVMChainParamFromChainConfig = (chainConfig: EVMChainConfig): AddEthereumChainParameter => ({\n chainId: `0x${chainConfig.chain_id.toString(16)}`,\n blockExplorerUrls: [chainConfig.explorer],\n chainName: chainConfig.network,\n iconUrls: [chainConfig.image],\n nativeCurrency: chainConfig.native_currency,\n rpcUrls: [chainConfig.rpc],\n});\n\nexport const getChainIdFromSigner = async (signer: JsonRpcSigner): Promise<number> => {\n if (!signer.provider) {\n throw new Error(\"Signer does not have a provider\");\n }\n\n const network = await signer.provider.getNetwork();\n return Number(network.chainId.toString());\n};\n\nexport const addChain = async (signer: JsonRpcSigner, chainConfig: AddEthereumChainParameter) => {\n if (!signer.provider) {\n throw new Error(\"Signer does not have a provider\");\n }\n\n await signer.provider.send(\"wallet_addEthereumChain\", [chainConfig]);\n};\n\nexport const switchChain = async (chainId: number, signer: JsonRpcSigner, chainConfig?: EVMChainConfig) => {\n if (!signer.provider) {\n throw new Error(\"Signer does not have a provider\");\n }\n\n try {\n await signer.provider.send(\"wallet_switchEthereumChain\", [{ chainId: `0x${chainId.toString(16)}` }]);\n } catch (error) {\n console.error(\"Error switching chain\", error);\n if (chainConfig) {\n try {\n await addChain(signer, _getEVMChainParamFromChainConfig(chainConfig));\n await signer.provider.send(\"wallet_switchEthereumChain\", [{ chainId: `0x${chainId.toString(16)}` }]);\n } catch (error) {\n console.error(\"Error adding chain\", error);\n throw error;\n }\n } else {\n throw error;\n }\n }\n};\n\n/**\n * Send a transaction using the signer.\n *\n * @param {JsonRpcSigner} signer {{@link JsonRpcSigner}} The signer to send the transaction.\n * @param {TransactionRequest} transaction {{@link TransactionRequest}} The transaction to send.\n * @param {number} confirmations {{@link number}} (optional) The number of confirmations to wait for default to 1.\n * @param {number} timeout {{@link number}} (optional) The timeout to wait for.\n * @returns {Promise<TransactionReceipt | null>} ``receipt`` {{@link TransactionReceipt}} The transaction receipt.\n *\n * If confirmations is 0, the promise will resolve to ``null``.\n * Check the {@link https://docs.ethers.org/v6/api/providers/#TransactionResponse-wait ethers v6 documentation} for more information.\n */\nexport const sendTransaction = async <C extends number = 1>({\n signer,\n transaction,\n confirmations,\n timeout,\n}: {\n signer: JsonRpcSigner;\n transaction: TransactionRequest;\n confirmations?: C;\n timeout?: number;\n}): Promise<C extends 0 ? null : TransactionReceipt> => {\n const txResponse = await signer.sendTransaction(transaction);\n\n return (await txResponse.wait(confirmations, timeout)) as C extends 0 ? null : TransactionReceipt;\n};\n\nexport const getSignerAddressFromMessage = (message: string, signedMessage: string) =>\n verifyMessage(toBeArray(message), signedMessage);\n","import { JsonRpcSigner, TransactionReceipt as EthersTransactionReceipt } from \"ethers\";\n\nimport { switchChain, sendTransaction as _sendTransaction } from \"@shared/utils/signerUtils\";\nimport { TransactionReceipt, Address } from \"@shared/types\";\n\nimport type { SignMessage, SendTransaction, SignTypedData, WalletActionsType } from \"../types\";\n\n/**\n * Get the transaction receipt from the ethers transaction receipt.\n *\n * @param {EthersTransactionReceipt} txReceipt The ethers transaction receipt.\n * @returns {TransactionReceipt} The transaction receipt.\n */\nconst _getTransactionReceipt = (txReceipt: EthersTransactionReceipt): TransactionReceipt => {\n return {\n transactionHash: txReceipt.hash,\n blockHash: txReceipt.blockHash,\n blockNumber: txReceipt.blockNumber,\n from: txReceipt.from,\n to: txReceipt.to || undefined,\n rawReceipt: txReceipt,\n };\n};\n\n/**\n * Connect to a signer.\n *\n * @param {function} getSigner {function} The function to get the signer.\n * @returns {function} ``getAddress`` {function} Function that returns the address of the signer.\n * @returns {function} ``signMessage`` {{@link SignMessage}} Function that signs a message.\n * @returns {function} ``sendTransaction`` {{@link SendTransaction}} Function that sends an EVM transaction.\n */\nexport const connectSigner = (\n getSigner: (address?: Address) => Promise<JsonRpcSigner>\n): Required<WalletActionsType> => {\n const getAddress = async (): Promise<Address> => {\n const signer = await getSigner();\n return signer.getAddress();\n };\n\n const signMessage: SignMessage = async ({ message, ownerAddress }) => {\n const signer = await getSigner(ownerAddress);\n if (ownerAddress) {\n const address = await signer.getAddress();\n if (ownerAddress !== address) {\n throw new Error(\"Owner address does not match\");\n }\n }\n const signature = await signer.signMessage(message);\n return signature;\n };\n\n const sendTransaction: SendTransaction = async (transaction, chainConfig) => {\n let signer = await getSigner();\n const signerNetwork = await signer.provider?.getNetwork();\n if (signerNetwork?.chainId?.toString() !== transaction.chainId.toString()) {\n await switchChain(transaction.chainId, signer, chainConfig);\n signer = await getSigner();\n }\n const ethersTxReceipt = await _sendTransaction({ signer, transaction });\n return _getTransactionReceipt(ethersTxReceipt);\n };\n\n const signTypedData: SignTypedData = async ({ typedData, ownerAddress }) => {\n const signer = await getSigner(ownerAddress);\n if (ownerAddress) {\n const address = await signer.getAddress();\n if (ownerAddress !== address) {\n throw new Error(\"Owner address does not match\");\n }\n }\n return await signer.provider?.send(\"eth_signTypedData_v4\", [ownerAddress, typedData]);\n };\n\n return { getAddress, signMessage, sendTransaction, signTypedData };\n};\n"],"names":["switchChain","async","chainId","signer","chainConfig","provider","Error","send","toString","error","console","addChain","chain_id","blockExplorerUrls","explorer","chainName","network","iconUrls","image","nativeCurrency","native_currency","rpcUrls","rpc","_getEVMChainParamFromChainConfig","getSigner","getAddress","signMessage","message","ownerAddress","sendTransaction","transaction","signerNetwork","getNetwork","ethersTxReceipt","confirmations","timeout","txResponse","wait","_sendTransaction","transactionHash","txReceipt","hash","blockHash","blockNumber","from","to","undefined","rawReceipt","signTypedData","typedData"],"mappings":"yQAiBO,MA0BMA,EAAcC,MAAOC,EAAiBC,EAAuBC,KACtE,IAAKD,EAAOE,SACR,MAAM,IAAIC,MAAM,mCAGpB,UACUH,EAAOE,SAASE,KAAK,6BAA8B,CAAC,CAAEL,QAAS,KAAKA,EAAQM,SAAS,SAC7F,MAAOC,GAEL,GADAC,QAAQD,MAAM,wBAAyBA,IACnCL,EASA,MAAMK,EARN,SAlBYR,OAAOE,EAAuBC,KAClD,IAAKD,EAAOE,SACR,MAAM,IAAIC,MAAM,yCAGdH,EAAOE,SAASE,KAAK,0BAA2B,CAACH,GAAa,EAclDO,CAASR,EArCiB,CAACC,IAA4D,CACzGF,QAAS,KAAKE,EAAYQ,SAASJ,SAAS,MAC5CK,kBAAmB,CAACT,EAAYU,UAChCC,UAAWX,EAAYY,QACvBC,SAAU,CAACb,EAAYc,OACvBC,eAAgBf,EAAYgB,gBAC5BC,QAAS,CAACjB,EAAYkB,OA+BaC,CAAiCnB,UAClDD,EAAOE,SAASE,KAAK,6BAA8B,CAAC,CAAEL,QAAS,KAAKA,EAAQM,SAAS,SAC7F,MAAOC,GAEL,MADAC,QAAQD,MAAM,qBAAsBA,GAC9BA,qBCzBlBe,IAyCO,CAAEC,WAvCUxB,gBACMuB,KACPC,aAqCGC,YAlCYzB,OAAS0B,UAASC,mBAC/C,MAAMzB,QAAeqB,EAAUI,GAC/B,GAAIA,EAAc,CAEd,GAAIA,UADkBzB,EAAOsB,aAEzB,MAAM,IAAInB,MAAM,gCAIxB,aADwBH,EAAOuB,YAAYC,EAC3B,EAyBcE,gBAtBO5B,MAAO6B,EAAa1B,KACzD,IAAID,QAAeqB,IACnB,MAAMO,QAAsB5B,EAAOE,UAAU2B,cACzCD,GAAe7B,SAASM,aAAesB,EAAY5B,QAAQM,mBACrDR,EAAY8B,EAAY5B,QAASC,EAAQC,GAC/CD,QAAeqB,KAEnB,MAAMS,ODmBiBhC,QAC3BE,SACA2B,cACAI,gBACAC,cAOA,MAAMC,QAAmBjC,EAAO0B,gBAAgBC,GAEhD,aAAcM,EAAWC,KAAKH,EAAeC,EAAQ,EChCnBG,CAAiB,CAAEnC,SAAQ2B,gBACzD,MA9CG,CACHS,iBAFwBC,EA+CMP,GA7CHQ,KAC3BC,UAAWF,EAAUE,UACrBC,YAAaH,EAAUG,YACvBC,KAAMJ,EAAUI,KAChBC,GAAIL,EAAUK,SAAMC,EACpBC,WAAYP,GAPW,IAACA,CA+CsB,EAcCQ,cAXd/C,OAASgD,YAAWrB,mBACrD,MAAMzB,QAAeqB,EAAUI,GAC/B,GAAIA,EAAc,CAEd,GAAIA,UADkBzB,EAAOsB,aAEzB,MAAM,IAAInB,MAAM,gCAGxB,aAAaH,EAAOE,UAAUE,KAAK,uBAAwB,CAACqB,EAAcqB,IAAW"}