@ledgerhq/coin-solana 0.35.0 → 0.35.1-nightly.1

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 (197) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/.unimportedrc.json +2 -1
  3. package/CHANGELOG.md +16 -0
  4. package/lib/network/chain/account/parser.d.ts +1 -1
  5. package/lib/network/chain/account/stake.d.ts +23 -23
  6. package/lib/network/chain/account/token.d.ts +7 -7
  7. package/lib/network/chain/instruction/stake/types.d.ts +8 -8
  8. package/lib/network/chain/instruction/system/types.d.ts +14 -14
  9. package/lib/prepareTransaction.d.ts.map +1 -1
  10. package/lib/prepareTransaction.js +4 -0
  11. package/lib/prepareTransaction.js.map +1 -1
  12. package/lib/signOperation.d.ts.map +1 -1
  13. package/lib/signOperation.js +2 -0
  14. package/lib/signOperation.js.map +1 -1
  15. package/lib/signer.d.ts +1 -0
  16. package/lib/signer.d.ts.map +1 -1
  17. package/lib/signer.js.map +1 -1
  18. package/lib/{bridge.integration.test.d.ts → test/bridge.dataset.d.ts} +2 -2
  19. package/lib/test/bridge.dataset.d.ts.map +1 -0
  20. package/lib/{bridge.integration.test.js → test/bridge.dataset.js} +8 -8
  21. package/lib/test/bridge.dataset.js.map +1 -0
  22. package/lib/tx-fees.js +2 -0
  23. package/lib/tx-fees.js.map +1 -1
  24. package/lib/types.d.ts +2 -1
  25. package/lib/types.d.ts.map +1 -1
  26. package/lib-es/network/chain/account/parser.d.ts +1 -1
  27. package/lib-es/network/chain/account/stake.d.ts +23 -23
  28. package/lib-es/network/chain/account/token.d.ts +7 -7
  29. package/lib-es/network/chain/instruction/stake/types.d.ts +8 -8
  30. package/lib-es/network/chain/instruction/system/types.d.ts +14 -14
  31. package/lib-es/prepareTransaction.d.ts.map +1 -1
  32. package/lib-es/prepareTransaction.js +4 -0
  33. package/lib-es/prepareTransaction.js.map +1 -1
  34. package/lib-es/signOperation.d.ts.map +1 -1
  35. package/lib-es/signOperation.js +2 -0
  36. package/lib-es/signOperation.js.map +1 -1
  37. package/lib-es/signer.d.ts +1 -0
  38. package/lib-es/signer.d.ts.map +1 -1
  39. package/lib-es/signer.js.map +1 -1
  40. package/lib-es/{bridge.integration.test.d.ts → test/bridge.dataset.d.ts} +2 -2
  41. package/lib-es/test/bridge.dataset.d.ts.map +1 -0
  42. package/lib-es/{bridge.integration.test.js → test/bridge.dataset.js} +8 -8
  43. package/lib-es/test/bridge.dataset.js.map +1 -0
  44. package/lib-es/tx-fees.js +2 -0
  45. package/lib-es/tx-fees.js.map +1 -1
  46. package/lib-es/types.d.ts +2 -1
  47. package/lib-es/types.d.ts.map +1 -1
  48. package/package.json +6 -6
  49. package/src/prepareTransaction.ts +4 -0
  50. package/src/signOperation.ts +2 -0
  51. package/src/signer.ts +1 -0
  52. package/src/{bridge.integration.test.ts → test/bridge.dataset.ts} +8 -8
  53. package/src/tests/preload.fixtures.ts +1 -1
  54. package/src/tx-fees.ts +2 -0
  55. package/src/types.ts +2 -1
  56. package/lib/__fixtures__/solana-spl-epjfwdd5aufqssqem2qn1xzybapc8g4weggkzwytdt1v.json +0 -50
  57. package/lib/__tests__/fixtures/helpers.fixture.d.ts +0 -138
  58. package/lib/__tests__/fixtures/helpers.fixture.d.ts.map +0 -1
  59. package/lib/__tests__/fixtures/helpers.fixture.js +0 -124
  60. package/lib/__tests__/fixtures/helpers.fixture.js.map +0 -1
  61. package/lib/__tests__/scan-accounts.test.d.ts +0 -2
  62. package/lib/__tests__/scan-accounts.test.d.ts.map +0 -1
  63. package/lib/__tests__/scan-accounts.test.js +0 -426
  64. package/lib/__tests__/scan-accounts.test.js.map +0 -1
  65. package/lib/__tests__/unit/hw-signMessage.unit.test.d.ts +0 -2
  66. package/lib/__tests__/unit/hw-signMessage.unit.test.d.ts.map +0 -1
  67. package/lib/__tests__/unit/hw-signMessage.unit.test.js +0 -91
  68. package/lib/__tests__/unit/hw-signMessage.unit.test.js.map +0 -1
  69. package/lib/__tests__/unit/nftResolvers.unit.test.d.ts +0 -2
  70. package/lib/__tests__/unit/nftResolvers.unit.test.d.ts.map +0 -1
  71. package/lib/__tests__/unit/nftResolvers.unit.test.js +0 -147
  72. package/lib/__tests__/unit/nftResolvers.unit.test.js.map +0 -1
  73. package/lib/__tests__/unit/utils.unit.test.d.ts +0 -2
  74. package/lib/__tests__/unit/utils.unit.test.d.ts.map +0 -1
  75. package/lib/__tests__/unit/utils.unit.test.js +0 -16
  76. package/lib/__tests__/unit/utils.unit.test.js.map +0 -1
  77. package/lib/__tests__/unit/validator-app.unit.test.d.ts +0 -2
  78. package/lib/__tests__/unit/validator-app.unit.test.d.ts.map +0 -1
  79. package/lib/__tests__/unit/validator-app.unit.test.js +0 -169
  80. package/lib/__tests__/unit/validator-app.unit.test.js.map +0 -1
  81. package/lib/bridge.integration.test.d.ts.map +0 -1
  82. package/lib/bridge.integration.test.js.map +0 -1
  83. package/lib/buildTransaction.test.d.ts +0 -2
  84. package/lib/buildTransaction.test.d.ts.map +0 -1
  85. package/lib/buildTransaction.test.js +0 -164
  86. package/lib/buildTransaction.test.js.map +0 -1
  87. package/lib/cryptoAssetsStore.test.d.ts +0 -2
  88. package/lib/cryptoAssetsStore.test.d.ts.map +0 -1
  89. package/lib/cryptoAssetsStore.test.js +0 -15
  90. package/lib/cryptoAssetsStore.test.js.map +0 -1
  91. package/lib/network/chain/web3.integration.test.d.ts +0 -2
  92. package/lib/network/chain/web3.integration.test.d.ts.map +0 -1
  93. package/lib/network/chain/web3.integration.test.js +0 -70
  94. package/lib/network/chain/web3.integration.test.js.map +0 -1
  95. package/lib/offchainMessage/format.unit.test.d.ts +0 -2
  96. package/lib/offchainMessage/format.unit.test.d.ts.map +0 -1
  97. package/lib/offchainMessage/format.unit.test.js +0 -124
  98. package/lib/offchainMessage/format.unit.test.js.map +0 -1
  99. package/lib/preload.test.d.ts +0 -2
  100. package/lib/preload.test.d.ts.map +0 -1
  101. package/lib/preload.test.js +0 -9
  102. package/lib/preload.test.js.map +0 -1
  103. package/lib/prepareTransaction.test.d.ts +0 -2
  104. package/lib/prepareTransaction.test.d.ts.map +0 -1
  105. package/lib/prepareTransaction.test.js +0 -139
  106. package/lib/prepareTransaction.test.js.map +0 -1
  107. package/lib/signOperation.test.d.ts +0 -3
  108. package/lib/signOperation.test.d.ts.map +0 -1
  109. package/lib/signOperation.test.js +0 -139
  110. package/lib/signOperation.test.js.map +0 -1
  111. package/lib/tests/preload.fixtures.d.ts +0 -5
  112. package/lib/tests/preload.fixtures.d.ts.map +0 -1
  113. package/lib/tests/preload.fixtures.js +0 -28
  114. package/lib/tests/preload.fixtures.js.map +0 -1
  115. package/lib/tests/preload.unit.test.d.ts +0 -2
  116. package/lib/tests/preload.unit.test.d.ts.map +0 -1
  117. package/lib/tests/preload.unit.test.js +0 -175
  118. package/lib/tests/preload.unit.test.js.map +0 -1
  119. package/lib/tests/stakes-bridge.unit.test.d.ts +0 -2
  120. package/lib/tests/stakes-bridge.unit.test.d.ts.map +0 -1
  121. package/lib/tests/stakes-bridge.unit.test.js +0 -166
  122. package/lib/tests/stakes-bridge.unit.test.js.map +0 -1
  123. package/lib/tests/tokens-bridge.unit.test.d.ts +0 -2
  124. package/lib/tests/tokens-bridge.unit.test.d.ts.map +0 -1
  125. package/lib/tests/tokens-bridge.unit.test.js +0 -615
  126. package/lib/tests/tokens-bridge.unit.test.js.map +0 -1
  127. package/lib-es/__fixtures__/solana-spl-epjfwdd5aufqssqem2qn1xzybapc8g4weggkzwytdt1v.json +0 -50
  128. package/lib-es/__tests__/fixtures/helpers.fixture.d.ts +0 -138
  129. package/lib-es/__tests__/fixtures/helpers.fixture.d.ts.map +0 -1
  130. package/lib-es/__tests__/fixtures/helpers.fixture.js +0 -110
  131. package/lib-es/__tests__/fixtures/helpers.fixture.js.map +0 -1
  132. package/lib-es/__tests__/scan-accounts.test.d.ts +0 -2
  133. package/lib-es/__tests__/scan-accounts.test.d.ts.map +0 -1
  134. package/lib-es/__tests__/scan-accounts.test.js +0 -398
  135. package/lib-es/__tests__/scan-accounts.test.js.map +0 -1
  136. package/lib-es/__tests__/unit/hw-signMessage.unit.test.d.ts +0 -2
  137. package/lib-es/__tests__/unit/hw-signMessage.unit.test.d.ts.map +0 -1
  138. package/lib-es/__tests__/unit/hw-signMessage.unit.test.js +0 -86
  139. package/lib-es/__tests__/unit/hw-signMessage.unit.test.js.map +0 -1
  140. package/lib-es/__tests__/unit/nftResolvers.unit.test.d.ts +0 -2
  141. package/lib-es/__tests__/unit/nftResolvers.unit.test.d.ts.map +0 -1
  142. package/lib-es/__tests__/unit/nftResolvers.unit.test.js +0 -142
  143. package/lib-es/__tests__/unit/nftResolvers.unit.test.js.map +0 -1
  144. package/lib-es/__tests__/unit/utils.unit.test.d.ts +0 -2
  145. package/lib-es/__tests__/unit/utils.unit.test.d.ts.map +0 -1
  146. package/lib-es/__tests__/unit/utils.unit.test.js +0 -14
  147. package/lib-es/__tests__/unit/utils.unit.test.js.map +0 -1
  148. package/lib-es/__tests__/unit/validator-app.unit.test.d.ts +0 -2
  149. package/lib-es/__tests__/unit/validator-app.unit.test.d.ts.map +0 -1
  150. package/lib-es/__tests__/unit/validator-app.unit.test.js +0 -144
  151. package/lib-es/__tests__/unit/validator-app.unit.test.js.map +0 -1
  152. package/lib-es/bridge.integration.test.d.ts.map +0 -1
  153. package/lib-es/bridge.integration.test.js.map +0 -1
  154. package/lib-es/buildTransaction.test.d.ts +0 -2
  155. package/lib-es/buildTransaction.test.d.ts.map +0 -1
  156. package/lib-es/buildTransaction.test.js +0 -162
  157. package/lib-es/buildTransaction.test.js.map +0 -1
  158. package/lib-es/cryptoAssetsStore.test.d.ts +0 -2
  159. package/lib-es/cryptoAssetsStore.test.d.ts.map +0 -1
  160. package/lib-es/cryptoAssetsStore.test.js +0 -13
  161. package/lib-es/cryptoAssetsStore.test.js.map +0 -1
  162. package/lib-es/network/chain/web3.integration.test.d.ts +0 -2
  163. package/lib-es/network/chain/web3.integration.test.d.ts.map +0 -1
  164. package/lib-es/network/chain/web3.integration.test.js +0 -68
  165. package/lib-es/network/chain/web3.integration.test.js.map +0 -1
  166. package/lib-es/offchainMessage/format.unit.test.d.ts +0 -2
  167. package/lib-es/offchainMessage/format.unit.test.d.ts.map +0 -1
  168. package/lib-es/offchainMessage/format.unit.test.js +0 -122
  169. package/lib-es/offchainMessage/format.unit.test.js.map +0 -1
  170. package/lib-es/preload.test.d.ts +0 -2
  171. package/lib-es/preload.test.d.ts.map +0 -1
  172. package/lib-es/preload.test.js +0 -7
  173. package/lib-es/preload.test.js.map +0 -1
  174. package/lib-es/prepareTransaction.test.d.ts +0 -2
  175. package/lib-es/prepareTransaction.test.d.ts.map +0 -1
  176. package/lib-es/prepareTransaction.test.js +0 -134
  177. package/lib-es/prepareTransaction.test.js.map +0 -1
  178. package/lib-es/signOperation.test.d.ts +0 -3
  179. package/lib-es/signOperation.test.d.ts.map +0 -1
  180. package/lib-es/signOperation.test.js +0 -135
  181. package/lib-es/signOperation.test.js.map +0 -1
  182. package/lib-es/tests/preload.fixtures.d.ts +0 -5
  183. package/lib-es/tests/preload.fixtures.d.ts.map +0 -1
  184. package/lib-es/tests/preload.fixtures.js +0 -25
  185. package/lib-es/tests/preload.fixtures.js.map +0 -1
  186. package/lib-es/tests/preload.unit.test.d.ts +0 -2
  187. package/lib-es/tests/preload.unit.test.d.ts.map +0 -1
  188. package/lib-es/tests/preload.unit.test.js +0 -147
  189. package/lib-es/tests/preload.unit.test.js.map +0 -1
  190. package/lib-es/tests/stakes-bridge.unit.test.d.ts +0 -2
  191. package/lib-es/tests/stakes-bridge.unit.test.d.ts.map +0 -1
  192. package/lib-es/tests/stakes-bridge.unit.test.js +0 -161
  193. package/lib-es/tests/stakes-bridge.unit.test.js.map +0 -1
  194. package/lib-es/tests/tokens-bridge.unit.test.d.ts +0 -2
  195. package/lib-es/tests/tokens-bridge.unit.test.d.ts.map +0 -1
  196. package/lib-es/tests/tokens-bridge.unit.test.js +0 -610
  197. package/lib-es/tests/tokens-bridge.unit.test.js.map +0 -1
