@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.
Files changed (256) hide show
  1. package/LICENSE.md +21 -0
  2. package/README.md +2 -2
  3. package/dist/cjs/.tsbuildinfo +1 -1
  4. package/dist/cjs/cosmossdk/thorchain/parser/__tests__/thorchain.test.js +1 -1
  5. package/dist/cjs/cosmossdk/thorchain/parser/rfox.js +1 -1
  6. package/dist/cjs/evm/arbitrum/parser/index.js +2 -2
  7. package/dist/cjs/evm/ethereum/parser/__tests__/ethereum.test.js +29 -0
  8. package/dist/cjs/evm/ethereum/parser/index.js +6 -0
  9. package/dist/cjs/generated/arbitrum/apis/V1Api.d.ts +1 -14
  10. package/dist/cjs/generated/arbitrum/apis/V1Api.js +0 -39
  11. package/dist/cjs/generated/arbitrum/models/index.d.ts +0 -3
  12. package/dist/cjs/generated/arbitrum/models/index.js +0 -3
  13. package/dist/cjs/generated/avalanche/apis/V1Api.d.ts +1 -14
  14. package/dist/cjs/generated/avalanche/apis/V1Api.js +0 -39
  15. package/dist/cjs/generated/avalanche/models/index.d.ts +0 -3
  16. package/dist/cjs/generated/avalanche/models/index.js +0 -3
  17. package/dist/cjs/generated/base/apis/V1Api.d.ts +1 -14
  18. package/dist/cjs/generated/base/apis/V1Api.js +0 -39
  19. package/dist/cjs/generated/base/models/index.d.ts +0 -3
  20. package/dist/cjs/generated/base/models/index.js +0 -3
  21. package/dist/cjs/generated/bitcoin/models/Address.d.ts +7 -0
  22. package/dist/cjs/generated/bitcoin/models/Address.js +3 -0
  23. package/dist/cjs/generated/bitcoincash/models/Address.d.ts +7 -0
  24. package/dist/cjs/generated/bitcoincash/models/Address.js +3 -0
  25. package/dist/cjs/generated/bnbsmartchain/apis/V1Api.d.ts +1 -14
  26. package/dist/cjs/generated/bnbsmartchain/apis/V1Api.js +0 -39
  27. package/dist/cjs/generated/bnbsmartchain/models/index.d.ts +0 -3
  28. package/dist/cjs/generated/bnbsmartchain/models/index.js +0 -3
  29. package/dist/cjs/generated/dogecoin/models/Address.d.ts +7 -0
  30. package/dist/cjs/generated/dogecoin/models/Address.js +3 -0
  31. package/dist/cjs/generated/ethereum/apis/V1Api.d.ts +1 -14
  32. package/dist/cjs/generated/ethereum/apis/V1Api.js +0 -39
  33. package/dist/cjs/generated/ethereum/models/index.d.ts +0 -3
  34. package/dist/cjs/generated/ethereum/models/index.js +0 -3
  35. package/dist/cjs/generated/gnosis/apis/V1Api.d.ts +1 -14
  36. package/dist/cjs/generated/gnosis/apis/V1Api.js +0 -39
  37. package/dist/cjs/generated/gnosis/models/index.d.ts +0 -3
  38. package/dist/cjs/generated/gnosis/models/index.js +0 -3
  39. package/dist/cjs/generated/litecoin/models/Address.d.ts +7 -0
  40. package/dist/cjs/generated/litecoin/models/Address.js +3 -0
  41. package/dist/cjs/generated/mayachain/apis/ProxyApi.d.ts +18 -2
  42. package/dist/cjs/generated/mayachain/apis/ProxyApi.js +42 -2
  43. package/dist/cjs/generated/mayachain/apis/V1Api.d.ts +1 -13
  44. package/dist/cjs/generated/mayachain/apis/V1Api.js +0 -27
  45. package/dist/cjs/generated/mayachain/models/index.d.ts +0 -2
  46. package/dist/cjs/generated/mayachain/models/index.js +0 -2
  47. package/dist/cjs/generated/optimism/apis/V1Api.d.ts +1 -14
  48. package/dist/cjs/generated/optimism/apis/V1Api.js +0 -39
  49. package/dist/cjs/generated/optimism/models/index.d.ts +0 -3
  50. package/dist/cjs/generated/optimism/models/index.js +0 -3
  51. package/dist/cjs/generated/polygon/apis/V1Api.d.ts +1 -14
  52. package/dist/cjs/generated/polygon/apis/V1Api.js +0 -39
  53. package/dist/cjs/generated/polygon/models/index.d.ts +0 -3
  54. package/dist/cjs/generated/polygon/models/index.js +0 -3
  55. package/dist/cjs/generated/thorchain/apis/V1Api.d.ts +1 -25
  56. package/dist/cjs/generated/thorchain/apis/V1Api.js +0 -54
  57. package/dist/cjs/generated/thorchain/models/index.d.ts +0 -3
  58. package/dist/cjs/generated/thorchain/models/index.js +0 -3
  59. package/dist/cjs/generated/zcash/models/Address.d.ts +7 -0
  60. package/dist/cjs/generated/zcash/models/Address.js +3 -0
  61. package/dist/cjs/solana/parser/__tests__/solana.test.js +5 -3
  62. package/dist/cjs/solana/parser/index.js +1 -0
  63. package/dist/cjs/solana/parser/thorchain.d.ts +9 -0
  64. package/dist/cjs/solana/parser/thorchain.js +54 -0
  65. package/dist/cjs/solana/parser/types.d.ts +4 -1
  66. package/dist/cjs/tron/__tests__/api.test.d.ts +1 -0
  67. package/dist/cjs/tron/__tests__/api.test.js +300 -0
  68. package/dist/cjs/tron/api.d.ts +38 -15
  69. package/dist/cjs/tron/api.js +241 -84
  70. package/dist/cjs/tron/types.d.ts +4 -0
  71. package/dist/esm/.tsbuildinfo +1 -1
  72. package/dist/esm/cosmossdk/thorchain/parser/__tests__/thorchain.test.js +2 -2
  73. package/dist/esm/cosmossdk/thorchain/parser/rfox.js +2 -2
  74. package/dist/esm/evm/arbitrum/parser/index.js +3 -3
  75. package/dist/esm/evm/ethereum/parser/__tests__/ethereum.test.js +29 -0
  76. package/dist/esm/evm/ethereum/parser/index.js +7 -1
  77. package/dist/esm/generated/arbitrum/apis/V1Api.d.ts +1 -14
  78. package/dist/esm/generated/arbitrum/apis/V1Api.js +1 -40
  79. package/dist/esm/generated/arbitrum/models/index.d.ts +0 -3
  80. package/dist/esm/generated/arbitrum/models/index.js +0 -3
  81. package/dist/esm/generated/avalanche/apis/V1Api.d.ts +1 -14
  82. package/dist/esm/generated/avalanche/apis/V1Api.js +1 -40
  83. package/dist/esm/generated/avalanche/models/index.d.ts +0 -3
  84. package/dist/esm/generated/avalanche/models/index.js +0 -3
  85. package/dist/esm/generated/base/apis/V1Api.d.ts +1 -14
  86. package/dist/esm/generated/base/apis/V1Api.js +1 -40
  87. package/dist/esm/generated/base/models/index.d.ts +0 -3
  88. package/dist/esm/generated/base/models/index.js +0 -3
  89. package/dist/esm/generated/bitcoin/models/Address.d.ts +7 -0
  90. package/dist/esm/generated/bitcoin/models/Address.js +3 -0
  91. package/dist/esm/generated/bitcoincash/models/Address.d.ts +7 -0
  92. package/dist/esm/generated/bitcoincash/models/Address.js +3 -0
  93. package/dist/esm/generated/bnbsmartchain/apis/V1Api.d.ts +1 -14
  94. package/dist/esm/generated/bnbsmartchain/apis/V1Api.js +1 -40
  95. package/dist/esm/generated/bnbsmartchain/models/index.d.ts +0 -3
  96. package/dist/esm/generated/bnbsmartchain/models/index.js +0 -3
  97. package/dist/esm/generated/dogecoin/models/Address.d.ts +7 -0
  98. package/dist/esm/generated/dogecoin/models/Address.js +3 -0
  99. package/dist/esm/generated/ethereum/apis/V1Api.d.ts +1 -14
  100. package/dist/esm/generated/ethereum/apis/V1Api.js +1 -40
  101. package/dist/esm/generated/ethereum/models/index.d.ts +0 -3
  102. package/dist/esm/generated/ethereum/models/index.js +0 -3
  103. package/dist/esm/generated/gnosis/apis/V1Api.d.ts +1 -14
  104. package/dist/esm/generated/gnosis/apis/V1Api.js +1 -40
  105. package/dist/esm/generated/gnosis/models/index.d.ts +0 -3
  106. package/dist/esm/generated/gnosis/models/index.js +0 -3
  107. package/dist/esm/generated/litecoin/models/Address.d.ts +7 -0
  108. package/dist/esm/generated/litecoin/models/Address.js +3 -0
  109. package/dist/esm/generated/mayachain/apis/ProxyApi.d.ts +18 -2
  110. package/dist/esm/generated/mayachain/apis/ProxyApi.js +42 -2
  111. package/dist/esm/generated/mayachain/apis/V1Api.d.ts +1 -13
  112. package/dist/esm/generated/mayachain/apis/V1Api.js +1 -28
  113. package/dist/esm/generated/mayachain/models/index.d.ts +0 -2
  114. package/dist/esm/generated/mayachain/models/index.js +0 -2
  115. package/dist/esm/generated/optimism/apis/V1Api.d.ts +1 -14
  116. package/dist/esm/generated/optimism/apis/V1Api.js +1 -40
  117. package/dist/esm/generated/optimism/models/index.d.ts +0 -3
  118. package/dist/esm/generated/optimism/models/index.js +0 -3
  119. package/dist/esm/generated/polygon/apis/V1Api.d.ts +1 -14
  120. package/dist/esm/generated/polygon/apis/V1Api.js +1 -40
  121. package/dist/esm/generated/polygon/models/index.d.ts +0 -3
  122. package/dist/esm/generated/polygon/models/index.js +0 -3
  123. package/dist/esm/generated/thorchain/apis/V1Api.d.ts +1 -25
  124. package/dist/esm/generated/thorchain/apis/V1Api.js +1 -55
  125. package/dist/esm/generated/thorchain/models/index.d.ts +0 -3
  126. package/dist/esm/generated/thorchain/models/index.js +0 -3
  127. package/dist/esm/generated/zcash/models/Address.d.ts +7 -0
  128. package/dist/esm/generated/zcash/models/Address.js +3 -0
  129. package/dist/esm/solana/parser/__tests__/solana.test.js +5 -3
  130. package/dist/esm/solana/parser/index.js +1 -0
  131. package/dist/esm/solana/parser/thorchain.d.ts +9 -0
  132. package/dist/esm/solana/parser/thorchain.js +24 -0
  133. package/dist/esm/solana/parser/types.d.ts +4 -1
  134. package/dist/esm/tron/__tests__/api.test.d.ts +1 -0
  135. package/dist/esm/tron/__tests__/api.test.js +298 -0
  136. package/dist/esm/tron/api.d.ts +38 -15
  137. package/dist/esm/tron/api.js +239 -83
  138. package/dist/esm/tron/types.d.ts +4 -0
  139. package/package.json +16 -17
  140. package/CHANGELOG.md +0 -409
  141. package/dist/cjs/generated/arbitrum/models/TokenMetadata.d.ts +0 -62
  142. package/dist/cjs/generated/arbitrum/models/TokenMetadata.js +0 -67
  143. package/dist/cjs/generated/arbitrum/models/TokenMetadataMedia.d.ts +0 -45
  144. package/dist/cjs/generated/arbitrum/models/TokenMetadataMedia.js +0 -61
  145. package/dist/cjs/generated/arbitrum/models/TokenType.d.ts +0 -23
  146. package/dist/cjs/generated/arbitrum/models/TokenType.js +0 -37
  147. package/dist/cjs/generated/avalanche/models/TokenMetadata.d.ts +0 -62
  148. package/dist/cjs/generated/avalanche/models/TokenMetadata.js +0 -67
  149. package/dist/cjs/generated/avalanche/models/TokenMetadataMedia.d.ts +0 -45
  150. package/dist/cjs/generated/avalanche/models/TokenMetadataMedia.js +0 -61
  151. package/dist/cjs/generated/avalanche/models/TokenType.d.ts +0 -23
  152. package/dist/cjs/generated/avalanche/models/TokenType.js +0 -37
  153. package/dist/cjs/generated/base/models/TokenMetadata.d.ts +0 -62
  154. package/dist/cjs/generated/base/models/TokenMetadata.js +0 -67
  155. package/dist/cjs/generated/base/models/TokenMetadataMedia.d.ts +0 -45
  156. package/dist/cjs/generated/base/models/TokenMetadataMedia.js +0 -61
  157. package/dist/cjs/generated/base/models/TokenType.d.ts +0 -23
  158. package/dist/cjs/generated/base/models/TokenType.js +0 -37
  159. package/dist/cjs/generated/bnbsmartchain/models/TokenMetadata.d.ts +0 -62
  160. package/dist/cjs/generated/bnbsmartchain/models/TokenMetadata.js +0 -67
  161. package/dist/cjs/generated/bnbsmartchain/models/TokenMetadataMedia.d.ts +0 -45
  162. package/dist/cjs/generated/bnbsmartchain/models/TokenMetadataMedia.js +0 -61
  163. package/dist/cjs/generated/bnbsmartchain/models/TokenType.d.ts +0 -23
  164. package/dist/cjs/generated/bnbsmartchain/models/TokenType.js +0 -37
  165. package/dist/cjs/generated/ethereum/models/TokenMetadata.d.ts +0 -62
  166. package/dist/cjs/generated/ethereum/models/TokenMetadata.js +0 -67
  167. package/dist/cjs/generated/ethereum/models/TokenMetadataMedia.d.ts +0 -45
  168. package/dist/cjs/generated/ethereum/models/TokenMetadataMedia.js +0 -61
  169. package/dist/cjs/generated/ethereum/models/TokenType.d.ts +0 -23
  170. package/dist/cjs/generated/ethereum/models/TokenType.js +0 -37
  171. package/dist/cjs/generated/gnosis/models/TokenMetadata.d.ts +0 -62
  172. package/dist/cjs/generated/gnosis/models/TokenMetadata.js +0 -67
  173. package/dist/cjs/generated/gnosis/models/TokenMetadataMedia.d.ts +0 -45
  174. package/dist/cjs/generated/gnosis/models/TokenMetadataMedia.js +0 -61
  175. package/dist/cjs/generated/gnosis/models/TokenType.d.ts +0 -23
  176. package/dist/cjs/generated/gnosis/models/TokenType.js +0 -37
  177. package/dist/cjs/generated/mayachain/models/AffiliateFee.d.ts +0 -67
  178. package/dist/cjs/generated/mayachain/models/AffiliateFee.js +0 -63
  179. package/dist/cjs/generated/mayachain/models/AffiliateFees.d.ts +0 -32
  180. package/dist/cjs/generated/mayachain/models/AffiliateFees.js +0 -52
  181. package/dist/cjs/generated/optimism/models/TokenMetadata.d.ts +0 -62
  182. package/dist/cjs/generated/optimism/models/TokenMetadata.js +0 -67
  183. package/dist/cjs/generated/optimism/models/TokenMetadataMedia.d.ts +0 -45
  184. package/dist/cjs/generated/optimism/models/TokenMetadataMedia.js +0 -61
  185. package/dist/cjs/generated/optimism/models/TokenType.d.ts +0 -23
  186. package/dist/cjs/generated/optimism/models/TokenType.js +0 -37
  187. package/dist/cjs/generated/polygon/models/TokenMetadata.d.ts +0 -62
  188. package/dist/cjs/generated/polygon/models/TokenMetadata.js +0 -67
  189. package/dist/cjs/generated/polygon/models/TokenMetadataMedia.d.ts +0 -45
  190. package/dist/cjs/generated/polygon/models/TokenMetadataMedia.js +0 -61
  191. package/dist/cjs/generated/polygon/models/TokenType.d.ts +0 -23
  192. package/dist/cjs/generated/polygon/models/TokenType.js +0 -37
  193. package/dist/cjs/generated/thorchain/models/AffiliateFee.d.ts +0 -67
  194. package/dist/cjs/generated/thorchain/models/AffiliateFee.js +0 -63
  195. package/dist/cjs/generated/thorchain/models/AffiliateFees.d.ts +0 -32
  196. package/dist/cjs/generated/thorchain/models/AffiliateFees.js +0 -52
  197. package/dist/cjs/generated/thorchain/models/AffiliateRevenue.d.ts +0 -45
  198. package/dist/cjs/generated/thorchain/models/AffiliateRevenue.js +0 -57
  199. package/dist/esm/generated/arbitrum/models/TokenMetadata.d.ts +0 -62
  200. package/dist/esm/generated/arbitrum/models/TokenMetadata.js +0 -60
  201. package/dist/esm/generated/arbitrum/models/TokenMetadataMedia.d.ts +0 -45
  202. package/dist/esm/generated/arbitrum/models/TokenMetadataMedia.js +0 -54
  203. package/dist/esm/generated/arbitrum/models/TokenType.d.ts +0 -23
  204. package/dist/esm/generated/arbitrum/models/TokenType.js +0 -31
  205. package/dist/esm/generated/avalanche/models/TokenMetadata.d.ts +0 -62
  206. package/dist/esm/generated/avalanche/models/TokenMetadata.js +0 -60
  207. package/dist/esm/generated/avalanche/models/TokenMetadataMedia.d.ts +0 -45
  208. package/dist/esm/generated/avalanche/models/TokenMetadataMedia.js +0 -54
  209. package/dist/esm/generated/avalanche/models/TokenType.d.ts +0 -23
  210. package/dist/esm/generated/avalanche/models/TokenType.js +0 -31
  211. package/dist/esm/generated/base/models/TokenMetadata.d.ts +0 -62
  212. package/dist/esm/generated/base/models/TokenMetadata.js +0 -60
  213. package/dist/esm/generated/base/models/TokenMetadataMedia.d.ts +0 -45
  214. package/dist/esm/generated/base/models/TokenMetadataMedia.js +0 -54
  215. package/dist/esm/generated/base/models/TokenType.d.ts +0 -23
  216. package/dist/esm/generated/base/models/TokenType.js +0 -31
  217. package/dist/esm/generated/bnbsmartchain/models/TokenMetadata.d.ts +0 -62
  218. package/dist/esm/generated/bnbsmartchain/models/TokenMetadata.js +0 -60
  219. package/dist/esm/generated/bnbsmartchain/models/TokenMetadataMedia.d.ts +0 -45
  220. package/dist/esm/generated/bnbsmartchain/models/TokenMetadataMedia.js +0 -54
  221. package/dist/esm/generated/bnbsmartchain/models/TokenType.d.ts +0 -23
  222. package/dist/esm/generated/bnbsmartchain/models/TokenType.js +0 -31
  223. package/dist/esm/generated/ethereum/models/TokenMetadata.d.ts +0 -62
  224. package/dist/esm/generated/ethereum/models/TokenMetadata.js +0 -60
  225. package/dist/esm/generated/ethereum/models/TokenMetadataMedia.d.ts +0 -45
  226. package/dist/esm/generated/ethereum/models/TokenMetadataMedia.js +0 -54
  227. package/dist/esm/generated/ethereum/models/TokenType.d.ts +0 -23
  228. package/dist/esm/generated/ethereum/models/TokenType.js +0 -31
  229. package/dist/esm/generated/gnosis/models/TokenMetadata.d.ts +0 -62
  230. package/dist/esm/generated/gnosis/models/TokenMetadata.js +0 -60
  231. package/dist/esm/generated/gnosis/models/TokenMetadataMedia.d.ts +0 -45
  232. package/dist/esm/generated/gnosis/models/TokenMetadataMedia.js +0 -54
  233. package/dist/esm/generated/gnosis/models/TokenType.d.ts +0 -23
  234. package/dist/esm/generated/gnosis/models/TokenType.js +0 -31
  235. package/dist/esm/generated/mayachain/models/AffiliateFee.d.ts +0 -67
  236. package/dist/esm/generated/mayachain/models/AffiliateFee.js +0 -56
  237. package/dist/esm/generated/mayachain/models/AffiliateFees.d.ts +0 -32
  238. package/dist/esm/generated/mayachain/models/AffiliateFees.js +0 -45
  239. package/dist/esm/generated/optimism/models/TokenMetadata.d.ts +0 -62
  240. package/dist/esm/generated/optimism/models/TokenMetadata.js +0 -60
  241. package/dist/esm/generated/optimism/models/TokenMetadataMedia.d.ts +0 -45
  242. package/dist/esm/generated/optimism/models/TokenMetadataMedia.js +0 -54
  243. package/dist/esm/generated/optimism/models/TokenType.d.ts +0 -23
  244. package/dist/esm/generated/optimism/models/TokenType.js +0 -31
  245. package/dist/esm/generated/polygon/models/TokenMetadata.d.ts +0 -62
  246. package/dist/esm/generated/polygon/models/TokenMetadata.js +0 -60
  247. package/dist/esm/generated/polygon/models/TokenMetadataMedia.d.ts +0 -45
  248. package/dist/esm/generated/polygon/models/TokenMetadataMedia.js +0 -54
  249. package/dist/esm/generated/polygon/models/TokenType.d.ts +0 -23
  250. package/dist/esm/generated/polygon/models/TokenType.js +0 -31
  251. package/dist/esm/generated/thorchain/models/AffiliateFee.d.ts +0 -67
  252. package/dist/esm/generated/thorchain/models/AffiliateFee.js +0 -56
  253. package/dist/esm/generated/thorchain/models/AffiliateFees.d.ts +0 -32
  254. package/dist/esm/generated/thorchain/models/AffiliateFees.js +0 -45
  255. package/dist/esm/generated/thorchain/models/AffiliateRevenue.d.ts +0 -45
  256. package/dist/esm/generated/thorchain/models/AffiliateRevenue.js +0 -50
