@layerzerolabs/lz-corekit-tron 3.0.1 → 3.0.2-initia.1

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/CHANGELOG.md CHANGED
@@ -1,5 +1,27 @@
1
1
  # @layerzerolabs/lz-corekit-tron
2
2
 
3
+ ## 3.0.2-initia.1
4
+
5
+ ### Patch Changes
6
+
7
+ - Build new Initia snapshot images
8
+ - Updated dependencies
9
+ - @layerzerolabs/lz-core@3.0.2-initia.1
10
+ - @layerzerolabs/tron-utilities@3.0.2-initia.1
11
+ - @layerzerolabs/lz-utilities@3.0.2-initia.1
12
+ - @layerzerolabs/lz-aptos-sdk-v1@3.0.2-initia.1
13
+
14
+ ## 3.0.2-initia.0
15
+
16
+ ### Patch Changes
17
+
18
+ - latest SDK
19
+ - Updated dependencies
20
+ - @layerzerolabs/lz-core@3.0.2-initia.0
21
+ - @layerzerolabs/tron-utilities@3.0.2-initia.0
22
+ - @layerzerolabs/lz-utilities@3.0.2-initia.0
23
+ - @layerzerolabs/lz-aptos-sdk-v1@3.0.2-initia.0
24
+
3
25
  ## 3.0.1
4
26
 
5
27
  ### Patch Changes
@@ -25,6 +47,72 @@
25
47
  - @layerzerolabs/lz-utilities@3.0.0
26
48
  - @layerzerolabs/lz-aptos-sdk-v1@3.0.0
27
49
 
50
+ ## 2.3.45-initia-oft.5
51
+
52
+ ### Patch Changes
53
+
54
+ - Build Initia,aptos,movement,bsc snapshot images with newest images
55
+ - Updated dependencies
56
+ - @layerzerolabs/lz-core@2.3.45-initia-oft.5
57
+ - @layerzerolabs/tron-utilities@2.3.45-initia-oft.5
58
+ - @layerzerolabs/lz-utilities@2.3.45-initia-oft.5
59
+ - @layerzerolabs/lz-aptos-sdk-v1@2.3.45-initia-oft.5
60
+
61
+ ## 2.3.45-initia-oft.4
62
+
63
+ ### Patch Changes
64
+
65
+ - Build initia images with newest contracts
66
+ - Updated dependencies
67
+ - @layerzerolabs/lz-core@2.3.45-initia-oft.4
68
+ - @layerzerolabs/tron-utilities@2.3.45-initia-oft.4
69
+ - @layerzerolabs/lz-utilities@2.3.45-initia-oft.4
70
+ - @layerzerolabs/lz-aptos-sdk-v1@2.3.45-initia-oft.4
71
+
72
+ ## 2.3.45-initia-oft.3
73
+
74
+ ### Patch Changes
75
+
76
+ - Fix Aptos OFT SDK to fit newest contracts
77
+ - Updated dependencies
78
+ - @layerzerolabs/lz-core@2.3.45-initia-oft.3
79
+ - @layerzerolabs/tron-utilities@2.3.45-initia-oft.3
80
+ - @layerzerolabs/lz-utilities@2.3.45-initia-oft.3
81
+ - @layerzerolabs/lz-aptos-sdk-v1@2.3.45-initia-oft.3
82
+
83
+ ## 2.3.45-initia-oft.2
84
+
85
+ ### Patch Changes
86
+
87
+ - Fix bug in Initia OFT sdk
88
+ - Updated dependencies
89
+ - @layerzerolabs/lz-core@2.3.45-initia-oft.2
90
+ - @layerzerolabs/tron-utilities@2.3.45-initia-oft.2
91
+ - @layerzerolabs/lz-utilities@2.3.45-initia-oft.2
92
+ - @layerzerolabs/lz-aptos-sdk-v1@2.3.45-initia-oft.2
93
+
94
+ ## 2.3.45-initia-oft.1
95
+
96
+ ### Patch Changes
97
+
98
+ - Build new initia images with newest contracts
99
+ - Updated dependencies
100
+ - @layerzerolabs/lz-core@2.3.45-initia-oft.1
101
+ - @layerzerolabs/tron-utilities@2.3.45-initia-oft.1
102
+ - @layerzerolabs/lz-utilities@2.3.45-initia-oft.1
103
+ - @layerzerolabs/lz-aptos-sdk-v1@2.3.45-initia-oft.1
104
+
105
+ ## 2.3.45-initia-oft.0
106
+
107
+ ### Patch Changes
108
+
109
+ - Build new initia images with testnet deployments
110
+ - Updated dependencies
111
+ - @layerzerolabs/lz-core@2.3.45-initia-oft.0
112
+ - @layerzerolabs/tron-utilities@2.3.45-initia-oft.0
113
+ - @layerzerolabs/lz-utilities@2.3.45-initia-oft.0
114
+ - @layerzerolabs/lz-aptos-sdk-v1@2.3.45-initia-oft.0
115
+
28
116
  ## 2.3.44
29
117
 
30
118
  ### Patch Changes
package/dist/index.cjs CHANGED
@@ -345,6 +345,9 @@ var _TronSigner = class _TronSigner {
345
345
  }
346
346
  return true;
347
347
  }
348
+ async buildTransaction(buildTxRequest) {
349
+ return Promise.reject(new Error("Method not implemented."));
350
+ }
348
351
  };
349
352
  _TronSigner.createTronWeb = mem__default.default(
350
353
  (url, privateKey, apiKey) => {
@@ -450,6 +453,9 @@ var TronWebSigner = class _TronWebSigner {
450
453
  }
451
454
  return true;
452
455
  }
456
+ async buildTransaction(buildTxRequest) {
457
+ return Promise.reject(new Error("Method not implemented."));
458
+ }
453
459
  };
454
460
 
