@halliday-sdk/payments 0.1.0 → 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 +80 -0
- package/dist/paymentsWidget/ethers/index.cjs.min.js +1 -1
- package/dist/paymentsWidget/ethers/index.cjs.min.js.map +1 -1
- package/dist/paymentsWidget/ethers/index.d.ts +7 -6
- package/dist/paymentsWidget/ethers/index.esm.min.js +1 -1
- package/dist/paymentsWidget/ethers/index.esm.min.js.map +1 -1
- package/dist/paymentsWidget/ethers/index.umd.min.js +1 -1
- package/dist/paymentsWidget/ethers/index.umd.min.js.map +1 -1
- package/dist/paymentsWidget/index.cjs.min.js +1 -1
- package/dist/paymentsWidget/index.cjs.min.js.map +1 -1
- package/dist/paymentsWidget/index.d.ts +38 -12
- package/dist/paymentsWidget/index.esm.min.js +1 -1
- package/dist/paymentsWidget/index.esm.min.js.map +1 -1
- package/dist/paymentsWidget/index.umd.min.js +1 -1
- package/dist/paymentsWidget/index.umd.min.js.map +1 -1
- package/dist/paymentsWidget/viem/index.cjs.min.js +2 -0
- package/dist/paymentsWidget/viem/index.cjs.min.js.map +1 -0
- package/dist/paymentsWidget/viem/index.d.ts +72 -0
- package/dist/paymentsWidget/viem/index.esm.min.js +2 -0
- package/dist/paymentsWidget/viem/index.esm.min.js.map +1 -0
- package/dist/paymentsWidget/viem/index.umd.min.js +2 -0
- package/dist/paymentsWidget/viem/index.umd.min.js.map +1 -0
- package/package.json +6 -1
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
|
|
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:
|
|
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"}
|
|
@@ -52,6 +52,12 @@ type SignTypedData = (input: {
|
|
|
52
52
|
ownerAddress?: Address;
|
|
53
53
|
}) => Promise<string>;
|
|
54
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
|
+
};
|
|
55
61
|
|
|
56
62
|
/**
|
|
57
63
|
* Connect to a signer.
|
|
@@ -61,11 +67,6 @@ type SendTransaction = (transaction: TransactionRequest, chainConfig: EVMChainCo
|
|
|
61
67
|
* @returns {function} ``signMessage`` {{@link SignMessage}} Function that signs a message.
|
|
62
68
|
* @returns {function} ``sendTransaction`` {{@link SendTransaction}} Function that sends an EVM transaction.
|
|
63
69
|
*/
|
|
64
|
-
declare const connectSigner: (getSigner: (address?: Address) => Promise<JsonRpcSigner>) =>
|
|
65
|
-
getAddress: () => Promise<Address>;
|
|
66
|
-
signMessage: SignMessage;
|
|
67
|
-
sendTransaction: SendTransaction;
|
|
68
|
-
signTypedData: SignTypedData;
|
|
69
|
-
};
|
|
70
|
+
declare const connectSigner: (getSigner: (address?: Address) => Promise<JsonRpcSigner>) => Required<WalletActionsType>;
|
|
70
71
|
|
|
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
|
|
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:
|
|
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
|
|
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:
|
|
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"}
|