@@ -1,14 +1,25 @@
1
1
  import type { TronBlock, TronTx } from './types.js';
2
2
  export interface TronApiConfig {
3
3
  rpcUrl: string;
4
+ apiKey?: string;
4
5
  }
6
+ export type TronContractEnergyShare = {
7
+ callerPercent: number;
8
+ originEnergyLimit: number;
9
+ originEnergyAvailable: number;
10
+ };
11
+ export declare const getCallerEnergy: (energyUsed: number, share: TronContractEnergyShare) => number;
5
12
  export declare class TronApi {
6
13
  private readonly rpcUrl;
14
+ private readonly apiKey;
7
15
  private tronWeb;
16
+ private readonly contracts;
17
+ private readonly originEnergy;
8
18
  private requestQueue;
9
19
  private readonly minRequestInterval;
10
20
  constructor(config: TronApiConfig);
11
21
  getRpcUrl(): string;
22
+ private get tronGridHeaders();
12
23
  private throttle;
13
24
  private getTronWeb;
14
25
  getAccount(params: {
@@ -21,10 +32,16 @@ export declare class TronApi {
21
32
  balance: string;
22
33
  }[];
23
34
  }>;
24
- getTRC20Balance(params: {
35
+ getTrc20Balance(params: {
36
+ contractAddress: string;
25
37
  address: string;
38
+ }): Promise<string>;
39
+ getTrc20Allowance(params: {
26
40
  contractAddress: string;
41
+ owner: string;
42
+ spender: string;
27
43
  }): Promise<string>;
44
+ isAccountActivated(address: string): Promise<boolean>;
28
45
  getTxHistory(_params: {
29
46
  pubkey: string;
30
47
  pageSize?: number;
@@ -44,23 +61,29 @@ export declare class TronApi {
44
61
  hex: string;
45
62
  };
46
63
  }): Promise<string>;
47
- private getChainPrices;
48
- estimateFees(params: {
49
- estimateFeesBody: {
50
- serializedTx: string;
51
- };
52
- }): Promise<string>;
53
- estimateTRC20TransferFee(params: {
64
+ getChainPrices(): Promise<{
65
+ bandwidthPrice: number;
66
+ energyPrice: number;
67
+ memoFee: number;
68
+ }>;
69
+ getContractEnergyShare(contractAddress: string): Promise<TronContractEnergyShare>;
70
+ private getContract;
71
+ private getPricingContext;
72
+ private getOriginEnergyAvailable;
73
+ private post;
74
+ estimateTrc20TransferFee(params: {
54
75
  contractAddress: string;
55
76
  from: string;
56
77
  to: string;
57
78
  amount: string;
79
+ requireEnergyShare?: boolean;
58
80
  }): Promise<string>;
59
- getPriorityFees(): Promise<{
60
- baseFee: string;
61
- fast: string;
62
- average: string;
63
- slow: string;
64
- estimatedBandwidth: string;
65
- }>;
81
+ estimateContractCallFee(params: {
82
+ contractAddress: string;
83
+ from: string;
84
+ data: string;
85
+ callValue?: string;
86
+ requireEnergyShare?: boolean;
87
+ }): Promise<string>;
88
+ private getSimulatedEnergy;
66
89
  }
@@ -1,15 +1,42 @@
1
1
  import { TronWeb } from 'tronweb';
2
+ const TRON_CALLER_PAYS_ALL = {
3
+ callerPercent: 100,
4
+ originEnergyLimit: 0,
5
+ originEnergyAvailable: 0,
6
+ };
7
+ // java-tron reads a stored zero, which TronGrid omits, as this creator default
8
+ const TRON_CREATOR_DEFAULT_ENERGY_LIMIT = 10_000_000;
9
+ // A deployer's unspent energy moves slowly next to how often the swappers re-estimate
10
+ const TRON_ORIGIN_ENERGY_TTL_MS = 15_000;
11
+ // A deployer can raise the caller's share after deployment, so the split is re-read within the minute
12
+ const TRON_CONTRACT_TTL_MS = 60_000;
13
+ // The deployer covers the rest only out of what they have staked, so a dry deployer (Tether) leaves the caller paying in full
14
+ export const getCallerEnergy = (energyUsed, share) => {
15
+ const originShare = Math.floor((energyUsed * (100 - share.callerPercent)) / 100);
16
+ const originCovered = Math.max(0, Math.min(originShare, share.originEnergyLimit, share.originEnergyAvailable));
17
+ return energyUsed - originCovered;
18
+ };
2
19
  export class TronApi {
3
20
  rpcUrl;
21
+ apiKey;
4
22
  tronWeb = null;
23
+ contracts = new Map();
24
+ originEnergy = new Map();
5
25
  requestQueue = Promise.resolve();
6
26
  minRequestInterval = 1_500;
7
27
  constructor(config) {
8
28
  this.rpcUrl = config.rpcUrl;
29
+ this.apiKey = config.apiKey ?? '';
9
30
  }
10
31
  getRpcUrl() {
11
32
  return this.rpcUrl;
12
33
  }
34
+ get tronGridHeaders() {
35
+ return {
36
+ 'Content-Type': 'application/json',
37
+ ...(this.apiKey ? { 'TRON-PRO-API-KEY': this.apiKey } : {}),
38
+ };
39
+ }
13
40
  async throttle() {
14
41
  // Queue the request and wait for all previous requests to complete
15
42
  const currentRequest = this.requestQueue.then(async () => {
@@ -20,7 +47,10 @@ export class TronApi {
20
47
  }
21
48
  getTronWeb() {
22
49
  if (!this.tronWeb) {
23
- this.tronWeb = new TronWeb({ fullHost: this.rpcUrl });
50
+ this.tronWeb = new TronWeb({
51
+ fullHost: this.rpcUrl,
52
+ headers: this.apiKey ? { 'TRON-PRO-API-KEY': this.apiKey } : {},
53
+ });
24
54
  }
25
55
  return this.tronWeb;
26
56
  }
@@ -28,7 +58,7 @@ export class TronApi {
28
58
  await this.throttle();
29
59
  const response = await fetch(`${this.rpcUrl}/wallet/getaccount`, {
30
60
  method: 'POST',
31
- headers: { 'Content-Type': 'application/json' },
61
+ headers: this.tronGridHeaders,
32
62
  body: JSON.stringify({ address: params.pubkey, visible: true }),
33
63
  });
34
64
  const data = await response.json();
@@ -45,7 +75,9 @@ export class TronApi {
45
75
  // Get TRC20 tokens from TronGrid API
46
76
  try {
47
77
  await this.throttle();
48
- const trc20Response = await fetch(`${this.rpcUrl}/v1/accounts/${params.pubkey}`);
78
+ const trc20Response = await fetch(`${this.rpcUrl}/v1/accounts/${params.pubkey}`, {
79
+ headers: this.tronGridHeaders,
80
+ });
49
81
  const trc20Data = await trc20Response.json();
50
82
  if (trc20Data.data?.[0]?.trc20 && Array.isArray(trc20Data.data[0].trc20)) {
51
83
  // trc20 is an array of objects like [{contractAddress: balance}, ...]
@@ -58,6 +90,45 @@ export class TronApi {
58
90
  }
59
91
  });
60
92
  }
93
+ else if (!trc20Data.data || trc20Data.data.length === 0) {
94
+ // Non-activated account: /v1/accounts returns data:[] for addresses that have never sent TRX.
95
+ // Fall back to discovering TRC20 balances via received transactions + hardcoded top tokens.
96
+ try {
97
+ await this.throttle();
98
+ const HARDCODED_TOP_TOKENS = [
99
+ 'TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t',
100
+ 'TEkxiTehnzSmSe2XqrBj4w32RUN966rdz8', // USDC
101
+ ];
102
+ const MAX_FALLBACK_CONTRACTS = 20;
103
+ const discoveredContracts = new Set(HARDCODED_TOP_TOKENS);
104
+ const trc20TxResponse = await fetch(`${this.rpcUrl}/v1/accounts/${params.pubkey}/transactions/trc20?limit=200&only_to=true`, { headers: this.tronGridHeaders });
105
+ if (trc20TxResponse.ok) {
106
+ const trc20TxData = await trc20TxResponse.json();
107
+ if (trc20TxData.data && Array.isArray(trc20TxData.data)) {
108
+ trc20TxData.data.forEach((tx) => {
109
+ const contractAddress = tx.token_info?.address;
110
+ if (contractAddress)
111
+ discoveredContracts.add(contractAddress);
112
+ });
113
+ }
114
+ }
115
+ for (const contractAddress of Array.from(discoveredContracts).slice(0, MAX_FALLBACK_CONTRACTS)) {
116
+ await this.throttle();
117
+ await this.getTrc20Balance({ contractAddress, address: params.pubkey })
118
+ .then(balance => {
119
+ if (balance !== '0')
120
+ tokens.push({ contractAddress, balance });
121
+ })
122
+ .catch(() => undefined);
123
+ }
124
+ }
125
+ catch (fallbackErr) {
126
+ console.error('Failed TRC20 fallback discovery for non-activated TRON account', {
127
+ address: `${params.pubkey.slice(0, 6)}...${params.pubkey.slice(-4)}`,
128
+ error: fallbackErr,
129
+ });
130
+ }
131
+ }
61
132
  }
62
133
  catch (err) {
63
134
  // TRC20 fetch failed, continue with just TRC10 tokens
@@ -69,16 +140,36 @@ export class TronApi {
69
140
  tokens,
70
141
  };
71
142
  }
72
- async getTRC20Balance(params) {
73
- try {
74
- const tronWeb = await this.getTronWeb();
75
- const contract = await tronWeb.contract().at(params.contractAddress);
76
- const balance = await contract.balanceOf(params.address).call();
77
- return balance.toString();
78
- }
79
- catch (_err) {
80
- return '0';
81
- }
143
+ async getTrc20Balance(params) {
144
+ const result = await this.getTronWeb().transactionBuilder.triggerConstantContract(params.contractAddress, 'balanceOf(address)', {}, [{ type: 'address', value: params.address }], params.address);
145
+ const [balance] = result.constant_result ?? [];
146
+ if (!balance)
147
+ throw new Error('[tron] balanceOf call returned no data');
148
+ return BigInt(`0x${balance}`).toString();
149
+ }
150
+ // A direct selector call - contract().at() would first fetch the ABI, doubling the requests
151
+ async getTrc20Allowance(params) {
152
+ const tronWeb = this.getTronWeb();
153
+ const result = await tronWeb.transactionBuilder.triggerConstantContract(params.contractAddress, 'allowance(address,address)', {}, [
154
+ { type: 'address', value: params.owner },
155
+ { type: 'address', value: params.spender },
156
+ ], params.owner);
157
+ const [allowance] = result.constant_result ?? [];
158
+ if (!allowance)
159
+ throw new Error('[tron] allowance call returned no data');
160
+ return BigInt(`0x${allowance}`).toString();
161
+ }
162
+ // Accounts exist on-chain only once they have received TRX; a fresh address returns {}
163
+ async isAccountActivated(address) {
164
+ const response = await fetch(`${this.rpcUrl}/wallet/getaccount`, {
165
+ method: 'POST',
166
+ headers: this.tronGridHeaders,
167
+ body: JSON.stringify({ address, visible: true }),
168
+ });
169
+ if (!response.ok)
170
+ throw new Error(`[tron] getaccount failed: ${response.status}`);
171
+ const data = await response.json();
172
+ return !!data.address;
82
173
  }
83
174
  getTxHistory(_params) {
84
175
  throw new Error('Transaction history is not supported for TRON');
@@ -88,22 +179,20 @@ export class TronApi {
88
179
  const [txResponse, infoResponse] = await Promise.all([
89
180
  fetch(`${this.rpcUrl}/wallet/gettransactionbyid`, {
90
181
  method: 'POST',
91
- headers: { 'Content-Type': 'application/json' },
182
+ headers: this.tronGridHeaders,
92
183
  body: JSON.stringify({ value: params.txid, visible: true }),
93
184
  }),
94
185
  fetch(`${this.rpcUrl}/wallet/gettransactioninfobyid`, {
95
186
  method: 'POST',
96
- headers: { 'Content-Type': 'application/json' },
187
+ headers: this.tronGridHeaders,
97
188
  body: JSON.stringify({ value: params.txid, visible: true }),
98
189
  }),
99
190
  ]);
100
- if (!txResponse.ok) {
191
+ if (!txResponse.ok)
101
192
  return null;
102
- }
103
193
  const tx = await txResponse.json();
104
- if (!tx || !tx.txID) {
194
+ if (!tx || !tx.txID)
105
195
  return null;
106
- }
107
196
  let blockNumber = 0;
108
197
  let blockTimeStamp = 0;
109
198
  let fee = '0';
@@ -134,12 +223,11 @@ export class TronApi {
134
223
  await this.throttle();
135
224
  const response = await fetch(`${this.rpcUrl}/wallet/getblockbynum`, {
136
225
  method: 'POST',
137
- headers: { 'Content-Type': 'application/json' },
226
+ headers: this.tronGridHeaders,
138
227
  body: JSON.stringify({ num: params.height }),
139
228
  });
140
- if (!response.ok) {
229
+ if (!response.ok)
141
230
  return null;
142
- }
143
231
  return await response.json();
144
232
  }
145
233
  async sendTx(params) {
@@ -151,9 +239,8 @@ export class TronApi {
151
239
  throw new Error(result.message || JSON.stringify(result) || 'Failed to broadcast transaction');
152
240
  }
153
241
  const txid = result.txid || result.transaction?.txID;
154
- if (!txid) {
242
+ if (!txid)
155
243
  throw new Error('Transaction ID not found in broadcast result');
156
- }
157
244
  return txid;
158
245
  }
159
246
  catch (error) {
@@ -161,69 +248,138 @@ export class TronApi {
161
248
  }
162
249
  }
163
250
  async getChainPrices() {
164
- try {
165
- const tronWeb = await this.getTronWeb();
166
- const params = await tronWeb.trx.getChainParameters();
167
- const bandwidthPrice = params.find(p => p.key === 'getTransactionFee')?.value ?? 1000;
168
- const energyPrice = params.find(p => p.key === 'getEnergyFee')?.value ?? 420;
169
- return { bandwidthPrice, energyPrice };
170
- }
171
- catch (_err) {
172
- return { bandwidthPrice: 1000, energyPrice: 420 };
173
- }
251
+ const params = await this.getTronWeb().trx.getChainParameters();
252
+ const param = (key) => {
253
+ const value = params.find(p => p.key === key)?.value;
254
+ if (value === undefined)
255
+ throw new Error(`[tron] chain parameter ${key} missing`);
256
+ return value;
257
+ };
258
+ return {
259
+ bandwidthPrice: param('getTransactionFee'),
260
+ energyPrice: param('getEnergyFee'),
261
+ memoFee: param('getMemoFee'),
262
+ };
174
263
  }
175
- async estimateFees(params) {
176
- try {
177
- const { bandwidthPrice } = await this.getChainPrices();
178
- const rawDataBytes = Buffer.from(params.estimateFeesBody.serializedTx, 'hex').length;
179
- const signatureBytes = 65;
180
- const totalBytes = rawDataBytes + signatureBytes;
181
- const feeInSun = totalBytes * bandwidthPrice;
182
- return String(feeInSun);
183
- }
184
- catch (err) {
185
- throw new Error(`Failed to estimate fees: ${err}`);
186
- }
264
+ // A plain address answers getcontract with {} and pays in full
265
+ async getContractEnergyShare(contractAddress) {
266
+ const contract = await this.getContract(contractAddress);
267
+ if (!contract.origin_address)
268
+ return TRON_CALLER_PAYS_ALL;
269
+ // TronGrid omits zero-valued fields, so a contract whose deployer pays everything carries no percent at all
270
+ const callerPercent = contract.consume_user_resource_percent ?? 0;
271
+ if (callerPercent >= 100)
272
+ return TRON_CALLER_PAYS_ALL;
273
+ return {
274
+ callerPercent,
275
+ originEnergyLimit: contract.origin_energy_limit || TRON_CREATOR_DEFAULT_ENERGY_LIMIT,
276
+ originEnergyAvailable: await this.getOriginEnergyAvailable(contract.origin_address),
277
+ };
187
278
  }
188
- async estimateTRC20TransferFee(params) {
189
- try {
190
- const tronWeb = await this.getTronWeb();
191
- const { energyPrice } = await this.getChainPrices();
192
- const result = await tronWeb.transactionBuilder.triggerConstantContract(params.contractAddress, 'transfer(address,uint256)', {}, [
193
- { type: 'address', value: params.to },
194
- { type: 'uint256', value: params.amount },
195
- ], params.from);
196
- const energyUsed = result.energy_used ?? 0;
197
- const feeInSun = energyUsed * energyPrice;
198
- return String(feeInSun);
199
- }
200
- catch (_err) {
201
- // Fallback: Worst case 130k energy at current 100 sun/energy
202
- return '13000000'; // 13 TRX (more realistic than 31 TRX)
203
- }
279
+ getContract(contractAddress) {
280
+ const cached = this.contracts.get(contractAddress);
281
+ if (cached && Date.now() - cached.readAt < TRON_CONTRACT_TTL_MS)
282
+ return cached.value;
283
+ const value = this.post('/wallet/getcontract', {
284
+ value: contractAddress,
285
+ visible: true,
286
+ })
287
+ .then(body => {
288
+ if (body.Error)
289
+ throw new Error(`[tron] getcontract failed: ${body.Error}`);
290
+ // only a contract record is worth keeping; an empty body is re-read next time
291
+ if (!body.origin_address && this.contracts.get(contractAddress)?.value === value) {
292
+ this.contracts.delete(contractAddress);
293
+ }
294
+ return body;
295
+ })
296
+ .catch(err => {
297
+ if (this.contracts.get(contractAddress)?.value === value) {
298
+ this.contracts.delete(contractAddress);
299
+ }
300
+ throw err;
301
+ });
302
+ this.contracts.set(contractAddress, { readAt: Date.now(), value });
303
+ return value;
204
304
  }
205
- async getPriorityFees() {
206
- try {
207
- const { bandwidthPrice } = await this.getChainPrices();
208
- const estimatedBytes = 268;
209
- const baseFee = String(estimatedBytes * bandwidthPrice);
210
- return {
211
- baseFee,
212
- fast: baseFee,
213
- average: baseFee,
214
- slow: baseFee,
215
- estimatedBandwidth: String(estimatedBytes),
216
- };
305
+ // A failed share lookup prices the simulation as if the caller paid in full, unless the caller must not guess
306
+ async getPricingContext(contractAddress, requireEnergyShare = false) {
307
+ const [{ energyPrice }, share] = await Promise.all([
308
+ this.getChainPrices(),
309
+ this.getContractEnergyShare(contractAddress).catch((error) => {
310
+ if (requireEnergyShare)
311
+ throw error;
312
+ console.warn(`[tron] energy share lookup failed for ${contractAddress}, pricing in full`, error);
313
+ return TRON_CALLER_PAYS_ALL;
314
+ }),
315
+ ]);
316
+ return { energyPrice, share };
317
+ }
318
+ getOriginEnergyAvailable(originAddress) {
319
+ const cached = this.originEnergy.get(originAddress);
320
+ if (cached && Date.now() - cached.readAt < TRON_ORIGIN_ENERGY_TTL_MS)
321
+ return cached.value;
322
+ const value = this.post('/wallet/getaccountresource', { address: originAddress, visible: true })
323
+ .then(body => {
324
+ if (body.Error)
325
+ throw new Error(`[tron] getaccountresource failed: ${body.Error}`);
326
+ return Math.max(0, (body.EnergyLimit ?? 0) - (body.EnergyUsed ?? 0));
327
+ })
328
+ .catch(err => {
329
+ if (this.originEnergy.get(originAddress)?.value === value) {
330
+ this.originEnergy.delete(originAddress);
331
+ }
332
+ throw err;
333
+ });
334
+ this.originEnergy.set(originAddress, { readAt: Date.now(), value });
335
+ return value;
336
+ }
337
+ async post(path, body) {
338
+ const response = await fetch(`${this.rpcUrl}${path}`, {
339
+ method: 'POST',
340
+ headers: this.tronGridHeaders,
341
+ body: JSON.stringify(body),
342
+ });
343
+ if (!response.ok)
344
+ throw new Error(`[tron] ${path} failed: ${response.status}`);
345
+ return response.json();
346
+ }
347
+ async estimateTrc20TransferFee(params) {
348
+ const tronWeb = this.getTronWeb();
349
+ const { energyPrice, share } = await this.getPricingContext(params.contractAddress, params.requireEnergyShare);
350
+ const result = await tronWeb.transactionBuilder.triggerConstantContract(params.contractAddress, 'transfer(address,uint256)', {}, [
351
+ { type: 'address', value: params.to },
352
+ { type: 'uint256', value: params.amount },
353
+ ], params.from);
354
+ const energy = this.getSimulatedEnergy(result, 'trc20 transfer');
355
+ return String(getCallerEnergy(energy, share) * energyPrice);
356
+ }
357
+ async estimateContractCallFee(params) {
358
+ const { energyPrice, share } = await this.getPricingContext(params.contractAddress, params.requireEnergyShare);
359
+ const response = await fetch(`${this.rpcUrl}/wallet/triggerconstantcontract`, {
360
+ method: 'POST',
361
+ headers: { 'Content-Type': 'application/json', ...this.tronGridHeaders },
362
+ body: JSON.stringify({
363
+ owner_address: params.from,
364
+ contract_address: params.contractAddress,
365
+ data: params.data.startsWith('0x') ? params.data.slice(2) : params.data,
366
+ call_value: Number(params.callValue) || 0,
367
+ visible: true,
368
+ }),
369
+ });
370
+ if (!response.ok) {
371
+ throw new Error(`[tron] contract call simulation request failed: ${response.status}`);
217
372
  }
218
- catch (_err) {
219
- const defaultFee = '268000';
220
- return {
221
- baseFee: defaultFee,
222
- fast: defaultFee,
223
- average: defaultFee,
224
- slow: defaultFee,
225
- estimatedBandwidth: '268',
226
- };
373
+ const result = await response.json();
374
+ const energy = this.getSimulatedEnergy(result, 'contract call');
375
+ return String(getCallerEnergy(energy, share) * energyPrice);
376
+ }
377
+ // A revert still reports result.result: true with the partial energy burned - trusting it would underestimate
378
+ getSimulatedEnergy(result, label) {
379
+ const isReverted = result.transaction?.ret?.some(ret => ret.ret === 'FAILED');
380
+ if (result.result?.result !== true || isReverted || !result.energy_used) {
381
+ throw new Error(`[tron] ${label} simulation failed: ${result.result?.message ?? 'unknown error'}`);
227
382
  }
383
+ return result.energy_used;
228
384
  }
229
385
  }
@@ -29,6 +29,9 @@ export interface TronTx {
29
29
  amount?: number;
30
30
  owner_address?: string;
31
31
  to_address?: string;
32
+ contract_address?: string;
33
+ call_value?: number;
34
+ data?: string;
32
35
  };
33
36
  type_url: string;
34
37
  };
@@ -38,6 +41,7 @@ export interface TronTx {
38
41
  ref_block_hash: string;
39
42
  expiration: number;
40
43
  timestamp: number;
44
+ fee_limit?: number;
41
45
  };
42
46
  raw_data_hex: string;
43
47
  txID: string;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@shapeshiftoss/unchained-client",
3
- "version": "10.14.10",
3
+ "version": "10.15.0",
4
4
  "repository": "https://github.com/shapeshift/web",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -20,30 +20,29 @@
20
20
  "publishConfig": {
21
21
  "access": "public"
22
22
  },
23
- "scripts": {
24
- "build": "yarn clean && yarn generate && yarn run -T tsc --build && yarn postbuild",
25
- "build:docker": "yarn clean:dist && yarn run -T tsc --build && yarn postbuild",
26
- "clean": "rm -rf dist src/generated",
27
- "clean:dist": "rm -rf dist",
28
- "dev": "yarn run -T tsc --build --watch",
29
- "generate": "TS_POST_PROCESS_FILE=./generator/post_process.sh JAVA_OPTS='-Dlog.level=error' openapi-generator-cli generate",
30
- "postbuild": "yarn postbuild:esm && yarn postbuild:cjs",
31
- "postbuild:esm": "yarn run -T tsc-esm-fix --target=dist/esm --ext=.js",
32
- "postbuild:cjs": "echo '{\"type\": \"commonjs\"}' > dist/cjs/package.json"
33
- },
34
23
  "dependencies": {
35
- "@shapeshiftoss/caip": "^8.16.8",
36
24
  "@shapeshiftoss/common-api": "^9.3.0",
37
- "@shapeshiftoss/contracts": "^1.0.6",
38
- "@shapeshiftoss/utils": "^1.0.6",
39
25
  "axios": "^1.13.5",
40
26
  "bignumber.js": "^9.3.1",
27
+ "bs58": "^5.0.0",
41
28
  "ethers": "6.11.1",
42
29
  "isomorphic-ws": "^4.0.1",
43
- "viem": "2.43.5",
44
- "ws": "^8.17.1"
30
+ "viem": "2.55.11",
31
+ "ws": "^8.17.1",
32
+ "@shapeshiftoss/caip": "^8.17.1",
33
+ "@shapeshiftoss/contracts": "^1.1.0",
34
+ "@shapeshiftoss/utils": "^1.3.1"
45
35
  },
46
36
  "devDependencies": {
47
37
  "@openapitools/openapi-generator-cli": "^2.5.1"
38
+ },
39
+ "scripts": {
40
+ "build": "rm -rf dist && pnpm run generate && pnpm exec tsc --build && pnpm run postbuild",
41
+ "clean": "rm -rf dist src/generated node_modules",
42
+ "dev": "pnpm exec tsc --build --watch",
43
+ "generate": "rm -rf src/generated && TS_POST_PROCESS_FILE=./generator/post_process.sh JAVA_OPTS='-Dlog.level=error' openapi-generator-cli generate",
44
+ "postbuild": "pnpm run postbuild:esm && pnpm run postbuild:cjs",
45
+ "postbuild:esm": "pnpm exec tsc-esm-fix --target=dist/esm --ext=.js",
46
+ "postbuild:cjs": "echo '{\"type\": \"commonjs\"}' > dist/cjs/package.json"
48
47
  }
49
48
  }