@ledgerhq/coin-aptos 2.0.0-nightly.5 → 2.0.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 (272) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/.unimportedrc.json +18 -6
  3. package/CHANGELOG.md +152 -34
  4. package/jest.config.js +2 -1
  5. package/jest.integ.config.js +8 -0
  6. package/lib/__tests__/api/index.integ.test.d.ts +2 -0
  7. package/lib/__tests__/api/index.integ.test.d.ts.map +1 -0
  8. package/lib/__tests__/api/index.integ.test.js +52 -0
  9. package/lib/__tests__/api/index.integ.test.js.map +1 -0
  10. package/lib/__tests__/api/index.test.js +48 -404
  11. package/lib/__tests__/api/index.test.js.map +1 -1
  12. package/lib/__tests__/bridge/broadcast.test.js +5 -5
  13. package/lib/__tests__/bridge/broadcast.test.js.map +1 -1
  14. package/lib/__tests__/bridge/buildTransaction.test.js +60 -5
  15. package/lib/__tests__/bridge/buildTransaction.test.js.map +1 -1
  16. package/lib/__tests__/bridge/createTransaction.test.js +1 -1
  17. package/lib/__tests__/bridge/createTransaction.test.js.map +1 -1
  18. package/lib/__tests__/bridge/getFeesForTransaction.test.js +115 -14
  19. package/lib/__tests__/bridge/getFeesForTransaction.test.js.map +1 -1
  20. package/lib/__tests__/bridge/getTransactionStatus.test.js +175 -37
  21. package/lib/__tests__/bridge/getTransactionStatus.test.js.map +1 -1
  22. package/lib/__tests__/bridge/logic.test.js +889 -115
  23. package/lib/__tests__/bridge/logic.test.js.map +1 -1
  24. package/lib/__tests__/bridge/prepareTransaction.test.js +3 -3
  25. package/lib/__tests__/bridge/prepareTransaction.test.js.map +1 -1
  26. package/lib/__tests__/bridge/signOperation.test.js +131 -4
  27. package/lib/__tests__/bridge/signOperation.test.js.map +1 -1
  28. package/lib/__tests__/bridge/synchronisation.test.js +1215 -68
  29. package/lib/__tests__/bridge/synchronisation.test.js.map +1 -1
  30. package/lib/__tests__/network/client.test.d.ts +2 -0
  31. package/lib/__tests__/network/client.test.d.ts.map +1 -0
  32. package/lib/__tests__/network/client.test.js +520 -0
  33. package/lib/__tests__/network/client.test.js.map +1 -0
  34. package/lib/api/index.d.ts +4 -30
  35. package/lib/api/index.d.ts.map +1 -1
  36. package/lib/api/index.js +24 -170
  37. package/lib/api/index.js.map +1 -1
  38. package/lib/bridge/bridge.fixture.d.ts +2 -0
  39. package/lib/bridge/bridge.fixture.d.ts.map +1 -1
  40. package/lib/bridge/bridge.fixture.js +85 -13
  41. package/lib/bridge/bridge.fixture.js.map +1 -1
  42. package/lib/bridge/broadcast.d.ts +3 -2
  43. package/lib/bridge/broadcast.d.ts.map +1 -1
  44. package/lib/bridge/broadcast.js +4 -3
  45. package/lib/bridge/broadcast.js.map +1 -1
  46. package/lib/bridge/buildTransaction.d.ts +1 -1
  47. package/lib/bridge/buildTransaction.d.ts.map +1 -1
  48. package/lib/bridge/buildTransaction.js +29 -3
  49. package/lib/bridge/buildTransaction.js.map +1 -1
  50. package/lib/bridge/createTransaction.js +3 -3
  51. package/lib/bridge/createTransaction.js.map +1 -1
  52. package/lib/bridge/estimateMaxSpendable.d.ts.map +1 -1
  53. package/lib/bridge/estimateMaxSpendable.js +6 -5
  54. package/lib/bridge/estimateMaxSpendable.js.map +1 -1
  55. package/lib/bridge/getFeesForTransaction.d.ts +1 -1
  56. package/lib/bridge/getFeesForTransaction.d.ts.map +1 -1
  57. package/lib/bridge/getFeesForTransaction.js +19 -13
  58. package/lib/bridge/getFeesForTransaction.js.map +1 -1
  59. package/lib/bridge/getTransactionStatus.d.ts.map +1 -1
  60. package/lib/bridge/getTransactionStatus.js +28 -14
  61. package/lib/bridge/getTransactionStatus.js.map +1 -1
  62. package/lib/bridge/index.d.ts +1 -1
  63. package/lib/bridge/index.d.ts.map +1 -1
  64. package/lib/bridge/logic.d.ts +13 -11
  65. package/lib/bridge/logic.d.ts.map +1 -1
  66. package/lib/bridge/logic.js +152 -57
  67. package/lib/bridge/logic.js.map +1 -1
  68. package/lib/bridge/prepareTransaction.d.ts.map +1 -1
  69. package/lib/bridge/prepareTransaction.js +5 -4
  70. package/lib/bridge/prepareTransaction.js.map +1 -1
  71. package/lib/bridge/signOperation.d.ts.map +1 -1
  72. package/lib/bridge/signOperation.js +20 -6
  73. package/lib/bridge/signOperation.js.map +1 -1
  74. package/lib/bridge/synchronisation.d.ts +15 -0
  75. package/lib/bridge/synchronisation.d.ts.map +1 -1
  76. package/lib/bridge/synchronisation.js +129 -6
  77. package/lib/bridge/synchronisation.js.map +1 -1
  78. package/lib/config.d.ts +13 -0
  79. package/lib/config.d.ts.map +1 -0
  80. package/lib/config.js +9 -0
  81. package/lib/config.js.map +1 -0
  82. package/lib/constants.d.ts +9 -1
  83. package/lib/constants.d.ts.map +1 -1
  84. package/lib/constants.js +13 -2
  85. package/lib/constants.js.map +1 -1
  86. package/lib/network/client.d.ts +36 -0
  87. package/lib/network/client.d.ts.map +1 -0
  88. package/lib/network/client.js +247 -0
  89. package/lib/network/client.js.map +1 -0
  90. package/lib/network/graphql/queries.d.ts.map +1 -0
  91. package/lib/{api → network}/graphql/queries.js +6 -6
  92. package/lib/network/graphql/queries.js.map +1 -0
  93. package/lib/{api → network}/graphql/types.d.ts +9 -9
  94. package/lib/network/graphql/types.d.ts.map +1 -0
  95. package/lib/{api → network}/graphql/types.js.map +1 -1
  96. package/lib/network/index.d.ts +2 -1
  97. package/lib/network/index.d.ts.map +1 -1
  98. package/lib/network/index.js +15 -0
  99. package/lib/network/index.js.map +1 -1
  100. package/lib/test/bot-specs.d.ts.map +1 -1
  101. package/lib/test/bot-specs.js +40 -1
  102. package/lib/test/bot-specs.js.map +1 -1
  103. package/lib/test/bridgeDatasetTest.d.ts.map +1 -1
  104. package/lib/test/bridgeDatasetTest.js +44 -62
  105. package/lib/test/bridgeDatasetTest.js.map +1 -1
  106. package/lib/test/speculos-deviceActions.d.ts +1 -0
  107. package/lib/test/speculos-deviceActions.d.ts.map +1 -1
  108. package/lib/test/speculos-deviceActions.js +37 -5
  109. package/lib/test/speculos-deviceActions.js.map +1 -1
  110. package/lib/types/assets.d.ts +12 -0
  111. package/lib/types/assets.d.ts.map +1 -0
  112. package/lib/types/assets.js +3 -0
  113. package/lib/types/assets.js.map +1 -0
  114. package/lib/types/index.d.ts +18 -7
  115. package/lib/types/index.d.ts.map +1 -1
  116. package/lib-es/__tests__/api/index.integ.test.d.ts +2 -0
  117. package/lib-es/__tests__/api/index.integ.test.d.ts.map +1 -0
  118. package/lib-es/__tests__/api/index.integ.test.js +50 -0
  119. package/lib-es/__tests__/api/index.integ.test.js.map +1 -0
  120. package/lib-es/__tests__/api/index.test.js +52 -408
  121. package/lib-es/__tests__/api/index.test.js.map +1 -1
  122. package/lib-es/__tests__/bridge/broadcast.test.js +2 -2
  123. package/lib-es/__tests__/bridge/broadcast.test.js.map +1 -1
  124. package/lib-es/__tests__/bridge/buildTransaction.test.js +60 -5
  125. package/lib-es/__tests__/bridge/buildTransaction.test.js.map +1 -1
  126. package/lib-es/__tests__/bridge/createTransaction.test.js +1 -1
  127. package/lib-es/__tests__/bridge/createTransaction.test.js.map +1 -1
  128. package/lib-es/__tests__/bridge/getFeesForTransaction.test.js +112 -11
  129. package/lib-es/__tests__/bridge/getFeesForTransaction.test.js.map +1 -1
  130. package/lib-es/__tests__/bridge/getTransactionStatus.test.js +177 -39
  131. package/lib-es/__tests__/bridge/getTransactionStatus.test.js.map +1 -1
  132. package/lib-es/__tests__/bridge/logic.test.js +891 -117
  133. package/lib-es/__tests__/bridge/logic.test.js.map +1 -1
  134. package/lib-es/__tests__/bridge/prepareTransaction.test.js +2 -2
  135. package/lib-es/__tests__/bridge/prepareTransaction.test.js.map +1 -1
  136. package/lib-es/__tests__/bridge/signOperation.test.js +131 -4
  137. package/lib-es/__tests__/bridge/signOperation.test.js.map +1 -1
  138. package/lib-es/__tests__/bridge/synchronisation.test.js +1213 -69
  139. package/lib-es/__tests__/bridge/synchronisation.test.js.map +1 -1
  140. package/lib-es/__tests__/network/client.test.d.ts +2 -0
  141. package/lib-es/__tests__/network/client.test.d.ts.map +1 -0
  142. package/lib-es/__tests__/network/client.test.js +515 -0
  143. package/lib-es/__tests__/network/client.test.js.map +1 -0
  144. package/lib-es/api/index.d.ts +4 -30
  145. package/lib-es/api/index.d.ts.map +1 -1
  146. package/lib-es/api/index.js +22 -168
  147. package/lib-es/api/index.js.map +1 -1
  148. package/lib-es/bridge/bridge.fixture.d.ts +2 -0
  149. package/lib-es/bridge/bridge.fixture.d.ts.map +1 -1
  150. package/lib-es/bridge/bridge.fixture.js +82 -12
  151. package/lib-es/bridge/bridge.fixture.js.map +1 -1
  152. package/lib-es/bridge/broadcast.d.ts +3 -2
  153. package/lib-es/bridge/broadcast.d.ts.map +1 -1
  154. package/lib-es/bridge/broadcast.js +4 -3
  155. package/lib-es/bridge/broadcast.js.map +1 -1
  156. package/lib-es/bridge/buildTransaction.d.ts +1 -1
  157. package/lib-es/bridge/buildTransaction.d.ts.map +1 -1
  158. package/lib-es/bridge/buildTransaction.js +30 -4
  159. package/lib-es/bridge/buildTransaction.js.map +1 -1
  160. package/lib-es/bridge/createTransaction.js +1 -1
  161. package/lib-es/bridge/createTransaction.js.map +1 -1
  162. package/lib-es/bridge/estimateMaxSpendable.d.ts.map +1 -1
  163. package/lib-es/bridge/estimateMaxSpendable.js +4 -3
  164. package/lib-es/bridge/estimateMaxSpendable.js.map +1 -1
  165. package/lib-es/bridge/getFeesForTransaction.d.ts +1 -1
  166. package/lib-es/bridge/getFeesForTransaction.d.ts.map +1 -1
  167. package/lib-es/bridge/getFeesForTransaction.js +14 -8
  168. package/lib-es/bridge/getFeesForTransaction.js.map +1 -1
  169. package/lib-es/bridge/getTransactionStatus.d.ts.map +1 -1
  170. package/lib-es/bridge/getTransactionStatus.js +28 -14
  171. package/lib-es/bridge/getTransactionStatus.js.map +1 -1
  172. package/lib-es/bridge/index.d.ts +1 -1
  173. package/lib-es/bridge/index.d.ts.map +1 -1
  174. package/lib-es/bridge/logic.d.ts +13 -11
  175. package/lib-es/bridge/logic.d.ts.map +1 -1
  176. package/lib-es/bridge/logic.js +146 -55
  177. package/lib-es/bridge/logic.js.map +1 -1
  178. package/lib-es/bridge/prepareTransaction.d.ts.map +1 -1
  179. package/lib-es/bridge/prepareTransaction.js +5 -4
  180. package/lib-es/bridge/prepareTransaction.js.map +1 -1
  181. package/lib-es/bridge/signOperation.d.ts.map +1 -1
  182. package/lib-es/bridge/signOperation.js +18 -4
  183. package/lib-es/bridge/signOperation.js.map +1 -1
  184. package/lib-es/bridge/synchronisation.d.ts +15 -0
  185. package/lib-es/bridge/synchronisation.d.ts.map +1 -1
  186. package/lib-es/bridge/synchronisation.js +124 -4
  187. package/lib-es/bridge/synchronisation.js.map +1 -1
  188. package/lib-es/config.d.ts +13 -0
  189. package/lib-es/config.d.ts.map +1 -0
  190. package/lib-es/config.js +4 -0
  191. package/lib-es/config.js.map +1 -0
  192. package/lib-es/constants.d.ts +9 -1
  193. package/lib-es/constants.d.ts.map +1 -1
  194. package/lib-es/constants.js +9 -1
  195. package/lib-es/constants.js.map +1 -1
  196. package/lib-es/network/client.d.ts +36 -0
  197. package/lib-es/network/client.d.ts.map +1 -0
  198. package/lib-es/network/client.js +240 -0
  199. package/lib-es/network/client.js.map +1 -0
  200. package/lib-es/network/graphql/queries.d.ts.map +1 -0
  201. package/lib-es/{api → network}/graphql/queries.js +6 -6
  202. package/lib-es/network/graphql/queries.js.map +1 -0
  203. package/lib-es/{api → network}/graphql/types.d.ts +9 -9
  204. package/lib-es/network/graphql/types.d.ts.map +1 -0
  205. package/lib-es/{api → network}/graphql/types.js.map +1 -1
  206. package/lib-es/network/index.d.ts +2 -1
  207. package/lib-es/network/index.d.ts.map +1 -1
  208. package/lib-es/network/index.js +1 -0
  209. package/lib-es/network/index.js.map +1 -1
  210. package/lib-es/test/bot-specs.d.ts.map +1 -1
  211. package/lib-es/test/bot-specs.js +41 -2
  212. package/lib-es/test/bot-specs.js.map +1 -1
  213. package/lib-es/test/bridgeDatasetTest.d.ts.map +1 -1
  214. package/lib-es/test/bridgeDatasetTest.js +44 -59
  215. package/lib-es/test/bridgeDatasetTest.js.map +1 -1
  216. package/lib-es/test/speculos-deviceActions.d.ts +1 -0
  217. package/lib-es/test/speculos-deviceActions.d.ts.map +1 -1
  218. package/lib-es/test/speculos-deviceActions.js +36 -4
  219. package/lib-es/test/speculos-deviceActions.js.map +1 -1
  220. package/lib-es/types/assets.d.ts +12 -0
  221. package/lib-es/types/assets.d.ts.map +1 -0
  222. package/lib-es/types/assets.js +2 -0
  223. package/lib-es/types/assets.js.map +1 -0
  224. package/lib-es/types/index.d.ts +18 -7
  225. package/lib-es/types/index.d.ts.map +1 -1
  226. package/package.json +12 -9
  227. package/src/__tests__/api/index.integ.test.ts +58 -0
  228. package/src/__tests__/api/index.test.ts +60 -477
  229. package/src/__tests__/bridge/broadcast.test.ts +2 -2
  230. package/src/__tests__/bridge/buildTransaction.test.ts +87 -5
  231. package/src/__tests__/bridge/createTransaction.test.ts +1 -1
  232. package/src/__tests__/bridge/getFeesForTransaction.test.ts +146 -11
  233. package/src/__tests__/bridge/getTransactionStatus.test.ts +217 -38
  234. package/src/__tests__/bridge/logic.test.ts +922 -118
  235. package/src/__tests__/bridge/prepareTransaction.test.ts +2 -2
  236. package/src/__tests__/bridge/signOperation.test.ts +147 -5
  237. package/src/__tests__/bridge/synchronisation.test.ts +1265 -71
  238. package/src/__tests__/network/client.test.ts +618 -0
  239. package/src/api/index.ts +31 -223
  240. package/src/bridge/bridge.fixture.ts +91 -12
  241. package/src/bridge/broadcast.ts +7 -7
  242. package/src/bridge/buildTransaction.ts +40 -7
  243. package/src/bridge/createTransaction.ts +1 -1
  244. package/src/bridge/estimateMaxSpendable.ts +4 -3
  245. package/src/bridge/getFeesForTransaction.ts +16 -10
  246. package/src/bridge/getTransactionStatus.ts +35 -13
  247. package/src/bridge/index.ts +1 -1
  248. package/src/bridge/logic.ts +202 -67
  249. package/src/bridge/prepareTransaction.ts +7 -4
  250. package/src/bridge/signOperation.ts +20 -4
  251. package/src/bridge/synchronisation.ts +171 -4
  252. package/src/config.ts +19 -0
  253. package/src/constants.ts +17 -1
  254. package/src/network/client.ts +315 -0
  255. package/src/{api → network}/graphql/queries.ts +6 -6
  256. package/src/{api → network}/graphql/types.ts +9 -9
  257. package/src/network/index.ts +2 -1
  258. package/src/test/bot-specs.ts +63 -3
  259. package/src/test/bridgeDatasetTest.ts +46 -59
  260. package/src/test/speculos-deviceActions.ts +40 -4
  261. package/src/types/assets.ts +15 -0
  262. package/src/types/index.ts +15 -1
  263. package/lib/api/graphql/queries.d.ts.map +0 -1
  264. package/lib/api/graphql/queries.js.map +0 -1
  265. package/lib/api/graphql/types.d.ts.map +0 -1
  266. package/lib-es/api/graphql/queries.d.ts.map +0 -1
  267. package/lib-es/api/graphql/queries.js.map +0 -1
  268. package/lib-es/api/graphql/types.d.ts.map +0 -1
  269. /package/lib/{api → network}/graphql/queries.d.ts +0 -0
  270. /package/lib/{api → network}/graphql/types.js +0 -0
  271. /package/lib-es/{api → network}/graphql/queries.d.ts +0 -0
  272. /package/lib-es/{api → network}/graphql/types.js +0 -0
