@aeternity/aepp-sdk 14.0.0 → 14.1.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/LICENSE +1 -1
- package/README.md +11 -19
- package/dist/aepp-sdk.browser-script.cjs +1 -1
- package/dist/aepp-sdk.browser-script.cjs.LICENSE.txt +2 -0
- package/dist/aepp-sdk.browser-script.cjs.map +1 -1
- package/dist/aepp-sdk.browser.cjs +1 -1
- package/dist/aepp-sdk.browser.cjs.map +1 -1
- package/dist/aepp-sdk.cjs +11678 -6969
- package/dist/aepp-sdk.cjs.map +1 -1
- package/es/AeSdkBase.d.ts +10 -1
- package/es/AeSdkBase.js +12 -2
- package/es/AeSdkBase.js.map +1 -1
- package/es/AeSdkMethods.d.ts +1 -1
- package/es/AeSdkMethods.js.map +1 -1
- package/es/AeSdkWallet.js +1 -1
- package/es/AeSdkWallet.js.map +1 -1
- package/es/Middleware.d.ts +5 -1
- package/es/Middleware.js +7 -2
- package/es/Middleware.js.map +1 -1
- package/es/MiddlewareSubscriber.d.ts +3 -0
- package/es/MiddlewareSubscriber.js +4 -0
- package/es/MiddlewareSubscriber.js.map +1 -1
- package/es/Node.d.ts +6 -1
- package/es/Node.js +28 -4
- package/es/Node.js.map +1 -1
- package/es/account/Base.d.ts +12 -0
- package/es/account/Base.js +1 -0
- package/es/account/Base.js.map +1 -1
- package/es/account/BaseFactory.d.ts +1 -0
- package/es/account/BaseFactory.js +1 -0
- package/es/account/BaseFactory.js.map +1 -1
- package/es/account/Generalized.d.ts +5 -0
- package/es/account/Generalized.js +9 -0
- package/es/account/Generalized.js.map +1 -1
- package/es/account/Ledger.d.ts +5 -0
- package/es/account/Ledger.js +9 -0
- package/es/account/Ledger.js.map +1 -1
- package/es/account/LedgerFactory.d.ts +2 -0
- package/es/account/LedgerFactory.js +10 -4
- package/es/account/LedgerFactory.js.map +1 -1
- package/es/account/Memory.d.ts +5 -0
- package/es/account/Memory.js +14 -5
- package/es/account/Memory.js.map +1 -1
- package/es/account/Metamask.d.ts +8 -0
- package/es/account/Metamask.js +13 -0
- package/es/account/Metamask.js.map +1 -1
- package/es/account/MetamaskFactory.d.ts +20 -2
- package/es/account/MetamaskFactory.js +93 -39
- package/es/account/MetamaskFactory.js.map +1 -1
- package/es/account/MnemonicFactory.d.ts +12 -2
- package/es/account/MnemonicFactory.js +48 -24
- package/es/account/MnemonicFactory.js.map +1 -1
- package/es/account/Rpc.d.ts +5 -0
- package/es/account/Rpc.js +8 -0
- package/es/account/Rpc.js.map +1 -1
- package/es/aens.d.ts +25 -5
- package/es/aens.js +52 -18
- package/es/aens.js.map +1 -1
- package/es/aepp-wallet-communication/connection/BrowserRuntime.d.ts +1 -1
- package/es/aepp-wallet-communication/connection/BrowserRuntime.js.map +1 -1
- package/es/apis/middleware/middleware.d.ts +99 -9
- package/es/apis/middleware/middleware.js +560 -91
- package/es/apis/middleware/middleware.js.map +1 -1
- package/es/apis/middleware/models/index.d.ts +1267 -1582
- package/es/apis/middleware/models/index.js +1 -1363
- package/es/apis/middleware/models/index.js.map +1 -1
- package/es/apis/middleware/models/mappers.d.ts +126 -56
- package/es/apis/middleware/models/mappers.js +6250 -2989
- package/es/apis/middleware/models/mappers.js.map +1 -1
- package/es/apis/middleware/models/parameters.d.ts +54 -33
- package/es/apis/middleware/models/parameters.js +389 -134
- package/es/apis/middleware/models/parameters.js.map +1 -1
- package/es/apis/node/models/index.d.ts +60 -15
- package/es/apis/node/models/index.js.map +1 -1
- package/es/apis/node/models/mappers.d.ts +3 -0
- package/es/apis/node/models/mappers.js +130 -2
- package/es/apis/node/models/mappers.js.map +1 -1
- package/es/apis/node/node.d.ts +13 -1
- package/es/apis/node/node.js +54 -0
- package/es/apis/node/node.js.map +1 -1
- package/es/chain.d.ts +19 -6
- package/es/chain.js +30 -24
- package/es/chain.js.map +1 -1
- package/es/channel/Contract.d.ts +6 -3
- package/es/channel/Contract.js +5 -2
- package/es/channel/Contract.js.map +1 -1
- package/es/channel/Spend.d.ts +1 -1
- package/es/channel/Spend.js.map +1 -1
- package/es/channel/handlers.js +1 -2
- package/es/channel/handlers.js.map +1 -1
- package/es/channel/internal.d.ts +1 -1
- package/es/channel/internal.js +2 -2
- package/es/channel/internal.js.map +1 -1
- package/es/contract/Contract.d.ts +13 -2
- package/es/contract/Contract.js +22 -12
- package/es/contract/Contract.js.map +1 -1
- package/es/contract/compiler/Base.d.ts +1 -0
- package/es/contract/compiler/Base.js +1 -0
- package/es/contract/compiler/Base.js.map +1 -1
- package/es/contract/compiler/Cli.d.ts +2 -1
- package/es/contract/compiler/Cli.js +11 -9
- package/es/contract/compiler/Cli.js.map +1 -1
- package/es/contract/compiler/Http.d.ts +2 -1
- package/es/contract/compiler/Http.js +3 -2
- package/es/contract/compiler/Http.js.map +1 -1
- package/es/contract/compiler/getFileSystem.d.ts +1 -0
- package/es/contract/compiler/getFileSystem.js +1 -0
- package/es/contract/compiler/getFileSystem.js.map +1 -1
- package/es/contract/ga.d.ts +3 -3
- package/es/contract/ga.js +3 -3
- package/es/contract/ga.js.map +1 -1
- package/es/index-browser.d.ts +32 -2
- package/es/index-browser.js +32 -2
- package/es/index-browser.js.map +1 -1
- package/es/oracle/Oracle.d.ts +10 -1
- package/es/oracle/Oracle.js +16 -6
- package/es/oracle/Oracle.js.map +1 -1
- package/es/oracle/OracleBase.d.ts +15 -2
- package/es/oracle/OracleBase.js +23 -1
- package/es/oracle/OracleBase.js.map +1 -1
- package/es/oracle/OracleClient.d.ts +3 -0
- package/es/oracle/OracleClient.js +6 -1
- package/es/oracle/OracleClient.js.map +1 -1
- package/es/spend.js +1 -1
- package/es/spend.js.map +1 -1
- package/es/tx/builder/common.js +6 -3
- package/es/tx/builder/common.js.map +1 -1
- package/es/tx/builder/constants.d.ts +53 -3
- package/es/tx/builder/constants.js +62 -12
- package/es/tx/builder/constants.js.map +1 -1
- package/es/tx/builder/delegation/schema.js +15 -0
- package/es/tx/builder/delegation/schema.js.map +1 -1
- package/es/tx/builder/entry/constants.d.ts +4 -1
- package/es/tx/builder/entry/constants.js +10 -1
- package/es/tx/builder/entry/constants.js.map +1 -1
- package/es/tx/builder/entry/index.js +1 -2
- package/es/tx/builder/entry/index.js.map +1 -1
- package/es/tx/builder/field-types/ct-version.js +1 -2
- package/es/tx/builder/field-types/ct-version.js.map +1 -1
- package/es/tx/builder/field-types/fee.d.ts +1 -1
- package/es/tx/builder/field-types/fee.js +4 -4
- package/es/tx/builder/field-types/fee.js.map +1 -1
- package/es/tx/builder/field-types/gas-price.d.ts +3 -0
- package/es/tx/builder/field-types/gas-price.js +1 -1
- package/es/tx/builder/field-types/gas-price.js.map +1 -1
- package/es/tx/builder/field-types/name-fee.js +1 -1
- package/es/tx/builder/field-types/name-fee.js.map +1 -1
- package/es/tx/builder/field-types/name-id.js +2 -2
- package/es/tx/builder/field-types/name-id.js.map +1 -1
- package/es/tx/builder/field-types/nonce.d.ts +1 -1
- package/es/tx/builder/field-types/nonce.js.map +1 -1
- package/es/tx/builder/field-types/pointers.js +3 -3
- package/es/tx/builder/field-types/pointers.js.map +1 -1
- package/es/tx/builder/field-types/ttl.js +1 -2
- package/es/tx/builder/field-types/ttl.js.map +1 -1
- package/es/tx/builder/helpers.d.ts +18 -12
- package/es/tx/builder/helpers.js +25 -17
- package/es/tx/builder/helpers.js.map +1 -1
- package/es/tx/builder/schema.d.ts +27 -24
- package/es/tx/builder/schema.generated.d.ts +12 -12
- package/es/tx/builder/schema.generated.js.map +1 -1
- package/es/tx/builder/schema.js +5 -3
- package/es/tx/builder/schema.js.map +1 -1
- package/es/tx/execution-cost.d.ts +3 -0
- package/es/tx/execution-cost.js +7 -4
- package/es/tx/execution-cost.js.map +1 -1
- package/es/tx/transaction-signer.d.ts +1 -0
- package/es/tx/transaction-signer.js +1 -0
- package/es/tx/transaction-signer.js.map +1 -1
- package/es/tx/validator.js +4 -3
- package/es/tx/validator.js.map +1 -1
- package/es/utils/MiddlewarePage.d.ts +4 -3
- package/es/utils/MiddlewarePage.js.map +1 -1
- package/es/utils/amount-formatter.d.ts +15 -1
- package/es/utils/amount-formatter.js +17 -1
- package/es/utils/amount-formatter.js.map +1 -1
- package/es/utils/autorest.d.ts +1 -1
- package/es/utils/autorest.js +10 -4
- package/es/utils/autorest.js.map +1 -1
- package/es/utils/bignumber.d.ts +1 -1
- package/es/utils/bignumber.js +1 -1
- package/es/utils/bignumber.js.map +1 -1
- package/es/utils/bytes.d.ts +3 -1
- package/es/utils/bytes.js +3 -1
- package/es/utils/bytes.js.map +1 -1
- package/es/utils/crypto.d.ts +48 -15
- package/es/utils/crypto.js +80 -29
- package/es/utils/crypto.js.map +1 -1
- package/es/utils/encoder-types.d.ts +1 -1
- package/es/utils/encoder-types.js +1 -1
- package/es/utils/encoder-types.js.map +1 -1
- package/es/utils/encoder.d.ts +2 -0
- package/es/utils/encoder.js +2 -0
- package/es/utils/encoder.js.map +1 -1
- package/es/utils/errors.d.ts +2 -2
- package/es/utils/errors.js +2 -2
- package/es/utils/errors.js.map +1 -1
- package/es/utils/json-big.js +1 -1
- package/es/utils/json-big.js.map +1 -1
- package/es/utils/jwt.js +3 -3
- package/es/utils/jwt.js.map +1 -1
- package/es/utils/typed-data.d.ts +5 -0
- package/es/utils/typed-data.js +6 -0
- package/es/utils/typed-data.js.map +1 -1
- package/package.json +50 -51
|
@@ -27,6 +27,7 @@ import Node from '../Node.js';
|
|
|
27
27
|
* @param options.gasUsed - Amount of gas actually used to make calculation more accurate
|
|
28
28
|
* @param options.queryFee - Oracle query fee
|
|
29
29
|
* @param options.isInitiator - Is transaction signer an initiator of state channel
|
|
30
|
+
* @category utils
|
|
30
31
|
*/
|
|
31
32
|
export declare function getExecutionCost(transaction: Encoded.Transaction, { innerTx, gasUsed, queryFee, isInitiator, }?: {
|
|
32
33
|
innerTx?: 'fee-payer' | 'freeloader';
|
|
@@ -39,6 +40,7 @@ export declare function getExecutionCost(transaction: Encoded.Transaction, { inn
|
|
|
39
40
|
* @param transaction - Transaction to calculate the cost of
|
|
40
41
|
* @param networkId - Network id used to sign the transaction
|
|
41
42
|
* @param options - Options
|
|
43
|
+
* @category utils
|
|
42
44
|
*/
|
|
43
45
|
export declare function getExecutionCostBySignedTx(transaction: Encoded.Transaction, networkId: string, options?: Omit<Parameters<typeof getExecutionCost>[1], 'innerTx'>): bigint;
|
|
44
46
|
/**
|
|
@@ -47,6 +49,7 @@ export declare function getExecutionCostBySignedTx(transaction: Encoded.Transact
|
|
|
47
49
|
* @param node - Node to use
|
|
48
50
|
* @param options - Options
|
|
49
51
|
* @param options.isMined - Is transaction already mined or not
|
|
52
|
+
* @category utils
|
|
50
53
|
*/
|
|
51
54
|
export declare function getExecutionCostUsingNode(transaction: Encoded.Transaction, node: Node, { isMined, ...options }?: {
|
|
52
55
|
isMined?: boolean;
|
package/es/tx/execution-cost.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { buildTx, buildTxHash, unpackTx } from './builder/index.js';
|
|
2
2
|
import { Tag } from './builder/constants.js';
|
|
3
|
-
import {
|
|
3
|
+
import { verifySignature } from '../utils/crypto.js';
|
|
4
4
|
import { getBufferToSign } from '../account/Memory.js';
|
|
5
5
|
import { IllegalArgumentError, InternalError, TransactionError } from '../utils/errors.js';
|
|
6
6
|
import getTransactionSignerAddress from './transaction-signer.js';
|
|
@@ -32,6 +32,7 @@ import getTransactionSignerAddress from './transaction-signer.js';
|
|
|
32
32
|
* @param options.gasUsed - Amount of gas actually used to make calculation more accurate
|
|
33
33
|
* @param options.queryFee - Oracle query fee
|
|
34
34
|
* @param options.isInitiator - Is transaction signer an initiator of state channel
|
|
35
|
+
* @category utils
|
|
35
36
|
*/
|
|
36
37
|
export function getExecutionCost(transaction, {
|
|
37
38
|
innerTx,
|
|
@@ -53,7 +54,7 @@ export function getExecutionCost(transaction, {
|
|
|
53
54
|
if (params.tag === Tag.OracleQueryTx) {
|
|
54
55
|
res += BigInt(params.queryFee);
|
|
55
56
|
}
|
|
56
|
-
if (params.tag === Tag.
|
|
57
|
+
if (params.tag === Tag.OracleRespondTx) {
|
|
57
58
|
res -= BigInt(queryFee !== null && queryFee !== void 0 ? queryFee : 0);
|
|
58
59
|
}
|
|
59
60
|
if (params.tag === Tag.ChannelSettleTx) {
|
|
@@ -80,6 +81,7 @@ export function getExecutionCost(transaction, {
|
|
|
80
81
|
* @param transaction - Transaction to calculate the cost of
|
|
81
82
|
* @param networkId - Network id used to sign the transaction
|
|
82
83
|
* @param options - Options
|
|
84
|
+
* @category utils
|
|
83
85
|
*/
|
|
84
86
|
export function getExecutionCostBySignedTx(transaction, networkId, options) {
|
|
85
87
|
const params = unpackTx(transaction, Tag.SignedTx);
|
|
@@ -88,7 +90,7 @@ export function getExecutionCostBySignedTx(transaction, networkId, options) {
|
|
|
88
90
|
}
|
|
89
91
|
const tx = buildTx(params.encodedTx);
|
|
90
92
|
const address = getTransactionSignerAddress(tx);
|
|
91
|
-
const [isInnerTx, isNotInnerTx] = [true, false].map(f =>
|
|
93
|
+
const [isInnerTx, isNotInnerTx] = [true, false].map(f => verifySignature(getBufferToSign(tx, networkId, f), params.signatures[0], address));
|
|
92
94
|
if (!isInnerTx && !isNotInnerTx) throw new TransactionError("Can't verify signature");
|
|
93
95
|
return getExecutionCost(buildTx(params.encodedTx), {
|
|
94
96
|
...(isInnerTx && {
|
|
@@ -104,6 +106,7 @@ export function getExecutionCostBySignedTx(transaction, networkId, options) {
|
|
|
104
106
|
* @param node - Node to use
|
|
105
107
|
* @param options - Options
|
|
106
108
|
* @param options.isMined - Is transaction already mined or not
|
|
109
|
+
* @category utils
|
|
107
110
|
*/
|
|
108
111
|
export async function getExecutionCostUsingNode(transaction, node, {
|
|
109
112
|
isMined,
|
|
@@ -126,7 +129,7 @@ export async function getExecutionCostUsingNode(transaction, node, {
|
|
|
126
129
|
}
|
|
127
130
|
options.gasUsed = combinedInfo.gasUsed;
|
|
128
131
|
}
|
|
129
|
-
if (options.queryFee == null && Tag.
|
|
132
|
+
if (options.queryFee == null && Tag.OracleRespondTx === params.tag) {
|
|
130
133
|
options.queryFee = (await node.getOracleByPubkey(params.oracleId)).queryFee.toString();
|
|
131
134
|
}
|
|
132
135
|
if (options.isInitiator == null && Tag.ChannelSettleTx === params.tag && isMined !== true) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"execution-cost.js","names":["buildTx","buildTxHash","unpackTx","Tag","verify","getBufferToSign","IllegalArgumentError","InternalError","TransactionError","getTransactionSignerAddress","getExecutionCost","transaction","innerTx","gasUsed","queryFee","isInitiator","params","tag","SignedTx","res","BigInt","fee","NameClaimTx","nameFee","OracleQueryTx","OracleResponseTx","ChannelSettleTx","initiatorAmountFinal","responderAmountFinal","SpendTx","ContractCreateTx","ContractCallTx","ChannelDepositTx","amount","deposit","GaAttachTx","GaMetaTx","gasPrice","gasLimit","PayingForTx","tx","encodedTx","getExecutionCostBySignedTx","networkId","options","address","isInnerTx","isNotInnerTx","map","f","signatures","getExecutionCostUsingNode","node","isMined","isSignedTx","txHash","includes","callInfo","gaInfo","getTransactionInfoByHash","combinedInfo","getOracleByPubkey","oracleId","toString","initiatorId","getChannelByPubkey","channelId","fromId","getNetworkId"],"sources":["../../src/tx/execution-cost.ts"],"sourcesContent":["import { Encoded } from '../utils/encoder.js';\nimport { buildTx, buildTxHash, unpackTx } from './builder/index.js';\nimport { Tag } from './builder/constants.js';\nimport { verify } from '../utils/crypto.js';\nimport { getBufferToSign } from '../account/Memory.js';\nimport { IllegalArgumentError, InternalError, TransactionError } from '../utils/errors.js';\nimport Node from '../Node.js';\nimport getTransactionSignerAddress from './transaction-signer.js';\n\n/**\n * Calculates the cost of transaction execution\n * Provides an upper cost of contract-call-related transactions because of `gasLimit`.\n * Also assumes that oracle query fee is 0 unless it is provided in options.\n *\n * The idea is that if you need to show transaction details with some accuracy you can define\n * expense fields that you want to show separately. And to show `getExecutionCost` result as a fee,\n * subtracting all fields shown separately.\n *\n * @example\n * ```vue\n * <template>\n * Amount: {{ txUnpacked.amount }}\n * Name fee: {{ txUnpacked.nameFee }}\n * Other fees: {{ getExecutionCost(txEncoded) - txUnpacked.amount - txUnpacked.nameFee }}\n * </template>\n * ```\n *\n * Doing this way you won't worry to show wrong fee for a transaction you may not support. Because\n * the SDK calculates the overall price of any transaction on its side.\n *\n * @param transaction - Transaction to calculate the cost of\n * @param options - Options\n * @param options.innerTx - Should be provided if transaction wrapped with Tag.PayingForTx\n * @param options.gasUsed - Amount of gas actually used to make calculation more accurate\n * @param options.queryFee - Oracle query fee\n * @param options.isInitiator - Is transaction signer an initiator of state channel\n */\nexport function getExecutionCost(\n transaction: Encoded.Transaction,\n {\n innerTx,\n gasUsed,\n queryFee,\n isInitiator,\n }: {\n innerTx?: 'fee-payer' | 'freeloader';\n gasUsed?: number;\n queryFee?: string;\n isInitiator?: boolean;\n } = {},\n): bigint {\n const params = unpackTx(transaction);\n if (params.tag === Tag.SignedTx) {\n throw new IllegalArgumentError(\n \"Transaction shouldn't be a SignedTx, use `getExecutionCostBySignedTx` instead\",\n );\n }\n\n let res = 0n;\n if ('fee' in params && innerTx !== 'freeloader') {\n res += BigInt(params.fee);\n }\n if (params.tag === Tag.NameClaimTx) {\n res += BigInt(params.nameFee);\n }\n if (params.tag === Tag.OracleQueryTx) {\n res += BigInt(params.queryFee);\n }\n if (params.tag === Tag.OracleResponseTx) {\n res -= BigInt(queryFee ?? 0);\n }\n if (params.tag === Tag.ChannelSettleTx) {\n if (isInitiator === true) res -= BigInt(params.initiatorAmountFinal);\n if (isInitiator === false) res -= BigInt(params.responderAmountFinal);\n }\n if (\n (params.tag === Tag.SpendTx ||\n params.tag === Tag.ContractCreateTx ||\n params.tag === Tag.ContractCallTx ||\n params.tag === Tag.ChannelDepositTx) &&\n innerTx !== 'fee-payer'\n ) {\n res += BigInt(params.amount);\n }\n if (params.tag === Tag.ContractCreateTx) res += BigInt(params.deposit);\n if (\n (params.tag === Tag.ContractCreateTx ||\n params.tag === Tag.ContractCallTx ||\n params.tag === Tag.GaAttachTx ||\n params.tag === Tag.GaMetaTx) &&\n innerTx !== 'freeloader'\n ) {\n res += BigInt(params.gasPrice) * BigInt(gasUsed ?? params.gasLimit);\n }\n if (params.tag === Tag.GaMetaTx || params.tag === Tag.PayingForTx) {\n res += getExecutionCost(\n buildTx(params.tx.encodedTx),\n params.tag === Tag.PayingForTx ? { innerTx: 'fee-payer' } : {},\n );\n }\n return res;\n}\n\n/**\n * Calculates the cost of signed transaction execution\n * @param transaction - Transaction to calculate the cost of\n * @param networkId - Network id used to sign the transaction\n * @param options - Options\n */\nexport function getExecutionCostBySignedTx(\n transaction: Encoded.Transaction,\n networkId: string,\n options?: Omit<Parameters<typeof getExecutionCost>[1], 'innerTx'>,\n): bigint {\n const params = unpackTx(transaction, Tag.SignedTx);\n if (params.encodedTx.tag === Tag.GaMetaTx) {\n return getExecutionCost(buildTx(params.encodedTx), options);\n }\n\n const tx = buildTx(params.encodedTx);\n const address = getTransactionSignerAddress(tx);\n const [isInnerTx, isNotInnerTx] = [true, false].map((f) =>\n verify(getBufferToSign(tx, networkId, f), params.signatures[0], address),\n );\n if (!isInnerTx && !isNotInnerTx) throw new TransactionError(\"Can't verify signature\");\n return getExecutionCost(buildTx(params.encodedTx), {\n ...(isInnerTx && { innerTx: 'freeloader' }),\n ...options,\n });\n}\n\n/**\n * Calculates the cost of signed and not signed transaction execution using node\n * @param transaction - Transaction to calculate the cost of\n * @param node - Node to use\n * @param options - Options\n * @param options.isMined - Is transaction already mined or not\n */\nexport async function getExecutionCostUsingNode(\n transaction: Encoded.Transaction,\n node: Node,\n { isMined, ...options }: { isMined?: boolean } & Parameters<typeof getExecutionCost>[1] = {},\n): Promise<bigint> {\n let params = unpackTx(transaction);\n const isSignedTx = params.tag === Tag.SignedTx;\n const txHash = isSignedTx && isMined === true && buildTxHash(transaction);\n if (params.tag === Tag.SignedTx) params = params.encodedTx;\n\n // TODO: set gasUsed for PayingForTx after solving https://github.com/aeternity/aeternity/issues/4087\n if (\n options.gasUsed == null &&\n txHash !== false &&\n [Tag.ContractCreateTx, Tag.ContractCallTx, Tag.GaAttachTx, Tag.GaMetaTx].includes(params.tag)\n ) {\n const { callInfo, gaInfo } = await node.getTransactionInfoByHash(txHash);\n const combinedInfo = callInfo ?? gaInfo;\n if (combinedInfo == null) {\n throw new InternalError(`callInfo and gaInfo is not available for transaction ${txHash}`);\n }\n options.gasUsed = combinedInfo.gasUsed;\n }\n\n if (options.queryFee == null && Tag.OracleResponseTx === params.tag) {\n options.queryFee = (await node.getOracleByPubkey(params.oracleId)).queryFee.toString();\n }\n\n if (options.isInitiator == null && Tag.ChannelSettleTx === params.tag && isMined !== true) {\n const { initiatorId } = await node.getChannelByPubkey(params.channelId);\n options.isInitiator = params.fromId === initiatorId;\n }\n\n return isSignedTx\n ? getExecutionCostBySignedTx(transaction, await node.getNetworkId(), options)\n : getExecutionCost(transaction, options);\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"execution-cost.js","names":["buildTx","buildTxHash","unpackTx","Tag","verifySignature","getBufferToSign","IllegalArgumentError","InternalError","TransactionError","getTransactionSignerAddress","getExecutionCost","transaction","innerTx","gasUsed","queryFee","isInitiator","params","tag","SignedTx","res","BigInt","fee","NameClaimTx","nameFee","OracleQueryTx","OracleRespondTx","ChannelSettleTx","initiatorAmountFinal","responderAmountFinal","SpendTx","ContractCreateTx","ContractCallTx","ChannelDepositTx","amount","deposit","GaAttachTx","GaMetaTx","gasPrice","gasLimit","PayingForTx","tx","encodedTx","getExecutionCostBySignedTx","networkId","options","address","isInnerTx","isNotInnerTx","map","f","signatures","getExecutionCostUsingNode","node","isMined","isSignedTx","txHash","includes","callInfo","gaInfo","getTransactionInfoByHash","combinedInfo","getOracleByPubkey","oracleId","toString","initiatorId","getChannelByPubkey","channelId","fromId","getNetworkId"],"sources":["../../src/tx/execution-cost.ts"],"sourcesContent":["import { Encoded } from '../utils/encoder.js';\nimport { buildTx, buildTxHash, unpackTx } from './builder/index.js';\nimport { Tag } from './builder/constants.js';\nimport { verifySignature } from '../utils/crypto.js';\nimport { getBufferToSign } from '../account/Memory.js';\nimport { IllegalArgumentError, InternalError, TransactionError } from '../utils/errors.js';\nimport Node from '../Node.js';\nimport getTransactionSignerAddress from './transaction-signer.js';\n\n/**\n * Calculates the cost of transaction execution\n * Provides an upper cost of contract-call-related transactions because of `gasLimit`.\n * Also assumes that oracle query fee is 0 unless it is provided in options.\n *\n * The idea is that if you need to show transaction details with some accuracy you can define\n * expense fields that you want to show separately. And to show `getExecutionCost` result as a fee,\n * subtracting all fields shown separately.\n *\n * @example\n * ```vue\n * <template>\n * Amount: {{ txUnpacked.amount }}\n * Name fee: {{ txUnpacked.nameFee }}\n * Other fees: {{ getExecutionCost(txEncoded) - txUnpacked.amount - txUnpacked.nameFee }}\n * </template>\n * ```\n *\n * Doing this way you won't worry to show wrong fee for a transaction you may not support. Because\n * the SDK calculates the overall price of any transaction on its side.\n *\n * @param transaction - Transaction to calculate the cost of\n * @param options - Options\n * @param options.innerTx - Should be provided if transaction wrapped with Tag.PayingForTx\n * @param options.gasUsed - Amount of gas actually used to make calculation more accurate\n * @param options.queryFee - Oracle query fee\n * @param options.isInitiator - Is transaction signer an initiator of state channel\n * @category utils\n */\nexport function getExecutionCost(\n transaction: Encoded.Transaction,\n {\n innerTx,\n gasUsed,\n queryFee,\n isInitiator,\n }: {\n innerTx?: 'fee-payer' | 'freeloader';\n gasUsed?: number;\n queryFee?: string;\n isInitiator?: boolean;\n } = {},\n): bigint {\n const params = unpackTx(transaction);\n if (params.tag === Tag.SignedTx) {\n throw new IllegalArgumentError(\n \"Transaction shouldn't be a SignedTx, use `getExecutionCostBySignedTx` instead\",\n );\n }\n\n let res = 0n;\n if ('fee' in params && innerTx !== 'freeloader') {\n res += BigInt(params.fee);\n }\n if (params.tag === Tag.NameClaimTx) {\n res += BigInt(params.nameFee);\n }\n if (params.tag === Tag.OracleQueryTx) {\n res += BigInt(params.queryFee);\n }\n if (params.tag === Tag.OracleRespondTx) {\n res -= BigInt(queryFee ?? 0);\n }\n if (params.tag === Tag.ChannelSettleTx) {\n if (isInitiator === true) res -= BigInt(params.initiatorAmountFinal);\n if (isInitiator === false) res -= BigInt(params.responderAmountFinal);\n }\n if (\n (params.tag === Tag.SpendTx ||\n params.tag === Tag.ContractCreateTx ||\n params.tag === Tag.ContractCallTx ||\n params.tag === Tag.ChannelDepositTx) &&\n innerTx !== 'fee-payer'\n ) {\n res += BigInt(params.amount);\n }\n if (params.tag === Tag.ContractCreateTx) res += BigInt(params.deposit);\n if (\n (params.tag === Tag.ContractCreateTx ||\n params.tag === Tag.ContractCallTx ||\n params.tag === Tag.GaAttachTx ||\n params.tag === Tag.GaMetaTx) &&\n innerTx !== 'freeloader'\n ) {\n res += BigInt(params.gasPrice) * BigInt(gasUsed ?? params.gasLimit);\n }\n if (params.tag === Tag.GaMetaTx || params.tag === Tag.PayingForTx) {\n res += getExecutionCost(\n buildTx(params.tx.encodedTx),\n params.tag === Tag.PayingForTx ? { innerTx: 'fee-payer' } : {},\n );\n }\n return res;\n}\n\n/**\n * Calculates the cost of signed transaction execution\n * @param transaction - Transaction to calculate the cost of\n * @param networkId - Network id used to sign the transaction\n * @param options - Options\n * @category utils\n */\nexport function getExecutionCostBySignedTx(\n transaction: Encoded.Transaction,\n networkId: string,\n options?: Omit<Parameters<typeof getExecutionCost>[1], 'innerTx'>,\n): bigint {\n const params = unpackTx(transaction, Tag.SignedTx);\n if (params.encodedTx.tag === Tag.GaMetaTx) {\n return getExecutionCost(buildTx(params.encodedTx), options);\n }\n\n const tx = buildTx(params.encodedTx);\n const address = getTransactionSignerAddress(tx);\n const [isInnerTx, isNotInnerTx] = [true, false].map((f) =>\n verifySignature(getBufferToSign(tx, networkId, f), params.signatures[0], address),\n );\n if (!isInnerTx && !isNotInnerTx) throw new TransactionError(\"Can't verify signature\");\n return getExecutionCost(buildTx(params.encodedTx), {\n ...(isInnerTx && { innerTx: 'freeloader' }),\n ...options,\n });\n}\n\n/**\n * Calculates the cost of signed and not signed transaction execution using node\n * @param transaction - Transaction to calculate the cost of\n * @param node - Node to use\n * @param options - Options\n * @param options.isMined - Is transaction already mined or not\n * @category utils\n */\nexport async function getExecutionCostUsingNode(\n transaction: Encoded.Transaction,\n node: Node,\n { isMined, ...options }: { isMined?: boolean } & Parameters<typeof getExecutionCost>[1] = {},\n): Promise<bigint> {\n let params = unpackTx(transaction);\n const isSignedTx = params.tag === Tag.SignedTx;\n const txHash = isSignedTx && isMined === true && buildTxHash(transaction);\n if (params.tag === Tag.SignedTx) params = params.encodedTx;\n\n // TODO: set gasUsed for PayingForTx after solving https://github.com/aeternity/aeternity/issues/4087\n if (\n options.gasUsed == null &&\n txHash !== false &&\n [Tag.ContractCreateTx, Tag.ContractCallTx, Tag.GaAttachTx, Tag.GaMetaTx].includes(params.tag)\n ) {\n const { callInfo, gaInfo } = await node.getTransactionInfoByHash(txHash);\n const combinedInfo = callInfo ?? gaInfo;\n if (combinedInfo == null) {\n throw new InternalError(`callInfo and gaInfo is not available for transaction ${txHash}`);\n }\n options.gasUsed = combinedInfo.gasUsed;\n }\n\n if (options.queryFee == null && Tag.OracleRespondTx === params.tag) {\n options.queryFee = (await node.getOracleByPubkey(params.oracleId)).queryFee.toString();\n }\n\n if (options.isInitiator == null && Tag.ChannelSettleTx === params.tag && isMined !== true) {\n const { initiatorId } = await node.getChannelByPubkey(params.channelId);\n options.isInitiator = params.fromId === initiatorId;\n }\n\n return isSignedTx\n ? getExecutionCostBySignedTx(transaction, await node.getNetworkId(), options)\n : getExecutionCost(transaction, options);\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -2,5 +2,6 @@ import { Encoded } from '../utils/encoder.js';
|
|
|
2
2
|
/**
|
|
3
3
|
* Returns account address that signed a transaction
|
|
4
4
|
* @param transaction - transaction to get a signer of
|
|
5
|
+
* @category utils
|
|
5
6
|
*/
|
|
6
7
|
export default function getTransactionSignerAddress(transaction: Encoded.Transaction): Encoded.AccountAddress;
|
|
@@ -5,6 +5,7 @@ import { TransactionError, UnexpectedTsError } from '../utils/errors.js';
|
|
|
5
5
|
/**
|
|
6
6
|
* Returns account address that signed a transaction
|
|
7
7
|
* @param transaction - transaction to get a signer of
|
|
8
|
+
* @category utils
|
|
8
9
|
*/
|
|
9
10
|
export default function getTransactionSignerAddress(transaction) {
|
|
10
11
|
const params = unpackTx(transaction);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transaction-signer.js","names":["buildTx","getSchema","unpackTx","Tag","TransactionError","UnexpectedTsError","getTransactionSignerAddress","transaction","params","tag","SignedTx","encodedTx","GaMetaTx","gaId","nonce","version","find","name","address","senderKey","replace"],"sources":["../../src/tx/transaction-signer.ts"],"sourcesContent":["import { Encoded } from '../utils/encoder.js';\nimport { buildTx, getSchema, unpackTx } from './builder/index.js';\nimport { Tag } from './builder/constants.js';\nimport { TransactionError, UnexpectedTsError } from '../utils/errors.js';\n\n/**\n * Returns account address that signed a transaction\n * @param transaction - transaction to get a signer of\n */\nexport default function getTransactionSignerAddress(\n transaction: Encoded.Transaction,\n): Encoded.AccountAddress {\n const params = unpackTx(transaction);\n switch (params.tag) {\n case Tag.SignedTx:\n return getTransactionSignerAddress(buildTx(params.encodedTx));\n case Tag.GaMetaTx:\n return params.gaId;\n default:\n }\n\n const nonce = getSchema(params.tag, params.version).find(([name]) => name === 'nonce')?.[1];\n if (nonce == null)\n throw new TransactionError(`Transaction doesn't have nonce: ${Tag[params.tag]}`);\n if (!('senderKey' in nonce)) throw new UnexpectedTsError();\n const address = params[nonce.senderKey as keyof typeof params] as unknown as string;\n return address.replace(/^ok_/, 'ak_') as Encoded.AccountAddress;\n}\n"],"mappings":"AACA,SAASA,OAAO,EAAEC,SAAS,EAAEC,QAAQ,QAAQ,oBAAoB;AACjE,SAASC,GAAG,QAAQ,wBAAwB;AAC5C,SAASC,gBAAgB,EAAEC,iBAAiB,QAAQ,oBAAoB;;AAExE;AACA;AACA;AACA;AACA,eAAe,SAASC,2BAA2BA,CACjDC,WAAgC,EACR;EACxB,MAAMC,MAAM,GAAGN,QAAQ,CAACK,WAAW,CAAC;EACpC,QAAQC,MAAM,CAACC,GAAG;IAChB,KAAKN,GAAG,CAACO,QAAQ;MACf,OAAOJ,2BAA2B,CAACN,OAAO,CAACQ,MAAM,CAACG,SAAS,CAAC,CAAC;IAC/D,KAAKR,GAAG,CAACS,QAAQ;MACf,OAAOJ,MAAM,CAACK,IAAI;IACpB;EACF;EAEA,MAAMC,KAAK,GAAGb,SAAS,CAACO,MAAM,CAACC,GAAG,EAAED,MAAM,CAACO,OAAO,CAAC,CAACC,IAAI,CAAC,CAAC,CAACC,IAAI,CAAC,KAAKA,IAAI,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;EAC3F,IAAIH,KAAK,IAAI,IAAI,EACf,MAAM,IAAIV,gBAAgB,CAAC,mCAAmCD,GAAG,CAACK,MAAM,CAACC,GAAG,CAAC,EAAE,CAAC;EAClF,IAAI,EAAE,WAAW,IAAIK,KAAK,CAAC,EAAE,MAAM,IAAIT,iBAAiB,CAAC,CAAC;EAC1D,MAAMa,OAAO,GAAGV,MAAM,CAACM,KAAK,CAACK,SAAS,CAA6C;EACnF,OAAOD,OAAO,CAACE,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC;AACvC","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"transaction-signer.js","names":["buildTx","getSchema","unpackTx","Tag","TransactionError","UnexpectedTsError","getTransactionSignerAddress","transaction","params","tag","SignedTx","encodedTx","GaMetaTx","gaId","nonce","version","find","name","address","senderKey","replace"],"sources":["../../src/tx/transaction-signer.ts"],"sourcesContent":["import { Encoded } from '../utils/encoder.js';\nimport { buildTx, getSchema, unpackTx } from './builder/index.js';\nimport { Tag } from './builder/constants.js';\nimport { TransactionError, UnexpectedTsError } from '../utils/errors.js';\n\n/**\n * Returns account address that signed a transaction\n * @param transaction - transaction to get a signer of\n * @category utils\n */\nexport default function getTransactionSignerAddress(\n transaction: Encoded.Transaction,\n): Encoded.AccountAddress {\n const params = unpackTx(transaction);\n switch (params.tag) {\n case Tag.SignedTx:\n return getTransactionSignerAddress(buildTx(params.encodedTx));\n case Tag.GaMetaTx:\n return params.gaId;\n default:\n }\n\n const nonce = getSchema(params.tag, params.version).find(([name]) => name === 'nonce')?.[1];\n if (nonce == null)\n throw new TransactionError(`Transaction doesn't have nonce: ${Tag[params.tag]}`);\n if (!('senderKey' in nonce)) throw new UnexpectedTsError();\n const address = params[nonce.senderKey as keyof typeof params] as unknown as string;\n return address.replace(/^ok_/, 'ak_') as Encoded.AccountAddress;\n}\n"],"mappings":"AACA,SAASA,OAAO,EAAEC,SAAS,EAAEC,QAAQ,QAAQ,oBAAoB;AACjE,SAASC,GAAG,QAAQ,wBAAwB;AAC5C,SAASC,gBAAgB,EAAEC,iBAAiB,QAAQ,oBAAoB;;AAExE;AACA;AACA;AACA;AACA;AACA,eAAe,SAASC,2BAA2BA,CACjDC,WAAgC,EACR;EACxB,MAAMC,MAAM,GAAGN,QAAQ,CAACK,WAAW,CAAC;EACpC,QAAQC,MAAM,CAACC,GAAG;IAChB,KAAKN,GAAG,CAACO,QAAQ;MACf,OAAOJ,2BAA2B,CAACN,OAAO,CAACQ,MAAM,CAACG,SAAS,CAAC,CAAC;IAC/D,KAAKR,GAAG,CAACS,QAAQ;MACf,OAAOJ,MAAM,CAACK,IAAI;IACpB;EACF;EAEA,MAAMC,KAAK,GAAGb,SAAS,CAACO,MAAM,CAACC,GAAG,EAAED,MAAM,CAACO,OAAO,CAAC,CAACC,IAAI,CAAC,CAAC,CAACC,IAAI,CAAC,KAAKA,IAAI,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;EAC3F,IAAIH,KAAK,IAAI,IAAI,EACf,MAAM,IAAIV,gBAAgB,CAAC,mCAAmCD,GAAG,CAACK,MAAM,CAACC,GAAG,CAAC,EAAE,CAAC;EAClF,IAAI,EAAE,WAAW,IAAIK,KAAK,CAAC,EAAE,MAAM,IAAIT,iBAAiB,CAAC,CAAC;EAC1D,MAAMa,OAAO,GAAGV,MAAM,CAACM,KAAK,CAACK,SAAS,CAA6C;EACnF,OAAOD,OAAO,CAACE,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC;AACvC","ignoreList":[]}
|
package/es/tx/validator.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Buffer as _Buffer } from "buffer";
|
|
2
2
|
import { RestError } from '@azure/core-rest-pipeline';
|
|
3
|
-
import { hash,
|
|
3
|
+
import { hash, isEncoded, verifySignature } from '../utils/crypto.js';
|
|
4
4
|
import { ProtocolToVmAbi } from './builder/field-types/ct-version.js';
|
|
5
5
|
import { Tag } from './builder/constants.js';
|
|
6
6
|
import { buildTx, unpackTx } from './builder/index.js';
|
|
@@ -64,6 +64,7 @@ export default async function verifyTransaction(transaction, nodeNotCached) {
|
|
|
64
64
|
pipeline,
|
|
65
65
|
additionalPolicies: [genAggressiveCacheGetResponsesPolicy()]
|
|
66
66
|
});
|
|
67
|
+
node._getCachedStatus = async () => nodeNotCached._getCachedStatus();
|
|
67
68
|
return verifyTransactionInternal(unpackTx(transaction), node, []);
|
|
68
69
|
}
|
|
69
70
|
validators.push((tx, {
|
|
@@ -82,7 +83,7 @@ validators.push((tx, {
|
|
|
82
83
|
const txBinary = decode(buildTx(encodedTx));
|
|
83
84
|
const txWithNetworkId = concatBuffers([prefix, txBinary]);
|
|
84
85
|
const txHashWithNetworkId = concatBuffers([prefix, hash(txBinary)]);
|
|
85
|
-
if (
|
|
86
|
+
if (verifySignature(txWithNetworkId, signatures[0], account.id) || verifySignature(txHashWithNetworkId, signatures[0], account.id)) return [];
|
|
86
87
|
return [{
|
|
87
88
|
message: 'Signature cannot be verified, please ensure that you transaction have' + ' the correct prefix and the correct private key for the sender address',
|
|
88
89
|
key: 'InvalidSignature',
|
|
@@ -123,7 +124,7 @@ validators.push((tx, {
|
|
|
123
124
|
}, async (tx, {
|
|
124
125
|
node
|
|
125
126
|
}) => {
|
|
126
|
-
if (tx.tag !== Tag.SpendTx ||
|
|
127
|
+
if (tx.tag !== Tag.SpendTx || isEncoded(tx.recipientId, Encoding.Name)) return [];
|
|
127
128
|
const recipient = await node.getAccountByPubkey(tx.recipientId).catch(error => {
|
|
128
129
|
if (!isAccountNotFoundError(error)) throw error;
|
|
129
130
|
return null;
|
package/es/tx/validator.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validator.js","names":["RestError","hash","isAddressValid","verify","ProtocolToVmAbi","Tag","buildTx","unpackTx","concatBuffers","isAccountNotFoundError","Encoding","decode","Node","genAggressiveCacheGetResponsesPolicy","UnexpectedTsError","getTransactionSignerAddress","getExecutionCostUsingNode","validators","verifyTransactionInternal","tx","node","parentTxTypes","address","account","height","consensusProtocolVersion","nodeNetworkId","Promise","all","getAccountByPubkey","catch","error","id","balance","nonce","then","acc","getCurrentKeyBlockHeight","getNodeInfo","map","v","flat","verifyTransaction","transaction","nodeNotCached","pipeline","clone","removePolicy","name","$host","ignoreVersion","additionalPolicies","push","tag","SignedTx","encodedTx","signatures","length","prefix","_Buffer","from","includes","PayingForTx","join","txBinary","txWithNetworkId","txHashWithNetworkId","message","key","checkedKeys","nestedTx","ttl","cost","SpendTx","recipientId","Name","recipient","payable","kind","GaMetaTx","_ref","_ref2","oracleCall","OracleRegisterTx","contractCreate","ContractCreateTx","GaAttachTx","contractCall","ContractCallTx","type","protocol","ctVersion","abiVersion","vmVersion","JSON","stringify","contractId","startsWith","active","getContract","response","bodyAsText","parse","reason"],"sources":["../../src/tx/validator.ts"],"sourcesContent":["import { RestError } from '@azure/core-rest-pipeline';\nimport { hash, isAddressValid, verify } from '../utils/crypto.js';\nimport { TxUnpacked } from './builder/schema.generated.js';\nimport { CtVersion, ProtocolToVmAbi } from './builder/field-types/ct-version.js';\nimport { Tag, ConsensusProtocolVersion } from './builder/constants.js';\nimport { buildTx, unpackTx } from './builder/index.js';\nimport { concatBuffers, isAccountNotFoundError } from '../utils/other.js';\nimport { Encoded, Encoding, decode } from '../utils/encoder.js';\nimport Node from '../Node.js';\nimport { Account } from '../apis/node/index.js';\nimport { genAggressiveCacheGetResponsesPolicy } from '../utils/autorest.js';\nimport { UnexpectedTsError } from '../utils/errors.js';\nimport getTransactionSignerAddress from './transaction-signer.js';\nimport { getExecutionCostUsingNode } from './execution-cost.js';\n\nexport interface ValidatorResult {\n message: string;\n key: string;\n checkedKeys: string[];\n}\n\ntype Validator = (\n tx: TxUnpacked,\n options: {\n // TODO: remove after fixing node types\n account: Account & { id: Encoded.AccountAddress };\n nodeNetworkId: string;\n parentTxTypes: Tag[];\n node: Node;\n height: number;\n consensusProtocolVersion: ConsensusProtocolVersion;\n },\n) => ValidatorResult[] | Promise<ValidatorResult[]>;\n\nconst validators: Validator[] = [];\n\nasync function verifyTransactionInternal(\n tx: TxUnpacked,\n node: Node,\n parentTxTypes: Tag[],\n): Promise<ValidatorResult[]> {\n const address = getTransactionSignerAddress(buildTx(tx));\n const [account, { height }, { consensusProtocolVersion, nodeNetworkId }] = await Promise.all([\n node\n .getAccountByPubkey(address)\n .catch((error) => {\n if (!isAccountNotFoundError(error)) throw error;\n return { id: address, balance: 0n, nonce: 0 };\n })\n // TODO: remove after fixing https://github.com/aeternity/aepp-sdk-js/issues/1537\n .then((acc) => ({ ...acc, id: acc.id as Encoded.AccountAddress })),\n node.getCurrentKeyBlockHeight(), // TODO: don't request height on each validation, use caching\n node.getNodeInfo(),\n ]);\n\n return (\n await Promise.all(\n validators.map(async (v) =>\n v(tx, {\n node,\n account,\n height,\n consensusProtocolVersion,\n nodeNetworkId,\n parentTxTypes,\n }),\n ),\n )\n ).flat();\n}\n\n/**\n * Transaction Validator\n * This function validates some transaction properties,\n * to make sure it can be posted it to the chain\n * @category transaction builder\n * @param transaction - Base64Check-encoded transaction\n * @param nodeNotCached - Node to validate transaction against\n * @returns Array with verification errors\n * @example const errors = await verifyTransaction(transaction, node)\n */\nexport default async function verifyTransaction(\n transaction: Parameters<typeof unpackTx>[0],\n nodeNotCached: Node,\n): Promise<ValidatorResult[]> {\n const pipeline = nodeNotCached.pipeline.clone();\n pipeline.removePolicy({ name: 'parse-big-int' });\n const node = new Node(nodeNotCached.$host, {\n ignoreVersion: true,\n pipeline,\n additionalPolicies: [genAggressiveCacheGetResponsesPolicy()],\n });\n return verifyTransactionInternal(unpackTx(transaction), node, []);\n}\n\nvalidators.push(\n (tx, { account, nodeNetworkId, parentTxTypes }) => {\n if (tx.tag !== Tag.SignedTx) return [];\n const { encodedTx, signatures } = tx;\n if ((encodedTx ?? signatures) == null) return [];\n if (signatures.length !== 1) return []; // TODO: Support multisignature like in state channels\n const prefix = Buffer.from(\n [nodeNetworkId, ...(parentTxTypes.includes(Tag.PayingForTx) ? ['inner_tx'] : [])].join('-'),\n );\n const txBinary = decode(buildTx(encodedTx));\n const txWithNetworkId = concatBuffers([prefix, txBinary]);\n const txHashWithNetworkId = concatBuffers([prefix, hash(txBinary)]);\n if (\n verify(txWithNetworkId, signatures[0], account.id) ||\n verify(txHashWithNetworkId, signatures[0], account.id)\n )\n return [];\n return [\n {\n message:\n 'Signature cannot be verified, please ensure that you transaction have' +\n ' the correct prefix and the correct private key for the sender address',\n key: 'InvalidSignature',\n checkedKeys: ['encodedTx', 'signatures'],\n },\n ];\n },\n async (tx, { node, parentTxTypes }) => {\n let nestedTx;\n if ('encodedTx' in tx) nestedTx = tx.encodedTx;\n if ('tx' in tx) nestedTx = tx.tx;\n if (nestedTx == null) return [];\n return verifyTransactionInternal(nestedTx, node, [...parentTxTypes, tx.tag]);\n },\n (tx, { height }) => {\n if (!('ttl' in tx)) return [];\n if (tx.ttl === 0 || tx.ttl > height) return [];\n return [\n {\n message: `TTL ${tx.ttl} is already expired, current height is ${height}`,\n key: 'ExpiredTTL',\n checkedKeys: ['ttl'],\n },\n ];\n },\n async (tx, { account, parentTxTypes, node }) => {\n if (parentTxTypes.length !== 0) return [];\n const cost = await getExecutionCostUsingNode(buildTx(tx), node).catch(() => 0n);\n if (cost <= account.balance) return [];\n return [\n {\n message: `Account balance ${account.balance} is not enough to execute the transaction that costs ${cost}`,\n key: 'InsufficientBalance',\n checkedKeys: ['amount', 'fee', 'nameFee', 'gasLimit', 'gasPrice'],\n },\n ];\n },\n async (tx, { node }) => {\n if (tx.tag !== Tag.SpendTx || isAddressValid(tx.recipientId, Encoding.Name)) return [];\n const recipient = await node.getAccountByPubkey(tx.recipientId).catch((error) => {\n if (!isAccountNotFoundError(error)) throw error;\n return null;\n });\n if (recipient == null || recipient.payable === true) return [];\n return [\n {\n message: 'Recipient account is not payable',\n key: 'RecipientAccountNotPayable',\n checkedKeys: ['recipientId'],\n },\n ];\n },\n (tx, { account }) => {\n let message;\n if (tx.tag === Tag.SignedTx && account.kind === 'generalized' && tx.signatures.length !== 0) {\n message = \"Generalized account can't be used to generate SignedTx with signatures\";\n }\n if (tx.tag === Tag.GaMetaTx && account.kind === 'basic') {\n message = \"Basic account can't be used to generate GaMetaTx\";\n }\n if (message == null) return [];\n return [{ message, key: 'InvalidAccountType', checkedKeys: ['tag'] }];\n },\n // TODO: revert nonce check\n // TODO: ensure nonce valid when paying for own tx\n (tx, { consensusProtocolVersion }) => {\n const oracleCall = Tag.OracleRegisterTx === tx.tag;\n const contractCreate = Tag.ContractCreateTx === tx.tag || Tag.GaAttachTx === tx.tag;\n const contractCall = Tag.ContractCallTx === tx.tag || Tag.GaMetaTx === tx.tag;\n const type =\n (oracleCall ? 'oracle-call' : null) ??\n (contractCreate ? 'contract-create' : null) ??\n (contractCall ? 'contract-call' : null);\n if (type == null) return [];\n const protocol = ProtocolToVmAbi[consensusProtocolVersion][type] as {\n abiVersion: readonly any[];\n vmVersion: readonly any[];\n };\n\n let ctVersion: Partial<CtVersion> | undefined;\n if ('abiVersion' in tx) ctVersion = { abiVersion: tx.abiVersion };\n if ('ctVersion' in tx) ctVersion = tx.ctVersion;\n if (ctVersion == null) throw new UnexpectedTsError();\n if (\n !protocol.abiVersion.includes(ctVersion.abiVersion) ||\n (contractCreate && !protocol.vmVersion.includes(ctVersion.vmVersion))\n ) {\n return [\n {\n message: `ABI/VM version ${JSON.stringify(ctVersion)} is wrong, supported is: ${JSON.stringify(protocol)}`,\n key: 'VmAndAbiVersionMismatch',\n checkedKeys: ['ctVersion', 'abiVersion'],\n },\n ];\n }\n return [];\n },\n async (tx, { node }) => {\n if (Tag.ContractCallTx !== tx.tag) return [];\n // TODO: remove after solving https://github.com/aeternity/aeternity/issues/3669\n if (tx.contractId.startsWith('nm_')) return [];\n try {\n const { active } = await node.getContract(tx.contractId);\n if (active) return [];\n return [\n {\n message: `Contract ${tx.contractId} is not active`,\n key: 'ContractNotActive',\n checkedKeys: ['contractId'],\n },\n ];\n } catch (error) {\n if (!(error instanceof RestError) || error.response?.bodyAsText == null) throw error;\n return [\n {\n message: JSON.parse(error.response.bodyAsText).reason, // TODO: use parsedBody instead\n key: 'ContractNotFound',\n checkedKeys: ['contractId'],\n },\n ];\n }\n },\n);\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"validator.js","names":["RestError","hash","isEncoded","verifySignature","ProtocolToVmAbi","Tag","buildTx","unpackTx","concatBuffers","isAccountNotFoundError","Encoding","decode","Node","genAggressiveCacheGetResponsesPolicy","UnexpectedTsError","getTransactionSignerAddress","getExecutionCostUsingNode","validators","verifyTransactionInternal","tx","node","parentTxTypes","address","account","height","consensusProtocolVersion","nodeNetworkId","Promise","all","getAccountByPubkey","catch","error","id","balance","nonce","then","acc","getCurrentKeyBlockHeight","getNodeInfo","map","v","flat","verifyTransaction","transaction","nodeNotCached","pipeline","clone","removePolicy","name","$host","ignoreVersion","additionalPolicies","_getCachedStatus","push","tag","SignedTx","encodedTx","signatures","length","prefix","_Buffer","from","includes","PayingForTx","join","txBinary","txWithNetworkId","txHashWithNetworkId","message","key","checkedKeys","nestedTx","ttl","cost","SpendTx","recipientId","Name","recipient","payable","kind","GaMetaTx","_ref","_ref2","oracleCall","OracleRegisterTx","contractCreate","ContractCreateTx","GaAttachTx","contractCall","ContractCallTx","type","protocol","ctVersion","abiVersion","vmVersion","JSON","stringify","contractId","startsWith","active","getContract","response","bodyAsText","parse","reason"],"sources":["../../src/tx/validator.ts"],"sourcesContent":["import { RestError } from '@azure/core-rest-pipeline';\nimport { hash, isEncoded, verifySignature } from '../utils/crypto.js';\nimport { TxUnpacked } from './builder/schema.generated.js';\nimport { CtVersion, ProtocolToVmAbi } from './builder/field-types/ct-version.js';\nimport { Tag, ConsensusProtocolVersion } from './builder/constants.js';\nimport { buildTx, unpackTx } from './builder/index.js';\nimport { concatBuffers, isAccountNotFoundError } from '../utils/other.js';\nimport { Encoded, Encoding, decode } from '../utils/encoder.js';\nimport Node from '../Node.js';\nimport { Account } from '../apis/node/index.js';\nimport { genAggressiveCacheGetResponsesPolicy } from '../utils/autorest.js';\nimport { UnexpectedTsError } from '../utils/errors.js';\nimport getTransactionSignerAddress from './transaction-signer.js';\nimport { getExecutionCostUsingNode } from './execution-cost.js';\n\nexport interface ValidatorResult {\n message: string;\n key: string;\n checkedKeys: string[];\n}\n\ntype Validator = (\n tx: TxUnpacked,\n options: {\n // TODO: remove after fixing node types\n account: Account & { id: Encoded.AccountAddress };\n nodeNetworkId: string;\n parentTxTypes: Tag[];\n node: Node;\n height: number;\n consensusProtocolVersion: ConsensusProtocolVersion;\n },\n) => ValidatorResult[] | Promise<ValidatorResult[]>;\n\nconst validators: Validator[] = [];\n\nasync function verifyTransactionInternal(\n tx: TxUnpacked,\n node: Node,\n parentTxTypes: Tag[],\n): Promise<ValidatorResult[]> {\n const address = getTransactionSignerAddress(buildTx(tx));\n const [account, { height }, { consensusProtocolVersion, nodeNetworkId }] = await Promise.all([\n node\n .getAccountByPubkey(address)\n .catch((error) => {\n if (!isAccountNotFoundError(error)) throw error;\n return { id: address, balance: 0n, nonce: 0 };\n })\n // TODO: remove after fixing https://github.com/aeternity/aepp-sdk-js/issues/1537\n .then((acc) => ({ ...acc, id: acc.id as Encoded.AccountAddress })),\n node.getCurrentKeyBlockHeight(), // TODO: don't request height on each validation, use caching\n node.getNodeInfo(),\n ]);\n\n return (\n await Promise.all(\n validators.map(async (v) =>\n v(tx, {\n node,\n account,\n height,\n consensusProtocolVersion,\n nodeNetworkId,\n parentTxTypes,\n }),\n ),\n )\n ).flat();\n}\n\n/**\n * Transaction Validator\n * This function validates some transaction properties,\n * to make sure it can be posted it to the chain\n * @category transaction builder\n * @param transaction - Base64Check-encoded transaction\n * @param nodeNotCached - Node to validate transaction against\n * @returns Array with verification errors\n * @example const errors = await verifyTransaction(transaction, node)\n */\nexport default async function verifyTransaction(\n transaction: Parameters<typeof unpackTx>[0],\n nodeNotCached: Node,\n): Promise<ValidatorResult[]> {\n const pipeline = nodeNotCached.pipeline.clone();\n pipeline.removePolicy({ name: 'parse-big-int' });\n const node = new Node(nodeNotCached.$host, {\n ignoreVersion: true,\n pipeline,\n additionalPolicies: [genAggressiveCacheGetResponsesPolicy()],\n });\n node._getCachedStatus = async () => nodeNotCached._getCachedStatus();\n return verifyTransactionInternal(unpackTx(transaction), node, []);\n}\n\nvalidators.push(\n (tx, { account, nodeNetworkId, parentTxTypes }) => {\n if (tx.tag !== Tag.SignedTx) return [];\n const { encodedTx, signatures } = tx;\n if ((encodedTx ?? signatures) == null) return [];\n if (signatures.length !== 1) return []; // TODO: Support multisignature like in state channels\n const prefix = Buffer.from(\n [nodeNetworkId, ...(parentTxTypes.includes(Tag.PayingForTx) ? ['inner_tx'] : [])].join('-'),\n );\n const txBinary = decode(buildTx(encodedTx));\n const txWithNetworkId = concatBuffers([prefix, txBinary]);\n const txHashWithNetworkId = concatBuffers([prefix, hash(txBinary)]);\n if (\n verifySignature(txWithNetworkId, signatures[0], account.id) ||\n verifySignature(txHashWithNetworkId, signatures[0], account.id)\n )\n return [];\n return [\n {\n message:\n 'Signature cannot be verified, please ensure that you transaction have' +\n ' the correct prefix and the correct private key for the sender address',\n key: 'InvalidSignature',\n checkedKeys: ['encodedTx', 'signatures'],\n },\n ];\n },\n async (tx, { node, parentTxTypes }) => {\n let nestedTx;\n if ('encodedTx' in tx) nestedTx = tx.encodedTx;\n if ('tx' in tx) nestedTx = tx.tx;\n if (nestedTx == null) return [];\n return verifyTransactionInternal(nestedTx, node, [...parentTxTypes, tx.tag]);\n },\n (tx, { height }) => {\n if (!('ttl' in tx)) return [];\n if (tx.ttl === 0 || tx.ttl > height) return [];\n return [\n {\n message: `TTL ${tx.ttl} is already expired, current height is ${height}`,\n key: 'ExpiredTTL',\n checkedKeys: ['ttl'],\n },\n ];\n },\n async (tx, { account, parentTxTypes, node }) => {\n if (parentTxTypes.length !== 0) return [];\n const cost = await getExecutionCostUsingNode(buildTx(tx), node).catch(() => 0n);\n if (cost <= account.balance) return [];\n return [\n {\n message: `Account balance ${account.balance} is not enough to execute the transaction that costs ${cost}`,\n key: 'InsufficientBalance',\n checkedKeys: ['amount', 'fee', 'nameFee', 'gasLimit', 'gasPrice'],\n },\n ];\n },\n async (tx, { node }) => {\n if (tx.tag !== Tag.SpendTx || isEncoded(tx.recipientId, Encoding.Name)) return [];\n const recipient = await node.getAccountByPubkey(tx.recipientId).catch((error) => {\n if (!isAccountNotFoundError(error)) throw error;\n return null;\n });\n if (recipient == null || recipient.payable === true) return [];\n return [\n {\n message: 'Recipient account is not payable',\n key: 'RecipientAccountNotPayable',\n checkedKeys: ['recipientId'],\n },\n ];\n },\n (tx, { account }) => {\n let message;\n if (tx.tag === Tag.SignedTx && account.kind === 'generalized' && tx.signatures.length !== 0) {\n message = \"Generalized account can't be used to generate SignedTx with signatures\";\n }\n if (tx.tag === Tag.GaMetaTx && account.kind === 'basic') {\n message = \"Basic account can't be used to generate GaMetaTx\";\n }\n if (message == null) return [];\n return [{ message, key: 'InvalidAccountType', checkedKeys: ['tag'] }];\n },\n // TODO: revert nonce check\n // TODO: ensure nonce valid when paying for own tx\n (tx, { consensusProtocolVersion }) => {\n const oracleCall = Tag.OracleRegisterTx === tx.tag;\n const contractCreate = Tag.ContractCreateTx === tx.tag || Tag.GaAttachTx === tx.tag;\n const contractCall = Tag.ContractCallTx === tx.tag || Tag.GaMetaTx === tx.tag;\n const type =\n (oracleCall ? 'oracle-call' : null) ??\n (contractCreate ? 'contract-create' : null) ??\n (contractCall ? 'contract-call' : null);\n if (type == null) return [];\n const protocol = ProtocolToVmAbi[consensusProtocolVersion][type] as {\n abiVersion: readonly any[];\n vmVersion: readonly any[];\n };\n\n let ctVersion: Partial<CtVersion> | undefined;\n if ('abiVersion' in tx) ctVersion = { abiVersion: tx.abiVersion };\n if ('ctVersion' in tx) ctVersion = tx.ctVersion;\n if (ctVersion == null) throw new UnexpectedTsError();\n if (\n !protocol.abiVersion.includes(ctVersion.abiVersion) ||\n (contractCreate && !protocol.vmVersion.includes(ctVersion.vmVersion))\n ) {\n return [\n {\n message: `ABI/VM version ${JSON.stringify(ctVersion)} is wrong, supported is: ${JSON.stringify(protocol)}`,\n key: 'VmAndAbiVersionMismatch',\n checkedKeys: ['ctVersion', 'abiVersion'],\n },\n ];\n }\n return [];\n },\n async (tx, { node }) => {\n if (Tag.ContractCallTx !== tx.tag) return [];\n // TODO: remove after solving https://github.com/aeternity/aeternity/issues/3669\n if (tx.contractId.startsWith('nm_')) return [];\n try {\n const { active } = await node.getContract(tx.contractId);\n if (active) return [];\n return [\n {\n message: `Contract ${tx.contractId} is not active`,\n key: 'ContractNotActive',\n checkedKeys: ['contractId'],\n },\n ];\n } catch (error) {\n if (!(error instanceof RestError) || error.response?.bodyAsText == null) throw error;\n return [\n {\n message: JSON.parse(error.response.bodyAsText).reason, // TODO: use parsedBody instead\n key: 'ContractNotFound',\n checkedKeys: ['contractId'],\n },\n ];\n }\n },\n);\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type Middleware from '../Middleware.js';
|
|
2
2
|
import { BaseError } from './errors.js';
|
|
3
|
-
|
|
4
|
-
data:
|
|
3
|
+
interface MiddlewareRawPage<T = unknown> {
|
|
4
|
+
data: T[];
|
|
5
5
|
next: string | null;
|
|
6
6
|
prev: string | null;
|
|
7
7
|
}
|
|
@@ -20,7 +20,7 @@ export declare class MiddlewarePage<Item> {
|
|
|
20
20
|
readonly data: Item[];
|
|
21
21
|
readonly nextPath: null | string;
|
|
22
22
|
readonly prevPath: null | string;
|
|
23
|
-
constructor(rawPage: MiddlewareRawPage
|
|
23
|
+
constructor(rawPage: MiddlewareRawPage<Item>, middleware: Middleware);
|
|
24
24
|
/**
|
|
25
25
|
* Get the next page.
|
|
26
26
|
* Check the presence of `nextPath` to not fall outside existing pages.
|
|
@@ -34,3 +34,4 @@ export declare class MiddlewarePage<Item> {
|
|
|
34
34
|
*/
|
|
35
35
|
prev(): Promise<MiddlewarePage<Item>>;
|
|
36
36
|
}
|
|
37
|
+
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MiddlewarePage.js","names":["BaseError","isMiddlewareRawPage","maybePage","testPage","data","Array","isArray","MiddlewarePageMissed","constructor","isNext","name","_middleware","WeakMap","MiddlewarePage","rawPage","middleware","_classPrivateFieldInitSpec","nextPath","next","prevPath","prev","_classPrivateFieldSet","_classPrivateFieldGet","requestByPath"],"sources":["../../src/utils/MiddlewarePage.ts"],"sourcesContent":["/* eslint-disable max-classes-per-file */\nimport type Middleware from '../Middleware.js';\nimport { BaseError } from './errors.js';\n\
|
|
1
|
+
{"version":3,"file":"MiddlewarePage.js","names":["BaseError","isMiddlewareRawPage","maybePage","testPage","data","Array","isArray","MiddlewarePageMissed","constructor","isNext","name","_middleware","WeakMap","MiddlewarePage","rawPage","middleware","_classPrivateFieldInitSpec","nextPath","next","prevPath","prev","_classPrivateFieldSet","_classPrivateFieldGet","requestByPath"],"sources":["../../src/utils/MiddlewarePage.ts"],"sourcesContent":["/* eslint-disable max-classes-per-file */\nimport type Middleware from '../Middleware.js';\nimport { BaseError } from './errors.js';\n\ninterface MiddlewareRawPage<T = unknown> {\n data: T[];\n next: string | null;\n prev: string | null;\n}\n\nexport function isMiddlewareRawPage(maybePage: unknown): maybePage is MiddlewareRawPage {\n const testPage = maybePage as MiddlewareRawPage;\n return (\n testPage?.data != null &&\n Array.isArray(testPage.data) &&\n 'next' in testPage &&\n 'prev' in testPage\n );\n}\n\n/**\n * @category exception\n */\nexport class MiddlewarePageMissed extends BaseError {\n constructor(isNext: boolean) {\n super(`There is no ${isNext ? 'next' : 'previous'} page`);\n this.name = 'MiddlewarePageMissed';\n }\n}\n\n/**\n * A wrapper around the middleware's page allowing to get the next/previous pages.\n */\nexport class MiddlewarePage<Item> {\n readonly data: Item[];\n\n readonly nextPath: null | string;\n\n readonly prevPath: null | string;\n\n readonly #middleware: Middleware;\n\n constructor(rawPage: MiddlewareRawPage<Item>, middleware: Middleware) {\n this.data = rawPage.data;\n this.nextPath = rawPage.next;\n this.prevPath = rawPage.prev;\n this.#middleware = middleware;\n }\n\n /**\n * Get the next page.\n * Check the presence of `nextPath` to not fall outside existing pages.\n * @throws MiddlewarePageMissed\n */\n async next(): Promise<MiddlewarePage<Item>> {\n if (this.nextPath == null) throw new MiddlewarePageMissed(true);\n return this.#middleware.requestByPath(this.nextPath);\n }\n\n /**\n * Get the previous page.\n * Check the presence of `prevPath` to not fall outside existing pages.\n * @throws MiddlewarePageMissed\n */\n async prev(): Promise<MiddlewarePage<Item>> {\n if (this.prevPath == null) throw new MiddlewarePageMissed(false);\n return this.#middleware.requestByPath(this.prevPath);\n }\n}\n"],"mappings":";;;;;AAAA;;AAEA,SAASA,SAAS,QAAQ,aAAa;AAQvC,OAAO,SAASC,mBAAmBA,CAACC,SAAkB,EAAkC;EACtF,MAAMC,QAAQ,GAAGD,SAA8B;EAC/C,OACEC,QAAQ,EAAEC,IAAI,IAAI,IAAI,IACtBC,KAAK,CAACC,OAAO,CAACH,QAAQ,CAACC,IAAI,CAAC,IAC5B,MAAM,IAAID,QAAQ,IAClB,MAAM,IAAIA,QAAQ;AAEtB;;AAEA;AACA;AACA;AACA,OAAO,MAAMI,oBAAoB,SAASP,SAAS,CAAC;EAClDQ,WAAWA,CAACC,MAAe,EAAE;IAC3B,KAAK,CAAC,eAAeA,MAAM,GAAG,MAAM,GAAG,UAAU,OAAO,CAAC;IACzD,IAAI,CAACC,IAAI,GAAG,sBAAsB;EACpC;AACF;;AAEA;AACA;AACA;AAFA,IAAAC,WAAA,oBAAAC,OAAA;AAGA,OAAO,MAAMC,cAAc,CAAO;EAShCL,WAAWA,CAACM,OAAgC,EAAEC,UAAsB,EAAE;IAFtEC,0BAAA,OAASL,WAAW;IAGlB,IAAI,CAACP,IAAI,GAAGU,OAAO,CAACV,IAAI;IACxB,IAAI,CAACa,QAAQ,GAAGH,OAAO,CAACI,IAAI;IAC5B,IAAI,CAACC,QAAQ,GAAGL,OAAO,CAACM,IAAI;IAC5BC,qBAAA,CAAKV,WAAW,EAAhB,IAAI,EAAeI,UAAJ,CAAC;EAClB;;EAEA;AACF;AACA;AACA;AACA;EACE,MAAMG,IAAIA,CAAA,EAAkC;IAC1C,IAAI,IAAI,CAACD,QAAQ,IAAI,IAAI,EAAE,MAAM,IAAIV,oBAAoB,CAAC,IAAI,CAAC;IAC/D,OAAOe,qBAAA,CAAKX,WAAW,EAAhB,IAAe,CAAC,CAACY,aAAa,CAAC,IAAI,CAACN,QAAQ,CAAC;EACtD;;EAEA;AACF;AACA;AACA;AACA;EACE,MAAMG,IAAIA,CAAA,EAAkC;IAC1C,IAAI,IAAI,CAACD,QAAQ,IAAI,IAAI,EAAE,MAAM,IAAIZ,oBAAoB,CAAC,KAAK,CAAC;IAChE,OAAOe,qBAAA,CAAKX,WAAW,EAAhB,IAAe,CAAC,CAACY,aAAa,CAAC,IAAI,CAACJ,QAAQ,CAAC;EACtD;AACF","ignoreList":[]}
|
|
@@ -1,4 +1,8 @@
|
|
|
1
|
-
import
|
|
1
|
+
import BigNumber from 'bignumber.js';
|
|
2
|
+
/**
|
|
3
|
+
* @deprecated no replacement implemented yet
|
|
4
|
+
* @category utils
|
|
5
|
+
*/
|
|
2
6
|
export declare enum AE_AMOUNT_FORMATS {
|
|
3
7
|
AE = "ae",
|
|
4
8
|
MILI_AE = "miliAE",
|
|
@@ -10,6 +14,8 @@ export declare enum AE_AMOUNT_FORMATS {
|
|
|
10
14
|
}
|
|
11
15
|
/**
|
|
12
16
|
* Convert amount from one to other denomination
|
|
17
|
+
* @deprecated no replacement implemented yet
|
|
18
|
+
* @category utils
|
|
13
19
|
* @param value - amount to convert
|
|
14
20
|
* @param options - options
|
|
15
21
|
* @param options.denomination - denomination of amount, can be ['ae', 'aettos']
|
|
@@ -22,6 +28,8 @@ export declare const formatAmount: (value: string | number | bigint | BigNumber,
|
|
|
22
28
|
}) => string;
|
|
23
29
|
/**
|
|
24
30
|
* Convert amount to AE
|
|
31
|
+
* @deprecated no replacement implemented yet
|
|
32
|
+
* @category utils
|
|
25
33
|
* @param value - amount to convert
|
|
26
34
|
* @param options - options
|
|
27
35
|
* @param options.denomination - denomination of amount, can be ['ae', 'aettos']
|
|
@@ -31,6 +39,8 @@ export declare const toAe: (value: string | number | BigNumber, { denomination }
|
|
|
31
39
|
}) => string;
|
|
32
40
|
/**
|
|
33
41
|
* Convert amount to aettos
|
|
42
|
+
* @deprecated no replacement implemented yet
|
|
43
|
+
* @category utils
|
|
34
44
|
* @param value - amount to convert
|
|
35
45
|
* @param options - options
|
|
36
46
|
* @param options.denomination - denomination of amount, can be ['ae', 'aettos']
|
|
@@ -38,4 +48,8 @@ export declare const toAe: (value: string | number | BigNumber, { denomination }
|
|
|
38
48
|
export declare const toAettos: (value: string | number | BigNumber, { denomination }?: {
|
|
39
49
|
denomination?: AE_AMOUNT_FORMATS;
|
|
40
50
|
}) => string;
|
|
51
|
+
/**
|
|
52
|
+
* @deprecated no replacement implemented yet
|
|
53
|
+
* @category utils
|
|
54
|
+
*/
|
|
41
55
|
export declare const prefixedAmount: (rawValue: string | number | BigNumber) => string;
|
|
@@ -1,6 +1,11 @@
|
|
|
1
|
-
import
|
|
1
|
+
import BigNumber from 'bignumber.js';
|
|
2
2
|
import { isBigNumber } from './bignumber.js';
|
|
3
3
|
import { ArgumentError } from './errors.js';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* @deprecated no replacement implemented yet
|
|
7
|
+
* @category utils
|
|
8
|
+
*/
|
|
4
9
|
export let AE_AMOUNT_FORMATS = /*#__PURE__*/function (AE_AMOUNT_FORMATS) {
|
|
5
10
|
AE_AMOUNT_FORMATS["AE"] = "ae";
|
|
6
11
|
AE_AMOUNT_FORMATS["MILI_AE"] = "miliAE";
|
|
@@ -27,6 +32,8 @@ const DENOMINATION_MAGNITUDE = {
|
|
|
27
32
|
|
|
28
33
|
/**
|
|
29
34
|
* Convert amount from one to other denomination
|
|
35
|
+
* @deprecated no replacement implemented yet
|
|
36
|
+
* @category utils
|
|
30
37
|
* @param value - amount to convert
|
|
31
38
|
* @param options - options
|
|
32
39
|
* @param options.denomination - denomination of amount, can be ['ae', 'aettos']
|
|
@@ -43,6 +50,8 @@ export const formatAmount = (value, {
|
|
|
43
50
|
|
|
44
51
|
/**
|
|
45
52
|
* Convert amount to AE
|
|
53
|
+
* @deprecated no replacement implemented yet
|
|
54
|
+
* @category utils
|
|
46
55
|
* @param value - amount to convert
|
|
47
56
|
* @param options - options
|
|
48
57
|
* @param options.denomination - denomination of amount, can be ['ae', 'aettos']
|
|
@@ -56,6 +65,8 @@ export const toAe = (value, {
|
|
|
56
65
|
|
|
57
66
|
/**
|
|
58
67
|
* Convert amount to aettos
|
|
68
|
+
* @deprecated no replacement implemented yet
|
|
69
|
+
* @category utils
|
|
59
70
|
* @param value - amount to convert
|
|
60
71
|
* @param options - options
|
|
61
72
|
* @param options.denomination - denomination of amount, can be ['ae', 'aettos']
|
|
@@ -83,6 +94,11 @@ const getLowerBoundPrefix = exponent => {
|
|
|
83
94
|
var _prefixes$find;
|
|
84
95
|
return (_prefixes$find = prefixes.find(p => p.magnitude <= exponent)) !== null && _prefixes$find !== void 0 ? _prefixes$find : prefixes[prefixes.length - 1];
|
|
85
96
|
};
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* @deprecated no replacement implemented yet
|
|
100
|
+
* @category utils
|
|
101
|
+
*/
|
|
86
102
|
export const prefixedAmount = rawValue => {
|
|
87
103
|
var _value$e;
|
|
88
104
|
const value = new BigNumber(rawValue);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"amount-formatter.js","names":["BigNumber","isBigNumber","ArgumentError","AE_AMOUNT_FORMATS","DENOMINATION_MAGNITUDE","AE","MILI_AE","MICRO_AE","NANO_AE","PICO_AE","FEMTO_AE","AETTOS","formatAmount","value","denomination","targetDenomination","toString","shiftedBy","toFixed","toAe","toAettos","prefixes","name","magnitude","getNearestPrefix","exponent","reduce","p","n","Math","abs","getLowerBoundPrefix","_prefixes$find","find","length","prefixedAmount","rawValue","_value$e","exp","e","v","precision","min"],"sources":["../../src/utils/amount-formatter.ts"],"sourcesContent":["import
|
|
1
|
+
{"version":3,"file":"amount-formatter.js","names":["BigNumber","isBigNumber","ArgumentError","AE_AMOUNT_FORMATS","DENOMINATION_MAGNITUDE","AE","MILI_AE","MICRO_AE","NANO_AE","PICO_AE","FEMTO_AE","AETTOS","formatAmount","value","denomination","targetDenomination","toString","shiftedBy","toFixed","toAe","toAettos","prefixes","name","magnitude","getNearestPrefix","exponent","reduce","p","n","Math","abs","getLowerBoundPrefix","_prefixes$find","find","length","prefixedAmount","rawValue","_value$e","exp","e","v","precision","min"],"sources":["../../src/utils/amount-formatter.ts"],"sourcesContent":["import BigNumber from 'bignumber.js';\nimport { isBigNumber } from './bignumber.js';\nimport { ArgumentError } from './errors.js';\n\n/**\n * @deprecated no replacement implemented yet\n * @category utils\n */\nexport enum AE_AMOUNT_FORMATS {\n AE = 'ae',\n MILI_AE = 'miliAE',\n MICRO_AE = 'microAE',\n NANO_AE = 'nanoAE',\n PICO_AE = 'picoAE',\n FEMTO_AE = 'femtoAE',\n AETTOS = 'aettos',\n}\n\n/**\n * DENOMINATION_MAGNITUDE\n */\nconst DENOMINATION_MAGNITUDE = {\n [AE_AMOUNT_FORMATS.AE]: 0,\n [AE_AMOUNT_FORMATS.MILI_AE]: -3,\n [AE_AMOUNT_FORMATS.MICRO_AE]: -6,\n [AE_AMOUNT_FORMATS.NANO_AE]: -9,\n [AE_AMOUNT_FORMATS.PICO_AE]: -12,\n [AE_AMOUNT_FORMATS.FEMTO_AE]: -15,\n [AE_AMOUNT_FORMATS.AETTOS]: -18,\n} as const;\n\n/**\n * Convert amount from one to other denomination\n * @deprecated no replacement implemented yet\n * @category utils\n * @param value - amount to convert\n * @param options - options\n * @param options.denomination - denomination of amount, can be ['ae', 'aettos']\n * @param options.targetDenomination - target denomination,\n * can be ['ae', 'aettos']\n */\nexport const formatAmount = (\n value: string | number | bigint | BigNumber,\n {\n denomination = AE_AMOUNT_FORMATS.AETTOS,\n targetDenomination = AE_AMOUNT_FORMATS.AETTOS,\n }: { denomination?: AE_AMOUNT_FORMATS; targetDenomination?: AE_AMOUNT_FORMATS },\n): string => {\n if (!isBigNumber(value)) throw new ArgumentError('value', 'a number', value);\n\n return new BigNumber(typeof value === 'bigint' ? value.toString() : value)\n .shiftedBy(DENOMINATION_MAGNITUDE[denomination] - DENOMINATION_MAGNITUDE[targetDenomination])\n .toFixed();\n};\n\n/**\n * Convert amount to AE\n * @deprecated no replacement implemented yet\n * @category utils\n * @param value - amount to convert\n * @param options - options\n * @param options.denomination - denomination of amount, can be ['ae', 'aettos']\n */\nexport const toAe = (\n value: string | number | BigNumber,\n { denomination = AE_AMOUNT_FORMATS.AETTOS }: { denomination?: AE_AMOUNT_FORMATS } = {},\n): string => formatAmount(value, { denomination, targetDenomination: AE_AMOUNT_FORMATS.AE });\n\n/**\n * Convert amount to aettos\n * @deprecated no replacement implemented yet\n * @category utils\n * @param value - amount to convert\n * @param options - options\n * @param options.denomination - denomination of amount, can be ['ae', 'aettos']\n */\nexport const toAettos = (\n value: string | number | BigNumber,\n { denomination = AE_AMOUNT_FORMATS.AE }: { denomination?: AE_AMOUNT_FORMATS } = {},\n): string => formatAmount(value, { denomination });\n\ninterface Prefix {\n name: string;\n magnitude: number;\n}\n\nconst prefixes: Prefix[] = [\n { name: 'exa', magnitude: 18 },\n { name: 'giga', magnitude: 9 },\n { name: '', magnitude: 0 },\n { name: 'pico', magnitude: -12 },\n];\n\nconst getNearestPrefix = (exponent: number): Prefix =>\n prefixes.reduce((p, n) =>\n Math.abs(n.magnitude - exponent) < Math.abs(p.magnitude - exponent) ? n : p,\n );\n\nconst getLowerBoundPrefix = (exponent: number): Prefix =>\n prefixes.find((p) => p.magnitude <= exponent) ?? prefixes[prefixes.length - 1];\n\n/**\n * @deprecated no replacement implemented yet\n * @category utils\n */\nexport const prefixedAmount = (rawValue: string | number | BigNumber): string => {\n const value: BigNumber = new BigNumber(rawValue);\n\n const exp = value.e ?? 0;\n const { name, magnitude } = (exp < 0 ? getNearestPrefix : getLowerBoundPrefix)(exp);\n const v = value\n .shiftedBy(-magnitude)\n .precision(9 + Math.min(exp - magnitude, 0))\n .toFixed();\n return `${v}${name !== '' ? ' ' : ''}${name}`;\n};\n"],"mappings":"AAAA,OAAOA,SAAS,MAAM,cAAc;AACpC,SAASC,WAAW,QAAQ,gBAAgB;AAC5C,SAASC,aAAa,QAAQ,aAAa;;AAE3C;AACA;AACA;AACA;AACA,WAAYC,iBAAiB,0BAAjBA,iBAAiB;EAAjBA,iBAAiB;EAAjBA,iBAAiB;EAAjBA,iBAAiB;EAAjBA,iBAAiB;EAAjBA,iBAAiB;EAAjBA,iBAAiB;EAAjBA,iBAAiB;EAAA,OAAjBA,iBAAiB;AAAA;;AAU7B;AACA;AACA;AACA,MAAMC,sBAAsB,GAAG;EAC7B,CAACD,iBAAiB,CAACE,EAAE,GAAG,CAAC;EACzB,CAACF,iBAAiB,CAACG,OAAO,GAAG,CAAC,CAAC;EAC/B,CAACH,iBAAiB,CAACI,QAAQ,GAAG,CAAC,CAAC;EAChC,CAACJ,iBAAiB,CAACK,OAAO,GAAG,CAAC,CAAC;EAC/B,CAACL,iBAAiB,CAACM,OAAO,GAAG,CAAC,EAAE;EAChC,CAACN,iBAAiB,CAACO,QAAQ,GAAG,CAAC,EAAE;EACjC,CAACP,iBAAiB,CAACQ,MAAM,GAAG,CAAC;AAC/B,CAAU;;AAEV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,MAAMC,YAAY,GAAGA,CAC1BC,KAA2C,EAC3C;EACEC,YAAY,GAAGX,iBAAiB,CAACQ,MAAM;EACvCI,kBAAkB,GAAGZ,iBAAiB,CAACQ;AACqC,CAAC,KACpE;EACX,IAAI,CAACV,WAAW,CAACY,KAAK,CAAC,EAAE,MAAM,IAAIX,aAAa,CAAC,OAAO,EAAE,UAAU,EAAEW,KAAK,CAAC;EAE5E,OAAO,IAAIb,SAAS,CAAC,OAAOa,KAAK,KAAK,QAAQ,GAAGA,KAAK,CAACG,QAAQ,CAAC,CAAC,GAAGH,KAAK,CAAC,CACvEI,SAAS,CAACb,sBAAsB,CAACU,YAAY,CAAC,GAAGV,sBAAsB,CAACW,kBAAkB,CAAC,CAAC,CAC5FG,OAAO,CAAC,CAAC;AACd,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,MAAMC,IAAI,GAAGA,CAClBN,KAAkC,EAClC;EAAEC,YAAY,GAAGX,iBAAiB,CAACQ;AAA6C,CAAC,GAAG,CAAC,CAAC,KAC3EC,YAAY,CAACC,KAAK,EAAE;EAAEC,YAAY;EAAEC,kBAAkB,EAAEZ,iBAAiB,CAACE;AAAG,CAAC,CAAC;;AAE5F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,MAAMe,QAAQ,GAAGA,CACtBP,KAAkC,EAClC;EAAEC,YAAY,GAAGX,iBAAiB,CAACE;AAAyC,CAAC,GAAG,CAAC,CAAC,KACvEO,YAAY,CAACC,KAAK,EAAE;EAAEC;AAAa,CAAC,CAAC;AAOlD,MAAMO,QAAkB,GAAG,CACzB;EAAEC,IAAI,EAAE,KAAK;EAAEC,SAAS,EAAE;AAAG,CAAC,EAC9B;EAAED,IAAI,EAAE,MAAM;EAAEC,SAAS,EAAE;AAAE,CAAC,EAC9B;EAAED,IAAI,EAAE,EAAE;EAAEC,SAAS,EAAE;AAAE,CAAC,EAC1B;EAAED,IAAI,EAAE,MAAM;EAAEC,SAAS,EAAE,CAAC;AAAG,CAAC,CACjC;AAED,MAAMC,gBAAgB,GAAIC,QAAgB,IACxCJ,QAAQ,CAACK,MAAM,CAAC,CAACC,CAAC,EAAEC,CAAC,KACnBC,IAAI,CAACC,GAAG,CAACF,CAAC,CAACL,SAAS,GAAGE,QAAQ,CAAC,GAAGI,IAAI,CAACC,GAAG,CAACH,CAAC,CAACJ,SAAS,GAAGE,QAAQ,CAAC,GAAGG,CAAC,GAAGD,CAC5E,CAAC;AAEH,MAAMI,mBAAmB,GAAIN,QAAgB;EAAA,IAAAO,cAAA;EAAA,QAAAA,cAAA,GAC3CX,QAAQ,CAACY,IAAI,CAAEN,CAAC,IAAKA,CAAC,CAACJ,SAAS,IAAIE,QAAQ,CAAC,cAAAO,cAAA,cAAAA,cAAA,GAAIX,QAAQ,CAACA,QAAQ,CAACa,MAAM,GAAG,CAAC,CAAC;AAAA;;AAEhF;AACA;AACA;AACA;AACA,OAAO,MAAMC,cAAc,GAAIC,QAAqC,IAAa;EAAA,IAAAC,QAAA;EAC/E,MAAMxB,KAAgB,GAAG,IAAIb,SAAS,CAACoC,QAAQ,CAAC;EAEhD,MAAME,GAAG,IAAAD,QAAA,GAAGxB,KAAK,CAAC0B,CAAC,cAAAF,QAAA,cAAAA,QAAA,GAAI,CAAC;EACxB,MAAM;IAAEf,IAAI;IAAEC;EAAU,CAAC,GAAG,CAACe,GAAG,GAAG,CAAC,GAAGd,gBAAgB,GAAGO,mBAAmB,EAAEO,GAAG,CAAC;EACnF,MAAME,CAAC,GAAG3B,KAAK,CACZI,SAAS,CAAC,CAACM,SAAS,CAAC,CACrBkB,SAAS,CAAC,CAAC,GAAGZ,IAAI,CAACa,GAAG,CAACJ,GAAG,GAAGf,SAAS,EAAE,CAAC,CAAC,CAAC,CAC3CL,OAAO,CAAC,CAAC;EACZ,OAAO,GAAGsB,CAAC,GAAGlB,IAAI,KAAK,EAAE,GAAG,GAAG,GAAG,EAAE,GAAGA,IAAI,EAAE;AAC/C,CAAC","ignoreList":[]}
|
package/es/utils/autorest.d.ts
CHANGED
|
@@ -8,5 +8,5 @@ export declare const genRequestQueuesPolicy: () => AdditionalPolicyConfig;
|
|
|
8
8
|
export declare const genCombineGetRequestsPolicy: () => AdditionalPolicyConfig;
|
|
9
9
|
export declare const genAggressiveCacheGetResponsesPolicy: () => AdditionalPolicyConfig;
|
|
10
10
|
export declare const genErrorFormatterPolicy: (getMessage: (b: any) => string) => AdditionalPolicyConfig;
|
|
11
|
-
export declare const genVersionCheckPolicy: (name: string, versionCb: (options: OperationOptions) => Promise<string>, geVersion: string, ltVersion: string) => AdditionalPolicyConfig;
|
|
11
|
+
export declare const genVersionCheckPolicy: (name: string, versionCb: (options: OperationOptions) => Promise<string>, geVersion: string, ltVersion: string, ignoreVersion: boolean) => AdditionalPolicyConfig;
|
|
12
12
|
export declare const genRetryOnFailurePolicy: (retryCount: number, retryOverallDelay: number) => AdditionalPolicyConfig;
|
package/es/utils/autorest.js
CHANGED
|
@@ -17,8 +17,7 @@ export const createSerializer = (...args) => {
|
|
|
17
17
|
return serialize.call(this, mapper, object, objectName, options);
|
|
18
18
|
}
|
|
19
19
|
if (typeof object !== 'bigint') {
|
|
20
|
-
|
|
21
|
-
(_objectName = objectName) !== null && _objectName !== void 0 ? _objectName : objectName = mapper.serializedName;
|
|
20
|
+
objectName !== null && objectName !== void 0 ? objectName : objectName = mapper.serializedName;
|
|
22
21
|
throw new Error(`${objectName} with value ${object} must be of type bigint.`);
|
|
23
22
|
}
|
|
24
23
|
return object.toString();
|
|
@@ -148,7 +147,7 @@ export const genErrorFormatterPolicy = getMessage => ({
|
|
|
148
147
|
},
|
|
149
148
|
position: 'perCall'
|
|
150
149
|
});
|
|
151
|
-
export const genVersionCheckPolicy = (name, versionCb, geVersion, ltVersion) => ({
|
|
150
|
+
export const genVersionCheckPolicy = (name, versionCb, geVersion, ltVersion, ignoreVersion) => ({
|
|
152
151
|
policy: {
|
|
153
152
|
name: 'version-check',
|
|
154
153
|
async sendRequest(request, next) {
|
|
@@ -164,7 +163,10 @@ export const genVersionCheckPolicy = (name, versionCb, geVersion, ltVersion) =>
|
|
|
164
163
|
}
|
|
165
164
|
};
|
|
166
165
|
const args = [await versionCb(options), geVersion, ltVersion];
|
|
167
|
-
if (!semverSatisfies(...args))
|
|
166
|
+
if (!semverSatisfies(...args)) {
|
|
167
|
+
const error = new UnsupportedVersionError(name, ...args);
|
|
168
|
+
if (ignoreVersion) console.warn(error.message);else throw error;
|
|
169
|
+
}
|
|
168
170
|
return next(request);
|
|
169
171
|
}
|
|
170
172
|
},
|
|
@@ -175,6 +177,10 @@ export const genRetryOnFailurePolicy = (retryCount, retryOverallDelay) => ({
|
|
|
175
177
|
name: 'retry-on-failure',
|
|
176
178
|
async sendRequest(request, next) {
|
|
177
179
|
var _request$headers$get;
|
|
180
|
+
if (request.headers.get('__no-retry') != null) {
|
|
181
|
+
request.headers.delete('__no-retry');
|
|
182
|
+
return next(request);
|
|
183
|
+
}
|
|
178
184
|
const retryCode = (_request$headers$get = request.headers.get('__retry-code')) !== null && _request$headers$get !== void 0 ? _request$headers$get : NaN;
|
|
179
185
|
request.headers.delete('__retry-code');
|
|
180
186
|
const statusesToNotRetry = [200, 400, 403, 410, 500].filter(c => c !== +retryCode);
|