@ledgerhq/coin-solana 0.36.0 → 0.37.0-nightly.20251108023448
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +15 -0
- package/lib/cli-transaction.d.ts +1 -1
- package/lib/cli-transaction.d.ts.map +1 -1
- package/lib/cli-transaction.js +3 -3
- package/lib/cli-transaction.js.map +1 -1
- package/lib/helpers/token.d.ts +1 -1
- package/lib/helpers/token.d.ts.map +1 -1
- package/lib/helpers/token.js +3 -2
- package/lib/helpers/token.js.map +1 -1
- package/lib/preload.js +5 -5
- package/lib/preload.js.map +1 -1
- package/lib/prepareTransaction.js +3 -3
- package/lib/prepareTransaction.js.map +1 -1
- package/lib/signOperation.js +2 -2
- package/lib/signOperation.js.map +1 -1
- package/lib/synchronization.d.ts.map +1 -1
- package/lib/synchronization.js +13 -10
- package/lib/synchronization.js.map +1 -1
- package/lib/test/bridge.dataset.d.ts.map +1 -1
- package/lib/test/bridge.dataset.js +11 -2
- package/lib/test/bridge.dataset.js.map +1 -1
- package/lib/transaction.d.ts +2 -2
- package/lib/transaction.d.ts.map +1 -1
- package/lib/transaction.js +6 -6
- package/lib/transaction.js.map +1 -1
- package/lib-es/cli-transaction.d.ts +1 -1
- package/lib-es/cli-transaction.d.ts.map +1 -1
- package/lib-es/cli-transaction.js +3 -3
- package/lib-es/cli-transaction.js.map +1 -1
- package/lib-es/helpers/token.d.ts +1 -1
- package/lib-es/helpers/token.d.ts.map +1 -1
- package/lib-es/helpers/token.js +3 -2
- package/lib-es/helpers/token.js.map +1 -1
- package/lib-es/preload.js +1 -1
- package/lib-es/preload.js.map +1 -1
- package/lib-es/prepareTransaction.js +3 -3
- package/lib-es/prepareTransaction.js.map +1 -1
- package/lib-es/signOperation.js +2 -2
- package/lib-es/signOperation.js.map +1 -1
- package/lib-es/synchronization.d.ts.map +1 -1
- package/lib-es/synchronization.js +13 -10
- package/lib-es/synchronization.js.map +1 -1
- package/lib-es/test/bridge.dataset.d.ts.map +1 -1
- package/lib-es/test/bridge.dataset.js +11 -2
- package/lib-es/test/bridge.dataset.js.map +1 -1
- package/lib-es/transaction.d.ts +2 -2
- package/lib-es/transaction.d.ts.map +1 -1
- package/lib-es/transaction.js +6 -6
- package/lib-es/transaction.js.map +1 -1
- package/package.json +4 -4
- package/src/cli-transaction.ts +106 -104
- package/src/helpers/token.ts +3 -4
- package/src/preload.ts +1 -1
- package/src/prepareTransaction.ts +3 -3
- package/src/signOperation.ts +2 -2
- package/src/synchronization.ts +16 -13
- package/src/test/bridge.dataset.ts +11 -5
- package/src/tests/preload.unit.test.ts +27 -29
- package/src/tests/tokens-bridge.unit.test.ts +14 -6
- package/src/transaction.ts +13 -6
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transaction.js","sourceRoot":"","sources":["../src/transaction.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAgBzC,OAAO,EAAE,uBAAuB,EAAE,MAAM,qCAAqC,CAAC;AAC9E,OAAO,EACL,wBAAwB,EACxB,8BAA8B,IAAI,wBAAwB,EAC1D,sBAAsB,EACtB,4BAA4B,IAAI,sBAAsB,GACvD,MAAM,wCAAwC,CAAC;AAEhD,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AAC1F,OAAO,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AACzE,OAAO,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAC5C,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAE3D,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,EAAkB,EAAe,EAAE;IACpE,MAAM,MAAM,GAAG,wBAAwB,CAAC,EAAE,CAAC,CAAC;IAC5C,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;IAC7B,OAAO;QACL,GAAG,MAAM;QACT,MAAM;QACN,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;KACzB,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAc,EAAkB,EAAE;IACjE,MAAM,MAAM,GAAG,sBAAsB,CAAC,CAAC,CAAC,CAAC;IACzC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;IAC5B,OAAO;QACL,GAAG,MAAM;QACT,MAAM;QACN,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;KAC7B,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,aAAa,GAAG,CAAC,OAAgB,EAAE,MAAc,EAAE,EAAE;IACzD,OAAO,kBAAkB,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,SAAS,CAAC,MAAM,CAAC,EAAE;QACrF,QAAQ,EAAE,IAAI;QACd,eAAe,EAAE,IAAI;KACtB,CAAC,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,iBAAiB,GAAG,
|
|
1
|
+
{"version":3,"file":"transaction.js","sourceRoot":"","sources":["../src/transaction.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ledgerhq/coin-solana",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.37.0-nightly.20251108023448",
|
|
4
4
|
"description": "Ledger Solana Coin integration",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"Ledger",
|
|
@@ -56,15 +56,15 @@
|
|
|
56
56
|
"rxjs": "^7.8.1",
|
|
57
57
|
"semver": "7.7.1",
|
|
58
58
|
"superstruct": "0.16.7",
|
|
59
|
-
"@ledgerhq/
|
|
59
|
+
"@ledgerhq/coin-framework": "^6.9.0-nightly.20251108023448",
|
|
60
|
+
"@ledgerhq/cryptoassets": "^13.33.0-nightly.20251108023448",
|
|
60
61
|
"@ledgerhq/devices": "8.7.0",
|
|
61
|
-
"@ledgerhq/coin-framework": "^6.8.0",
|
|
62
62
|
"@ledgerhq/errors": "^6.27.0",
|
|
63
63
|
"@ledgerhq/live-env": "^2.20.0",
|
|
64
64
|
"@ledgerhq/live-network": "^2.1.0",
|
|
65
65
|
"@ledgerhq/logs": "^6.13.0",
|
|
66
66
|
"@ledgerhq/types-cryptoassets": "^7.30.0",
|
|
67
|
-
"@ledgerhq/types-live": "^6.
|
|
67
|
+
"@ledgerhq/types-live": "^6.89.0-nightly.20251108023448"
|
|
68
68
|
},
|
|
69
69
|
"devDependencies": {
|
|
70
70
|
"@faker-js/faker": "^8.4.1",
|
package/src/cli-transaction.ts
CHANGED
|
@@ -38,7 +38,7 @@ function inferTransactions(
|
|
|
38
38
|
transaction: Transaction;
|
|
39
39
|
}>,
|
|
40
40
|
opts: Partial<Record<string, string>>,
|
|
41
|
-
): Transaction[] {
|
|
41
|
+
): Promise<Transaction[]> {
|
|
42
42
|
const mode = inferMode(opts.mode);
|
|
43
43
|
|
|
44
44
|
// reusing ethereum token option, comes as array
|
|
@@ -50,130 +50,132 @@ function inferTransactions(
|
|
|
50
50
|
|
|
51
51
|
const token = tokens?.[0];
|
|
52
52
|
|
|
53
|
-
return
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
53
|
+
return Promise.all(
|
|
54
|
+
transactions.map(async ({ account, transaction }) => {
|
|
55
|
+
if (transaction.family !== "solana") {
|
|
56
|
+
throw new Error(`Solana family transaction expected, got <${transaction.family}>`);
|
|
57
|
+
}
|
|
58
|
+
switch (mode) {
|
|
59
|
+
case "send":
|
|
60
|
+
if (account.type === "Account") {
|
|
61
|
+
const solanaTx: Transaction = {
|
|
62
|
+
...transaction,
|
|
63
|
+
model: {
|
|
64
|
+
kind: "transfer",
|
|
65
|
+
uiState: {
|
|
66
|
+
memo: opts.memo,
|
|
67
|
+
},
|
|
68
|
+
},
|
|
69
|
+
};
|
|
70
|
+
return solanaTx;
|
|
71
|
+
} else {
|
|
72
|
+
if (account.type !== "TokenAccount") {
|
|
73
|
+
throw new Error("expected token account");
|
|
74
|
+
}
|
|
75
|
+
const subAccountId = account.id;
|
|
76
|
+
const solanaTx: Transaction = {
|
|
77
|
+
...transaction,
|
|
78
|
+
subAccountId,
|
|
79
|
+
model: {
|
|
80
|
+
kind: "token.transfer",
|
|
81
|
+
uiState: {
|
|
82
|
+
memo: opts.memo,
|
|
83
|
+
subAccountId,
|
|
84
|
+
},
|
|
85
|
+
},
|
|
86
|
+
};
|
|
87
|
+
return solanaTx;
|
|
88
|
+
}
|
|
89
|
+
case "optIn": {
|
|
90
|
+
if (token === undefined) {
|
|
91
|
+
throw new Error("token required");
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
if (account.type !== "Account") {
|
|
95
|
+
throw new Error("expected main account");
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
const tokenCurrency = await getCryptoAssetsStore().findTokenById(token);
|
|
99
|
+
|
|
100
|
+
if (!tokenCurrency) {
|
|
101
|
+
throw new Error(`token <${token}> not found`);
|
|
102
|
+
}
|
|
103
|
+
|
|
60
104
|
const solanaTx: Transaction = {
|
|
61
105
|
...transaction,
|
|
62
106
|
model: {
|
|
63
|
-
kind: "
|
|
107
|
+
kind: "token.createATA",
|
|
64
108
|
uiState: {
|
|
65
|
-
|
|
109
|
+
tokenId: tokenCurrency.id,
|
|
66
110
|
},
|
|
67
111
|
},
|
|
68
112
|
};
|
|
69
113
|
return solanaTx;
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
const subAccountId = account.id;
|
|
75
|
-
const solanaTx: Transaction = {
|
|
114
|
+
}
|
|
115
|
+
case "stake.createAccount": {
|
|
116
|
+
const validator = opts.solanaValidator;
|
|
117
|
+
return {
|
|
76
118
|
...transaction,
|
|
77
|
-
subAccountId,
|
|
78
119
|
model: {
|
|
79
|
-
kind: "
|
|
120
|
+
kind: "stake.createAccount",
|
|
80
121
|
uiState: {
|
|
81
|
-
|
|
82
|
-
|
|
122
|
+
delegate: {
|
|
123
|
+
voteAccAddress: validator ?? "",
|
|
124
|
+
},
|
|
83
125
|
},
|
|
84
126
|
},
|
|
85
127
|
};
|
|
86
|
-
return solanaTx;
|
|
87
|
-
}
|
|
88
|
-
case "optIn": {
|
|
89
|
-
if (token === undefined) {
|
|
90
|
-
throw new Error("token required");
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
if (account.type !== "Account") {
|
|
94
|
-
throw new Error("expected main account");
|
|
95
128
|
}
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
...transaction,
|
|
105
|
-
model: {
|
|
106
|
-
kind: "token.createATA",
|
|
107
|
-
uiState: {
|
|
108
|
-
tokenId: tokenCurrency.id,
|
|
109
|
-
},
|
|
110
|
-
},
|
|
111
|
-
};
|
|
112
|
-
return solanaTx;
|
|
113
|
-
}
|
|
114
|
-
case "stake.createAccount": {
|
|
115
|
-
const validator = opts.solanaValidator;
|
|
116
|
-
return {
|
|
117
|
-
...transaction,
|
|
118
|
-
model: {
|
|
119
|
-
kind: "stake.createAccount",
|
|
120
|
-
uiState: {
|
|
121
|
-
delegate: {
|
|
122
|
-
voteAccAddress: validator ?? "",
|
|
129
|
+
case "stake.delegate":
|
|
130
|
+
return {
|
|
131
|
+
...transaction,
|
|
132
|
+
model: {
|
|
133
|
+
kind: "stake.delegate",
|
|
134
|
+
uiState: {
|
|
135
|
+
stakeAccAddr: opts.solanaStakeAccount ?? "",
|
|
136
|
+
voteAccAddr: opts.solanaValidator ?? "",
|
|
123
137
|
},
|
|
124
138
|
},
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
stakeAccAddr: opts.solanaStakeAccount ?? "",
|
|
135
|
-
voteAccAddr: opts.solanaValidator ?? "",
|
|
136
|
-
},
|
|
137
|
-
},
|
|
138
|
-
};
|
|
139
|
-
case "stake.undelegate":
|
|
140
|
-
return {
|
|
141
|
-
...transaction,
|
|
142
|
-
model: {
|
|
143
|
-
kind: "stake.undelegate",
|
|
144
|
-
uiState: {
|
|
145
|
-
stakeAccAddr: opts.solanaStakeAccount ?? "",
|
|
139
|
+
};
|
|
140
|
+
case "stake.undelegate":
|
|
141
|
+
return {
|
|
142
|
+
...transaction,
|
|
143
|
+
model: {
|
|
144
|
+
kind: "stake.undelegate",
|
|
145
|
+
uiState: {
|
|
146
|
+
stakeAccAddr: opts.solanaStakeAccount ?? "",
|
|
147
|
+
},
|
|
146
148
|
},
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
149
|
+
};
|
|
150
|
+
case "stake.withdraw":
|
|
151
|
+
return {
|
|
152
|
+
...transaction,
|
|
153
|
+
model: {
|
|
154
|
+
kind: "stake.withdraw",
|
|
155
|
+
uiState: {
|
|
156
|
+
stakeAccAddr: opts.solanaStakeAccount ?? "",
|
|
157
|
+
},
|
|
156
158
|
},
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
}
|
|
159
|
+
};
|
|
160
|
+
case "stake.split":
|
|
161
|
+
if (opts.solanaStakeAccount === undefined) {
|
|
162
|
+
throw new Error("stake account is required");
|
|
163
|
+
}
|
|
163
164
|
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
165
|
+
return {
|
|
166
|
+
...transaction,
|
|
167
|
+
model: {
|
|
168
|
+
kind: "stake.split",
|
|
169
|
+
uiState: {
|
|
170
|
+
stakeAccAddr: opts.solanaStakeAccount,
|
|
171
|
+
},
|
|
170
172
|
},
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
}
|
|
176
|
-
|
|
173
|
+
};
|
|
174
|
+
default:
|
|
175
|
+
return assertUnreachable(mode);
|
|
176
|
+
}
|
|
177
|
+
}),
|
|
178
|
+
);
|
|
177
179
|
}
|
|
178
180
|
|
|
179
181
|
function inferAccounts(mainAccount: Account, opts: Record<string, string>): AccountLikeArray {
|
package/src/helpers/token.ts
CHANGED
|
@@ -12,10 +12,9 @@ import { TransferFeeConfigExt } from "../network/chain/account/tokenExtensions";
|
|
|
12
12
|
import { PARSED_PROGRAMS } from "../network/chain/program/constants";
|
|
13
13
|
import { getCryptoAssetsStore } from "../cryptoAssetsStore";
|
|
14
14
|
|
|
15
|
-
export function tokenIsListedOnLedger(currencyId: string, mint: string): boolean {
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
);
|
|
15
|
+
export async function tokenIsListedOnLedger(currencyId: string, mint: string): Promise<boolean> {
|
|
16
|
+
const token = await getCryptoAssetsStore().findTokenByAddressInCurrency(mint, currencyId);
|
|
17
|
+
return token?.type === "TokenCurrency";
|
|
19
18
|
}
|
|
20
19
|
|
|
21
20
|
export function isTokenAccountFrozen(account: AccountLike): boolean {
|
package/src/preload.ts
CHANGED
|
@@ -14,7 +14,7 @@ import { getValidators, ValidatorsAppValidator } from "./network/validator-app";
|
|
|
14
14
|
import spltokensList, { hash as embeddedHash, SPLToken } from "@ledgerhq/cryptoassets/data/spl";
|
|
15
15
|
import { fetchTokensFromCALService } from "@ledgerhq/cryptoassets/crypto-assets-importer/fetch/index";
|
|
16
16
|
import { getCALHash, setCALHash } from "./logic";
|
|
17
|
-
import { addTokens, convertSplTokens } from "@ledgerhq/cryptoassets/
|
|
17
|
+
import { addTokens, convertSplTokens } from "@ledgerhq/cryptoassets/legacy/legacy-utils";
|
|
18
18
|
import { AxiosError } from "axios";
|
|
19
19
|
|
|
20
20
|
let shouldSkipTokenLoading = false;
|
|
@@ -377,9 +377,9 @@ async function deriveCreateAssociatedTokenAccountCommandDescriptor(
|
|
|
377
377
|
): Promise<CommandDescriptor> {
|
|
378
378
|
const errors: Record<string, Error> = {};
|
|
379
379
|
|
|
380
|
-
const token = getCryptoAssetsStore().findTokenById(model.uiState.tokenId);
|
|
380
|
+
const token = await getCryptoAssetsStore().findTokenById(model.uiState.tokenId);
|
|
381
381
|
if (!token) {
|
|
382
|
-
throw new Error(
|
|
382
|
+
throw new Error("Token " + model.uiState.tokenId + " not found");
|
|
383
383
|
}
|
|
384
384
|
const mint = token.contractAddress;
|
|
385
385
|
const tokenProgram = await getMaybeTokenMintProgram(mint, api);
|
|
@@ -1012,7 +1012,7 @@ function validateAssociatedTokenAccountState(
|
|
|
1012
1012
|
return new SolanaTokenAccountFrozen();
|
|
1013
1013
|
}
|
|
1014
1014
|
// do not check initialized state on ledger accounts
|
|
1015
|
-
if (!(
|
|
1015
|
+
if (!("id" in tokenAcc) && tokenAcc.state !== "initialized") {
|
|
1016
1016
|
return new SolanaTokenAccounNotInitialized();
|
|
1017
1017
|
}
|
|
1018
1018
|
}
|
package/src/signOperation.ts
CHANGED
|
@@ -42,9 +42,9 @@ const buildOptimisticOperation = (account: Account, transaction: Transaction): S
|
|
|
42
42
|
const lastOpSeqNumber =
|
|
43
43
|
account.pendingOperations[0]?.transactionSequenceNumber ??
|
|
44
44
|
account.operations[0]?.transactionSequenceNumber ??
|
|
45
|
-
0;
|
|
45
|
+
new BigNumber(0);
|
|
46
46
|
|
|
47
|
-
optimisticOp.transactionSequenceNumber = lastOpSeqNumber
|
|
47
|
+
optimisticOp.transactionSequenceNumber = lastOpSeqNumber.plus(1);
|
|
48
48
|
|
|
49
49
|
return optimisticOp;
|
|
50
50
|
};
|
package/src/synchronization.ts
CHANGED
|
@@ -215,8 +215,13 @@ export const getAccountShapeWithAPI = async (
|
|
|
215
215
|
)();
|
|
216
216
|
|
|
217
217
|
// all token accounts
|
|
218
|
-
const supportedOnChainTokenAccounts =
|
|
219
|
-
|
|
218
|
+
const supportedOnChainTokenAccounts = await Promise.all(
|
|
219
|
+
onChainTokenAccounts.map(async account => {
|
|
220
|
+
const isListed = await tokenIsListedOnLedger(currency.id, account.info.mint.toBase58());
|
|
221
|
+
return isListed ? account : null;
|
|
222
|
+
}),
|
|
223
|
+
).then(results =>
|
|
224
|
+
results.filter((account): account is NonNullable<typeof account> => account !== null),
|
|
220
225
|
);
|
|
221
226
|
const supportedOnChainTokenAccountsByMint = groupBy(
|
|
222
227
|
supportedOnChainTokenAccounts,
|
|
@@ -334,7 +339,7 @@ export const getAccountShapeWithAPI = async (
|
|
|
334
339
|
|
|
335
340
|
const newMainAccTxs = await getTransactions(mainAccAddress, mainAccountLastTxSignature, api);
|
|
336
341
|
|
|
337
|
-
const lastOpSeqNumber = mainInitialAcc?.operations?.[0]?.transactionSequenceNumber ?? 0;
|
|
342
|
+
const lastOpSeqNumber = Number(mainInitialAcc?.operations?.[0]?.transactionSequenceNumber ?? 0);
|
|
338
343
|
const newOpsCount = newMainAccTxs.length;
|
|
339
344
|
|
|
340
345
|
const newMainAccOps = newMainAccTxs
|
|
@@ -372,18 +377,17 @@ export const getAccountShapeWithAPI = async (
|
|
|
372
377
|
unstakeReserve = stakes.length * withdrawFee + activeStakes.length * undelegateFee;
|
|
373
378
|
}
|
|
374
379
|
|
|
375
|
-
const nextNfts =
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
) {
|
|
380
|
+
const nextNfts: ProtoNFT[] = [];
|
|
381
|
+
for (const tokenAccount of onChainTokenAccounts) {
|
|
382
|
+
const isListed = await tokenIsListedOnLedger(currency.id, tokenAccount.info.mint.toBase58());
|
|
383
|
+
if (!isListed && tokenAccountIsNFT(tokenAccount)) {
|
|
380
384
|
const mint = tokenAccount.info.mint.toBase58();
|
|
381
385
|
// A fake tokenId is used as the mint address for the contract field with NMS
|
|
382
386
|
// because we don't have the collection with the node data
|
|
383
387
|
// We would need to fetch the metaplex metdata associated to this account
|
|
384
388
|
const tokenId = "0";
|
|
385
389
|
const id = encodeNftId(mainAccountId, tokenId, mint, currency.id);
|
|
386
|
-
|
|
390
|
+
nextNfts.push({
|
|
387
391
|
id,
|
|
388
392
|
contract: mint,
|
|
389
393
|
tokenId: tokenId,
|
|
@@ -392,8 +396,7 @@ export const getAccountShapeWithAPI = async (
|
|
|
392
396
|
currencyId: currency.id,
|
|
393
397
|
});
|
|
394
398
|
}
|
|
395
|
-
|
|
396
|
-
}, [] as ProtoNFT[]);
|
|
399
|
+
}
|
|
397
400
|
|
|
398
401
|
const shape: Partial<SolanaAccount> = {
|
|
399
402
|
nfts: nextNfts,
|
|
@@ -438,7 +441,7 @@ async function newSubAcc({
|
|
|
438
441
|
const creationDate = new Date((lastTx?.info.blockTime ?? Date.now() / 1000) * 1000);
|
|
439
442
|
|
|
440
443
|
const mint = assocTokenAcc.info.mint.toBase58();
|
|
441
|
-
const tokenCurrency = getCryptoAssetsStore().findTokenByAddressInCurrency(mint, currencyId);
|
|
444
|
+
const tokenCurrency = await getCryptoAssetsStore().findTokenByAddressInCurrency(mint, currencyId);
|
|
442
445
|
|
|
443
446
|
if (!tokenCurrency) {
|
|
444
447
|
throw new Error(`token for mint "${mint}" not found`);
|
|
@@ -627,7 +630,7 @@ function txToMainAccOperation(
|
|
|
627
630
|
date: txDate,
|
|
628
631
|
value: opValue,
|
|
629
632
|
fee: opFee,
|
|
630
|
-
transactionSequenceNumber: txSeqNumber,
|
|
633
|
+
transactionSequenceNumber: new BigNumber(txSeqNumber),
|
|
631
634
|
};
|
|
632
635
|
}
|
|
633
636
|
|
|
@@ -10,6 +10,7 @@ import {
|
|
|
10
10
|
} from "@ledgerhq/errors";
|
|
11
11
|
import { TokenCurrency } from "@ledgerhq/types-cryptoassets";
|
|
12
12
|
import type { AccountRaw, CurrenciesData, DatasetTest } from "@ledgerhq/types-live";
|
|
13
|
+
import { getCryptoCurrencyById } from "@ledgerhq/cryptoassets";
|
|
13
14
|
import {
|
|
14
15
|
SolanaAccountNotFunded,
|
|
15
16
|
SolanaAddressOffEd25519,
|
|
@@ -28,7 +29,6 @@ import { assertUnreachable } from "../utils";
|
|
|
28
29
|
import { getEnv } from "@ledgerhq/live-env";
|
|
29
30
|
import { encodeAccountId } from "@ledgerhq/coin-framework/lib/account/accountId";
|
|
30
31
|
import { testOnChainData } from "../tests/test-onchain-data.fixture";
|
|
31
|
-
import { getCryptoAssetsStore } from "../cryptoAssetsStore";
|
|
32
32
|
|
|
33
33
|
const mainAccId = encodeAccountId({
|
|
34
34
|
type: "js",
|
|
@@ -43,10 +43,16 @@ const wSolSubAccId = encodeAccountIdWithTokenAccountAddress(
|
|
|
43
43
|
testOnChainData.wSolSenderAssocTokenAccAddress,
|
|
44
44
|
);
|
|
45
45
|
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
"
|
|
49
|
-
|
|
46
|
+
// Create a mock token for testing
|
|
47
|
+
const wSolToken: TokenCurrency = {
|
|
48
|
+
type: "TokenCurrency",
|
|
49
|
+
id: "So11111111111111111111111111111111111111112",
|
|
50
|
+
contractAddress: "So11111111111111111111111111111111111111112",
|
|
51
|
+
name: "Wrapped SOL",
|
|
52
|
+
ticker: "WSOL",
|
|
53
|
+
units: [{ name: "WSOL", code: "WSOL", magnitude: 9 }],
|
|
54
|
+
parentCurrency: getCryptoCurrencyById("solana"),
|
|
55
|
+
} as TokenCurrency;
|
|
50
56
|
|
|
51
57
|
const fees = (signatureCount: number) =>
|
|
52
58
|
new BigNumber(signatureCount * testOnChainData.fees.lamportsPerSignature);
|
|
@@ -2,7 +2,11 @@ jest.useFakeTimers();
|
|
|
2
2
|
|
|
3
3
|
import { jlpDefinition, soEthDefinition, graphitDefinition } from "./preload.fixtures";
|
|
4
4
|
import axios, { AxiosResponse } from "axios";
|
|
5
|
-
import
|
|
5
|
+
import {
|
|
6
|
+
convertSplTokens,
|
|
7
|
+
__clearAllLists,
|
|
8
|
+
addTokens,
|
|
9
|
+
} from "@ledgerhq/cryptoassets/legacy/legacy-utils";
|
|
6
10
|
import { fetchSPLTokens, hydrate, preloadWithAPI } from "../preload";
|
|
7
11
|
import { __resetCALHash, getCALHash, setCALHash } from "../logic";
|
|
8
12
|
import { CryptoCurrency } from "@ledgerhq/types-cryptoassets";
|
|
@@ -13,6 +17,14 @@ jest.mock("axios");
|
|
|
13
17
|
const mockedAxios = jest.mocked(axios);
|
|
14
18
|
mockedAxios.AxiosError = jest.requireActual("axios").AxiosError;
|
|
15
19
|
|
|
20
|
+
jest.mock("@ledgerhq/cryptoassets/legacy/legacy-utils", () => {
|
|
21
|
+
const actual = jest.requireActual("@ledgerhq/cryptoassets/legacy/legacy-utils");
|
|
22
|
+
return {
|
|
23
|
+
...actual,
|
|
24
|
+
addTokens: jest.fn(),
|
|
25
|
+
};
|
|
26
|
+
});
|
|
27
|
+
|
|
16
28
|
jest.mock("@ledgerhq/cryptoassets/data/spl", () => ({
|
|
17
29
|
__esModule: true, // Ensures the mock is treated as an ES module
|
|
18
30
|
default: [jlpDefinition, soEthDefinition], // Mocked as an array
|
|
@@ -34,7 +46,7 @@ jest.mock("../network/validator-app", () => ({
|
|
|
34
46
|
|
|
35
47
|
describe("Solana Family", () => {
|
|
36
48
|
beforeEach(() => {
|
|
37
|
-
|
|
49
|
+
__clearAllLists();
|
|
38
50
|
mockedAxios.get.mockImplementation(async (url, { params, headers } = {}) => {
|
|
39
51
|
if (url !== "https://crypto-assets-service.api.ledger.com/v1/tokens")
|
|
40
52
|
throw new Error("UNEXPECTED URL");
|
|
@@ -67,11 +79,7 @@ describe("Solana Family", () => {
|
|
|
67
79
|
|
|
68
80
|
describe("fetchSPLTokens", () => {
|
|
69
81
|
beforeEach(() => {
|
|
70
|
-
jest.
|
|
71
|
-
});
|
|
72
|
-
|
|
73
|
-
afterEach(() => {
|
|
74
|
-
jest.restoreAllMocks();
|
|
82
|
+
jest.mocked(addTokens).mockClear();
|
|
75
83
|
});
|
|
76
84
|
it("should return the embedded tokens if there is no update on remote and tokens are not loaded", async () => {
|
|
77
85
|
mockedAxios.get.mockImplementationOnce((url, { headers } = {}) => {
|
|
@@ -118,44 +126,36 @@ describe("Solana Family", () => {
|
|
|
118
126
|
|
|
119
127
|
describe("preloadWithAPI", () => {
|
|
120
128
|
beforeEach(() => {
|
|
121
|
-
jest.
|
|
122
|
-
});
|
|
123
|
-
|
|
124
|
-
afterEach(() => {
|
|
125
|
-
jest.restoreAllMocks();
|
|
129
|
+
jest.mocked(addTokens).mockClear();
|
|
126
130
|
});
|
|
127
131
|
|
|
128
132
|
it("should return void when fetch is hitting cache", async () => {
|
|
129
133
|
setCALHash(mockCurrency, "newStateSolana");
|
|
130
134
|
const data = await preloadWithAPI(mockCurrency, mockGetAPI);
|
|
131
135
|
expect(data.splTokens).toEqual(null);
|
|
132
|
-
expect(
|
|
136
|
+
expect(addTokens).not.toHaveBeenCalled();
|
|
133
137
|
});
|
|
134
138
|
|
|
135
139
|
it("should return and register the new SPL tokens", async () => {
|
|
136
140
|
setCALHash(mockCurrency, "initialStateSolana");
|
|
137
141
|
const data = await preloadWithAPI(mockCurrency, mockGetAPI);
|
|
138
142
|
expect(data.splTokens).toEqual([jlpDefinition, soEthDefinition]);
|
|
139
|
-
expect(
|
|
140
|
-
expect(
|
|
141
|
-
|
|
142
|
-
|
|
143
|
+
expect(addTokens).toHaveBeenCalledTimes(1);
|
|
144
|
+
expect(addTokens).toHaveBeenCalledWith([
|
|
145
|
+
convertSplTokens(jlpDefinition),
|
|
146
|
+
convertSplTokens(soEthDefinition),
|
|
143
147
|
]);
|
|
144
148
|
});
|
|
145
149
|
});
|
|
146
150
|
|
|
147
151
|
describe("hydrate", () => {
|
|
148
152
|
beforeEach(() => {
|
|
149
|
-
jest.
|
|
150
|
-
});
|
|
151
|
-
|
|
152
|
-
afterEach(() => {
|
|
153
|
-
jest.restoreAllMocks();
|
|
153
|
+
jest.mocked(addTokens).mockClear();
|
|
154
154
|
});
|
|
155
155
|
|
|
156
156
|
it("should not do anything", async () => {
|
|
157
157
|
hydrate(undefined, mockCurrency);
|
|
158
|
-
expect(
|
|
158
|
+
expect(addTokens).toHaveBeenCalledTimes(0);
|
|
159
159
|
});
|
|
160
160
|
|
|
161
161
|
it("should register SPL tokens from embedded with null", async () => {
|
|
@@ -164,9 +164,9 @@ describe("Solana Family", () => {
|
|
|
164
164
|
mockCurrency,
|
|
165
165
|
);
|
|
166
166
|
|
|
167
|
-
expect(
|
|
168
|
-
|
|
169
|
-
|
|
167
|
+
expect(addTokens).toHaveBeenCalledWith([
|
|
168
|
+
convertSplTokens(jlpDefinition),
|
|
169
|
+
convertSplTokens(soEthDefinition),
|
|
170
170
|
]);
|
|
171
171
|
});
|
|
172
172
|
|
|
@@ -176,9 +176,7 @@ describe("Solana Family", () => {
|
|
|
176
176
|
mockCurrency,
|
|
177
177
|
);
|
|
178
178
|
|
|
179
|
-
expect(
|
|
180
|
-
CALTokensAPI.convertSplTokens(graphitDefinition),
|
|
181
|
-
]);
|
|
179
|
+
expect(addTokens).toHaveBeenCalledWith([convertSplTokens(graphitDefinition)]);
|
|
182
180
|
});
|
|
183
181
|
});
|
|
184
182
|
});
|
|
@@ -12,6 +12,7 @@ import {
|
|
|
12
12
|
|
|
13
13
|
import { TokenCurrency } from "@ledgerhq/types-cryptoassets";
|
|
14
14
|
import type { Account, CryptoAssetsStore } from "@ledgerhq/types-live";
|
|
15
|
+
import { getCryptoCurrencyById } from "@ledgerhq/cryptoassets";
|
|
15
16
|
import {
|
|
16
17
|
SolanaRecipientMemoIsRequired,
|
|
17
18
|
SolanaTokenAccountFrozen,
|
|
@@ -31,7 +32,7 @@ import {
|
|
|
31
32
|
} from "@solana/spl-token";
|
|
32
33
|
import { calculateToken2022TransferFees } from "../helpers/token";
|
|
33
34
|
import { PARSED_PROGRAMS } from "../network/chain/program/constants";
|
|
34
|
-
import {
|
|
35
|
+
import { setCryptoAssetsStoreGetter } from "../cryptoAssetsStore";
|
|
35
36
|
import usdcTokenData from "../__fixtures__/solana-spl-epjfwdd5aufqssqem2qn1xzybapc8g4weggkzwytdt1v.json";
|
|
36
37
|
|
|
37
38
|
const USDC_TOKEN = usdcTokenData as unknown as TokenCurrency;
|
|
@@ -67,20 +68,27 @@ setCryptoAssetsStoreGetter(
|
|
|
67
68
|
() =>
|
|
68
69
|
// eslint-disable-next-line @typescript-eslint/consistent-type-assertions
|
|
69
70
|
({
|
|
70
|
-
findTokenByAddressInCurrency: (address: string, _currencyId: string) => {
|
|
71
|
+
findTokenByAddressInCurrency: async (address: string, _currencyId: string) => {
|
|
71
72
|
if (address === "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v") {
|
|
72
73
|
return USDC_TOKEN;
|
|
73
74
|
}
|
|
74
75
|
return undefined;
|
|
75
76
|
},
|
|
77
|
+
findTokenById: async () => undefined,
|
|
76
78
|
getTokensSyncHash: (_: string) => Promise.resolve("0"),
|
|
77
79
|
}) as CryptoAssetsStore,
|
|
78
80
|
);
|
|
79
81
|
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
"
|
|
83
|
-
|
|
82
|
+
// Create a mock token for testing
|
|
83
|
+
const wSolToken: TokenCurrency = {
|
|
84
|
+
type: "TokenCurrency",
|
|
85
|
+
id: testData.mintAddress,
|
|
86
|
+
contractAddress: testData.mintAddress,
|
|
87
|
+
name: "Wrapped SOL",
|
|
88
|
+
ticker: "WSOL",
|
|
89
|
+
units: [{ name: "WSOL", code: "WSOL", magnitude: 9 }],
|
|
90
|
+
parentCurrency: getCryptoCurrencyById("solana"),
|
|
91
|
+
} as TokenCurrency;
|
|
84
92
|
|
|
85
93
|
const baseAccount = {
|
|
86
94
|
balance: new BigNumber(10000),
|