package/src/api/index.ts CHANGED
@@ -1,225 +1,33 @@
1
- import { ApolloClient, InMemoryCache } from "@apollo/client";
2
-
3
- import {
4
- AccountData,
5
- Aptos,
6
- AptosApiType,
7
- AptosConfig,
8
- Ed25519PublicKey,
9
- GasEstimation,
10
- InputEntryFunctionData,
11
- InputGenerateTransactionOptions,
12
- MimeType,
13
- post,
14
- RawTransaction,
15
- SimpleTransaction,
16
- TransactionResponse,
17
- UserTransactionResponse,
18
- PostRequestOptions,
19
- Block,
20
- } from "@aptos-labs/ts-sdk";
21
- import { getEnv } from "@ledgerhq/live-env";
22
- import network from "@ledgerhq/live-network";
23
- import BigNumber from "bignumber.js";
24
- import isUndefined from "lodash/isUndefined";
25
- import { APTOS_ASSET_ID } from "../constants";
26
- import { isTestnet } from "../bridge/logic";
27
- import type { AptosTransaction, TransactionOptions } from "../types";
28
- import { GetAccountTransactionsData, GetAccountTransactionsDataGt } from "./graphql/queries";
29
- import {
30
- GetAccountTransactionsDataQuery,
31
- GetAccountTransactionsDataGtQueryVariables,
32
- } from "./graphql/types";
33
-
34
- const getApiEndpoint = (currencyId: string) =>
35
- isTestnet(currencyId) ? getEnv("APTOS_TESTNET_API_ENDPOINT") : getEnv("APTOS_API_ENDPOINT");
36
- const getIndexerEndpoint = (currencyId: string) =>
37
- isTestnet(currencyId)
38
- ? getEnv("APTOS_TESTNET_INDEXER_ENDPOINT")
39
- : getEnv("APTOS_INDEXER_ENDPOINT");
40
-
41
- export class AptosAPI {
42
- private apiUrl: string;
43
- private indexerUrl: string;
44
- private aptosConfig: AptosConfig;
45
- private aptosClient: Aptos;
46
- private apolloClient: ApolloClient<object>;
47
-
48
- constructor(currencyId: string) {
49
- this.apiUrl = getApiEndpoint(currencyId);
50
- this.indexerUrl = getIndexerEndpoint(currencyId);
51
- this.aptosConfig = new AptosConfig({
52
- fullnode: this.apiUrl,
53
- indexer: this.indexerUrl,
54
- });
55
- this.aptosClient = new Aptos(this.aptosConfig);
56
- this.apolloClient = new ApolloClient({
57
- uri: this.indexerUrl,
58
- cache: new InMemoryCache(),
59
- headers: {
60
- "x-client": "ledger-live",
61
- },
62
- });
63
- }
64
-
65
- async getAccount(address: string): Promise<AccountData> {
66
- return this.aptosClient.getAccountInfo({ accountAddress: address });
67
- }
68
-
69
- async getAccountInfo(address: string, startAt: string) {
70
- const [balance, transactions, blockHeight] = await Promise.all([
71
- this.getBalance(address),
72
- this.fetchTransactions(address, startAt),
73
- this.getHeight(),
74
- ]);
75
-
76
- return {
77
- balance,
78
- transactions,
79
- blockHeight,
80
- };
81
- }
82
-
83
- async estimateGasPrice(): Promise<GasEstimation> {
84
- return this.aptosClient.getGasPriceEstimation();
85
- }
86
-
87
- async generateTransaction(
88
- address: string,
89
- payload: InputEntryFunctionData,
90
- options: TransactionOptions,
91
- ): Promise<RawTransaction> {
92
- const opts: Partial<InputGenerateTransactionOptions> = {};
93
- if (!isUndefined(options.maxGasAmount)) {
94
- opts.maxGasAmount = Number(options.maxGasAmount);
95
- }
96
-
97
- if (!isUndefined(options.gasUnitPrice)) {
98
- opts.gasUnitPrice = Number(options.gasUnitPrice);
99
- }
100
-
101
- try {
102
- const { ledger_timestamp } = await this.aptosClient.getLedgerInfo();
103
- opts.expireTimestamp = Number(Math.ceil(+ledger_timestamp / 1_000_000 + 2 * 60)); // in milliseconds
104
- } catch {
105
- // skip
106
- }
107
-
108
- return this.aptosClient.transaction.build
109
- .simple({
110
- sender: address,
111
- data: payload,
112
- options: opts,
113
- })
114
- .then(t => t.rawTransaction)
115
- .catch(error => {
116
- throw error;
117
- });
118
- }
119
-
120
- async simulateTransaction(
121
- address: Ed25519PublicKey,
122
- tx: RawTransaction,
123
- options = {
124
- estimateGasUnitPrice: true,
125
- estimateMaxGasAmount: true,
126
- estimatePrioritizedGasUnitPrice: false,
1
+ import type { Api } from "@ledgerhq/coin-framework/api/index";
2
+ import type { AptosConfig as AptosConfigApi } from "../config";
3
+ import type { Balance, Operation, TransactionIntent } from "@ledgerhq/coin-framework/api/types";
4
+ import coinConfig from "../config";
5
+ import type { AptosAsset, AptosExtra, AptosFeeParameters, AptosSender } from "../types/assets";
6
+ import { AptosAPI } from "../network";
7
+
8
+ export function createApi(
9
+ config: AptosConfigApi,
10
+ ): Api<AptosAsset, AptosExtra, AptosSender, AptosFeeParameters> {
11
+ coinConfig.setCoinConfig(() => ({ ...config, status: { type: "active" } }));
12
+
13
+ const client = new AptosAPI(config.aptosSettings);
14
+
15
+ return {
16
+ broadcast: (tx: string) => client.broadcast(tx),
17
+ combine: (_tx, _signature, _pubkey): string => {
18
+ throw new Error("Not Implemented");
127
19
  },
128
- ): Promise<UserTransactionResponse[]> {
129
- return this.aptosClient.transaction.simulate.simple({
130
- signerPublicKey: address,
131
- transaction: { rawTransaction: tx } as SimpleTransaction,
132
- options,
133
- });
134
- }
135
-
136
- async broadcast(signature: string): Promise<string> {
137
- const txBytes = Uint8Array.from(Buffer.from(signature, "hex"));
138
- const pendingTx = await post<PostRequestOptions, TransactionResponse>({
139
- contentType: MimeType.BCS_SIGNED_TRANSACTION,
140
- aptosConfig: this.aptosClient.config,
141
- body: txBytes,
142
- path: "transactions",
143
- type: AptosApiType.FULLNODE,
144
- originMethod: "",
145
- });
146
- return pendingTx.data.hash;
147
- }
148
-
149
- private async getBalance(address: string): Promise<BigNumber> {
150
- try {
151
- const [balanceStr] = await this.aptosClient.view<[string]>({
152
- payload: {
153
- function: "0x1::coin::balance",
154
- typeArguments: [APTOS_ASSET_ID],
155
- functionArguments: [address],
156
- },
157
- });
158
- const balance = parseInt(balanceStr, 10);
159
- return new BigNumber(balance);
160
- } catch (_) {
161
- return new BigNumber(0);
162
- }
163
- }
164
-
165
- private async fetchTransactions(address: string, gt?: string) {
166
- if (!address) {
167
- return [];
168
- }
169
-
170
- let query = GetAccountTransactionsData;
171
- if (gt) {
172
- query = GetAccountTransactionsDataGt;
173
- }
174
-
175
- const queryResponse = await this.apolloClient.query<
176
- GetAccountTransactionsDataQuery,
177
- GetAccountTransactionsDataGtQueryVariables
178
- >({
179
- query,
180
- variables: {
181
- address,
182
- limit: 1000,
183
- gt,
184
- },
185
- fetchPolicy: "network-only",
186
- });
187
-
188
- return Promise.all(
189
- queryResponse.data.address_version_from_move_resources.map(({ transaction_version }) => {
190
- return this.richItemByVersion(transaction_version);
191
- }),
192
- );
193
- }
194
-
195
- private async richItemByVersion(version: number): Promise<AptosTransaction | null> {
196
- try {
197
- const tx: TransactionResponse = await this.aptosClient.getTransactionByVersion({
198
- ledgerVersion: version,
199
- });
200
- const block = await this.getBlock(version);
201
- return {
202
- ...tx,
203
- block,
204
- } as AptosTransaction;
205
- } catch (error) {
206
- return null;
207
- }
208
- }
209
-
210
- private async getHeight(): Promise<number> {
211
- const { data } = await network<Block>({
212
- method: "GET",
213
- url: this.apiUrl,
214
- });
215
- return parseInt(data.block_height);
216
- }
217
-
218
- private async getBlock(version: number) {
219
- const block = await this.aptosClient.getBlockByVersion({ ledgerVersion: version });
220
- return {
221
- height: parseInt(block.block_height),
222
- hash: block.block_hash,
223
- };
224
- }
20
+ craftTransaction: (_transactionIntent, _customFees): Promise<string> => {
21
+ throw new Error("Not Implemented");
22
+ },
23
+ estimateFees: (transactionIntent: TransactionIntent<AptosAsset, AptosExtra, AptosSender>) =>
24
+ client.estimateFees(transactionIntent),
25
+ getBalance: (_address): Promise<Balance<AptosAsset>[]> => {
26
+ throw new Error("Not Implemented");
27
+ },
28
+ lastBlock: () => client.getLastBlock(),
29
+ listOperations: (_address, _pagination): Promise<[Operation<AptosAsset>[], string]> => {
30
+ throw new Error("Not Implemented");
31
+ },
32
+ };
225
33
  }
@@ -3,6 +3,7 @@ import { faker } from "@faker-js/faker";
3
3
  import type { AptosAccount, Transaction } from "../types/index";
4
4
  import { getCryptoCurrencyById } from "@ledgerhq/cryptoassets/currencies";
5
5
  import { emptyHistoryCache } from "@ledgerhq/coin-framework/account/index";
6
+ import { TokenCurrency } from "@ledgerhq/types-cryptoassets";
6
7
 
7
8
  const currency = getCryptoCurrencyById("aptos");
8
9
 
@@ -18,35 +19,113 @@ export function createFixtureAccount(account?: Partial<AptosAccount>): AptosAcco
18
19
  seedIdentifier: faker.string.uuid(),
19
20
  derivationMode: "",
20
21
  index: faker.number.int(),
21
- freshAddress: account?.freshAddress || freshAddress.address,
22
- freshAddressPath: account?.freshAddressPath || freshAddress.derivationPath,
22
+ freshAddress: freshAddress.address,
23
+ freshAddressPath: freshAddress.derivationPath,
23
24
  used: true,
24
- balance: account?.balance || new BigNumber(0),
25
- spendableBalance: account?.spendableBalance || new BigNumber(0),
25
+ balance: new BigNumber(0),
26
+ spendableBalance: new BigNumber(0),
26
27
  creationDate: faker.date.past(),
27
28
  blockHeight: faker.number.int({ min: 100_000, max: 200_000 }),
28
29
  currency,
29
- operationsCount: account?.operationsCount || 0,
30
- operations: account?.operations || [],
31
- pendingOperations: account?.pendingOperations || [],
30
+ operationsCount: 0,
31
+ operations: [],
32
+ pendingOperations: [],
32
33
  lastSyncDate: new Date(),
33
34
  balanceHistoryCache: emptyHistoryCache,
34
35
  swapHistory: [],
36
+ ...account,
37
+ };
38
+ }
39
+
40
+ export function createFixtureAccountWithSubAccount(
41
+ tokenType: string,
42
+ account?: Partial<AptosAccount>,
43
+ ): AptosAccount {
44
+ const freshAddress = {
45
+ address: "address",
46
+ derivationPath: "derivation_path",
47
+ };
48
+
49
+ const id = faker.string.uuid();
50
+
51
+ return {
52
+ type: "Account",
53
+ id,
54
+ seedIdentifier: faker.string.uuid(),
55
+ derivationMode: "",
56
+ index: faker.number.int(),
57
+ freshAddress: freshAddress.address,
58
+ freshAddressPath: freshAddress.derivationPath,
59
+ used: true,
60
+ balance: new BigNumber(0),
61
+ spendableBalance: new BigNumber(0),
62
+ creationDate: faker.date.past(),
63
+ blockHeight: faker.number.int({ min: 100_000, max: 200_000 }),
64
+ currency,
65
+ operationsCount: 0,
66
+ operations: [],
67
+ pendingOperations: [],
68
+ lastSyncDate: new Date(),
69
+ balanceHistoryCache: emptyHistoryCache,
70
+ swapHistory: [],
71
+ subAccounts: [
72
+ {
73
+ id: "1",
74
+ parentId: id,
75
+ type: "TokenAccount",
76
+ token: {
77
+ type: "TokenCurrency",
78
+ id: "aptToken",
79
+ contractAddress: "contract_address",
80
+ parentCurrency: currency,
81
+ tokenType,
82
+ } as TokenCurrency,
83
+ balance: BigNumber(1000),
84
+ spendableBalance: BigNumber(1000),
85
+ creationDate: new Date(),
86
+ operationsCount: 0,
87
+ operations: [],
88
+ pendingOperations: [],
89
+ balanceHistoryCache: emptyHistoryCache,
90
+ swapHistory: [],
91
+ },
92
+ ],
93
+ ...account,
35
94
  };
36
95
  }
