@ledgerhq/coin-xrp 7.11.0 → 7.12.0-nightly.20260116024452
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/.unimportedrc.json +3 -0
- package/CHANGELOG.md +19 -0
- package/jest.config.js +10 -2
- package/jest.integ.config.js +12 -3
- package/lib/network/index.d.ts.map +1 -1
- package/lib/network/index.js +4 -1
- package/lib/network/index.js.map +1 -1
- package/lib-es/network/index.d.ts.map +1 -1
- package/lib-es/network/index.js +4 -1
- package/lib-es/network/index.js.map +1 -1
- package/package.json +16 -15
- package/src/api/index.integ.test.ts +6 -0
- package/src/api/index.test.ts +28 -15
- package/src/logic/validateIntent.test.ts +11 -8
- package/src/network/index.ts +6 -1
package/.unimportedrc.json
CHANGED
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,24 @@
|
|
|
1
1
|
# @ledgerhq/coin-xrp
|
|
2
2
|
|
|
3
|
+
## 7.12.0-nightly.20260116024452
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- [#13396](https://github.com/LedgerHQ/ledger-live/pull/13396) [`b9a3e43`](https://github.com/LedgerHQ/ledger-live/commit/b9a3e431be33943ab4feb4294d6a7f27b966e61b) Thanks [@gre-ledger](https://github.com/gre-ledger)! - Update Jest to v30
|
|
8
|
+
|
|
9
|
+
- [#13710](https://github.com/LedgerHQ/ledger-live/pull/13710) [`36aaf48`](https://github.com/LedgerHQ/ledger-live/commit/36aaf487c15da117a23332de376257ce8e6582a9) Thanks [@hedi-edelbloute](https://github.com/hedi-edelbloute)! - Returns native empty balance when account is pristine
|
|
10
|
+
|
|
11
|
+
### Patch Changes
|
|
12
|
+
|
|
13
|
+
- Updated dependencies [[`537a975`](https://github.com/LedgerHQ/ledger-live/commit/537a975536ca3669d3b88371e1e1f651c4cb9a1b), [`cbcae7c`](https://github.com/LedgerHQ/ledger-live/commit/cbcae7c0ba9b54b1167d26e4227bd2b847207cb9), [`8754614`](https://github.com/LedgerHQ/ledger-live/commit/87546149a62b81f8a25bb6222626592ead629f62), [`cf08174`](https://github.com/LedgerHQ/ledger-live/commit/cf0817462e9f0210fceff29ec60b0699e4e69b71), [`b9a3e43`](https://github.com/LedgerHQ/ledger-live/commit/b9a3e431be33943ab4feb4294d6a7f27b966e61b), [`3ac5f26`](https://github.com/LedgerHQ/ledger-live/commit/3ac5f26111f8596327fa7e588e514509de3f8a59), [`7f05536`](https://github.com/LedgerHQ/ledger-live/commit/7f0553665e9c8721f263825cc79994bfc6729d9b)]:
|
|
14
|
+
- @ledgerhq/cryptoassets@13.37.0-nightly.20260116024452
|
|
15
|
+
- @ledgerhq/coin-framework@6.13.0-nightly.20260116024452
|
|
16
|
+
- @ledgerhq/types-live@6.93.0-nightly.20260116024452
|
|
17
|
+
- @ledgerhq/devices@8.10.0-nightly.20260116024452
|
|
18
|
+
- @ledgerhq/errors@6.29.0-nightly.20260116024452
|
|
19
|
+
- @ledgerhq/logs@6.14.0-nightly.20260116024452
|
|
20
|
+
- @ledgerhq/live-network@2.2.0-nightly.20260116024452
|
|
21
|
+
|
|
3
22
|
## 7.11.0
|
|
4
23
|
|
|
5
24
|
### Minor Changes
|
package/jest.config.js
CHANGED
|
@@ -1,8 +1,16 @@
|
|
|
1
|
-
/** @type {import('ts-jest/dist/types').JestConfigWithTsJest} */
|
|
2
1
|
// `workerThreads: true` is required for validating object with `bigint` values
|
|
3
2
|
module.exports = {
|
|
4
|
-
preset: "ts-jest",
|
|
5
3
|
testEnvironment: "node",
|
|
4
|
+
transform: {
|
|
5
|
+
"^.+\\.(ts|tsx)$": [
|
|
6
|
+
"@swc/jest",
|
|
7
|
+
{
|
|
8
|
+
jsc: {
|
|
9
|
+
target: "esnext",
|
|
10
|
+
},
|
|
11
|
+
},
|
|
12
|
+
],
|
|
13
|
+
},
|
|
6
14
|
passWithNoTests: true,
|
|
7
15
|
testPathIgnorePatterns: ["lib/", "lib-es/", ".*\\.(integ|integration)\\.test\\.[tj]s"],
|
|
8
16
|
collectCoverageFrom: [
|
package/jest.integ.config.js
CHANGED
|
@@ -1,9 +1,18 @@
|
|
|
1
|
-
/** @type {import('
|
|
1
|
+
/** @type {import('jest').Config} */
|
|
2
2
|
module.exports = {
|
|
3
|
-
preset: "ts-jest",
|
|
4
3
|
testEnvironment: "node",
|
|
5
4
|
testRegex: ".integ.test.ts$",
|
|
6
5
|
testPathIgnorePatterns: ["lib/", "lib-es/"],
|
|
7
|
-
setupFiles: ["dotenv/config"],
|
|
8
6
|
testTimeout: 60_000,
|
|
7
|
+
forceExit: true,
|
|
8
|
+
transform: {
|
|
9
|
+
"^.+\\.(t|j)sx?$": [
|
|
10
|
+
"@swc/jest",
|
|
11
|
+
{
|
|
12
|
+
jsc: {
|
|
13
|
+
target: "esnext",
|
|
14
|
+
},
|
|
15
|
+
},
|
|
16
|
+
],
|
|
17
|
+
},
|
|
9
18
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/network/index.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAGL,MAAM,EAEN,KAAK,iBAAiB,EAEtB,KAAK,cAAc,EACnB,KAAK,kBAAkB,EACvB,KAAK,aAAa,EACnB,MAAM,SAAS,CAAC;AAIjB,eAAO,MAAM,yBAAyB,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/network/index.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAGL,MAAM,EAEN,KAAK,iBAAiB,EAEtB,KAAK,cAAc,EACnB,KAAK,kBAAkB,EACvB,KAAK,aAAa,EACnB,MAAM,SAAS,CAAC;AAIjB,eAAO,MAAM,yBAAyB,gBAAgB,CAAC;AAGvD,eAAO,MAAM,MAAM,cAAqB,MAAM,KAAG,OAAO,CAAC,aAAa,CAErE,CAAC;AAEF,eAAO,MAAM,cAAc,cACd,MAAM,YACP,OAAO,KAChB,OAAO,CAAC,WAAW,CAwCrB,CAAC;AAEF,eAAO,MAAM,cAAc,QAAa,OAAO,CAAC,kBAAkB,CAEjE,CAAC;AAGF,MAAM,MAAM,sBAAsB,GAAG;IACnC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAIhB,OAAO,EAAE,OAAO,CAAC;CAClB,CAAC;AAEF,eAAO,MAAM,eAAe,YACjB,MAAM,WACN,sBAAsB,GAAG,SAAS,KAC1C,OAAO,CAAC,iBAAiB,CAW3B,CAAC;AAEF,wBAAsB,SAAS,IAAI,OAAO,CAAC,cAAc,CAAC,CAEzD;AAED,wBAAsB,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC,CAItD"}
|
package/lib/network/index.js
CHANGED
|
@@ -11,6 +11,7 @@ const config_1 = __importDefault(require("../config"));
|
|
|
11
11
|
const types_1 = require("./types");
|
|
12
12
|
const getNodeUrl = () => config_1.default.getCoinConfig().node;
|
|
13
13
|
exports.NEW_ACCOUNT_ERROR_MESSAGE = "actNotFound";
|
|
14
|
+
const NOT_FOUND_ERROR_MESSAGE = "actMalformed";
|
|
14
15
|
const submit = async (signature) => {
|
|
15
16
|
return rpcCall("submit", { tx_blob: signature });
|
|
16
17
|
};
|
|
@@ -29,7 +30,9 @@ const getAccountInfo = async (recipient, current) => {
|
|
|
29
30
|
],
|
|
30
31
|
},
|
|
31
32
|
});
|
|
32
|
-
if (result.status !== "success" &&
|
|
33
|
+
if (result.status !== "success" &&
|
|
34
|
+
result.error &&
|
|
35
|
+
![NOT_FOUND_ERROR_MESSAGE, exports.NEW_ACCOUNT_ERROR_MESSAGE].includes(result.error)) {
|
|
33
36
|
throw new Error(`couldn't fetch account info ${recipient}`);
|
|
34
37
|
}
|
|
35
38
|
if ((0, types_1.isErrorResponse)(result)) {
|
package/lib/network/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/network/index.ts"],"names":[],"mappings":";;;;;;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/network/index.ts"],"names":[],"mappings":";;;;;;AAqGA,8BAEC;AAED,wCAIC;AA7GD,0EAA6C;AAC7C,uDAAmC;AAEnC,mCAUiB;AAEjB,MAAM,UAAU,GAAG,GAAG,EAAE,CAAC,gBAAU,CAAC,aAAa,EAAE,CAAC,IAAI,CAAC;AAE5C,QAAA,yBAAyB,GAAG,aAAa,CAAC;AACvD,MAAM,uBAAuB,GAAG,cAAc,CAAC;AAExC,MAAM,MAAM,GAAG,KAAK,EAAE,SAAiB,EAA0B,EAAE;IACxE,OAAO,OAAO,CAAgB,QAAQ,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC;AAClE,CAAC,CAAC;AAFW,QAAA,MAAM,UAEjB;AAEK,MAAM,cAAc,GAAG,KAAK,EACjC,SAAiB,EACjB,OAAiB,EACK,EAAE;IACxB,MAAM,EACJ,IAAI,EAAE,EAAE,MAAM,EAAE,GACjB,GAAG,MAAM,IAAA,sBAAO,EAAkD;QACjE,MAAM,EAAE,MAAM;QACd,GAAG,EAAE,UAAU,EAAE;QACjB,IAAI,EAAE;YACJ,MAAM,EAAE,cAAc;YACtB,MAAM,EAAE;gBACN;oBACE,OAAO,EAAE,SAAS;oBAClB,YAAY,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW;iBAChD;aACF;SACF;KACF,CAAC,CAAC;IAEH,IACE,MAAM,CAAC,MAAM,KAAK,SAAS;QAC3B,MAAM,CAAC,KAAK;QACZ,CAAC,CAAC,uBAAuB,EAAE,iCAAyB,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,EAC5E,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,+BAA+B,SAAS,EAAE,CAAC,CAAC;IAC9D,CAAC;IAED,IAAI,IAAA,uBAAe,EAAC,MAAM,CAAC,EAAE,CAAC;QAC5B,OAAO;YACL,YAAY,EAAE,IAAI;YAClB,OAAO,EAAE,GAAG;YACZ,UAAU,EAAE,CAAC;YACb,QAAQ,EAAE,CAAC;SACZ,CAAC;IACJ,CAAC;SAAM,CAAC;QACN,OAAO;YACL,YAAY,EAAE,KAAK;YACnB,OAAO,EAAE,MAAM,CAAC,YAAY,CAAC,OAAO;YACpC,UAAU,EAAE,MAAM,CAAC,YAAY,CAAC,UAAU;YAC1C,QAAQ,EAAE,MAAM,CAAC,YAAY,CAAC,QAAQ;SACvC,CAAC;IACJ,CAAC;AACH,CAAC,CAAC;AA3CW,QAAA,cAAc,kBA2CzB;AAEK,MAAM,cAAc,GAAG,KAAK,IAAiC,EAAE;IACpE,OAAO,OAAO,CAAqB,aAAa,EAAE,EAAE,YAAY,EAAE,WAAW,EAAE,CAAC,CAAC;AACnF,CAAC,CAAC;AAFW,QAAA,cAAc,kBAEzB;AAcK,MAAM,eAAe,GAAG,KAAK,EAClC,OAAe,EACf,OAA2C,EACf,EAAE;IAC9B,MAAM,MAAM,GAAG,MAAM,OAAO,CAAoB,YAAY,EAAE;QAC5D,OAAO,EAAE,OAAO;QAChB,uDAAuD;QACvD,qFAAqF;QACrF,0FAA0F;QAC1F,4DAA4D;QAC5D,GAAG,OAAO;QACV,WAAW,EAAE,CAAC;KACf,CAAC,CAAC;IACH,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC;AAdW,QAAA,eAAe,mBAc1B;AAEK,KAAK,UAAU,SAAS;IAC7B,OAAO,OAAO,CAAiB,QAAQ,EAAE,EAAE,YAAY,EAAE,WAAW,EAAE,CAAC,CAAC;AAC1E,CAAC;AAEM,KAAK,UAAU,cAAc;IAClC,MAAM,MAAM,GAAG,MAAM,SAAS,EAAE,CAAC;IAEjC,OAAO,MAAM,CAAC,YAAY,CAAC;AAC7B,CAAC;AAED,KAAK,UAAU,OAAO,CACpB,MAAc,EACd,SAAkC,EAAE;IAEpC,MAAM,EACJ,IAAI,EAAE,EAAE,MAAM,EAAE,GACjB,GAAG,MAAM,IAAA,sBAAO,EAAgB;QAC/B,MAAM,EAAE,MAAM;QACd,GAAG,EAAE,UAAU,EAAE;QACjB,IAAI,EAAE;YACJ,MAAM;YACN,MAAM,EAAE;gBACN;oBACE,GAAG,MAAM;iBACV;aACF;SACF;KACF,CAAC,CAAC;IAEH,IAAI,IAAA,wBAAgB,EAAC,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAC5D,MAAM,IAAI,KAAK,CAAC,kBAAkB,MAAM,gBAAgB,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACpF,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/network/index.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAGL,MAAM,EAEN,KAAK,iBAAiB,EAEtB,KAAK,cAAc,EACnB,KAAK,kBAAkB,EACvB,KAAK,aAAa,EACnB,MAAM,SAAS,CAAC;AAIjB,eAAO,MAAM,yBAAyB,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/network/index.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAGL,MAAM,EAEN,KAAK,iBAAiB,EAEtB,KAAK,cAAc,EACnB,KAAK,kBAAkB,EACvB,KAAK,aAAa,EACnB,MAAM,SAAS,CAAC;AAIjB,eAAO,MAAM,yBAAyB,gBAAgB,CAAC;AAGvD,eAAO,MAAM,MAAM,cAAqB,MAAM,KAAG,OAAO,CAAC,aAAa,CAErE,CAAC;AAEF,eAAO,MAAM,cAAc,cACd,MAAM,YACP,OAAO,KAChB,OAAO,CAAC,WAAW,CAwCrB,CAAC;AAEF,eAAO,MAAM,cAAc,QAAa,OAAO,CAAC,kBAAkB,CAEjE,CAAC;AAGF,MAAM,MAAM,sBAAsB,GAAG;IACnC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAIhB,OAAO,EAAE,OAAO,CAAC;CAClB,CAAC;AAEF,eAAO,MAAM,eAAe,YACjB,MAAM,WACN,sBAAsB,GAAG,SAAS,KAC1C,OAAO,CAAC,iBAAiB,CAW3B,CAAC;AAEF,wBAAsB,SAAS,IAAI,OAAO,CAAC,cAAc,CAAC,CAEzD;AAED,wBAAsB,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC,CAItD"}
|
package/lib-es/network/index.js
CHANGED
|
@@ -3,6 +3,7 @@ import coinConfig from "../config";
|
|
|
3
3
|
import { isErrorResponse, isResponseStatus, } from "./types";
|
|
4
4
|
const getNodeUrl = () => coinConfig.getCoinConfig().node;
|
|
5
5
|
export const NEW_ACCOUNT_ERROR_MESSAGE = "actNotFound";
|
|
6
|
+
const NOT_FOUND_ERROR_MESSAGE = "actMalformed";
|
|
6
7
|
export const submit = async (signature) => {
|
|
7
8
|
return rpcCall("submit", { tx_blob: signature });
|
|
8
9
|
};
|
|
@@ -20,7 +21,9 @@ export const getAccountInfo = async (recipient, current) => {
|
|
|
20
21
|
],
|
|
21
22
|
},
|
|
22
23
|
});
|
|
23
|
-
if (result.status !== "success" &&
|
|
24
|
+
if (result.status !== "success" &&
|
|
25
|
+
result.error &&
|
|
26
|
+
![NOT_FOUND_ERROR_MESSAGE, NEW_ACCOUNT_ERROR_MESSAGE].includes(result.error)) {
|
|
24
27
|
throw new Error(`couldn't fetch account info ${recipient}`);
|
|
25
28
|
}
|
|
26
29
|
if (isErrorResponse(result)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/network/index.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,wBAAwB,CAAC;AAC7C,OAAO,UAAU,MAAM,WAAW,CAAC;AAEnC,OAAO,EACL,eAAe,EACf,gBAAgB,GAQjB,MAAM,SAAS,CAAC;AAEjB,MAAM,UAAU,GAAG,GAAG,EAAE,CAAC,UAAU,CAAC,aAAa,EAAE,CAAC,IAAI,CAAC;AAEzD,MAAM,CAAC,MAAM,yBAAyB,GAAG,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/network/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ledgerhq/coin-xrp",
|
|
3
|
-
"version": "7.
|
|
3
|
+
"version": "7.12.0-nightly.20260116024452",
|
|
4
4
|
"description": "Ledger XRP Coin integration",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"Ledger",
|
|
@@ -103,26 +103,27 @@
|
|
|
103
103
|
"invariant": "^2.2.4",
|
|
104
104
|
"ripple-address-codec": "^5.0.0",
|
|
105
105
|
"ripple-binary-codec": "^1.3.0",
|
|
106
|
-
"@ledgerhq/coin-framework": "^6.
|
|
107
|
-
"@ledgerhq/cryptoassets": "^13.
|
|
108
|
-
"@ledgerhq/devices": "8.
|
|
109
|
-
"@ledgerhq/errors": "^6.
|
|
110
|
-
"@ledgerhq/live
|
|
111
|
-
"@ledgerhq/
|
|
112
|
-
"@ledgerhq/
|
|
106
|
+
"@ledgerhq/coin-framework": "^6.13.0-nightly.20260116024452",
|
|
107
|
+
"@ledgerhq/cryptoassets": "^13.37.0-nightly.20260116024452",
|
|
108
|
+
"@ledgerhq/devices": "8.10.0-nightly.20260116024452",
|
|
109
|
+
"@ledgerhq/errors": "^6.29.0-nightly.20260116024452",
|
|
110
|
+
"@ledgerhq/types-live": "^6.93.0-nightly.20260116024452",
|
|
111
|
+
"@ledgerhq/logs": "^6.14.0-nightly.20260116024452",
|
|
112
|
+
"@ledgerhq/live-network": "^2.2.0-nightly.20260116024452"
|
|
113
113
|
},
|
|
114
114
|
"devDependencies": {
|
|
115
115
|
"@faker-js/faker": "^8.4.1",
|
|
116
116
|
"@types/invariant": "^2.2.37",
|
|
117
|
-
"@types/jest": "
|
|
117
|
+
"@types/jest": "30.0.0",
|
|
118
118
|
"dotenv": "^16.4.5",
|
|
119
|
-
"expect": "
|
|
120
|
-
"jest": "
|
|
119
|
+
"expect": "30.2.0",
|
|
120
|
+
"jest": "30.2.0",
|
|
121
121
|
"ripple-keypairs": "^2.0.0",
|
|
122
|
-
"
|
|
122
|
+
"@swc/jest": "0.2.39",
|
|
123
|
+
"@swc/core": "1.15.8",
|
|
123
124
|
"typescript": "^5.4.5",
|
|
124
|
-
"@ledgerhq/disable-network-setup": "^0.
|
|
125
|
-
"@ledgerhq/types-cryptoassets": "^7.
|
|
125
|
+
"@ledgerhq/disable-network-setup": "^0.2.0-nightly.20260116024452",
|
|
126
|
+
"@ledgerhq/types-cryptoassets": "^7.32.0-nightly.20260116024452"
|
|
126
127
|
},
|
|
127
128
|
"scripts": {
|
|
128
129
|
"clean": "rimraf lib lib-es",
|
|
@@ -137,7 +138,7 @@
|
|
|
137
138
|
"test": "jest",
|
|
138
139
|
"test:debug": "node --inspect-brk ./node_modules/jest/bin/jest.js --runInBand",
|
|
139
140
|
"test-watch": "jest --watch",
|
|
140
|
-
"test-integ": "DOTENV_CONFIG_PATH=.env.integ.test jest --config=jest.integ.config.js",
|
|
141
|
+
"test-integ": "DOTENV_CONFIG_PATH=.env.integ.test jest --config=jest.integ.config.js --passWithNoTests",
|
|
141
142
|
"test-integ:debug": "DOTENV_CONFIG_PATH=.env.integ.test node --inspect-brk ./node_modules/jest/bin/jest.js --runInBand --config=jest.integ.config.js",
|
|
142
143
|
"typecheck": "tsc --noEmit",
|
|
143
144
|
"unimported": "unimported"
|
|
@@ -143,6 +143,12 @@ describe("Xrp Api (testnet)", () => {
|
|
|
143
143
|
// Then
|
|
144
144
|
expect(result).toEqual([{ value: BigInt(0), asset: { type: "native" }, locked: 0n }]);
|
|
145
145
|
});
|
|
146
|
+
|
|
147
|
+
it("returns 0 when address is not found", async () => {
|
|
148
|
+
const result = await api.getBalance("rhWTXC2m2gGGA9WozUaoMm6kLAVPb1tcS0");
|
|
149
|
+
|
|
150
|
+
expect(result).toEqual([{ value: BigInt(0), asset: { type: "native" }, locked: 0n }]);
|
|
151
|
+
});
|
|
146
152
|
});
|
|
147
153
|
|
|
148
154
|
describe("craftTransaction", () => {
|
package/src/api/index.test.ts
CHANGED
|
@@ -16,6 +16,18 @@ jest.mock("../network", () => ({
|
|
|
16
16
|
mockGetTransactions(address, options),
|
|
17
17
|
}));
|
|
18
18
|
|
|
19
|
+
// Module-level mocks for logic functions
|
|
20
|
+
const mockCraftTransaction = jest.fn();
|
|
21
|
+
const mockGetNextValidSequence = jest.fn();
|
|
22
|
+
const mockEstimateFees = jest.fn();
|
|
23
|
+
|
|
24
|
+
jest.mock("../logic", () => ({
|
|
25
|
+
...jest.requireActual("../logic"),
|
|
26
|
+
craftTransaction: (...args: unknown[]) => mockCraftTransaction(...args),
|
|
27
|
+
getNextValidSequence: (...args: unknown[]) => mockGetNextValidSequence(...args),
|
|
28
|
+
estimateFees: (...args: unknown[]) => mockEstimateFees(...args),
|
|
29
|
+
}));
|
|
30
|
+
|
|
19
31
|
describe("listOperations", () => {
|
|
20
32
|
const api = createApi({ node: "https://localhost" });
|
|
21
33
|
|
|
@@ -271,18 +283,15 @@ describe("listOperations", () => {
|
|
|
271
283
|
describe("Testing craftTransaction function", () => {
|
|
272
284
|
const DEFAULT_ESTIMATED_FEES = 100n;
|
|
273
285
|
const api = createApi({ node: "https://localhost" });
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
.mockImplementation((_address, _transaction, _publicKey) => {
|
|
286
|
+
|
|
287
|
+
beforeAll(() => {
|
|
288
|
+
mockCraftTransaction.mockImplementation((_address, _transaction, _publicKey) => {
|
|
277
289
|
return Promise.resolve({ xrplTransaction: {} as never, serializedTransaction: "" });
|
|
278
290
|
});
|
|
279
291
|
|
|
280
|
-
|
|
281
|
-
jest
|
|
282
|
-
.spyOn(LogicFunctions, "getNextValidSequence")
|
|
283
|
-
.mockImplementation(_address => Promise.resolve(0));
|
|
292
|
+
mockGetNextValidSequence.mockImplementation(_address => Promise.resolve(0));
|
|
284
293
|
|
|
285
|
-
|
|
294
|
+
mockEstimateFees.mockImplementation(_networkInfo => {
|
|
286
295
|
return Promise.resolve({
|
|
287
296
|
networkInfo: {} as NetworkInfo,
|
|
288
297
|
fees: DEFAULT_ESTIMATED_FEES,
|
|
@@ -290,6 +299,10 @@ describe("Testing craftTransaction function", () => {
|
|
|
290
299
|
});
|
|
291
300
|
});
|
|
292
301
|
|
|
302
|
+
afterEach(() => {
|
|
303
|
+
mockCraftTransaction.mockClear();
|
|
304
|
+
});
|
|
305
|
+
|
|
293
306
|
it("should use custom user fees when user provides it for crafting a transaction", async () => {
|
|
294
307
|
const customFees = 99n;
|
|
295
308
|
await api.craftTransaction(
|
|
@@ -299,7 +312,7 @@ describe("Testing craftTransaction function", () => {
|
|
|
299
312
|
},
|
|
300
313
|
);
|
|
301
314
|
|
|
302
|
-
expect(
|
|
315
|
+
expect(mockCraftTransaction).toHaveBeenCalledWith(
|
|
303
316
|
expect.any(Object),
|
|
304
317
|
expect.objectContaining({
|
|
305
318
|
fees: customFees,
|
|
@@ -314,7 +327,7 @@ describe("Testing craftTransaction function", () => {
|
|
|
314
327
|
sender: "foo",
|
|
315
328
|
} as SendTransactionIntent<XrpMapMemo>);
|
|
316
329
|
|
|
317
|
-
expect(
|
|
330
|
+
expect(mockCraftTransaction).toHaveBeenCalledWith(
|
|
318
331
|
expect.any(Object),
|
|
319
332
|
expect.objectContaining({
|
|
320
333
|
fees: DEFAULT_ESTIMATED_FEES,
|
|
@@ -330,7 +343,7 @@ describe("Testing craftTransaction function", () => {
|
|
|
330
343
|
senderPublicKey: "bar",
|
|
331
344
|
} as SendTransactionIntent<XrpMapMemo>);
|
|
332
345
|
|
|
333
|
-
expect(
|
|
346
|
+
expect(mockCraftTransaction).toHaveBeenCalledWith(
|
|
334
347
|
expect.any(Object),
|
|
335
348
|
expect.any(Object),
|
|
336
349
|
"bar",
|
|
@@ -347,7 +360,7 @@ describe("Testing craftTransaction function", () => {
|
|
|
347
360
|
},
|
|
348
361
|
} as SendTransactionIntent<XrpMapMemo>);
|
|
349
362
|
|
|
350
|
-
expect(
|
|
363
|
+
expect(mockCraftTransaction).toHaveBeenCalledWith(
|
|
351
364
|
expect.any(Object),
|
|
352
365
|
expect.objectContaining({
|
|
353
366
|
// NOTE: before
|
|
@@ -364,7 +377,7 @@ describe("Testing craftTransaction function", () => {
|
|
|
364
377
|
sender: "foo",
|
|
365
378
|
} as SendTransactionIntent<XrpMapMemo>);
|
|
366
379
|
|
|
367
|
-
expect(
|
|
380
|
+
expect(mockCraftTransaction).toHaveBeenCalledWith(
|
|
368
381
|
expect.any(Object),
|
|
369
382
|
expect.objectContaining({
|
|
370
383
|
memos: undefined,
|
|
@@ -383,7 +396,7 @@ describe("Testing craftTransaction function", () => {
|
|
|
383
396
|
},
|
|
384
397
|
} as SendTransactionIntent<XrpMapMemo>);
|
|
385
398
|
|
|
386
|
-
expect(
|
|
399
|
+
expect(mockCraftTransaction).toHaveBeenCalledWith(
|
|
387
400
|
expect.any(Object),
|
|
388
401
|
expect.objectContaining({
|
|
389
402
|
memos: undefined,
|
|
@@ -402,7 +415,7 @@ describe("Testing craftTransaction function", () => {
|
|
|
402
415
|
},
|
|
403
416
|
} as SendTransactionIntent<XrpMapMemo>);
|
|
404
417
|
|
|
405
|
-
expect(
|
|
418
|
+
expect(mockCraftTransaction).toHaveBeenCalledWith(
|
|
406
419
|
expect.any(Object),
|
|
407
420
|
expect.objectContaining({
|
|
408
421
|
destinationTag: 1337, // logic should convert `value: string` -> `number`
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import { validateIntent } from "./validateIntent";
|
|
2
|
-
import * as utils from "./utils";
|
|
3
2
|
|
|
4
3
|
const mockGetBalance = jest.fn();
|
|
5
4
|
|
|
6
5
|
const mockGetServerInfos = jest.fn();
|
|
7
6
|
|
|
7
|
+
const RECIPIENT_NEW = "rDKsbvy9uaNpPtvVFraJyNGfjvTw8xivgK";
|
|
8
|
+
|
|
8
9
|
jest.mock("./getBalance", () => ({
|
|
9
10
|
getBalance: () => mockGetBalance(),
|
|
10
11
|
}));
|
|
@@ -13,18 +14,20 @@ jest.mock("../network", () => ({
|
|
|
13
14
|
getServerInfos: () => mockGetServerInfos(),
|
|
14
15
|
}));
|
|
15
16
|
|
|
16
|
-
jest.
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
}
|
|
17
|
+
jest.mock("./utils", () => ({
|
|
18
|
+
...jest.requireActual("./utils"),
|
|
19
|
+
cachedRecipientIsNew: jest.fn((addr: string) => {
|
|
20
|
+
if (addr === RECIPIENT_NEW) {
|
|
21
|
+
return Promise.resolve(true);
|
|
22
|
+
}
|
|
23
|
+
return Promise.resolve(false);
|
|
24
|
+
}),
|
|
25
|
+
}));
|
|
22
26
|
|
|
23
27
|
const reserveBase = 10_000_000n; // 10 XRP (drops)
|
|
24
28
|
|
|
25
29
|
const SENDER = "rPSCfmnX3t9jQJG5RNcZtSaP5UhExZDue4";
|
|
26
30
|
const RECIPIENT = "rPT1Sjq2YGrBMTttX4GZHjKu9dyfzbpAYe";
|
|
27
|
-
const RECIPIENT_NEW = "rDKsbvy9uaNpPtvVFraJyNGfjvTw8xivgK";
|
|
28
31
|
|
|
29
32
|
describe("validateIntent", () => {
|
|
30
33
|
afterEach(() => {
|
package/src/network/index.ts
CHANGED
|
@@ -16,6 +16,7 @@ import {
|
|
|
16
16
|
const getNodeUrl = () => coinConfig.getCoinConfig().node;
|
|
17
17
|
|
|
18
18
|
export const NEW_ACCOUNT_ERROR_MESSAGE = "actNotFound";
|
|
19
|
+
const NOT_FOUND_ERROR_MESSAGE = "actMalformed";
|
|
19
20
|
|
|
20
21
|
export const submit = async (signature: string): Promise<SubmitReponse> => {
|
|
21
22
|
return rpcCall<SubmitReponse>("submit", { tx_blob: signature });
|
|
@@ -41,7 +42,11 @@ export const getAccountInfo = async (
|
|
|
41
42
|
},
|
|
42
43
|
});
|
|
43
44
|
|
|
44
|
-
if (
|
|
45
|
+
if (
|
|
46
|
+
result.status !== "success" &&
|
|
47
|
+
result.error &&
|
|
48
|
+
![NOT_FOUND_ERROR_MESSAGE, NEW_ACCOUNT_ERROR_MESSAGE].includes(result.error)
|
|
49
|
+
) {
|
|
45
50
|
throw new Error(`couldn't fetch account info ${recipient}`);
|
|
46
51
|
}
|
|
47
52
|
|