@shapeshiftoss/unchained-client 10.14.10 → 10.15.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.md +21 -0
- package/README.md +2 -2
- package/dist/cjs/.tsbuildinfo +1 -1
- package/dist/cjs/cosmossdk/thorchain/parser/__tests__/thorchain.test.js +1 -1
- package/dist/cjs/cosmossdk/thorchain/parser/rfox.js +1 -1
- package/dist/cjs/evm/arbitrum/parser/index.js +2 -2
- package/dist/cjs/evm/ethereum/parser/__tests__/ethereum.test.js +29 -0
- package/dist/cjs/evm/ethereum/parser/index.js +6 -0
- package/dist/cjs/generated/arbitrum/apis/V1Api.d.ts +1 -14
- package/dist/cjs/generated/arbitrum/apis/V1Api.js +0 -39
- package/dist/cjs/generated/arbitrum/models/index.d.ts +0 -3
- package/dist/cjs/generated/arbitrum/models/index.js +0 -3
- package/dist/cjs/generated/avalanche/apis/V1Api.d.ts +1 -14
- package/dist/cjs/generated/avalanche/apis/V1Api.js +0 -39
- package/dist/cjs/generated/avalanche/models/index.d.ts +0 -3
- package/dist/cjs/generated/avalanche/models/index.js +0 -3
- package/dist/cjs/generated/base/apis/V1Api.d.ts +1 -14
- package/dist/cjs/generated/base/apis/V1Api.js +0 -39
- package/dist/cjs/generated/base/models/index.d.ts +0 -3
- package/dist/cjs/generated/base/models/index.js +0 -3
- package/dist/cjs/generated/bitcoin/models/Address.d.ts +7 -0
- package/dist/cjs/generated/bitcoin/models/Address.js +3 -0
- package/dist/cjs/generated/bitcoincash/models/Address.d.ts +7 -0
- package/dist/cjs/generated/bitcoincash/models/Address.js +3 -0
- package/dist/cjs/generated/bnbsmartchain/apis/V1Api.d.ts +1 -14
- package/dist/cjs/generated/bnbsmartchain/apis/V1Api.js +0 -39
- package/dist/cjs/generated/bnbsmartchain/models/index.d.ts +0 -3
- package/dist/cjs/generated/bnbsmartchain/models/index.js +0 -3
- package/dist/cjs/generated/dogecoin/models/Address.d.ts +7 -0
- package/dist/cjs/generated/dogecoin/models/Address.js +3 -0
- package/dist/cjs/generated/ethereum/apis/V1Api.d.ts +1 -14
- package/dist/cjs/generated/ethereum/apis/V1Api.js +0 -39
- package/dist/cjs/generated/ethereum/models/index.d.ts +0 -3
- package/dist/cjs/generated/ethereum/models/index.js +0 -3
- package/dist/cjs/generated/gnosis/apis/V1Api.d.ts +1 -14
- package/dist/cjs/generated/gnosis/apis/V1Api.js +0 -39
- package/dist/cjs/generated/gnosis/models/index.d.ts +0 -3
- package/dist/cjs/generated/gnosis/models/index.js +0 -3
- package/dist/cjs/generated/litecoin/models/Address.d.ts +7 -0
- package/dist/cjs/generated/litecoin/models/Address.js +3 -0
- package/dist/cjs/generated/mayachain/apis/ProxyApi.d.ts +18 -2
- package/dist/cjs/generated/mayachain/apis/ProxyApi.js +42 -2
- package/dist/cjs/generated/mayachain/apis/V1Api.d.ts +1 -13
- package/dist/cjs/generated/mayachain/apis/V1Api.js +0 -27
- package/dist/cjs/generated/mayachain/models/index.d.ts +0 -2
- package/dist/cjs/generated/mayachain/models/index.js +0 -2
- package/dist/cjs/generated/optimism/apis/V1Api.d.ts +1 -14
- package/dist/cjs/generated/optimism/apis/V1Api.js +0 -39
- package/dist/cjs/generated/optimism/models/index.d.ts +0 -3
- package/dist/cjs/generated/optimism/models/index.js +0 -3
- package/dist/cjs/generated/polygon/apis/V1Api.d.ts +1 -14
- package/dist/cjs/generated/polygon/apis/V1Api.js +0 -39
- package/dist/cjs/generated/polygon/models/index.d.ts +0 -3
- package/dist/cjs/generated/polygon/models/index.js +0 -3
- package/dist/cjs/generated/thorchain/apis/V1Api.d.ts +1 -25
- package/dist/cjs/generated/thorchain/apis/V1Api.js +0 -54
- package/dist/cjs/generated/thorchain/models/index.d.ts +0 -3
- package/dist/cjs/generated/thorchain/models/index.js +0 -3
- package/dist/cjs/generated/zcash/models/Address.d.ts +7 -0
- package/dist/cjs/generated/zcash/models/Address.js +3 -0
- package/dist/cjs/solana/parser/__tests__/solana.test.js +5 -3
- package/dist/cjs/solana/parser/index.js +1 -0
- package/dist/cjs/solana/parser/thorchain.d.ts +9 -0
- package/dist/cjs/solana/parser/thorchain.js +54 -0
- package/dist/cjs/solana/parser/types.d.ts +4 -1
- package/dist/cjs/tron/__tests__/api.test.d.ts +1 -0
- package/dist/cjs/tron/__tests__/api.test.js +300 -0
- package/dist/cjs/tron/api.d.ts +38 -15
- package/dist/cjs/tron/api.js +241 -84
- package/dist/cjs/tron/types.d.ts +4 -0
- package/dist/esm/.tsbuildinfo +1 -1
- package/dist/esm/cosmossdk/thorchain/parser/__tests__/thorchain.test.js +2 -2
- package/dist/esm/cosmossdk/thorchain/parser/rfox.js +2 -2
- package/dist/esm/evm/arbitrum/parser/index.js +3 -3
- package/dist/esm/evm/ethereum/parser/__tests__/ethereum.test.js +29 -0
- package/dist/esm/evm/ethereum/parser/index.js +7 -1
- package/dist/esm/generated/arbitrum/apis/V1Api.d.ts +1 -14
- package/dist/esm/generated/arbitrum/apis/V1Api.js +1 -40
- package/dist/esm/generated/arbitrum/models/index.d.ts +0 -3
- package/dist/esm/generated/arbitrum/models/index.js +0 -3
- package/dist/esm/generated/avalanche/apis/V1Api.d.ts +1 -14
- package/dist/esm/generated/avalanche/apis/V1Api.js +1 -40
- package/dist/esm/generated/avalanche/models/index.d.ts +0 -3
- package/dist/esm/generated/avalanche/models/index.js +0 -3
- package/dist/esm/generated/base/apis/V1Api.d.ts +1 -14
- package/dist/esm/generated/base/apis/V1Api.js +1 -40
- package/dist/esm/generated/base/models/index.d.ts +0 -3
- package/dist/esm/generated/base/models/index.js +0 -3
- package/dist/esm/generated/bitcoin/models/Address.d.ts +7 -0
- package/dist/esm/generated/bitcoin/models/Address.js +3 -0
- package/dist/esm/generated/bitcoincash/models/Address.d.ts +7 -0
- package/dist/esm/generated/bitcoincash/models/Address.js +3 -0
- package/dist/esm/generated/bnbsmartchain/apis/V1Api.d.ts +1 -14
- package/dist/esm/generated/bnbsmartchain/apis/V1Api.js +1 -40
- package/dist/esm/generated/bnbsmartchain/models/index.d.ts +0 -3
- package/dist/esm/generated/bnbsmartchain/models/index.js +0 -3
- package/dist/esm/generated/dogecoin/models/Address.d.ts +7 -0
- package/dist/esm/generated/dogecoin/models/Address.js +3 -0
- package/dist/esm/generated/ethereum/apis/V1Api.d.ts +1 -14
- package/dist/esm/generated/ethereum/apis/V1Api.js +1 -40
- package/dist/esm/generated/ethereum/models/index.d.ts +0 -3
- package/dist/esm/generated/ethereum/models/index.js +0 -3
- package/dist/esm/generated/gnosis/apis/V1Api.d.ts +1 -14
- package/dist/esm/generated/gnosis/apis/V1Api.js +1 -40
- package/dist/esm/generated/gnosis/models/index.d.ts +0 -3
- package/dist/esm/generated/gnosis/models/index.js +0 -3
- package/dist/esm/generated/litecoin/models/Address.d.ts +7 -0
- package/dist/esm/generated/litecoin/models/Address.js +3 -0
- package/dist/esm/generated/mayachain/apis/ProxyApi.d.ts +18 -2
- package/dist/esm/generated/mayachain/apis/ProxyApi.js +42 -2
- package/dist/esm/generated/mayachain/apis/V1Api.d.ts +1 -13
- package/dist/esm/generated/mayachain/apis/V1Api.js +1 -28
- package/dist/esm/generated/mayachain/models/index.d.ts +0 -2
- package/dist/esm/generated/mayachain/models/index.js +0 -2
- package/dist/esm/generated/optimism/apis/V1Api.d.ts +1 -14
- package/dist/esm/generated/optimism/apis/V1Api.js +1 -40
- package/dist/esm/generated/optimism/models/index.d.ts +0 -3
- package/dist/esm/generated/optimism/models/index.js +0 -3
- package/dist/esm/generated/polygon/apis/V1Api.d.ts +1 -14
- package/dist/esm/generated/polygon/apis/V1Api.js +1 -40
- package/dist/esm/generated/polygon/models/index.d.ts +0 -3
- package/dist/esm/generated/polygon/models/index.js +0 -3
- package/dist/esm/generated/thorchain/apis/V1Api.d.ts +1 -25
- package/dist/esm/generated/thorchain/apis/V1Api.js +1 -55
- package/dist/esm/generated/thorchain/models/index.d.ts +0 -3
- package/dist/esm/generated/thorchain/models/index.js +0 -3
- package/dist/esm/generated/zcash/models/Address.d.ts +7 -0
- package/dist/esm/generated/zcash/models/Address.js +3 -0
- package/dist/esm/solana/parser/__tests__/solana.test.js +5 -3
- package/dist/esm/solana/parser/index.js +1 -0
- package/dist/esm/solana/parser/thorchain.d.ts +9 -0
- package/dist/esm/solana/parser/thorchain.js +24 -0
- package/dist/esm/solana/parser/types.d.ts +4 -1
- package/dist/esm/tron/__tests__/api.test.d.ts +1 -0
- package/dist/esm/tron/__tests__/api.test.js +298 -0
- package/dist/esm/tron/api.d.ts +38 -15
- package/dist/esm/tron/api.js +239 -83
- package/dist/esm/tron/types.d.ts +4 -0
- package/package.json +16 -17
- package/CHANGELOG.md +0 -409
- package/dist/cjs/generated/arbitrum/models/TokenMetadata.d.ts +0 -62
- package/dist/cjs/generated/arbitrum/models/TokenMetadata.js +0 -67
- package/dist/cjs/generated/arbitrum/models/TokenMetadataMedia.d.ts +0 -45
- package/dist/cjs/generated/arbitrum/models/TokenMetadataMedia.js +0 -61
- package/dist/cjs/generated/arbitrum/models/TokenType.d.ts +0 -23
- package/dist/cjs/generated/arbitrum/models/TokenType.js +0 -37
- package/dist/cjs/generated/avalanche/models/TokenMetadata.d.ts +0 -62
- package/dist/cjs/generated/avalanche/models/TokenMetadata.js +0 -67
- package/dist/cjs/generated/avalanche/models/TokenMetadataMedia.d.ts +0 -45
- package/dist/cjs/generated/avalanche/models/TokenMetadataMedia.js +0 -61
- package/dist/cjs/generated/avalanche/models/TokenType.d.ts +0 -23
- package/dist/cjs/generated/avalanche/models/TokenType.js +0 -37
- package/dist/cjs/generated/base/models/TokenMetadata.d.ts +0 -62
- package/dist/cjs/generated/base/models/TokenMetadata.js +0 -67
- package/dist/cjs/generated/base/models/TokenMetadataMedia.d.ts +0 -45
- package/dist/cjs/generated/base/models/TokenMetadataMedia.js +0 -61
- package/dist/cjs/generated/base/models/TokenType.d.ts +0 -23
- package/dist/cjs/generated/base/models/TokenType.js +0 -37
- package/dist/cjs/generated/bnbsmartchain/models/TokenMetadata.d.ts +0 -62
- package/dist/cjs/generated/bnbsmartchain/models/TokenMetadata.js +0 -67
- package/dist/cjs/generated/bnbsmartchain/models/TokenMetadataMedia.d.ts +0 -45
- package/dist/cjs/generated/bnbsmartchain/models/TokenMetadataMedia.js +0 -61
- package/dist/cjs/generated/bnbsmartchain/models/TokenType.d.ts +0 -23
- package/dist/cjs/generated/bnbsmartchain/models/TokenType.js +0 -37
- package/dist/cjs/generated/ethereum/models/TokenMetadata.d.ts +0 -62
- package/dist/cjs/generated/ethereum/models/TokenMetadata.js +0 -67
- package/dist/cjs/generated/ethereum/models/TokenMetadataMedia.d.ts +0 -45
- package/dist/cjs/generated/ethereum/models/TokenMetadataMedia.js +0 -61
- package/dist/cjs/generated/ethereum/models/TokenType.d.ts +0 -23
- package/dist/cjs/generated/ethereum/models/TokenType.js +0 -37
- package/dist/cjs/generated/gnosis/models/TokenMetadata.d.ts +0 -62
- package/dist/cjs/generated/gnosis/models/TokenMetadata.js +0 -67
- package/dist/cjs/generated/gnosis/models/TokenMetadataMedia.d.ts +0 -45
- package/dist/cjs/generated/gnosis/models/TokenMetadataMedia.js +0 -61
- package/dist/cjs/generated/gnosis/models/TokenType.d.ts +0 -23
- package/dist/cjs/generated/gnosis/models/TokenType.js +0 -37
- package/dist/cjs/generated/mayachain/models/AffiliateFee.d.ts +0 -67
- package/dist/cjs/generated/mayachain/models/AffiliateFee.js +0 -63
- package/dist/cjs/generated/mayachain/models/AffiliateFees.d.ts +0 -32
- package/dist/cjs/generated/mayachain/models/AffiliateFees.js +0 -52
- package/dist/cjs/generated/optimism/models/TokenMetadata.d.ts +0 -62
- package/dist/cjs/generated/optimism/models/TokenMetadata.js +0 -67
- package/dist/cjs/generated/optimism/models/TokenMetadataMedia.d.ts +0 -45
- package/dist/cjs/generated/optimism/models/TokenMetadataMedia.js +0 -61
- package/dist/cjs/generated/optimism/models/TokenType.d.ts +0 -23
- package/dist/cjs/generated/optimism/models/TokenType.js +0 -37
- package/dist/cjs/generated/polygon/models/TokenMetadata.d.ts +0 -62
- package/dist/cjs/generated/polygon/models/TokenMetadata.js +0 -67
- package/dist/cjs/generated/polygon/models/TokenMetadataMedia.d.ts +0 -45
- package/dist/cjs/generated/polygon/models/TokenMetadataMedia.js +0 -61
- package/dist/cjs/generated/polygon/models/TokenType.d.ts +0 -23
- package/dist/cjs/generated/polygon/models/TokenType.js +0 -37
- package/dist/cjs/generated/thorchain/models/AffiliateFee.d.ts +0 -67
- package/dist/cjs/generated/thorchain/models/AffiliateFee.js +0 -63
- package/dist/cjs/generated/thorchain/models/AffiliateFees.d.ts +0 -32
- package/dist/cjs/generated/thorchain/models/AffiliateFees.js +0 -52
- package/dist/cjs/generated/thorchain/models/AffiliateRevenue.d.ts +0 -45
- package/dist/cjs/generated/thorchain/models/AffiliateRevenue.js +0 -57
- package/dist/esm/generated/arbitrum/models/TokenMetadata.d.ts +0 -62
- package/dist/esm/generated/arbitrum/models/TokenMetadata.js +0 -60
- package/dist/esm/generated/arbitrum/models/TokenMetadataMedia.d.ts +0 -45
- package/dist/esm/generated/arbitrum/models/TokenMetadataMedia.js +0 -54
- package/dist/esm/generated/arbitrum/models/TokenType.d.ts +0 -23
- package/dist/esm/generated/arbitrum/models/TokenType.js +0 -31
- package/dist/esm/generated/avalanche/models/TokenMetadata.d.ts +0 -62
- package/dist/esm/generated/avalanche/models/TokenMetadata.js +0 -60
- package/dist/esm/generated/avalanche/models/TokenMetadataMedia.d.ts +0 -45
- package/dist/esm/generated/avalanche/models/TokenMetadataMedia.js +0 -54
- package/dist/esm/generated/avalanche/models/TokenType.d.ts +0 -23
- package/dist/esm/generated/avalanche/models/TokenType.js +0 -31
- package/dist/esm/generated/base/models/TokenMetadata.d.ts +0 -62
- package/dist/esm/generated/base/models/TokenMetadata.js +0 -60
- package/dist/esm/generated/base/models/TokenMetadataMedia.d.ts +0 -45
- package/dist/esm/generated/base/models/TokenMetadataMedia.js +0 -54
- package/dist/esm/generated/base/models/TokenType.d.ts +0 -23
- package/dist/esm/generated/base/models/TokenType.js +0 -31
- package/dist/esm/generated/bnbsmartchain/models/TokenMetadata.d.ts +0 -62
- package/dist/esm/generated/bnbsmartchain/models/TokenMetadata.js +0 -60
- package/dist/esm/generated/bnbsmartchain/models/TokenMetadataMedia.d.ts +0 -45
- package/dist/esm/generated/bnbsmartchain/models/TokenMetadataMedia.js +0 -54
- package/dist/esm/generated/bnbsmartchain/models/TokenType.d.ts +0 -23
- package/dist/esm/generated/bnbsmartchain/models/TokenType.js +0 -31
- package/dist/esm/generated/ethereum/models/TokenMetadata.d.ts +0 -62
- package/dist/esm/generated/ethereum/models/TokenMetadata.js +0 -60
- package/dist/esm/generated/ethereum/models/TokenMetadataMedia.d.ts +0 -45
- package/dist/esm/generated/ethereum/models/TokenMetadataMedia.js +0 -54
- package/dist/esm/generated/ethereum/models/TokenType.d.ts +0 -23
- package/dist/esm/generated/ethereum/models/TokenType.js +0 -31
- package/dist/esm/generated/gnosis/models/TokenMetadata.d.ts +0 -62
- package/dist/esm/generated/gnosis/models/TokenMetadata.js +0 -60
- package/dist/esm/generated/gnosis/models/TokenMetadataMedia.d.ts +0 -45
- package/dist/esm/generated/gnosis/models/TokenMetadataMedia.js +0 -54
- package/dist/esm/generated/gnosis/models/TokenType.d.ts +0 -23
- package/dist/esm/generated/gnosis/models/TokenType.js +0 -31
- package/dist/esm/generated/mayachain/models/AffiliateFee.d.ts +0 -67
- package/dist/esm/generated/mayachain/models/AffiliateFee.js +0 -56
- package/dist/esm/generated/mayachain/models/AffiliateFees.d.ts +0 -32
- package/dist/esm/generated/mayachain/models/AffiliateFees.js +0 -45
- package/dist/esm/generated/optimism/models/TokenMetadata.d.ts +0 -62
- package/dist/esm/generated/optimism/models/TokenMetadata.js +0 -60
- package/dist/esm/generated/optimism/models/TokenMetadataMedia.d.ts +0 -45
- package/dist/esm/generated/optimism/models/TokenMetadataMedia.js +0 -54
- package/dist/esm/generated/optimism/models/TokenType.d.ts +0 -23
- package/dist/esm/generated/optimism/models/TokenType.js +0 -31
- package/dist/esm/generated/polygon/models/TokenMetadata.d.ts +0 -62
- package/dist/esm/generated/polygon/models/TokenMetadata.js +0 -60
- package/dist/esm/generated/polygon/models/TokenMetadataMedia.d.ts +0 -45
- package/dist/esm/generated/polygon/models/TokenMetadataMedia.js +0 -54
- package/dist/esm/generated/polygon/models/TokenType.d.ts +0 -23
- package/dist/esm/generated/polygon/models/TokenType.js +0 -31
- package/dist/esm/generated/thorchain/models/AffiliateFee.d.ts +0 -67
- package/dist/esm/generated/thorchain/models/AffiliateFee.js +0 -56
- package/dist/esm/generated/thorchain/models/AffiliateFees.d.ts +0 -32
- package/dist/esm/generated/thorchain/models/AffiliateFees.js +0 -45
- package/dist/esm/generated/thorchain/models/AffiliateRevenue.d.ts +0 -45
- package/dist/esm/generated/thorchain/models/AffiliateRevenue.js +0 -50
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
* Do not edit the class manually.
|
|
14
14
|
*/
|
|
15
15
|
import * as runtime from '../runtime.js';
|
|
16
|
-
import { AccountFromJSON, BaseInfoFromJSON, BaseTxHistoryTxFromJSON, DoRpcRequest200ResponseFromJSON, DoRpcRequestRequestToJSON, EstimateGasBodyToJSON, GasEstimateFromJSON, GasFeesFromJSON, SendTxBodyToJSON,
|
|
16
|
+
import { AccountFromJSON, BaseInfoFromJSON, BaseTxHistoryTxFromJSON, DoRpcRequest200ResponseFromJSON, DoRpcRequestRequestToJSON, EstimateGasBodyToJSON, GasEstimateFromJSON, GasFeesFromJSON, SendTxBodyToJSON, TxFromJSON, } from '../models/index.js';
|
|
17
17
|
/**
|
|
18
18
|
*
|
|
19
19
|
*/
|
|
@@ -136,45 +136,6 @@ export class V1Api extends runtime.BaseAPI {
|
|
|
136
136
|
const response = await this.getInfoRaw(initOverrides);
|
|
137
137
|
return await response.value();
|
|
138
138
|
}
|
|
139
|
-
/**
|
|
140
|
-
* Get token metadata
|
|
141
|
-
*/
|
|
142
|
-
async getTokenMetadataRaw(requestParameters, initOverrides) {
|
|
143
|
-
if (requestParameters.contract === null || requestParameters.contract === undefined) {
|
|
144
|
-
throw new runtime.RequiredError('contract', 'Required parameter requestParameters.contract was null or undefined when calling getTokenMetadata.');
|
|
145
|
-
}
|
|
146
|
-
if (requestParameters.id === null || requestParameters.id === undefined) {
|
|
147
|
-
throw new runtime.RequiredError('id', 'Required parameter requestParameters.id was null or undefined when calling getTokenMetadata.');
|
|
148
|
-
}
|
|
149
|
-
if (requestParameters.type === null || requestParameters.type === undefined) {
|
|
150
|
-
throw new runtime.RequiredError('type', 'Required parameter requestParameters.type was null or undefined when calling getTokenMetadata.');
|
|
151
|
-
}
|
|
152
|
-
const queryParameters = {};
|
|
153
|
-
if (requestParameters.contract !== undefined) {
|
|
154
|
-
queryParameters['contract'] = requestParameters.contract;
|
|
155
|
-
}
|
|
156
|
-
if (requestParameters.id !== undefined) {
|
|
157
|
-
queryParameters['id'] = requestParameters.id;
|
|
158
|
-
}
|
|
159
|
-
if (requestParameters.type !== undefined) {
|
|
160
|
-
queryParameters['type'] = requestParameters.type;
|
|
161
|
-
}
|
|
162
|
-
const headerParameters = {};
|
|
163
|
-
const response = await this.request({
|
|
164
|
-
path: `/api/v1/metadata/token`,
|
|
165
|
-
method: 'GET',
|
|
166
|
-
headers: headerParameters,
|
|
167
|
-
query: queryParameters,
|
|
168
|
-
}, initOverrides);
|
|
169
|
-
return new runtime.JSONApiResponse(response, (jsonValue) => TokenMetadataFromJSON(jsonValue));
|
|
170
|
-
}
|
|
171
|
-
/**
|
|
172
|
-
* Get token metadata
|
|
173
|
-
*/
|
|
174
|
-
async getTokenMetadata(requestParameters, initOverrides) {
|
|
175
|
-
const response = await this.getTokenMetadataRaw(requestParameters, initOverrides);
|
|
176
|
-
return await response.value();
|
|
177
|
-
}
|
|
178
139
|
/**
|
|
179
140
|
* Get transaction details
|
|
180
141
|
*/
|
|
@@ -16,9 +16,6 @@ export * from './RPCResponseError.js';
|
|
|
16
16
|
export * from './RPCResponseId.js';
|
|
17
17
|
export * from './SendTxBody.js';
|
|
18
18
|
export * from './TokenBalance.js';
|
|
19
|
-
export * from './TokenMetadata.js';
|
|
20
|
-
export * from './TokenMetadataMedia.js';
|
|
21
19
|
export * from './TokenTransfer.js';
|
|
22
|
-
export * from './TokenType.js';
|
|
23
20
|
export * from './Tx.js';
|
|
24
21
|
export * from './ValidationError.js';
|
|
@@ -19,9 +19,6 @@ export * from './RPCResponseError.js';
|
|
|
19
19
|
export * from './RPCResponseId.js';
|
|
20
20
|
export * from './SendTxBody.js';
|
|
21
21
|
export * from './TokenBalance.js';
|
|
22
|
-
export * from './TokenMetadata.js';
|
|
23
|
-
export * from './TokenMetadataMedia.js';
|
|
24
22
|
export * from './TokenTransfer.js';
|
|
25
|
-
export * from './TokenType.js';
|
|
26
23
|
export * from './Tx.js';
|
|
27
24
|
export * from './ValidationError.js';
|
|
@@ -10,21 +10,13 @@
|
|
|
10
10
|
* Do not edit the class manually.
|
|
11
11
|
*/
|
|
12
12
|
import * as runtime from '../runtime.js';
|
|
13
|
-
import type { Account,
|
|
13
|
+
import type { Account, EstimateGasRequest, Info, Tx, TxHistory } from '../models/index.js';
|
|
14
14
|
export interface EstimateGasOperationRequest {
|
|
15
15
|
body?: EstimateGasRequest;
|
|
16
16
|
}
|
|
17
17
|
export interface GetAccountRequest {
|
|
18
18
|
pubkey: string;
|
|
19
19
|
}
|
|
20
|
-
export interface GetAffiliateFeesRequest {
|
|
21
|
-
start?: string;
|
|
22
|
-
end?: string;
|
|
23
|
-
}
|
|
24
|
-
export interface GetAffiliateRevenueRequest {
|
|
25
|
-
start?: string;
|
|
26
|
-
end?: string;
|
|
27
|
-
}
|
|
28
20
|
export interface GetTxRequest {
|
|
29
21
|
txid: string;
|
|
30
22
|
}
|
|
@@ -56,22 +48,6 @@ export declare class V1Api extends runtime.BaseAPI {
|
|
|
56
48
|
* Get account details.
|
|
57
49
|
*/
|
|
58
50
|
getAccount(requestParameters: GetAccountRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<Account>;
|
|
59
|
-
/**
|
|
60
|
-
* Get ss affiliate fee history.
|
|
61
|
-
*/
|
|
62
|
-
getAffiliateFeesRaw(requestParameters: GetAffiliateFeesRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<AffiliateFees>>;
|
|
63
|
-
/**
|
|
64
|
-
* Get ss affiliate fee history.
|
|
65
|
-
*/
|
|
66
|
-
getAffiliateFees(requestParameters?: GetAffiliateFeesRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<AffiliateFees>;
|
|
67
|
-
/**
|
|
68
|
-
* Get total ss affiliate revenue earned.
|
|
69
|
-
*/
|
|
70
|
-
getAffiliateRevenueRaw(requestParameters: GetAffiliateRevenueRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<AffiliateRevenue>>;
|
|
71
|
-
/**
|
|
72
|
-
* Get total ss affiliate revenue earned.
|
|
73
|
-
*/
|
|
74
|
-
getAffiliateRevenue(requestParameters?: GetAffiliateRevenueRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<AffiliateRevenue>;
|
|
75
51
|
/**
|
|
76
52
|
* Get information about the running coinstack.
|
|
77
53
|
*/
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
* Do not edit the class manually.
|
|
14
14
|
*/
|
|
15
15
|
import * as runtime from '../runtime.js';
|
|
16
|
-
import { AccountFromJSON,
|
|
16
|
+
import { AccountFromJSON, EstimateGasRequestToJSON, InfoFromJSON, TxFromJSON, TxHistoryFromJSON, } from '../models/index.js';
|
|
17
17
|
/**
|
|
18
18
|
*
|
|
19
19
|
*/
|
|
@@ -65,60 +65,6 @@ export class V1Api extends runtime.BaseAPI {
|
|
|
65
65
|
const response = await this.getAccountRaw(requestParameters, initOverrides);
|
|
66
66
|
return await response.value();
|
|
67
67
|
}
|
|
68
|
-
/**
|
|
69
|
-
* Get ss affiliate fee history.
|
|
70
|
-
*/
|
|
71
|
-
async getAffiliateFeesRaw(requestParameters, initOverrides) {
|
|
72
|
-
const queryParameters = {};
|
|
73
|
-
if (requestParameters.start !== undefined) {
|
|
74
|
-
queryParameters['start'] = requestParameters.start;
|
|
75
|
-
}
|
|
76
|
-
if (requestParameters.end !== undefined) {
|
|
77
|
-
queryParameters['end'] = requestParameters.end;
|
|
78
|
-
}
|
|
79
|
-
const headerParameters = {};
|
|
80
|
-
const response = await this.request({
|
|
81
|
-
path: `/api/v1/affiliate/fees`,
|
|
82
|
-
method: 'GET',
|
|
83
|
-
headers: headerParameters,
|
|
84
|
-
query: queryParameters,
|
|
85
|
-
}, initOverrides);
|
|
86
|
-
return new runtime.JSONApiResponse(response, (jsonValue) => AffiliateFeesFromJSON(jsonValue));
|
|
87
|
-
}
|
|
88
|
-
/**
|
|
89
|
-
* Get ss affiliate fee history.
|
|
90
|
-
*/
|
|
91
|
-
async getAffiliateFees(requestParameters = {}, initOverrides) {
|
|
92
|
-
const response = await this.getAffiliateFeesRaw(requestParameters, initOverrides);
|
|
93
|
-
return await response.value();
|
|
94
|
-
}
|
|
95
|
-
/**
|
|
96
|
-
* Get total ss affiliate revenue earned.
|
|
97
|
-
*/
|
|
98
|
-
async getAffiliateRevenueRaw(requestParameters, initOverrides) {
|
|
99
|
-
const queryParameters = {};
|
|
100
|
-
if (requestParameters.start !== undefined) {
|
|
101
|
-
queryParameters['start'] = requestParameters.start;
|
|
102
|
-
}
|
|
103
|
-
if (requestParameters.end !== undefined) {
|
|
104
|
-
queryParameters['end'] = requestParameters.end;
|
|
105
|
-
}
|
|
106
|
-
const headerParameters = {};
|
|
107
|
-
const response = await this.request({
|
|
108
|
-
path: `/api/v1/affiliate/revenue`,
|
|
109
|
-
method: 'GET',
|
|
110
|
-
headers: headerParameters,
|
|
111
|
-
query: queryParameters,
|
|
112
|
-
}, initOverrides);
|
|
113
|
-
return new runtime.JSONApiResponse(response, (jsonValue) => AffiliateRevenueFromJSON(jsonValue));
|
|
114
|
-
}
|
|
115
|
-
/**
|
|
116
|
-
* Get total ss affiliate revenue earned.
|
|
117
|
-
*/
|
|
118
|
-
async getAffiliateRevenue(requestParameters = {}, initOverrides) {
|
|
119
|
-
const response = await this.getAffiliateRevenueRaw(requestParameters, initOverrides);
|
|
120
|
-
return await response.value();
|
|
121
|
-
}
|
|
122
68
|
/**
|
|
123
69
|
* Get information about the running coinstack.
|
|
124
70
|
*/
|
|
@@ -2,9 +2,6 @@
|
|
|
2
2
|
/* tslint:disable */
|
|
3
3
|
/* eslint-disable */
|
|
4
4
|
export * from './Account.js';
|
|
5
|
-
export * from './AffiliateFee.js';
|
|
6
|
-
export * from './AffiliateFees.js';
|
|
7
|
-
export * from './AffiliateRevenue.js';
|
|
8
5
|
export * from './ApiError.js';
|
|
9
6
|
export * from './Attribute.js';
|
|
10
7
|
export * from './BadRequestError.js';
|
|
@@ -27,6 +27,13 @@ export interface Address {
|
|
|
27
27
|
* @memberof Address
|
|
28
28
|
*/
|
|
29
29
|
pubkey: string;
|
|
30
|
+
/**
|
|
31
|
+
* BIP44 derivation path for the address (e.g. `m/84'/0'/0'/0/3`).
|
|
32
|
+
* Present only for xpub-derived addresses.
|
|
33
|
+
* @type {string}
|
|
34
|
+
* @memberof Address
|
|
35
|
+
*/
|
|
36
|
+
path?: string;
|
|
30
37
|
}
|
|
31
38
|
/**
|
|
32
39
|
* Check if a given object implements the Address interface.
|
|
@@ -12,6 +12,7 @@
|
|
|
12
12
|
* https://openapi-generator.tech
|
|
13
13
|
* Do not edit the class manually.
|
|
14
14
|
*/
|
|
15
|
+
import { exists } from '../runtime.js';
|
|
15
16
|
/**
|
|
16
17
|
* Check if a given object implements the Address interface.
|
|
17
18
|
*/
|
|
@@ -31,6 +32,7 @@ export function AddressFromJSONTyped(json, ignoreDiscriminator) {
|
|
|
31
32
|
return {
|
|
32
33
|
'balance': json['balance'],
|
|
33
34
|
'pubkey': json['pubkey'],
|
|
35
|
+
'path': !exists(json, 'path') ? undefined : json['path'],
|
|
34
36
|
};
|
|
35
37
|
}
|
|
36
38
|
export function AddressToJSON(value) {
|
|
@@ -43,5 +45,6 @@ export function AddressToJSON(value) {
|
|
|
43
45
|
return {
|
|
44
46
|
'balance': value.balance,
|
|
45
47
|
'pubkey': value.pubkey,
|
|
48
|
+
'path': value.path,
|
|
46
49
|
};
|
|
47
50
|
}
|
|
@@ -14,9 +14,11 @@ vi.mock('../../../generated/solana', async (importActual) => {
|
|
|
14
14
|
const actual = await importActual();
|
|
15
15
|
return {
|
|
16
16
|
...actual,
|
|
17
|
-
V1Api: vi.fn().mockImplementation(()
|
|
18
|
-
|
|
19
|
-
|
|
17
|
+
V1Api: vi.fn().mockImplementation(function () {
|
|
18
|
+
return {
|
|
19
|
+
getToken: getTokenMock,
|
|
20
|
+
};
|
|
21
|
+
}),
|
|
20
22
|
};
|
|
21
23
|
});
|
|
22
24
|
const txParser = new TransactionParser({
|
|
@@ -40,6 +40,7 @@ export class TransactionParser {
|
|
|
40
40
|
chainId: this.chainId,
|
|
41
41
|
// all transactions from unchained are finalized with at least 1 confirmation (unused throughout web)
|
|
42
42
|
confirmations: 1,
|
|
43
|
+
data: parserResult?.data,
|
|
43
44
|
status: this.getStatus(tx),
|
|
44
45
|
trade: parserResult?.trade,
|
|
45
46
|
transfers: parserResult?.transfers ?? [],
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { SubParser, Tx, TxSpecific } from './types.js';
|
|
2
|
+
export type ParserArgs = {
|
|
3
|
+
midgardUrl: string;
|
|
4
|
+
};
|
|
5
|
+
export declare class Parser implements SubParser<Tx> {
|
|
6
|
+
private readonly parser;
|
|
7
|
+
constructor(args: ParserArgs);
|
|
8
|
+
parse(tx: Tx): Promise<TxSpecific | undefined>;
|
|
9
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import base58 from 'bs58';
|
|
2
|
+
import * as thorchain from '../../parser/thorchain.js';
|
|
3
|
+
const MEMO_PROGRAM_ID = 'MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr';
|
|
4
|
+
export class Parser {
|
|
5
|
+
parser;
|
|
6
|
+
constructor(args) {
|
|
7
|
+
this.parser = new thorchain.Parser({ midgardUrl: args.midgardUrl });
|
|
8
|
+
}
|
|
9
|
+
async parse(tx) {
|
|
10
|
+
const memoInstruction = tx.instructions.find(ix => ix.programId === MEMO_PROGRAM_ID);
|
|
11
|
+
if (!memoInstruction)
|
|
12
|
+
return;
|
|
13
|
+
try {
|
|
14
|
+
const memo = Buffer.from(base58.decode(memoInstruction.data)).toString('utf8');
|
|
15
|
+
if (!memo)
|
|
16
|
+
return;
|
|
17
|
+
return await this.parser.parse(memo, tx.txid);
|
|
18
|
+
}
|
|
19
|
+
catch (err) {
|
|
20
|
+
console.error('Failed to decode or parse Solana THORChain memo', err);
|
|
21
|
+
return undefined;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
}
|
|
@@ -1,10 +1,13 @@
|
|
|
1
1
|
import type * as solana from '../../generated/solana/index.js';
|
|
2
|
+
import type * as thorchain from '../../parser/thorchain.js';
|
|
2
3
|
import type { StandardTx } from '../../types.js';
|
|
3
4
|
export * from '../../generated/solana/index.js';
|
|
4
5
|
export type Tx = solana.Tx;
|
|
6
|
+
export type TxMetadata = thorchain.TxMetadata;
|
|
5
7
|
export interface ParsedTx extends StandardTx {
|
|
8
|
+
data?: TxMetadata;
|
|
6
9
|
}
|
|
7
|
-
export type TxSpecific = Partial<Pick<ParsedTx, 'trade' | 'transfers'>>;
|
|
10
|
+
export type TxSpecific = Partial<Pick<ParsedTx, 'data' | 'trade' | 'transfers'>>;
|
|
8
11
|
export interface SubParser<T extends Tx, U = TxSpecific> {
|
|
9
12
|
parse(tx: T, address: string): Promise<U | undefined>;
|
|
10
13
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,298 @@
|
|
|
1
|
+
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
|
|
2
|
+
import { getCallerEnergy, TronApi } from '../api.js';
|
|
3
|
+
const successResponse = {
|
|
4
|
+
result: { result: true },
|
|
5
|
+
energy_used: 64285,
|
|
6
|
+
energy_penalty: 49635,
|
|
7
|
+
constant_result: ['0000000000000000000000000000000000000000000000000000000000000000'],
|
|
8
|
+
transaction: { ret: [{}] },
|
|
9
|
+
};
|
|
10
|
+
// A reverted simulation still reports result.result: true - the failure is only visible on
|
|
11
|
+
// transaction.ret and the message
|
|
12
|
+
const revertResponse = {
|
|
13
|
+
result: { result: true, message: 'REVERT opcode executed' },
|
|
14
|
+
energy_used: 7896,
|
|
15
|
+
energy_penalty: 6079,
|
|
16
|
+
constant_result: [''],
|
|
17
|
+
transaction: { ret: [{ ret: 'FAILED' }] },
|
|
18
|
+
};
|
|
19
|
+
describe('TronApi', () => {
|
|
20
|
+
const api = new TronApi({ rpcUrl: 'https://tron.example' });
|
|
21
|
+
beforeEach(() => {
|
|
22
|
+
vi.spyOn(api, 'getChainPrices').mockResolvedValue({
|
|
23
|
+
bandwidthPrice: 1000,
|
|
24
|
+
energyPrice: 100,
|
|
25
|
+
memoFee: 1_000_000,
|
|
26
|
+
});
|
|
27
|
+
vi.spyOn(api, 'getContractEnergyShare').mockResolvedValue({
|
|
28
|
+
callerPercent: 100,
|
|
29
|
+
originEnergyLimit: 0,
|
|
30
|
+
originEnergyAvailable: 0,
|
|
31
|
+
});
|
|
32
|
+
});
|
|
33
|
+
afterEach(() => {
|
|
34
|
+
vi.restoreAllMocks();
|
|
35
|
+
vi.unstubAllGlobals();
|
|
36
|
+
});
|
|
37
|
+
describe('estimateContractCallFee', () => {
|
|
38
|
+
const params = {
|
|
39
|
+
contractAddress: 'TAfbit1ENsRmtZbPQfYU3srURpfYuWYS7K',
|
|
40
|
+
from: 'TT2T17KZhoDu47i2E4FWxfG79zdkEWkU9N',
|
|
41
|
+
data: '0x2213bc0b',
|
|
42
|
+
};
|
|
43
|
+
it('prices a successful simulation at energy_used * energyPrice', async () => {
|
|
44
|
+
vi.stubGlobal('fetch', vi.fn().mockResolvedValue({ ok: true, json: () => successResponse }));
|
|
45
|
+
expect(await api.estimateContractCallFee(params)).toBe('6428500');
|
|
46
|
+
});
|
|
47
|
+
it('prices the caller in full when the share lookup fails', async () => {
|
|
48
|
+
vi.stubGlobal('fetch', vi.fn().mockResolvedValue({ ok: true, json: () => successResponse }));
|
|
49
|
+
vi.mocked(api.getContractEnergyShare).mockRejectedValue(new Error('429'));
|
|
50
|
+
expect(await api.estimateContractCallFee(params)).toBe('6428500');
|
|
51
|
+
});
|
|
52
|
+
it('fails instead when the caller requires the share', async () => {
|
|
53
|
+
vi.stubGlobal('fetch', vi.fn().mockResolvedValue({ ok: true, json: () => successResponse }));
|
|
54
|
+
vi.mocked(api.getContractEnergyShare).mockRejectedValue(new Error('429'));
|
|
55
|
+
await expect(api.estimateContractCallFee({ ...params, requireEnergyShare: true })).rejects.toThrow('429');
|
|
56
|
+
});
|
|
57
|
+
it('bills the caller only their share when the deployer covers the rest', async () => {
|
|
58
|
+
vi.stubGlobal('fetch', vi.fn().mockResolvedValue({ ok: true, json: () => successResponse }));
|
|
59
|
+
vi.mocked(api.getContractEnergyShare).mockResolvedValue({
|
|
60
|
+
callerPercent: 5,
|
|
61
|
+
originEnergyLimit: 10_000_000,
|
|
62
|
+
originEnergyAvailable: 5_000_000,
|
|
63
|
+
});
|
|
64
|
+
// 64285 - floor(64285 * 0.95) = 3215
|
|
65
|
+
expect(await api.estimateContractCallFee(params)).toBe('321500');
|
|
66
|
+
});
|
|
67
|
+
it('throws on a reverted simulation rather than trusting the partial energy', async () => {
|
|
68
|
+
vi.stubGlobal('fetch', vi.fn().mockResolvedValue({ ok: true, json: () => revertResponse }));
|
|
69
|
+
await expect(api.estimateContractCallFee(params)).rejects.toThrow('REVERT opcode executed');
|
|
70
|
+
});
|
|
71
|
+
it('reports a failed request as such rather than as a revert', async () => {
|
|
72
|
+
vi.stubGlobal('fetch', vi.fn().mockResolvedValue({ ok: false, status: 429, json: () => ({}) }));
|
|
73
|
+
await expect(api.estimateContractCallFee(params)).rejects.toThrow('request failed: 429');
|
|
74
|
+
});
|
|
75
|
+
});
|
|
76
|
+
describe('getCallerEnergy', () => {
|
|
77
|
+
it('charges the caller in full when the contract sets no deployer share', () => {
|
|
78
|
+
const share = {
|
|
79
|
+
callerPercent: 100,
|
|
80
|
+
originEnergyLimit: 0,
|
|
81
|
+
originEnergyAvailable: 0,
|
|
82
|
+
};
|
|
83
|
+
expect(getCallerEnergy(901_682, share)).toBe(901_682);
|
|
84
|
+
});
|
|
85
|
+
it('charges the caller their percent when the deployer has the energy staked', () => {
|
|
86
|
+
const share = {
|
|
87
|
+
callerPercent: 5,
|
|
88
|
+
originEnergyLimit: 10_000_000,
|
|
89
|
+
originEnergyAvailable: 5_000_000,
|
|
90
|
+
};
|
|
91
|
+
expect(getCallerEnergy(901_682, share)).toBe(45_085);
|
|
92
|
+
});
|
|
93
|
+
it('charges the caller in full when the deployer has nothing staked', () => {
|
|
94
|
+
const share = {
|
|
95
|
+
callerPercent: 30,
|
|
96
|
+
originEnergyLimit: 10_000_000,
|
|
97
|
+
originEnergyAvailable: 0,
|
|
98
|
+
};
|
|
99
|
+
expect(getCallerEnergy(130_285, share)).toBe(130_285);
|
|
100
|
+
});
|
|
101
|
+
it('caps the deployer share at their per-call limit', () => {
|
|
102
|
+
const share = {
|
|
103
|
+
callerPercent: 0,
|
|
104
|
+
originEnergyLimit: 100_000,
|
|
105
|
+
originEnergyAvailable: 5_000_000,
|
|
106
|
+
};
|
|
107
|
+
expect(getCallerEnergy(300_000, share)).toBe(200_000);
|
|
108
|
+
});
|
|
109
|
+
it('caps the deployer share at what they have left', () => {
|
|
110
|
+
const share = {
|
|
111
|
+
callerPercent: 0,
|
|
112
|
+
originEnergyLimit: 10_000_000,
|
|
113
|
+
originEnergyAvailable: 40_000,
|
|
114
|
+
};
|
|
115
|
+
expect(getCallerEnergy(300_000, share)).toBe(260_000);
|
|
116
|
+
});
|
|
117
|
+
});
|
|
118
|
+
describe('getContractEnergyShare', () => {
|
|
119
|
+
const contractResponse = {
|
|
120
|
+
consume_user_resource_percent: 5,
|
|
121
|
+
origin_energy_limit: 10_000_000,
|
|
122
|
+
origin_address: 'TDeployer',
|
|
123
|
+
};
|
|
124
|
+
const resourceResponse = { EnergyLimit: 6_000_000, EnergyUsed: 1_000_000 };
|
|
125
|
+
const respond = (...bodies) => {
|
|
126
|
+
const fetchMock = vi.fn();
|
|
127
|
+
bodies.forEach(body => fetchMock.mockResolvedValueOnce({ ok: true, json: () => body }));
|
|
128
|
+
vi.stubGlobal('fetch', fetchMock);
|
|
129
|
+
return fetchMock;
|
|
130
|
+
};
|
|
131
|
+
// the contract record is cached per instance, so each case gets its own
|
|
132
|
+
const freshApi = () => new TronApi({ rpcUrl: 'https://tron.example' });
|
|
133
|
+
it('reads the caller percent, per-call limit and the unspent deployer energy', async () => {
|
|
134
|
+
respond(contractResponse, resourceResponse);
|
|
135
|
+
expect(await freshApi().getContractEnergyShare('TRouter')).toEqual({
|
|
136
|
+
callerPercent: 5,
|
|
137
|
+
originEnergyLimit: 10_000_000,
|
|
138
|
+
originEnergyAvailable: 5_000_000,
|
|
139
|
+
});
|
|
140
|
+
});
|
|
141
|
+
it('reads an omitted percent as the deployer paying everything', async () => {
|
|
142
|
+
respond({ origin_energy_limit: 10_000_000, origin_address: 'TDeployer' }, resourceResponse);
|
|
143
|
+
expect(await freshApi().getContractEnergyShare('TRouter')).toMatchObject({ callerPercent: 0 });
|
|
144
|
+
});
|
|
145
|
+
it('reads an omitted per-call limit as the creator default', async () => {
|
|
146
|
+
respond({ consume_user_resource_percent: 5, origin_address: 'TDeployer' }, resourceResponse);
|
|
147
|
+
expect(await freshApi().getContractEnergyShare('TRouter')).toMatchObject({
|
|
148
|
+
originEnergyLimit: 10_000_000,
|
|
149
|
+
});
|
|
150
|
+
});
|
|
151
|
+
it('reads a plain address as a call the caller pays in full without a resource lookup', async () => {
|
|
152
|
+
const fetchMock = respond({});
|
|
153
|
+
expect(await freshApi().getContractEnergyShare('TPlain')).toEqual({
|
|
154
|
+
callerPercent: 100,
|
|
155
|
+
originEnergyLimit: 0,
|
|
156
|
+
originEnergyAvailable: 0,
|
|
157
|
+
});
|
|
158
|
+
expect(fetchMock).toHaveBeenCalledTimes(1);
|
|
159
|
+
});
|
|
160
|
+
it('re-reads an empty body rather than caching it as a plain address', async () => {
|
|
161
|
+
const fetchMock = respond({}, contractResponse, resourceResponse);
|
|
162
|
+
const api = freshApi();
|
|
163
|
+
await api.getContractEnergyShare('TRouter');
|
|
164
|
+
expect(await api.getContractEnergyShare('TRouter')).toMatchObject({ callerPercent: 5 });
|
|
165
|
+
expect(fetchMock).toHaveBeenCalledTimes(3);
|
|
166
|
+
});
|
|
167
|
+
it('rejects a failed lookup rather than guessing the split', async () => {
|
|
168
|
+
vi.stubGlobal('fetch', vi.fn().mockResolvedValue({ ok: false, status: 429 }));
|
|
169
|
+
await expect(freshApi().getContractEnergyShare('TRouter')).rejects.toThrow('429');
|
|
170
|
+
});
|
|
171
|
+
it('does not cache an error body the node returns with a 200', async () => {
|
|
172
|
+
const fetchMock = respond({ Error: 'class org.tron.core.exception' }, contractResponse, resourceResponse);
|
|
173
|
+
const api = freshApi();
|
|
174
|
+
await expect(api.getContractEnergyShare('TRouter')).rejects.toThrow('getcontract failed');
|
|
175
|
+
expect(await api.getContractEnergyShare('TRouter')).toMatchObject({ callerPercent: 5 });
|
|
176
|
+
expect(fetchMock).toHaveBeenCalledTimes(3);
|
|
177
|
+
});
|
|
178
|
+
it('reads the contract once and the deployer energy once per refresh window', async () => {
|
|
179
|
+
vi.useFakeTimers();
|
|
180
|
+
const fetchMock = respond(contractResponse, resourceResponse, resourceResponse);
|
|
181
|
+
const api = freshApi();
|
|
182
|
+
await api.getContractEnergyShare('TRouter');
|
|
183
|
+
await api.getContractEnergyShare('TRouter');
|
|
184
|
+
expect(fetchMock).toHaveBeenCalledTimes(2);
|
|
185
|
+
vi.advanceTimersByTime(16_000);
|
|
186
|
+
await api.getContractEnergyShare('TRouter');
|
|
187
|
+
expect(fetchMock).toHaveBeenCalledTimes(3);
|
|
188
|
+
const contractReads = fetchMock.mock.calls.filter(([url]) => String(url).endsWith('/wallet/getcontract'));
|
|
189
|
+
expect(contractReads).toHaveLength(1);
|
|
190
|
+
vi.useRealTimers();
|
|
191
|
+
});
|
|
192
|
+
it('re-reads the contract after a minute, since its split can change', async () => {
|
|
193
|
+
vi.useFakeTimers();
|
|
194
|
+
const fetchMock = respond(contractResponse, resourceResponse, contractResponse, resourceResponse);
|
|
195
|
+
const api = freshApi();
|
|
196
|
+
await api.getContractEnergyShare('TRouter');
|
|
197
|
+
vi.advanceTimersByTime(61_000);
|
|
198
|
+
await api.getContractEnergyShare('TRouter');
|
|
199
|
+
const contractReads = fetchMock.mock.calls.filter(([url]) => String(url).endsWith('/wallet/getcontract'));
|
|
200
|
+
expect(contractReads).toHaveLength(2);
|
|
201
|
+
vi.useRealTimers();
|
|
202
|
+
});
|
|
203
|
+
});
|
|
204
|
+
describe('getChainPrices', () => {
|
|
205
|
+
it('reads the energy, bandwidth and memo parameters', async () => {
|
|
206
|
+
vi.restoreAllMocks();
|
|
207
|
+
const tronWeb = api.getTronWeb();
|
|
208
|
+
vi.spyOn(tronWeb.trx, 'getChainParameters').mockResolvedValue([
|
|
209
|
+
{ key: 'getTransactionFee', value: 1000 },
|
|
210
|
+
{ key: 'getEnergyFee', value: 100 },
|
|
211
|
+
{ key: 'getMemoFee', value: 1_000_000 },
|
|
212
|
+
]);
|
|
213
|
+
expect(await api.getChainPrices()).toEqual({
|
|
214
|
+
bandwidthPrice: 1000,
|
|
215
|
+
energyPrice: 100,
|
|
216
|
+
memoFee: 1_000_000,
|
|
217
|
+
});
|
|
218
|
+
});
|
|
219
|
+
it('throws rather than defaulting when the node is unreachable', async () => {
|
|
220
|
+
vi.restoreAllMocks();
|
|
221
|
+
const tronWeb = api.getTronWeb();
|
|
222
|
+
vi.spyOn(tronWeb.trx, 'getChainParameters').mockRejectedValue(new Error('ECONNREFUSED'));
|
|
223
|
+
await expect(api.getChainPrices()).rejects.toThrow('ECONNREFUSED');
|
|
224
|
+
});
|
|
225
|
+
});
|
|
226
|
+
describe('getTrc20Balance', () => {
|
|
227
|
+
it('reads balanceOf(address) with a single constant call', async () => {
|
|
228
|
+
const tronWeb = api.getTronWeb();
|
|
229
|
+
const trigger = vi
|
|
230
|
+
.spyOn(tronWeb.transactionBuilder, 'triggerConstantContract')
|
|
231
|
+
.mockResolvedValue({
|
|
232
|
+
result: { result: true },
|
|
233
|
+
constant_result: ['00000000000000000000000000000000000000000000000000000000028e6fb0'],
|
|
234
|
+
});
|
|
235
|
+
const actual = await api.getTrc20Balance({
|
|
236
|
+
contractAddress: 'TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t',
|
|
237
|
+
address: 'TE6oHVdTbcp1Q9XBYx5VzjWbZEg3t3Jrnc',
|
|
238
|
+
});
|
|
239
|
+
expect(actual).toBe('42889136');
|
|
240
|
+
expect(trigger).toHaveBeenCalledWith('TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t', 'balanceOf(address)', {}, [{ type: 'address', value: 'TE6oHVdTbcp1Q9XBYx5VzjWbZEg3t3Jrnc' }], 'TE6oHVdTbcp1Q9XBYx5VzjWbZEg3t3Jrnc');
|
|
241
|
+
});
|
|
242
|
+
});
|
|
243
|
+
describe('getTrc20Allowance', () => {
|
|
244
|
+
it('reads allowance(owner, spender) with a single constant call', async () => {
|
|
245
|
+
const tronWeb = api.getTronWeb();
|
|
246
|
+
const trigger = vi
|
|
247
|
+
.spyOn(tronWeb.transactionBuilder, 'triggerConstantContract')
|
|
248
|
+
.mockResolvedValue({
|
|
249
|
+
result: { result: true },
|
|
250
|
+
constant_result: ['000000000000000000000000000000000000000000000000000000000000007b'],
|
|
251
|
+
});
|
|
252
|
+
const actual = await api.getTrc20Allowance({
|
|
253
|
+
contractAddress: 'TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t',
|
|
254
|
+
owner: 'TT2T17KZhoDu47i2E4FWxfG79zdkEWkU9N',
|
|
255
|
+
spender: 'TAfbit1ENsRmtZbPQfYU3srURpfYuWYS7K',
|
|
256
|
+
});
|
|
257
|
+
expect(actual).toBe('123');
|
|
258
|
+
expect(trigger).toHaveBeenCalledWith('TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t', 'allowance(address,address)', {}, [
|
|
259
|
+
{ type: 'address', value: 'TT2T17KZhoDu47i2E4FWxfG79zdkEWkU9N' },
|
|
260
|
+
{ type: 'address', value: 'TAfbit1ENsRmtZbPQfYU3srURpfYuWYS7K' },
|
|
261
|
+
], 'TT2T17KZhoDu47i2E4FWxfG79zdkEWkU9N');
|
|
262
|
+
});
|
|
263
|
+
});
|
|
264
|
+
describe('isAccountActivated', () => {
|
|
265
|
+
it('is true for an account the node knows', async () => {
|
|
266
|
+
vi.stubGlobal('fetch', vi.fn().mockResolvedValue({ ok: true, json: () => ({ address: '41abc', balance: 1 }) }));
|
|
267
|
+
expect(await api.isAccountActivated('TT2T17KZhoDu47i2E4FWxfG79zdkEWkU9N')).toBe(true);
|
|
268
|
+
});
|
|
269
|
+
it('is false for a fresh address', async () => {
|
|
270
|
+
vi.stubGlobal('fetch', vi.fn().mockResolvedValue({ ok: true, json: () => ({}) }));
|
|
271
|
+
expect(await api.isAccountActivated('TT2T17KZhoDu47i2E4FWxfG79zdkEWkU9N')).toBe(false);
|
|
272
|
+
});
|
|
273
|
+
it('throws on an error response rather than reading it as not activated', async () => {
|
|
274
|
+
vi.stubGlobal('fetch', vi.fn().mockResolvedValue({ ok: false, status: 429, json: () => ({ Error: 'throttled' }) }));
|
|
275
|
+
await expect(api.isAccountActivated('TT2T17KZhoDu47i2E4FWxfG79zdkEWkU9N')).rejects.toThrow('429');
|
|
276
|
+
});
|
|
277
|
+
});
|
|
278
|
+
describe('estimateTrc20TransferFee', () => {
|
|
279
|
+
const params = {
|
|
280
|
+
contractAddress: 'TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t',
|
|
281
|
+
from: 'TT2T17KZhoDu47i2E4FWxfG79zdkEWkU9N',
|
|
282
|
+
to: 'TT2T17KZhoDu47i2E4FWxfG79zdkEWkU9N',
|
|
283
|
+
amount: '1',
|
|
284
|
+
};
|
|
285
|
+
const stubTriggerConstantContract = (response) => {
|
|
286
|
+
const tronWeb = api.getTronWeb();
|
|
287
|
+
vi.spyOn(tronWeb.transactionBuilder, 'triggerConstantContract').mockResolvedValue(response);
|
|
288
|
+
};
|
|
289
|
+
it('prices a successful simulation at energy_used * energyPrice', async () => {
|
|
290
|
+
stubTriggerConstantContract(successResponse);
|
|
291
|
+
expect(await api.estimateTrc20TransferFee(params)).toBe('6428500');
|
|
292
|
+
});
|
|
293
|
+
it('throws on a reverted simulation rather than trusting the partial energy', async () => {
|
|
294
|
+
stubTriggerConstantContract(revertResponse);
|
|
295
|
+
await expect(api.estimateTrc20TransferFee(params)).rejects.toThrow('REVERT opcode executed');
|
|
296
|
+
});
|
|
297
|
+
});
|
|
298
|
+
});
|