37
96
 
38
97
  export function createFixtureTransaction(tx?: Partial<Transaction>): Transaction {
39
98
  const transaction: Transaction = {
40
- amount: tx?.amount || new BigNumber(0),
41
- recipient: tx?.recipient || "",
42
- useAllAmount: tx?.useAllAmount || false,
99
+ amount: new BigNumber(0),
100
+ recipient: "recipient",
101
+ useAllAmount: false,
102
+ family: "aptos",
103
+ mode: "send",
104
+ fees: null,
105
+ options: {
106
+ maxGasAmount: BigNumber(0).toString(),
107
+ gasUnitPrice: BigNumber(0).toString(),
108
+ },
109
+ ...tx,
110
+ };
111
+
112
+ return transaction;
113
+ }
114
+
115
+ export function createFixtureTransactionWithSubAccount(tx?: Partial<Transaction>): Transaction {
116
+ const transaction: Transaction = {
117
+ amount: new BigNumber(0),
118
+ recipient: "recipient",
119
+ useAllAmount: false,
43
120
  family: "aptos",
44
- mode: tx?.mode || "send",
45
- fees: tx?.fees || null,
121
+ mode: "send",
122
+ fees: null,
46
123
  options: {
47
124
  maxGasAmount: BigNumber(0).toString(),
48
125
  gasUnitPrice: BigNumber(0).toString(),
49
126
  },
127
+ subAccountId: "1",
128
+ ...tx,
50
129
  };
51
130
 
52
131
  return transaction;
@@ -1,16 +1,16 @@
1
1
  import type { Account, Operation, SignedOperation } from "@ledgerhq/types-live";
2
2
  import { patchOperationWithHash } from "@ledgerhq/coin-framework/operation";
3
- import { AptosAPI } from "../api";
3
+ import { AptosAPI } from "../network";
4
4
 
5
- const broadcast = async ({
6
- signedOperation,
7
- account,
8
- }: {
5
+ type broadcastFunc = {
9
6
  signedOperation: SignedOperation;
10
7
  account: Account;
11
- }): Promise<Operation> => {
8
+ };
9
+
10
+ const broadcast = async ({ signedOperation, account }: broadcastFunc): Promise<Operation> => {
12
11
  const { signature, operation } = signedOperation;
13
- const hash = await new AptosAPI(account.currency.id).broadcast(signature);
12
+ const client = new AptosAPI(account.currency.id);
13
+ const hash = await client.broadcast(signature);
14
14
  return patchOperationWithHash(operation, hash);
15
15
  };
16
16
 
@@ -1,8 +1,8 @@
1
1
  import { InputEntryFunctionData, RawTransaction } from "@aptos-labs/ts-sdk";
2
- import type { Account } from "@ledgerhq/types-live";
3
- import BigNumber from "bignumber.js";
4
- import { AptosAPI } from "../api";
5
- import { APTOS_ASSET_ID } from "../constants";
2
+ import type { Account, TokenAccount } from "@ledgerhq/types-live";
3
+ import { findSubAccountById, isTokenAccount } from "@ledgerhq/coin-framework/account/index";
4
+ import { APTOS_ASSET_ID, SUPPORTED_TOKEN_TYPES } from "../constants";
5
+ import { AptosAPI } from "../network";
6
6
  import { normalizeTransactionOptions } from "./logic";
7
7
  import type { Transaction } from "../types";
8
8
 
@@ -11,18 +11,51 @@ const buildTransaction = async (
11
11
  transaction: Transaction,
12
12
  aptosClient: AptosAPI,
13
13
  ): Promise<RawTransaction> => {
14
- const txPayload = getPayload(transaction.recipient, transaction.amount);
14
+ const subAccount = findSubAccountById(account, transaction.subAccountId ?? "");
15
+
16
+ const txPayload = getPayload(subAccount, transaction);
15
17
  const txOptions = normalizeTransactionOptions(transaction.options);
16
18
  const tx = await aptosClient.generateTransaction(account.freshAddress, txPayload, txOptions);
17
19
 
18
20
  return tx;
19
21
  };
20
22
 
21
- const getPayload = (sendTo: string, amount: BigNumber): InputEntryFunctionData => {
23
+ const getPayload = (
24
+ tokenAccount: TokenAccount | undefined,
25
+ transaction: Transaction,
26
+ ): InputEntryFunctionData => {
27
+ if (tokenAccount && isTokenAccount(tokenAccount)) {
28
+ const { tokenType } = tokenAccount.token;
29
+
30
+ if (!SUPPORTED_TOKEN_TYPES.includes(tokenType)) {
31
+ throw new Error(`Token type ${tokenType} not supported`);
32
+ }
33
+
34
+ if (tokenType === "fungible_asset") {
35
+ return {
36
+ function: `0x1::primary_fungible_store::transfer`,
37
+ typeArguments: ["0x1::fungible_asset::Metadata"],
38
+ functionArguments: [
39
+ tokenAccount.token.contractAddress,
40
+ transaction.recipient,
41
+ transaction.amount.toString(),
42
+ ],
43
+ };
44
+ }
45
+
46
+ if (tokenType === "coin") {
47
+ return {
48
+ function: `0x1::aptos_account::transfer_coins`,
49
+ typeArguments: [tokenAccount.token.contractAddress],
50
+ functionArguments: [transaction.recipient, transaction.amount.toString()],
51
+ };
52
+ }
53
+ }
54
+
22
55
  return {
23
56
  function: "0x1::aptos_account::transfer_coins",
24
57
  typeArguments: [APTOS_ASSET_ID],
25
- functionArguments: [sendTo, amount.toString()],
58
+ functionArguments: [transaction.recipient, transaction.amount.toString()],
26
59
  };
27
60
  };
28
61
 
@@ -1,6 +1,6 @@
1
1
  import BigNumber from "bignumber.js";
2
2
  import type { Transaction } from "../types";
3
- import { DEFAULT_GAS, DEFAULT_GAS_PRICE } from "./logic";
3
+ import { DEFAULT_GAS, DEFAULT_GAS_PRICE } from "../constants";
4
4
 
5
5
  const createTransaction = (): Transaction => ({
6
6
  family: "aptos",
@@ -1,9 +1,10 @@
1
1
  import type { Account, AccountLike } from "@ledgerhq/types-live";
2
2
  import { BigNumber } from "bignumber.js";
3
3
  import { getMainAccount } from "@ledgerhq/coin-framework/account/index";
4
- import { AptosAPI } from "../api";
4
+ import { AptosAPI } from "../network";
5
5
  import { getEstimatedGas } from "./getFeesForTransaction";
6
- import { DEFAULT_GAS, DEFAULT_GAS_PRICE, getMaxSendBalance } from "./logic";
6
+ import { getMaxSendBalance } from "./logic";
7
+ import { DEFAULT_GAS, DEFAULT_GAS_PRICE } from "../constants";
7
8
  import type { Transaction } from "../types";
8
9
 
9
10
  const estimateMaxSpendable = async ({
@@ -29,7 +30,7 @@ const estimateMaxSpendable = async ({
29
30
  gasUnitPrice = BigNumber(estimate.gasUnitPrice);
30
31
  }
31
32
 
32
- return getMaxSendBalance(mainAccount.spendableBalance, maxGasAmount, gasUnitPrice);
33
+ return getMaxSendBalance(maxGasAmount, gasUnitPrice, mainAccount, transaction);
33
34
  };
34
35
 
35
36
  export default estimateMaxSpendable;
@@ -3,9 +3,10 @@ import { log } from "@ledgerhq/logs";
3
3
  import type { Account } from "@ledgerhq/types-live";
4
4
  import BigNumber from "bignumber.js";
5
5
  import { makeLRUCache, seconds } from "@ledgerhq/live-network/cache";
6
- import { AptosAPI } from "../api";
6
+ import { AptosAPI } from "../network";
7
7
  import buildTransaction from "./buildTransaction";
8
- import { DEFAULT_GAS, DEFAULT_GAS_PRICE, ESTIMATE_GAS_MUL } from "./logic";
8
+ import { getTokenAccount } from "./logic";
9
+ import { DEFAULT_GAS, DEFAULT_GAS_PRICE, ESTIMATE_GAS_MUL } from "../constants";
9
10
  import type { Transaction, TransactionErrors } from "../types";
10
11
 
11
12
  type IGetEstimatedGasReturnType = {
@@ -49,16 +50,18 @@ export const getFee = async (
49
50
 
50
51
  const expectedGas = gasPrice.multipliedBy(gasLimit);
51
52
 
52
- const isUnderMaxSpendable = transaction.amount
53
- .plus(expectedGas)
54
- .isLessThan(account.spendableBalance);
55
-
56
- if (isUnderMaxSpendable && !completedTx.success) {
57
- // we want to skip INSUFFICIENT_BALANCE error because it will be processed by getTransactionStatus
58
- if (!completedTx.vm_status.includes("INSUFFICIENT_BALANCE")) {
53
+ if (!completedTx.success) {
54
+ if (completedTx.vm_status.includes("MAX_GAS_UNITS_BELOW_MIN_TRANSACTION_GAS_UNITS")) {
55
+ res.errors.maxGasAmount = "GasInsufficientBalance";
56
+ } else if (
57
+ !completedTx.vm_status.includes("INSUFFICIENT_BALANCE") &&
58
+ !completedTx.vm_status.includes("0x203ed") // 0x203ed -> PROLOGUE_ECANT_PAY_GAS_DEPOSIT equivalent to INSUFFICIENT_BALANCE_FOR_TRANSACTION_FEE
59
+ ) {
60
+ // INSUFFICIENT_BALANCE will be processed by getTransactionStatus
59
61
  throw Error(`Simulation failed with following error: ${completedTx.vm_status}`);
60
62
  }
61
63
  }
64
+
62
65
  res.fees = expectedGas;
63
66
  res.estimate.maxGasAmount = gasLimit.toString();
64
67
  res.estimate.gasUnitPrice = completedTx.gas_unit_price;
@@ -72,7 +75,10 @@ export const getFee = async (
72
75
 
73
76
  const CACHE = makeLRUCache(
74
77
  getFee,
75
- (account: Account, transaction: Transaction) => `${account.id}-${transaction.amount.toString()}}`,
78
+ (account: Account, transaction: Transaction) => {
79
+ const tokenAccount = getTokenAccount(account, transaction);
80
+ return `${tokenAccount ? tokenAccount.id : account.id}-${transaction.amount.toString()}}`;
81
+ },
76
82
  seconds(30),
77
83
  );
78
84
 
@@ -1,4 +1,3 @@
1
- import { BigNumber } from "bignumber.js";
2
1
  import {
3
2
  NotEnoughBalance,
4
3
  RecipientRequired,
@@ -6,40 +5,63 @@ import {
6
5
  FeeNotLoaded,
7
6
  InvalidAddressBecauseDestinationIsAlsoSource,
8
7
  AmountRequired,
8
+ NotEnoughBalanceFees,
9
9
  } from "@ledgerhq/errors";
10
10
  import type { Account } from "@ledgerhq/types-live";
11
+ import { BigNumber } from "bignumber.js";
11
12
  import type { Transaction, TransactionStatus } from "../types";
12
13
 
13
14
  import { AccountAddress } from "@aptos-labs/ts-sdk";
15
+ import { getTokenAccount } from "./logic";
14
16
 
15
17
  const getTransactionStatus = async (a: Account, t: Transaction): Promise<TransactionStatus> => {
16
18
  const errors: Record<string, Error> = {};
17
19
  const warnings = {};
18
20
 
21
+ if (!t.recipient) {
22
+ errors.recipient = new RecipientRequired();
23
+ }
24
+
25
+ if (!AccountAddress.isValid({ input: t.recipient }).valid && !errors.recipient) {
26
+ errors.recipient = new InvalidAddress("", { currencyName: a.currency.name });
27
+ }
28
+
29
+ if (t.recipient === a.freshAddress && !errors.recipient) {
30
+ errors.recipient = new InvalidAddressBecauseDestinationIsAlsoSource();
31
+ }
32
+
19
33
  if (!t.fees) {
20
34
  errors.fees = new FeeNotLoaded();
21
35
  }
22
36
 
23
37
  const estimatedFees = t.fees || BigNumber(0);
24
38
 
25
- if (t.amount.eq(0)) {
39
+ if (t.amount.lte(0)) {
26
40
  errors.amount = new AmountRequired();
27
41
  }
28
42
 
29
- const amount = t.amount;
43
+ const tokenAccount = getTokenAccount(a, t);
30
44
 
31
- const totalSpent = BigNumber(t.amount).plus(estimatedFees);
45
+ const amount = t.useAllAmount
46
+ ? tokenAccount
47
+ ? tokenAccount.spendableBalance
48
+ : a.spendableBalance.minus(estimatedFees).isLessThan(0)
49
+ ? BigNumber(0)
50
+ : a.spendableBalance.minus(estimatedFees)
51
+ : t.amount;
32
52
 
33
- if (totalSpent.gt(a.balance) && !errors.amount) {
34
- errors.amount = new NotEnoughBalance();
35
- }
53
+ const totalSpent = tokenAccount ? amount : amount.plus(estimatedFees);
36
54
 
37
- if (!t.recipient) {
38
- errors.recipient = new RecipientRequired();
39
- } else if (AccountAddress.isValid({ input: t.recipient }).valid === false && !errors.recipient) {
40
- errors.recipient = new InvalidAddress("", { currencyName: a.currency.name });
41
- } else if (t.recipient === a.freshAddress && !errors.recipient) {
42
- errors.recipient = new InvalidAddressBecauseDestinationIsAlsoSource();
55
+ if (tokenAccount && t.errors?.maxGasAmount == "GasInsufficientBalance" && !errors.amount) {
56
+ errors.amount = new NotEnoughBalanceFees();
57
+ }
58
+ if (
59
+ tokenAccount
60
+ ? tokenAccount.spendableBalance.isLessThan(totalSpent) ||
61
+ a.spendableBalance.isLessThan(estimatedFees)
62
+ : a.spendableBalance.isLessThan(totalSpent) && !errors.amount
63
+ ) {
64
+ errors.amount = new NotEnoughBalance();
43
65
  }
44
66
 
45
67
  return Promise.resolve({
@@ -6,7 +6,7 @@ import {
6
6
  updateTransaction,
7
7
  } from "@ledgerhq/coin-framework/bridge/jsHelpers";
8
8
  import getAddressWrapper from "@ledgerhq/coin-framework/bridge/getAddressWrapper";
9
- import { SignerContext } from "@ledgerhq/coin-framework/signer";
9
+ import type { SignerContext } from "@ledgerhq/coin-framework/signer";
10
10
  import type { Account, AccountBridge, CurrencyBridge } from "@ledgerhq/types-live";
11
11
  import resolver from "../signer";
12
12
  import type { Transaction, TransactionStatus, AptosSigner } from "../types";