@imtbl/x-provider 2.0.0-alpha.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.
Files changed (70) hide show
  1. package/LICENSE.md +176 -0
  2. package/README.md +53 -0
  3. package/dist/browser/index.js +2 -0
  4. package/dist/node/index.cjs +2 -0
  5. package/dist/node/index.js +2 -0
  6. package/dist/types/config/index.d.ts +13 -0
  7. package/dist/types/errors/providerError.d.ts +14 -0
  8. package/dist/types/errors/providerError.test.d.ts +1 -0
  9. package/dist/types/genericImxProvider.d.ts +23 -0
  10. package/dist/types/imx-wallet/ImxSigner.d.ts +10 -0
  11. package/dist/types/imx-wallet/ImxSigner.test.d.ts +1 -0
  12. package/dist/types/imx-wallet/events.d.ts +15 -0
  13. package/dist/types/imx-wallet/imxWallet.d.ts +5 -0
  14. package/dist/types/imx-wallet/imxWallet.test.d.ts +1 -0
  15. package/dist/types/imx-wallet/imxWalletIFrame.d.ts +10 -0
  16. package/dist/types/imx-wallet/imxWalletIFrame.test.d.ts +1 -0
  17. package/dist/types/imx-wallet/index.d.ts +6 -0
  18. package/dist/types/imx-wallet/messageResponseListener.d.ts +12 -0
  19. package/dist/types/imx-wallet/messageResponseListener.test.d.ts +1 -0
  20. package/dist/types/imx-wallet/postRequestMessage.d.ts +6 -0
  21. package/dist/types/imx-wallet/postRequestMessage.test.d.ts +1 -0
  22. package/dist/types/imx-wallet/testUtils.d.ts +3 -0
  23. package/dist/types/imx-wallet/types.d.ts +32 -0
  24. package/dist/types/imxProvider.d.ts +93 -0
  25. package/dist/types/index.d.ts +4 -0
  26. package/dist/types/l1-providers/index.d.ts +2 -0
  27. package/dist/types/l1-providers/metaMask.d.ts +3 -0
  28. package/dist/types/l1-providers/metaMask.test.d.ts +1 -0
  29. package/dist/types/l1-providers/metaMaskWrapper.d.ts +8 -0
  30. package/dist/types/l1-providers/metaMaskWrapper.test.d.ts +1 -0
  31. package/dist/types/l1-providers/rpc.d.ts +12 -0
  32. package/dist/types/l1-providers/types.d.ts +3 -0
  33. package/dist/types/signable-actions/deposit-actions/depositERC20.d.ts +11 -0
  34. package/dist/types/signable-actions/deposit-actions/depositERC20.test.d.ts +1 -0
  35. package/dist/types/signable-actions/deposit-actions/depositERC721.d.ts +11 -0
  36. package/dist/types/signable-actions/deposit-actions/depositERC721.test.d.ts +1 -0
  37. package/dist/types/signable-actions/deposit-actions/depositEth.d.ts +11 -0
  38. package/dist/types/signable-actions/deposit-actions/depositEth.test.d.ts +1 -0
  39. package/dist/types/signable-actions/deposit-actions/index.d.ts +3 -0
  40. package/dist/types/signable-actions/deposit.d.ts +10 -0
  41. package/dist/types/signable-actions/deposit.test.d.ts +1 -0
  42. package/dist/types/signable-actions/errors.d.ts +3 -0
  43. package/dist/types/signable-actions/exchanges.d.ts +11 -0
  44. package/dist/types/signable-actions/exchanges.test.d.ts +1 -0
  45. package/dist/types/signable-actions/helpers.d.ts +2 -0
  46. package/dist/types/signable-actions/orders.d.ts +17 -0
  47. package/dist/types/signable-actions/orders.test.d.ts +1 -0
  48. package/dist/types/signable-actions/registration.d.ts +8 -0
  49. package/dist/types/signable-actions/registration.test.d.ts +1 -0
  50. package/dist/types/signable-actions/trades.d.ts +10 -0
  51. package/dist/types/signable-actions/trades.test.d.ts +1 -0
  52. package/dist/types/signable-actions/transfer.d.ts +17 -0
  53. package/dist/types/signable-actions/transfer.test.d.ts +1 -0
  54. package/dist/types/signable-actions/types.d.ts +5 -0
  55. package/dist/types/signable-actions/withdrawal-actions/completeERC20Withdrawal.d.ts +15 -0
  56. package/dist/types/signable-actions/withdrawal-actions/completeERC20Withdrawal.test.d.ts +1 -0
  57. package/dist/types/signable-actions/withdrawal-actions/completeERC721Withdrawal.d.ts +12 -0
  58. package/dist/types/signable-actions/withdrawal-actions/completeERC721Withdrawal.test.d.ts +1 -0
  59. package/dist/types/signable-actions/withdrawal-actions/completeEthWithdrawal.d.ts +11 -0
  60. package/dist/types/signable-actions/withdrawal-actions/completeEthWithdrawal.test.d.ts +1 -0
  61. package/dist/types/signable-actions/withdrawal-actions/getEncodeAssetInfo.d.ts +3 -0
  62. package/dist/types/signable-actions/withdrawal-actions/getEncodeAssetInfo.test.d.ts +1 -0
  63. package/dist/types/signable-actions/withdrawal-actions/getWithdrawalBalance.d.ts +11 -0
  64. package/dist/types/signable-actions/withdrawal-actions/index.d.ts +4 -0
  65. package/dist/types/signable-actions/withdrawal-actions/prepareWithdrawal.d.ts +8 -0
  66. package/dist/types/signable-actions/withdrawal-actions/prepareWithdrawal.test.d.ts +1 -0
  67. package/dist/types/signable-actions/withdrawal.d.ts +18 -0
  68. package/dist/types/signable-actions/withdrawal.test.d.ts +1 -0
  69. package/dist/types/test/helpers.d.ts +13 -0
  70. package/package.json +78 -0
