@ledgerhq/coin-vechain 2.27.0 → 2.28.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.
- package/.unimportedrc.json +3 -21
- package/CHANGELOG.md +34 -0
- package/jest.config.js +39 -13
- package/lib/api/index.d.ts +4 -0
- package/lib/api/index.d.ts.map +1 -0
- package/lib/api/index.js +45 -0
- package/lib/api/index.js.map +1 -0
- package/lib/bridge/getTransactionStatus.js +1 -1
- package/lib/bridge/getTransactionStatus.js.map +1 -1
- package/lib/logic/account/getBalance.d.ts +5 -0
- package/lib/logic/account/getBalance.d.ts.map +1 -0
- package/lib/logic/account/getBalance.js +25 -0
- package/lib/logic/account/getBalance.js.map +1 -0
- package/lib/logic/history/getBlock.d.ts +3 -0
- package/lib/logic/history/getBlock.d.ts.map +1 -0
- package/lib/logic/history/getBlock.js +35 -0
- package/lib/logic/history/getBlock.js.map +1 -0
- package/lib/logic/history/getBlockInfo.d.ts +6 -0
- package/lib/logic/history/getBlockInfo.d.ts.map +1 -0
- package/lib/logic/history/getBlockInfo.js +23 -0
- package/lib/logic/history/getBlockInfo.js.map +1 -0
- package/lib/logic/history/lastBlock.d.ts +3 -0
- package/lib/logic/history/lastBlock.d.ts.map +1 -0
- package/lib/logic/history/lastBlock.js +11 -0
- package/lib/logic/history/lastBlock.js.map +1 -0
- package/lib/logic/history/listOperations.d.ts +3 -0
- package/lib/logic/history/listOperations.d.ts.map +1 -0
- package/lib/logic/history/listOperations.js +50 -0
- package/lib/logic/history/listOperations.js.map +1 -0
- package/lib/logic/index.d.ts +12 -0
- package/lib/logic/index.d.ts.map +1 -0
- package/lib/logic/index.js +28 -0
- package/lib/logic/index.js.map +1 -0
- package/lib/logic/transaction/broadcast.d.ts +3 -0
- package/lib/logic/transaction/broadcast.d.ts.map +1 -0
- package/lib/logic/transaction/broadcast.js +10 -0
- package/lib/logic/transaction/broadcast.js.map +1 -0
- package/lib/logic/transaction/combine.d.ts +2 -0
- package/lib/logic/transaction/combine.d.ts.map +1 -0
- package/lib/logic/transaction/combine.js +11 -0
- package/lib/logic/transaction/combine.js.map +1 -0
- package/lib/logic/transaction/craftTransaction.d.ts +3 -0
- package/lib/logic/transaction/craftTransaction.d.ts.map +1 -0
- package/lib/logic/transaction/craftTransaction.js +99 -0
- package/lib/logic/transaction/craftTransaction.js.map +1 -0
- package/lib/logic/transaction/estimateFees.d.ts +3 -0
- package/lib/logic/transaction/estimateFees.d.ts.map +1 -0
- package/lib/logic/transaction/estimateFees.js +23 -0
- package/lib/logic/transaction/estimateFees.js.map +1 -0
- package/lib/logic/validateAddress.d.ts +4 -0
- package/lib/logic/validateAddress.d.ts.map +1 -0
- package/lib/logic/validateAddress.js +14 -0
- package/lib/logic/validateAddress.js.map +1 -0
- package/lib/logic/validateIntent.d.ts +3 -0
- package/lib/logic/validateIntent.d.ts.map +1 -0
- package/lib/logic/validateIntent.js +65 -0
- package/lib/logic/validateIntent.js.map +1 -0
- package/lib/network/getBlock.d.ts +3 -0
- package/lib/network/getBlock.d.ts.map +1 -0
- package/lib/network/getBlock.js +23 -0
- package/lib/network/getBlock.js.map +1 -0
- package/lib/network/getFees.d.ts.map +1 -1
- package/lib/network/getFees.js +2 -3
- package/lib/network/getFees.js.map +1 -1
- package/lib/network/index.d.ts +1 -0
- package/lib/network/index.d.ts.map +1 -1
- package/lib/network/index.js +1 -0
- package/lib/network/index.js.map +1 -1
- package/lib/network/sdk.d.ts.map +1 -1
- package/lib/network/sdk.js +14 -8
- package/lib/network/sdk.js.map +1 -1
- package/lib/test/bridgeDatasetTest.js +1 -1
- package/lib/test/bridgeDatasetTest.js.map +1 -1
- package/lib/test/msw-setup.d.ts +2 -0
- package/lib/test/msw-setup.d.ts.map +1 -0
- package/lib/test/msw-setup.js +9 -0
- package/lib/test/msw-setup.js.map +1 -0
- package/lib/test/msw.mock.d.ts +3 -0
- package/lib/test/msw.mock.d.ts.map +1 -0
- package/lib/test/msw.mock.js +9 -0
- package/lib/test/msw.mock.js.map +1 -0
- package/lib/types/network.d.ts +30 -0
- package/lib/types/network.d.ts.map +1 -1
- package/lib-es/api/index.d.ts +4 -0
- package/lib-es/api/index.d.ts.map +1 -0
- package/lib-es/api/index.js +42 -0
- package/lib-es/api/index.js.map +1 -0
- package/lib-es/bridge/getTransactionStatus.js +1 -1
- package/lib-es/bridge/getTransactionStatus.js.map +1 -1
- package/lib-es/logic/account/getBalance.d.ts +5 -0
- package/lib-es/logic/account/getBalance.d.ts.map +1 -0
- package/lib-es/logic/account/getBalance.js +20 -0
- package/lib-es/logic/account/getBalance.js.map +1 -0
- package/lib-es/logic/history/getBlock.d.ts +3 -0
- package/lib-es/logic/history/getBlock.d.ts.map +1 -0
- package/lib-es/logic/history/getBlock.js +32 -0
- package/lib-es/logic/history/getBlock.js.map +1 -0
- package/lib-es/logic/history/getBlockInfo.d.ts +6 -0
- package/lib-es/logic/history/getBlockInfo.d.ts.map +1 -0
- package/lib-es/logic/history/getBlockInfo.js +19 -0
- package/lib-es/logic/history/getBlockInfo.js.map +1 -0
- package/lib-es/logic/history/lastBlock.d.ts +3 -0
- package/lib-es/logic/history/lastBlock.d.ts.map +1 -0
- package/lib-es/logic/history/lastBlock.js +8 -0
- package/lib-es/logic/history/lastBlock.js.map +1 -0
- package/lib-es/logic/history/listOperations.d.ts +3 -0
- package/lib-es/logic/history/listOperations.d.ts.map +1 -0
- package/lib-es/logic/history/listOperations.js +47 -0
- package/lib-es/logic/history/listOperations.js.map +1 -0
- package/lib-es/logic/index.d.ts +12 -0
- package/lib-es/logic/index.d.ts.map +1 -0
- package/lib-es/logic/index.js +12 -0
- package/lib-es/logic/index.js.map +1 -0
- package/lib-es/logic/transaction/broadcast.d.ts +3 -0
- package/lib-es/logic/transaction/broadcast.d.ts.map +1 -0
- package/lib-es/logic/transaction/broadcast.js +7 -0
- package/lib-es/logic/transaction/broadcast.js.map +1 -0
- package/lib-es/logic/transaction/combine.d.ts +2 -0
- package/lib-es/logic/transaction/combine.d.ts.map +1 -0
- package/lib-es/logic/transaction/combine.js +8 -0
- package/lib-es/logic/transaction/combine.js.map +1 -0
- package/lib-es/logic/transaction/craftTransaction.d.ts +3 -0
- package/lib-es/logic/transaction/craftTransaction.d.ts.map +1 -0
- package/lib-es/logic/transaction/craftTransaction.js +96 -0
- package/lib-es/logic/transaction/craftTransaction.js.map +1 -0
- package/lib-es/logic/transaction/estimateFees.d.ts +3 -0
- package/lib-es/logic/transaction/estimateFees.d.ts.map +1 -0
- package/lib-es/logic/transaction/estimateFees.js +20 -0
- package/lib-es/logic/transaction/estimateFees.js.map +1 -0
- package/lib-es/logic/validateAddress.d.ts +4 -0
- package/lib-es/logic/validateAddress.d.ts.map +1 -0
- package/lib-es/logic/validateAddress.js +10 -0
- package/lib-es/logic/validateAddress.js.map +1 -0
- package/lib-es/logic/validateIntent.d.ts +3 -0
- package/lib-es/logic/validateIntent.d.ts.map +1 -0
- package/lib-es/logic/validateIntent.js +62 -0
- package/lib-es/logic/validateIntent.js.map +1 -0
- package/lib-es/network/getBlock.d.ts +3 -0
- package/lib-es/network/getBlock.d.ts.map +1 -0
- package/lib-es/network/getBlock.js +16 -0
- package/lib-es/network/getBlock.js.map +1 -0
- package/lib-es/network/getFees.d.ts.map +1 -1
- package/lib-es/network/getFees.js +1 -2
- package/lib-es/network/getFees.js.map +1 -1
- package/lib-es/network/index.d.ts +1 -0
- package/lib-es/network/index.d.ts.map +1 -1
- package/lib-es/network/index.js +1 -0
- package/lib-es/network/index.js.map +1 -1
- package/lib-es/network/sdk.d.ts.map +1 -1
- package/lib-es/network/sdk.js +8 -2
- package/lib-es/network/sdk.js.map +1 -1
- package/lib-es/test/bridgeDatasetTest.js +1 -1
- package/lib-es/test/bridgeDatasetTest.js.map +1 -1
- package/lib-es/test/msw-setup.d.ts +2 -0
- package/lib-es/test/msw-setup.d.ts.map +1 -0
- package/lib-es/test/msw-setup.js +7 -0
- package/lib-es/test/msw-setup.js.map +1 -0
- package/lib-es/test/msw.mock.d.ts +3 -0
- package/lib-es/test/msw.mock.d.ts.map +1 -0
- package/lib-es/test/msw.mock.js +6 -0
- package/lib-es/test/msw.mock.js.map +1 -0
- package/lib-es/types/network.d.ts +30 -0
- package/lib-es/types/network.d.ts.map +1 -1
- package/package.json +7 -8
- package/src/api/index.integ.test.ts +123 -0
- package/src/api/index.ts +89 -0
- package/src/api/index.unit.test.ts +234 -0
- package/src/bridge/getTransactionStatus.test.ts +1 -1
- package/src/bridge/getTransactionStatus.ts +1 -1
- package/src/bridge/synchronisation.test.ts +7 -3
- package/src/logic/account/getBalance.ts +24 -0
- package/src/logic/account/getBalance.unit.test.ts +50 -0
- package/src/logic/history/getBlock.ts +47 -0
- package/src/logic/history/getBlock.unit.test.ts +106 -0
- package/src/logic/history/getBlockInfo.ts +24 -0
- package/src/logic/history/getBlockInfo.unit.test.ts +30 -0
- package/src/logic/history/lastBlock.ts +9 -0
- package/src/logic/history/lastBlock.unit.test.ts +30 -0
- package/src/logic/history/listOperations.ts +64 -0
- package/src/logic/history/listOperations.unit.test.ts +129 -0
- package/src/logic/index.ts +11 -0
- package/src/logic/transaction/broadcast.msw.test.ts +23 -0
- package/src/logic/transaction/broadcast.ts +10 -0
- package/src/logic/transaction/broadcast.unit.test.ts +26 -0
- package/src/logic/transaction/combine.ts +10 -0
- package/src/logic/transaction/combine.unit.test.ts +37 -0
- package/src/logic/transaction/craftTransaction.ts +137 -0
- package/src/logic/transaction/craftTransaction.unit.test.ts +217 -0
- package/src/logic/transaction/estimateFees.ts +32 -0
- package/src/logic/transaction/estimateFees.unit.test.ts +102 -0
- package/src/logic/validateAddress.ts +15 -0
- package/src/logic/validateAddress.unit.test.ts +15 -0
- package/src/logic/validateIntent.ts +96 -0
- package/src/logic/validateIntent.unit.test.ts +156 -0
- package/src/network/getBlock.ts +23 -0
- package/src/network/getBlock.unit.test.ts +58 -0
- package/src/network/getFees.ts +1 -3
- package/src/network/index.ts +1 -0
- package/src/network/sdk.test.ts +32 -1
- package/src/network/sdk.ts +9 -2
- package/src/test/bridgeDatasetTest.ts +1 -1
- package/src/test/msw-setup.ts +7 -0
- package/src/test/msw.mock.ts +6 -0
- package/src/types/network.ts +34 -0
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { rejectBalanceOptions } from "@ledgerhq/coin-module-framework/api/getBalance/rejectBalanceOptions";
|
|
2
|
+
import { craftTransactionData } from "@ledgerhq/coin-module-framework/logic/craftTransactionData";
|
|
3
|
+
import { setCoinConfig } from "../config";
|
|
4
|
+
import { broadcast, combine, craftTransaction, estimateFees, getBalance, getBlock, getBlockInfo, lastBlock, listOperations, validateAddress, validateIntent, } from "../logic";
|
|
5
|
+
// CoinModuleApi (Alpaca) factory for VET + VTHO. `config` is re-wrapped to force `status: active`.
|
|
6
|
+
export function createApi(config, _currencyId) {
|
|
7
|
+
setCoinConfig(() => ({ ...config(), status: { type: "active" } }));
|
|
8
|
+
return {
|
|
9
|
+
lastBlock,
|
|
10
|
+
getBlockInfo,
|
|
11
|
+
getBlock,
|
|
12
|
+
getBalance: (address, options) => rejectBalanceOptions(() => getBalance(address), options),
|
|
13
|
+
listOperations,
|
|
14
|
+
craftTransaction: (transactionIntent, customFees) => craftTransaction(transactionIntent, customFees),
|
|
15
|
+
estimateFees: (transactionIntent, customFeesParameters) => estimateFees(transactionIntent, customFeesParameters),
|
|
16
|
+
combine,
|
|
17
|
+
broadcast,
|
|
18
|
+
validateIntent: (transactionIntent, balances, customFees) => validateIntent(transactionIntent, balances, customFees),
|
|
19
|
+
craftTransactionData,
|
|
20
|
+
validateAddress: (address, parameters) => validateAddress(address, parameters),
|
|
21
|
+
// --- Not applicable / not supported for VeChain ---
|
|
22
|
+
getNextSequence: (_address) => {
|
|
23
|
+
throw new Error("getNextSequence is not applicable for Vechain");
|
|
24
|
+
},
|
|
25
|
+
craftRawTransaction: (_transaction, _sender, _publicKey, _sequence) => {
|
|
26
|
+
throw new Error("craftRawTransaction is not supported");
|
|
27
|
+
},
|
|
28
|
+
call: () => {
|
|
29
|
+
throw new Error("call is not supported");
|
|
30
|
+
},
|
|
31
|
+
getStakes: (_address, _cursor) => {
|
|
32
|
+
throw new Error("getStakes is not supported");
|
|
33
|
+
},
|
|
34
|
+
getRewards: (_address, _cursor) => {
|
|
35
|
+
throw new Error("getRewards is not supported");
|
|
36
|
+
},
|
|
37
|
+
getValidators: (_cursor) => {
|
|
38
|
+
throw new Error("getValidators is not supported");
|
|
39
|
+
},
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/api/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,qEAAqE,CAAC;AAC3G,OAAO,EAAE,oBAAoB,EAAE,MAAM,4DAA4D,CAAC;AAgBlG,OAAO,EAAE,aAAa,EAA0B,MAAM,WAAW,CAAC;AAClE,OAAO,EACL,SAAS,EACT,OAAO,EACP,gBAAgB,EAChB,YAAY,EACZ,UAAU,EACV,QAAQ,EACR,YAAY,EACZ,SAAS,EACT,cAAc,EACd,eAAe,EACf,cAAc,GACf,MAAM,UAAU,CAAC;AAElB,mGAAmG;AACnG,MAAM,UAAU,SAAS,CAAC,MAAyB,EAAE,WAAmB;IACtE,aAAa,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,GAAG,MAAM,EAAE,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC;IAEnE,OAAO;QACL,SAAS;QACT,YAAY;QACZ,QAAQ;QACR,UAAU,EAAE,CAAC,OAAe,EAAE,OAAwB,EAAsB,EAAE,CAC5E,oBAAoB,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;QAC1D,cAAc;QACd,gBAAgB,EAAE,CAChB,iBAAoC,EACpC,UAA0B,EACG,EAAE,CAAC,gBAAgB,CAAC,iBAAiB,EAAE,UAAU,CAAC;QACjF,YAAY,EAAE,CACZ,iBAAoC,EACpC,oBAAkD,EAC1B,EAAE,CAAC,YAAY,CAAC,iBAAiB,EAAE,oBAAoB,CAAC;QAClF,OAAO;QACP,SAAS;QACT,cAAc,EAAE,CACd,iBAAoC,EACpC,QAAmB,EACnB,UAA0B,EACM,EAAE,CAAC,cAAc,CAAC,iBAAiB,EAAE,QAAQ,EAAE,UAAU,CAAC;QAC5F,oBAAoB;QACpB,eAAe,EAAE,CACf,OAAe,EACf,UAAwD,EACtC,EAAE,CAAC,eAAe,CAAC,OAAO,EAAE,UAAU,CAAC;QAC3D,qDAAqD;QACrD,eAAe,EAAE,CAAC,QAAgB,EAAmB,EAAE;YACrD,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;QACnE,CAAC;QACD,mBAAmB,EAAE,CACnB,YAAoB,EACpB,OAAe,EACf,UAAkB,EAClB,SAAiB,EACY,EAAE;YAC/B,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;QAC1D,CAAC;QACD,IAAI,EAAE,GAAG,EAAE;YACT,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;QAC3C,CAAC;QACD,SAAS,EAAE,CAAC,QAAgB,EAAE,OAAgB,EAAwB,EAAE;YACtE,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;QAChD,CAAC;QACD,UAAU,EAAE,CAAC,QAAgB,EAAE,OAAgB,EAAyB,EAAE;YACxE,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;QACjD,CAAC;QACD,aAAa,EAAE,CAAC,OAAgB,EAA4B,EAAE;YAC5D,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;QACpD,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import BigNumber from "bignumber.js";
|
|
2
|
-
import { AmountRequired, FeeNotLoaded, InvalidAddress, InvalidAddressBecauseDestinationIsAlsoSource, NotEnoughBalance, RecipientRequired, } from "@ledgerhq/errors";
|
|
2
|
+
import { AmountRequired, FeeNotLoaded, InvalidAddress, InvalidAddressBecauseDestinationIsAlsoSource, NotEnoughBalance, RecipientRequired, } from "@ledgerhq/ledger-wallet-framework/errors";
|
|
3
3
|
import { calculateTransactionInfo, parseAddress } from "../common-logic";
|
|
4
4
|
import { NotEnoughVTHO } from "../errors";
|
|
5
5
|
export const getTransactionStatus = async (account, transaction) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getTransactionStatus.js","sourceRoot":"","sources":["../../src/bridge/getTransactionStatus.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,cAAc,CAAC;AACrC,OAAO,EACL,cAAc,EACd,YAAY,EACZ,cAAc,EACd,4CAA4C,EAC5C,gBAAgB,EAChB,iBAAiB,GAClB,MAAM,
|
|
1
|
+
{"version":3,"file":"getTransactionStatus.js","sourceRoot":"","sources":["../../src/bridge/getTransactionStatus.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { AssetInfo, Balance } from "@ledgerhq/coin-module-framework/api/index";
|
|
2
|
+
export declare const NATIVE_ASSET: AssetInfo;
|
|
3
|
+
export declare const vthoAsset: (address: string) => AssetInfo;
|
|
4
|
+
export declare function getBalance(address: string): Promise<Balance[]>;
|
|
5
|
+
//# sourceMappingURL=getBalance.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getBalance.d.ts","sourceRoot":"","sources":["../../../src/logic/account/getBalance.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,2CAA2C,CAAC;AAIpF,eAAO,MAAM,YAAY,EAAE,SAA2C,CAAC;AAIvE,eAAO,MAAM,SAAS,YAAa,MAAM,KAAG,SAK1C,CAAC;AAGH,wBAAsB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAOpE"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { VTHO_ADDRESS } from "@vechain/sdk-core";
|
|
2
|
+
import { getAccount } from "../../network";
|
|
3
|
+
export const NATIVE_ASSET = { type: "native", name: "VET" };
|
|
4
|
+
// `assetOwner` lets the generic coin-framework adapter attach the VTHO balance to its sub-account
|
|
5
|
+
// (buildSubAccounts filters by `extra.assetReference` + `extra.assetOwner`). Mirrors coin-tron.
|
|
6
|
+
export const vthoAsset = (address) => ({
|
|
7
|
+
type: "token",
|
|
8
|
+
assetReference: VTHO_ADDRESS,
|
|
9
|
+
assetOwner: address,
|
|
10
|
+
name: "VTHO",
|
|
11
|
+
});
|
|
12
|
+
// VET + VTHO balances from Thor's /accounts/{address} (both returned in one call); 0 if absent.
|
|
13
|
+
export async function getBalance(address) {
|
|
14
|
+
const { balance, energy } = await getAccount(address);
|
|
15
|
+
return [
|
|
16
|
+
{ value: BigInt(balance || "0"), asset: NATIVE_ASSET },
|
|
17
|
+
{ value: BigInt(energy || "0"), asset: vthoAsset(address) },
|
|
18
|
+
];
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=getBalance.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getBalance.js","sourceRoot":"","sources":["../../../src/logic/account/getBalance.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAE3C,MAAM,CAAC,MAAM,YAAY,GAAc,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;AAEvE,kGAAkG;AAClG,gGAAgG;AAChG,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,OAAe,EAAa,EAAE,CAAC,CAAC;IACxD,IAAI,EAAE,OAAO;IACb,cAAc,EAAE,YAAY;IAC5B,UAAU,EAAE,OAAO;IACnB,IAAI,EAAE,MAAM;CACb,CAAC,CAAC;AAEH,gGAAgG;AAChG,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,OAAe;IAC9C,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,CAAC;IAEtD,OAAO;QACL,EAAE,KAAK,EAAE,MAAM,CAAC,OAAO,IAAI,GAAG,CAAC,EAAE,KAAK,EAAE,YAAY,EAAE;QACtD,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC,EAAE,KAAK,EAAE,SAAS,CAAC,OAAO,CAAC,EAAE;KAC5D,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getBlock.d.ts","sourceRoot":"","sources":["../../../src/logic/history/getBlock.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,KAAK,EAGN,MAAM,2CAA2C,CAAC;AAOnD,wBAAsB,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CAa7D"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { getBlock as getBlockFromNetwork } from "../../network";
|
|
2
|
+
import { toBlockInfo } from "./getBlockInfo";
|
|
3
|
+
// Full expanded block; block info is derived from it (no separate fetch). Only native VET transfers
|
|
4
|
+
// map to operations; VTHO (VIP-180) movements are ABI-encoded events, not decoded here.
|
|
5
|
+
export async function getBlock(height) {
|
|
6
|
+
const block = await getBlockFromNetwork(height, true);
|
|
7
|
+
if (!block) {
|
|
8
|
+
throw new Error(`vechain: no block at height ${height}`);
|
|
9
|
+
}
|
|
10
|
+
const transactions = block.transactions;
|
|
11
|
+
return {
|
|
12
|
+
info: toBlockInfo(block),
|
|
13
|
+
transactions: transactions.map(toBlockTransaction),
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
function toBlockTransaction(tx) {
|
|
17
|
+
const operations = tx.outputs.flatMap(output => output.transfers.map((transfer) => ({
|
|
18
|
+
type: "transfer",
|
|
19
|
+
address: transfer.recipient,
|
|
20
|
+
peer: transfer.sender,
|
|
21
|
+
asset: { type: "native" },
|
|
22
|
+
amount: BigInt(transfer.amount || "0"),
|
|
23
|
+
})));
|
|
24
|
+
return {
|
|
25
|
+
hash: tx.id,
|
|
26
|
+
failed: tx.reverted,
|
|
27
|
+
operations,
|
|
28
|
+
fees: BigInt(tx.paid || "0"),
|
|
29
|
+
feesPayer: tx.gasPayer ?? tx.origin,
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=getBlock.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getBlock.js","sourceRoot":"","sources":["../../../src/logic/history/getBlock.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,QAAQ,IAAI,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAEhE,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE7C,oGAAoG;AACpG,wFAAwF;AACxF,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,MAAc;IAC3C,MAAM,KAAK,GAAG,MAAM,mBAAmB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAEtD,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CAAC,+BAA+B,MAAM,EAAE,CAAC,CAAC;IAC3D,CAAC;IAED,MAAM,YAAY,GAAG,KAAK,CAAC,YAA6C,CAAC;IAEzE,OAAO;QACL,IAAI,EAAE,WAAW,CAAC,KAAK,CAAC;QACxB,YAAY,EAAE,YAAY,CAAC,GAAG,CAAC,kBAAkB,CAAC;KACnD,CAAC;AACJ,CAAC;AAED,SAAS,kBAAkB,CAAC,EAA+B;IACzD,MAAM,UAAU,GAAqB,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAC/D,MAAM,CAAC,SAAS,CAAC,GAAG,CAClB,CAAC,QAAQ,EAAkB,EAAE,CAAC,CAAC;QAC7B,IAAI,EAAE,UAAU;QAChB,OAAO,EAAE,QAAQ,CAAC,SAAS;QAC3B,IAAI,EAAE,QAAQ,CAAC,MAAM;QACrB,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;QACzB,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,IAAI,GAAG,CAAC;KACvC,CAAC,CACH,CACF,CAAC;IAEF,OAAO;QACL,IAAI,EAAE,EAAE,CAAC,EAAE;QACX,MAAM,EAAE,EAAE,CAAC,QAAQ;QACnB,UAAU;QACV,IAAI,EAAE,MAAM,CAAC,EAAE,CAAC,IAAI,IAAI,GAAG,CAAC;QAC5B,SAAS,EAAE,EAAE,CAAC,QAAQ,IAAI,EAAE,CAAC,MAAM;KACpC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { BlockInfo } from "@ledgerhq/coin-module-framework/api/index";
|
|
2
|
+
import type { ApiResponseBlock } from "../../types";
|
|
3
|
+
export declare function toBlockInfo(block: ApiResponseBlock): BlockInfo;
|
|
4
|
+
/** Block metadata (height/hash/time) at a given block height, via Thor `GET /blocks/{height}`. */
|
|
5
|
+
export declare function getBlockInfo(height: number): Promise<BlockInfo>;
|
|
6
|
+
//# sourceMappingURL=getBlockInfo.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getBlockInfo.d.ts","sourceRoot":"","sources":["../../../src/logic/history/getBlockInfo.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,2CAA2C,CAAC;AAE3E,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAGpD,wBAAgB,WAAW,CAAC,KAAK,EAAE,gBAAgB,GAAG,SAAS,CAO9D;AAED,kGAAkG;AAClG,wBAAsB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAQrE"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { getBlock as getBlockFromNetwork } from "../../network";
|
|
2
|
+
// Map a Thor block to BlockInfo (id/number/timestamp are present regardless of `expanded`).
|
|
3
|
+
export function toBlockInfo(block) {
|
|
4
|
+
return {
|
|
5
|
+
height: block.number,
|
|
6
|
+
hash: block.id,
|
|
7
|
+
// Thor block timestamps are unix seconds.
|
|
8
|
+
time: new Date(block.timestamp * 1000),
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
|
+
/** Block metadata (height/hash/time) at a given block height, via Thor `GET /blocks/{height}`. */
|
|
12
|
+
export async function getBlockInfo(height) {
|
|
13
|
+
const block = await getBlockFromNetwork(height);
|
|
14
|
+
if (!block) {
|
|
15
|
+
throw new Error(`vechain: no block at height ${height}`);
|
|
16
|
+
}
|
|
17
|
+
return toBlockInfo(block);
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=getBlockInfo.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getBlockInfo.js","sourceRoot":"","sources":["../../../src/logic/history/getBlockInfo.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,IAAI,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAGhE,4FAA4F;AAC5F,MAAM,UAAU,WAAW,CAAC,KAAuB;IACjD,OAAO;QACL,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,IAAI,EAAE,KAAK,CAAC,EAAE;QACd,0CAA0C;QAC1C,IAAI,EAAE,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC;KACvC,CAAC;AACJ,CAAC;AAED,kGAAkG;AAClG,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,MAAc;IAC/C,MAAM,KAAK,GAAG,MAAM,mBAAmB,CAAC,MAAM,CAAC,CAAC;IAEhD,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CAAC,+BAA+B,MAAM,EAAE,CAAC,CAAC;IAC3D,CAAC;IAED,OAAO,WAAW,CAAC,KAAK,CAAC,CAAC;AAC5B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lastBlock.d.ts","sourceRoot":"","sources":["../../../src/logic/history/lastBlock.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,2CAA2C,CAAC;AAK3E,wBAAsB,SAAS,IAAI,OAAO,CAAC,SAAS,CAAC,CAGpD"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { getLastBlockHeight } from "../../network";
|
|
2
|
+
import { getBlockInfo } from "./getBlockInfo";
|
|
3
|
+
// Latest block; /blocks/best exposes only the height, so hash/time come from getBlockInfo.
|
|
4
|
+
export async function lastBlock() {
|
|
5
|
+
const height = await getLastBlockHeight();
|
|
6
|
+
return getBlockInfo(height);
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=lastBlock.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lastBlock.js","sourceRoot":"","sources":["../../../src/logic/history/lastBlock.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C,2FAA2F;AAC3F,MAAM,CAAC,KAAK,UAAU,SAAS;IAC7B,MAAM,MAAM,GAAG,MAAM,kBAAkB,EAAE,CAAC;IAC1C,OAAO,YAAY,CAAC,MAAM,CAAC,CAAC;AAC9B,CAAC"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import type { ListOperationsOptions, MemoNotSupported, Operation, Page } from "@ledgerhq/coin-module-framework/api/index";
|
|
2
|
+
export declare function listOperations(address: string, options: ListOperationsOptions): Promise<Page<Operation<MemoNotSupported>>>;
|
|
3
|
+
//# sourceMappingURL=listOperations.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"listOperations.d.ts","sourceRoot":"","sources":["../../../src/logic/history/listOperations.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,qBAAqB,EACrB,gBAAgB,EAChB,SAAS,EACT,IAAI,EACL,MAAM,2CAA2C,CAAC;AAgCnD,wBAAsB,cAAc,CAClC,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,qBAAqB,GAC7B,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAsB5C"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { VTHO_ADDRESS } from "@vechain/sdk-core";
|
|
2
|
+
import { getLastBlockHeight, getOperations, getTokenOperations } from "../../network";
|
|
3
|
+
import { NATIVE_ASSET, vthoAsset } from "../account/getBalance";
|
|
4
|
+
function toFrameworkOperation(op, asset) {
|
|
5
|
+
return {
|
|
6
|
+
id: op.id,
|
|
7
|
+
type: op.type,
|
|
8
|
+
senders: op.senders,
|
|
9
|
+
recipients: op.recipients,
|
|
10
|
+
value: BigInt(op.value.toFixed(0)),
|
|
11
|
+
asset,
|
|
12
|
+
details: { ledgerOpType: op.type },
|
|
13
|
+
tx: {
|
|
14
|
+
hash: op.hash,
|
|
15
|
+
block: { height: op.blockHeight ?? 0, hash: op.blockHash ?? "", time: op.date },
|
|
16
|
+
fees: asset.type === "native" ? 0n : BigInt((op.fee ?? 0).toFixed(0)),
|
|
17
|
+
date: op.date,
|
|
18
|
+
failed: op.hasFailed ?? false,
|
|
19
|
+
},
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
function parseCursor(options) {
|
|
23
|
+
const parsed = options.cursor ? Number.parseInt(options.cursor, 10) : Number.NaN;
|
|
24
|
+
const fromCursor = !Number.isNaN(parsed) && parsed >= 1 ? parsed : 1;
|
|
25
|
+
return Math.max(fromCursor, options.minHeight || 0);
|
|
26
|
+
}
|
|
27
|
+
// Merged VET + VTHO operations; `next` is one block past the current head for incremental resume.
|
|
28
|
+
export async function listOperations(address, options) {
|
|
29
|
+
const startAt = parseCursor(options);
|
|
30
|
+
const stopAt = await getLastBlockHeight();
|
|
31
|
+
if (startAt > stopAt) {
|
|
32
|
+
return { items: [], next: String(startAt) };
|
|
33
|
+
}
|
|
34
|
+
const [vetOps, vthoOps] = await Promise.all([
|
|
35
|
+
getOperations(address, address, startAt, stopAt),
|
|
36
|
+
getTokenOperations(address, address, VTHO_ADDRESS, startAt, stopAt),
|
|
37
|
+
]);
|
|
38
|
+
const items = [
|
|
39
|
+
...vetOps.map(op => toFrameworkOperation(op, NATIVE_ASSET)),
|
|
40
|
+
...vthoOps.map(op => toFrameworkOperation(op, vthoAsset(address))),
|
|
41
|
+
].sort((a, b) => b.tx.date.getTime() - a.tx.date.getTime());
|
|
42
|
+
return {
|
|
43
|
+
items,
|
|
44
|
+
next: String(stopAt + 1),
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=listOperations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"listOperations.js","sourceRoot":"","sources":["../../../src/logic/history/listOperations.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export * from "./account/getBalance";
|
|
2
|
+
export * from "./history/getBlock";
|
|
3
|
+
export * from "./history/getBlockInfo";
|
|
4
|
+
export * from "./history/lastBlock";
|
|
5
|
+
export * from "./history/listOperations";
|
|
6
|
+
export * from "./transaction/broadcast";
|
|
7
|
+
export * from "./transaction/combine";
|
|
8
|
+
export * from "./transaction/craftTransaction";
|
|
9
|
+
export * from "./transaction/estimateFees";
|
|
10
|
+
export * from "./validateAddress";
|
|
11
|
+
export * from "./validateIntent";
|
|
12
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/logic/index.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC;AACnC,cAAc,wBAAwB,CAAC;AACvC,cAAc,qBAAqB,CAAC;AACpC,cAAc,0BAA0B,CAAC;AACzC,cAAc,yBAAyB,CAAC;AACxC,cAAc,uBAAuB,CAAC;AACtC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export * from "./account/getBalance";
|
|
2
|
+
export * from "./history/getBlock";
|
|
3
|
+
export * from "./history/getBlockInfo";
|
|
4
|
+
export * from "./history/lastBlock";
|
|
5
|
+
export * from "./history/listOperations";
|
|
6
|
+
export * from "./transaction/broadcast";
|
|
7
|
+
export * from "./transaction/combine";
|
|
8
|
+
export * from "./transaction/craftTransaction";
|
|
9
|
+
export * from "./transaction/estimateFees";
|
|
10
|
+
export * from "./validateAddress";
|
|
11
|
+
export * from "./validateIntent";
|
|
12
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/logic/index.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC;AACnC,cAAc,wBAAwB,CAAC;AACvC,cAAc,qBAAqB,CAAC;AACpC,cAAc,0BAA0B,CAAC;AACzC,cAAc,yBAAyB,CAAC;AACxC,cAAc,uBAAuB,CAAC;AACtC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"broadcast.d.ts","sourceRoot":"","sources":["../../../src/logic/transaction/broadcast.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,2CAA2C,CAAC;AAKjF,wBAAsB,SAAS,CAAC,EAAE,EAAE,MAAM,EAAE,gBAAgB,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC,CAI/F"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { submit } from "../../network";
|
|
2
|
+
// Submit a signed tx (hex from combine) via Thor POST /transactions.
|
|
3
|
+
export async function broadcast(tx, _broadcastConfig) {
|
|
4
|
+
const encoded = Uint8Array.from(Buffer.from(tx.replace(/^0x/, ""), "hex"));
|
|
5
|
+
return submit({ encoded });
|
|
6
|
+
}
|
|
7
|
+
//# sourceMappingURL=broadcast.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"broadcast.js","sourceRoot":"","sources":["../../../src/logic/transaction/broadcast.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAGvC,qEAAqE;AACrE,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,EAAU,EAAE,gBAAkC;IAC5E,MAAM,OAAO,GAAG,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;IAE3E,OAAO,MAAM,CAAC,EAAE,OAAO,EAA2B,CAAC,CAAC;AACtD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"combine.d.ts","sourceRoot":"","sources":["../../../src/logic/transaction/combine.ts"],"names":[],"mappings":"AAIA,wBAAgB,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAK7D"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { VechainSDKTransaction } from "../../types";
|
|
2
|
+
// Attach the signature to the crafted body and return the signed, hex-encoded tx for broadcast.
|
|
3
|
+
export function combine(tx, signature) {
|
|
4
|
+
const body = JSON.parse(tx);
|
|
5
|
+
const signed = VechainSDKTransaction.of(body, Buffer.from(signature, "hex"));
|
|
6
|
+
return `0x${Buffer.from(signed.encoded).toString("hex")}`;
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=combine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"combine.js","sourceRoot":"","sources":["../../../src/logic/transaction/combine.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAEpD,gGAAgG;AAChG,MAAM,UAAU,OAAO,CAAC,EAAU,EAAE,SAAiB;IACnD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAA8B,CAAC;IACzD,MAAM,MAAM,GAAG,qBAAqB,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC;IAE7E,OAAO,KAAK,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;AAC5D,CAAC"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import type { CraftedTransaction, FeeEstimation, TransactionIntent } from "@ledgerhq/coin-module-framework/api/index";
|
|
2
|
+
export declare function craftTransaction(intent: TransactionIntent, customFees?: FeeEstimation): Promise<CraftedTransaction>;
|
|
3
|
+
//# sourceMappingURL=craftTransaction.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"craftTransaction.d.ts","sourceRoot":"","sources":["../../../src/logic/transaction/craftTransaction.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,kBAAkB,EAClB,aAAa,EACb,iBAAiB,EAClB,MAAM,2CAA2C,CAAC;AAuEnD,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,iBAAiB,EACzB,UAAU,CAAC,EAAE,aAAa,GACzB,OAAO,CAAC,kBAAkB,CAAC,CAyD7B"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { BigNumber } from "bignumber.js";
|
|
2
|
+
import { calculateClausesVet, calculateClausesVtho, generateNonce, parseAddress, } from "../../common-logic";
|
|
3
|
+
import { estimateGas } from "../../common-logic/estimateGas";
|
|
4
|
+
import { getThorClient } from "../../common-logic/getThorClient";
|
|
5
|
+
import { getAccount, getBlockRef } from "../../network";
|
|
6
|
+
import { MAINNET_CHAIN_TAG } from "../../types";
|
|
7
|
+
const EXPIRATION = 18;
|
|
8
|
+
function isTokenAsset(intent) {
|
|
9
|
+
return intent.asset.type !== "native";
|
|
10
|
+
}
|
|
11
|
+
async function resolveAmount(intent, isToken) {
|
|
12
|
+
if (!intent.useAllAmount) {
|
|
13
|
+
return new BigNumber(intent.amount.toString());
|
|
14
|
+
}
|
|
15
|
+
const { balance, energy } = await getAccount(intent.sender);
|
|
16
|
+
return new BigNumber((isToken ? energy : balance) || "0");
|
|
17
|
+
}
|
|
18
|
+
async function resolveGasFees(clauses, sender, customFees) {
|
|
19
|
+
const custom = customFees?.parameters;
|
|
20
|
+
// Fast path: a full override covers every field, so skip the network round trip entirely.
|
|
21
|
+
if (custom?.gas !== undefined &&
|
|
22
|
+
custom.maxFeePerGas !== undefined &&
|
|
23
|
+
custom.maxPriorityFeePerGas !== undefined) {
|
|
24
|
+
return {
|
|
25
|
+
gas: Number(custom.gas),
|
|
26
|
+
maxFeePerGas: Number(custom.maxFeePerGas),
|
|
27
|
+
maxPriorityFeePerGas: Number(custom.maxPriorityFeePerGas),
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
const gasResult = await estimateGas(clauses, sender);
|
|
31
|
+
const thorClient = getThorClient();
|
|
32
|
+
const body = await thorClient.transactions.buildTransactionBody(clauses, gasResult.totalGas, {});
|
|
33
|
+
// Partial override: apply each provided field individually over the estimate, so e.g. a
|
|
34
|
+
// gas-only override is honoured instead of being discarded by an all-or-nothing check. Coerce
|
|
35
|
+
// every field to a JS number: the generic coin-framework hands fee parameters back as bigint,
|
|
36
|
+
// and a bigint here reaches `JSON.stringify(body)` below, which cannot serialize it.
|
|
37
|
+
return {
|
|
38
|
+
gas: Number(custom?.gas ?? gasResult.totalGas),
|
|
39
|
+
maxFeePerGas: Number(custom?.maxFeePerGas ?? body.maxFeePerGas ?? "0"),
|
|
40
|
+
maxPriorityFeePerGas: Number(custom?.maxPriorityFeePerGas ?? body.maxPriorityFeePerGas ?? "0"),
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
// Craft an unsigned single-clause Thor tx (VET transfer, or VIP-180 transfer for VTHO). The returned
|
|
44
|
+
// transaction is the JSON VechainSDKTransactionBody that combine() parses back — keep them in sync.
|
|
45
|
+
export async function craftTransaction(intent, customFees) {
|
|
46
|
+
if (!intent.recipient) {
|
|
47
|
+
throw new Error("vechain: recipient is required");
|
|
48
|
+
}
|
|
49
|
+
// Validate sender up front: it is used for I/O (getAccount, estimateGas) below, so a malformed
|
|
50
|
+
// value should fail clearly here instead of after a wasted network round trip.
|
|
51
|
+
if (!parseAddress(intent.sender)) {
|
|
52
|
+
throw new Error("vechain: invalid sender address");
|
|
53
|
+
}
|
|
54
|
+
const isToken = isTokenAsset(intent);
|
|
55
|
+
let amount = await resolveAmount(intent, isToken);
|
|
56
|
+
if (amount.lte(0)) {
|
|
57
|
+
throw new Error("vechain: transaction amount must be positive");
|
|
58
|
+
}
|
|
59
|
+
let clauses = isToken
|
|
60
|
+
? await calculateClausesVtho(intent.recipient, amount)
|
|
61
|
+
: await calculateClausesVet(intent.recipient, amount);
|
|
62
|
+
const [{ gas, maxFeePerGas, maxPriorityFeePerGas }, blockRef] = await Promise.all([
|
|
63
|
+
resolveGasFees(clauses, intent.sender, customFees),
|
|
64
|
+
getBlockRef(),
|
|
65
|
+
]);
|
|
66
|
+
const fee = new BigNumber(maxFeePerGas).times(gas);
|
|
67
|
+
if (intent.useAllAmount && isToken) {
|
|
68
|
+
amount = amount.minus(fee);
|
|
69
|
+
if (amount.lte(0)) {
|
|
70
|
+
throw new Error("vechain: VTHO balance too low to cover the transaction gas fee");
|
|
71
|
+
}
|
|
72
|
+
clauses = await calculateClausesVtho(intent.recipient, amount);
|
|
73
|
+
}
|
|
74
|
+
const body = {
|
|
75
|
+
chainTag: MAINNET_CHAIN_TAG,
|
|
76
|
+
blockRef,
|
|
77
|
+
expiration: EXPIRATION,
|
|
78
|
+
clauses,
|
|
79
|
+
gas,
|
|
80
|
+
maxFeePerGas,
|
|
81
|
+
maxPriorityFeePerGas,
|
|
82
|
+
dependsOn: null,
|
|
83
|
+
nonce: generateNonce(),
|
|
84
|
+
};
|
|
85
|
+
return {
|
|
86
|
+
transaction: JSON.stringify(body),
|
|
87
|
+
details: {
|
|
88
|
+
fee: fee.toFixed(0),
|
|
89
|
+
gas,
|
|
90
|
+
maxFeePerGas,
|
|
91
|
+
maxPriorityFeePerGas,
|
|
92
|
+
isTokenAccount: isToken,
|
|
93
|
+
},
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=craftTransaction.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"craftTransaction.js","sourceRoot":"","sources":["../../../src/logic/transaction/craftTransaction.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import type { FeeEstimation, TransactionIntent } from "@ledgerhq/coin-module-framework/api/index";
|
|
2
|
+
export declare function estimateFees(intent: TransactionIntent, customFeesParameters?: FeeEstimation["parameters"]): Promise<FeeEstimation>;
|
|
3
|
+
//# sourceMappingURL=estimateFees.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"estimateFees.d.ts","sourceRoot":"","sources":["../../../src/logic/transaction/estimateFees.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,2CAA2C,CAAC;AAKlG,wBAAsB,YAAY,CAChC,MAAM,EAAE,iBAAiB,EACzB,oBAAoB,CAAC,EAAE,aAAa,CAAC,YAAY,CAAC,GACjD,OAAO,CAAC,aAAa,CAAC,CAuBxB"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { parseAddress } from "../../common-logic";
|
|
2
|
+
import { craftTransaction } from "./craftTransaction";
|
|
3
|
+
// Estimate VTHO gas by crafting the unsigned tx and reading back its settled fee/gas parameters.
|
|
4
|
+
export async function estimateFees(intent, customFeesParameters) {
|
|
5
|
+
if (!intent.recipient || !parseAddress(intent.recipient)) {
|
|
6
|
+
return { value: 0n, parameters: {} };
|
|
7
|
+
}
|
|
8
|
+
const estimationIntent = !intent.useAllAmount && intent.amount <= 0n ? { ...intent, amount: 1n } : intent;
|
|
9
|
+
const { details } = await craftTransaction(estimationIntent, customFeesParameters ? { value: 0n, parameters: customFeesParameters } : undefined);
|
|
10
|
+
const fee = typeof details?.fee === "string" ? details.fee : "0";
|
|
11
|
+
return {
|
|
12
|
+
value: BigInt(fee),
|
|
13
|
+
parameters: {
|
|
14
|
+
gas: details?.gas,
|
|
15
|
+
maxFeePerGas: details?.maxFeePerGas,
|
|
16
|
+
maxPriorityFeePerGas: details?.maxPriorityFeePerGas,
|
|
17
|
+
},
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=estimateFees.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"estimateFees.js","sourceRoot":"","sources":["../../../src/logic/transaction/estimateFees.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEtD,iGAAiG;AACjG,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,MAAyB,EACzB,oBAAkD;IAElD,IAAI,CAAC,MAAM,CAAC,SAAS,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;QACzD,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC;IACvC,CAAC;IAED,MAAM,gBAAgB,GACpB,CAAC,MAAM,CAAC,YAAY,IAAI,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC;IAEnF,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,gBAAgB,CACxC,gBAAgB,EAChB,oBAAoB,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,UAAU,EAAE,oBAAoB,EAAE,CAAC,CAAC,CAAC,SAAS,CACnF,CAAC;IAEF,MAAM,GAAG,GAAG,OAAO,OAAO,EAAE,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;IAEjE,OAAO;QACL,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC;QAClB,UAAU,EAAE;YACV,GAAG,EAAE,OAAO,EAAE,GAAG;YACjB,YAAY,EAAE,OAAO,EAAE,YAAY;YACnC,oBAAoB,EAAE,OAAO,EAAE,oBAAoB;SACpD;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { AddressValidationCurrencyParameters } from "@ledgerhq/coin-module-framework/api/index";
|
|
2
|
+
export declare function isValidAddress(address: string): boolean;
|
|
3
|
+
export declare function validateAddress(address: string, _parameters: Partial<AddressValidationCurrencyParameters>): Promise<boolean>;
|
|
4
|
+
//# sourceMappingURL=validateAddress.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validateAddress.d.ts","sourceRoot":"","sources":["../../src/logic/validateAddress.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mCAAmC,EAAE,MAAM,2CAA2C,CAAC;AAKrG,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAEvD;AAED,wBAAsB,eAAe,CACnC,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,OAAO,CAAC,mCAAmC,CAAC,GACxD,OAAO,CAAC,OAAO,CAAC,CAElB"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { parseAddress } from "../common-logic";
|
|
2
|
+
// Validate a VeChain address. Kept in logic/ so api/ depends on the logic layer for validation
|
|
3
|
+
// like every other method, rather than reaching into common-logic directly.
|
|
4
|
+
export function isValidAddress(address) {
|
|
5
|
+
return parseAddress(address);
|
|
6
|
+
}
|
|
7
|
+
export async function validateAddress(address, _parameters) {
|
|
8
|
+
return isValidAddress(address);
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=validateAddress.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validateAddress.js","sourceRoot":"","sources":["../../src/logic/validateAddress.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAE/C,+FAA+F;AAC/F,4EAA4E;AAC5E,MAAM,UAAU,cAAc,CAAC,OAAe;IAC5C,OAAO,YAAY,CAAC,OAAO,CAAC,CAAC;AAC/B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,OAAe,EACf,WAAyD;IAEzD,OAAO,cAAc,CAAC,OAAO,CAAC,CAAC;AACjC,CAAC"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import type { Balance, FeeEstimation, MemoNotSupported, TransactionIntent, TransactionValidation } from "@ledgerhq/coin-module-framework/api/index";
|
|
2
|
+
export declare function validateIntent(intent: TransactionIntent<MemoNotSupported>, balances: Balance[], customFees?: FeeEstimation): Promise<TransactionValidation>;
|
|
3
|
+
//# sourceMappingURL=validateIntent.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validateIntent.d.ts","sourceRoot":"","sources":["../../src/logic/validateIntent.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,OAAO,EACP,aAAa,EACb,gBAAgB,EAChB,iBAAiB,EACjB,qBAAqB,EACtB,MAAM,2CAA2C,CAAC;AA8CnD,wBAAsB,cAAc,CAClC,MAAM,EAAE,iBAAiB,CAAC,gBAAgB,CAAC,EAC3C,QAAQ,EAAE,OAAO,EAAE,EACnB,UAAU,CAAC,EAAE,aAAa,GACzB,OAAO,CAAC,qBAAqB,CAAC,CAuChC"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { AmountRequired, InvalidAddress, InvalidAddressBecauseDestinationIsAlsoSource, NotEnoughBalance, RecipientRequired, } from "@ledgerhq/ledger-wallet-framework/errors";
|
|
2
|
+
import { parseAddress } from "../common-logic";
|
|
3
|
+
import { NotEnoughVTHO } from "../errors";
|
|
4
|
+
function isTokenAsset(intent) {
|
|
5
|
+
return intent.asset.type !== "native";
|
|
6
|
+
}
|
|
7
|
+
function spendable(balances, isToken) {
|
|
8
|
+
const asset = balances.find(b => isToken ? b.asset.type !== "native" : b.asset.type === "native");
|
|
9
|
+
return (asset?.value ?? 0n) - (asset?.locked ?? 0n);
|
|
10
|
+
}
|
|
11
|
+
function amountError(intent, isToken, amount, maxAmount, estimatedFees, availableAsset) {
|
|
12
|
+
if (intent.useAllAmount && maxAmount === 0n) {
|
|
13
|
+
return new NotEnoughBalance();
|
|
14
|
+
}
|
|
15
|
+
if (!intent.useAllAmount && amount <= 0n) {
|
|
16
|
+
return new AmountRequired();
|
|
17
|
+
}
|
|
18
|
+
if (isToken && amount + estimatedFees > availableAsset) {
|
|
19
|
+
return new NotEnoughBalance();
|
|
20
|
+
}
|
|
21
|
+
if (!isToken && amount > availableAsset) {
|
|
22
|
+
return new NotEnoughBalance();
|
|
23
|
+
}
|
|
24
|
+
return undefined;
|
|
25
|
+
}
|
|
26
|
+
// Validate recipient, a positive amount, and enough balance incl. the VTHO gas fee (always VTHO).
|
|
27
|
+
export async function validateIntent(intent, balances, customFees) {
|
|
28
|
+
const errors = {};
|
|
29
|
+
const warnings = {};
|
|
30
|
+
const isToken = isTokenAsset(intent);
|
|
31
|
+
const estimatedFees = customFees?.value ?? 0n;
|
|
32
|
+
const availableAsset = spendable(balances, isToken);
|
|
33
|
+
const availableVtho = spendable(balances, true);
|
|
34
|
+
if (!intent.recipient) {
|
|
35
|
+
errors.recipient = new RecipientRequired();
|
|
36
|
+
}
|
|
37
|
+
else if (intent.sender.toLowerCase() === intent.recipient.toLowerCase()) {
|
|
38
|
+
warnings.recipient = new InvalidAddressBecauseDestinationIsAlsoSource();
|
|
39
|
+
}
|
|
40
|
+
else if (!parseAddress(intent.recipient)) {
|
|
41
|
+
errors.recipient = new InvalidAddress("", { currencyName: "VeChain" });
|
|
42
|
+
}
|
|
43
|
+
const spendableForAmount = isToken ? availableAsset - estimatedFees : availableAsset;
|
|
44
|
+
const maxAmount = spendableForAmount > 0n ? spendableForAmount : 0n;
|
|
45
|
+
const amount = intent.useAllAmount ? maxAmount : intent.amount;
|
|
46
|
+
const amountErr = amountError(intent, isToken, amount, maxAmount, estimatedFees, availableAsset);
|
|
47
|
+
if (amountErr) {
|
|
48
|
+
errors.amount = amountErr;
|
|
49
|
+
}
|
|
50
|
+
if (!errors.amount && estimatedFees > availableVtho) {
|
|
51
|
+
errors.amount = new NotEnoughVTHO();
|
|
52
|
+
}
|
|
53
|
+
const totalSpent = isToken ? amount + estimatedFees : amount;
|
|
54
|
+
return {
|
|
55
|
+
errors,
|
|
56
|
+
warnings,
|
|
57
|
+
estimatedFees,
|
|
58
|
+
amount,
|
|
59
|
+
totalSpent,
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=validateIntent.js.map
|