455
461
  exports.TronProvider = TronProvider;
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/providers/tron.ts","../src/utils/tron.ts","../src/providers/tronweb.ts","../src/signers/tron.ts","../src/signers/tronweb.ts"],"names":["ethers","TronWeb","Block","BlockWithTransactions","TransactionPending","TransactionReceipt","TransactionResponse","mem","SignedTransaction","sendTronTransaction","trim0x","signTronTx"],"mappings":";AAAA,SAAS,UAAAA,eAAc;AACvB,OAAO,SAAS;AAChB,OAAOC,cAAa;AAEpB;AAAA,EACI;AAAA,EAEA;AAAA,EAIA;AAAA,EACA;AAAA,EACA;AAAA,OACG;AACP,SAAS,iBAAiB,2BAA2B;;;ACfrD,SAAS,cAAc;AACvB,OAAO,aAAa;AAMb,SAAS,wBAAwB,KAAqB;AAKzD,QAAM,QAAQ,IAAI,KAAK,EAAE,QAAQ,QAAQ,EAAE;AAC3C,MAAI,CAAC,MAAM,SAAS,UAAU,GAAG;AAC7B,WAAO,QAAQ;AAAA,EACnB;AACA,SAAO;AACX;AAKO,SAAS,wBAAwB,KAAqB;AACzD,SAAO,IAAI,QAAQ,cAAc,EAAE;AACvC;AAWO,SAAS,cAAc,SAAyB;AACnD,MAAI,QAAQ,WAAW,GAAG,KAAK,QAAQ,WAAW,IAAI;AAClD,WAAO,QAAQ,QAAQ,MAAM,OAAO,EAAE,MAAM,CAAC;AAAA,EACjD,WAAW,QAAQ,WAAW,IAAI,KAAK,QAAQ,WAAW,IAAI;AAC1D,WAAO,QAAQ,MAAM,CAAC;AAAA,EAC1B,OAAO;AACH,WAAO;AAAA,EACX;AACJ;AASO,SAAS,YAAY,QAAwB;AAChD,SAAO,OAAO,MAAM,QAAQ,QAAQ,EAAE,oBAAoB,KAAK,CAAC;AACpE;;;AD/BO,IAAM,eAAN,MAAuC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQlC,YACG,KACP,QACF;AAFS;AAiCX,SAAQ,mBAAmB;AAAA,MACvB,CAAC,aAAiD;AAC9C,YAAI,oBAAoBD,QAAO,UAAU,iBAAiB;AACtD,gBAAM,EAAE,IAAI,IAAI,SAAS;AACzB,gBAAM,SAAS,SAAS,WAAW,UAAU,kBAAkB;AAE/D,iBAAO,IAAIC,SAAQ;AAAA,YACf,YAAY;AAAA,YACZ,UAAU,gBAAgB,IAAI,GAAG,EAAE,OAAO,GAAG;AAAA,YAC7C,SAAS,EAAE,GAAI,WAAW,SAAY,EAAE,oBAAoB,OAAO,IAAI,CAAC,EAAG;AAAA,UAC/E,CAAC;AAAA,QACL;AAEA,cAAM,IAAI,MAAM,oCAAoC;AAAA,MACxD;AAAA,MACA;AAAA,QACI,UAAU,CAAC,eAAoD;AAC3D,gBAAM,WAAW,WAAW,CAAC;AAC7B,cAAI,oBAAoBD,QAAO,UAAU,iBAAiB;AACtD,kBAAM,EAAE,IAAI,IAAI,SAAS;AACzB,kBAAM,SAAS,SAAS,WAAW,UAAU,kBAAkB;AAC/D,mBAAO,KAAK,UAAU,EAAE,KAAK,OAAO,CAAC;AAAA,UACzC;AACA,iBAAO,KAAK,UAAU,QAAQ;AAAA,QAClC;AAAA,MACJ;AAAA,IACJ;AAxDI,SAAK,iBAAiB,IAAIA,QAAO,UAAU,sBAAsB;AAAA,MAC7D,KAAK,gBAAgB,IAAI,GAAG,EAAE,UAAU,GAAG;AAAA,MAC3C,SAAS;AAAA;AAAA,QAEL,GAAI,WAAW,SAAY,EAAE,oBAAoB,OAAO,IAAI,CAAC;AAAA,MACjE;AAAA,IACJ,CAAC;AAAA,EACL;AAAA,EAKA,OAAO,KAAK,QAA0B,QAA+B;AACjE,QAAI,OAAO,WAAW,UAAU;AAC5B,aAAO,IAAI,KAAK,QAAQ,MAAM;AAAA,IAClC,WAAW,kBAAkBC,UAAS;AAClC,YAAM,EAAE,MAAM,QAAQ,IAAI,OAAO;AACjC,aAAO,KAAK,KAAK,MAAM,QAAQ,kBAAkB,CAAC;AAAA,IACtD,OAAO;AACH,YAAM,IAAI,MAAM,oBAAoB;AAAA,IACxC;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,SAAkB;AAClB,WAAO,KAAK;AAAA,EAChB;AAAA,EA8BA,MAAM,WAAW,SAAkC;AAC/C,WAAO,KAAK,eAAe,WAAW,cAAc,OAAO,CAAC,EAAE,KAAK,CAAC,YAAY,QAAQ,SAAS,CAAC;AAAA,EACtG;AAAA,EAEA,MAAM,SAAS,UAA2C;AACtD,UAAM,WAAW,MAAM,KAAK,eAAe,SAAS,QAAQ;AAC5D,WAAO,MAAM,KAAK,QAAQ;AAAA,EAC9B;AAAA,EAEA,MAAM,yBAAyB,UAA2D;AACtF,UAAM,WAAW,MAAM,KAAK,eAAe,yBAAyB,QAAQ;AAC5E,WAAO,sBAAsB,KAAK,QAAQ;AAAA,EAC9C;AAAA,EAEA,MAAM,iBAAkC;AACpC,WAAO,KAAK,eAAe,eAAe;AAAA,EAC9C;AAAA,EAEA,MAAM,kBAAkB,UAA4C;AAChE,WAAO,KAAK,eAAe,SAAS,QAAQ,EAAE,KAAK,CAAC,UAAU,MAAM,SAAS;AAAA,EACjF;AAAA,EAEA,MAAM,QAAQ,WAAuC;AACjD,UAAM,QAAQ,QAAQ;AACtB,UAAM,IAAI,MAAM,yBAAyB;AAAA,EAC7C;AAAA,EAEA,MAAM,eAAe,QAA8C;AAC/D,UAAM,WAAW,MAAM,KAAK,eAAe,eAAe,YAAY,MAAM,CAAC;AAC7E,WAAO,oBAAoB,KAAK,QAAQ;AAAA,EAC5C;AAAA,EAEA,MAAM,sBAAsB,QAA6C;AACrE,UAAM,WAAW,MAAM,KAAK,eAAe,sBAAsB,YAAY,MAAM,CAAC;AACpF,WAAO,mBAAmB,KAAK,QAAQ;AAAA,EAC3C;AAAA,EAEA,MAAM,oBACF,gBACA,WACe;AACf,UAAM,QAAQ,QAAQ;AACtB,UAAM,IAAI,MAAM,+BAA+B;AAAA,EACnD;AAAA,EAEA,MAAM,gBAAgB,aAAgC,cAAoD;AAItG,UAAM,MAAM,YAAY;AACxB,UAAM,SAAS,KAAK,iBAAiB,KAAK,cAAc;AACxD,UAAM,WAAW,MAAM,oBAAoB,KAAK,MAAM;AAEtD,WAAO,mBAAmB,KAAK,QAAQ;AAAA,EAC3C;AAAA,EAEA,MAAM,eAAe,aAAgC,MAA4C;AAC7F,UAAM,WAAW,MAAM,KAAK,gBAAgB,aAAa,IAAI,GAAG;AAMhE,UAAM,WAAW,MAAM,QAAQ,KAAK;AACpC,WAAO,mBAAmB,KAAK,QAAQ;AAAA,EAC3C;AACJ;;;AE/JA,OAAOA,cAAa;AAEpB;AAAA,EACI,SAAAC;AAAA,EAEA,yBAAAC;AAAA,EAIA,sBAAAC;AAAA,EACA,sBAAAC;AAAA,EACA,uBAAAC;AAAA,OACG;AACP,SAAS,aAAa;AAYf,IAAM,kBAAN,MAA0C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQ7C,YACW,KACC,QACV;AAFS;AACC;AAER,SAAK,iBAAiB,IAAIL,SAAQ;AAAA,MAC9B,UAAU;AAAA,MACV,SAAS;AAAA;AAAA,QAEL,GAAI,WAAW,SAAY,EAAE,oBAAoB,OAAO,IAAI,CAAC;AAAA,MACjE;AAAA,IACJ,CAAC;AAAA,EACL;AAAA,EAIA,OAAO,KAAK,QAAgB,QAAkC;AAC1D,QAAI,OAAO,WAAW,UAAU;AAC5B,aAAO,IAAI,KAAK,QAAQ,MAAM;AAAA,IAClC,OAAO;AACH,YAAM,IAAI,MAAM,oBAAoB;AAAA,IACxC;AAAA,EACJ;AAAA,EAEA,IAAI,SAAkB;AAClB,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,MAAM,WAAW,SAAkC;AAC/C,WAAO,KAAK,eAAe,IAAI,WAAW,OAAO,EAAE,KAAK,CAAC,YAAoB,QAAQ,SAAS,CAAC;AAAA,EACnG;AAAA,EAEA,MAAM,SAAS,UAA2C;AACtD,UAAM,WAAW,MAAM,KAAK,eAAe,IAAI,SAAS,QAAQ;AAChE,WAAOC,OAAM,KAAK,QAAQ;AAAA,EAC9B;AAAA,EAEA,MAAM,yBAAyB,UAA2D;AACtF,UAAM,WAAW,MAAM,KAAK,eAAe,IAAI,SAAS,QAAQ;AAChE,WAAOC,uBAAsB,KAAK,QAAQ;AAAA,EAC9C;AAAA,EAEA,MAAM,iBAAkC;AACpC,WAAO,KAAK,eAAe,IACtB,SAAS,QAAQ,EACjB,KAAK,CAAC,UAA+D;AAClE,UAAI,MAAM,aAAa,SAAS,WAAW,QAAW;AAClD,cAAM,IAAI,MAAM,0DAA0D;AAAA,MAC9E;AACA,aAAO,MAAM,aAAa,SAAS;AAAA,IACvC,CAAC;AAAA,EACT;AAAA,EAEA,MAAM,kBAAkB,UAA4C;AAChE,WAAO,KAAK,eAAe,IACtB,SAAS,QAAQ,EACjB,KAAK,CAAC,UAAkE;AACrE,UAAI,MAAM,aAAa,SAAS,cAAc,QAAW;AACrD,cAAM,IAAI,MAAM,6DAA6D;AAAA,MACjF;AACA,aAAO,MAAM,aAAa,SAAS;AAAA,IACvC,CAAC;AAAA,EACT;AAAA,EAEA,MAAM,QAAQ,WAAuC;AACjD,UAAM,QAAQ,QAAQ;AACtB,UAAM,IAAI,MAAM,yBAAyB;AAAA,EAC7C;AAAA,EAEA,MAAM,eAAe,QAA8C;AAC/D,UAAM,WAAW,MAAM,KAAK,eAAe,IAAI,eAAe,MAAM;AACpE,WAAOG,qBAAoB,KAAK,QAAQ;AAAA,EAC5C;AAAA,EAEA,MAAM,sBAAsB,QAA6C;AAErE,UAAM,WAAW,MAAM,KAAK,eAAe,IAAI,mBAAmB,MAAM;AACxE,WAAOD,oBAAmB,KAAK,QAAQ;AAAA,EAC3C;AAAA,EAEA,MAAM,oBACF,gBACA,WACe;AACf,UAAM,QAAQ,QAAQ;AACtB,UAAM,IAAI,MAAM,+BAA+B;AAAA,EACnD;AAAA,EAEA,MAAM,gBACF,aACA,aAC2B;AAG3B,UAAM,MAAM,YAAY;AACxB,UAAM,WAAW,MAAM,KAAK,eAAe,IAAI,mBAAmB,KAAK,WAAW;AAElF,QAAI,SAAS,SAAS,QAAW;AAC7B,YAAM,QAAQ;AAAA,QACV,OAAO,SAAS;AAAA,QAChB,SAAS,SAAS,YAAY,SAAYJ,SAAQ,OAAO,SAAS,OAAO,IAAI,SAAS;AAAA,MAC1F;AACA,YAAM,IAAI,MAAM,KAAK,UAAU,OAAO,MAAM,CAAC,CAAC;AAAA,IAClD;AAEA,QAAI,SAAS,SAAS,QAAW;AAC7B,YAAM,IAAI,MAAM,qCAAqC;AAAA,IACzD;AAEA,WAAOG,oBAAmB,KAAK,QAAQ;AAAA,EAC3C;AAAA,EAEA,MAAM,gBAAgB,QAAgB,eAA8D;AAChG,QAAI,QAAQ;AACZ,WAAO,WAAW,iBAAiB,KAAK;AAEpC,YAAM,UAAU,MAAM,KAAK,sBAAsB,MAAM;AACvD,YAAM,WAAW,QAAQ;AACzB,UAAI,CAAC,OAAO,KAAK,QAAQ,EAAE,QAAQ;AAI/B,cAAM,MAAM,IAAI;AAChB;AAAA,MACJ;AAEA,UAAI,SAAS,WAAW,UAAa,SAAS,WAAW,UAAU;AAC/D,cAAM,QAAQ;AAAA;AAAA,UAEV,OAAOH,SAAQ,OAAO,SAAS,cAAc,EAAE;AAAA,UAC/C;AAAA,QACJ;AACA,cAAM,IAAI,MAAM,KAAK,UAAU,OAAO,MAAM,CAAC,CAAC;AAAA,MAClD;AAEA,UAAI,EAAE,oBAAoB,WAAW;AACjC,cAAM,QAAQ;AAAA,UACV,OAAO,wBAAwB,KAAK,UAAU,UAAU,MAAM,CAAC;AAAA,UAC/D;AAAA,QACJ;AACA,cAAM,IAAI,MAAM,KAAK,UAAU,OAAO,MAAM,CAAC,CAAC;AAAA,MAClD;AAEA,aAAO;AAAA,IACX;AACA,WAAO;AAAA,EACX;AAAA,EAEA,MAAM,eACF,aACA,MAC2B;AAE3B,UAAM,WAAW,MAAM,KAAK,gBAAgB,aAAa,IAAI,GAAG;AAUhE,UAAM,WAAW,MAAM,KAAK,gBAAgB,QAAQ,MAAM,MAAM,aAAa;AAC7E,WAAOI,oBAAmB,KAAK,QAAQ;AAAA,EAC3C;AACJ;;;ACtMA,SAAS,UAAAL,eAAc;AACvB,OAAOO,UAAS;AAChB,OAAON,cAAa;AAEpB;AAAA,EAEI,qBAAAO;AAAA,EAEA,sBAAAJ;AAAA,EACA,sBAAAC;AAAA,OAEG;AACP,SAAS,cAAc;AACvB,SAAS,uBAAAI,sBAAqB,kBAAkB;AAQzC,IAAM,cAAN,MAAM,YAA6B;AAAA,EAG9B,YAAY,QAAuB;AACvC,SAAK,eAAe;AAAA,EACxB;AAAA,EAOA,OAAO,KAAK,QAA0C,MAAuB;AACzE,QAAI,kBAAkBT,QAAO,QAAQ;AACjC,aAAO,IAAI,KAAK,MAAM;AAAA,IAC1B,WAAW,kBAAkBC,UAAS;AAClC,YAAM,SAAS,OAAO,SAAS,QAAQ,kBAAkB;AACzD,YAAM,WAAW,IAAID,QAAO,UAAU,gBAAgB;AAAA,QAClD,KAAK,wBAAwB,OAAO,SAAS,IAAI;AAAA,QACjD,SAAS,EAAE,GAAI,OAAO,WAAW,cAAc,EAAE,oBAAoB,OAAO,IAAI,CAAC,EAAG;AAAA,MACxF,CAAC;AAED,aAAO,IAAI,KAAK,IAAIA,QAAO,OAAO,OAAO,mBAA6B,QAAQ,CAAC;AAAA,IACnF,WAAW,OAAO,WAAW,YAAY,SAAS,QAAW;AACzD,aAAO,IAAI,KAAK,IAAIA,QAAO,OAAO,MAAM,CAAC;AAAA,IAC7C,WAAW,OAAO,WAAW,YAAY,SAAS,QAAW;AACzD,aAAO,IAAI,KAAKA,QAAO,OAAO,aAAa,QAAQ,IAAI,CAAC;AAAA,IAC5D,OAAO;AACH,YAAM,IAAI,MAAM,oBAAoB;AAAA,IACxC;AAAA,EACJ;AAAA,EAEA,IAAI,SAAkB;AAClB,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,QAAQ,UAA4B;AAChC,QAAI,EAAE,SAAS,kBAAkBA,QAAO,UAAU,kBAAkB;AAChE,YAAM,IAAI,MAAM,oCAAoC;AAAA,IACxD;AAEA,UAAM,SAAS,KAAK,aAAa,QAAQ,SAAS,MAAmC;AAGrF,IAAAA,QAAO,MAAM,eAAe,MAAM,gBAA8B,MAAa;AAE7E,WAAO;AAAA,EACX;AAAA,EAEA,OAAO,iBAAiB,QAAgC;AACpD,QAAI,kBAAkBA,QAAO,QAAQ;AACjC,UAAI,OAAO,oBAAoBA,QAAO,UAAU,iBAAiB;AAC7D,cAAM,SAAS,OAAO,SAAS,WAAW,UAAU,kBAAkB;AACtE,eAAO,KAAK,cAAc,OAAO,SAAS,WAAW,KAAK,OAAO,YAAY,MAAM;AAAA,MACvF;AAAA,IACJ;AACA,UAAM,IAAI,MAAM,oCAAoC;AAAA,EACxD;AAAA,EAaA,MAAM,aAA8B;AAEhC,WAAO,KAAK,aAAa,WAAW;AAAA,EACxC;AAAA,EAEA,MAAM,eAAe,aAAgC,OAA6C;AAC9F,UAAM,WAAW,MAAM,KAAK,gBAAgB,WAAW,GAAG;AAK1D,UAAM,QAAQ,KAAK;AACnB,UAAM,WAAW,MAAM,KAAK,aAAa,UAAU,sBAAsB,YAAY,QAAQ,IAAI,CAAC;AAClG,WAAOK,oBAAmB,KAAK,QAAQ;AAAA,EAC3C;AAAA,EAEA,MAAM,gBAAgB,aAA6D;AAE/E,UAAM,KAAK,YAAY;AACvB,QAAI,GAAG,SAAS,UAAa,GAAG,OAAO,QAAW;AAC9C,YAAM,IAAI,MAAM,yCAAyC;AAAA,IAC7D;AAEA,gBAAW,oBAAoB,EAAE;AACjC,UAAM,SAAS,YAAW,iBAAiB,KAAK,YAAY;AAC5D,UAAM,WAAW,MAAM;AAAA,MACnB;AAAA,QACI,MAAM,GAAG;AAAA,QACT,IAAI,GAAG;AAAA,QACP,UAAU,GAAG,UAAU,SAAS;AAAA,QAChC,UAAU,GAAG,UAAU,SAAS;AAAA,QAChC,OAAO,GAAG,OAAO,SAAS;AAAA;AAAA,MAE9B;AAAA,MACA;AAAA,IACJ;AACA,WAAOG,mBAAkB,KAAK,QAAQ;AAAA,EAC1C;AAAA,EAEA,MAAM,gBAAgB,aAAgC,cAAoD;AAEtG,UAAM,MAAM,YAAY;AAExB,UAAM,UAAU,YAAW,iBAAiB,KAAK,YAAY;AAC7D,UAAM,WAAW,MAAMC,qBAAoB,KAAK,OAAO;AACvD,WAAOL,oBAAmB,KAAK,QAAQ;AAAA,EAC3C;AAAA,EAEA,MAAM,WAAW,QAAyC;AAGtD,UAAM,gBAAgB,MAAM,KAAK,aAAa,YAAY,MAAM;AAChE,WAAOJ,QAAO,MAAM,SAAS,aAAa;AAAA,EAC9C;AAAA,EAEA,OAAO,oBAAoB,aAAmD;AAC1E,QAAI,YAAY,SAAS,UAAa,YAAY,OAAO,QAAW;AAChE,YAAM,IAAI,MAAM,yCAAyC;AAAA,IAC7D;AACA,WAAO;AAAA,EACX;AACJ;AAnIa,YA2DF,gBAAgBO;AAAA,EACnB,CAAC,KAAa,YAAoB,WAA6B;AAC3D,WAAO,IAAIN,SAAQ;AAAA,MACf,YAAY,OAAO,UAAU;AAAA,MAC7B,UAAU,wBAAwB,GAAG;AAAA,MACrC,SAAS,EAAE,GAAI,WAAW,SAAY,EAAE,oBAAoB,OAAO,IAAI,CAAC,EAAG;AAAA,IAC/E,CAAC;AAAA,EACL;AAAA,EACA,EAAE,UAAU,CAAC,eAAe,KAAK,UAAU,UAAU,EAAE;AAC3D;AApEG,IAAM,aAAN;;;ACrBP,SAAS,UAAAD,eAAc;AACvB,OAAOC,cAAa;AAEpB;AAAA,EAEI,qBAAAO;AAAA,EAEA,sBAAAJ;AAAA,EACA,sBAAAC;AAAA,OAEG;AACP,SAAS,UAAAK,eAAc;AACvB,SAAS,uBAAAD,sBAAqB,cAAAE,mBAAkB;AAWzC,IAAM,gBAAN,MAAM,eAAgC;AAAA,EAGjC,YAAY,QAAiB;AACjC,SAAK,eAAe;AAAA,EACxB;AAAA,EAMA,OAAO,KAAK,QAA0B,MAAuB;AACzD,UAAM,WAAW;AACjB,QAAI,kBAAkBV,UAAS;AAC3B,aAAO,IAAI,KAAK,MAAM;AAAA,IAC1B,WAAW,OAAO,WAAW,YAAY,SAAS,QAAW;AACzD,YAAM,aAAaS,QAAO,MAAM;AAChC,aAAO,IAAI,KAAK,IAAIT,SAAQ,EAAE,YAAY,SAAS,CAAC,CAAC;AAAA,IACzD,WAAW,OAAO,WAAW,YAAY,SAAS,QAAW;AACzD,YAAM,aAAaS,QAAOT,SAAQ,aAAa,QAAQ,IAAI,EAAE,UAAU;AACvE,aAAO,IAAI,KAAK,IAAIA,SAAQ,EAAE,YAAY,SAAS,CAAC,CAAC;AAAA,IACzD,OAAO;AACH,YAAM,IAAI,MAAM,oBAAoB;AAAA,IACxC;AAAA,EACJ;AAAA,EAEA,IAAI,SAAkB;AAClB,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,QAAQ,UAA4B;AAChC,UAAM,iBAAiB,SAAS;AAChC,UAAM,EAAE,UAAU,cAAc,YAAY,IAAI,eAAe,iBAAiB;AAKhF,SAAK,aAAa,YAAY,QAAQ;AACtC,SAAK,aAAa,gBAAgB,YAAY;AAC9C,SAAK,aAAa,eAAe,WAAW;AAC5C,WAAO;AAAA,EACX;AAAA,EAEA,MAAM,aAA8B;AAChC,QAAI,OAAO,KAAK,aAAa,eAAe,QAAQ,UAAU;AAC1D,YAAM,IAAI,MAAM,iBAAiB;AAAA,IACrC;AACA,UAAM,SAAS,KAAK,aAAa,eAAe,IAAI,QAAQ,OAAO,IAAI;AACvE,WAAO,QAAQ,QAAQ,MAAM;AAAA,EACjC;AAAA,EAEA,MAAM,eAAe,aAAgC,cAAoD;AACrG,UAAM,WAAW,MAAM,KAAK,gBAAgB,WAAW,GAAG;AAK1D,UAAM,WAAW,MAAM,QAAQ,KAAK;AACpC,WAAOI,oBAAmB,KAAK,QAAQ;AAAA,EAC3C;AAAA,EAEA,MAAM,gBAAgB,aAA6D;AAE/E,UAAM,KAAK,YAAY;AACvB,QAAI,GAAG,SAAS,UAAa,GAAG,OAAO,QAAW;AAC9C,YAAM,IAAI,MAAM,yCAAyC;AAAA,IAC7D;AAEA,mBAAc,oBAAoB,EAAE;AACpC,UAAM,WAAW,MAAMM;AAAA,MACnB;AAAA,QACI,MAAM,GAAG;AAAA,QACT,IAAI,GAAG;AAAA,QACP,UAAU,GAAG,UAAU,SAAS;AAAA,QAChC,UAAU,GAAG,UAAU,SAAS;AAAA,QAChC,OAAO,GAAG,OAAO,SAAS;AAAA;AAAA,MAE9B;AAAA,MACA,KAAK;AAAA,IACT;AACA,WAAOH,mBAAkB,KAAK,QAAQ;AAAA,EAC1C;AAAA,EAEA,MAAM,gBAAgB,aAAgC,cAAoD;AAEtG,UAAM,MAAM,YAAY;AAExB,UAAM,WAAW,MAAMC,qBAAoB,KAAK,KAAK,YAAY;AACjE,WAAOL,oBAAmB,KAAK,QAAQ;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,MAAM,WAAW,QAAyC;AAItD,QAAI,OAAO,KAAK,aAAa,sBAAsB,UAAU;AACzD,YAAM,IAAI,MAAM,qBAAqB;AAAA,IACzC;AACA,UAAM,gBAAgB,MAAMH,SAAQ,IAAI;AAAA,MACpCD,QAAO,MAAM,QAAQ,MAAM;AAAA,MAC3B,KAAK,aAAa;AAAA,MAClB;AAAA,IACJ;AACA,UAAM,SAASA,QAAO,MAAM,SAAS,aAAa;AAClD,WAAO,QAAQ,QAAQ,MAAM;AAAA,EACjC;AAAA,EAEA,OAAO,oBAAoB,aAAmD;AAC1E,QAAI,YAAY,SAAS,UAAa,YAAY,OAAO,QAAW;AAChE,YAAM,IAAI,MAAM,yCAAyC;AAAA,IAC7D;AACA,WAAO;AAAA,EACX;AACJ","sourcesContent":["import { ethers } from 'ethers'\nimport mem from 'mem'\nimport TronWeb from 'tronweb'\n\nimport {\n Block,\n BlockTag,\n BlockWithTransactions,\n Finality,\n Provider,\n SignedTransaction,\n TransactionPending,\n TransactionReceipt,\n TransactionResponse,\n} from '@layerzerolabs/lz-core'\nimport { StrategyFactory, sendTronTransaction } from '@layerzerolabs/tron-utilities'\n\nimport { toEtherFormat, toValidHash } from '../utils/tron'\n\n/**\n * TronProvider is a wrapper around TronWeb that implements the Provider interface\n * It is implemented using ethers.js\n */\nexport class TronProvider implements Provider {\n nativeProvider: ethers.providers.StaticJsonRpcProvider\n\n /**\n *\n * @param url RPC endpoint of the Tron full node, e.g. 'https://api.trongrid.io'\n * @param apiKey\n */\n private constructor(\n public url: string,\n apiKey?: string\n ) {\n this.nativeProvider = new ethers.providers.StaticJsonRpcProvider({\n url: StrategyFactory.get(url).asJSONRPC(url),\n headers: {\n // use object destructuring to conditionally add header\n ...(apiKey !== undefined ? { 'TRON-PRO-API-KEY': apiKey } : {}),\n },\n })\n }\n\n static from(url: string, apiKey?: string): TronProvider\n static from(client: TronWeb): TronProvider\n\n static from(source: string | TronWeb, apiKey?: string): TronProvider {\n if (typeof source === 'string') {\n return new this(source, apiKey)\n } else if (source instanceof TronWeb) {\n const { host, headers } = source.fullNode\n return this.from(host, headers['TRON-PRO-API-KEY'])\n } else {\n throw new Error('Invalid parameters')\n }\n }\n\n /**\n * Returns the native provider\n */\n get native(): unknown {\n return this.nativeProvider\n }\n\n private buildTronWebFrom = mem(\n (provider: ethers.providers.Provider): TronWeb => {\n if (provider instanceof ethers.providers.JsonRpcProvider) {\n const { url } = provider.connection\n const apiKey = provider.connection.headers?.['TRON-PRO-API-KEY'] as string | undefined\n\n return new TronWeb({\n privateKey: undefined,\n fullHost: StrategyFactory.get(url).asREST(url),\n headers: { ...(apiKey !== undefined ? { 'TRON-PRO-API-KEY': apiKey } : {}) },\n })\n }\n\n throw new Error(`The nativeSigner is not supported.`)\n },\n {\n cacheKey: (arguments_: [ethers.providers.Provider]): string => {\n const provider = arguments_[0]\n if (provider instanceof ethers.providers.JsonRpcProvider) {\n const { url } = provider.connection\n const apiKey = provider.connection.headers?.['TRON-PRO-API-KEY'] as string | undefined\n return JSON.stringify({ url, apiKey })\n }\n return JSON.stringify(provider)\n },\n }\n )\n\n async getBalance(address: string): Promise<string> {\n return this.nativeProvider.getBalance(toEtherFormat(address)).then((balance) => balance.toString())\n }\n\n async getBlock(blockTag: string | number): Promise<Block> {\n const response = await this.nativeProvider.getBlock(blockTag)\n return Block.from(response)\n }\n\n async getBlockWithTransactions(blockTag: string | number): Promise<BlockWithTransactions> {\n const response = await this.nativeProvider.getBlockWithTransactions(blockTag)\n return BlockWithTransactions.from(response)\n }\n\n async getBlockNumber(): Promise<number> {\n return this.nativeProvider.getBlockNumber()\n }\n\n async getBlockTimestamp(blockTag: string | number): Promise<number> {\n return this.nativeProvider.getBlock(blockTag).then((block) => block.timestamp)\n }\n\n async getSlot(_finality?: Finality): Promise<number> {\n await Promise.resolve()\n throw new Error('Method not implemented.')\n }\n\n async getTransaction(txHash: string): Promise<TransactionResponse> {\n const response = await this.nativeProvider.getTransaction(toValidHash(txHash))\n return TransactionResponse.from(response)\n }\n\n async getTransactionReceipt(txHash: string): Promise<TransactionReceipt> {\n const response = await this.nativeProvider.getTransactionReceipt(toValidHash(txHash))\n return TransactionReceipt.from(response)\n }\n\n async getTransactionCount(\n _addressOrName: string | Promise<string>,\n _blockTag?: BlockTag | Promise<BlockTag>\n ): Promise<number> {\n await Promise.resolve()\n throw new Error('Method not supported in Tron.')\n }\n\n async sendTransaction(transaction: SignedTransaction, _sendOptions?: object): Promise<TransactionPending> {\n // reference: https://developers.tron.network/reference/json-rpc-api-overview\n // eth_sendRawTransaction is not supported in the JSON-RPC API of the TRON network\n type NativeSignedTransaction = Parameters<typeof sendTronTransaction>[0]\n const stx = transaction.signed as NativeSignedTransaction\n const client = this.buildTronWebFrom(this.nativeProvider)\n const response = await sendTronTransaction(stx, client)\n\n return TransactionPending.from(response)\n }\n\n async sendAndConfirm(transaction: SignedTransaction, opts?: object): Promise<TransactionReceipt> {\n const pending = (await this.sendTransaction(transaction, opts)).pending as {\n txId: string\n result: unknown\n wait: () => Promise<unknown>\n }\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n const response = await pending.wait()\n return TransactionReceipt.from(response)\n }\n}\n","import { ethers } from 'ethers'\nimport TronWeb from 'tronweb'\n/**\n * ensureJsonRpcUrlPostfix ensures that the URL conforms to the TronGrid API convention by appending /jsonrpc if necessary.\n * @param url\n * @returns\n */\nexport function ensureJsonRpcUrlPostfix(url: string): string {\n // reference: https://developers.tron.network/docs/networks#mainnet\n // TronGrid API:https://api.trongrid.io\n // TronGrid JSON-RPC API: https://api.trongrid.io/jsonrpc\n // so that /jsonrpc is required to connect the JSON-RPC API endpoint\n const value = url.trim().replace(/\\/*$/, '')\n if (!value.endsWith('/jsonrpc')) {\n return value + '/jsonrpc'\n }\n return value\n}\n\n/**\n * removeJsonRpcUrlPostfix removes the /jsonrpc postfix from the URL\n */\nexport function removeJsonRpcUrlPostfix(url: string): string {\n return url.replace(/\\/jsonrpc$/, '')\n}\n\n/**\n * Convert a Tron address to a ethereum hex address\n * reference: https://developers.tron.network/docs/account#account-address-format\n * the TRON network account address can be a Hex format and Base58 format.\n * - The hex format is 42 characters long, removing the leading 41 from Hex format to get the Ethereum address.\n * - The Base58 format is 34 characters long, all Base58 addresses begin with T.\n * @param address\n * @returns\n */\nexport function toEtherFormat(address: string): string {\n if (address.startsWith('T') && address.length === 34) {\n return TronWeb.address.toHex(address).slice(2)\n } else if (address.startsWith('41') && address.length === 42) {\n return address.slice(2)\n } else {\n return address\n }\n}\n\n/**\n * Convert a transaction hash to a valid hash\n * reference: https://developers.tron.network/reference/eth_gettransactionbyhash\n * txHash should be a hex string with 0x, otherwise it will throw an error \"invalid hash\" - INVALID_ARGUMENT\n * @param txHash\n * @returns\n */\nexport function toValidHash(txHash: string): string {\n return ethers.utils.hexlify(txHash, { allowMissingPrefix: true })\n}\n","import TronWeb from 'tronweb'\n\nimport {\n Block,\n BlockTag,\n BlockWithTransactions,\n Finality,\n Provider,\n SignedTransaction,\n TransactionPending,\n TransactionReceipt,\n TransactionResponse,\n} from '@layerzerolabs/lz-core'\nimport { sleep } from '@layerzerolabs/lz-utilities'\n\nimport type { TransactionInfo } from 'tronweb'\n\n/**\n * TronWebProvider is a wrapper around TronWeb that implements the Provider interface\n *\n * PITFALL:\n * - This class is not compatible with ethers.js and is not fully tested.\n * - The format of the response from sendTransaction and the receipt from getTransactionReceipt differs\n * from that of the ethers provider.\n */\nexport class TronWebProvider implements Provider {\n nativeProvider: TronWeb\n\n /**\n * Create a new TronProvider\n * @param url RPC endpoint of the Tron full node, e.g. 'https://api.trongrid.io'\n * @param apiKey\n */\n constructor(\n public url: string,\n private apiKey?: string\n ) {\n this.nativeProvider = new TronWeb({\n fullHost: url,\n headers: {\n // use object destructuring to conditionally add header\n ...(apiKey !== undefined ? { 'TRON-PRO-API-KEY': apiKey } : {}),\n },\n })\n }\n\n static from(url: string, apiKey?: string): TronWebProvider\n\n static from(source: string, apiKey?: string): TronWebProvider {\n if (typeof source === 'string') {\n return new this(source, apiKey)\n } else {\n throw new Error('Invalid parameters')\n }\n }\n\n get native(): unknown {\n return this.nativeProvider\n }\n\n async getBalance(address: string): Promise<string> {\n return this.nativeProvider.trx.getBalance(address).then((balance: number) => balance.toString())\n }\n\n async getBlock(blockTag: string | number): Promise<Block> {\n const response = await this.nativeProvider.trx.getBlock(blockTag)\n return Block.from(response)\n }\n\n async getBlockWithTransactions(blockTag: string | number): Promise<BlockWithTransactions> {\n const response = await this.nativeProvider.trx.getBlock(blockTag)\n return BlockWithTransactions.from(response)\n }\n\n async getBlockNumber(): Promise<number> {\n return this.nativeProvider.trx\n .getBlock('latest')\n .then((block: { block_header: { raw_data: { number?: number } } }) => {\n if (block.block_header.raw_data.number === undefined) {\n throw new Error('Invalid block, block_header.raw_data.number is undefined')\n }\n return block.block_header.raw_data.number\n })\n }\n\n async getBlockTimestamp(blockTag: string | number): Promise<number> {\n return this.nativeProvider.trx\n .getBlock(blockTag)\n .then((block: { block_header: { raw_data: { timestamp?: number } } }) => {\n if (block.block_header.raw_data.timestamp === undefined) {\n throw new Error('Invalid block, block_header.raw_data.timestamp is undefined')\n }\n return block.block_header.raw_data.timestamp\n })\n }\n\n async getSlot(_finality?: Finality): Promise<number> {\n await Promise.resolve()\n throw new Error('Method not implemented.')\n }\n\n async getTransaction(txHash: string): Promise<TransactionResponse> {\n const response = await this.nativeProvider.trx.getTransaction(txHash)\n return TransactionResponse.from(response)\n }\n\n async getTransactionReceipt(txHash: string): Promise<TransactionReceipt> {\n // reference: https://developers.tron.network/reference/gettransactioninfobyid-1\n const response = await this.nativeProvider.trx.getTransactionInfo(txHash)\n return TransactionReceipt.from(response)\n }\n\n async getTransactionCount(\n _addressOrName: string | Promise<string>,\n _blockTag?: BlockTag | Promise<BlockTag>\n ): Promise<number> {\n await Promise.resolve()\n throw new Error('Method not supported in Tron.')\n }\n\n async sendTransaction(\n transaction: SignedTransaction,\n sendOptions?: { confirmations?: number }\n ): Promise<TransactionPending> {\n // reference: https://developers.tron.network/reference/broadcasttransaction\n type NativeSignedTransaction = Parameters<typeof this.nativeProvider.trx.sendRawTransaction>[0]\n const stx = transaction.signed as NativeSignedTransaction\n const response = await this.nativeProvider.trx.sendRawTransaction(stx, sendOptions)\n\n if (response.code !== undefined) {\n const error = {\n error: response.code,\n message: response.message !== undefined ? TronWeb.toUtf8(response.message) : response.code,\n }\n throw new Error(JSON.stringify(error, null, 2))\n }\n\n if (response.txid === undefined) {\n throw new Error('Invalid response, txid is undefined')\n }\n\n return TransactionPending.from(response)\n }\n\n async waitTransaction(txHash: string, confirmations?: number): Promise<TransactionInfo | undefined> {\n let tries = 0\n while (tries++ < (confirmations ?? 20)) {\n // FIXME: not fully implemented\n const receipt = await this.getTransactionReceipt(txHash)\n const response = receipt.receipt as TransactionInfo\n if (!Object.keys(response).length) {\n // reference: https://developers.tron.network/page/faq\n // Within current testing environment, one block is produced every 3 seconds.\n // But for the local environment, it may take 1 minute to produce a block.\n await sleep(1200)\n continue\n }\n\n if (response.result !== undefined && response.result === 'FAILED') {\n const error = {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n error: TronWeb.toUtf8(response.resMessage ?? ''),\n response: response,\n }\n throw new Error(JSON.stringify(error, null, 2))\n }\n\n if (!('contractResult' in response)) {\n const error = {\n error: 'Failed to execute: ' + JSON.stringify(response, null, 2),\n response: response,\n }\n throw new Error(JSON.stringify(error, null, 2))\n }\n\n return response\n }\n return undefined\n }\n\n async sendAndConfirm(\n transaction: SignedTransaction,\n opts?: { confirmations?: number }\n ): Promise<TransactionReceipt> {\n // reference: https://developers.tron.network/reference/broadcasttransaction\n const pending = (await this.sendTransaction(transaction, opts)).pending as {\n result: boolean\n txid: string\n code: string\n message: string\n transaction: unknown\n wait: (confirmations?: number) => Promise<unknown>\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n const response = await this.waitTransaction(pending.txid, opts?.confirmations)\n return TransactionReceipt.from(response)\n }\n}\n","import { ethers } from 'ethers'\nimport mem from 'mem'\nimport TronWeb from 'tronweb'\n\nimport {\n Provider,\n SignedTransaction,\n Signer,\n TransactionPending,\n TransactionReceipt,\n TransactionRequest,\n} from '@layerzerolabs/lz-core'\nimport { trim0x } from '@layerzerolabs/lz-utilities'\nimport { sendTronTransaction, signTronTx } from '@layerzerolabs/tron-utilities'\n\nimport { ensureJsonRpcUrlPostfix, removeJsonRpcUrlPostfix, toValidHash } from '../utils/tron'\n\n/**\n * TronSigner is a wrapper around TronWeb that implements the Signer interface\n * It is implemented using ethers.js\n */\nexport class TronSigner implements Signer {\n private readonly nativeSigner: ethers.Signer\n\n private constructor(signer: ethers.Signer) {\n this.nativeSigner = signer\n }\n\n static from(source: ethers.Signer): Signer\n static from(client: TronWeb): Signer\n static from(privKey: string): Signer\n static from(mnemonic: string, path: string): Signer\n\n static from(source: ethers.Signer | TronWeb | string, path?: string): Signer {\n if (source instanceof ethers.Signer) {\n return new this(source)\n } else if (source instanceof TronWeb) {\n const apiKey = source.fullNode.headers['TRON-PRO-API-KEY']\n const provider = new ethers.providers.JsonRpcProvider({\n url: ensureJsonRpcUrlPostfix(source.fullNode.host),\n headers: { ...(typeof apiKey !== 'undefined' ? { 'TRON-PRO-API-KEY': apiKey } : {}) },\n })\n\n return new this(new ethers.Wallet(source.defaultPrivateKey as string, provider))\n } else if (typeof source === 'string' && path === undefined) {\n return new this(new ethers.Wallet(source))\n } else if (typeof source === 'string' && path !== undefined) {\n return new this(ethers.Wallet.fromMnemonic(source, path))\n } else {\n throw new Error('Invalid parameters')\n }\n }\n\n get native(): unknown {\n return this.nativeSigner\n }\n\n connect(provider: Provider): Signer {\n if (!(provider.native instanceof ethers.providers.JsonRpcProvider)) {\n throw new Error('Only JsonRpcProvider is supported.')\n }\n\n const signer = this.nativeSigner.connect(provider.native as ethers.providers.Provider)\n // hack: ethers.utils.defineReadOnly does not work with private properties\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument, @typescript-eslint/no-explicit-any\n ethers.utils.defineReadOnly(this, 'nativeSigner' as keyof this, signer as any)\n\n return this\n }\n\n static buildTronWebFrom(signer: ethers.Signer): TronWeb {\n if (signer instanceof ethers.Wallet) {\n if (signer.provider instanceof ethers.providers.JsonRpcProvider) {\n const apiKey = signer.provider.connection.headers?.['TRON-PRO-API-KEY'] as string | undefined\n return this.createTronWeb(signer.provider.connection.url, signer.privateKey, apiKey)\n }\n }\n throw new Error(`The nativeSigner is not supported.`)\n }\n\n static createTronWeb = mem(\n (url: string, privateKey: string, apiKey?: string): TronWeb => {\n return new TronWeb({\n privateKey: trim0x(privateKey),\n fullHost: removeJsonRpcUrlPostfix(url),\n headers: { ...(apiKey !== undefined ? { 'TRON-PRO-API-KEY': apiKey } : {}) },\n })\n },\n { cacheKey: (arguments_) => JSON.stringify(arguments_) }\n )\n\n async getAddress(): Promise<string> {\n // reference: https://developers.tron.network/docs/tvm#differences-from-evm\n return this.nativeSigner.getAddress()\n }\n\n async sendAndConfirm(transaction: SignedTransaction, _opts?: object): Promise<TransactionReceipt> {\n const pending = (await this.sendTransaction(transaction)).pending as {\n txId: string\n wait: () => unknown\n }\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n await pending.wait()\n const response = await this.nativeSigner.provider?.getTransactionReceipt(toValidHash(pending.txId))\n return TransactionReceipt.from(response)\n }\n\n async signTransaction(transaction: TransactionRequest): Promise<SignedTransaction> {\n type NativeSignedTransaction = ethers.PopulatedTransaction\n const tx = transaction.request as NativeSignedTransaction\n if (tx.data === undefined || tx.to === undefined) {\n throw new Error('Invalid transaction, missing data or to')\n }\n\n TronSigner.validateTransaction(tx)\n const client = TronSigner.buildTronWebFrom(this.nativeSigner)\n const response = await signTronTx(\n {\n data: tx.data,\n to: tx.to,\n gasLimit: tx.gasLimit?.toNumber(),\n gasPrice: tx.gasPrice?.toNumber(),\n value: tx.value?.toNumber(),\n // energyFactor: transaction.energyFactor, // TODO: add energyFactor\n },\n client\n )\n return SignedTransaction.from(response)\n }\n\n async sendTransaction(transaction: SignedTransaction, _sendOptions?: object): Promise<TransactionPending> {\n type NativeSignedTransaction = Parameters<typeof sendTronTransaction>[0]\n const stx = transaction.signed as NativeSignedTransaction\n\n const tronWeb = TronSigner.buildTronWebFrom(this.nativeSigner)\n const response = await sendTronTransaction(stx, tronWeb)\n return TransactionPending.from(response)\n }\n\n async signBuffer(buffer: Uint8Array): Promise<Uint8Array> {\n // ETH_MESSAGE_HEADER is defined as '\\x19Ethereum Signed Message:\\n32' in TronWeb,\n // which will cause the signature to be different from ethers.js if the message length is not 32 bytes\n const signedMessage = await this.nativeSigner.signMessage(buffer)\n return ethers.utils.arrayify(signedMessage)\n }\n\n static validateTransaction(transaction: ethers.PopulatedTransaction): boolean {\n if (transaction.data === undefined || transaction.to === undefined) {\n throw new Error('Invalid transaction, missing data or to')\n }\n return true\n }\n}\n","import { ethers } from 'ethers'\nimport TronWeb from 'tronweb'\n\nimport {\n Provider,\n SignedTransaction,\n Signer,\n TransactionPending,\n TransactionReceipt,\n TransactionRequest,\n} from '@layerzerolabs/lz-core'\nimport { trim0x } from '@layerzerolabs/lz-utilities'\nimport { sendTronTransaction, signTronTx } from '@layerzerolabs/tron-utilities'\n\n/**\n * TronWebSigner is a wrapper around TronWeb that implements the Signer interface\n *\n * PITFALL:\n * - This class is not compatible with ethers.js and is not fully tested.\n * - The signature produced by signBuffer is different from the ethers signer\n * when the message length is not 32 bytes\n * - The format of the response from sendTransaction differs from that of the ethers signer.\n */\nexport class TronWebSigner implements Signer {\n private readonly nativeSigner: TronWeb\n\n private constructor(signer: TronWeb) {\n this.nativeSigner = signer\n }\n\n static from(signer: TronWeb): Signer\n static from(privKey: string): Signer\n static from(mnemonic: string, path?: string): Signer\n\n static from(source: TronWeb | string, path?: string): Signer {\n const fullHost = 'https://api.trongrid.io'\n if (source instanceof TronWeb) {\n return new this(source)\n } else if (typeof source === 'string' && path === undefined) {\n const privateKey = trim0x(source)\n return new this(new TronWeb({ privateKey, fullHost }))\n } else if (typeof source === 'string' && path !== undefined) {\n const privateKey = trim0x(TronWeb.fromMnemonic(source, path).privateKey)\n return new this(new TronWeb({ privateKey, fullHost }))\n } else {\n throw new Error('Invalid parameters')\n }\n }\n\n get native(): unknown {\n return this.nativeSigner\n }\n\n connect(provider: Provider): Signer {\n const nativeProvider = provider.native as TronWeb\n const { fullNode, solidityNode, eventServer } = nativeProvider.currentProviders() as {\n fullNode: unknown\n solidityNode: unknown\n eventServer: unknown\n }\n this.nativeSigner.setFullNode(fullNode)\n this.nativeSigner.setSolidityNode(solidityNode)\n this.nativeSigner.setEventServer(eventServer)\n return this\n }\n\n async getAddress(): Promise<string> {\n if (typeof this.nativeSigner.defaultAddress.hex !== 'string') {\n throw new Error('Invalid address')\n }\n const retval = this.nativeSigner.defaultAddress.hex.replace(/^41/, '0x')\n return Promise.resolve(retval)\n }\n\n async sendAndConfirm(transaction: SignedTransaction, _sendOptions?: object): Promise<TransactionReceipt> {\n const pending = (await this.sendTransaction(transaction)).pending as {\n txId: string\n wait: () => unknown\n }\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n const response = await pending.wait()\n return TransactionReceipt.from(response)\n }\n\n async signTransaction(transaction: TransactionRequest): Promise<SignedTransaction> {\n type NativeSignedTransaction = ethers.PopulatedTransaction\n const tx = transaction.request as NativeSignedTransaction\n if (tx.data === undefined || tx.to === undefined) {\n throw new Error('Invalid transaction, missing data or to')\n }\n\n TronWebSigner.validateTransaction(tx)\n const response = await signTronTx(\n {\n data: tx.data,\n to: tx.to,\n gasLimit: tx.gasLimit?.toNumber(),\n gasPrice: tx.gasPrice?.toNumber(),\n value: tx.value?.toNumber(),\n // energyFactor: transaction.energyFactor, // FIXME: add energyFactor\n },\n this.nativeSigner\n )\n return SignedTransaction.from(response)\n }\n\n async sendTransaction(transaction: SignedTransaction, _sendOptions?: object): Promise<TransactionPending> {\n type NativeSignedTransaction = Parameters<typeof sendTronTransaction>[0]\n const stx = transaction.signed as NativeSignedTransaction\n\n const response = await sendTronTransaction(stx, this.nativeSigner)\n return TransactionPending.from(response)\n }\n\n /**\n * signBuffer signs a buffer using the native signer\n * but the signString function of native signer is different from the ethers signer,\n * TronWeb uses a message header with a fixed 32 bytes length, which means that only if\n * the message length is 32 bytes, the signature will be the same as the ethereum signature.\n * you can find the signString function here:\n * https://github.com/tronprotocol/tronweb/blob/master/src/lib/trx.js\n * @param buffer\n * @returns\n */\n async signBuffer(buffer: Uint8Array): Promise<Uint8Array> {\n // ETH_MESSAGE_HEADER is defined as '\\x19Ethereum Signed Message:\\n32',\n // so that the signature will be the same as the ethereum signature only if\n // the message length is 32 bytes.\n if (typeof this.nativeSigner.defaultPrivateKey !== 'string') {\n throw new Error('Invalid private key')\n }\n const signedMessage = await TronWeb.Trx.signString(\n ethers.utils.hexlify(buffer),\n this.nativeSigner.defaultPrivateKey,\n false\n )\n const retval = ethers.utils.arrayify(signedMessage)\n return Promise.resolve(retval)\n }\n\n static validateTransaction(transaction: ethers.PopulatedTransaction): boolean {\n if (transaction.data === undefined || transaction.to === undefined) {\n throw new Error('Invalid transaction, missing data or to')\n }\n return true\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/providers/tron.ts","../src/utils/tron.ts","../src/providers/tronweb.ts","../src/signers/tron.ts","../src/signers/tronweb.ts"],"names":["ethers","TronWeb","Block","BlockWithTransactions","TransactionPending","TransactionReceipt","TransactionResponse","mem","SignedTransaction","sendTronTransaction","trim0x","signTronTx"],"mappings":"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","sourcesContent":["import { ethers } from 'ethers'\nimport mem from 'mem'\nimport TronWeb from 'tronweb'\n\nimport {\n Block,\n BlockTag,\n BlockWithTransactions,\n Finality,\n Provider,\n SignedTransaction,\n TransactionPending,\n TransactionReceipt,\n TransactionResponse,\n} from '@layerzerolabs/lz-core'\nimport { StrategyFactory, sendTronTransaction } from '@layerzerolabs/tron-utilities'\n\nimport { toEtherFormat, toValidHash } from '../utils/tron'\n\n/**\n * TronProvider is a wrapper around TronWeb that implements the Provider interface\n * It is implemented using ethers.js\n */\nexport class TronProvider implements Provider {\n nativeProvider: ethers.providers.StaticJsonRpcProvider\n\n /**\n *\n * @param url RPC endpoint of the Tron full node, e.g. 'https://api.trongrid.io'\n * @param apiKey\n */\n private constructor(\n public url: string,\n apiKey?: string\n ) {\n this.nativeProvider = new ethers.providers.StaticJsonRpcProvider({\n url: StrategyFactory.get(url).asJSONRPC(url),\n headers: {\n // use object destructuring to conditionally add header\n ...(apiKey !== undefined ? { 'TRON-PRO-API-KEY': apiKey } : {}),\n },\n })\n }\n\n static from(url: string, apiKey?: string): TronProvider\n static from(client: TronWeb): TronProvider\n\n static from(source: string | TronWeb, apiKey?: string): TronProvider {\n if (typeof source === 'string') {\n return new this(source, apiKey)\n } else if (source instanceof TronWeb) {\n const { host, headers } = source.fullNode\n return this.from(host, headers['TRON-PRO-API-KEY'])\n } else {\n throw new Error('Invalid parameters')\n }\n }\n\n /**\n * Returns the native provider\n */\n get native(): unknown {\n return this.nativeProvider\n }\n\n private buildTronWebFrom = mem(\n (provider: ethers.providers.Provider): TronWeb => {\n if (provider instanceof ethers.providers.JsonRpcProvider) {\n const { url } = provider.connection\n const apiKey = provider.connection.headers?.['TRON-PRO-API-KEY'] as string | undefined\n\n return new TronWeb({\n privateKey: undefined,\n fullHost: StrategyFactory.get(url).asREST(url),\n headers: { ...(apiKey !== undefined ? { 'TRON-PRO-API-KEY': apiKey } : {}) },\n })\n }\n\n throw new Error(`The nativeSigner is not supported.`)\n },\n {\n cacheKey: (arguments_: [ethers.providers.Provider]): string => {\n const provider = arguments_[0]\n if (provider instanceof ethers.providers.JsonRpcProvider) {\n const { url } = provider.connection\n const apiKey = provider.connection.headers?.['TRON-PRO-API-KEY'] as string | undefined\n return JSON.stringify({ url, apiKey })\n }\n return JSON.stringify(provider)\n },\n }\n )\n\n async getBalance(address: string): Promise<string> {\n return this.nativeProvider.getBalance(toEtherFormat(address)).then((balance) => balance.toString())\n }\n\n async getBlock(blockTag: string | number): Promise<Block> {\n const response = await this.nativeProvider.getBlock(blockTag)\n return Block.from(response)\n }\n\n async getBlockWithTransactions(blockTag: string | number): Promise<BlockWithTransactions> {\n const response = await this.nativeProvider.getBlockWithTransactions(blockTag)\n return BlockWithTransactions.from(response)\n }\n\n async getBlockNumber(): Promise<number> {\n return this.nativeProvider.getBlockNumber()\n }\n\n async getBlockTimestamp(blockTag: string | number): Promise<number> {\n return this.nativeProvider.getBlock(blockTag).then((block) => block.timestamp)\n }\n\n async getSlot(_finality?: Finality): Promise<number> {\n await Promise.resolve()\n throw new Error('Method not implemented.')\n }\n\n async getTransaction(txHash: string): Promise<TransactionResponse> {\n const response = await this.nativeProvider.getTransaction(toValidHash(txHash))\n return TransactionResponse.from(response)\n }\n\n async getTransactionReceipt(txHash: string): Promise<TransactionReceipt> {\n const response = await this.nativeProvider.getTransactionReceipt(toValidHash(txHash))\n return TransactionReceipt.from(response)\n }\n\n async getTransactionCount(\n _addressOrName: string | Promise<string>,\n _blockTag?: BlockTag | Promise<BlockTag>\n ): Promise<number> {\n await Promise.resolve()\n throw new Error('Method not supported in Tron.')\n }\n\n async sendTransaction(transaction: SignedTransaction, _sendOptions?: object): Promise<TransactionPending> {\n // reference: https://developers.tron.network/reference/json-rpc-api-overview\n // eth_sendRawTransaction is not supported in the JSON-RPC API of the TRON network\n type NativeSignedTransaction = Parameters<typeof sendTronTransaction>[0]\n const stx = transaction.signed as NativeSignedTransaction\n const client = this.buildTronWebFrom(this.nativeProvider)\n const response = await sendTronTransaction(stx, client)\n\n return TransactionPending.from(response)\n }\n\n async sendAndConfirm(transaction: SignedTransaction, opts?: object): Promise<TransactionReceipt> {\n const pending = (await this.sendTransaction(transaction, opts)).pending as {\n txId: string\n result: unknown\n wait: () => Promise<unknown>\n }\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n const response = await pending.wait()\n return TransactionReceipt.from(response)\n }\n}\n","import { ethers } from 'ethers'\nimport TronWeb from 'tronweb'\n/**\n * ensureJsonRpcUrlPostfix ensures that the URL conforms to the TronGrid API convention by appending /jsonrpc if necessary.\n * @param url\n * @returns\n */\nexport function ensureJsonRpcUrlPostfix(url: string): string {\n // reference: https://developers.tron.network/docs/networks#mainnet\n // TronGrid API:https://api.trongrid.io\n // TronGrid JSON-RPC API: https://api.trongrid.io/jsonrpc\n // so that /jsonrpc is required to connect the JSON-RPC API endpoint\n const value = url.trim().replace(/\\/*$/, '')\n if (!value.endsWith('/jsonrpc')) {\n return value + '/jsonrpc'\n }\n return value\n}\n\n/**\n * removeJsonRpcUrlPostfix removes the /jsonrpc postfix from the URL\n */\nexport function removeJsonRpcUrlPostfix(url: string): string {\n return url.replace(/\\/jsonrpc$/, '')\n}\n\n/**\n * Convert a Tron address to a ethereum hex address\n * reference: https://developers.tron.network/docs/account#account-address-format\n * the TRON network account address can be a Hex format and Base58 format.\n * - The hex format is 42 characters long, removing the leading 41 from Hex format to get the Ethereum address.\n * - The Base58 format is 34 characters long, all Base58 addresses begin with T.\n * @param address\n * @returns\n */\nexport function toEtherFormat(address: string): string {\n if (address.startsWith('T') && address.length === 34) {\n return TronWeb.address.toHex(address).slice(2)\n } else if (address.startsWith('41') && address.length === 42) {\n return address.slice(2)\n } else {\n return address\n }\n}\n\n/**\n * Convert a transaction hash to a valid hash\n * reference: https://developers.tron.network/reference/eth_gettransactionbyhash\n * txHash should be a hex string with 0x, otherwise it will throw an error \"invalid hash\" - INVALID_ARGUMENT\n * @param txHash\n * @returns\n */\nexport function toValidHash(txHash: string): string {\n return ethers.utils.hexlify(txHash, { allowMissingPrefix: true })\n}\n","import TronWeb from 'tronweb'\n\nimport {\n Block,\n BlockTag,\n BlockWithTransactions,\n Finality,\n Provider,\n SignedTransaction,\n TransactionPending,\n TransactionReceipt,\n TransactionResponse,\n} from '@layerzerolabs/lz-core'\nimport { sleep } from '@layerzerolabs/lz-utilities'\n\nimport type { TransactionInfo } from 'tronweb'\n\n/**\n * TronWebProvider is a wrapper around TronWeb that implements the Provider interface\n *\n * PITFALL:\n * - This class is not compatible with ethers.js and is not fully tested.\n * - The format of the response from sendTransaction and the receipt from getTransactionReceipt differs\n * from that of the ethers provider.\n */\nexport class TronWebProvider implements Provider {\n nativeProvider: TronWeb\n\n /**\n * Create a new TronProvider\n * @param url RPC endpoint of the Tron full node, e.g. 'https://api.trongrid.io'\n * @param apiKey\n */\n constructor(\n public url: string,\n private apiKey?: string\n ) {\n this.nativeProvider = new TronWeb({\n fullHost: url,\n headers: {\n // use object destructuring to conditionally add header\n ...(apiKey !== undefined ? { 'TRON-PRO-API-KEY': apiKey } : {}),\n },\n })\n }\n\n static from(url: string, apiKey?: string): TronWebProvider\n\n static from(source: string, apiKey?: string): TronWebProvider {\n if (typeof source === 'string') {\n return new this(source, apiKey)\n } else {\n throw new Error('Invalid parameters')\n }\n }\n\n get native(): unknown {\n return this.nativeProvider\n }\n\n async getBalance(address: string): Promise<string> {\n return this.nativeProvider.trx.getBalance(address).then((balance: number) => balance.toString())\n }\n\n async getBlock(blockTag: string | number): Promise<Block> {\n const response = await this.nativeProvider.trx.getBlock(blockTag)\n return Block.from(response)\n }\n\n async getBlockWithTransactions(blockTag: string | number): Promise<BlockWithTransactions> {\n const response = await this.nativeProvider.trx.getBlock(blockTag)\n return BlockWithTransactions.from(response)\n }\n\n async getBlockNumber(): Promise<number> {\n return this.nativeProvider.trx\n .getBlock('latest')\n .then((block: { block_header: { raw_data: { number?: number } } }) => {\n if (block.block_header.raw_data.number === undefined) {\n throw new Error('Invalid block, block_header.raw_data.number is undefined')\n }\n return block.block_header.raw_data.number\n })\n }\n\n async getBlockTimestamp(blockTag: string | number): Promise<number> {\n return this.nativeProvider.trx\n .getBlock(blockTag)\n .then((block: { block_header: { raw_data: { timestamp?: number } } }) => {\n if (block.block_header.raw_data.timestamp === undefined) {\n throw new Error('Invalid block, block_header.raw_data.timestamp is undefined')\n }\n return block.block_header.raw_data.timestamp\n })\n }\n\n async getSlot(_finality?: Finality): Promise<number> {\n await Promise.resolve()\n throw new Error('Method not implemented.')\n }\n\n async getTransaction(txHash: string): Promise<TransactionResponse> {\n const response = await this.nativeProvider.trx.getTransaction(txHash)\n return TransactionResponse.from(response)\n }\n\n async getTransactionReceipt(txHash: string): Promise<TransactionReceipt> {\n // reference: https://developers.tron.network/reference/gettransactioninfobyid-1\n const response = await this.nativeProvider.trx.getTransactionInfo(txHash)\n return TransactionReceipt.from(response)\n }\n\n async getTransactionCount(\n _addressOrName: string | Promise<string>,\n _blockTag?: BlockTag | Promise<BlockTag>\n ): Promise<number> {\n await Promise.resolve()\n throw new Error('Method not supported in Tron.')\n }\n\n async sendTransaction(\n transaction: SignedTransaction,\n sendOptions?: { confirmations?: number }\n ): Promise<TransactionPending> {\n // reference: https://developers.tron.network/reference/broadcasttransaction\n type NativeSignedTransaction = Parameters<typeof this.nativeProvider.trx.sendRawTransaction>[0]\n const stx = transaction.signed as NativeSignedTransaction\n const response = await this.nativeProvider.trx.sendRawTransaction(stx, sendOptions)\n\n if (response.code !== undefined) {\n const error = {\n error: response.code,\n message: response.message !== undefined ? TronWeb.toUtf8(response.message) : response.code,\n }\n throw new Error(JSON.stringify(error, null, 2))\n }\n\n if (response.txid === undefined) {\n throw new Error('Invalid response, txid is undefined')\n }\n\n return TransactionPending.from(response)\n }\n\n async waitTransaction(txHash: string, confirmations?: number): Promise<TransactionInfo | undefined> {\n let tries = 0\n while (tries++ < (confirmations ?? 20)) {\n // FIXME: not fully implemented\n const receipt = await this.getTransactionReceipt(txHash)\n const response = receipt.receipt as TransactionInfo\n if (!Object.keys(response).length) {\n // reference: https://developers.tron.network/page/faq\n // Within current testing environment, one block is produced every 3 seconds.\n // But for the local environment, it may take 1 minute to produce a block.\n await sleep(1200)\n continue\n }\n\n if (response.result !== undefined && response.result === 'FAILED') {\n const error = {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n error: TronWeb.toUtf8(response.resMessage ?? ''),\n response: response,\n }\n throw new Error(JSON.stringify(error, null, 2))\n }\n\n if (!('contractResult' in response)) {\n const error = {\n error: 'Failed to execute: ' + JSON.stringify(response, null, 2),\n response: response,\n }\n throw new Error(JSON.stringify(error, null, 2))\n }\n\n return response\n }\n return undefined\n }\n\n async sendAndConfirm(\n transaction: SignedTransaction,\n opts?: { confirmations?: number }\n ): Promise<TransactionReceipt> {\n // reference: https://developers.tron.network/reference/broadcasttransaction\n const pending = (await this.sendTransaction(transaction, opts)).pending as {\n result: boolean\n txid: string\n code: string\n message: string\n transaction: unknown\n wait: (confirmations?: number) => Promise<unknown>\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n const response = await this.waitTransaction(pending.txid, opts?.confirmations)\n return TransactionReceipt.from(response)\n }\n}\n","import { ethers } from 'ethers'\nimport mem from 'mem'\nimport TronWeb from 'tronweb'\n\nimport {\n Provider,\n SignedTransaction,\n Signer,\n TransactionPending,\n TransactionReceipt,\n TransactionRequest,\n} from '@layerzerolabs/lz-core'\nimport { trim0x } from '@layerzerolabs/lz-utilities'\nimport { sendTronTransaction, signTronTx } from '@layerzerolabs/tron-utilities'\n\nimport { ensureJsonRpcUrlPostfix, removeJsonRpcUrlPostfix, toValidHash } from '../utils/tron'\n\n/**\n * TronSigner is a wrapper around TronWeb that implements the Signer interface\n * It is implemented using ethers.js\n */\nexport class TronSigner implements Signer {\n private readonly nativeSigner: ethers.Signer\n\n private constructor(signer: ethers.Signer) {\n this.nativeSigner = signer\n }\n\n static from(source: ethers.Signer): Signer\n static from(client: TronWeb): Signer\n static from(privKey: string): Signer\n static from(mnemonic: string, path: string): Signer\n\n static from(source: ethers.Signer | TronWeb | string, path?: string): Signer {\n if (source instanceof ethers.Signer) {\n return new this(source)\n } else if (source instanceof TronWeb) {\n const apiKey = source.fullNode.headers['TRON-PRO-API-KEY']\n const provider = new ethers.providers.JsonRpcProvider({\n url: ensureJsonRpcUrlPostfix(source.fullNode.host),\n headers: { ...(typeof apiKey !== 'undefined' ? { 'TRON-PRO-API-KEY': apiKey } : {}) },\n })\n\n return new this(new ethers.Wallet(source.defaultPrivateKey as string, provider))\n } else if (typeof source === 'string' && path === undefined) {\n return new this(new ethers.Wallet(source))\n } else if (typeof source === 'string' && path !== undefined) {\n return new this(ethers.Wallet.fromMnemonic(source, path))\n } else {\n throw new Error('Invalid parameters')\n }\n }\n\n get native(): unknown {\n return this.nativeSigner\n }\n\n connect(provider: Provider): Signer {\n if (!(provider.native instanceof ethers.providers.JsonRpcProvider)) {\n throw new Error('Only JsonRpcProvider is supported.')\n }\n\n const signer = this.nativeSigner.connect(provider.native as ethers.providers.Provider)\n // hack: ethers.utils.defineReadOnly does not work with private properties\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument, @typescript-eslint/no-explicit-any\n ethers.utils.defineReadOnly(this, 'nativeSigner' as keyof this, signer as any)\n\n return this\n }\n\n static buildTronWebFrom(signer: ethers.Signer): TronWeb {\n if (signer instanceof ethers.Wallet) {\n if (signer.provider instanceof ethers.providers.JsonRpcProvider) {\n const apiKey = signer.provider.connection.headers?.['TRON-PRO-API-KEY'] as string | undefined\n return this.createTronWeb(signer.provider.connection.url, signer.privateKey, apiKey)\n }\n }\n throw new Error(`The nativeSigner is not supported.`)\n }\n\n static createTronWeb = mem(\n (url: string, privateKey: string, apiKey?: string): TronWeb => {\n return new TronWeb({\n privateKey: trim0x(privateKey),\n fullHost: removeJsonRpcUrlPostfix(url),\n headers: { ...(apiKey !== undefined ? { 'TRON-PRO-API-KEY': apiKey } : {}) },\n })\n },\n { cacheKey: (arguments_) => JSON.stringify(arguments_) }\n )\n\n async getAddress(): Promise<string> {\n // reference: https://developers.tron.network/docs/tvm#differences-from-evm\n return this.nativeSigner.getAddress()\n }\n\n async sendAndConfirm(transaction: SignedTransaction, _opts?: object): Promise<TransactionReceipt> {\n const pending = (await this.sendTransaction(transaction)).pending as {\n txId: string\n wait: () => unknown\n }\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n await pending.wait()\n const response = await this.nativeSigner.provider?.getTransactionReceipt(toValidHash(pending.txId))\n return TransactionReceipt.from(response)\n }\n\n async signTransaction(transaction: TransactionRequest): Promise<SignedTransaction> {\n type NativeSignedTransaction = ethers.PopulatedTransaction\n const tx = transaction.request as NativeSignedTransaction\n if (tx.data === undefined || tx.to === undefined) {\n throw new Error('Invalid transaction, missing data or to')\n }\n\n TronSigner.validateTransaction(tx)\n const client = TronSigner.buildTronWebFrom(this.nativeSigner)\n const response = await signTronTx(\n {\n data: tx.data,\n to: tx.to,\n gasLimit: tx.gasLimit?.toNumber(),\n gasPrice: tx.gasPrice?.toNumber(),\n value: tx.value?.toNumber(),\n // energyFactor: transaction.energyFactor, // TODO: add energyFactor\n },\n client\n )\n return SignedTransaction.from(response)\n }\n\n async sendTransaction(transaction: SignedTransaction, _sendOptions?: object): Promise<TransactionPending> {\n type NativeSignedTransaction = Parameters<typeof sendTronTransaction>[0]\n const stx = transaction.signed as NativeSignedTransaction\n\n const tronWeb = TronSigner.buildTronWebFrom(this.nativeSigner)\n const response = await sendTronTransaction(stx, tronWeb)\n return TransactionPending.from(response)\n }\n\n async signBuffer(buffer: Uint8Array): Promise<Uint8Array> {\n // ETH_MESSAGE_HEADER is defined as '\\x19Ethereum Signed Message:\\n32' in TronWeb,\n // which will cause the signature to be different from ethers.js if the message length is not 32 bytes\n const signedMessage = await this.nativeSigner.signMessage(buffer)\n return ethers.utils.arrayify(signedMessage)\n }\n\n static validateTransaction(transaction: ethers.PopulatedTransaction): boolean {\n if (transaction.data === undefined || transaction.to === undefined) {\n throw new Error('Invalid transaction, missing data or to')\n }\n return true\n }\n\n async buildTransaction(buildTxRequest: unknown): Promise<TransactionRequest> {\n return Promise.reject(new Error('Method not implemented.'))\n }\n}\n","import { ethers } from 'ethers'\nimport TronWeb from 'tronweb'\n\nimport {\n Provider,\n SignedTransaction,\n Signer,\n TransactionPending,\n TransactionReceipt,\n TransactionRequest,\n} from '@layerzerolabs/lz-core'\nimport { trim0x } from '@layerzerolabs/lz-utilities'\nimport { sendTronTransaction, signTronTx } from '@layerzerolabs/tron-utilities'\n\n/**\n * TronWebSigner is a wrapper around TronWeb that implements the Signer interface\n *\n * PITFALL:\n * - This class is not compatible with ethers.js and is not fully tested.\n * - The signature produced by signBuffer is different from the ethers signer\n * when the message length is not 32 bytes\n * - The format of the response from sendTransaction differs from that of the ethers signer.\n */\nexport class TronWebSigner implements Signer {\n private readonly nativeSigner: TronWeb\n\n private constructor(signer: TronWeb) {\n this.nativeSigner = signer\n }\n\n static from(signer: TronWeb): Signer\n static from(privKey: string): Signer\n static from(mnemonic: string, path?: string): Signer\n\n static from(source: TronWeb | string, path?: string): Signer {\n const fullHost = 'https://api.trongrid.io'\n if (source instanceof TronWeb) {\n return new this(source)\n } else if (typeof source === 'string' && path === undefined) {\n const privateKey = trim0x(source)\n return new this(new TronWeb({ privateKey, fullHost }))\n } else if (typeof source === 'string' && path !== undefined) {\n const privateKey = trim0x(TronWeb.fromMnemonic(source, path).privateKey)\n return new this(new TronWeb({ privateKey, fullHost }))\n } else {\n throw new Error('Invalid parameters')\n }\n }\n\n get native(): unknown {\n return this.nativeSigner\n }\n\n connect(provider: Provider): Signer {\n const nativeProvider = provider.native as TronWeb\n const { fullNode, solidityNode, eventServer } = nativeProvider.currentProviders() as {\n fullNode: unknown\n solidityNode: unknown\n eventServer: unknown\n }\n this.nativeSigner.setFullNode(fullNode)\n this.nativeSigner.setSolidityNode(solidityNode)\n this.nativeSigner.setEventServer(eventServer)\n return this\n }\n\n async getAddress(): Promise<string> {\n if (typeof this.nativeSigner.defaultAddress.hex !== 'string') {\n throw new Error('Invalid address')\n }\n const retval = this.nativeSigner.defaultAddress.hex.replace(/^41/, '0x')\n return Promise.resolve(retval)\n }\n\n async sendAndConfirm(transaction: SignedTransaction, _sendOptions?: object): Promise<TransactionReceipt> {\n const pending = (await this.sendTransaction(transaction)).pending as {\n txId: string\n wait: () => unknown\n }\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n const response = await pending.wait()\n return TransactionReceipt.from(response)\n }\n\n async signTransaction(transaction: TransactionRequest): Promise<SignedTransaction> {\n type NativeSignedTransaction = ethers.PopulatedTransaction\n const tx = transaction.request as NativeSignedTransaction\n if (tx.data === undefined || tx.to === undefined) {\n throw new Error('Invalid transaction, missing data or to')\n }\n\n TronWebSigner.validateTransaction(tx)\n const response = await signTronTx(\n {\n data: tx.data,\n to: tx.to,\n gasLimit: tx.gasLimit?.toNumber(),\n gasPrice: tx.gasPrice?.toNumber(),\n value: tx.value?.toNumber(),\n // energyFactor: transaction.energyFactor, // FIXME: add energyFactor\n },\n this.nativeSigner\n )\n return SignedTransaction.from(response)\n }\n\n async sendTransaction(transaction: SignedTransaction, _sendOptions?: object): Promise<TransactionPending> {\n type NativeSignedTransaction = Parameters<typeof sendTronTransaction>[0]\n const stx = transaction.signed as NativeSignedTransaction\n\n const response = await sendTronTransaction(stx, this.nativeSigner)\n return TransactionPending.from(response)\n }\n\n /**\n * signBuffer signs a buffer using the native signer\n * but the signString function of native signer is different from the ethers signer,\n * TronWeb uses a message header with a fixed 32 bytes length, which means that only if\n * the message length is 32 bytes, the signature will be the same as the ethereum signature.\n * you can find the signString function here:\n * https://github.com/tronprotocol/tronweb/blob/master/src/lib/trx.js\n * @param buffer\n * @returns\n */\n async signBuffer(buffer: Uint8Array): Promise<Uint8Array> {\n // ETH_MESSAGE_HEADER is defined as '\\x19Ethereum Signed Message:\\n32',\n // so that the signature will be the same as the ethereum signature only if\n // the message length is 32 bytes.\n if (typeof this.nativeSigner.defaultPrivateKey !== 'string') {\n throw new Error('Invalid private key')\n }\n const signedMessage = await TronWeb.Trx.signString(\n ethers.utils.hexlify(buffer),\n this.nativeSigner.defaultPrivateKey,\n false\n )\n const retval = ethers.utils.arrayify(signedMessage)\n return Promise.resolve(retval)\n }\n\n static validateTransaction(transaction: ethers.PopulatedTransaction): boolean {\n if (transaction.data === undefined || transaction.to === undefined) {\n throw new Error('Invalid transaction, missing data or to')\n }\n return true\n }\n\n async buildTransaction(buildTxRequest: unknown): Promise<TransactionRequest> {\n return Promise.reject(new Error('Method not implemented.'))\n }\n}\n"]}
package/dist/index.d.mts CHANGED
@@ -94,6 +94,7 @@ declare class TronSigner implements Signer {
94
94
  sendTransaction(transaction: SignedTransaction, _sendOptions?: object): Promise<TransactionPending>;
95
95
  signBuffer(buffer: Uint8Array): Promise<Uint8Array>;
96
96
  static validateTransaction(transaction: ethers.PopulatedTransaction): boolean;
97
+ buildTransaction(buildTxRequest: unknown): Promise<TransactionRequest>;
97
98
  }
98
99
 
99
100
  /**
@@ -129,6 +130,7 @@ declare class TronWebSigner implements Signer {
129
130
  */
130
131
  signBuffer(buffer: Uint8Array): Promise<Uint8Array>;
131
132
  static validateTransaction(transaction: ethers.PopulatedTransaction): boolean;
133
+ buildTransaction(buildTxRequest: unknown): Promise<TransactionRequest>;
132
134
  }
133
135
 
134
136
  export { TronProvider, TronSigner, TronWebProvider, TronWebSigner };
package/dist/index.d.ts CHANGED
@@ -94,6 +94,7 @@ declare class TronSigner implements Signer {
94
94
  sendTransaction(transaction: SignedTransaction, _sendOptions?: object): Promise<TransactionPending>;
95
95
  signBuffer(buffer: Uint8Array): Promise<Uint8Array>;
96
96
  static validateTransaction(transaction: ethers.PopulatedTransaction): boolean;
97
+ buildTransaction(buildTxRequest: unknown): Promise<TransactionRequest>;
97
98
  }
98
99
 
99
100
  /**
@@ -129,6 +130,7 @@ declare class TronWebSigner implements Signer {
129
130
  */
130
131
  signBuffer(buffer: Uint8Array): Promise<Uint8Array>;
131
132
  static validateTransaction(transaction: ethers.PopulatedTransaction): boolean;
133
+ buildTransaction(buildTxRequest: unknown): Promise<TransactionRequest>;
132
134
  }
133
135
 
134
136
  export { TronProvider, TronSigner, TronWebProvider, TronWebSigner };
package/dist/index.mjs CHANGED
@@ -338,6 +338,9 @@ var _TronSigner = class _TronSigner {
338
338
  }
339
339
  return true;
340
340
  }
341
+ async buildTransaction(buildTxRequest) {
342
+ return Promise.reject(new Error("Method not implemented."));
343
+ }
341
344
  };
342
345
  _TronSigner.createTronWeb = mem(
343
346
  (url, privateKey, apiKey) => {
@@ -443,6 +446,9 @@ var TronWebSigner = class _TronWebSigner {
443
446
  }
444
447
  return true;
445
448
  }
449
+ async buildTransaction(buildTxRequest) {
450
+ return Promise.reject(new Error("Method not implemented."));
451
+ }
446
452
  };
447
453
 
448
454
  export { TronProvider, TronSigner, TronWebProvider, TronWebSigner };
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/providers/tron.ts","../src/utils/tron.ts","../src/providers/tronweb.ts","../src/signers/tron.ts","../src/signers/tronweb.ts"],"names":["ethers","TronWeb","Block","BlockWithTransactions","TransactionPending","TransactionReceipt","TransactionResponse","mem","SignedTransaction","sendTronTransaction","trim0x","signTronTx"],"mappings":"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","sourcesContent":["import { ethers } from 'ethers'\nimport mem from 'mem'\nimport TronWeb from 'tronweb'\n\nimport {\n Block,\n BlockTag,\n BlockWithTransactions,\n Finality,\n Provider,\n SignedTransaction,\n TransactionPending,\n TransactionReceipt,\n TransactionResponse,\n} from '@layerzerolabs/lz-core'\nimport { StrategyFactory, sendTronTransaction } from '@layerzerolabs/tron-utilities'\n\nimport { toEtherFormat, toValidHash } from '../utils/tron'\n\n/**\n * TronProvider is a wrapper around TronWeb that implements the Provider interface\n * It is implemented using ethers.js\n */\nexport class TronProvider implements Provider {\n nativeProvider: ethers.providers.StaticJsonRpcProvider\n\n /**\n *\n * @param url RPC endpoint of the Tron full node, e.g. 'https://api.trongrid.io'\n * @param apiKey\n */\n private constructor(\n public url: string,\n apiKey?: string\n ) {\n this.nativeProvider = new ethers.providers.StaticJsonRpcProvider({\n url: StrategyFactory.get(url).asJSONRPC(url),\n headers: {\n // use object destructuring to conditionally add header\n ...(apiKey !== undefined ? { 'TRON-PRO-API-KEY': apiKey } : {}),\n },\n })\n }\n\n static from(url: string, apiKey?: string): TronProvider\n static from(client: TronWeb): TronProvider\n\n static from(source: string | TronWeb, apiKey?: string): TronProvider {\n if (typeof source === 'string') {\n return new this(source, apiKey)\n } else if (source instanceof TronWeb) {\n const { host, headers } = source.fullNode\n return this.from(host, headers['TRON-PRO-API-KEY'])\n } else {\n throw new Error('Invalid parameters')\n }\n }\n\n /**\n * Returns the native provider\n */\n get native(): unknown {\n return this.nativeProvider\n }\n\n private buildTronWebFrom = mem(\n (provider: ethers.providers.Provider): TronWeb => {\n if (provider instanceof ethers.providers.JsonRpcProvider) {\n const { url } = provider.connection\n const apiKey = provider.connection.headers?.['TRON-PRO-API-KEY'] as string | undefined\n\n return new TronWeb({\n privateKey: undefined,\n fullHost: StrategyFactory.get(url).asREST(url),\n headers: { ...(apiKey !== undefined ? { 'TRON-PRO-API-KEY': apiKey } : {}) },\n })\n }\n\n throw new Error(`The nativeSigner is not supported.`)\n },\n {\n cacheKey: (arguments_: [ethers.providers.Provider]): string => {\n const provider = arguments_[0]\n if (provider instanceof ethers.providers.JsonRpcProvider) {\n const { url } = provider.connection\n const apiKey = provider.connection.headers?.['TRON-PRO-API-KEY'] as string | undefined\n return JSON.stringify({ url, apiKey })\n }\n return JSON.stringify(provider)\n },\n }\n )\n\n async getBalance(address: string): Promise<string> {\n return this.nativeProvider.getBalance(toEtherFormat(address)).then((balance) => balance.toString())\n }\n\n async getBlock(blockTag: string | number): Promise<Block> {\n const response = await this.nativeProvider.getBlock(blockTag)\n return Block.from(response)\n }\n\n async getBlockWithTransactions(blockTag: string | number): Promise<BlockWithTransactions> {\n const response = await this.nativeProvider.getBlockWithTransactions(blockTag)\n return BlockWithTransactions.from(response)\n }\n\n async getBlockNumber(): Promise<number> {\n return this.nativeProvider.getBlockNumber()\n }\n\n async getBlockTimestamp(blockTag: string | number): Promise<number> {\n return this.nativeProvider.getBlock(blockTag).then((block) => block.timestamp)\n }\n\n async getSlot(_finality?: Finality): Promise<number> {\n await Promise.resolve()\n throw new Error('Method not implemented.')\n }\n\n async getTransaction(txHash: string): Promise<TransactionResponse> {\n const response = await this.nativeProvider.getTransaction(toValidHash(txHash))\n return TransactionResponse.from(response)\n }\n\n async getTransactionReceipt(txHash: string): Promise<TransactionReceipt> {\n const response = await this.nativeProvider.getTransactionReceipt(toValidHash(txHash))\n return TransactionReceipt.from(response)\n }\n\n async getTransactionCount(\n _addressOrName: string | Promise<string>,\n _blockTag?: BlockTag | Promise<BlockTag>\n ): Promise<number> {\n await Promise.resolve()\n throw new Error('Method not supported in Tron.')\n }\n\n async sendTransaction(transaction: SignedTransaction, _sendOptions?: object): Promise<TransactionPending> {\n // reference: https://developers.tron.network/reference/json-rpc-api-overview\n // eth_sendRawTransaction is not supported in the JSON-RPC API of the TRON network\n type NativeSignedTransaction = Parameters<typeof sendTronTransaction>[0]\n const stx = transaction.signed as NativeSignedTransaction\n const client = this.buildTronWebFrom(this.nativeProvider)\n const response = await sendTronTransaction(stx, client)\n\n return TransactionPending.from(response)\n }\n\n async sendAndConfirm(transaction: SignedTransaction, opts?: object): Promise<TransactionReceipt> {\n const pending = (await this.sendTransaction(transaction, opts)).pending as {\n txId: string\n result: unknown\n wait: () => Promise<unknown>\n }\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n const response = await pending.wait()\n return TransactionReceipt.from(response)\n }\n}\n","import { ethers } from 'ethers'\nimport TronWeb from 'tronweb'\n/**\n * ensureJsonRpcUrlPostfix ensures that the URL conforms to the TronGrid API convention by appending /jsonrpc if necessary.\n * @param url\n * @returns\n */\nexport function ensureJsonRpcUrlPostfix(url: string): string {\n // reference: https://developers.tron.network/docs/networks#mainnet\n // TronGrid API:https://api.trongrid.io\n // TronGrid JSON-RPC API: https://api.trongrid.io/jsonrpc\n // so that /jsonrpc is required to connect the JSON-RPC API endpoint\n const value = url.trim().replace(/\\/*$/, '')\n if (!value.endsWith('/jsonrpc')) {\n return value + '/jsonrpc'\n }\n return value\n}\n\n/**\n * removeJsonRpcUrlPostfix removes the /jsonrpc postfix from the URL\n */\nexport function removeJsonRpcUrlPostfix(url: string): string {\n return url.replace(/\\/jsonrpc$/, '')\n}\n\n/**\n * Convert a Tron address to a ethereum hex address\n * reference: https://developers.tron.network/docs/account#account-address-format\n * the TRON network account address can be a Hex format and Base58 format.\n * - The hex format is 42 characters long, removing the leading 41 from Hex format to get the Ethereum address.\n * - The Base58 format is 34 characters long, all Base58 addresses begin with T.\n * @param address\n * @returns\n */\nexport function toEtherFormat(address: string): string {\n if (address.startsWith('T') && address.length === 34) {\n return TronWeb.address.toHex(address).slice(2)\n } else if (address.startsWith('41') && address.length === 42) {\n return address.slice(2)\n } else {\n return address\n }\n}\n\n/**\n * Convert a transaction hash to a valid hash\n * reference: https://developers.tron.network/reference/eth_gettransactionbyhash\n * txHash should be a hex string with 0x, otherwise it will throw an error \"invalid hash\" - INVALID_ARGUMENT\n * @param txHash\n * @returns\n */\nexport function toValidHash(txHash: string): string {\n return ethers.utils.hexlify(txHash, { allowMissingPrefix: true })\n}\n","import TronWeb from 'tronweb'\n\nimport {\n Block,\n BlockTag,\n BlockWithTransactions,\n Finality,\n Provider,\n SignedTransaction,\n TransactionPending,\n TransactionReceipt,\n TransactionResponse,\n} from '@layerzerolabs/lz-core'\nimport { sleep } from '@layerzerolabs/lz-utilities'\n\nimport type { TransactionInfo } from 'tronweb'\n\n/**\n * TronWebProvider is a wrapper around TronWeb that implements the Provider interface\n *\n * PITFALL:\n * - This class is not compatible with ethers.js and is not fully tested.\n * - The format of the response from sendTransaction and the receipt from getTransactionReceipt differs\n * from that of the ethers provider.\n */\nexport class TronWebProvider implements Provider {\n nativeProvider: TronWeb\n\n /**\n * Create a new TronProvider\n * @param url RPC endpoint of the Tron full node, e.g. 'https://api.trongrid.io'\n * @param apiKey\n */\n constructor(\n public url: string,\n private apiKey?: string\n ) {\n this.nativeProvider = new TronWeb({\n fullHost: url,\n headers: {\n // use object destructuring to conditionally add header\n ...(apiKey !== undefined ? { 'TRON-PRO-API-KEY': apiKey } : {}),\n },\n })\n }\n\n static from(url: string, apiKey?: string): TronWebProvider\n\n static from(source: string, apiKey?: string): TronWebProvider {\n if (typeof source === 'string') {\n return new this(source, apiKey)\n } else {\n throw new Error('Invalid parameters')\n }\n }\n\n get native(): unknown {\n return this.nativeProvider\n }\n\n async getBalance(address: string): Promise<string> {\n return this.nativeProvider.trx.getBalance(address).then((balance: number) => balance.toString())\n }\n\n async getBlock(blockTag: string | number): Promise<Block> {\n const response = await this.nativeProvider.trx.getBlock(blockTag)\n return Block.from(response)\n }\n\n async getBlockWithTransactions(blockTag: string | number): Promise<BlockWithTransactions> {\n const response = await this.nativeProvider.trx.getBlock(blockTag)\n return BlockWithTransactions.from(response)\n }\n\n async getBlockNumber(): Promise<number> {\n return this.nativeProvider.trx\n .getBlock('latest')\n .then((block: { block_header: { raw_data: { number?: number } } }) => {\n if (block.block_header.raw_data.number === undefined) {\n throw new Error('Invalid block, block_header.raw_data.number is undefined')\n }\n return block.block_header.raw_data.number\n })\n }\n\n async getBlockTimestamp(blockTag: string | number): Promise<number> {\n return this.nativeProvider.trx\n .getBlock(blockTag)\n .then((block: { block_header: { raw_data: { timestamp?: number } } }) => {\n if (block.block_header.raw_data.timestamp === undefined) {\n throw new Error('Invalid block, block_header.raw_data.timestamp is undefined')\n }\n return block.block_header.raw_data.timestamp\n })\n }\n\n async getSlot(_finality?: Finality): Promise<number> {\n await Promise.resolve()\n throw new Error('Method not implemented.')\n }\n\n async getTransaction(txHash: string): Promise<TransactionResponse> {\n const response = await this.nativeProvider.trx.getTransaction(txHash)\n return TransactionResponse.from(response)\n }\n\n async getTransactionReceipt(txHash: string): Promise<TransactionReceipt> {\n // reference: https://developers.tron.network/reference/gettransactioninfobyid-1\n const response = await this.nativeProvider.trx.getTransactionInfo(txHash)\n return TransactionReceipt.from(response)\n }\n\n async getTransactionCount(\n _addressOrName: string | Promise<string>,\n _blockTag?: BlockTag | Promise<BlockTag>\n ): Promise<number> {\n await Promise.resolve()\n throw new Error('Method not supported in Tron.')\n }\n\n async sendTransaction(\n transaction: SignedTransaction,\n sendOptions?: { confirmations?: number }\n ): Promise<TransactionPending> {\n // reference: https://developers.tron.network/reference/broadcasttransaction\n type NativeSignedTransaction = Parameters<typeof this.nativeProvider.trx.sendRawTransaction>[0]\n const stx = transaction.signed as NativeSignedTransaction\n const response = await this.nativeProvider.trx.sendRawTransaction(stx, sendOptions)\n\n if (response.code !== undefined) {\n const error = {\n error: response.code,\n message: response.message !== undefined ? TronWeb.toUtf8(response.message) : response.code,\n }\n throw new Error(JSON.stringify(error, null, 2))\n }\n\n if (response.txid === undefined) {\n throw new Error('Invalid response, txid is undefined')\n }\n\n return TransactionPending.from(response)\n }\n\n async waitTransaction(txHash: string, confirmations?: number): Promise<TransactionInfo | undefined> {\n let tries = 0\n while (tries++ < (confirmations ?? 20)) {\n // FIXME: not fully implemented\n const receipt = await this.getTransactionReceipt(txHash)\n const response = receipt.receipt as TransactionInfo\n if (!Object.keys(response).length) {\n // reference: https://developers.tron.network/page/faq\n // Within current testing environment, one block is produced every 3 seconds.\n // But for the local environment, it may take 1 minute to produce a block.\n await sleep(1200)\n continue\n }\n\n if (response.result !== undefined && response.result === 'FAILED') {\n const error = {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n error: TronWeb.toUtf8(response.resMessage ?? ''),\n response: response,\n }\n throw new Error(JSON.stringify(error, null, 2))\n }\n\n if (!('contractResult' in response)) {\n const error = {\n error: 'Failed to execute: ' + JSON.stringify(response, null, 2),\n response: response,\n }\n throw new Error(JSON.stringify(error, null, 2))\n }\n\n return response\n }\n return undefined\n }\n\n async sendAndConfirm(\n transaction: SignedTransaction,\n opts?: { confirmations?: number }\n ): Promise<TransactionReceipt> {\n // reference: https://developers.tron.network/reference/broadcasttransaction\n const pending = (await this.sendTransaction(transaction, opts)).pending as {\n result: boolean\n txid: string\n code: string\n message: string\n transaction: unknown\n wait: (confirmations?: number) => Promise<unknown>\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n const response = await this.waitTransaction(pending.txid, opts?.confirmations)\n return TransactionReceipt.from(response)\n }\n}\n","import { ethers } from 'ethers'\nimport mem from 'mem'\nimport TronWeb from 'tronweb'\n\nimport {\n Provider,\n SignedTransaction,\n Signer,\n TransactionPending,\n TransactionReceipt,\n TransactionRequest,\n} from '@layerzerolabs/lz-core'\nimport { trim0x } from '@layerzerolabs/lz-utilities'\nimport { sendTronTransaction, signTronTx } from '@layerzerolabs/tron-utilities'\n\nimport { ensureJsonRpcUrlPostfix, removeJsonRpcUrlPostfix, toValidHash } from '../utils/tron'\n\n/**\n * TronSigner is a wrapper around TronWeb that implements the Signer interface\n * It is implemented using ethers.js\n */\nexport class TronSigner implements Signer {\n private readonly nativeSigner: ethers.Signer\n\n private constructor(signer: ethers.Signer) {\n this.nativeSigner = signer\n }\n\n static from(source: ethers.Signer): Signer\n static from(client: TronWeb): Signer\n static from(privKey: string): Signer\n static from(mnemonic: string, path: string): Signer\n\n static from(source: ethers.Signer | TronWeb | string, path?: string): Signer {\n if (source instanceof ethers.Signer) {\n return new this(source)\n } else if (source instanceof TronWeb) {\n const apiKey = source.fullNode.headers['TRON-PRO-API-KEY']\n const provider = new ethers.providers.JsonRpcProvider({\n url: ensureJsonRpcUrlPostfix(source.fullNode.host),\n headers: { ...(typeof apiKey !== 'undefined' ? { 'TRON-PRO-API-KEY': apiKey } : {}) },\n })\n\n return new this(new ethers.Wallet(source.defaultPrivateKey as string, provider))\n } else if (typeof source === 'string' && path === undefined) {\n return new this(new ethers.Wallet(source))\n } else if (typeof source === 'string' && path !== undefined) {\n return new this(ethers.Wallet.fromMnemonic(source, path))\n } else {\n throw new Error('Invalid parameters')\n }\n }\n\n get native(): unknown {\n return this.nativeSigner\n }\n\n connect(provider: Provider): Signer {\n if (!(provider.native instanceof ethers.providers.JsonRpcProvider)) {\n throw new Error('Only JsonRpcProvider is supported.')\n }\n\n const signer = this.nativeSigner.connect(provider.native as ethers.providers.Provider)\n // hack: ethers.utils.defineReadOnly does not work with private properties\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument, @typescript-eslint/no-explicit-any\n ethers.utils.defineReadOnly(this, 'nativeSigner' as keyof this, signer as any)\n\n return this\n }\n\n static buildTronWebFrom(signer: ethers.Signer): TronWeb {\n if (signer instanceof ethers.Wallet) {\n if (signer.provider instanceof ethers.providers.JsonRpcProvider) {\n const apiKey = signer.provider.connection.headers?.['TRON-PRO-API-KEY'] as string | undefined\n return this.createTronWeb(signer.provider.connection.url, signer.privateKey, apiKey)\n }\n }\n throw new Error(`The nativeSigner is not supported.`)\n }\n\n static createTronWeb = mem(\n (url: string, privateKey: string, apiKey?: string): TronWeb => {\n return new TronWeb({\n privateKey: trim0x(privateKey),\n fullHost: removeJsonRpcUrlPostfix(url),\n headers: { ...(apiKey !== undefined ? { 'TRON-PRO-API-KEY': apiKey } : {}) },\n })\n },\n { cacheKey: (arguments_) => JSON.stringify(arguments_) }\n )\n\n async getAddress(): Promise<string> {\n // reference: https://developers.tron.network/docs/tvm#differences-from-evm\n return this.nativeSigner.getAddress()\n }\n\n async sendAndConfirm(transaction: SignedTransaction, _opts?: object): Promise<TransactionReceipt> {\n const pending = (await this.sendTransaction(transaction)).pending as {\n txId: string\n wait: () => unknown\n }\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n await pending.wait()\n const response = await this.nativeSigner.provider?.getTransactionReceipt(toValidHash(pending.txId))\n return TransactionReceipt.from(response)\n }\n\n async signTransaction(transaction: TransactionRequest): Promise<SignedTransaction> {\n type NativeSignedTransaction = ethers.PopulatedTransaction\n const tx = transaction.request as NativeSignedTransaction\n if (tx.data === undefined || tx.to === undefined) {\n throw new Error('Invalid transaction, missing data or to')\n }\n\n TronSigner.validateTransaction(tx)\n const client = TronSigner.buildTronWebFrom(this.nativeSigner)\n const response = await signTronTx(\n {\n data: tx.data,\n to: tx.to,\n gasLimit: tx.gasLimit?.toNumber(),\n gasPrice: tx.gasPrice?.toNumber(),\n value: tx.value?.toNumber(),\n // energyFactor: transaction.energyFactor, // TODO: add energyFactor\n },\n client\n )\n return SignedTransaction.from(response)\n }\n\n async sendTransaction(transaction: SignedTransaction, _sendOptions?: object): Promise<TransactionPending> {\n type NativeSignedTransaction = Parameters<typeof sendTronTransaction>[0]\n const stx = transaction.signed as NativeSignedTransaction\n\n const tronWeb = TronSigner.buildTronWebFrom(this.nativeSigner)\n const response = await sendTronTransaction(stx, tronWeb)\n return TransactionPending.from(response)\n }\n\n async signBuffer(buffer: Uint8Array): Promise<Uint8Array> {\n // ETH_MESSAGE_HEADER is defined as '\\x19Ethereum Signed Message:\\n32' in TronWeb,\n // which will cause the signature to be different from ethers.js if the message length is not 32 bytes\n const signedMessage = await this.nativeSigner.signMessage(buffer)\n return ethers.utils.arrayify(signedMessage)\n }\n\n static validateTransaction(transaction: ethers.PopulatedTransaction): boolean {\n if (transaction.data === undefined || transaction.to === undefined) {\n throw new Error('Invalid transaction, missing data or to')\n }\n return true\n }\n}\n","import { ethers } from 'ethers'\nimport TronWeb from 'tronweb'\n\nimport {\n Provider,\n SignedTransaction,\n Signer,\n TransactionPending,\n TransactionReceipt,\n TransactionRequest,\n} from '@layerzerolabs/lz-core'\nimport { trim0x } from '@layerzerolabs/lz-utilities'\nimport { sendTronTransaction, signTronTx } from '@layerzerolabs/tron-utilities'\n\n/**\n * TronWebSigner is a wrapper around TronWeb that implements the Signer interface\n *\n * PITFALL:\n * - This class is not compatible with ethers.js and is not fully tested.\n * - The signature produced by signBuffer is different from the ethers signer\n * when the message length is not 32 bytes\n * - The format of the response from sendTransaction differs from that of the ethers signer.\n */\nexport class TronWebSigner implements Signer {\n private readonly nativeSigner: TronWeb\n\n private constructor(signer: TronWeb) {\n this.nativeSigner = signer\n }\n\n static from(signer: TronWeb): Signer\n static from(privKey: string): Signer\n static from(mnemonic: string, path?: string): Signer\n\n static from(source: TronWeb | string, path?: string): Signer {\n const fullHost = 'https://api.trongrid.io'\n if (source instanceof TronWeb) {\n return new this(source)\n } else if (typeof source === 'string' && path === undefined) {\n const privateKey = trim0x(source)\n return new this(new TronWeb({ privateKey, fullHost }))\n } else if (typeof source === 'string' && path !== undefined) {\n const privateKey = trim0x(TronWeb.fromMnemonic(source, path).privateKey)\n return new this(new TronWeb({ privateKey, fullHost }))\n } else {\n throw new Error('Invalid parameters')\n }\n }\n\n get native(): unknown {\n return this.nativeSigner\n }\n\n connect(provider: Provider): Signer {\n const nativeProvider = provider.native as TronWeb\n const { fullNode, solidityNode, eventServer } = nativeProvider.currentProviders() as {\n fullNode: unknown\n solidityNode: unknown\n eventServer: unknown\n }\n this.nativeSigner.setFullNode(fullNode)\n this.nativeSigner.setSolidityNode(solidityNode)\n this.nativeSigner.setEventServer(eventServer)\n return this\n }\n\n async getAddress(): Promise<string> {\n if (typeof this.nativeSigner.defaultAddress.hex !== 'string') {\n throw new Error('Invalid address')\n }\n const retval = this.nativeSigner.defaultAddress.hex.replace(/^41/, '0x')\n return Promise.resolve(retval)\n }\n\n async sendAndConfirm(transaction: SignedTransaction, _sendOptions?: object): Promise<TransactionReceipt> {\n const pending = (await this.sendTransaction(transaction)).pending as {\n txId: string\n wait: () => unknown\n }\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n const response = await pending.wait()\n return TransactionReceipt.from(response)\n }\n\n async signTransaction(transaction: TransactionRequest): Promise<SignedTransaction> {\n type NativeSignedTransaction = ethers.PopulatedTransaction\n const tx = transaction.request as NativeSignedTransaction\n if (tx.data === undefined || tx.to === undefined) {\n throw new Error('Invalid transaction, missing data or to')\n }\n\n TronWebSigner.validateTransaction(tx)\n const response = await signTronTx(\n {\n data: tx.data,\n to: tx.to,\n gasLimit: tx.gasLimit?.toNumber(),\n gasPrice: tx.gasPrice?.toNumber(),\n value: tx.value?.toNumber(),\n // energyFactor: transaction.energyFactor, // FIXME: add energyFactor\n },\n this.nativeSigner\n )\n return SignedTransaction.from(response)\n }\n\n async sendTransaction(transaction: SignedTransaction, _sendOptions?: object): Promise<TransactionPending> {\n type NativeSignedTransaction = Parameters<typeof sendTronTransaction>[0]\n const stx = transaction.signed as NativeSignedTransaction\n\n const response = await sendTronTransaction(stx, this.nativeSigner)\n return TransactionPending.from(response)\n }\n\n /**\n * signBuffer signs a buffer using the native signer\n * but the signString function of native signer is different from the ethers signer,\n * TronWeb uses a message header with a fixed 32 bytes length, which means that only if\n * the message length is 32 bytes, the signature will be the same as the ethereum signature.\n * you can find the signString function here:\n * https://github.com/tronprotocol/tronweb/blob/master/src/lib/trx.js\n * @param buffer\n * @returns\n */\n async signBuffer(buffer: Uint8Array): Promise<Uint8Array> {\n // ETH_MESSAGE_HEADER is defined as '\\x19Ethereum Signed Message:\\n32',\n // so that the signature will be the same as the ethereum signature only if\n // the message length is 32 bytes.\n if (typeof this.nativeSigner.defaultPrivateKey !== 'string') {\n throw new Error('Invalid private key')\n }\n const signedMessage = await TronWeb.Trx.signString(\n ethers.utils.hexlify(buffer),\n this.nativeSigner.defaultPrivateKey,\n false\n )\n const retval = ethers.utils.arrayify(signedMessage)\n return Promise.resolve(retval)\n }\n\n static validateTransaction(transaction: ethers.PopulatedTransaction): boolean {\n if (transaction.data === undefined || transaction.to === undefined) {\n throw new Error('Invalid transaction, missing data or to')\n }\n return true\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/providers/tron.ts","../src/utils/tron.ts","../src/providers/tronweb.ts","../src/signers/tron.ts","../src/signers/tronweb.ts"],"names":["ethers","TronWeb","Block","BlockWithTransactions","TransactionPending","TransactionReceipt","TransactionResponse","mem","SignedTransaction","sendTronTransaction","trim0x","signTronTx"],"mappings":"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","sourcesContent":["import { ethers } from 'ethers'\nimport mem from 'mem'\nimport TronWeb from 'tronweb'\n\nimport {\n Block,\n BlockTag,\n BlockWithTransactions,\n Finality,\n Provider,\n SignedTransaction,\n TransactionPending,\n TransactionReceipt,\n TransactionResponse,\n} from '@layerzerolabs/lz-core'\nimport { StrategyFactory, sendTronTransaction } from '@layerzerolabs/tron-utilities'\n\nimport { toEtherFormat, toValidHash } from '../utils/tron'\n\n/**\n * TronProvider is a wrapper around TronWeb that implements the Provider interface\n * It is implemented using ethers.js\n */\nexport class TronProvider implements Provider {\n nativeProvider: ethers.providers.StaticJsonRpcProvider\n\n /**\n *\n * @param url RPC endpoint of the Tron full node, e.g. 'https://api.trongrid.io'\n * @param apiKey\n */\n private constructor(\n public url: string,\n apiKey?: string\n ) {\n this.nativeProvider = new ethers.providers.StaticJsonRpcProvider({\n url: StrategyFactory.get(url).asJSONRPC(url),\n headers: {\n // use object destructuring to conditionally add header\n ...(apiKey !== undefined ? { 'TRON-PRO-API-KEY': apiKey } : {}),\n },\n })\n }\n\n static from(url: string, apiKey?: string): TronProvider\n static from(client: TronWeb): TronProvider\n\n static from(source: string | TronWeb, apiKey?: string): TronProvider {\n if (typeof source === 'string') {\n return new this(source, apiKey)\n } else if (source instanceof TronWeb) {\n const { host, headers } = source.fullNode\n return this.from(host, headers['TRON-PRO-API-KEY'])\n } else {\n throw new Error('Invalid parameters')\n }\n }\n\n /**\n * Returns the native provider\n */\n get native(): unknown {\n return this.nativeProvider\n }\n\n private buildTronWebFrom = mem(\n (provider: ethers.providers.Provider): TronWeb => {\n if (provider instanceof ethers.providers.JsonRpcProvider) {\n const { url } = provider.connection\n const apiKey = provider.connection.headers?.['TRON-PRO-API-KEY'] as string | undefined\n\n return new TronWeb({\n privateKey: undefined,\n fullHost: StrategyFactory.get(url).asREST(url),\n headers: { ...(apiKey !== undefined ? { 'TRON-PRO-API-KEY': apiKey } : {}) },\n })\n }\n\n throw new Error(`The nativeSigner is not supported.`)\n },\n {\n cacheKey: (arguments_: [ethers.providers.Provider]): string => {\n const provider = arguments_[0]\n if (provider instanceof ethers.providers.JsonRpcProvider) {\n const { url } = provider.connection\n const apiKey = provider.connection.headers?.['TRON-PRO-API-KEY'] as string | undefined\n return JSON.stringify({ url, apiKey })\n }\n return JSON.stringify(provider)\n },\n }\n )\n\n async getBalance(address: string): Promise<string> {\n return this.nativeProvider.getBalance(toEtherFormat(address)).then((balance) => balance.toString())\n }\n\n async getBlock(blockTag: string | number): Promise<Block> {\n const response = await this.nativeProvider.getBlock(blockTag)\n return Block.from(response)\n }\n\n async getBlockWithTransactions(blockTag: string | number): Promise<BlockWithTransactions> {\n const response = await this.nativeProvider.getBlockWithTransactions(blockTag)\n return BlockWithTransactions.from(response)\n }\n\n async getBlockNumber(): Promise<number> {\n return this.nativeProvider.getBlockNumber()\n }\n\n async getBlockTimestamp(blockTag: string | number): Promise<number> {\n return this.nativeProvider.getBlock(blockTag).then((block) => block.timestamp)\n }\n\n async getSlot(_finality?: Finality): Promise<number> {\n await Promise.resolve()\n throw new Error('Method not implemented.')\n }\n\n async getTransaction(txHash: string): Promise<TransactionResponse> {\n const response = await this.nativeProvider.getTransaction(toValidHash(txHash))\n return TransactionResponse.from(response)\n }\n\n async getTransactionReceipt(txHash: string): Promise<TransactionReceipt> {\n const response = await this.nativeProvider.getTransactionReceipt(toValidHash(txHash))\n return TransactionReceipt.from(response)\n }\n\n async getTransactionCount(\n _addressOrName: string | Promise<string>,\n _blockTag?: BlockTag | Promise<BlockTag>\n ): Promise<number> {\n await Promise.resolve()\n throw new Error('Method not supported in Tron.')\n }\n\n async sendTransaction(transaction: SignedTransaction, _sendOptions?: object): Promise<TransactionPending> {\n // reference: https://developers.tron.network/reference/json-rpc-api-overview\n // eth_sendRawTransaction is not supported in the JSON-RPC API of the TRON network\n type NativeSignedTransaction = Parameters<typeof sendTronTransaction>[0]\n const stx = transaction.signed as NativeSignedTransaction\n const client = this.buildTronWebFrom(this.nativeProvider)\n const response = await sendTronTransaction(stx, client)\n\n return TransactionPending.from(response)\n }\n\n async sendAndConfirm(transaction: SignedTransaction, opts?: object): Promise<TransactionReceipt> {\n const pending = (await this.sendTransaction(transaction, opts)).pending as {\n txId: string\n result: unknown\n wait: () => Promise<unknown>\n }\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n const response = await pending.wait()\n return TransactionReceipt.from(response)\n }\n}\n","import { ethers } from 'ethers'\nimport TronWeb from 'tronweb'\n/**\n * ensureJsonRpcUrlPostfix ensures that the URL conforms to the TronGrid API convention by appending /jsonrpc if necessary.\n * @param url\n * @returns\n */\nexport function ensureJsonRpcUrlPostfix(url: string): string {\n // reference: https://developers.tron.network/docs/networks#mainnet\n // TronGrid API:https://api.trongrid.io\n // TronGrid JSON-RPC API: https://api.trongrid.io/jsonrpc\n // so that /jsonrpc is required to connect the JSON-RPC API endpoint\n const value = url.trim().replace(/\\/*$/, '')\n if (!value.endsWith('/jsonrpc')) {\n return value + '/jsonrpc'\n }\n return value\n}\n\n/**\n * removeJsonRpcUrlPostfix removes the /jsonrpc postfix from the URL\n */\nexport function removeJsonRpcUrlPostfix(url: string): string {\n return url.replace(/\\/jsonrpc$/, '')\n}\n\n/**\n * Convert a Tron address to a ethereum hex address\n * reference: https://developers.tron.network/docs/account#account-address-format\n * the TRON network account address can be a Hex format and Base58 format.\n * - The hex format is 42 characters long, removing the leading 41 from Hex format to get the Ethereum address.\n * - The Base58 format is 34 characters long, all Base58 addresses begin with T.\n * @param address\n * @returns\n */\nexport function toEtherFormat(address: string): string {\n if (address.startsWith('T') && address.length === 34) {\n return TronWeb.address.toHex(address).slice(2)\n } else if (address.startsWith('41') && address.length === 42) {\n return address.slice(2)\n } else {\n return address\n }\n}\n\n/**\n * Convert a transaction hash to a valid hash\n * reference: https://developers.tron.network/reference/eth_gettransactionbyhash\n * txHash should be a hex string with 0x, otherwise it will throw an error \"invalid hash\" - INVALID_ARGUMENT\n * @param txHash\n * @returns\n */\nexport function toValidHash(txHash: string): string {\n return ethers.utils.hexlify(txHash, { allowMissingPrefix: true })\n}\n","import TronWeb from 'tronweb'\n\nimport {\n Block,\n BlockTag,\n BlockWithTransactions,\n Finality,\n Provider,\n SignedTransaction,\n TransactionPending,\n TransactionReceipt,\n TransactionResponse,\n} from '@layerzerolabs/lz-core'\nimport { sleep } from '@layerzerolabs/lz-utilities'\n\nimport type { TransactionInfo } from 'tronweb'\n\n/**\n * TronWebProvider is a wrapper around TronWeb that implements the Provider interface\n *\n * PITFALL:\n * - This class is not compatible with ethers.js and is not fully tested.\n * - The format of the response from sendTransaction and the receipt from getTransactionReceipt differs\n * from that of the ethers provider.\n */\nexport class TronWebProvider implements Provider {\n nativeProvider: TronWeb\n\n /**\n * Create a new TronProvider\n * @param url RPC endpoint of the Tron full node, e.g. 'https://api.trongrid.io'\n * @param apiKey\n */\n constructor(\n public url: string,\n private apiKey?: string\n ) {\n this.nativeProvider = new TronWeb({\n fullHost: url,\n headers: {\n // use object destructuring to conditionally add header\n ...(apiKey !== undefined ? { 'TRON-PRO-API-KEY': apiKey } : {}),\n },\n })\n }\n\n static from(url: string, apiKey?: string): TronWebProvider\n\n static from(source: string, apiKey?: string): TronWebProvider {\n if (typeof source === 'string') {\n return new this(source, apiKey)\n } else {\n throw new Error('Invalid parameters')\n }\n }\n\n get native(): unknown {\n return this.nativeProvider\n }\n\n async getBalance(address: string): Promise<string> {\n return this.nativeProvider.trx.getBalance(address).then((balance: number) => balance.toString())\n }\n\n async getBlock(blockTag: string | number): Promise<Block> {\n const response = await this.nativeProvider.trx.getBlock(blockTag)\n return Block.from(response)\n }\n\n async getBlockWithTransactions(blockTag: string | number): Promise<BlockWithTransactions> {\n const response = await this.nativeProvider.trx.getBlock(blockTag)\n return BlockWithTransactions.from(response)\n }\n\n async getBlockNumber(): Promise<number> {\n return this.nativeProvider.trx\n .getBlock('latest')\n .then((block: { block_header: { raw_data: { number?: number } } }) => {\n if (block.block_header.raw_data.number === undefined) {\n throw new Error('Invalid block, block_header.raw_data.number is undefined')\n }\n return block.block_header.raw_data.number\n })\n }\n\n async getBlockTimestamp(blockTag: string | number): Promise<number> {\n return this.nativeProvider.trx\n .getBlock(blockTag)\n .then((block: { block_header: { raw_data: { timestamp?: number } } }) => {\n if (block.block_header.raw_data.timestamp === undefined) {\n throw new Error('Invalid block, block_header.raw_data.timestamp is undefined')\n }\n return block.block_header.raw_data.timestamp\n })\n }\n\n async getSlot(_finality?: Finality): Promise<number> {\n await Promise.resolve()\n throw new Error('Method not implemented.')\n }\n\n async getTransaction(txHash: string): Promise<TransactionResponse> {\n const response = await this.nativeProvider.trx.getTransaction(txHash)\n return TransactionResponse.from(response)\n }\n\n async getTransactionReceipt(txHash: string): Promise<TransactionReceipt> {\n // reference: https://developers.tron.network/reference/gettransactioninfobyid-1\n const response = await this.nativeProvider.trx.getTransactionInfo(txHash)\n return TransactionReceipt.from(response)\n }\n\n async getTransactionCount(\n _addressOrName: string | Promise<string>,\n _blockTag?: BlockTag | Promise<BlockTag>\n ): Promise<number> {\n await Promise.resolve()\n throw new Error('Method not supported in Tron.')\n }\n\n async sendTransaction(\n transaction: SignedTransaction,\n sendOptions?: { confirmations?: number }\n ): Promise<TransactionPending> {\n // reference: https://developers.tron.network/reference/broadcasttransaction\n type NativeSignedTransaction = Parameters<typeof this.nativeProvider.trx.sendRawTransaction>[0]\n const stx = transaction.signed as NativeSignedTransaction\n const response = await this.nativeProvider.trx.sendRawTransaction(stx, sendOptions)\n\n if (response.code !== undefined) {\n const error = {\n error: response.code,\n message: response.message !== undefined ? TronWeb.toUtf8(response.message) : response.code,\n }\n throw new Error(JSON.stringify(error, null, 2))\n }\n\n if (response.txid === undefined) {\n throw new Error('Invalid response, txid is undefined')\n }\n\n return TransactionPending.from(response)\n }\n\n async waitTransaction(txHash: string, confirmations?: number): Promise<TransactionInfo | undefined> {\n let tries = 0\n while (tries++ < (confirmations ?? 20)) {\n // FIXME: not fully implemented\n const receipt = await this.getTransactionReceipt(txHash)\n const response = receipt.receipt as TransactionInfo\n if (!Object.keys(response).length) {\n // reference: https://developers.tron.network/page/faq\n // Within current testing environment, one block is produced every 3 seconds.\n // But for the local environment, it may take 1 minute to produce a block.\n await sleep(1200)\n continue\n }\n\n if (response.result !== undefined && response.result === 'FAILED') {\n const error = {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n error: TronWeb.toUtf8(response.resMessage ?? ''),\n response: response,\n }\n throw new Error(JSON.stringify(error, null, 2))\n }\n\n if (!('contractResult' in response)) {\n const error = {\n error: 'Failed to execute: ' + JSON.stringify(response, null, 2),\n response: response,\n }\n throw new Error(JSON.stringify(error, null, 2))\n }\n\n return response\n }\n return undefined\n }\n\n async sendAndConfirm(\n transaction: SignedTransaction,\n opts?: { confirmations?: number }\n ): Promise<TransactionReceipt> {\n // reference: https://developers.tron.network/reference/broadcasttransaction\n const pending = (await this.sendTransaction(transaction, opts)).pending as {\n result: boolean\n txid: string\n code: string\n message: string\n transaction: unknown\n wait: (confirmations?: number) => Promise<unknown>\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n const response = await this.waitTransaction(pending.txid, opts?.confirmations)\n return TransactionReceipt.from(response)\n }\n}\n","import { ethers } from 'ethers'\nimport mem from 'mem'\nimport TronWeb from 'tronweb'\n\nimport {\n Provider,\n SignedTransaction,\n Signer,\n TransactionPending,\n TransactionReceipt,\n TransactionRequest,\n} from '@layerzerolabs/lz-core'\nimport { trim0x } from '@layerzerolabs/lz-utilities'\nimport { sendTronTransaction, signTronTx } from '@layerzerolabs/tron-utilities'\n\nimport { ensureJsonRpcUrlPostfix, removeJsonRpcUrlPostfix, toValidHash } from '../utils/tron'\n\n/**\n * TronSigner is a wrapper around TronWeb that implements the Signer interface\n * It is implemented using ethers.js\n */\nexport class TronSigner implements Signer {\n private readonly nativeSigner: ethers.Signer\n\n private constructor(signer: ethers.Signer) {\n this.nativeSigner = signer\n }\n\n static from(source: ethers.Signer): Signer\n static from(client: TronWeb): Signer\n static from(privKey: string): Signer\n static from(mnemonic: string, path: string): Signer\n\n static from(source: ethers.Signer | TronWeb | string, path?: string): Signer {\n if (source instanceof ethers.Signer) {\n return new this(source)\n } else if (source instanceof TronWeb) {\n const apiKey = source.fullNode.headers['TRON-PRO-API-KEY']\n const provider = new ethers.providers.JsonRpcProvider({\n url: ensureJsonRpcUrlPostfix(source.fullNode.host),\n headers: { ...(typeof apiKey !== 'undefined' ? { 'TRON-PRO-API-KEY': apiKey } : {}) },\n })\n\n return new this(new ethers.Wallet(source.defaultPrivateKey as string, provider))\n } else if (typeof source === 'string' && path === undefined) {\n return new this(new ethers.Wallet(source))\n } else if (typeof source === 'string' && path !== undefined) {\n return new this(ethers.Wallet.fromMnemonic(source, path))\n } else {\n throw new Error('Invalid parameters')\n }\n }\n\n get native(): unknown {\n return this.nativeSigner\n }\n\n connect(provider: Provider): Signer {\n if (!(provider.native instanceof ethers.providers.JsonRpcProvider)) {\n throw new Error('Only JsonRpcProvider is supported.')\n }\n\n const signer = this.nativeSigner.connect(provider.native as ethers.providers.Provider)\n // hack: ethers.utils.defineReadOnly does not work with private properties\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument, @typescript-eslint/no-explicit-any\n ethers.utils.defineReadOnly(this, 'nativeSigner' as keyof this, signer as any)\n\n return this\n }\n\n static buildTronWebFrom(signer: ethers.Signer): TronWeb {\n if (signer instanceof ethers.Wallet) {\n if (signer.provider instanceof ethers.providers.JsonRpcProvider) {\n const apiKey = signer.provider.connection.headers?.['TRON-PRO-API-KEY'] as string | undefined\n return this.createTronWeb(signer.provider.connection.url, signer.privateKey, apiKey)\n }\n }\n throw new Error(`The nativeSigner is not supported.`)\n }\n\n static createTronWeb = mem(\n (url: string, privateKey: string, apiKey?: string): TronWeb => {\n return new TronWeb({\n privateKey: trim0x(privateKey),\n fullHost: removeJsonRpcUrlPostfix(url),\n headers: { ...(apiKey !== undefined ? { 'TRON-PRO-API-KEY': apiKey } : {}) },\n })\n },\n { cacheKey: (arguments_) => JSON.stringify(arguments_) }\n )\n\n async getAddress(): Promise<string> {\n // reference: https://developers.tron.network/docs/tvm#differences-from-evm\n return this.nativeSigner.getAddress()\n }\n\n async sendAndConfirm(transaction: SignedTransaction, _opts?: object): Promise<TransactionReceipt> {\n const pending = (await this.sendTransaction(transaction)).pending as {\n txId: string\n wait: () => unknown\n }\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n await pending.wait()\n const response = await this.nativeSigner.provider?.getTransactionReceipt(toValidHash(pending.txId))\n return TransactionReceipt.from(response)\n }\n\n async signTransaction(transaction: TransactionRequest): Promise<SignedTransaction> {\n type NativeSignedTransaction = ethers.PopulatedTransaction\n const tx = transaction.request as NativeSignedTransaction\n if (tx.data === undefined || tx.to === undefined) {\n throw new Error('Invalid transaction, missing data or to')\n }\n\n TronSigner.validateTransaction(tx)\n const client = TronSigner.buildTronWebFrom(this.nativeSigner)\n const response = await signTronTx(\n {\n data: tx.data,\n to: tx.to,\n gasLimit: tx.gasLimit?.toNumber(),\n gasPrice: tx.gasPrice?.toNumber(),\n value: tx.value?.toNumber(),\n // energyFactor: transaction.energyFactor, // TODO: add energyFactor\n },\n client\n )\n return SignedTransaction.from(response)\n }\n\n async sendTransaction(transaction: SignedTransaction, _sendOptions?: object): Promise<TransactionPending> {\n type NativeSignedTransaction = Parameters<typeof sendTronTransaction>[0]\n const stx = transaction.signed as NativeSignedTransaction\n\n const tronWeb = TronSigner.buildTronWebFrom(this.nativeSigner)\n const response = await sendTronTransaction(stx, tronWeb)\n return TransactionPending.from(response)\n }\n\n async signBuffer(buffer: Uint8Array): Promise<Uint8Array> {\n // ETH_MESSAGE_HEADER is defined as '\\x19Ethereum Signed Message:\\n32' in TronWeb,\n // which will cause the signature to be different from ethers.js if the message length is not 32 bytes\n const signedMessage = await this.nativeSigner.signMessage(buffer)\n return ethers.utils.arrayify(signedMessage)\n }\n\n static validateTransaction(transaction: ethers.PopulatedTransaction): boolean {\n if (transaction.data === undefined || transaction.to === undefined) {\n throw new Error('Invalid transaction, missing data or to')\n }\n return true\n }\n\n async buildTransaction(buildTxRequest: unknown): Promise<TransactionRequest> {\n return Promise.reject(new Error('Method not implemented.'))\n }\n}\n","import { ethers } from 'ethers'\nimport TronWeb from 'tronweb'\n\nimport {\n Provider,\n SignedTransaction,\n Signer,\n TransactionPending,\n TransactionReceipt,\n TransactionRequest,\n} from '@layerzerolabs/lz-core'\nimport { trim0x } from '@layerzerolabs/lz-utilities'\nimport { sendTronTransaction, signTronTx } from '@layerzerolabs/tron-utilities'\n\n/**\n * TronWebSigner is a wrapper around TronWeb that implements the Signer interface\n *\n * PITFALL:\n * - This class is not compatible with ethers.js and is not fully tested.\n * - The signature produced by signBuffer is different from the ethers signer\n * when the message length is not 32 bytes\n * - The format of the response from sendTransaction differs from that of the ethers signer.\n */\nexport class TronWebSigner implements Signer {\n private readonly nativeSigner: TronWeb\n\n private constructor(signer: TronWeb) {\n this.nativeSigner = signer\n }\n\n static from(signer: TronWeb): Signer\n static from(privKey: string): Signer\n static from(mnemonic: string, path?: string): Signer\n\n static from(source: TronWeb | string, path?: string): Signer {\n const fullHost = 'https://api.trongrid.io'\n if (source instanceof TronWeb) {\n return new this(source)\n } else if (typeof source === 'string' && path === undefined) {\n const privateKey = trim0x(source)\n return new this(new TronWeb({ privateKey, fullHost }))\n } else if (typeof source === 'string' && path !== undefined) {\n const privateKey = trim0x(TronWeb.fromMnemonic(source, path).privateKey)\n return new this(new TronWeb({ privateKey, fullHost }))\n } else {\n throw new Error('Invalid parameters')\n }\n }\n\n get native(): unknown {\n return this.nativeSigner\n }\n\n connect(provider: Provider): Signer {\n const nativeProvider = provider.native as TronWeb\n const { fullNode, solidityNode, eventServer } = nativeProvider.currentProviders() as {\n fullNode: unknown\n solidityNode: unknown\n eventServer: unknown\n }\n this.nativeSigner.setFullNode(fullNode)\n this.nativeSigner.setSolidityNode(solidityNode)\n this.nativeSigner.setEventServer(eventServer)\n return this\n }\n\n async getAddress(): Promise<string> {\n if (typeof this.nativeSigner.defaultAddress.hex !== 'string') {\n throw new Error('Invalid address')\n }\n const retval = this.nativeSigner.defaultAddress.hex.replace(/^41/, '0x')\n return Promise.resolve(retval)\n }\n\n async sendAndConfirm(transaction: SignedTransaction, _sendOptions?: object): Promise<TransactionReceipt> {\n const pending = (await this.sendTransaction(transaction)).pending as {\n txId: string\n wait: () => unknown\n }\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n const response = await pending.wait()\n return TransactionReceipt.from(response)\n }\n\n async signTransaction(transaction: TransactionRequest): Promise<SignedTransaction> {\n type NativeSignedTransaction = ethers.PopulatedTransaction\n const tx = transaction.request as NativeSignedTransaction\n if (tx.data === undefined || tx.to === undefined) {\n throw new Error('Invalid transaction, missing data or to')\n }\n\n TronWebSigner.validateTransaction(tx)\n const response = await signTronTx(\n {\n data: tx.data,\n to: tx.to,\n gasLimit: tx.gasLimit?.toNumber(),\n gasPrice: tx.gasPrice?.toNumber(),\n value: tx.value?.toNumber(),\n // energyFactor: transaction.energyFactor, // FIXME: add energyFactor\n },\n this.nativeSigner\n )\n return SignedTransaction.from(response)\n }\n\n async sendTransaction(transaction: SignedTransaction, _sendOptions?: object): Promise<TransactionPending> {\n type NativeSignedTransaction = Parameters<typeof sendTronTransaction>[0]\n const stx = transaction.signed as NativeSignedTransaction\n\n const response = await sendTronTransaction(stx, this.nativeSigner)\n return TransactionPending.from(response)\n }\n\n /**\n * signBuffer signs a buffer using the native signer\n * but the signString function of native signer is different from the ethers signer,\n * TronWeb uses a message header with a fixed 32 bytes length, which means that only if\n * the message length is 32 bytes, the signature will be the same as the ethereum signature.\n * you can find the signString function here:\n * https://github.com/tronprotocol/tronweb/blob/master/src/lib/trx.js\n * @param buffer\n * @returns\n */\n async signBuffer(buffer: Uint8Array): Promise<Uint8Array> {\n // ETH_MESSAGE_HEADER is defined as '\\x19Ethereum Signed Message:\\n32',\n // so that the signature will be the same as the ethereum signature only if\n // the message length is 32 bytes.\n if (typeof this.nativeSigner.defaultPrivateKey !== 'string') {\n throw new Error('Invalid private key')\n }\n const signedMessage = await TronWeb.Trx.signString(\n ethers.utils.hexlify(buffer),\n this.nativeSigner.defaultPrivateKey,\n false\n )\n const retval = ethers.utils.arrayify(signedMessage)\n return Promise.resolve(retval)\n }\n\n static validateTransaction(transaction: ethers.PopulatedTransaction): boolean {\n if (transaction.data === undefined || transaction.to === undefined) {\n throw new Error('Invalid transaction, missing data or to')\n }\n return true\n }\n\n async buildTransaction(buildTxRequest: unknown): Promise<TransactionRequest> {\n return Promise.reject(new Error('Method not implemented.'))\n }\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@layerzerolabs/lz-corekit-tron",
3
- "version": "3.0.1",
3
+ "version": "3.0.2-initia.1",
4
4
  "description": "LayerZero Core Library",
5
5
  "license": "BUSL-1.1",
6
6
  "exports": {
@@ -23,10 +23,10 @@
23
23
  "clean-prebuild": "rimraf dist"
24
24
  },
25
25
  "dependencies": {
26
- "@layerzerolabs/lz-aptos-sdk-v1": "^3.0.1",
27
- "@layerzerolabs/lz-core": "^3.0.1",
28
- "@layerzerolabs/lz-utilities": "^3.0.1",
29
- "@layerzerolabs/tron-utilities": "^3.0.1",
26
+ "@layerzerolabs/lz-aptos-sdk-v1": "^3.0.2-initia.1",
27
+ "@layerzerolabs/lz-core": "^3.0.2-initia.1",
28
+ "@layerzerolabs/lz-utilities": "^3.0.2-initia.1",
29
+ "@layerzerolabs/tron-utilities": "^3.0.2-initia.1",
30
30
  "aptos": "^1.20.0",
31
31
  "bip39": "^3.1.0",
32
32
  "ed25519-hd-key": "^1.3.0",
@@ -38,8 +38,8 @@
38
38
  "devDependencies": {
39
39
  "@jest/globals": "^29.7.0",
40
40
  "@layerzerolabs/tronweb-typescript": "^0.0.0",
41
- "@layerzerolabs/tsup-config-next": "^3.0.1",
42
- "@layerzerolabs/typescript-config-next": "^3.0.1",
41
+ "@layerzerolabs/tsup-config-next": "^3.0.2-initia.1",
42
+ "@layerzerolabs/typescript-config-next": "^3.0.2-initia.1",
43
43
  "@types/jest": "^29.5.10",
44
44
  "@types/tronweb": "npm:@layerzerolabs/tronweb-typescript@workspace:^",
45
45
  "jest": "^29.7.0",