@@ -1,610 +0,0 @@
1
- import BigNumber from "bignumber.js";
2
- import cloneDeep from "lodash/cloneDeep";
3
- import { SolanaRecipientMemoIsRequired, SolanaTokenAccountFrozen, SolanaTokenNonTransferable, } from "../errors";
4
- import { encodeAccountIdWithTokenAccountAddress } from "../logic";
5
- import { LAST_VALID_BLOCK_HEIGHT_MOCK, LATEST_BLOCKHASH_MOCK } from "../network";
6
- import getTransactionStatus from "../getTransactionStatus";
7
- import { prepareTransaction } from "../prepareTransaction";
8
- import { encodeAccountId } from "@ledgerhq/coin-framework/lib/account/accountId";
9
- import { PublicKey } from "@solana/web3.js";
10
- import { ASSOCIATED_TOKEN_PROGRAM_ID, TOKEN_2022_PROGRAM_ID, TOKEN_PROGRAM_ID, } from "@solana/spl-token";
11
- import { calculateToken2022TransferFees } from "../helpers/token";
12
- import { PARSED_PROGRAMS } from "../network/chain/program/constants";
13
- import { getCryptoAssetsStore, setCryptoAssetsStoreGetter } from "../cryptoAssetsStore";
14
- import usdcTokenData from "../__fixtures__/solana-spl-epjfwdd5aufqssqem2qn1xzybapc8g4weggkzwytdt1v.json";
15
- const USDC_TOKEN = usdcTokenData;
16
- // fake addresses
17
- const testData = {
18
- address1: "8DpKDisipx6f76cEmuGvCX9TrA3SjeR76HaTRePxHBDe",
19
- address2: "6oK54jLodm3D5Qd7Zju5D4LPXhWX61hzog15pvc6UVrX",
20
- address3: "DYS9SVj8nhK2V7NprSRqbWpiF8euSGWv4QTSX45HTbfX",
21
- mintAddress: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
22
- ataAddress1: PublicKey.findProgramAddressSync([
23
- new PublicKey("8DpKDisipx6f76cEmuGvCX9TrA3SjeR76HaTRePxHBDe").toBuffer(),
24
- TOKEN_PROGRAM_ID.toBuffer(),
25
- new PublicKey("EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v").toBuffer(),
26
- ], ASSOCIATED_TOKEN_PROGRAM_ID)[0].toBase58(),
27
- fees: 5000,
28
- };
29
- const mainAccId = encodeAccountId({
30
- type: "js",
31
- version: "2",
32
- currencyId: "solana",
33
- xpubOrAddress: testData.address1,
34
- derivationMode: "solanaMain",
35
- });
36
- const wSolSubAccId = encodeAccountIdWithTokenAccountAddress(mainAccId, testData.ataAddress1);
37
- setCryptoAssetsStoreGetter(() =>
38
- // eslint-disable-next-line @typescript-eslint/consistent-type-assertions
39
- ({
40
- findTokenByAddressInCurrency: (address, _currencyId) => {
41
- if (address === "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v") {
42
- return USDC_TOKEN;
43
- }
44
- return undefined;
45
- },
46
- }));
47
- const wSolToken = getCryptoAssetsStore().findTokenByAddressInCurrency(testData.mintAddress, "solana");
48
- const baseAccount = {
49
- balance: new BigNumber(10000),
50
- spendableBalance: new BigNumber(10000),
51
- };
52
- const baseAPI = {
53
- getLatestBlockhash: () => Promise.resolve({
54
- blockhash: LATEST_BLOCKHASH_MOCK,
55
- lastValidBlockHeight: LAST_VALID_BLOCK_HEIGHT_MOCK,
56
- }),
57
- getFeeForMessage: (_msg) => Promise.resolve(testData.fees),
58
- getRecentPrioritizationFees: (_) => {
59
- return Promise.resolve([
60
- {
61
- slot: 122422797,
62
- prioritizationFee: 0,
63
- },
64
- {
65
- slot: 122422797,
66
- prioritizationFee: 0,
67
- },
68
- ]);
69
- },
70
- getSimulationComputeUnits: (_ixs, _payer) => Promise.resolve(1000),
71
- getBalance: (_) => Promise.resolve(10),
72
- findAssocTokenAccAddress: (owner, mint, program) => {
73
- return Promise.resolve(PublicKey.findProgramAddressSync([
74
- new PublicKey(owner).toBuffer(),
75
- program === "spl-token" ? TOKEN_PROGRAM_ID.toBuffer() : TOKEN_2022_PROGRAM_ID.toBuffer(),
76
- new PublicKey(mint).toBuffer(),
77
- ], ASSOCIATED_TOKEN_PROGRAM_ID)[0].toBase58());
78
- },
79
- };
80
- // Broken tests as the address used is not support anymore
81
- // Returning other errors we don't expect
82
- describe("Solana tokens bridge integration tests", () => {
83
- const baseSolanaAccount = {
84
- ...baseAccount,
85
- freshAddress: testData.address1,
86
- solanaResources: { stakes: [], unstakeReserve: BigNumber(0) },
87
- };
88
- const baseTxModel = {
89
- kind: "token.transfer",
90
- uiState: {
91
- subAccountId: wSolSubAccId,
92
- },
93
- };
94
- const baseTx = {
95
- model: baseTxModel,
96
- amount: new BigNumber(10),
97
- recipient: testData.address2,
98
- family: "solana",
99
- };
100
- const baseAtaMock = {
101
- parsed: {
102
- info: {
103
- isNative: false,
104
- mint: wSolToken.contractAddress,
105
- owner: testData.address1,
106
- state: "initialized",
107
- tokenAmount: {
108
- amount: "10000000",
109
- decimals: wSolToken.units[0].magnitude,
110
- uiAmount: 10.0,
111
- uiAmountString: "10",
112
- },
113
- },
114
- type: "account",
115
- },
116
- program: PARSED_PROGRAMS.SPL_TOKEN,
117
- space: 165,
118
- };
119
- const frozenAtaMock = {
120
- ...baseAtaMock,
121
- parsed: {
122
- ...baseAtaMock.parsed,
123
- info: {
124
- ...baseAtaMock.parsed.info,
125
- state: "frozen",
126
- },
127
- },
128
- };
129
- const mockedTokenAcc = {
130
- type: "TokenAccount",
131
- id: wSolSubAccId,
132
- parentId: mainAccId,
133
- token: wSolToken,
134
- balance: new BigNumber(100),
135
- operations: [],
136
- pendingOperations: [],
137
- spendableBalance: new BigNumber(100),
138
- state: "initialized",
139
- creationDate: new Date(),
140
- operationsCount: 0,
141
- balanceHistoryCache: {
142
- HOUR: { balances: [], latestDate: null },
143
- DAY: { balances: [], latestDate: null },
144
- WEEK: { balances: [], latestDate: null },
145
- },
146
- swapHistory: [],
147
- };
148
- const baseAta2022Mock = {
149
- parsed: {
150
- info: {
151
- isNative: false,
152
- mint: wSolToken.contractAddress,
153
- owner: testData.address1,
154
- state: "initialized",
155
- tokenAmount: {
156
- amount: "10000000",
157
- decimals: wSolToken.units[0].magnitude,
158
- uiAmount: 10.0,
159
- uiAmountString: "10",
160
- },
161
- },
162
- type: "account",
163
- },
164
- program: PARSED_PROGRAMS.SPL_TOKEN_2022,
165
- space: 165,
166
- };
167
- const baseTokenMintMock = {
168
- data: {
169
- parsed: {
170
- info: {
171
- decimals: 9,
172
- freezeAuthority: null,
173
- isInitialized: true,
174
- mintAuthority: null,
175
- supply: "0",
176
- },
177
- type: "mint",
178
- },
179
- program: PARSED_PROGRAMS.SPL_TOKEN,
180
- space: 82,
181
- },
182
- executable: false,
183
- lamports: 419787401967,
184
- owner: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
185
- rentEpoch: 304,
186
- };
187
- const baseToken2022MintMock = {
188
- ...baseTokenMintMock,
189
- data: {
190
- ...baseTokenMintMock.data,
191
- parsed: {
192
- ...baseTokenMintMock.data.parsed,
193
- info: {
194
- ...baseTokenMintMock.data.parsed.info,
195
- extensions: [],
196
- },
197
- },
198
- program: PARSED_PROGRAMS.SPL_TOKEN_2022,
199
- },
200
- };
201
- const mockedToken2022Acc = {
202
- ...mockedTokenAcc,
203
- };
204
- const buildTransferFeeConfig = (bps, maxFee) => {
205
- return {
206
- extension: "transferFeeConfig",
207
- state: {
208
- newerTransferFee: {
209
- epoch: 300,
210
- maximumFee: maxFee,
211
- transferFeeBasisPoints: bps,
212
- },
213
- olderTransferFee: {
214
- epoch: 299,
215
- maximumFee: maxFee,
216
- transferFeeBasisPoints: bps,
217
- },
218
- transferFeeConfigAuthority: null,
219
- withdrawWithheldAuthority: null,
220
- withheldAmount: 0,
221
- },
222
- };
223
- };
224
- test("token.transfer :: status is success", async () => {
225
- const api = {
226
- ...baseAPI,
227
- getAccountInfo: (address) => {
228
- if (address === wSolToken.contractAddress) {
229
- return Promise.resolve(baseTokenMintMock);
230
- }
231
- if (address === testData.address2) {
232
- return Promise.resolve({ data: {} });
233
- }
234
- return Promise.resolve({ data: baseAtaMock });
235
- },
236
- };
237
- const account = {
238
- ...baseSolanaAccount,
239
- subAccounts: [mockedTokenAcc],
240
- };
241
- const preparedTx = await prepareTransaction(account, baseTx, api);
242
- const receivedTxStatus = await getTransactionStatus(account, preparedTx);
243
- const expectedTxStatus = {
244
- amount: new BigNumber(10),
245
- estimatedFees: new BigNumber(testData.fees),
246
- totalSpent: new BigNumber(10),
247
- errors: {},
248
- warnings: {},
249
- };
250
- expect(receivedTxStatus).toEqual(expectedTxStatus);
251
- });
252
- // Send flow
253
- test("token.transfer :: status is success: transfer with subAccountId", async () => {
254
- const api = {
255
- ...baseAPI,
256
- getAccountInfo: (address) => {
257
- if (address === wSolToken.contractAddress) {
258
- return Promise.resolve(baseTokenMintMock);
259
- }
260
- if (address === testData.address2) {
261
- return Promise.resolve({ data: {} });
262
- }
263
- return Promise.resolve({ data: baseAtaMock });
264
- },
265
- };
266
- const account = {
267
- ...baseSolanaAccount,
268
- subAccounts: [mockedTokenAcc],
269
- };
270
- const transferTxWithSubAccountId = {
271
- model: {
272
- kind: "transfer",
273
- uiState: {},
274
- },
275
- amount: new BigNumber(10),
276
- recipient: testData.address2,
277
- family: "solana",
278
- subAccountId: wSolSubAccId,
279
- };
280
- const preparedTx = await prepareTransaction(account, transferTxWithSubAccountId, api);
281
- const receivedTxStatus = await getTransactionStatus(account, preparedTx);
282
- const expectedTxStatus = {
283
- amount: new BigNumber(10),
284
- estimatedFees: new BigNumber(testData.fees),
285
- totalSpent: new BigNumber(10),
286
- errors: {},
287
- warnings: {},
288
- };
289
- expect(preparedTx.model.commandDescriptor?.command.kind).toEqual("token.transfer");
290
- expect(receivedTxStatus).toEqual(expectedTxStatus);
291
- });
292
- test("token.transfer :: status is error: sender ATA is frozen", async () => {
293
- const api = {
294
- ...baseAPI,
295
- getAccountInfo: (address) => {
296
- if (address === wSolToken.contractAddress) {
297
- return Promise.resolve(baseTokenMintMock);
298
- }
299
- if (address === testData.address2) {
300
- return Promise.resolve({ data: {} });
301
- }
302
- return Promise.resolve({ data: baseAtaMock });
303
- },
304
- };
305
- const tokenAcc = {
306
- ...mockedTokenAcc,
307
- state: "frozen",
308
- };
309
- const account = {
310
- ...baseSolanaAccount,
311
- subAccounts: [tokenAcc],
312
- };
313
- const preparedTx = await prepareTransaction(account, baseTx, api);
314
- const receivedTxStatus = await getTransactionStatus(account, preparedTx);
315
- const expectedTxStatus = {
316
- amount: new BigNumber(10),
317
- estimatedFees: new BigNumber(testData.fees),
318
- totalSpent: new BigNumber(10),
319
- errors: {
320
- amount: new SolanaTokenAccountFrozen(),
321
- },
322
- warnings: {},
323
- };
324
- expect(receivedTxStatus).toEqual(expectedTxStatus);
325
- });
326
- test("token.transfer :: status is error: recipient ATA is frozen", async () => {
327
- const api = {
328
- ...baseAPI,
329
- getAccountInfo: (address) => {
330
- if (address === wSolToken.contractAddress) {
331
- return Promise.resolve(baseTokenMintMock);
332
- }
333
- if (address === testData.address2) {
334
- return Promise.resolve({ data: {} });
335
- }
336
- return Promise.resolve({ data: frozenAtaMock });
337
- },
338
- };
339
- const tokenAcc = {
340
- ...mockedTokenAcc,
341
- };
342
- const account = {
343
- ...baseSolanaAccount,
344
- subAccounts: [tokenAcc],
345
- };
346
- const preparedTx = await prepareTransaction(account, baseTx, api);
347
- const receivedTxStatus = await getTransactionStatus(account, preparedTx);
348
- const expectedTxStatus = {
349
- amount: new BigNumber(10),
350
- estimatedFees: new BigNumber(testData.fees),
351
- totalSpent: new BigNumber(10),
352
- errors: {
353
- recipient: new SolanaTokenAccountFrozen(),
354
- },
355
- warnings: {},
356
- };
357
- expect(receivedTxStatus).toEqual(expectedTxStatus);
358
- });
359
- test("token2022.transfer :: status is success", async () => {
360
- const api = {
361
- ...baseAPI,
362
- getAccountInfo: (address) => {
363
- if (address === wSolToken.contractAddress) {
364
- return Promise.resolve(baseToken2022MintMock);
365
- }
366
- if (address === testData.address2) {
367
- return Promise.resolve({ data: {} });
368
- }
369
- return Promise.resolve({ data: baseAta2022Mock });
370
- },
371
- };
372
- const account = {
373
- ...baseSolanaAccount,
374
- subAccounts: [mockedToken2022Acc],
375
- };
376
- const preparedTx = await prepareTransaction(account, baseTx, api);
377
- const receivedTxStatus = await getTransactionStatus(account, preparedTx);
378
- const expectedTxStatus = {
379
- amount: new BigNumber(10),
380
- estimatedFees: new BigNumber(testData.fees),
381
- totalSpent: new BigNumber(10),
382
- errors: {},
383
- warnings: {},
384
- };
385
- expect(receivedTxStatus).toEqual(expectedTxStatus);
386
- });
387
- test("token2022.transfer :: ATA with required memo :: status is error", async () => {
388
- const ataWithRequiredMemoMock = cloneDeep(baseAta2022Mock);
389
- ataWithRequiredMemoMock.parsed.info.extensions = [
390
- {
391
- extension: "memoTransfer",
392
- state: { requireIncomingTransferMemos: true },
393
- },
394
- ];
395
- const api = {
396
- ...baseAPI,
397
- getAccountInfo: (address) => {
398
- if (address === wSolToken.contractAddress) {
399
- return Promise.resolve(baseToken2022MintMock);
400
- }
401
- if (address === testData.address2) {
402
- return Promise.resolve({ data: {} });
403
- }
404
- return Promise.resolve({ data: ataWithRequiredMemoMock });
405
- },
406
- getBalance: () => Promise.resolve(10),
407
- };
408
- const account = {
409
- ...baseSolanaAccount,
410
- subAccounts: [mockedToken2022Acc],
411
- };
412
- const preparedTx = await prepareTransaction(account, baseTx, api);
413
- const receivedTxStatus = await getTransactionStatus(account, preparedTx);
414
- const expectedErrors = {
415
- memo: new SolanaRecipientMemoIsRequired(),
416
- transaction: new SolanaRecipientMemoIsRequired(),
417
- };
418
- expect(receivedTxStatus.errors).toEqual(expectedErrors);
419
- });
420
- test("token2022.transfer :: correct transfer fee extension calculations", async () => {
421
- const mintWithTransferFeeMock = cloneDeep(baseToken2022MintMock);
422
- mintWithTransferFeeMock.data.program = PARSED_PROGRAMS.SPL_TOKEN_2022;
423
- const magnitude = BigNumber(10).pow(baseTokenMintMock.data.parsed.info.decimals);
424
- const maxFee = BigNumber(10).times(magnitude).toNumber();
425
- const bps = 100;
426
- const transferConfigExt = buildTransferFeeConfig(bps, maxFee);
427
- mintWithTransferFeeMock.data.parsed.info.extensions = [transferConfigExt];
428
- const api = {
429
- ...baseAPI,
430
- getAccountInfo: (address) => {
431
- if (address === wSolToken.contractAddress) {
432
- return Promise.resolve(mintWithTransferFeeMock);
433
- }
434
- if (address === testData.address2) {
435
- return Promise.resolve({ data: {} });
436
- }
437
- return Promise.resolve({ data: baseAta2022Mock });
438
- },
439
- getBalance: () => Promise.resolve(BigNumber(100).times(magnitude).toNumber()),
440
- getEpochInfo: () => Promise.resolve({ epoch: 300 }),
441
- };
442
- const account = {
443
- ...baseSolanaAccount,
444
- subAccounts: [
445
- {
446
- ...mockedToken2022Acc,
447
- balance: BigNumber(100).times(magnitude),
448
- spendableBalance: BigNumber(100).times(magnitude),
449
- },
450
- ],
451
- };
452
- const tx = {
453
- ...baseTx,
454
- amount: BigNumber(1).times(magnitude),
455
- };
456
- const preparedTx = await prepareTransaction(account, tx, api);
457
- const receivedTxStatus = await getTransactionStatus(account, preparedTx);
458
- const expectedExtensions = {
459
- transferFee: calculateToken2022TransferFees({
460
- transferAmount: tx.amount.toNumber(),
461
- currentEpoch: 300,
462
- transferFeeConfigState: transferConfigExt.state,
463
- }),
464
- };
465
- const expectedTxStatus = {
466
- amount: tx.amount,
467
- estimatedFees: new BigNumber(testData.fees),
468
- totalSpent: new BigNumber(expectedExtensions.transferFee.transferAmountIncludingFee),
469
- errors: {},
470
- warnings: {},
471
- };
472
- expect(receivedTxStatus).toEqual(expectedTxStatus);
473
- expect((preparedTx.model.commandDescriptor?.command).extensions).toEqual(expectedExtensions);
474
- });
475
- test("token2022.transfer :: transfer fee with useAllAmount", async () => {
476
- const mintWithTransferFeeMock = cloneDeep(baseToken2022MintMock);
477
- mintWithTransferFeeMock.data.program = PARSED_PROGRAMS.SPL_TOKEN_2022;
478
- const magnitude = BigNumber(10).pow(baseTokenMintMock.data.parsed.info.decimals);
479
- const maxFee = BigNumber(10).times(magnitude).toNumber();
480
- const bps = 100;
481
- const transferConfigExt = buildTransferFeeConfig(bps, maxFee);
482
- mintWithTransferFeeMock.data.parsed.info.extensions = [transferConfigExt];
483
- const balance = BigNumber(100).times(magnitude);
484
- const api = {
485
- ...baseAPI,
486
- getAccountInfo: (address) => {
487
- if (address === wSolToken.contractAddress) {
488
- return Promise.resolve(mintWithTransferFeeMock);
489
- }
490
- if (address === testData.address2) {
491
- return Promise.resolve({ data: {} });
492
- }
493
- return Promise.resolve({ data: baseAta2022Mock });
494
- },
495
- getBalance: () => Promise.resolve(balance.toNumber()),
496
- getEpochInfo: () => Promise.resolve({ epoch: 300 }),
497
- };
498
- const account = {
499
- ...baseSolanaAccount,
500
- subAccounts: [
501
- {
502
- ...mockedToken2022Acc,
503
- balance: balance,
504
- spendableBalance: balance,
505
- extensions: {
506
- transferFee: { feeBps: bps },
507
- },
508
- },
509
- ],
510
- };
511
- const tx = {
512
- ...baseTx,
513
- useAllAmount: true,
514
- amount: BigNumber(0),
515
- };
516
- const preparedTx = await prepareTransaction(account, tx, api);
517
- const receivedTxStatus = await getTransactionStatus(account, preparedTx);
518
- const maxSpendable = calculateToken2022TransferFees({
519
- transferAmount: balance.toNumber(),
520
- currentEpoch: 300,
521
- transferFeeConfigState: transferConfigExt.state,
522
- }).transferAmountExcludingFee;
523
- const transferFeeConfig = calculateToken2022TransferFees({
524
- transferAmount: maxSpendable,
525
- currentEpoch: 300,
526
- transferFeeConfigState: transferConfigExt.state,
527
- });
528
- const expectedTxStatus = {
529
- amount: new BigNumber(maxSpendable),
530
- estimatedFees: new BigNumber(testData.fees),
531
- totalSpent: new BigNumber(transferFeeConfig.transferAmountIncludingFee),
532
- errors: {},
533
- warnings: {},
534
- };
535
- expect((preparedTx.model.commandDescriptor?.command).amount).toBe(maxSpendable);
536
- expect((preparedTx.model.commandDescriptor?.command).extensions?.transferFee).toEqual(transferFeeConfig);
537
- expect(receivedTxStatus).toEqual(expectedTxStatus);
538
- });
539
- test("token2022.transfer :: transfer fee is zero :: send amount success", async () => {
540
- const mintWithTransferFeeMock = cloneDeep(baseToken2022MintMock);
541
- mintWithTransferFeeMock.data.program = PARSED_PROGRAMS.SPL_TOKEN_2022;
542
- const magnitude = BigNumber(10).pow(baseTokenMintMock.data.parsed.info.decimals);
543
- const maxFee = BigNumber(10).times(magnitude).toNumber();
544
- const bps = 0;
545
- const transferConfigExt = buildTransferFeeConfig(bps, maxFee);
546
- mintWithTransferFeeMock.data.parsed.info.extensions = [transferConfigExt];
547
- const balance = BigNumber(100).times(magnitude);
548
- const api = {
549
- ...baseAPI,
550
- getAccountInfo: (address) => {
551
- if (address === wSolToken.contractAddress) {
552
- return Promise.resolve(mintWithTransferFeeMock);
553
- }
554
- if (address === testData.address2) {
555
- return Promise.resolve({ data: {} });
556
- }
557
- return Promise.resolve({ data: baseAta2022Mock });
558
- },
559
- getBalance: () => Promise.resolve(balance.toNumber()),
560
- getEpochInfo: () => Promise.resolve({ epoch: 300 }),
561
- };
562
- const account = {
563
- ...baseSolanaAccount,
564
- subAccounts: [
565
- {
566
- ...mockedToken2022Acc,
567
- balance: balance,
568
- spendableBalance: balance,
569
- extensions: {
570
- transferFee: { feeBps: bps },
571
- },
572
- },
573
- ],
574
- };
575
- const preparedTx = await prepareTransaction(account, baseTx, api);
576
- const receivedTxStatus = await getTransactionStatus(account, preparedTx);
577
- const expectedTxStatus = {
578
- amount: new BigNumber(10),
579
- estimatedFees: new BigNumber(testData.fees),
580
- totalSpent: new BigNumber(10),
581
- errors: {},
582
- warnings: {},
583
- };
584
- expect(receivedTxStatus).toEqual(expectedTxStatus);
585
- });
586
- test("token2022.transfer :: NonTransferable token :: tx returns SolanaTokenNonTransferable error", async () => {
587
- const mintWithNonTransferableExtensionMock = cloneDeep(baseToken2022MintMock);
588
- mintWithNonTransferableExtensionMock.data.parsed.info.extensions = [
589
- { extension: "nonTransferable" },
590
- ];
591
- const api = {
592
- ...baseAPI,
593
- getAccountInfo: (address) => {
594
- if (address === wSolToken.contractAddress) {
595
- return Promise.resolve(mintWithNonTransferableExtensionMock);
596
- }
597
- if (address === testData.address2) {
598
- return Promise.resolve({ data: {} });
599
- }
600
- return Promise.resolve({ data: baseAta2022Mock });
601
- },
602
- };
603
- const account = {
604
- ...baseSolanaAccount,
605
- subAccounts: [mockedToken2022Acc],
606
- };
607
- expect(prepareTransaction(account, baseTx, api)).rejects.toThrow(SolanaTokenNonTransferable);
608
- });
609
- });
610
- //# sourceMappingURL=tokens-bridge.unit.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"tokens-bridge.unit.test.js","sourceRoot":"","sources":["../../src/tests/tokens-bridge.unit.test.ts"],"names":[],"mappings":"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"}