package/LICENSE.md ADDED
@@ -0,0 +1,176 @@
1
+ Apache License
2
+ Version 2.0, January 2004
3
+ http://www.apache.org/licenses/
4
+
5
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
6
+
7
+ 1. Definitions.
8
+
9
+ "License" shall mean the terms and conditions for use, reproduction,
10
+ and distribution as defined by Sections 1 through 9 of this document.
11
+
12
+ "Licensor" shall mean the copyright owner or entity authorized by
13
+ the copyright owner that is granting the License.
14
+
15
+ "Legal Entity" shall mean the union of the acting entity and all
16
+ other entities that control, are controlled by, or are under common
17
+ control with that entity. For the purposes of this definition,
18
+ "control" means (i) the power, direct or indirect, to cause the
19
+ direction or management of such entity, whether by contract or
20
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
21
+ outstanding shares, or (iii) beneficial ownership of such entity.
22
+
23
+ "You" (or "Your") shall mean an individual or Legal Entity
24
+ exercising permissions granted by this License.
25
+
26
+ "Source" form shall mean the preferred form for making modifications,
27
+ including but not limited to software source code, documentation
28
+ source, and configuration files.
29
+
30
+ "Object" form shall mean any form resulting from mechanical
31
+ transformation or translation of a Source form, including but
32
+ not limited to compiled object code, generated documentation,
33
+ and conversions to other media types.
34
+
35
+ "Work" shall mean the work of authorship, whether in Source or
36
+ Object form, made available under the License, as indicated by a
37
+ copyright notice that is included in or attached to the work
38
+ (an example is provided in the Appendix below).
39
+
40
+ "Derivative Works" shall mean any work, whether in Source or Object
41
+ form, that is based on (or derived from) the Work and for which the
42
+ editorial revisions, annotations, elaborations, or other modifications
43
+ represent, as a whole, an original work of authorship. For the purposes
44
+ of this License, Derivative Works shall not include works that remain
45
+ separable from, or merely link (or bind by name) to the interfaces of,
46
+ the Work and Derivative Works thereof.
47
+
48
+ "Contribution" shall mean any work of authorship, including
49
+ the original version of the Work and any modifications or additions
50
+ to that Work or Derivative Works thereof, that is intentionally
51
+ submitted to Licensor for inclusion in the Work by the copyright owner
52
+ or by an individual or Legal Entity authorized to submit on behalf of
53
+ the copyright owner. For the purposes of this definition, "submitted"
54
+ means any form of electronic, verbal, or written communication sent
55
+ to the Licensor or its representatives, including but not limited to
56
+ communication on electronic mailing lists, source code control systems,
57
+ and issue tracking systems that are managed by, or on behalf of, the
58
+ Licensor for the purpose of discussing and improving the Work, but
59
+ excluding communication that is conspicuously marked or otherwise
60
+ designated in writing by the copyright owner as "Not a Contribution."
61
+
62
+ "Contributor" shall mean Licensor and any individual or Legal Entity
63
+ on behalf of whom a Contribution has been received by Licensor and
64
+ subsequently incorporated within the Work.
65
+
66
+ 2. Grant of Copyright License. Subject to the terms and conditions of
67
+ this License, each Contributor hereby grants to You a perpetual,
68
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
69
+ copyright license to reproduce, prepare Derivative Works of,
70
+ publicly display, publicly perform, sublicense, and distribute the
71
+ Work and such Derivative Works in Source or Object form.
72
+
73
+ 3. Grant of Patent License. Subject to the terms and conditions of
74
+ this License, each Contributor hereby grants to You a perpetual,
75
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
76
+ (except as stated in this section) patent license to make, have made,
77
+ use, offer to sell, sell, import, and otherwise transfer the Work,
78
+ where such license applies only to those patent claims licensable
79
+ by such Contributor that are necessarily infringed by their
80
+ Contribution(s) alone or by combination of their Contribution(s)
81
+ with the Work to which such Contribution(s) was submitted. If You
82
+ institute patent litigation against any entity (including a
83
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
84
+ or a Contribution incorporated within the Work constitutes direct
85
+ or contributory patent infringement, then any patent licenses
86
+ granted to You under this License for that Work shall terminate
87
+ as of the date such litigation is filed.
88
+
89
+ 4. Redistribution. You may reproduce and distribute copies of the
90
+ Work or Derivative Works thereof in any medium, with or without
91
+ modifications, and in Source or Object form, provided that You
92
+ meet the following conditions:
93
+
94
+ (a) You must give any other recipients of the Work or
95
+ Derivative Works a copy of this License; and
96
+
97
+ (b) You must cause any modified files to carry prominent notices
98
+ stating that You changed the files; and
99
+
100
+ (c) You must retain, in the Source form of any Derivative Works
101
+ that You distribute, all copyright, patent, trademark, and
102
+ attribution notices from the Source form of the Work,
103
+ excluding those notices that do not pertain to any part of
104
+ the Derivative Works; and
105
+
106
+ (d) If the Work includes a "NOTICE" text file as part of its
107
+ distribution, then any Derivative Works that You distribute must
108
+ include a readable copy of the attribution notices contained
109
+ within such NOTICE file, excluding those notices that do not
110
+ pertain to any part of the Derivative Works, in at least one
111
+ of the following places: within a NOTICE text file distributed
112
+ as part of the Derivative Works; within the Source form or
113
+ documentation, if provided along with the Derivative Works; or,
114
+ within a display generated by the Derivative Works, if and
115
+ wherever such third-party notices normally appear. The contents
116
+ of the NOTICE file are for informational purposes only and
117
+ do not modify the License. You may add Your own attribution
118
+ notices within Derivative Works that You distribute, alongside
119
+ or as an addendum to the NOTICE text from the Work, provided
120
+ that such additional attribution notices cannot be construed
121
+ as modifying the License.
122
+
123
+ You may add Your own copyright statement to Your modifications and
124
+ may provide additional or different license terms and conditions
125
+ for use, reproduction, or distribution of Your modifications, or
126
+ for any such Derivative Works as a whole, provided Your use,
127
+ reproduction, and distribution of the Work otherwise complies with
128
+ the conditions stated in this License.
129
+
130
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
131
+ any Contribution intentionally submitted for inclusion in the Work
132
+ by You to the Licensor shall be under the terms and conditions of
133
+ this License, without any additional terms or conditions.
134
+ Notwithstanding the above, nothing herein shall supersede or modify
135
+ the terms of any separate license agreement you may have executed
136
+ with Licensor regarding such Contributions.
137
+
138
+ 6. Trademarks. This License does not grant permission to use the trade
139
+ names, trademarks, service marks, or product names of the Licensor,
140
+ except as required for reasonable and customary use in describing the
141
+ origin of the Work and reproducing the content of the NOTICE file.
142
+
143
+ 7. Disclaimer of Warranty. Unless required by applicable law or
144
+ agreed to in writing, Licensor provides the Work (and each
145
+ Contributor provides its Contributions) on an "AS IS" BASIS,
146
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
147
+ implied, including, without limitation, any warranties or conditions
148
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
149
+ PARTICULAR PURPOSE. You are solely responsible for determining the
150
+ appropriateness of using or redistributing the Work and assume any
151
+ risks associated with Your exercise of permissions under this License.
152
+
153
+ 8. Limitation of Liability. In no event and under no legal theory,
154
+ whether in tort (including negligence), contract, or otherwise,
155
+ unless required by applicable law (such as deliberate and grossly
156
+ negligent acts) or agreed to in writing, shall any Contributor be
157
+ liable to You for damages, including any direct, indirect, special,
158
+ incidental, or consequential damages of any character arising as a
159
+ result of this License or out of the use or inability to use the
160
+ Work (including but not limited to damages for loss of goodwill,
161
+ work stoppage, computer failure or malfunction, or any and all
162
+ other commercial damages or losses), even if such Contributor
163
+ has been advised of the possibility of such damages.
164
+
165
+ 9. Accepting Warranty or Additional Liability. While redistributing
166
+ the Work or Derivative Works thereof, You may choose to offer,
167
+ and charge a fee for, acceptance of support, warranty, indemnity,
168
+ or other liability obligations and/or rights consistent with this
169
+ License. However, in accepting such obligations, You may act only
170
+ on Your own behalf and on Your sole responsibility, not on behalf
171
+ of any other Contributor, and only if You agree to indemnify,
172
+ defend, and hold each Contributor harmless for any liability
173
+ incurred by, or claims asserted against, such Contributor by reason
174
+ of your accepting any such warranty or additional liability.
175
+
176
+ END OF TERMS AND CONDITIONS
package/README.md ADDED
@@ -0,0 +1,53 @@
1
+ # About
2
+
3
+ The X-Provider SDK package provides methods that implement the signable actions with IMX only.
4
+
5
+ [Read more about the IMX Provider in our docs here](https://docs.immutable.com/x/passport/imx-provider).
6
+
7
+ # Table of Contents
8
+
9
+ - [Installation](#installation)
10
+ - [Individual Package Installation](#individual-package-installation)
11
+ - [SDK Installation](#sdk-installation)
12
+ - [Conditional Exports](#conditional-exports)
13
+ - [Direct Imports](#direct-imports)
14
+
15
+ # Installation
16
+
17
+ ## Individual Package Installation
18
+
19
+ To install this package, run the following command:
20
+
21
+ ```sh
22
+ npm add @imtbl/x-provider
23
+ # or
24
+ yarn add @imtbl/x-provider
25
+ # or
26
+ pnpm add @imtbl/x-provider
27
+ ```
28
+
29
+ ## SDK Installation
30
+
31
+ This package is also included within the [`@imtbl/sdk` NPM package](https://www.npmjs.com/package/@imtbl/sdk) and can be re-exported directly from there.
32
+
33
+ ### Conditional Exports
34
+
35
+ If your environment supports conditional exports, you can import the contents of this package directly from the `@imtbl/sdk` package using the `@imtbl/sdk/x` import path like so:
36
+
37
+ ```ts
38
+ import { GenericIMXProvider } from '@imtbl/sdk/x';
39
+ ```
40
+
41
+ This is the recommended way of consuming this package, as it allows for better tree-shaking and smaller bundle sizes.
42
+
43
+ ### Direct Imports
44
+
45
+ If your environment does not support conditional exports, you will need to import the contents of this package directly from the `@imtbl/sdk` package like so:
46
+
47
+ ```ts
48
+ import { x } from '@imtbl/sdk';
49
+
50
+ const { GenericIMXProvider } = x;
51
+ ```
52
+
53
+ However this method will result in a larger bundle size as the entire `@imtbl/x-provider` package will be included in your bundle.
@@ -0,0 +1,2 @@
1
+ import {imx}from'@imtbl/generated-clients';import {convertToSignableToken,signRaw,signMessage}from'@imtbl/toolkit';import {ImxConfiguration,Contracts,EncodingApi,MintsApi,signRegisterEthAddress}from'@imtbl/x-client';import {isAxiosError}from'axios';import*as N from'enc-utils';import {parseUnits,BrowserProvider}from'ethers';import ft from'@metamask/detect-provider';import {Environment}from'@imtbl/config';function Ue(t,e){return t===e.ethConfiguration.chainID}async function l(t,e){let r=(await t.provider?.getNetwork())?.chainId;if(!Ue(Number(r),e))throw new Error("The wallet used for this operation is not connected to the correct network.")}async function Y({signers:{ethSigner:t,starkSigner:e},request:r,config:n}){await l(t,n.immutableXConfig);let a=await t.getAddress(),i=new imx.TransfersApi(n.immutableXConfig.apiConfiguration),s=r.type==="ERC721"?"1":r.amount,o=await i.getSignableTransferV1({getSignableTransferRequest:{sender:a,token:convertToSignableToken(r),amount:s,receiver:r.receiver}}),{signable_message:d,payload_hash:p}=o.data,g=await signRaw(d,t),E=await e.signMessage(p),f={sender_stark_key:o.data.sender_stark_key,sender_vault_id:o.data.sender_vault_id,receiver_stark_key:o.data.receiver_stark_key,receiver_vault_id:o.data.receiver_vault_id,asset_id:o.data.asset_id,amount:o.data.amount,nonce:o.data.nonce,expiration_timestamp:o.data.expiration_timestamp,stark_signature:E},c=await i.createTransferV1({createTransferRequest:f,xImxEthAddress:a,xImxEthSignature:g});return {sent_signature:c?.data.sent_signature,status:c?.data.status?.toString(),time:c?.data.time,transfer_id:c?.data.transfer_id}}async function Q({signers:{ethSigner:t,starkSigner:e},request:r,config:n}){await l(t,n.immutableXConfig);let a=await t.getAddress(),i=new imx.TransfersApi(n.immutableXConfig.apiConfiguration),s=r.map(c=>({amount:"1",token:convertToSignableToken({type:"ERC721",tokenId:c.tokenId,tokenAddress:c.tokenAddress}),receiver:c.receiver})),o=await i.getSignableTransfer({getSignableTransferRequestV2:{sender_ether_key:a,signable_requests:s}}),d=o.data.signable_message;if(d===void 0)throw new Error("Invalid response from Signable registration offchain");let p=await signRaw(d,t),g=[];for(let c of o.data.signable_responses){let w=await e.signMessage(c.payload_hash),T={sender_vault_id:c.sender_vault_id,receiver_stark_key:c.receiver_stark_key,receiver_vault_id:c.receiver_vault_id,asset_id:c.asset_id,amount:c.amount,nonce:c.nonce,expiration_timestamp:c.expiration_timestamp,stark_signature:w};g.push(T);}let E={sender_stark_key:o.data.sender_stark_key,requests:g};return {transfer_ids:(await i.createTransfer({createTransferRequestV2:E,xImxEthAddress:a,xImxEthSignature:p}))?.data.transfer_ids}}async function j({signers:t,request:e,config:r}){await l(t.ethSigner,r.immutableXConfig);let n=await t.ethSigner.getAddress(),a=new imx.OrdersApi(r.immutableXConfig.apiConfiguration),i=e.sell.type==="ERC721"?"1":e.sell.amount,s=e.buy.type==="ERC721"?"1":e.buy.amount,o={user:n,amount_buy:s,token_buy:convertToSignableToken(e.buy),amount_sell:i,token_sell:convertToSignableToken(e.sell),fees:e.fees,expiration_timestamp:e.expiration_timestamp},d=await a.getSignableOrder({getSignableOrderRequestV3:o}),{signable_message:p,payload_hash:g}=d.data,E=await signRaw(p,t.ethSigner),f=await t.starkSigner.signMessage(g),c=d.data,w={createOrderRequest:{amount_buy:c.amount_buy,amount_sell:c.amount_sell,asset_id_buy:c.asset_id_buy,asset_id_sell:c.asset_id_sell,expiration_timestamp:c.expiration_timestamp,fees:e.fees,nonce:c.nonce,stark_key:c.stark_key,stark_signature:f,vault_id_buy:c.vault_id_buy,vault_id_sell:c.vault_id_sell},xImxEthAddress:n,xImxEthSignature:E};return {...(await a.createOrderV3(w)).data}}async function J({signers:t,request:e,config:r}){let n=new imx.OrdersApi(r.immutableXConfig.apiConfiguration),a=await n.getSignableCancelOrderV3({getSignableCancelOrderRequest:{order_id:e.order_id}}),{signable_message:i,payload_hash:s}=a.data,o=await signRaw(i,t.ethSigner),d=await t.starkSigner.signMessage(s),p=await t.ethSigner.getAddress(),g=await n.cancelOrderV3({id:e.order_id.toString(),cancelOrderRequest:{order_id:e.order_id,stark_signature:d},xImxEthAddress:p,xImxEthSignature:o});return {order_id:g.data.order_id,status:g.data.status}}async function ee(t,e){await l(t.ethSigner,e.immutableXConfig);let r=new imx.UsersApi(e.immutableXConfig.apiConfiguration),n=await t.ethSigner.getAddress(),a=await t.starkSigner.getAddress(),i=await r.getSignableRegistrationOffchain({getSignableRegistrationRequest:{ether_key:n,stark_key:a}}),{signable_message:s,payload_hash:o}=i.data,d=await signRaw(s,t.ethSigner),p=await t.starkSigner.signMessage(o);return (await r.registerUser({registerUserRequest:{eth_signature:d,ether_key:n,stark_signature:p,stark_key:a}})).data}async function te(t,e){try{let n=await new imx.UsersApi(e.immutableXConfig.apiConfiguration).getUsers({user:t}),{accounts:a}=n.data;return a?.length>0}catch(r){if(isAxiosError(r)&&r.response?.status===404)return !1;throw r}}async function _(t,e,r){await l(e,r.immutableXConfig);let n=r.immutableXConfig,a=Contracts.RegistrationV4.connect(n.ethConfiguration.registrationV4ContractAddress||n.ethConfiguration.registrationContractAddress,e);try{return await a.isRegistered(t)}catch(i){if(i.reason==="USER_UNREGISTERED")return !1;throw i}}var h=t=>{if(t!==void 0)return t;throw new Error("undefined field exception")};async function re(t,e){let{signers:{ethSigner:r,starkSigner:n}}=t;await l(r,t.config);let a=t.type==="ERC721"?"1":t.amount,i=await e.getSignableWithdrawalV2({getSignableWithdrawalRequest:{user:await r.getAddress(),token:convertToSignableToken(t),amount:a}}),{signable_message:s,payload_hash:o}=i.data,d=await n.signMessage(o),{ethAddress:p,ethSignature:g}=await signMessage(s,r);return (await e.createWithdrawalV2({createWithdrawalRequestV2:{sender_stark_key:h(i.data.sender_stark_key),sender_vault_id:h(i.data.sender_vault_id),receiver_stark_key:h(i.data.receiver_stark_key),receiver_vault_id:h(i.data.receiver_vault_id),amount:a,asset_id:h(i.data.asset_id),expiration_timestamp:h(i.data.expiration_timestamp),nonce:h(i.data.nonce),stark_signature:d},xImxEthAddress:p,xImxEthSignature:g})).data}async function C(t,e,r,n){return (await new imx.EncodingApi(r.apiConfiguration).encodeAsset({assetType:t,encodeAssetRequest:{token:{type:e,...n&&{data:n}}}})).data}async function v(t,e,r,n){return Contracts.CoreV4.connect(n.ethConfiguration.coreContractAddress,t).getWithdrawalBalance(e,r)}async function ze(t,e,r){let n=await C("asset","ETH",r);return await v(t,e,n.asset_id,r)}async function Ke(t,e,r,n){let a=await C("asset","ERC20",n,{token_address:r});return await v(t,e,a.asset_id,n)}async function je(t,e,r,n,a,i){try{let s=await a.getMintableTokenDetailsByClientTokenId({tokenAddress:r.tokenAddress,tokenId:r.tokenId}),o=await C("mintable-asset","ERC721",i,{id:r.tokenId,token_address:r.tokenAddress,...s.data.blueprint&&{blueprint:s.data.blueprint}});return await v(t,e,o.asset_id,i)}catch(s){if(s.response?.status===404){let o=await C("asset","ERC721",i,{token_id:r.tokenId,token_address:r.tokenAddress});return await v(t,e,o.asset_id,i)}throw s}}async function x(t,e,r,n,a,i){switch(r.type){case"ETH":return await ze(t,e,i);case"ERC20":return await Ke(t,e,r.tokenAddress,i);case"ERC721":return await je(t,e,r,n,a,i);default:throw new Error("Unsupported token type")}}async function I(t,e,r,n,a){let i=new EncodingApi(a.apiConfiguration),s=new MintsApi(a.apiConfiguration),o=await x(t,e,n,i,s,a),d=await x(t,r,n,i,s,a);return {v3Balance:o,v4Balance:d}}async function ae(t,e,r,n,a,i){let s=new EncodingApi(a.apiConfiguration),o=await x(t,e,n,s,i,a),d=await x(t,r,n,s,i,a);return {v3Balance:o,v4Balance:d}}var ie="ERC20";async function D(t,e,r,n,a){let i=await t.getAddress(),s=await signRegisterEthAddress(e,i,r),d=await Contracts.RegistrationV4.connect(a.ethConfiguration.registrationV4ContractAddress||a.ethConfiguration.registrationContractAddress,t).registerAndWithdrawAll.populateTransaction(i,r,s,n);return t.sendTransaction(d)}async function q(t,e,r,n){let i=await Contracts.RegistrationV4.connect(n.ethConfiguration.registrationV4ContractAddress||n.ethConfiguration.registrationContractAddress,t).withdrawAll.populateTransaction(await t.getAddress(),e,r);return t.sendTransaction(i)}async function L(t,e,r,n){let i=await Contracts.CoreV4.connect(n.ethConfiguration.coreContractAddress,t).withdraw.populateTransaction(await t.getAddress(),r);return t.sendTransaction(i)}async function se({ethSigner:t,starkSigner:e,starkPublicKey:r,token:n,config:a}){await l(t,a.immutableXConfig);let{v3Balance:i,v4Balance:s}=await I(t,r,await t.getAddress(),{type:ie,tokenAddress:n.tokenAddress},a.immutableXConfig),o=await C("asset",ie,a.immutableXConfig,{token_address:n.tokenAddress});if(i>0)return await _(r,t,a)?q(t,r,o.asset_type,a.immutableXConfig):D(t,e,r,o.asset_type,a.immutableXConfig);if(s>0)return L(t,r,o.asset_type,a.immutableXConfig);throw new Error("No balance to withdraw")}var A="ERC721";function ce(t){let{id:e}=t.data,r=t.data.blueprint||"";return N.sanitizeHex(N.utf8ToHex(`{${e}}:{${r}}`))}async function Ze(t,e,r,n){let a=await t.getAddress(),i=await e.getAddress(),s=await C("asset",A,n,{token_id:r.tokenId,token_address:r.tokenAddress}),o=await signRegisterEthAddress(e,a,i),p=await Contracts.RegistrationV4.connect(n.ethConfiguration.registrationV4ContractAddress||n.ethConfiguration.registrationContractAddress,t).registerAndWithdrawNft.populateTransaction(a,i,o,s.asset_type,r.tokenId);return t.sendTransaction(p)}async function et(t,e,r,n){let a=await t.getAddress(),i=await e.getAddress(),s=await C("mintable-asset",A,n,{id:r.data.id,token_address:r.data.tokenAddress,...r.data.blueprint&&{blueprint:r.data.blueprint}}),o=ce(r),d=await signRegisterEthAddress(e,a,i),g=await Contracts.RegistrationV4.connect(n.ethConfiguration.registrationV4ContractAddress||n.ethConfiguration.registrationContractAddress,t).registerWithdrawAndMint.populateTransaction(a,i,d,s.asset_type,o);return t.sendTransaction(g)}async function tt(t,e,r,n,a){return t.getMintableTokenDetailsByClientTokenId({tokenAddress:n.tokenAddress,tokenId:n.tokenId}).then(i=>et(e,r,{type:A,data:{id:n.tokenId,tokenAddress:n.tokenAddress,blueprint:i.data.blueprint}},a)).catch(i=>{if(i.response?.status===404)return Ze(e,r,n,a);throw i})}async function rt(t,e,r,n){let a=await C("mintable-asset",A,n,{id:r.data.id,token_address:r.data.tokenAddress,...r.data.blueprint&&{blueprint:r.data.blueprint}}),i=ce(r),o=await Contracts.CoreV4.connect(n.ethConfiguration.coreContractAddress,t).withdrawAndMint.populateTransaction(e,a.asset_type,i);return t.sendTransaction(o)}async function nt(t,e,r,n){let a=await C("asset",A,n,{token_id:r.tokenId,token_address:r.tokenAddress}),s=await Contracts.CoreV4.connect(n.ethConfiguration.coreContractAddress,t).withdrawNft.populateTransaction(e,a.asset_type,r.tokenId);return t.sendTransaction(s)}async function oe(t,e,r,n,a){return t.getMintableTokenDetailsByClientTokenId({tokenAddress:n.tokenAddress,tokenId:n.tokenId}).then(i=>rt(e,r,{type:A,data:{id:n.tokenId,tokenAddress:n.tokenAddress,blueprint:i.data.blueprint}},a)).catch(i=>{if(i.response?.status===404)return nt(e,r,n,a);throw i})}async function me({ethSigner:t,starkSigner:e,starkPublicKey:r,token:n,config:a},i){await l(t,a.immutableXConfig);let s=await t.getAddress(),{v3Balance:o,v4Balance:d}=await ae(t,r,s,{type:A,tokenAddress:n.tokenAddress,tokenId:n.tokenId},a.immutableXConfig,i);if(o>0)return await _(r,t,a)?oe(i,t,r,n,a.immutableXConfig):tt(i,t,e,n,a.immutableXConfig);if(d>0)return oe(i,t,s,n,a.immutableXConfig);throw new Error("No balance to withdraw")}var ue="ETH";async function ge({ethSigner:t,starkSigner:e,starkPublicKey:r,config:n}){await l(t,n.immutableXConfig);let{v3Balance:a,v4Balance:i}=await I(t,r,await t.getAddress(),{type:ue},n.immutableXConfig),s=await C("asset",ue,n.immutableXConfig);if(a>0)return await _(r,t,n)?q(t,r,s.asset_type,n.immutableXConfig):D(t,e,r,s.asset_type,n.immutableXConfig);if(i>0)return L(t,r,s.asset_type,n.immutableXConfig);throw new Error("No balance to withdraw")}async function le({signers:t,withdrawal:e,config:r}){let n=new imx.WithdrawalsApi(r.immutableXConfig.apiConfiguration);return re({signers:t,config:r.immutableXConfig,...e},n)}async function fe({signers:{ethSigner:t,starkSigner:e},starkPublicKey:r,token:n,config:a}){let i=new imx.MintsApi(a.immutableXConfig.apiConfiguration);switch(n.type){case"ETH":return ge({ethSigner:t,starkSigner:e,starkPublicKey:r,config:a});case"ERC20":return se({ethSigner:t,starkSigner:e,starkPublicKey:r,token:n,config:a});case"ERC721":return me({ethSigner:t,starkSigner:e,starkPublicKey:r,token:n,config:a},i)}}async function Ce({signers:{ethSigner:t,starkSigner:e},request:r,config:n}){await l(t,n.immutableXConfig);let a=await t.getAddress(),i=new imx.TradesApi(n.immutableXConfig.apiConfiguration),s=await i.getSignableTrade({getSignableTradeRequest:{user:a,order_id:r.order_id,fees:r.fees}}),{signable_message:o,payload_hash:d}=s.data,p=await signRaw(o,t),g=await e.signMessage(d);return (await i.createTradeV3({createTradeRequest:{amount_buy:s.data.amount_buy,amount_sell:s.data.amount_sell,asset_id_buy:s.data.asset_id_buy,asset_id_sell:s.data.asset_id_sell,expiration_timestamp:s.data.expiration_timestamp,fee_info:s.data.fee_info,fees:r.fees,include_fees:!0,nonce:s.data.nonce,order_id:r.order_id,stark_key:s.data.stark_key,vault_id_buy:s.data.vault_id_buy,vault_id_sell:s.data.vault_id_sell,stark_signature:g},xImxEthAddress:a,xImxEthSignature:p})).data}async function dt(t,e,r,n,a,i){let o=await Contracts.CoreV4.connect(i.ethConfiguration.coreContractAddress,t)["deposit(uint256,uint256,uint256)"].populateTransaction(n,r,a);return t.sendTransaction({...o,value:e})}async function Re({signers:{ethSigner:t},deposit:e,config:r}){await l(t,r.immutableXConfig);let n=await t.getAddress(),a={decimals:18},i=parseUnits(e.amount,"wei"),s=r.immutableXConfig,o=new imx.DepositsApi(s.apiConfiguration),d=new imx.EncodingApi(s.apiConfiguration),p={user:n,token:{type:e.type,data:a},amount:i.toString()},g=await o.getSignableDeposit({getSignableDepositRequest:p}),f=(await d.encodeAsset({assetType:"asset",encodeAssetRequest:{token:{type:e.type}}})).data.asset_type,c=g.data.stark_key,w=g.data.vault_id;return dt(t,i,f,c,w,s)}async function mt(t,e,r,n,a,i){let o=await Contracts.CoreV4.connect(i.coreContractAddress,t).depositERC20.populateTransaction(n,r,a,e);return t.sendTransaction(o)}async function _e({signers:{ethSigner:t},deposit:e,config:r}){await l(t,r.immutableXConfig);let{apiConfiguration:n,ethConfiguration:a}=r.immutableXConfig,i=await t.getAddress(),s=new imx.TokensApi(n),o=new imx.DepositsApi(n),d=new imx.EncodingApi(n),p=await s.getToken({address:e.tokenAddress}),E={decimals:parseInt(p.data.decimals),token_address:e.tokenAddress},f=parseUnits(e.amount,0),w=await Contracts.IERC20.connect(e.tokenAddress,t).approve.populateTransaction(a.coreContractAddress,f);await t.sendTransaction(w);let T={user:i,token:{type:e.type,data:E},amount:f.toString()},b=await o.getSignableDeposit({getSignableDepositRequest:T}),Xe=(await d.encodeAsset({assetType:"asset",encodeAssetRequest:{token:{type:e.type,data:{token_address:e.tokenAddress}}}})).data.asset_type,De=b.data.stark_key,qe=b.data.vault_id,Le=BigInt(b.data.amount);return mt(t,Le,Xe,De,qe,a)}async function ut(t,e,r,n,a,i){let o=await Contracts.CoreV4.connect(i.ethConfiguration.coreContractAddress,t).depositNft.populateTransaction(n,r,a,e);return t.sendTransaction(o)}async function Ae({signers:{ethSigner:t},deposit:e,config:r}){await l(t,r.immutableXConfig);let n=await t.getAddress(),{immutableXConfig:a}=r,i=new imx.DepositsApi(a.apiConfiguration),s=new imx.EncodingApi(a.apiConfiguration),o={token_address:e.tokenAddress,token_id:e.tokenId},p={user:n,token:{type:e.type,data:o},amount:"1".toString()},g=await i.getSignableDeposit({getSignableDepositRequest:p}),f=(await s.encodeAsset({assetType:"asset",encodeAssetRequest:{token:{type:e.type,data:{token_address:e.tokenAddress,token_id:e.tokenId}}}})).data.asset_type,c=g.data.stark_key,w=g.data.vault_id,T=Contracts.IERC721.connect(e.tokenAddress,t),b=a.ethConfiguration.coreContractAddress;return await T.isApprovedForAll(n,b)||await T.setApprovalForAll(b,!0),ut(t,e.tokenId,f,c,w,a)}async function be({signers:t,deposit:e,config:r}){switch(e.type){case"ETH":return Re({signers:t,deposit:e,config:r});case"ERC20":return _e({signers:t,deposit:e,config:r});case"ERC721":return Ae({signers:t,deposit:e,config:r})}}async function ye({signers:t,request:e,config:r}){await l(t.ethSigner,r.immutableXConfig);let n=new imx.ExchangesApi(r.immutableXConfig.apiConfiguration),a=await t.ethSigner.getAddress(),i=e.amount,s=await n.getExchangeSignableTransfer({id:e.transactionID,getSignableTransferRequest:{sender:a,token:convertToSignableToken(e),amount:i,receiver:e.receiver}}),{signable_message:o,payload_hash:d}=s.data,p=await signRaw(o,t.ethSigner),g=await t.starkSigner.signMessage(d),E={sender_stark_key:s.data.sender_stark_key,sender_vault_id:s.data.sender_vault_id,receiver_stark_key:s.data.receiver_stark_key,receiver_vault_id:s.data.receiver_vault_id,asset_id:s.data.asset_id,amount:s.data.amount,nonce:s.data.nonce,expiration_timestamp:s.data.expiration_timestamp,stark_signature:g},f=await n.createExchangeTransfer({id:e.transactionID,createTransferRequest:E,xImxEthAddress:a,xImxEthSignature:p});return {sent_signature:f?.data.sent_signature,status:f?.data.status?.toString(),time:f?.data.time,transfer_id:f?.data.transfer_id}}var P=class{config;signers;constructor(e,r,n){this.config=e,this.signers={ethSigner:r,starkSigner:n};}async getAddress(){return this.signers.ethSigner.getAddress()}async isRegisteredOffchain(){let e=await this.getAddress();return te(e,this.config)}registerOffchain(){return ee(this.signers,this.config)}batchNftTransfer(e){return Q({signers:this.signers,request:e,config:this.config})}cancelOrder(e){return J({signers:this.signers,request:e,config:this.config})}completeWithdrawal(e,r){return fe({config:this.config,signers:this.signers,token:r,starkPublicKey:e})}createOrder(e){return j({signers:this.signers,request:e,config:this.config})}createTrade(e){return Ce({signers:this.signers,request:e,config:this.config})}deposit(e){return be({signers:this.signers,deposit:e,config:this.config})}exchangeTransfer(e){return ye({signers:this.signers,request:e,config:this.config})}async isRegisteredOnchain(){let e=await this.signers.starkSigner.getAddress();return _(e,this.signers.ethSigner,this.config)}prepareWithdrawal(e){return le({signers:this.signers,withdrawal:e,config:this.config})}transfer(e){return Y({signers:this.signers,request:e,config:this.config})}};var Se={SWITCH_CHAIN:"wallet_switchEthereumChain",CONNECT:"eth_requestAccounts"};function ke(t){return !!t?.request}async function Pe(t,e){await t.request({method:Se.CONNECT}),e&&await t.request({method:Se.SWITCH_CHAIN,params:[{chainId:`0x${e.toString(16)}`}]});}var Et={PROVIDER_NOT_FOUND:"The Metamask provider was not found"};async function ve({chainID:t}){let e=await ft();if(!ke(e))throw new Error(Et.PROVIDER_NOT_FOUND);return await Pe(e,t),new BrowserProvider(e)}var R="message";function y(t,e){t&&t.contentWindow&&t.contentWindow.postMessage(e,new URL(t.src).origin);}function S(t,e,r,n){if(t&&e.source!==t.contentWindow)return;let a=e.data;a.type===r&&n(a.details);}var M=class{publicAddress;iframe;constructor(e,r){this.publicAddress=e,this.iframe=r;}getAddress(){return this.publicAddress}signMessage(e){return new Promise((r,n)=>{let a=i=>{S(this.iframe,i,"SIGN_MESSAGE_RESPONSE",s=>{window.removeEventListener(R,a),s.success||n(new Error(s.error?.message)),r(s.data.signedMessage);});};window.addEventListener(R,a),y(this.iframe,{type:"SIGN_MESSAGE_REQUEST",details:{starkPublicKey:this.publicAddress,message:e}});})}getIFrame(){return this.iframe}getYCoordinate(){return new Promise((e,r)=>{let n=a=>{S(this.iframe,a,"GET_Y_COORDINATE_RESPONSE",i=>{window.removeEventListener(R,n),i.success||r(new Error(i.error?.message)),e(i.data.yCoordinate);});};window.addEventListener(R,n),y(this.iframe,{type:"GET_Y_COORDINATE_REQUEST",details:{starkPublicKey:this.publicAddress}});})}};var Ie="imx-wallet-app",_t={[Environment.SANDBOX]:"https://wallets.sandbox.immutable.com",[Environment.PRODUCTION]:"https://wallets.immutable.com"},Tt="display: none;";function ht(){return document.querySelector(`iframe#${Ie}`)}async function At(t){return new Promise(e=>{let r=document.createElement("iframe");r.setAttribute("id",Ie),r.setAttribute("src",_t[t]),r.setAttribute("style",Tt),document.body.appendChild(r),r.onload=()=>e(r);})}async function Oe(t){let e=ht();return e||await At(t)}var bt="Only sign this request if you\u2019ve initiated an action with Immutable X.",yt="The L2 IMX Wallet connection has failed";async function Ne(t,e){let r=await t.getSigner(),n=await r.getAddress(),a=await r.signMessage(bt),i=await Oe(e);return new Promise((s,o)=>{let d=p=>{S(i,p,"CONNECT_WALLET_RESPONSE",g=>{window.removeEventListener(R,d),g.success||o(new Error(yt)),s(new M(g.data.starkPublicKey,i));});};window.addEventListener(R,d),y(i,{type:"CONNECT_WALLET_REQUEST",details:{ethAddress:n,signature:a}});})}async function Me(t){let e=t.getIFrame();return new Promise((r,n)=>{let a=i=>{S(e,i,"DISCONNECT_WALLET_RESPONSE",s=>{window.removeEventListener(R,a),!s.success&&s.error&&n(s.error),e.remove(),r();});};window.addEventListener(R,a),y(e,{type:"DISCONNECT_WALLET_REQUEST",details:{starkPublicKey:t.getAddress()}});})}var k=class extends Error{type;constructor(e,r){super(e),this.type=r;}},W=async(t,e)=>{try{return await t()}catch(r){let n=e.message||`${r.message}`||"UnknownError";throw new k(n,e.type)}};var V=class t extends P{static imxSigner;static async connect(e){return await W(async()=>{let r=await ve({chainID:e.immutableXConfig.ethConfiguration.chainID});return this.imxSigner=await Ne(r,e.baseConfig.environment),new t(e,await r.getSigner(),this.imxSigner)},{type:"WALLET_CONNECTION_ERROR"})}static async disconnect(){if(!this.imxSigner)throw new k("Attempted to disconnect from the MetaMask IMX provider without an established connection","PROVIDER_CONNECTION_ERROR");return W(async()=>{await Me(this.imxSigner);},{type:"PROVIDER_CONNECTION_ERROR"})}static async signMessage(e){if(!this.imxSigner)throw new k("Attempted to sign a message with the MetaMask IMX provider without an established connection","PROVIDER_CONNECTION_ERROR");return W(async()=>await this.imxSigner.signMessage(e),{type:"PROVIDER_CONNECTION_ERROR"})}};var B=class{immutableXConfig;baseConfig;constructor({baseConfig:e,overrides:r}){if(this.baseConfig=e,r)this.immutableXConfig=r.immutableXConfig;else {let n=new ImxConfiguration({baseConfig:e});this.immutableXConfig=n.immutableXConfig;}}};
2
+ export{P as GenericIMXProvider,V as MetaMaskIMXProvider,B as ProviderConfiguration};
@@ -0,0 +1,2 @@
1
+ 'use strict';var generatedClients=require('@imtbl/generated-clients'),toolkit=require('@imtbl/toolkit'),xClient=require('@imtbl/x-client'),axios=require('axios'),I=require('enc-utils'),ethers=require('ethers'),pt=require('@metamask/detect-provider'),config=require('@imtbl/config');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}function _interopNamespace(e){if(e&&e.__esModule)return e;var n=Object.create(null);if(e){Object.keys(e).forEach(function(k){if(k!=='default'){var d=Object.getOwnPropertyDescriptor(e,k);Object.defineProperty(n,k,d.get?d:{enumerable:true,get:function(){return e[k]}});}})}n.default=e;return Object.freeze(n)}var I__namespace=/*#__PURE__*/_interopNamespace(I);var pt__default=/*#__PURE__*/_interopDefault(pt);function qe(t,e){return t===e.ethConfiguration.chainID}async function g(t,e){let r=(await t.provider?.getNetwork())?.chainId;if(!qe(Number(r),e))throw new Error("The wallet used for this operation is not connected to the correct network.")}async function H({signers:{ethSigner:t,starkSigner:e},request:r,config:n}){await g(t,n.immutableXConfig);let a=await t.getAddress(),i=new generatedClients.imx.TransfersApi(n.immutableXConfig.apiConfiguration),s=r.type==="ERC721"?"1":r.amount,o=await i.getSignableTransferV1({getSignableTransferRequest:{sender:a,token:toolkit.convertToSignableToken(r),amount:s,receiver:r.receiver}}),{signable_message:d,payload_hash:u}=o.data,m=await toolkit.signRaw(d,t),f=await e.signMessage(u),p={sender_stark_key:o.data.sender_stark_key,sender_vault_id:o.data.sender_vault_id,receiver_stark_key:o.data.receiver_stark_key,receiver_vault_id:o.data.receiver_vault_id,asset_id:o.data.asset_id,amount:o.data.amount,nonce:o.data.nonce,expiration_timestamp:o.data.expiration_timestamp,stark_signature:f},c=await i.createTransferV1({createTransferRequest:p,xImxEthAddress:a,xImxEthSignature:m});return {sent_signature:c?.data.sent_signature,status:c?.data.status?.toString(),time:c?.data.time,transfer_id:c?.data.transfer_id}}async function F({signers:{ethSigner:t,starkSigner:e},request:r,config:n}){await g(t,n.immutableXConfig);let a=await t.getAddress(),i=new generatedClients.imx.TransfersApi(n.immutableXConfig.apiConfiguration),s=r.map(c=>({amount:"1",token:toolkit.convertToSignableToken({type:"ERC721",tokenId:c.tokenId,tokenAddress:c.tokenAddress}),receiver:c.receiver})),o=await i.getSignableTransfer({getSignableTransferRequestV2:{sender_ether_key:a,signable_requests:s}}),d=o.data.signable_message;if(d===void 0)throw new Error("Invalid response from Signable registration offchain");let u=await toolkit.signRaw(d,t),m=[];for(let c of o.data.signable_responses){let E=await e.signMessage(c.payload_hash),w={sender_vault_id:c.sender_vault_id,receiver_stark_key:c.receiver_stark_key,receiver_vault_id:c.receiver_vault_id,asset_id:c.asset_id,amount:c.amount,nonce:c.nonce,expiration_timestamp:c.expiration_timestamp,stark_signature:E};m.push(w);}let f={sender_stark_key:o.data.sender_stark_key,requests:m};return {transfer_ids:(await i.createTransfer({createTransferRequestV2:f,xImxEthAddress:a,xImxEthSignature:u}))?.data.transfer_ids}}async function z({signers:t,request:e,config:r}){await g(t.ethSigner,r.immutableXConfig);let n=await t.ethSigner.getAddress(),a=new generatedClients.imx.OrdersApi(r.immutableXConfig.apiConfiguration),i=e.sell.type==="ERC721"?"1":e.sell.amount,s=e.buy.type==="ERC721"?"1":e.buy.amount,o={user:n,amount_buy:s,token_buy:toolkit.convertToSignableToken(e.buy),amount_sell:i,token_sell:toolkit.convertToSignableToken(e.sell),fees:e.fees,expiration_timestamp:e.expiration_timestamp},d=await a.getSignableOrder({getSignableOrderRequestV3:o}),{signable_message:u,payload_hash:m}=d.data,f=await toolkit.signRaw(u,t.ethSigner),p=await t.starkSigner.signMessage(m),c=d.data,E={createOrderRequest:{amount_buy:c.amount_buy,amount_sell:c.amount_sell,asset_id_buy:c.asset_id_buy,asset_id_sell:c.asset_id_sell,expiration_timestamp:c.expiration_timestamp,fees:e.fees,nonce:c.nonce,stark_key:c.stark_key,stark_signature:p,vault_id_buy:c.vault_id_buy,vault_id_sell:c.vault_id_sell},xImxEthAddress:n,xImxEthSignature:f};return {...(await a.createOrderV3(E)).data}}async function K({signers:t,request:e,config:r}){let n=new generatedClients.imx.OrdersApi(r.immutableXConfig.apiConfiguration),a=await n.getSignableCancelOrderV3({getSignableCancelOrderRequest:{order_id:e.order_id}}),{signable_message:i,payload_hash:s}=a.data,o=await toolkit.signRaw(i,t.ethSigner),d=await t.starkSigner.signMessage(s),u=await t.ethSigner.getAddress(),m=await n.cancelOrderV3({id:e.order_id.toString(),cancelOrderRequest:{order_id:e.order_id,stark_signature:d},xImxEthAddress:u,xImxEthSignature:o});return {order_id:m.data.order_id,status:m.data.status}}async function J(t,e){await g(t.ethSigner,e.immutableXConfig);let r=new generatedClients.imx.UsersApi(e.immutableXConfig.apiConfiguration),n=await t.ethSigner.getAddress(),a=await t.starkSigner.getAddress(),i=await r.getSignableRegistrationOffchain({getSignableRegistrationRequest:{ether_key:n,stark_key:a}}),{signable_message:s,payload_hash:o}=i.data,d=await toolkit.signRaw(s,t.ethSigner),u=await t.starkSigner.signMessage(o);return (await r.registerUser({registerUserRequest:{eth_signature:d,ether_key:n,stark_signature:u,stark_key:a}})).data}async function Z(t,e){try{let n=await new generatedClients.imx.UsersApi(e.immutableXConfig.apiConfiguration).getUsers({user:t}),{accounts:a}=n.data;return a?.length>0}catch(r){if(axios.isAxiosError(r)&&r.response?.status===404)return !1;throw r}}async function R(t,e,r){await g(e,r.immutableXConfig);let n=r.immutableXConfig,a=xClient.Contracts.RegistrationV4.connect(n.ethConfiguration.registrationV4ContractAddress||n.ethConfiguration.registrationContractAddress,e);try{return await a.isRegistered(t)}catch(i){if(i.reason==="USER_UNREGISTERED")return !1;throw i}}var _=t=>{if(t!==void 0)return t;throw new Error("undefined field exception")};async function ee(t,e){let{signers:{ethSigner:r,starkSigner:n}}=t;await g(r,t.config);let a=t.type==="ERC721"?"1":t.amount,i=await e.getSignableWithdrawalV2({getSignableWithdrawalRequest:{user:await r.getAddress(),token:toolkit.convertToSignableToken(t),amount:a}}),{signable_message:s,payload_hash:o}=i.data,d=await n.signMessage(o),{ethAddress:u,ethSignature:m}=await toolkit.signMessage(s,r);return (await e.createWithdrawalV2({createWithdrawalRequestV2:{sender_stark_key:_(i.data.sender_stark_key),sender_vault_id:_(i.data.sender_vault_id),receiver_stark_key:_(i.data.receiver_stark_key),receiver_vault_id:_(i.data.receiver_vault_id),amount:a,asset_id:_(i.data.asset_id),expiration_timestamp:_(i.data.expiration_timestamp),nonce:_(i.data.nonce),stark_signature:d},xImxEthAddress:u,xImxEthSignature:m})).data}async function l(t,e,r,n){return (await new generatedClients.imx.EncodingApi(r.apiConfiguration).encodeAsset({assetType:t,encodeAssetRequest:{token:{type:e,...n&&{data:n}}}})).data}async function k(t,e,r,n){return xClient.Contracts.CoreV4.connect(n.ethConfiguration.coreContractAddress,t).getWithdrawalBalance(e,r)}async function Qe(t,e,r){let n=await l("asset","ETH",r);return await k(t,e,n.asset_id,r)}async function $e(t,e,r,n){let a=await l("asset","ERC20",n,{token_address:r});return await k(t,e,a.asset_id,n)}async function ze(t,e,r,n,a,i){try{let s=await a.getMintableTokenDetailsByClientTokenId({tokenAddress:r.tokenAddress,tokenId:r.tokenId}),o=await l("mintable-asset","ERC721",i,{id:r.tokenId,token_address:r.tokenAddress,...s.data.blueprint&&{blueprint:s.data.blueprint}});return await k(t,e,o.asset_id,i)}catch(s){if(s.response?.status===404){let o=await l("asset","ERC721",i,{token_id:r.tokenId,token_address:r.tokenAddress});return await k(t,e,o.asset_id,i)}throw s}}async function P(t,e,r,n,a,i){switch(r.type){case"ETH":return await Qe(t,e,i);case"ERC20":return await $e(t,e,r.tokenAddress,i);case"ERC721":return await ze(t,e,r,n,a,i);default:throw new Error("Unsupported token type")}}async function v(t,e,r,n,a){let i=new xClient.EncodingApi(a.apiConfiguration),s=new xClient.MintsApi(a.apiConfiguration),o=await P(t,e,n,i,s,a),d=await P(t,r,n,i,s,a);return {v3Balance:o,v4Balance:d}}async function re(t,e,r,n,a,i){let s=new xClient.EncodingApi(a.apiConfiguration),o=await P(t,e,n,s,i,a),d=await P(t,r,n,s,i,a);return {v3Balance:o,v4Balance:d}}var ne="ERC20";async function W(t,e,r,n,a){let i=await t.getAddress(),s=await xClient.signRegisterEthAddress(e,i,r),d=await xClient.Contracts.RegistrationV4.connect(a.ethConfiguration.registrationV4ContractAddress||a.ethConfiguration.registrationContractAddress,t).registerAndWithdrawAll.populateTransaction(i,r,s,n);return t.sendTransaction(d)}async function X(t,e,r,n){let i=await xClient.Contracts.RegistrationV4.connect(n.ethConfiguration.registrationV4ContractAddress||n.ethConfiguration.registrationContractAddress,t).withdrawAll.populateTransaction(await t.getAddress(),e,r);return t.sendTransaction(i)}async function D(t,e,r,n){let i=await xClient.Contracts.CoreV4.connect(n.ethConfiguration.coreContractAddress,t).withdraw.populateTransaction(await t.getAddress(),r);return t.sendTransaction(i)}async function ae({ethSigner:t,starkSigner:e,starkPublicKey:r,token:n,config:a}){await g(t,a.immutableXConfig);let{v3Balance:i,v4Balance:s}=await v(t,r,await t.getAddress(),{type:ne,tokenAddress:n.tokenAddress},a.immutableXConfig),o=await l("asset",ne,a.immutableXConfig,{token_address:n.tokenAddress});if(i>0)return await R(r,t,a)?X(t,r,o.asset_type,a.immutableXConfig):W(t,e,r,o.asset_type,a.immutableXConfig);if(s>0)return D(t,r,o.asset_type,a.immutableXConfig);throw new Error("No balance to withdraw")}var T="ERC721";function oe(t){let{id:e}=t.data,r=t.data.blueprint||"";return I__namespace.sanitizeHex(I__namespace.utf8ToHex(`{${e}}:{${r}}`))}async function je(t,e,r,n){let a=await t.getAddress(),i=await e.getAddress(),s=await l("asset",T,n,{token_id:r.tokenId,token_address:r.tokenAddress}),o=await xClient.signRegisterEthAddress(e,a,i),u=await xClient.Contracts.RegistrationV4.connect(n.ethConfiguration.registrationV4ContractAddress||n.ethConfiguration.registrationContractAddress,t).registerAndWithdrawNft.populateTransaction(a,i,o,s.asset_type,r.tokenId);return t.sendTransaction(u)}async function Je(t,e,r,n){let a=await t.getAddress(),i=await e.getAddress(),s=await l("mintable-asset",T,n,{id:r.data.id,token_address:r.data.tokenAddress,...r.data.blueprint&&{blueprint:r.data.blueprint}}),o=oe(r),d=await xClient.signRegisterEthAddress(e,a,i),m=await xClient.Contracts.RegistrationV4.connect(n.ethConfiguration.registrationV4ContractAddress||n.ethConfiguration.registrationContractAddress,t).registerWithdrawAndMint.populateTransaction(a,i,d,s.asset_type,o);return t.sendTransaction(m)}async function Ze(t,e,r,n,a){return t.getMintableTokenDetailsByClientTokenId({tokenAddress:n.tokenAddress,tokenId:n.tokenId}).then(i=>Je(e,r,{type:T,data:{id:n.tokenId,tokenAddress:n.tokenAddress,blueprint:i.data.blueprint}},a)).catch(i=>{if(i.response?.status===404)return je(e,r,n,a);throw i})}async function et(t,e,r,n){let a=await l("mintable-asset",T,n,{id:r.data.id,token_address:r.data.tokenAddress,...r.data.blueprint&&{blueprint:r.data.blueprint}}),i=oe(r),o=await xClient.Contracts.CoreV4.connect(n.ethConfiguration.coreContractAddress,t).withdrawAndMint.populateTransaction(e,a.asset_type,i);return t.sendTransaction(o)}async function tt(t,e,r,n){let a=await l("asset",T,n,{token_id:r.tokenId,token_address:r.tokenAddress}),s=await xClient.Contracts.CoreV4.connect(n.ethConfiguration.coreContractAddress,t).withdrawNft.populateTransaction(e,a.asset_type,r.tokenId);return t.sendTransaction(s)}async function ie(t,e,r,n,a){return t.getMintableTokenDetailsByClientTokenId({tokenAddress:n.tokenAddress,tokenId:n.tokenId}).then(i=>et(e,r,{type:T,data:{id:n.tokenId,tokenAddress:n.tokenAddress,blueprint:i.data.blueprint}},a)).catch(i=>{if(i.response?.status===404)return tt(e,r,n,a);throw i})}async function de({ethSigner:t,starkSigner:e,starkPublicKey:r,token:n,config:a},i){await g(t,a.immutableXConfig);let s=await t.getAddress(),{v3Balance:o,v4Balance:d}=await re(t,r,s,{type:T,tokenAddress:n.tokenAddress,tokenId:n.tokenId},a.immutableXConfig,i);if(o>0)return await R(r,t,a)?ie(i,t,r,n,a.immutableXConfig):Ze(i,t,e,n,a.immutableXConfig);if(d>0)return ie(i,t,s,n,a.immutableXConfig);throw new Error("No balance to withdraw")}var ce="ETH";async function me({ethSigner:t,starkSigner:e,starkPublicKey:r,config:n}){await g(t,n.immutableXConfig);let{v3Balance:a,v4Balance:i}=await v(t,r,await t.getAddress(),{type:ce},n.immutableXConfig),s=await l("asset",ce,n.immutableXConfig);if(a>0)return await R(r,t,n)?X(t,r,s.asset_type,n.immutableXConfig):W(t,e,r,s.asset_type,n.immutableXConfig);if(i>0)return D(t,r,s.asset_type,n.immutableXConfig);throw new Error("No balance to withdraw")}async function ge({signers:t,withdrawal:e,config:r}){let n=new generatedClients.imx.WithdrawalsApi(r.immutableXConfig.apiConfiguration);return ee({signers:t,config:r.immutableXConfig,...e},n)}async function pe({signers:{ethSigner:t,starkSigner:e},starkPublicKey:r,token:n,config:a}){let i=new generatedClients.imx.MintsApi(a.immutableXConfig.apiConfiguration);switch(n.type){case"ETH":return me({ethSigner:t,starkSigner:e,starkPublicKey:r,config:a});case"ERC20":return ae({ethSigner:t,starkSigner:e,starkPublicKey:r,token:n,config:a});case"ERC721":return de({ethSigner:t,starkSigner:e,starkPublicKey:r,token:n,config:a},i)}}async function le({signers:{ethSigner:t,starkSigner:e},request:r,config:n}){await g(t,n.immutableXConfig);let a=await t.getAddress(),i=new generatedClients.imx.TradesApi(n.immutableXConfig.apiConfiguration),s=await i.getSignableTrade({getSignableTradeRequest:{user:a,order_id:r.order_id,fees:r.fees}}),{signable_message:o,payload_hash:d}=s.data,u=await toolkit.signRaw(o,t),m=await e.signMessage(d);return (await i.createTradeV3({createTradeRequest:{amount_buy:s.data.amount_buy,amount_sell:s.data.amount_sell,asset_id_buy:s.data.asset_id_buy,asset_id_sell:s.data.asset_id_sell,expiration_timestamp:s.data.expiration_timestamp,fee_info:s.data.fee_info,fees:r.fees,include_fees:!0,nonce:s.data.nonce,order_id:r.order_id,stark_key:s.data.stark_key,vault_id_buy:s.data.vault_id_buy,vault_id_sell:s.data.vault_id_sell,stark_signature:m},xImxEthAddress:a,xImxEthSignature:u})).data}async function st(t,e,r,n,a,i){let o=await xClient.Contracts.CoreV4.connect(i.ethConfiguration.coreContractAddress,t)["deposit(uint256,uint256,uint256)"].populateTransaction(n,r,a);return t.sendTransaction({...o,value:e})}async function Ce({signers:{ethSigner:t},deposit:e,config:r}){await g(t,r.immutableXConfig);let n=await t.getAddress(),a={decimals:18},i=ethers.parseUnits(e.amount,"wei"),s=r.immutableXConfig,o=new generatedClients.imx.DepositsApi(s.apiConfiguration),d=new generatedClients.imx.EncodingApi(s.apiConfiguration),u={user:n,token:{type:e.type,data:a},amount:i.toString()},m=await o.getSignableDeposit({getSignableDepositRequest:u}),p=(await d.encodeAsset({assetType:"asset",encodeAssetRequest:{token:{type:e.type}}})).data.asset_type,c=m.data.stark_key,E=m.data.vault_id;return st(t,i,p,c,E,s)}async function dt(t,e,r,n,a,i){let o=await xClient.Contracts.CoreV4.connect(i.coreContractAddress,t).depositERC20.populateTransaction(n,r,a,e);return t.sendTransaction(o)}async function Re({signers:{ethSigner:t},deposit:e,config:r}){await g(t,r.immutableXConfig);let{apiConfiguration:n,ethConfiguration:a}=r.immutableXConfig,i=await t.getAddress(),s=new generatedClients.imx.TokensApi(n),o=new generatedClients.imx.DepositsApi(n),d=new generatedClients.imx.EncodingApi(n),u=await s.getToken({address:e.tokenAddress}),f={decimals:parseInt(u.data.decimals),token_address:e.tokenAddress},p=ethers.parseUnits(e.amount,0),E=await xClient.Contracts.IERC20.connect(e.tokenAddress,t).approve.populateTransaction(a.coreContractAddress,p);await t.sendTransaction(E);let w={user:i,token:{type:e.type,data:f},amount:p.toString()},h=await o.getSignableDeposit({getSignableDepositRequest:w}),Me=(await d.encodeAsset({assetType:"asset",encodeAssetRequest:{token:{type:e.type,data:{token_address:e.tokenAddress}}}})).data.asset_type,We=h.data.stark_key,Xe=h.data.vault_id,De=BigInt(h.data.amount);return dt(t,De,Me,We,Xe,a)}async function ct(t,e,r,n,a,i){let o=await xClient.Contracts.CoreV4.connect(i.ethConfiguration.coreContractAddress,t).depositNft.populateTransaction(n,r,a,e);return t.sendTransaction(o)}async function Te({signers:{ethSigner:t},deposit:e,config:r}){await g(t,r.immutableXConfig);let n=await t.getAddress(),{immutableXConfig:a}=r,i=new generatedClients.imx.DepositsApi(a.apiConfiguration),s=new generatedClients.imx.EncodingApi(a.apiConfiguration),o={token_address:e.tokenAddress,token_id:e.tokenId},u={user:n,token:{type:e.type,data:o},amount:"1".toString()},m=await i.getSignableDeposit({getSignableDepositRequest:u}),p=(await s.encodeAsset({assetType:"asset",encodeAssetRequest:{token:{type:e.type,data:{token_address:e.tokenAddress,token_id:e.tokenId}}}})).data.asset_type,c=m.data.stark_key,E=m.data.vault_id,w=xClient.Contracts.IERC721.connect(e.tokenAddress,t),h=a.ethConfiguration.coreContractAddress;return await w.isApprovedForAll(n,h)||await w.setApprovalForAll(h,!0),ct(t,e.tokenId,p,c,E,a)}async function he({signers:t,deposit:e,config:r}){switch(e.type){case"ETH":return Ce({signers:t,deposit:e,config:r});case"ERC20":return Re({signers:t,deposit:e,config:r});case"ERC721":return Te({signers:t,deposit:e,config:r})}}async function Ae({signers:t,request:e,config:r}){await g(t.ethSigner,r.immutableXConfig);let n=new generatedClients.imx.ExchangesApi(r.immutableXConfig.apiConfiguration),a=await t.ethSigner.getAddress(),i=e.amount,s=await n.getExchangeSignableTransfer({id:e.transactionID,getSignableTransferRequest:{sender:a,token:toolkit.convertToSignableToken(e),amount:i,receiver:e.receiver}}),{signable_message:o,payload_hash:d}=s.data,u=await toolkit.signRaw(o,t.ethSigner),m=await t.starkSigner.signMessage(d),f={sender_stark_key:s.data.sender_stark_key,sender_vault_id:s.data.sender_vault_id,receiver_stark_key:s.data.receiver_stark_key,receiver_vault_id:s.data.receiver_vault_id,asset_id:s.data.asset_id,amount:s.data.amount,nonce:s.data.nonce,expiration_timestamp:s.data.expiration_timestamp,stark_signature:m},p=await n.createExchangeTransfer({id:e.transactionID,createTransferRequest:f,xImxEthAddress:a,xImxEthSignature:u});return {sent_signature:p?.data.sent_signature,status:p?.data.status?.toString(),time:p?.data.time,transfer_id:p?.data.transfer_id}}var S=class{config;signers;constructor(e,r,n){this.config=e,this.signers={ethSigner:r,starkSigner:n};}async getAddress(){return this.signers.ethSigner.getAddress()}async isRegisteredOffchain(){let e=await this.getAddress();return Z(e,this.config)}registerOffchain(){return J(this.signers,this.config)}batchNftTransfer(e){return F({signers:this.signers,request:e,config:this.config})}cancelOrder(e){return K({signers:this.signers,request:e,config:this.config})}completeWithdrawal(e,r){return pe({config:this.config,signers:this.signers,token:r,starkPublicKey:e})}createOrder(e){return z({signers:this.signers,request:e,config:this.config})}createTrade(e){return le({signers:this.signers,request:e,config:this.config})}deposit(e){return he({signers:this.signers,deposit:e,config:this.config})}exchangeTransfer(e){return Ae({signers:this.signers,request:e,config:this.config})}async isRegisteredOnchain(){let e=await this.signers.starkSigner.getAddress();return R(e,this.signers.ethSigner,this.config)}prepareWithdrawal(e){return ge({signers:this.signers,withdrawal:e,config:this.config})}transfer(e){return H({signers:this.signers,request:e,config:this.config})}};var be={SWITCH_CHAIN:"wallet_switchEthereumChain",CONNECT:"eth_requestAccounts"};function ye(t){return !!t?.request}async function Se(t,e){await t.request({method:be.CONNECT}),e&&await t.request({method:be.SWITCH_CHAIN,params:[{chainId:`0x${e.toString(16)}`}]});}var ft={PROVIDER_NOT_FOUND:"The Metamask provider was not found"};async function ke({chainID:t}){let e=await pt__default.default();if(!ye(e))throw new Error(ft.PROVIDER_NOT_FOUND);return await Se(e,t),new ethers.BrowserProvider(e)}var C="message";function A(t,e){t&&t.contentWindow&&t.contentWindow.postMessage(e,new URL(t.src).origin);}function b(t,e,r,n){if(t&&e.source!==t.contentWindow)return;let a=e.data;a.type===r&&n(a.details);}var O=class{publicAddress;iframe;constructor(e,r){this.publicAddress=e,this.iframe=r;}getAddress(){return this.publicAddress}signMessage(e){return new Promise((r,n)=>{let a=i=>{b(this.iframe,i,"SIGN_MESSAGE_RESPONSE",s=>{window.removeEventListener(C,a),s.success||n(new Error(s.error?.message)),r(s.data.signedMessage);});};window.addEventListener(C,a),A(this.iframe,{type:"SIGN_MESSAGE_REQUEST",details:{starkPublicKey:this.publicAddress,message:e}});})}getIFrame(){return this.iframe}getYCoordinate(){return new Promise((e,r)=>{let n=a=>{b(this.iframe,a,"GET_Y_COORDINATE_RESPONSE",i=>{window.removeEventListener(C,n),i.success||r(new Error(i.error?.message)),e(i.data.yCoordinate);});};window.addEventListener(C,n),A(this.iframe,{type:"GET_Y_COORDINATE_REQUEST",details:{starkPublicKey:this.publicAddress}});})}};var ve="imx-wallet-app",Rt={[config.Environment.SANDBOX]:"https://wallets.sandbox.immutable.com",[config.Environment.PRODUCTION]:"https://wallets.immutable.com"},wt="display: none;";function _t(){return document.querySelector(`iframe#${ve}`)}async function Tt(t){return new Promise(e=>{let r=document.createElement("iframe");r.setAttribute("id",ve),r.setAttribute("src",Rt[t]),r.setAttribute("style",wt),document.body.appendChild(r),r.onload=()=>e(r);})}async function xe(t){let e=_t();return e||await Tt(t)}var ht="Only sign this request if you\u2019ve initiated an action with Immutable X.",At="The L2 IMX Wallet connection has failed";async function Ie(t,e){let r=await t.getSigner(),n=await r.getAddress(),a=await r.signMessage(ht),i=await xe(e);return new Promise((s,o)=>{let d=u=>{b(i,u,"CONNECT_WALLET_RESPONSE",m=>{window.removeEventListener(C,d),m.success||o(new Error(At)),s(new O(m.data.starkPublicKey,i));});};window.addEventListener(C,d),A(i,{type:"CONNECT_WALLET_REQUEST",details:{ethAddress:n,signature:a}});})}async function Oe(t){let e=t.getIFrame();return new Promise((r,n)=>{let a=i=>{b(e,i,"DISCONNECT_WALLET_RESPONSE",s=>{window.removeEventListener(C,a),!s.success&&s.error&&n(s.error),e.remove(),r();});};window.addEventListener(C,a),A(e,{type:"DISCONNECT_WALLET_REQUEST",details:{starkPublicKey:t.getAddress()}});})}var y=class extends Error{type;constructor(e,r){super(e),this.type=r;}},N=async(t,e)=>{try{return await t()}catch(r){let n=e.message||`${r.message}`||"UnknownError";throw new y(n,e.type)}};var L=class t extends S{static imxSigner;static async connect(e){return await N(async()=>{let r=await ke({chainID:e.immutableXConfig.ethConfiguration.chainID});return this.imxSigner=await Ie(r,e.baseConfig.environment),new t(e,await r.getSigner(),this.imxSigner)},{type:"WALLET_CONNECTION_ERROR"})}static async disconnect(){if(!this.imxSigner)throw new y("Attempted to disconnect from the MetaMask IMX provider without an established connection","PROVIDER_CONNECTION_ERROR");return N(async()=>{await Oe(this.imxSigner);},{type:"PROVIDER_CONNECTION_ERROR"})}static async signMessage(e){if(!this.imxSigner)throw new y("Attempted to sign a message with the MetaMask IMX provider without an established connection","PROVIDER_CONNECTION_ERROR");return N(async()=>await this.imxSigner.signMessage(e),{type:"PROVIDER_CONNECTION_ERROR"})}};var U=class{immutableXConfig;baseConfig;constructor({baseConfig:e,overrides:r}){if(this.baseConfig=e,r)this.immutableXConfig=r.immutableXConfig;else {let n=new xClient.ImxConfiguration({baseConfig:e});this.immutableXConfig=n.immutableXConfig;}}};
2
+ exports.GenericIMXProvider=S;exports.MetaMaskIMXProvider=L;exports.ProviderConfiguration=U;
@@ -0,0 +1,2 @@
1
+ import {imx}from'@imtbl/generated-clients';import {convertToSignableToken,signRaw,signMessage}from'@imtbl/toolkit';import {ImxConfiguration,Contracts,EncodingApi,MintsApi,signRegisterEthAddress}from'@imtbl/x-client';import {isAxiosError}from'axios';import*as I from'enc-utils';import {parseUnits,BrowserProvider}from'ethers';import pt from'@metamask/detect-provider';import {Environment}from'@imtbl/config';function qe(t,e){return t===e.ethConfiguration.chainID}async function g(t,e){let r=(await t.provider?.getNetwork())?.chainId;if(!qe(Number(r),e))throw new Error("The wallet used for this operation is not connected to the correct network.")}async function H({signers:{ethSigner:t,starkSigner:e},request:r,config:n}){await g(t,n.immutableXConfig);let a=await t.getAddress(),i=new imx.TransfersApi(n.immutableXConfig.apiConfiguration),s=r.type==="ERC721"?"1":r.amount,o=await i.getSignableTransferV1({getSignableTransferRequest:{sender:a,token:convertToSignableToken(r),amount:s,receiver:r.receiver}}),{signable_message:d,payload_hash:u}=o.data,m=await signRaw(d,t),f=await e.signMessage(u),p={sender_stark_key:o.data.sender_stark_key,sender_vault_id:o.data.sender_vault_id,receiver_stark_key:o.data.receiver_stark_key,receiver_vault_id:o.data.receiver_vault_id,asset_id:o.data.asset_id,amount:o.data.amount,nonce:o.data.nonce,expiration_timestamp:o.data.expiration_timestamp,stark_signature:f},c=await i.createTransferV1({createTransferRequest:p,xImxEthAddress:a,xImxEthSignature:m});return {sent_signature:c?.data.sent_signature,status:c?.data.status?.toString(),time:c?.data.time,transfer_id:c?.data.transfer_id}}async function F({signers:{ethSigner:t,starkSigner:e},request:r,config:n}){await g(t,n.immutableXConfig);let a=await t.getAddress(),i=new imx.TransfersApi(n.immutableXConfig.apiConfiguration),s=r.map(c=>({amount:"1",token:convertToSignableToken({type:"ERC721",tokenId:c.tokenId,tokenAddress:c.tokenAddress}),receiver:c.receiver})),o=await i.getSignableTransfer({getSignableTransferRequestV2:{sender_ether_key:a,signable_requests:s}}),d=o.data.signable_message;if(d===void 0)throw new Error("Invalid response from Signable registration offchain");let u=await signRaw(d,t),m=[];for(let c of o.data.signable_responses){let E=await e.signMessage(c.payload_hash),w={sender_vault_id:c.sender_vault_id,receiver_stark_key:c.receiver_stark_key,receiver_vault_id:c.receiver_vault_id,asset_id:c.asset_id,amount:c.amount,nonce:c.nonce,expiration_timestamp:c.expiration_timestamp,stark_signature:E};m.push(w);}let f={sender_stark_key:o.data.sender_stark_key,requests:m};return {transfer_ids:(await i.createTransfer({createTransferRequestV2:f,xImxEthAddress:a,xImxEthSignature:u}))?.data.transfer_ids}}async function z({signers:t,request:e,config:r}){await g(t.ethSigner,r.immutableXConfig);let n=await t.ethSigner.getAddress(),a=new imx.OrdersApi(r.immutableXConfig.apiConfiguration),i=e.sell.type==="ERC721"?"1":e.sell.amount,s=e.buy.type==="ERC721"?"1":e.buy.amount,o={user:n,amount_buy:s,token_buy:convertToSignableToken(e.buy),amount_sell:i,token_sell:convertToSignableToken(e.sell),fees:e.fees,expiration_timestamp:e.expiration_timestamp},d=await a.getSignableOrder({getSignableOrderRequestV3:o}),{signable_message:u,payload_hash:m}=d.data,f=await signRaw(u,t.ethSigner),p=await t.starkSigner.signMessage(m),c=d.data,E={createOrderRequest:{amount_buy:c.amount_buy,amount_sell:c.amount_sell,asset_id_buy:c.asset_id_buy,asset_id_sell:c.asset_id_sell,expiration_timestamp:c.expiration_timestamp,fees:e.fees,nonce:c.nonce,stark_key:c.stark_key,stark_signature:p,vault_id_buy:c.vault_id_buy,vault_id_sell:c.vault_id_sell},xImxEthAddress:n,xImxEthSignature:f};return {...(await a.createOrderV3(E)).data}}async function K({signers:t,request:e,config:r}){let n=new imx.OrdersApi(r.immutableXConfig.apiConfiguration),a=await n.getSignableCancelOrderV3({getSignableCancelOrderRequest:{order_id:e.order_id}}),{signable_message:i,payload_hash:s}=a.data,o=await signRaw(i,t.ethSigner),d=await t.starkSigner.signMessage(s),u=await t.ethSigner.getAddress(),m=await n.cancelOrderV3({id:e.order_id.toString(),cancelOrderRequest:{order_id:e.order_id,stark_signature:d},xImxEthAddress:u,xImxEthSignature:o});return {order_id:m.data.order_id,status:m.data.status}}async function J(t,e){await g(t.ethSigner,e.immutableXConfig);let r=new imx.UsersApi(e.immutableXConfig.apiConfiguration),n=await t.ethSigner.getAddress(),a=await t.starkSigner.getAddress(),i=await r.getSignableRegistrationOffchain({getSignableRegistrationRequest:{ether_key:n,stark_key:a}}),{signable_message:s,payload_hash:o}=i.data,d=await signRaw(s,t.ethSigner),u=await t.starkSigner.signMessage(o);return (await r.registerUser({registerUserRequest:{eth_signature:d,ether_key:n,stark_signature:u,stark_key:a}})).data}async function Z(t,e){try{let n=await new imx.UsersApi(e.immutableXConfig.apiConfiguration).getUsers({user:t}),{accounts:a}=n.data;return a?.length>0}catch(r){if(isAxiosError(r)&&r.response?.status===404)return !1;throw r}}async function R(t,e,r){await g(e,r.immutableXConfig);let n=r.immutableXConfig,a=Contracts.RegistrationV4.connect(n.ethConfiguration.registrationV4ContractAddress||n.ethConfiguration.registrationContractAddress,e);try{return await a.isRegistered(t)}catch(i){if(i.reason==="USER_UNREGISTERED")return !1;throw i}}var _=t=>{if(t!==void 0)return t;throw new Error("undefined field exception")};async function ee(t,e){let{signers:{ethSigner:r,starkSigner:n}}=t;await g(r,t.config);let a=t.type==="ERC721"?"1":t.amount,i=await e.getSignableWithdrawalV2({getSignableWithdrawalRequest:{user:await r.getAddress(),token:convertToSignableToken(t),amount:a}}),{signable_message:s,payload_hash:o}=i.data,d=await n.signMessage(o),{ethAddress:u,ethSignature:m}=await signMessage(s,r);return (await e.createWithdrawalV2({createWithdrawalRequestV2:{sender_stark_key:_(i.data.sender_stark_key),sender_vault_id:_(i.data.sender_vault_id),receiver_stark_key:_(i.data.receiver_stark_key),receiver_vault_id:_(i.data.receiver_vault_id),amount:a,asset_id:_(i.data.asset_id),expiration_timestamp:_(i.data.expiration_timestamp),nonce:_(i.data.nonce),stark_signature:d},xImxEthAddress:u,xImxEthSignature:m})).data}async function l(t,e,r,n){return (await new imx.EncodingApi(r.apiConfiguration).encodeAsset({assetType:t,encodeAssetRequest:{token:{type:e,...n&&{data:n}}}})).data}async function k(t,e,r,n){return Contracts.CoreV4.connect(n.ethConfiguration.coreContractAddress,t).getWithdrawalBalance(e,r)}async function Qe(t,e,r){let n=await l("asset","ETH",r);return await k(t,e,n.asset_id,r)}async function $e(t,e,r,n){let a=await l("asset","ERC20",n,{token_address:r});return await k(t,e,a.asset_id,n)}async function ze(t,e,r,n,a,i){try{let s=await a.getMintableTokenDetailsByClientTokenId({tokenAddress:r.tokenAddress,tokenId:r.tokenId}),o=await l("mintable-asset","ERC721",i,{id:r.tokenId,token_address:r.tokenAddress,...s.data.blueprint&&{blueprint:s.data.blueprint}});return await k(t,e,o.asset_id,i)}catch(s){if(s.response?.status===404){let o=await l("asset","ERC721",i,{token_id:r.tokenId,token_address:r.tokenAddress});return await k(t,e,o.asset_id,i)}throw s}}async function P(t,e,r,n,a,i){switch(r.type){case"ETH":return await Qe(t,e,i);case"ERC20":return await $e(t,e,r.tokenAddress,i);case"ERC721":return await ze(t,e,r,n,a,i);default:throw new Error("Unsupported token type")}}async function v(t,e,r,n,a){let i=new EncodingApi(a.apiConfiguration),s=new MintsApi(a.apiConfiguration),o=await P(t,e,n,i,s,a),d=await P(t,r,n,i,s,a);return {v3Balance:o,v4Balance:d}}async function re(t,e,r,n,a,i){let s=new EncodingApi(a.apiConfiguration),o=await P(t,e,n,s,i,a),d=await P(t,r,n,s,i,a);return {v3Balance:o,v4Balance:d}}var ne="ERC20";async function W(t,e,r,n,a){let i=await t.getAddress(),s=await signRegisterEthAddress(e,i,r),d=await Contracts.RegistrationV4.connect(a.ethConfiguration.registrationV4ContractAddress||a.ethConfiguration.registrationContractAddress,t).registerAndWithdrawAll.populateTransaction(i,r,s,n);return t.sendTransaction(d)}async function X(t,e,r,n){let i=await Contracts.RegistrationV4.connect(n.ethConfiguration.registrationV4ContractAddress||n.ethConfiguration.registrationContractAddress,t).withdrawAll.populateTransaction(await t.getAddress(),e,r);return t.sendTransaction(i)}async function D(t,e,r,n){let i=await Contracts.CoreV4.connect(n.ethConfiguration.coreContractAddress,t).withdraw.populateTransaction(await t.getAddress(),r);return t.sendTransaction(i)}async function ae({ethSigner:t,starkSigner:e,starkPublicKey:r,token:n,config:a}){await g(t,a.immutableXConfig);let{v3Balance:i,v4Balance:s}=await v(t,r,await t.getAddress(),{type:ne,tokenAddress:n.tokenAddress},a.immutableXConfig),o=await l("asset",ne,a.immutableXConfig,{token_address:n.tokenAddress});if(i>0)return await R(r,t,a)?X(t,r,o.asset_type,a.immutableXConfig):W(t,e,r,o.asset_type,a.immutableXConfig);if(s>0)return D(t,r,o.asset_type,a.immutableXConfig);throw new Error("No balance to withdraw")}var T="ERC721";function oe(t){let{id:e}=t.data,r=t.data.blueprint||"";return I.sanitizeHex(I.utf8ToHex(`{${e}}:{${r}}`))}async function je(t,e,r,n){let a=await t.getAddress(),i=await e.getAddress(),s=await l("asset",T,n,{token_id:r.tokenId,token_address:r.tokenAddress}),o=await signRegisterEthAddress(e,a,i),u=await Contracts.RegistrationV4.connect(n.ethConfiguration.registrationV4ContractAddress||n.ethConfiguration.registrationContractAddress,t).registerAndWithdrawNft.populateTransaction(a,i,o,s.asset_type,r.tokenId);return t.sendTransaction(u)}async function Je(t,e,r,n){let a=await t.getAddress(),i=await e.getAddress(),s=await l("mintable-asset",T,n,{id:r.data.id,token_address:r.data.tokenAddress,...r.data.blueprint&&{blueprint:r.data.blueprint}}),o=oe(r),d=await signRegisterEthAddress(e,a,i),m=await Contracts.RegistrationV4.connect(n.ethConfiguration.registrationV4ContractAddress||n.ethConfiguration.registrationContractAddress,t).registerWithdrawAndMint.populateTransaction(a,i,d,s.asset_type,o);return t.sendTransaction(m)}async function Ze(t,e,r,n,a){return t.getMintableTokenDetailsByClientTokenId({tokenAddress:n.tokenAddress,tokenId:n.tokenId}).then(i=>Je(e,r,{type:T,data:{id:n.tokenId,tokenAddress:n.tokenAddress,blueprint:i.data.blueprint}},a)).catch(i=>{if(i.response?.status===404)return je(e,r,n,a);throw i})}async function et(t,e,r,n){let a=await l("mintable-asset",T,n,{id:r.data.id,token_address:r.data.tokenAddress,...r.data.blueprint&&{blueprint:r.data.blueprint}}),i=oe(r),o=await Contracts.CoreV4.connect(n.ethConfiguration.coreContractAddress,t).withdrawAndMint.populateTransaction(e,a.asset_type,i);return t.sendTransaction(o)}async function tt(t,e,r,n){let a=await l("asset",T,n,{token_id:r.tokenId,token_address:r.tokenAddress}),s=await Contracts.CoreV4.connect(n.ethConfiguration.coreContractAddress,t).withdrawNft.populateTransaction(e,a.asset_type,r.tokenId);return t.sendTransaction(s)}async function ie(t,e,r,n,a){return t.getMintableTokenDetailsByClientTokenId({tokenAddress:n.tokenAddress,tokenId:n.tokenId}).then(i=>et(e,r,{type:T,data:{id:n.tokenId,tokenAddress:n.tokenAddress,blueprint:i.data.blueprint}},a)).catch(i=>{if(i.response?.status===404)return tt(e,r,n,a);throw i})}async function de({ethSigner:t,starkSigner:e,starkPublicKey:r,token:n,config:a},i){await g(t,a.immutableXConfig);let s=await t.getAddress(),{v3Balance:o,v4Balance:d}=await re(t,r,s,{type:T,tokenAddress:n.tokenAddress,tokenId:n.tokenId},a.immutableXConfig,i);if(o>0)return await R(r,t,a)?ie(i,t,r,n,a.immutableXConfig):Ze(i,t,e,n,a.immutableXConfig);if(d>0)return ie(i,t,s,n,a.immutableXConfig);throw new Error("No balance to withdraw")}var ce="ETH";async function me({ethSigner:t,starkSigner:e,starkPublicKey:r,config:n}){await g(t,n.immutableXConfig);let{v3Balance:a,v4Balance:i}=await v(t,r,await t.getAddress(),{type:ce},n.immutableXConfig),s=await l("asset",ce,n.immutableXConfig);if(a>0)return await R(r,t,n)?X(t,r,s.asset_type,n.immutableXConfig):W(t,e,r,s.asset_type,n.immutableXConfig);if(i>0)return D(t,r,s.asset_type,n.immutableXConfig);throw new Error("No balance to withdraw")}async function ge({signers:t,withdrawal:e,config:r}){let n=new imx.WithdrawalsApi(r.immutableXConfig.apiConfiguration);return ee({signers:t,config:r.immutableXConfig,...e},n)}async function pe({signers:{ethSigner:t,starkSigner:e},starkPublicKey:r,token:n,config:a}){let i=new imx.MintsApi(a.immutableXConfig.apiConfiguration);switch(n.type){case"ETH":return me({ethSigner:t,starkSigner:e,starkPublicKey:r,config:a});case"ERC20":return ae({ethSigner:t,starkSigner:e,starkPublicKey:r,token:n,config:a});case"ERC721":return de({ethSigner:t,starkSigner:e,starkPublicKey:r,token:n,config:a},i)}}async function le({signers:{ethSigner:t,starkSigner:e},request:r,config:n}){await g(t,n.immutableXConfig);let a=await t.getAddress(),i=new imx.TradesApi(n.immutableXConfig.apiConfiguration),s=await i.getSignableTrade({getSignableTradeRequest:{user:a,order_id:r.order_id,fees:r.fees}}),{signable_message:o,payload_hash:d}=s.data,u=await signRaw(o,t),m=await e.signMessage(d);return (await i.createTradeV3({createTradeRequest:{amount_buy:s.data.amount_buy,amount_sell:s.data.amount_sell,asset_id_buy:s.data.asset_id_buy,asset_id_sell:s.data.asset_id_sell,expiration_timestamp:s.data.expiration_timestamp,fee_info:s.data.fee_info,fees:r.fees,include_fees:!0,nonce:s.data.nonce,order_id:r.order_id,stark_key:s.data.stark_key,vault_id_buy:s.data.vault_id_buy,vault_id_sell:s.data.vault_id_sell,stark_signature:m},xImxEthAddress:a,xImxEthSignature:u})).data}async function st(t,e,r,n,a,i){let o=await Contracts.CoreV4.connect(i.ethConfiguration.coreContractAddress,t)["deposit(uint256,uint256,uint256)"].populateTransaction(n,r,a);return t.sendTransaction({...o,value:e})}async function Ce({signers:{ethSigner:t},deposit:e,config:r}){await g(t,r.immutableXConfig);let n=await t.getAddress(),a={decimals:18},i=parseUnits(e.amount,"wei"),s=r.immutableXConfig,o=new imx.DepositsApi(s.apiConfiguration),d=new imx.EncodingApi(s.apiConfiguration),u={user:n,token:{type:e.type,data:a},amount:i.toString()},m=await o.getSignableDeposit({getSignableDepositRequest:u}),p=(await d.encodeAsset({assetType:"asset",encodeAssetRequest:{token:{type:e.type}}})).data.asset_type,c=m.data.stark_key,E=m.data.vault_id;return st(t,i,p,c,E,s)}async function dt(t,e,r,n,a,i){let o=await Contracts.CoreV4.connect(i.coreContractAddress,t).depositERC20.populateTransaction(n,r,a,e);return t.sendTransaction(o)}async function Re({signers:{ethSigner:t},deposit:e,config:r}){await g(t,r.immutableXConfig);let{apiConfiguration:n,ethConfiguration:a}=r.immutableXConfig,i=await t.getAddress(),s=new imx.TokensApi(n),o=new imx.DepositsApi(n),d=new imx.EncodingApi(n),u=await s.getToken({address:e.tokenAddress}),f={decimals:parseInt(u.data.decimals),token_address:e.tokenAddress},p=parseUnits(e.amount,0),E=await Contracts.IERC20.connect(e.tokenAddress,t).approve.populateTransaction(a.coreContractAddress,p);await t.sendTransaction(E);let w={user:i,token:{type:e.type,data:f},amount:p.toString()},h=await o.getSignableDeposit({getSignableDepositRequest:w}),Me=(await d.encodeAsset({assetType:"asset",encodeAssetRequest:{token:{type:e.type,data:{token_address:e.tokenAddress}}}})).data.asset_type,We=h.data.stark_key,Xe=h.data.vault_id,De=BigInt(h.data.amount);return dt(t,De,Me,We,Xe,a)}async function ct(t,e,r,n,a,i){let o=await Contracts.CoreV4.connect(i.ethConfiguration.coreContractAddress,t).depositNft.populateTransaction(n,r,a,e);return t.sendTransaction(o)}async function Te({signers:{ethSigner:t},deposit:e,config:r}){await g(t,r.immutableXConfig);let n=await t.getAddress(),{immutableXConfig:a}=r,i=new imx.DepositsApi(a.apiConfiguration),s=new imx.EncodingApi(a.apiConfiguration),o={token_address:e.tokenAddress,token_id:e.tokenId},u={user:n,token:{type:e.type,data:o},amount:"1".toString()},m=await i.getSignableDeposit({getSignableDepositRequest:u}),p=(await s.encodeAsset({assetType:"asset",encodeAssetRequest:{token:{type:e.type,data:{token_address:e.tokenAddress,token_id:e.tokenId}}}})).data.asset_type,c=m.data.stark_key,E=m.data.vault_id,w=Contracts.IERC721.connect(e.tokenAddress,t),h=a.ethConfiguration.coreContractAddress;return await w.isApprovedForAll(n,h)||await w.setApprovalForAll(h,!0),ct(t,e.tokenId,p,c,E,a)}async function he({signers:t,deposit:e,config:r}){switch(e.type){case"ETH":return Ce({signers:t,deposit:e,config:r});case"ERC20":return Re({signers:t,deposit:e,config:r});case"ERC721":return Te({signers:t,deposit:e,config:r})}}async function Ae({signers:t,request:e,config:r}){await g(t.ethSigner,r.immutableXConfig);let n=new imx.ExchangesApi(r.immutableXConfig.apiConfiguration),a=await t.ethSigner.getAddress(),i=e.amount,s=await n.getExchangeSignableTransfer({id:e.transactionID,getSignableTransferRequest:{sender:a,token:convertToSignableToken(e),amount:i,receiver:e.receiver}}),{signable_message:o,payload_hash:d}=s.data,u=await signRaw(o,t.ethSigner),m=await t.starkSigner.signMessage(d),f={sender_stark_key:s.data.sender_stark_key,sender_vault_id:s.data.sender_vault_id,receiver_stark_key:s.data.receiver_stark_key,receiver_vault_id:s.data.receiver_vault_id,asset_id:s.data.asset_id,amount:s.data.amount,nonce:s.data.nonce,expiration_timestamp:s.data.expiration_timestamp,stark_signature:m},p=await n.createExchangeTransfer({id:e.transactionID,createTransferRequest:f,xImxEthAddress:a,xImxEthSignature:u});return {sent_signature:p?.data.sent_signature,status:p?.data.status?.toString(),time:p?.data.time,transfer_id:p?.data.transfer_id}}var S=class{config;signers;constructor(e,r,n){this.config=e,this.signers={ethSigner:r,starkSigner:n};}async getAddress(){return this.signers.ethSigner.getAddress()}async isRegisteredOffchain(){let e=await this.getAddress();return Z(e,this.config)}registerOffchain(){return J(this.signers,this.config)}batchNftTransfer(e){return F({signers:this.signers,request:e,config:this.config})}cancelOrder(e){return K({signers:this.signers,request:e,config:this.config})}completeWithdrawal(e,r){return pe({config:this.config,signers:this.signers,token:r,starkPublicKey:e})}createOrder(e){return z({signers:this.signers,request:e,config:this.config})}createTrade(e){return le({signers:this.signers,request:e,config:this.config})}deposit(e){return he({signers:this.signers,deposit:e,config:this.config})}exchangeTransfer(e){return Ae({signers:this.signers,request:e,config:this.config})}async isRegisteredOnchain(){let e=await this.signers.starkSigner.getAddress();return R(e,this.signers.ethSigner,this.config)}prepareWithdrawal(e){return ge({signers:this.signers,withdrawal:e,config:this.config})}transfer(e){return H({signers:this.signers,request:e,config:this.config})}};var be={SWITCH_CHAIN:"wallet_switchEthereumChain",CONNECT:"eth_requestAccounts"};function ye(t){return !!t?.request}async function Se(t,e){await t.request({method:be.CONNECT}),e&&await t.request({method:be.SWITCH_CHAIN,params:[{chainId:`0x${e.toString(16)}`}]});}var ft={PROVIDER_NOT_FOUND:"The Metamask provider was not found"};async function ke({chainID:t}){let e=await pt();if(!ye(e))throw new Error(ft.PROVIDER_NOT_FOUND);return await Se(e,t),new BrowserProvider(e)}var C="message";function A(t,e){t&&t.contentWindow&&t.contentWindow.postMessage(e,new URL(t.src).origin);}function b(t,e,r,n){if(t&&e.source!==t.contentWindow)return;let a=e.data;a.type===r&&n(a.details);}var O=class{publicAddress;iframe;constructor(e,r){this.publicAddress=e,this.iframe=r;}getAddress(){return this.publicAddress}signMessage(e){return new Promise((r,n)=>{let a=i=>{b(this.iframe,i,"SIGN_MESSAGE_RESPONSE",s=>{window.removeEventListener(C,a),s.success||n(new Error(s.error?.message)),r(s.data.signedMessage);});};window.addEventListener(C,a),A(this.iframe,{type:"SIGN_MESSAGE_REQUEST",details:{starkPublicKey:this.publicAddress,message:e}});})}getIFrame(){return this.iframe}getYCoordinate(){return new Promise((e,r)=>{let n=a=>{b(this.iframe,a,"GET_Y_COORDINATE_RESPONSE",i=>{window.removeEventListener(C,n),i.success||r(new Error(i.error?.message)),e(i.data.yCoordinate);});};window.addEventListener(C,n),A(this.iframe,{type:"GET_Y_COORDINATE_REQUEST",details:{starkPublicKey:this.publicAddress}});})}};var ve="imx-wallet-app",Rt={[Environment.SANDBOX]:"https://wallets.sandbox.immutable.com",[Environment.PRODUCTION]:"https://wallets.immutable.com"},wt="display: none;";function _t(){return document.querySelector(`iframe#${ve}`)}async function Tt(t){return new Promise(e=>{let r=document.createElement("iframe");r.setAttribute("id",ve),r.setAttribute("src",Rt[t]),r.setAttribute("style",wt),document.body.appendChild(r),r.onload=()=>e(r);})}async function xe(t){let e=_t();return e||await Tt(t)}var ht="Only sign this request if you\u2019ve initiated an action with Immutable X.",At="The L2 IMX Wallet connection has failed";async function Ie(t,e){let r=await t.getSigner(),n=await r.getAddress(),a=await r.signMessage(ht),i=await xe(e);return new Promise((s,o)=>{let d=u=>{b(i,u,"CONNECT_WALLET_RESPONSE",m=>{window.removeEventListener(C,d),m.success||o(new Error(At)),s(new O(m.data.starkPublicKey,i));});};window.addEventListener(C,d),A(i,{type:"CONNECT_WALLET_REQUEST",details:{ethAddress:n,signature:a}});})}async function Oe(t){let e=t.getIFrame();return new Promise((r,n)=>{let a=i=>{b(e,i,"DISCONNECT_WALLET_RESPONSE",s=>{window.removeEventListener(C,a),!s.success&&s.error&&n(s.error),e.remove(),r();});};window.addEventListener(C,a),A(e,{type:"DISCONNECT_WALLET_REQUEST",details:{starkPublicKey:t.getAddress()}});})}var y=class extends Error{type;constructor(e,r){super(e),this.type=r;}},N=async(t,e)=>{try{return await t()}catch(r){let n=e.message||`${r.message}`||"UnknownError";throw new y(n,e.type)}};var L=class t extends S{static imxSigner;static async connect(e){return await N(async()=>{let r=await ke({chainID:e.immutableXConfig.ethConfiguration.chainID});return this.imxSigner=await Ie(r,e.baseConfig.environment),new t(e,await r.getSigner(),this.imxSigner)},{type:"WALLET_CONNECTION_ERROR"})}static async disconnect(){if(!this.imxSigner)throw new y("Attempted to disconnect from the MetaMask IMX provider without an established connection","PROVIDER_CONNECTION_ERROR");return N(async()=>{await Oe(this.imxSigner);},{type:"PROVIDER_CONNECTION_ERROR"})}static async signMessage(e){if(!this.imxSigner)throw new y("Attempted to sign a message with the MetaMask IMX provider without an established connection","PROVIDER_CONNECTION_ERROR");return N(async()=>await this.imxSigner.signMessage(e),{type:"PROVIDER_CONNECTION_ERROR"})}};var U=class{immutableXConfig;baseConfig;constructor({baseConfig:e,overrides:r}){if(this.baseConfig=e,r)this.immutableXConfig=r.immutableXConfig;else {let n=new ImxConfiguration({baseConfig:e});this.immutableXConfig=n.immutableXConfig;}}};
2
+ export{S as GenericIMXProvider,L as MetaMaskIMXProvider,U as ProviderConfiguration};
@@ -0,0 +1,13 @@
1
+ import { ImmutableXConfiguration } from '@imtbl/x-client';
2
+ import { ImmutableConfiguration, ModuleConfiguration } from '@imtbl/config';
3
+ interface ProviderOverrides {
4
+ immutableXConfig: ImmutableXConfiguration;
5
+ }
6
+ interface ProviderModuleConfiguration extends ModuleConfiguration<ProviderOverrides> {
7
+ }
8
+ export declare class ProviderConfiguration {
9
+ readonly immutableXConfig: ImmutableXConfiguration;
10
+ readonly baseConfig: ImmutableConfiguration;
11
+ constructor({ baseConfig, overrides }: ProviderModuleConfiguration);
12
+ }
13
+ export {};
@@ -0,0 +1,14 @@
1
+ export declare enum ProviderErrorType {
2
+ PROVIDER_CONNECTION_ERROR = "PROVIDER_CONNECTION_ERROR",
3
+ WALLET_CONNECTION_ERROR = "WALLET_CONNECTION_ERROR"
4
+ }
5
+ type ErrorType = {
6
+ type: ProviderErrorType;
7
+ message?: string;
8
+ };
9
+ export declare class ProviderError extends Error {
10
+ type: ProviderErrorType;
11
+ constructor(message: string, type: ProviderErrorType);
12
+ }
13
+ export declare const withProviderError: <T>(fn: () => Promise<T>, customError: ErrorType) => Promise<T>;
14
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,23 @@
1
+ import { imx } from '@imtbl/generated-clients';
2
+ import { AnyToken, EthSigner, UnsignedOrderRequest, UnsignedExchangeTransferRequest, GetSignableCancelOrderRequest, GetSignableTradeRequest, CreateTradeResponse, NftTransferDetails, StarkSigner, TokenAmount, UnsignedTransferRequest } from '@imtbl/x-client';
3
+ import { TransactionResponse } from 'ethers';
4
+ import { ProviderConfiguration } from './config';
5
+ import { IMXProvider } from './imxProvider';
6
+ export declare class GenericIMXProvider implements IMXProvider {
7
+ private readonly config;
8
+ private readonly signers;
9
+ constructor(config: ProviderConfiguration, ethSigner: EthSigner, starkSigner: StarkSigner);
10
+ getAddress(): Promise<string>;
11
+ isRegisteredOffchain(): Promise<boolean>;
12
+ registerOffchain(): Promise<imx.RegisterUserResponse>;
13
+ batchNftTransfer(request: Array<NftTransferDetails>): Promise<imx.CreateTransferResponse>;
14
+ cancelOrder(request: GetSignableCancelOrderRequest): Promise<imx.CancelOrderResponse>;
15
+ completeWithdrawal(starkPublicKey: string, token: AnyToken): Promise<TransactionResponse>;
16
+ createOrder(request: UnsignedOrderRequest): Promise<imx.CreateOrderResponse>;
17
+ createTrade(request: GetSignableTradeRequest): Promise<CreateTradeResponse>;
18
+ deposit(tokenAmount: TokenAmount): Promise<TransactionResponse>;
19
+ exchangeTransfer(request: UnsignedExchangeTransferRequest): Promise<imx.CreateTransferResponseV1>;
20
+ isRegisteredOnchain(): Promise<boolean>;
21
+ prepareWithdrawal(request: TokenAmount): Promise<imx.CreateWithdrawalResponse>;
22
+ transfer(request: UnsignedTransferRequest): Promise<imx.CreateTransferResponseV1>;
23
+ }
@@ -0,0 +1,10 @@
1
+ import { StarkSigner } from '@imtbl/x-client';
2
+ export declare class ImxSigner implements StarkSigner {
3
+ private publicAddress;
4
+ private iframe;
5
+ constructor(publicAddress: string, iframe: HTMLIFrameElement);
6
+ getAddress(): string;
7
+ signMessage(rawMessage: string): Promise<string>;
8
+ getIFrame(): HTMLIFrameElement;
9
+ getYCoordinate(): Promise<string>;
10
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,15 @@
1
+ export declare const COMMUNICATION_TYPE = "message";
2
+ export declare enum RequestEventType {
3
+ GET_CONNECTION_REQUEST = "GET_CONNECTION_REQUEST",
4
+ CONNECT_WALLET_REQUEST = "CONNECT_WALLET_REQUEST",
5
+ SIGN_MESSAGE_REQUEST = "SIGN_MESSAGE_REQUEST",
6
+ DISCONNECT_WALLET_REQUEST = "DISCONNECT_WALLET_REQUEST",
7
+ GET_Y_COORDINATE_REQUEST = "GET_Y_COORDINATE_REQUEST"
8
+ }
9
+ export declare enum ResponseEventType {
10
+ CONNECT_WALLET_RESPONSE = "CONNECT_WALLET_RESPONSE",
11
+ SIGN_MESSAGE_RESPONSE = "SIGN_MESSAGE_RESPONSE",
12
+ GET_CONNECTION_RESPONSE = "GET_CONNECTION_RESPONSE",
13
+ DISCONNECT_WALLET_RESPONSE = "DISCONNECT_WALLET_RESPONSE",
14
+ GET_Y_COORDINATE_RESPONSE = "GET_Y_COORDINATE_RESPONSE"
15
+ }
@@ -0,0 +1,5 @@
1
+ import { Environment } from '@imtbl/config';
2
+ import { BrowserProvider } from 'ethers';
3
+ import { ImxSigner } from './ImxSigner';
4
+ export declare function connect(l1Provider: BrowserProvider, env: Environment): Promise<ImxSigner>;
5
+ export declare function disconnect(imxSigner: ImxSigner): Promise<void>;
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,10 @@
1
+ import { Environment } from '@imtbl/config';
2
+ export declare const IMX_WALLET_IFRAME_ID = "imx-wallet-app";
3
+ export declare const IMX_WALLET_IFRAME_HOSTS: {
4
+ sandbox: string;
5
+ production: string;
6
+ };
7
+ export declare const IMX_WALLET_IFRAME_STYLE = "display: none;";
8
+ export declare function getIFrame(): HTMLIFrameElement | null;
9
+ export declare function setupIFrame(env: Environment): Promise<HTMLIFrameElement>;
10
+ export declare function getOrSetupIFrame(env: Environment): Promise<HTMLIFrameElement>;
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,6 @@
1
+ export * from './imxWallet';
2
+ export * from './imxWalletIFrame';
3
+ export * from './types';
4
+ export * from './events';
5
+ export * from './postRequestMessage';
6
+ export * from './messageResponseListener';
@@ -0,0 +1,12 @@
1
+ import { Error as ErrorDetails } from './types';
2
+ import { ResponseEventType } from './events';
3
+ export type ResponseMessageDetails<T> = {
4
+ success: boolean;
5
+ data: T;
6
+ error?: ErrorDetails;
7
+ };
8
+ export type ResponseMessage<T> = {
9
+ type: ResponseEventType;
10
+ details: ResponseMessageDetails<T>;
11
+ };
12
+ export declare function messageResponseListener<T>(iframe: HTMLIFrameElement, event: MessageEvent, eventType: ResponseEventType, callback: (response: ResponseMessageDetails<T>) => void): void;
@@ -0,0 +1,6 @@
1
+ import { RequestEventType } from './events';
2
+ export type RequestMessage<T> = {
3
+ type: RequestEventType;
4
+ details?: T;
5
+ };
6
+ export declare function postRequestMessage<T>(iframe: HTMLIFrameElement, payload: RequestMessage<T>): void;
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,3 @@
1
+ export declare const htmlBodyInit: () => void;
2
+ export declare function triggerIFrameOnLoad(): void;
3
+ export declare function asyncTriggerIFrameOnLoad<T>(promise: Promise<T>): Promise<T>;
@@ -0,0 +1,32 @@
1
+ export type ConnectRequest = {
2
+ ethAddress: string;
3
+ signature: string;
4
+ };
5
+ export type ConnectResponse = {
6
+ starkPublicKey: string;
7
+ };
8
+ export type SignMessageRequest = {
9
+ starkPublicKey: string;
10
+ message: string;
11
+ };
12
+ export type SignMessageResponse = {
13
+ signedMessage: string;
14
+ };
15
+ export type GetYCoordinateMessageRequest = {
16
+ starkPublicKey: string;
17
+ };
18
+ export type GetYCoordinateMessageResponse = {
19
+ yCoordinate: string;
20
+ };
21
+ export type DisconnectRequest = {
22
+ starkPublicKey: string;
23
+ };
24
+ export type DisconnectResponse = object;
25
+ export declare enum ErrorCode {
26
+ CANNOT_RETRIEVE_STARK_KEY_PAIR = 100,
27
+ GENERIC_ERROR = 500
28
+ }
29
+ export type Error = {
30
+ code: ErrorCode;
31
+ message: string;
32
+ };
@@ -0,0 +1,93 @@
1
+ import { imx } from '@imtbl/generated-clients';
2
+ import { AnyToken, UnsignedOrderRequest, UnsignedExchangeTransferRequest, GetSignableCancelOrderRequest, GetSignableTradeRequest, CreateTradeResponse, NftTransferDetails, TokenAmount, UnsignedTransferRequest } from '@imtbl/x-client';
3
+ import { TransactionResponse } from 'ethers';
4
+ export interface IMXProvider {
5
+ /**
6
+ * Get the Signer address
7
+ *
8
+ * @return {Promise<string>} Returns a promise that resolves with the signer's address
9
+ */
10
+ getAddress(): Promise<string>;
11
+ /**
12
+ * Register a User to Immutable X if they are not already registered
13
+ *
14
+ * @return {Promise<imx.RegisterUserResponse>} Returns a promise that resolves with the user registration response
15
+ */
16
+ registerOffchain(): Promise<imx.RegisterUserResponse>;
17
+ /**
18
+ * Checks if a User is registered off-chain
19
+ *
20
+ * @return {Promise<boolean>} Returns a promise that resolves with true if the User is registered with IMX, false otherwise
21
+ */
22
+ isRegisteredOffchain(): Promise<boolean>;
23
+ /**
24
+ * Checks if a User is registered on-chain
25
+ *
26
+ * @return {Promise<boolean>} Returns a promise that resolves with true if the User is registered, false otherwise
27
+ */
28
+ isRegisteredOnchain(): Promise<boolean>;
29
+ /**
30
+ * Create an Order
31
+ *
32
+ * @param {UnsignedOrderRequest} request The unsigned order request to create an order
33
+ * @return {Promise<CreateOrderResponse>} Returns a promise that resolves with the created Order
34
+ */
35
+ createOrder(request: UnsignedOrderRequest): Promise<imx.CreateOrderResponse>;
36
+ /**
37
+ * Cancel an Order
38
+ *
39
+ * @param {GetSignableCancelOrderRequest} request The signable cancel order request
40
+ * @return {Promise<CancelOrderResponse>} Returns a promise that resolves with the cancelled Order
41
+ */
42
+ cancelOrder(request: GetSignableCancelOrderRequest): Promise<imx.CancelOrderResponse>;
43
+ /**
44
+ * Create a Trade
45
+ *
46
+ * @param {GetSignableTradeRequest} request The signable trade request
47
+ * @return {Promise<CreateTradeResponse>} Returns a promise that resolves with the created Trade
48
+ */
49
+ createTrade(request: GetSignableTradeRequest): Promise<CreateTradeResponse>;
50
+ /**
51
+ * Create a new Transfer request
52
+ *
53
+ * @param {UnsignedTransferRequest} request The unsigned transfer request
54
+ * @return {Promise<imx.CreateTransferResponseV1>} Returns a promise that resolves with the created Transfer
55
+ */
56
+ transfer(request: UnsignedTransferRequest): Promise<imx.CreateTransferResponseV1>;
57
+ /**
58
+ * Create a batch of NFT transfer requests
59
+ *
60
+ * @param {Array<NftTransferDetails>} request An array of NFT transfer details
61
+ * @return {Promise<CreateTransferResponse>} Resolves a promise that resolves with the list of Transfer IDs
62
+ */
63
+ batchNftTransfer(request: Array<NftTransferDetails>): Promise<imx.CreateTransferResponse>;
64
+ /**
65
+ * Create a new Exchange transaction
66
+ *
67
+ * @param {UnsignedExchangeTransferRequest} request The unsigned exchange transfer request
68
+ * @return {Promise<imx.CreateTransferResponseV1>} Returns a promise that resolves with the created Exchange Transaction
69
+ */
70
+ exchangeTransfer(request: UnsignedExchangeTransferRequest): Promise<imx.CreateTransferResponseV1>;
71
+ /**
72
+ * Deposit either ETH, ERC20 or ERC721 tokens
73
+ *
74
+ * @param {TokenAmount} request The token type amount in its corresponding unit
75
+ * @return {Promise<TransactionResponse>} Returns a promise that resolves with the transaction
76
+ */
77
+ deposit(deposit: TokenAmount): Promise<TransactionResponse>;
78
+ /**
79
+ * Create a Withdrawal
80
+ *
81
+ * @param {TokenAmount} request The token type amount in its corresponding unit
82
+ * @return {Promise<CreateWithdrawalResponse>} Returns a promise that resolves with the created Withdrawal
83
+ */
84
+ prepareWithdrawal(request: TokenAmount): Promise<imx.CreateWithdrawalResponse>;
85
+ /**
86
+ * Completes a Withdrawal
87
+ *
88
+ * @param {string} starkPublicKey The stark public key
89
+ * @param {AnyToken} token The token to withdraw
90
+ * @return {Promise<TransactionResponse>} Returns a promise that resolves with the transaction
91
+ */
92
+ completeWithdrawal(starkPublicKey: string, token: AnyToken): Promise<TransactionResponse>;
93
+ }
@@ -0,0 +1,4 @@
1
+ export type { IMXProvider } from './imxProvider';
2
+ export { GenericIMXProvider } from './genericImxProvider';
3
+ export { MetaMaskIMXProvider } from './l1-providers/metaMaskWrapper';
4
+ export { ProviderConfiguration } from './config';
@@ -0,0 +1,2 @@
1
+ export * as metamask from './metaMask';
2
+ export * from './types';
@@ -0,0 +1,3 @@
1
+ import { BrowserProvider } from 'ethers';
2
+ import { MetamaskConnectParams } from './types';
3
+ export declare function connect({ chainID, }: MetamaskConnectParams): Promise<BrowserProvider>;
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,8 @@
1
+ import { ProviderConfiguration } from '../config';
2
+ import { GenericIMXProvider } from '../genericImxProvider';
3
+ export declare class MetaMaskIMXProvider extends GenericIMXProvider {
4
+ private static imxSigner;
5
+ static connect(config: ProviderConfiguration): Promise<MetaMaskIMXProvider>;
6
+ static disconnect(): Promise<void>;
7
+ static signMessage(message: string): Promise<string>;
8
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,12 @@
1
+ import { Eip1193Provider } from 'ethers';
2
+ export declare const WALLET_ACTION: {
3
+ SWITCH_CHAIN: string;
4
+ CONNECT: string;
5
+ };
6
+ type ExternalProvider = Eip1193Provider;
7
+ type RequestableProvider = ExternalProvider & {
8
+ request: NonNullable<ExternalProvider['request']>;
9
+ };
10
+ export declare function isRequestableProvider(provider: ExternalProvider): provider is RequestableProvider;
11
+ export declare function connectProvider(provider: RequestableProvider, chainID: number | undefined): Promise<void>;
12
+ export {};
@@ -0,0 +1,3 @@
1
+ export type MetamaskConnectParams = {
2
+ chainID?: number;
3
+ };
@@ -0,0 +1,11 @@
1
+ import { ERC20Amount } from '@imtbl/x-client';
2
+ import { TransactionResponse } from 'ethers';
3
+ import { Signers } from '../types';
4
+ import { ProviderConfiguration } from '../../config';
5
+ type DepositERC20Params = {
6
+ signers: Signers;
7
+ deposit: ERC20Amount;
8
+ config: ProviderConfiguration;
9
+ };
10
+ export declare function depositERC20({ signers: { ethSigner }, deposit, config, }: DepositERC20Params): Promise<TransactionResponse>;
11
+ export {};
@@ -0,0 +1,11 @@
1
+ import { ERC721Token } from '@imtbl/x-client';
2
+ import { TransactionResponse } from 'ethers';
3
+ import { Signers } from '../types';
4
+ import { ProviderConfiguration } from '../../config';
5
+ type DepositERC721Params = {
6
+ signers: Signers;
7
+ deposit: ERC721Token;
8
+ config: ProviderConfiguration;
9
+ };
10
+ export declare function depositERC721({ signers: { ethSigner }, deposit, config, }: DepositERC721Params): Promise<TransactionResponse>;
11
+ export {};
@@ -0,0 +1,11 @@
1
+ import { ETHAmount } from '@imtbl/x-client';
2
+ import { TransactionResponse } from 'ethers';
3
+ import { Signers } from '../types';
4
+ import { ProviderConfiguration } from '../../config';
5
+ type DepositEthParams = {
6
+ signers: Signers;
7
+ deposit: ETHAmount;
8
+ config: ProviderConfiguration;
9
+ };
10
+ export declare function depositEth({ signers: { ethSigner }, deposit, config, }: DepositEthParams): Promise<TransactionResponse>;
11
+ export {};
@@ -0,0 +1,3 @@
1
+ export * from './depositEth';
2
+ export * from './depositERC20';
3
+ export * from './depositERC721';
@@ -0,0 +1,10 @@
1
+ import { TokenAmount } from '@imtbl/x-client';
2
+ import { Signers } from './types';
3
+ import { ProviderConfiguration } from '../config';
4
+ type DepositParams = {
5
+ signers: Signers;
6
+ deposit: TokenAmount;
7
+ config: ProviderConfiguration;
8
+ };
9
+ export declare function deposit({ signers, deposit, config }: DepositParams): Promise<import("ethers").TransactionResponse>;
10
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,3 @@
1
+ export declare enum Errors {
2
+ STARK_CURVE_INVALID_MESSAGE_LENGTH = "invalid message length"
3
+ }
@@ -0,0 +1,11 @@
1
+ import { UnsignedExchangeTransferRequest } from '@imtbl/x-client';
2
+ import { imx } from '@imtbl/generated-clients';
3
+ import { Signers } from './types';
4
+ import { ProviderConfiguration } from '../config';
5
+ type TransfersWorkflowParams = {
6
+ signers: Signers;
7
+ request: UnsignedExchangeTransferRequest;
8
+ config: ProviderConfiguration;
9
+ };
10
+ export declare function exchangeTransfer({ signers, request, config, }: TransfersWorkflowParams): Promise<imx.CreateTransferResponseV1>;
11
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,2 @@
1
+ import { EthSigner, ImmutableXConfiguration } from '@imtbl/x-client';
2
+ export declare function validateChain(signer: EthSigner, config: ImmutableXConfiguration): Promise<void>;
@@ -0,0 +1,17 @@
1
+ import { UnsignedOrderRequest, GetSignableCancelOrderRequest } from '@imtbl/x-client';
2
+ import { imx } from '@imtbl/generated-clients';
3
+ import { Signers } from './types';
4
+ import { ProviderConfiguration } from '../config';
5
+ type CreateOrderWorkflowParams = {
6
+ signers: Signers;
7
+ request: UnsignedOrderRequest;
8
+ config: ProviderConfiguration;
9
+ };
10
+ type CancelOrderWorkflowParams = {
11
+ signers: Signers;
12
+ request: GetSignableCancelOrderRequest;
13
+ config: ProviderConfiguration;
14
+ };
15
+ export declare function createOrder({ signers, request, config, }: CreateOrderWorkflowParams): Promise<imx.CreateOrderResponse>;
16
+ export declare function cancelOrder({ signers, request, config, }: CancelOrderWorkflowParams): Promise<imx.CancelOrderResponse>;
17
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,8 @@
1
+ import { imx } from '@imtbl/generated-clients';
2
+ import { EthSigner } from '@imtbl/x-client';
3
+ import { Signers } from './types';
4
+ import { ProviderConfiguration } from '../config';
5
+ export declare function registerOffchain(signers: Signers, config: ProviderConfiguration): Promise<imx.RegisterUserResponse>;
6
+ export declare function isRegisteredOffchain(ethAddress: string, config: ProviderConfiguration): Promise<boolean>;
7
+ export declare function isRegisteredOnChain(starkPublicKey: string, ethSigner: EthSigner, config: ProviderConfiguration): Promise<boolean>;
8
+ export declare function getSignableRegistrationOnchain(etherKey: string, starkPublicKey: string, usersApi: imx.UsersApi): Promise<imx.GetSignableRegistrationResponse>;
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,10 @@
1
+ import { GetSignableTradeRequest, CreateTradeResponse } from '@imtbl/x-client';
2
+ import { Signers } from './types';
3
+ import { ProviderConfiguration } from '../config';
4
+ type CreateTradeWorkflowParams = {
5
+ signers: Signers;
6
+ request: GetSignableTradeRequest;
7
+ config: ProviderConfiguration;
8
+ };
9
+ export declare function createTrade({ signers: { ethSigner, starkSigner }, request, config, }: CreateTradeWorkflowParams): Promise<CreateTradeResponse>;
10
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,17 @@
1
+ import { imx } from '@imtbl/generated-clients';
2
+ import { NftTransferDetails, UnsignedTransferRequest } from '@imtbl/x-client';
3
+ import { Signers } from './types';
4
+ import { ProviderConfiguration } from '../config';
5
+ type TransfersWorkflowParams = {
6
+ signers: Signers;
7
+ request: UnsignedTransferRequest;
8
+ config: ProviderConfiguration;
9
+ };
10
+ type BatchTransfersWorkflowParams = {
11
+ signers: Signers;
12
+ request: Array<NftTransferDetails>;
13
+ config: ProviderConfiguration;
14
+ };
15
+ export declare function transfer({ signers: { ethSigner, starkSigner }, request, config, }: TransfersWorkflowParams): Promise<imx.CreateTransferResponseV1>;
16
+ export declare function batchTransfer({ signers: { ethSigner, starkSigner }, request, config, }: BatchTransfersWorkflowParams): Promise<imx.CreateTransferResponse>;
17
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,5 @@
1
+ import { EthSigner, StarkSigner } from '@imtbl/x-client';
2
+ export type Signers = {
3
+ ethSigner: EthSigner;
4
+ starkSigner: StarkSigner;
5
+ };
@@ -0,0 +1,15 @@
1
+ import { ERC20Token, ImmutableXConfiguration, StarkSigner } from '@imtbl/x-client';
2
+ import { Signer, TransactionResponse } from 'ethers';
3
+ import { ProviderConfiguration } from '../../config';
4
+ type CompleteERC20WithdrawalWorkflowParams = {
5
+ ethSigner: Signer;
6
+ starkSigner: StarkSigner;
7
+ starkPublicKey: string;
8
+ token: ERC20Token;
9
+ config: ProviderConfiguration;
10
+ };
11
+ export declare function executeRegisterAndWithdrawAllFungible(ethSigner: Signer, starkSigner: StarkSigner, starkPublicKey: string, assetType: string, config: ImmutableXConfiguration): Promise<TransactionResponse>;
12
+ export declare function executeWithdrawAllFungible(ethSigner: Signer, starkPublicKey: string, assetType: string, config: ImmutableXConfiguration): Promise<TransactionResponse>;
13
+ export declare function executeWithdrawFungible(ethSigner: Signer, starkPublicKey: string, assetType: string, config: ImmutableXConfiguration): Promise<TransactionResponse>;
14
+ export declare function completeERC20WithdrawalAction({ ethSigner, starkSigner, starkPublicKey, token, config, }: CompleteERC20WithdrawalWorkflowParams): Promise<TransactionResponse>;
15
+ export {};
@@ -0,0 +1,12 @@
1
+ import { ERC721Token, MintsApi, StarkSigner } from '@imtbl/x-client';
2
+ import { Signer, TransactionResponse } from 'ethers';
3
+ import { ProviderConfiguration } from '../../config';
4
+ type CompleteERC721WithdrawalActionParams = {
5
+ ethSigner: Signer;
6
+ starkSigner: StarkSigner;
7
+ starkPublicKey: string;
8
+ token: ERC721Token;
9
+ config: ProviderConfiguration;
10
+ };
11
+ export declare function completeERC721WithdrawalAction({ ethSigner, starkSigner, starkPublicKey, token, config, }: CompleteERC721WithdrawalActionParams, mintsApi: MintsApi): Promise<TransactionResponse>;
12
+ export {};
@@ -0,0 +1,11 @@
1
+ import { StarkSigner } from '@imtbl/x-client';
2
+ import { Signer, TransactionResponse } from 'ethers';
3
+ import { ProviderConfiguration } from '../../config';
4
+ type CompleteEthWithdrawalActionParams = {
5
+ ethSigner: Signer;
6
+ starkSigner: StarkSigner;
7
+ starkPublicKey: string;
8
+ config: ProviderConfiguration;
9
+ };
10
+ export declare function completeEthWithdrawalAction({ ethSigner, starkSigner, starkPublicKey, config, }: CompleteEthWithdrawalActionParams): Promise<TransactionResponse>;
11
+ export {};
@@ -0,0 +1,3 @@
1
+ import { imx } from '@imtbl/generated-clients';
2
+ import { ImmutableXConfiguration } from '@imtbl/x-client';
3
+ export declare function getEncodeAssetInfo(assetType: string, tokenType: imx.EncodeAssetRequestTokenTypeEnum, config: ImmutableXConfiguration, tokenData?: imx.EncodeAssetTokenData): Promise<imx.EncodeAssetResponse>;
@@ -0,0 +1,11 @@
1
+ import { AnyToken, EncodingApi, ImmutableXConfiguration, MintsApi } from '@imtbl/x-client';
2
+ import { Signer } from 'ethers';
3
+ export declare function getWithdrawalBalanceWorkflow(signer: Signer, ownerKey: string, token: AnyToken, encodingApi: EncodingApi, mintsApi: MintsApi, config: ImmutableXConfiguration): Promise<bigint>;
4
+ export declare function getWithdrawalBalances(signer: Signer, starkPublicKey: string, ethAddress: string, token: AnyToken, config: ImmutableXConfiguration): Promise<{
5
+ v3Balance: bigint;
6
+ v4Balance: bigint;
7
+ }>;
8
+ export declare function getWithdrawalBalancesERC721(signer: Signer, starkPublicKey: string, ethAddress: string, token: AnyToken, config: ImmutableXConfiguration, mintsApi: MintsApi): Promise<{
9
+ v3Balance: bigint;
10
+ v4Balance: bigint;
11
+ }>;
@@ -0,0 +1,4 @@
1
+ export * from './prepareWithdrawal';
2
+ export * from './completeERC20Withdrawal';
3
+ export * from './completeERC721Withdrawal';
4
+ export * from './completeEthWithdrawal';
@@ -0,0 +1,8 @@
1
+ import { imx } from '@imtbl/generated-clients';
2
+ import { TokenAmount, ImmutableXConfiguration } from '@imtbl/x-client';
3
+ import { Signers } from '../types';
4
+ export type PrepareWithdrawalWorkflowParams = TokenAmount & {
5
+ signers: Signers;
6
+ config: ImmutableXConfiguration;
7
+ };
8
+ export declare function prepareWithdrawalAction(params: PrepareWithdrawalWorkflowParams, withdrawalsApi: imx.WithdrawalsApi): Promise<imx.CreateWithdrawalResponse>;
@@ -0,0 +1,18 @@
1
+ import { imx } from '@imtbl/generated-clients';
2
+ import { AnyToken, TokenAmount } from '@imtbl/x-client';
3
+ import { ProviderConfiguration } from '../config';
4
+ import { Signers } from './types';
5
+ type CompleteWithdrawalParams = {
6
+ signers: Signers;
7
+ starkPublicKey: string;
8
+ token: AnyToken;
9
+ config: ProviderConfiguration;
10
+ };
11
+ type PrepareWithdrawalParams = {
12
+ signers: Signers;
13
+ withdrawal: TokenAmount;
14
+ config: ProviderConfiguration;
15
+ };
16
+ export declare function prepareWithdrawal({ signers, withdrawal, config, }: PrepareWithdrawalParams): Promise<imx.CreateWithdrawalResponse>;
17
+ export declare function completeWithdrawal({ signers: { ethSigner, starkSigner }, starkPublicKey, token, config, }: CompleteWithdrawalParams): Promise<import("ethers").TransactionResponse>;
18
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,13 @@
1
+ import { Signers } from '../signable-actions/types';
2
+ import { ProviderConfiguration } from '../config';
3
+ export declare const privateKey1 = "d90915fa5bce418a23184c9asdfasfasdf5c8e900e3035cf34e2dd36";
4
+ export declare const privateKey2 = "013fe4a5265bc6deb3f3b524b987sdf987f8c7a8ec2a998ae0512f493d763c8f";
5
+ export declare const transactionResponse: {
6
+ hash: string;
7
+ };
8
+ export declare const testConfig: ProviderConfiguration;
9
+ export declare const getTokenAddress: (symbol: string) => string;
10
+ /**
11
+ * Generate a ethSigner/starkSigner object from a private key.
12
+ */
13
+ export declare const generateSigners: (privateKey: string) => Promise<Signers>;
package/package.json ADDED
@@ -0,0 +1,78 @@
1
+ {
2
+ "name": "@imtbl/x-provider",
3
+ "description": "Provider package for Immutable SDK",
4
+ "version": "2.0.0-alpha.0",
5
+ "author": "Immutable",
6
+ "bugs": "https://github.com/immutable/ts-immutable-sdk/issues",
7
+ "dependencies": {
8
+ "@imtbl/config": "2.0.0-alpha.0",
9
+ "@imtbl/generated-clients": "2.0.0-alpha.0",
10
+ "@imtbl/toolkit": "2.0.0-alpha.0",
11
+ "@imtbl/x-client": "2.0.0-alpha.0",
12
+ "@magic-ext/oidc": "4.3.1",
13
+ "@metamask/detect-provider": "^2.0.0",
14
+ "axios": "^1.6.5",
15
+ "enc-utils": "^3.0.0",
16
+ "ethers": "^6.13.4",
17
+ "magic-sdk": "^21.2.0",
18
+ "oidc-client-ts": "2.4.0"
19
+ },
20
+ "devDependencies": {
21
+ "@swc/core": "^1.3.36",
22
+ "@swc/jest": "^0.2.24",
23
+ "@types/axios": "^0.14.0",
24
+ "@types/jest": "^29.4.3",
25
+ "@types/node": "^18.14.2",
26
+ "@types/react": "^18.3.5",
27
+ "@types/react-dom": "^18.3.0",
28
+ "@typescript-eslint/eslint-plugin": "^5.57.1",
29
+ "@typescript-eslint/parser": "^5.57.1",
30
+ "eslint": "^8.40.0",
31
+ "jest": "^29.4.3",
32
+ "jest-environment-jsdom": "^29.4.3",
33
+ "prettier": "^2.8.7",
34
+ "ts-node": "^10.9.1",
35
+ "tsup": "^8.3.5",
36
+ "typescript": "^5.6.2"
37
+ },
38
+ "engines": {
39
+ "node": ">=20.11.0"
40
+ },
41
+ "exports": {
42
+ "development": {
43
+ "types": "./src/index.ts",
44
+ "browser": "./dist/browser/index.js",
45
+ "require": "./dist/node/index.cjs",
46
+ "default": "./dist/node/index.js"
47
+ },
48
+ "default": {
49
+ "types": "./dist/types/index.d.ts",
50
+ "browser": "./dist/browser/index.js",
51
+ "require": "./dist/node/index.cjs",
52
+ "default": "./dist/node/index.js"
53
+ }
54
+ },
55
+ "files": [
56
+ "dist"
57
+ ],
58
+ "homepage": "https://github.com/immutable/ts-immutable-sdk#readme",
59
+ "license": "Apache-2.0",
60
+ "main": "dist/node/index.cjs",
61
+ "module": "dist/node/index.js",
62
+ "browser": "dist/browser/index.js",
63
+ "publishConfig": {
64
+ "access": "public"
65
+ },
66
+ "repository": "immutable/ts-immutable-sdk.git",
67
+ "type": "module",
68
+ "types": "./dist/types/index.d.ts",
69
+ "scripts": {
70
+ "build": "pnpm transpile && pnpm typegen",
71
+ "transpile": "tsup src/index.ts --config ../../tsup.config.js",
72
+ "typegen": "tsc --customConditions default --emitDeclarationOnly --outDir dist/types",
73
+ "lint": "eslint ./src --ext .ts,.jsx,.tsx --max-warnings=0",
74
+ "test": "jest",
75
+ "test:watch": "jest --watch",
76
+ "typecheck": "tsc --customConditions default --noEmit --jsx preserve"
77
+ }
78
+ }