@bitgo-beta/sdk-coin-tempo 1.0.0-alpha.2 → 1.0.0-alpha.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/dist/src/index.d.ts +1 -0
  2. package/dist/src/index.d.ts.map +1 -1
  3. package/dist/src/index.js +2 -1
  4. package/dist/src/lib/constants.d.ts +17 -1
  5. package/dist/src/lib/constants.d.ts.map +1 -1
  6. package/dist/src/lib/constants.js +22 -5
  7. package/dist/src/lib/index.d.ts +4 -0
  8. package/dist/src/lib/index.d.ts.map +1 -1
  9. package/dist/src/lib/index.js +5 -1
  10. package/dist/src/lib/keyPair.d.ts +8 -18
  11. package/dist/src/lib/keyPair.d.ts.map +1 -1
  12. package/dist/src/lib/keyPair.js +18 -84
  13. package/dist/src/lib/tip20Abi.d.ts +98 -0
  14. package/dist/src/lib/tip20Abi.d.ts.map +1 -0
  15. package/dist/src/lib/tip20Abi.js +62 -0
  16. package/dist/src/lib/transaction.d.ts +70 -0
  17. package/dist/src/lib/transaction.d.ts.map +1 -0
  18. package/dist/src/lib/transaction.js +73 -0
  19. package/dist/src/lib/transactionBuilder.d.ts +100 -0
  20. package/dist/src/lib/transactionBuilder.d.ts.map +1 -0
  21. package/dist/src/lib/transactionBuilder.js +204 -0
  22. package/dist/src/lib/types.d.ts +17 -0
  23. package/dist/src/lib/types.d.ts.map +1 -0
  24. package/dist/src/lib/types.js +3 -0
  25. package/dist/src/lib/utils.d.ts +54 -7
  26. package/dist/src/lib/utils.d.ts.map +1 -1
  27. package/dist/src/lib/utils.js +122 -16
  28. package/dist/src/register.d.ts +4 -0
  29. package/dist/src/register.d.ts.map +1 -1
  30. package/dist/src/register.js +26 -1
  31. package/dist/src/tempo.d.ts +35 -44
  32. package/dist/src/tempo.d.ts.map +1 -1
  33. package/dist/src/tempo.js +51 -84
  34. package/dist/src/tip20Token.d.ts +89 -0
  35. package/dist/src/tip20Token.d.ts.map +1 -0
  36. package/dist/src/tip20Token.js +198 -0
  37. package/dist/test/integration/tip20.d.ts +2 -0
  38. package/dist/test/integration/tip20.d.ts.map +1 -0
  39. package/dist/test/integration/tip20.js +115 -0
  40. package/dist/test/unit/transactionBuilder.d.ts +2 -0
  41. package/dist/test/unit/transactionBuilder.d.ts.map +1 -0
  42. package/dist/test/unit/transactionBuilder.js +252 -0
  43. package/dist/test/unit/utils.js +6 -5
  44. package/dist/tsconfig.tsbuildinfo +1 -1
  45. package/package.json +9 -6
@@ -0,0 +1,100 @@
1
+ /**
2
+ * TIP-20 Transaction Builder
3
+ *
4
+ * Unified builder for TIP-20 transactions supporting:
5
+ * - Single or batch operations
6
+ * - Per-operation memos for tracking
7
+ * - Custom fee token selection
8
+ * - EIP-7702 Account Abstraction (type 0x76)
9
+ */
10
+ import { TransactionBuilder as AbstractTransactionBuilder, TransferBuilder } from '@bitgo-beta/abstract-eth';
11
+ import { BaseTransaction } from '@bitgo-beta/sdk-core';
12
+ import { BaseCoin as CoinConfig } from '@bitgo-beta/statics';
13
+ import { Address, Tip20Operation } from './types';
14
+ /**
15
+ * Transaction Builder for TIP-20 tokens on Tempo blockchain
16
+ * Extends abstract-eth TransactionBuilder with Tempo-specific features
17
+ */
18
+ export declare class Tip20TransactionBuilder extends AbstractTransactionBuilder {
19
+ private operations;
20
+ private _feeToken?;
21
+ private _nonce?;
22
+ private _gas?;
23
+ private _maxFeePerGas?;
24
+ private _maxPriorityFeePerGas?;
25
+ constructor(_coinConfig: Readonly<CoinConfig>);
26
+ /**
27
+ * Implement the transfer method from abstract class
28
+ * Note: For TIP-20 transactions, use addOperation() instead
29
+ */
30
+ transfer(data?: string, isFirstSigner?: boolean): TransferBuilder;
31
+ /**
32
+ * Build the transaction from configured TIP-20 operations and transaction parameters
33
+ */
34
+ protected buildImplementation(): Promise<BaseTransaction>;
35
+ /**
36
+ * Add a single operation to the transaction
37
+ * Can be called multiple times to create batch transactions
38
+ *
39
+ * @param operation - TIP-20 operation with token, recipient, amount, and optional memo
40
+ * @returns this builder instance for chaining
41
+ */
42
+ addOperation(operation: Tip20Operation): this;
43
+ /**
44
+ * Set which TIP-20 token will be used to pay transaction fees
45
+ * This is a global setting for the entire transaction
46
+ *
47
+ * @param tokenAddress - Address of the TIP-20 token to use for fees
48
+ * @returns this builder instance for chaining
49
+ */
50
+ feeToken(tokenAddress: string): this;
51
+ /**
52
+ * Set the transaction nonce
53
+ *
54
+ * @param nonce - Transaction nonce
55
+ * @returns this builder instance for chaining
56
+ */
57
+ nonce(nonce: number): this;
58
+ /**
59
+ * Set the gas limit for the transaction
60
+ *
61
+ * @param gas - Gas limit
62
+ * @returns this builder instance for chaining
63
+ */
64
+ gas(gas: string | bigint): this;
65
+ /**
66
+ * Set the maximum fee per gas (EIP-1559)
67
+ *
68
+ * @param maxFeePerGas - Maximum fee per gas in wei
69
+ * @returns this builder instance for chaining
70
+ */
71
+ maxFeePerGas(maxFeePerGas: string | bigint): this;
72
+ /**
73
+ * Set the maximum priority fee per gas (EIP-1559)
74
+ *
75
+ * @param maxPriorityFeePerGas - Maximum priority fee per gas in wei
76
+ * @returns this builder instance for chaining
77
+ */
78
+ maxPriorityFeePerGas(maxPriorityFeePerGas: string | bigint): this;
79
+ /**
80
+ * Get all operations in this transaction
81
+ * @returns Array of TIP-20 operations
82
+ */
83
+ getOperations(): Tip20Operation[];
84
+ /**
85
+ * Get the fee token address if set
86
+ * @returns Fee token address or undefined
87
+ */
88
+ getFeeToken(): Address | undefined;
89
+ /**
90
+ * Validate a single operation
91
+ * @param operation - Operation to validate
92
+ * @throws BuildTransactionError if invalid
93
+ */
94
+ private validateOperation;
95
+ /**
96
+ * Convert a TIP-20 operation to an AA call
97
+ */
98
+ private operationToCall;
99
+ }
100
+ //# sourceMappingURL=transactionBuilder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transactionBuilder.d.ts","sourceRoot":"","sources":["../../../src/lib/transactionBuilder.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,kBAAkB,IAAI,0BAA0B,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAC7G,OAAO,EAAE,eAAe,EAAyB,MAAM,sBAAsB,CAAC;AAC9E,OAAO,EAAE,QAAQ,IAAI,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,OAAO,EAAO,cAAc,EAAE,MAAM,SAAS,CAAC;AAKvD;;;GAGG;AACH,qBAAa,uBAAwB,SAAQ,0BAA0B;IACrE,OAAO,CAAC,UAAU,CAAwB;IAC1C,OAAO,CAAC,SAAS,CAAC,CAAU;IAC5B,OAAO,CAAC,MAAM,CAAC,CAAS;IACxB,OAAO,CAAC,IAAI,CAAC,CAAS;IACtB,OAAO,CAAC,aAAa,CAAC,CAAS;IAC/B,OAAO,CAAC,qBAAqB,CAAC,CAAS;gBAE3B,WAAW,EAAE,QAAQ,CAAC,UAAU,CAAC;IAI7C;;;OAGG;IACH,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,OAAO,GAAG,eAAe;IASjE;;OAEG;cACa,mBAAmB,IAAI,OAAO,CAAC,eAAe,CAAC;IAsC/D;;;;;;OAMG;IACH,YAAY,CAAC,SAAS,EAAE,cAAc,GAAG,IAAI;IAM7C;;;;;;OAMG;IACH,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI;IAQpC;;;;;OAKG;IACH,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAQ1B;;;;;OAKG;IACH,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAS/B;;;;;OAKG;IACH,YAAY,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IASjD;;;;;OAKG;IACH,oBAAoB,CAAC,oBAAoB,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IASjE;;;OAGG;IACH,aAAa,IAAI,cAAc,EAAE;IAIjC;;;OAGG;IACH,WAAW,IAAI,OAAO,GAAG,SAAS;IAIlC;;;;OAIG;IACH,OAAO,CAAC,iBAAiB;IAsBzB;;OAEG;IACH,OAAO,CAAC,eAAe;CAUxB"}
@@ -0,0 +1,204 @@
1
+ "use strict";
2
+ /**
3
+ * TIP-20 Transaction Builder
4
+ *
5
+ * Unified builder for TIP-20 transactions supporting:
6
+ * - Single or batch operations
7
+ * - Per-operation memos for tracking
8
+ * - Custom fee token selection
9
+ * - EIP-7702 Account Abstraction (type 0x76)
10
+ */
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.Tip20TransactionBuilder = void 0;
13
+ const abstract_eth_1 = require("@bitgo-beta/abstract-eth");
14
+ const sdk_core_1 = require("@bitgo-beta/sdk-core");
15
+ const transaction_1 = require("./transaction");
16
+ const utils_1 = require("./utils");
17
+ const constants_1 = require("./constants");
18
+ /**
19
+ * Transaction Builder for TIP-20 tokens on Tempo blockchain
20
+ * Extends abstract-eth TransactionBuilder with Tempo-specific features
21
+ */
22
+ class Tip20TransactionBuilder extends abstract_eth_1.TransactionBuilder {
23
+ constructor(_coinConfig) {
24
+ super(_coinConfig);
25
+ this.operations = [];
26
+ }
27
+ /**
28
+ * Implement the transfer method from abstract class
29
+ * Note: For TIP-20 transactions, use addOperation() instead
30
+ */
31
+ transfer(data, isFirstSigner) {
32
+ const transferBuilder = new abstract_eth_1.TransferBuilder(undefined, isFirstSigner);
33
+ if (data) {
34
+ transferBuilder.data(data);
35
+ }
36
+ this._transfer = transferBuilder;
37
+ return transferBuilder;
38
+ }
39
+ /**
40
+ * Build the transaction from configured TIP-20 operations and transaction parameters
41
+ */
42
+ async buildImplementation() {
43
+ if (this.operations.length === 0) {
44
+ throw new sdk_core_1.BuildTransactionError('At least one operation is required to build a transaction');
45
+ }
46
+ if (this._nonce === undefined) {
47
+ throw new sdk_core_1.BuildTransactionError('Nonce is required to build a transaction');
48
+ }
49
+ if (this._gas === undefined) {
50
+ throw new sdk_core_1.BuildTransactionError('Gas limit is required to build a transaction');
51
+ }
52
+ if (this._maxFeePerGas === undefined) {
53
+ throw new sdk_core_1.BuildTransactionError('maxFeePerGas is required to build a transaction');
54
+ }
55
+ if (this._maxPriorityFeePerGas === undefined) {
56
+ throw new sdk_core_1.BuildTransactionError('maxPriorityFeePerGas is required to build a transaction');
57
+ }
58
+ const calls = this.operations.map((op) => this.operationToCall(op));
59
+ const txRequest = {
60
+ type: constants_1.AA_TRANSACTION_TYPE,
61
+ chainId: this._common.chainIdBN().toNumber(),
62
+ nonce: this._nonce,
63
+ maxFeePerGas: this._maxFeePerGas,
64
+ maxPriorityFeePerGas: this._maxPriorityFeePerGas,
65
+ gas: this._gas,
66
+ calls,
67
+ accessList: [],
68
+ feeToken: this._feeToken,
69
+ };
70
+ return new transaction_1.Tip20Transaction(this._coinConfig, txRequest, this.operations);
71
+ }
72
+ /**
73
+ * Add a single operation to the transaction
74
+ * Can be called multiple times to create batch transactions
75
+ *
76
+ * @param operation - TIP-20 operation with token, recipient, amount, and optional memo
77
+ * @returns this builder instance for chaining
78
+ */
79
+ addOperation(operation) {
80
+ this.validateOperation(operation);
81
+ this.operations.push(operation);
82
+ return this;
83
+ }
84
+ /**
85
+ * Set which TIP-20 token will be used to pay transaction fees
86
+ * This is a global setting for the entire transaction
87
+ *
88
+ * @param tokenAddress - Address of the TIP-20 token to use for fees
89
+ * @returns this builder instance for chaining
90
+ */
91
+ feeToken(tokenAddress) {
92
+ if (!(0, utils_1.isValidAddress)(tokenAddress)) {
93
+ throw new sdk_core_1.BuildTransactionError(`Invalid fee token address: ${tokenAddress}`);
94
+ }
95
+ this._feeToken = tokenAddress;
96
+ return this;
97
+ }
98
+ /**
99
+ * Set the transaction nonce
100
+ *
101
+ * @param nonce - Transaction nonce
102
+ * @returns this builder instance for chaining
103
+ */
104
+ nonce(nonce) {
105
+ if (nonce < 0) {
106
+ throw new sdk_core_1.BuildTransactionError(`Invalid nonce: ${nonce}`);
107
+ }
108
+ this._nonce = nonce;
109
+ return this;
110
+ }
111
+ /**
112
+ * Set the gas limit for the transaction
113
+ *
114
+ * @param gas - Gas limit
115
+ * @returns this builder instance for chaining
116
+ */
117
+ gas(gas) {
118
+ const gasValue = typeof gas === 'string' ? BigInt(gas) : gas;
119
+ if (gasValue <= 0n) {
120
+ throw new sdk_core_1.BuildTransactionError(`Invalid gas limit: ${gas}`);
121
+ }
122
+ this._gas = gasValue;
123
+ return this;
124
+ }
125
+ /**
126
+ * Set the maximum fee per gas (EIP-1559)
127
+ *
128
+ * @param maxFeePerGas - Maximum fee per gas in wei
129
+ * @returns this builder instance for chaining
130
+ */
131
+ maxFeePerGas(maxFeePerGas) {
132
+ const feeValue = typeof maxFeePerGas === 'string' ? BigInt(maxFeePerGas) : maxFeePerGas;
133
+ if (feeValue < 0n) {
134
+ throw new sdk_core_1.BuildTransactionError(`Invalid maxFeePerGas: ${maxFeePerGas}`);
135
+ }
136
+ this._maxFeePerGas = feeValue;
137
+ return this;
138
+ }
139
+ /**
140
+ * Set the maximum priority fee per gas (EIP-1559)
141
+ *
142
+ * @param maxPriorityFeePerGas - Maximum priority fee per gas in wei
143
+ * @returns this builder instance for chaining
144
+ */
145
+ maxPriorityFeePerGas(maxPriorityFeePerGas) {
146
+ const feeValue = typeof maxPriorityFeePerGas === 'string' ? BigInt(maxPriorityFeePerGas) : maxPriorityFeePerGas;
147
+ if (feeValue < 0n) {
148
+ throw new sdk_core_1.BuildTransactionError(`Invalid maxPriorityFeePerGas: ${maxPriorityFeePerGas}`);
149
+ }
150
+ this._maxPriorityFeePerGas = feeValue;
151
+ return this;
152
+ }
153
+ /**
154
+ * Get all operations in this transaction
155
+ * @returns Array of TIP-20 operations
156
+ */
157
+ getOperations() {
158
+ return [...this.operations];
159
+ }
160
+ /**
161
+ * Get the fee token address if set
162
+ * @returns Fee token address or undefined
163
+ */
164
+ getFeeToken() {
165
+ return this._feeToken;
166
+ }
167
+ /**
168
+ * Validate a single operation
169
+ * @param operation - Operation to validate
170
+ * @throws BuildTransactionError if invalid
171
+ */
172
+ validateOperation(operation) {
173
+ if (!(0, utils_1.isValidAddress)(operation.token)) {
174
+ throw new sdk_core_1.BuildTransactionError(`Invalid token address: ${operation.token}`);
175
+ }
176
+ if (!(0, utils_1.isValidAddress)(operation.to)) {
177
+ throw new sdk_core_1.BuildTransactionError(`Invalid recipient address: ${operation.to}`);
178
+ }
179
+ if (!(0, utils_1.isValidTip20Amount)(operation.amount)) {
180
+ throw new sdk_core_1.BuildTransactionError(`Invalid amount: ${operation.amount}`);
181
+ }
182
+ // Validate memo byte length (handles multi-byte UTF-8 characters)
183
+ if (operation.memo) {
184
+ const memoByteLength = new TextEncoder().encode(operation.memo).length;
185
+ if (memoByteLength > 32) {
186
+ throw new sdk_core_1.BuildTransactionError(`Memo too long: ${memoByteLength} bytes. Maximum 32 bytes.`);
187
+ }
188
+ }
189
+ }
190
+ /**
191
+ * Convert a TIP-20 operation to an AA call
192
+ */
193
+ operationToCall(op) {
194
+ const amountInUnits = (0, utils_1.amountToTip20Units)(op.amount);
195
+ const data = (0, utils_1.encodeTip20TransferWithMemo)(op.to, amountInUnits, op.memo);
196
+ return {
197
+ to: op.token,
198
+ data,
199
+ value: 0n,
200
+ };
201
+ }
202
+ }
203
+ exports.Tip20TransactionBuilder = Tip20TransactionBuilder;
204
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb25CdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi90cmFuc2FjdGlvbkJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7OztHQVFHOzs7QUFFSCwyREFBNkc7QUFDN0csbURBQThFO0FBRzlFLCtDQUEwRTtBQUMxRSxtQ0FBOEc7QUFDOUcsMkNBQWtEO0FBRWxEOzs7R0FHRztBQUNILE1BQWEsdUJBQXdCLFNBQVEsaUNBQTBCO0lBUXJFLFlBQVksV0FBaUM7UUFDM0MsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBUmIsZUFBVSxHQUFxQixFQUFFLENBQUM7SUFTMUMsQ0FBQztJQUVEOzs7T0FHRztJQUNILFFBQVEsQ0FBQyxJQUFhLEVBQUUsYUFBdUI7UUFDN0MsTUFBTSxlQUFlLEdBQUcsSUFBSSw4QkFBZSxDQUFDLFNBQVMsRUFBRSxhQUFhLENBQUMsQ0FBQztRQUN0RSxJQUFJLElBQUksRUFBRSxDQUFDO1lBQ1QsZUFBZSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM3QixDQUFDO1FBQ0QsSUFBSSxDQUFDLFNBQVMsR0FBRyxlQUFlLENBQUM7UUFDakMsT0FBTyxlQUFlLENBQUM7SUFDekIsQ0FBQztJQUVEOztPQUVHO0lBQ08sS0FBSyxDQUFDLG1CQUFtQjtRQUNqQyxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ2pDLE1BQU0sSUFBSSxnQ0FBcUIsQ0FBQywyREFBMkQsQ0FBQyxDQUFDO1FBQy9GLENBQUM7UUFFRCxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDOUIsTUFBTSxJQUFJLGdDQUFxQixDQUFDLDBDQUEwQyxDQUFDLENBQUM7UUFDOUUsQ0FBQztRQUVELElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUM1QixNQUFNLElB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QUFDLENBQUM7UUFDaEYsQ0FBQztRQUVELElBQUksQ0FBQyxJQUFBLDBCQUFrQixFQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1lBQzFDLE1BQU0sSUFBSSxnQ0FBcUIsQ0FBQyxtQkFBbUIsU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFDekUsQ0FBQztRQUVELGtFQUFrRTtRQUNsRSxJQUFJLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNuQixNQUFNLGNBQWMsR0FBRyxJQUFJLFdBQVcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDO1lBQ3ZFLElBQUksY0FBYyxHQUFHLEVBQUUsRUFBRSxDQUFDO2dCQUN4QixNQUFNLElBQUksZ0NBQXFCLENBQUMsa0JBQWtCLGNBQWMsMkJBQTJCLENBQUMsQ0FBQztZQUMvRixDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRDs7T0FFRztJQUNLLGVBQWUsQ0FBQyxFQUFrQjtRQUN4QyxNQUFNLGFBQWEsR0FBRyxJQUFBLDBCQUFrQixFQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNwRCxNQUFNLElBQUksR0FBRyxJQUFBLG1DQUEyQixFQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsYUFBYSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUV4RSxPQUFPO1lBQ0wsRUFBRSxFQUFFLEVBQUUsQ0FBQyxLQUFLO1lBQ1osSUFBSTtZQUNKLEtBQUssRUFBRSxFQUFFO1NBQ1YsQ0FBQztJQUNKLENBQUM7Q0FDRjtBQWpORCwwREFpTkMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFRJUC0yMCBUcmFuc2FjdGlvbiBCdWlsZGVyXG4gKlxuICogVW5pZmllZCBidWlsZGVyIGZvciBUSVAtMjAgdHJhbnNhY3Rpb25zIHN1cHBvcnRpbmc6XG4gKiAtIFNpbmdsZSBvciBiYXRjaCBvcGVyYXRpb25zXG4gKiAtIFBlci1vcGVyYXRpb24gbWVtb3MgZm9yIHRyYWNraW5nXG4gKiAtIEN1c3RvbSBmZWUgdG9rZW4gc2VsZWN0aW9uXG4gKiAtIEVJUC03NzAyIEFjY291bnQgQWJzdHJhY3Rpb24gKHR5cGUgMHg3NilcbiAqL1xuXG5pbXBvcnQgeyBUcmFuc2FjdGlvbkJ1aWxkZXIgYXMgQWJzdHJhY3RUcmFuc2FjdGlvbkJ1aWxkZXIsIFRyYW5zZmVyQnVpbGRlciB9IGZyb20gJ0BiaXRnby1iZXRhL2Fic3RyYWN0LWV0aCc7XG5pbXBvcnQgeyBCYXNlVHJhbnNhY3Rpb24sIEJ1aWxkVHJhbnNhY3Rpb25FcnJvciB9IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1jb3JlJztcbmltcG9ydCB7IEJhc2VDb2luIGFzIENvaW5Db25maWcgfSBmcm9tICdAYml0Z28tYmV0YS9zdGF0aWNzJztcbmltcG9ydCB7IEFkZHJlc3MsIEhleCwgVGlwMjBPcGVyYXRpb24gfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IFRpcDIwVHJhbnNhY3Rpb24sIFRpcDIwVHJhbnNhY3Rpb25SZXF1ZXN0IH0gZnJvbSAnLi90cmFuc2FjdGlvbic7XG5pbXBvcnQgeyBhbW91bnRUb1RpcDIwVW5pdHMsIGVuY29kZVRpcDIwVHJhbnNmZXJXaXRoTWVtbywgaXNWYWxpZEFkZHJlc3MsIGlzVmFsaWRUaXAyMEFtb3VudCB9IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IHsgQUFfVFJBTlNBQ1RJT05fVFlQRSB9IGZyb20gJy4vY29uc3RhbnRzJztcblxuLyoqXG4gKiBUcmFuc2FjdGlvbiBCdWlsZGVyIGZvciBUSVAtMjAgdG9rZW5zIG9uIFRlbXBvIGJsb2NrY2hhaW5cbiAqIEV4dGVuZHMgYWJzdHJhY3QtZXRoIFRyYW5zYWN0aW9uQnVpbGRlciB3aXRoIFRlbXBvLXNwZWNpZmljIGZlYXR1cmVzXG4gKi9cbmV4cG9ydCBjbGFzcyBUaXAyMFRyYW5zYWN0aW9uQnVpbGRlciBleHRlbmRzIEFic3RyYWN0VHJhbnNhY3Rpb25CdWlsZGVyIHtcbiAgcHJpdmF0ZSBvcGVyYXRpb25zOiBUaXAyME9wZXJhdGlvbltdID0gW107XG4gIHByaXZhdGUgX2ZlZVRva2VuPzogQWRkcmVzcztcbiAgcHJpdmF0ZSBfbm9uY2U/OiBudW1iZXI7XG4gIHByaXZhdGUgX2dhcz86IGJpZ2ludDtcbiAgcHJpdmF0ZSBfbWF4RmVlUGVyR2FzPzogYmlnaW50O1xuICBwcml2YXRlIF9tYXhQcmlvcml0eUZlZVBlckdhcz86IGJpZ2ludDtcblxuICBjb25zdHJ1Y3RvcihfY29pbkNvbmZpZzogUmVhZG9ubHk8Q29pbkNvbmZpZz4pIHtcbiAgICBzdXBlcihfY29pbkNvbmZpZyk7XG4gIH1cblxuICAvKipcbiAgICogSW1wbGVtZW50IHRoZSB0cmFuc2ZlciBtZXRob2QgZnJvbSBhYnN0cmFjdCBjbGFzc1xuICAgKiBOb3RlOiBGb3IgVElQLTIwIHRyYW5zYWN0aW9ucywgdXNlIGFkZE9wZXJhdGlvbigpIGluc3RlYWRcbiAgICovXG4gIHRyYW5zZmVyKGRhdGE/OiBzdHJpbmcsIGlzRmlyc3RTaWduZXI/OiBib29sZWFuKTogVHJhbnNmZXJCdWlsZGVyIHtcbiAgICBjb25zdCB0cmFuc2ZlckJ1aWxkZXIgPSBuZXcgVHJhbnNmZXJCdWlsZGVyKHVuZGVmaW5lZCwgaXNGaXJzdFNpZ25lcik7XG4gICAgaWYgKGRhdGEpIHtcbiAgICAgIHRyYW5zZmVyQnVpbGRlci5kYXRhKGRhdGEpO1xuICAgIH1cbiAgICB0aGlzLl90cmFuc2ZlciA9IHRyYW5zZmVyQnVpbGRlcjtcbiAgICByZXR1cm4gdHJhbnNmZXJCdWlsZGVyO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIHRoZSB0cmFuc2FjdGlvbiBmcm9tIGNvbmZpZ3VyZWQgVElQLTIwIG9wZXJhdGlvbnMgYW5kIHRyYW5zYWN0aW9uIHBhcmFtZXRlcnNcbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyBidWlsZEltcGxlbWVudGF0aW9uKCk6IFByb21pc2U8QmFzZVRyYW5zYWN0aW9uPiB7XG4gICAgaWYgKHRoaXMub3BlcmF0aW9ucy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ0F0IGxlYXN0IG9uZSBvcGVyYXRpb24gaXMgcmVxdWlyZWQgdG8gYnVpbGQgYSB0cmFuc2FjdGlvbicpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9ub25jZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKCdOb25jZSBpcyByZXF1aXJlZCB0byBidWlsZCBhIHRyYW5zYWN0aW9uJyk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2dhcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKCdHYXMgbGltaXQgaXMgcmVxdWlyZWQgdG8gYnVpbGQgYSB0cmFuc2FjdGlvbicpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9tYXhGZWVQZXJHYXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignbWF4RmVlUGVyR2FzIGlzIHJlcXVpcmVkIHRvIGJ1aWxkIGEgdHJhbnNhY3Rpb24nKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fbWF4UHJpb3JpdHlGZWVQZXJHYXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignbWF4UHJpb3JpdHlGZWVQZXJHYXMgaXMgcmVxdWlyZWQgdG8gYnVpbGQgYSB0cmFuc2FjdGlvbicpO1xuICAgIH1cblxuICAgIGNvbnN0IGNhbGxzID0gdGhpcy5vcGVyYXRpb25zLm1hcCgob3ApID0+IHRoaXMub3BlcmF0aW9uVG9DYWxsKG9wKSk7XG5cbiAgICBjb25zdCB0eFJlcXVlc3Q6IFRpcDIwVHJhbnNhY3Rpb25SZXF1ZXN0ID0ge1xuICAgICAgdHlwZTogQUFfVFJBTlNBQ1RJT05fVFlQRSxcbiAgICAgIGNoYWluSWQ6IHRoaXMuX2NvbW1vbi5jaGFpbklkQk4oKS50b051bWJlcigpLFxuICAgICAgbm9uY2U6IHRoaXMuX25vbmNlLFxuICAgICAgbWF4RmVlUGVyR2FzOiB0aGlzLl9tYXhGZWVQZXJHYXMsXG4gICAgICBtYXhQcmlvcml0eUZlZVBlckdhczogdGhpcy5fbWF4UHJpb3JpdHlGZWVQZXJHYXMsXG4gICAgICBnYXM6IHRoaXMuX2dhcyxcbiAgICAgIGNhbGxzLFxuICAgICAgYWNjZXNzTGlzdDogW10sXG4gICAgICBmZWVUb2tlbjogdGhpcy5fZmVlVG9rZW4sXG4gICAgfTtcblxuICAgIHJldHVybiBuZXcgVGlwMjBUcmFuc2FjdGlvbih0aGlzLl9jb2luQ29uZmlnLCB0eFJlcXVlc3QsIHRoaXMub3BlcmF0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgc2luZ2xlIG9wZXJhdGlvbiB0byB0aGUgdHJhbnNhY3Rpb25cbiAgICogQ2FuIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyB0byBjcmVhdGUgYmF0Y2ggdHJhbnNhY3Rpb25zXG4gICAqXG4gICAqIEBwYXJhbSBvcGVyYXRpb24gLSBUSVAtMjAgb3BlcmF0aW9uIHdpdGggdG9rZW4sIHJlY2lwaWVudCwgYW1vdW50LCBhbmQgb3B0aW9uYWwgbWVtb1xuICAgKiBAcmV0dXJucyB0aGlzIGJ1aWxkZXIgaW5zdGFuY2UgZm9yIGNoYWluaW5nXG4gICAqL1xuICBhZGRPcGVyYXRpb24ob3BlcmF0aW9uOiBUaXAyME9wZXJhdGlvbik6IHRoaXMge1xuICAgIHRoaXMudmFsaWRhdGVPcGVyYXRpb24ob3BlcmF0aW9uKTtcbiAgICB0aGlzLm9wZXJhdGlvbnMucHVzaChvcGVyYXRpb24pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB3aGljaCBUSVAtMjAgdG9rZW4gd2lsbCBiZSB1c2VkIHRvIHBheSB0cmFuc2FjdGlvbiBmZWVzXG4gICAqIFRoaXMgaXMgYSBnbG9iYWwgc2V0dGluZyBmb3IgdGhlIGVudGlyZSB0cmFuc2FjdGlvblxuICAgKlxuICAgKiBAcGFyYW0gdG9rZW5BZGRyZXNzIC0gQWRkcmVzcyBvZiB0aGUgVElQLTIwIHRva2VuIHRvIHVzZSBmb3IgZmVlc1xuICAgKiBAcmV0dXJucyB0aGlzIGJ1aWxkZXIgaW5zdGFuY2UgZm9yIGNoYWluaW5nXG4gICAqL1xuICBmZWVUb2tlbih0b2tlbkFkZHJlc3M6IHN0cmluZyk6IHRoaXMge1xuICAgIGlmICghaXNWYWxpZEFkZHJlc3ModG9rZW5BZGRyZXNzKSkge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcihgSW52YWxpZCBmZWUgdG9rZW4gYWRkcmVzczogJHt0b2tlbkFkZHJlc3N9YCk7XG4gICAgfVxuICAgIHRoaXMuX2ZlZVRva2VuID0gdG9rZW5BZGRyZXNzIGFzIEFkZHJlc3M7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSB0cmFuc2FjdGlvbiBub25jZVxuICAgKlxuICAgKiBAcGFyYW0gbm9uY2UgLSBUcmFuc2FjdGlvbiBub25jZVxuICAgKiBAcmV0dXJucyB0aGlzIGJ1aWxkZXIgaW5zdGFuY2UgZm9yIGNoYWluaW5nXG4gICAqL1xuICBub25jZShub25jZTogbnVtYmVyKTogdGhpcyB7XG4gICAgaWYgKG5vbmNlIDwgMCkge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcihgSW52YWxpZCBub25jZTogJHtub25jZX1gKTtcbiAgICB9XG4gICAgdGhpcy5fbm9uY2UgPSBub25jZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIGdhcyBsaW1pdCBmb3IgdGhlIHRyYW5zYWN0aW9uXG4gICAqXG4gICAqIEBwYXJhbSBnYXMgLSBHYXMgbGltaXRcbiAgICogQHJldHVybnMgdGhpcyBidWlsZGVyIGluc3RhbmNlIGZvciBjaGFpbmluZ1xuICAgKi9cbiAgZ2FzKGdhczogc3RyaW5nIHwgYmlnaW50KTogdGhpcyB7XG4gICAgY29uc3QgZ2FzVmFsdWUgPSB0eXBlb2YgZ2FzID09PSAnc3RyaW5nJyA/IEJpZ0ludChnYXMpIDogZ2FzO1xuICAgIGlmIChnYXNWYWx1ZSA8PSAwbikge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcihgSW52YWxpZCBnYXMgbGltaXQ6ICR7Z2FzfWApO1xuICAgIH1cbiAgICB0aGlzLl9nYXMgPSBnYXNWYWx1ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIG1heGltdW0gZmVlIHBlciBnYXMgKEVJUC0xNTU5KVxuICAgKlxuICAgKiBAcGFyYW0gbWF4RmVlUGVyR2FzIC0gTWF4aW11bSBmZWUgcGVyIGdhcyBpbiB3ZWlcbiAgICogQHJldHVybnMgdGhpcyBidWlsZGVyIGluc3RhbmNlIGZvciBjaGFpbmluZ1xuICAgKi9cbiAgbWF4RmVlUGVyR2FzKG1heEZlZVBlckdhczogc3RyaW5nIHwgYmlnaW50KTogdGhpcyB7XG4gICAgY29uc3QgZmVlVmFsdWUgPSB0eXBlb2YgbWF4RmVlUGVyR2FzID09PSAnc3RyaW5nJyA/IEJpZ0ludChtYXhGZWVQZXJHYXMpIDogbWF4RmVlUGVyR2FzO1xuICAgIGlmIChmZWVWYWx1ZSA8IDBuKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKGBJbnZhbGlkIG1heEZlZVBlckdhczogJHttYXhGZWVQZXJHYXN9YCk7XG4gICAgfVxuICAgIHRoaXMuX21heEZlZVBlckdhcyA9IGZlZVZhbHVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgbWF4aW11bSBwcmlvcml0eSBmZWUgcGVyIGdhcyAoRUlQLTE1NTkpXG4gICAqXG4gICAqIEBwYXJhbSBtYXhQcmlvcml0eUZlZVBlckdhcyAtIE1heGltdW0gcHJpb3JpdHkgZmVlIHBlciBnYXMgaW4gd2VpXG4gICAqIEByZXR1cm5zIHRoaXMgYnVpbGRlciBpbnN0YW5jZSBmb3IgY2hhaW5pbmdcbiAgICovXG4gIG1heFByaW9yaXR5RmVlUGVyR2FzKG1heFByaW9yaXR5RmVlUGVyR2FzOiBzdHJpbmcgfCBiaWdpbnQpOiB0aGlzIHtcbiAgICBjb25zdCBmZWVWYWx1ZSA9IHR5cGVvZiBtYXhQcmlvcml0eUZlZVBlckdhcyA9PT0gJ3N0cmluZycgPyBCaWdJbnQobWF4UHJpb3JpdHlGZWVQZXJHYXMpIDogbWF4UHJpb3JpdHlGZWVQZXJHYXM7XG4gICAgaWYgKGZlZVZhbHVlIDwgMG4pIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoYEludmFsaWQgbWF4UHJpb3JpdHlGZWVQZXJHYXM6ICR7bWF4UHJpb3JpdHlGZWVQZXJHYXN9YCk7XG4gICAgfVxuICAgIHRoaXMuX21heFByaW9yaXR5RmVlUGVyR2FzID0gZmVlVmFsdWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFsbCBvcGVyYXRpb25zIGluIHRoaXMgdHJhbnNhY3Rpb25cbiAgICogQHJldHVybnMgQXJyYXkgb2YgVElQLTIwIG9wZXJhdGlvbnNcbiAgICovXG4gIGdldE9wZXJhdGlvbnMoKTogVGlwMjBPcGVyYXRpb25bXSB7XG4gICAgcmV0dXJuIFsuLi50aGlzLm9wZXJhdGlvbnNdO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgZmVlIHRva2VuIGFkZHJlc3MgaWYgc2V0XG4gICAqIEByZXR1cm5zIEZlZSB0b2tlbiBhZGRyZXNzIG9yIHVuZGVmaW5lZFxuICAgKi9cbiAgZ2V0RmVlVG9rZW4oKTogQWRkcmVzcyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2ZlZVRva2VuO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIGEgc2luZ2xlIG9wZXJhdGlvblxuICAgKiBAcGFyYW0gb3BlcmF0aW9uIC0gT3BlcmF0aW9uIHRvIHZhbGlkYXRlXG4gICAqIEB0aHJvd3MgQnVpbGRUcmFuc2FjdGlvbkVycm9yIGlmIGludmFsaWRcbiAgICovXG4gIHByaXZhdGUgdmFsaWRhdGVPcGVyYXRpb24ob3BlcmF0aW9uOiBUaXAyME9wZXJhdGlvbik6IHZvaWQge1xuICAgIGlmICghaXNWYWxpZEFkZHJlc3Mob3BlcmF0aW9uLnRva2VuKSkge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcihgSW52YWxpZCB0b2tlbiBhZGRyZXNzOiAke29wZXJhdGlvbi50b2tlbn1gKTtcbiAgICB9XG5cbiAgICBpZiAoIWlzVmFsaWRBZGRyZXNzKG9wZXJhdGlvbi50bykpIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoYEludmFsaWQgcmVjaXBpZW50IGFkZHJlc3M6ICR7b3BlcmF0aW9uLnRvfWApO1xuICAgIH1cblxuICAgIGlmICghaXNWYWxpZFRpcDIwQW1vdW50KG9wZXJhdGlvbi5hbW91bnQpKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKGBJbnZhbGlkIGFtb3VudDogJHtvcGVyYXRpb24uYW1vdW50fWApO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIG1lbW8gYnl0ZSBsZW5ndGggKGhhbmRsZXMgbXVsdGktYnl0ZSBVVEYtOCBjaGFyYWN0ZXJzKVxuICAgIGlmIChvcGVyYXRpb24ubWVtbykge1xuICAgICAgY29uc3QgbWVtb0J5dGVMZW5ndGggPSBuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUob3BlcmF0aW9uLm1lbW8pLmxlbmd0aDtcbiAgICAgIGlmIChtZW1vQnl0ZUxlbmd0aCA+IDMyKSB7XG4gICAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoYE1lbW8gdG9vIGxvbmc6ICR7bWVtb0J5dGVMZW5ndGh9IGJ5dGVzLiBNYXhpbXVtIDMyIGJ5dGVzLmApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0IGEgVElQLTIwIG9wZXJhdGlvbiB0byBhbiBBQSBjYWxsXG4gICAqL1xuICBwcml2YXRlIG9wZXJhdGlvblRvQ2FsbChvcDogVGlwMjBPcGVyYXRpb24pOiB7IHRvOiBBZGRyZXNzOyBkYXRhOiBIZXg7IHZhbHVlOiBiaWdpbnQgfSB7XG4gICAgY29uc3QgYW1vdW50SW5Vbml0cyA9IGFtb3VudFRvVGlwMjBVbml0cyhvcC5hbW91bnQpO1xuICAgIGNvbnN0IGRhdGEgPSBlbmNvZGVUaXAyMFRyYW5zZmVyV2l0aE1lbW8ob3AudG8sIGFtb3VudEluVW5pdHMsIG9wLm1lbW8pO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHRvOiBvcC50b2tlbixcbiAgICAgIGRhdGEsXG4gICAgICB2YWx1ZTogMG4sXG4gICAgfTtcbiAgfVxufVxuIl19
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Type aliases for Ethereum addresses and hex strings
3
+ */
4
+ export type Address = string;
5
+ export type Hex = string;
6
+ export type TransactionSerializedEIP7702 = string;
7
+ /**
8
+ * TIP-20 Operation with optional memo
9
+ * Represents a single transfer operation in a transaction
10
+ */
11
+ export interface Tip20Operation {
12
+ token: Address;
13
+ to: Address;
14
+ amount: string;
15
+ memo?: string;
16
+ }
17
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/lib/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,MAAM,OAAO,GAAG,MAAM,CAAC;AAC7B,MAAM,MAAM,GAAG,GAAG,MAAM,CAAC;AACzB,MAAM,MAAM,4BAA4B,GAAG,MAAM,CAAC;AAElD;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,OAAO,CAAC;IACf,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;CACf"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3R5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFR5cGUgYWxpYXNlcyBmb3IgRXRoZXJldW0gYWRkcmVzc2VzIGFuZCBoZXggc3RyaW5nc1xuICovXG5leHBvcnQgdHlwZSBBZGRyZXNzID0gc3RyaW5nO1xuZXhwb3J0IHR5cGUgSGV4ID0gc3RyaW5nO1xuZXhwb3J0IHR5cGUgVHJhbnNhY3Rpb25TZXJpYWxpemVkRUlQNzcwMiA9IHN0cmluZztcblxuLyoqXG4gKiBUSVAtMjAgT3BlcmF0aW9uIHdpdGggb3B0aW9uYWwgbWVtb1xuICogUmVwcmVzZW50cyBhIHNpbmdsZSB0cmFuc2ZlciBvcGVyYXRpb24gaW4gYSB0cmFuc2FjdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRpcDIwT3BlcmF0aW9uIHtcbiAgdG9rZW46IEFkZHJlc3M7XG4gIHRvOiBBZGRyZXNzO1xuICBhbW91bnQ6IHN0cmluZztcbiAgbWVtbz86IHN0cmluZztcbn1cbiJdfQ==
@@ -1,25 +1,72 @@
1
1
  /**
2
- * Utility functions for Tempo
2
+ * Tempo Utility Functions
3
+ *
4
+ * Since Tempo is EVM-compatible, we can reuse Ethereum utilities
3
5
  */
6
+ type Address = string;
7
+ type Hex = string;
4
8
  /**
5
- * Check if the address is valid
6
- * @param address
9
+ * Check if address is valid Ethereum-style address
10
+ * Uses ethers.js isAddress for proper validation including checksum
7
11
  */
8
12
  export declare function isValidAddress(address: string): boolean;
9
13
  /**
10
- * Check if the public key is valid
11
- * @param publicKey
14
+ * Check if public key is valid (BIP32 xpub format)
15
+ * TODO: Replace with ETH utils when implementing
12
16
  */
13
17
  export declare function isValidPublicKey(publicKey: string): boolean;
14
18
  /**
15
- * Check if the private key is valid
16
- * @param privateKey
19
+ * Check if private key is valid (BIP32 xprv format)
20
+ * TODO: Replace with ETH utils when implementing
17
21
  */
18
22
  export declare function isValidPrivateKey(privateKey: string): boolean;
23
+ /**
24
+ * TIP-20 Utility Functions
25
+ */
26
+ /**
27
+ * Convert human-readable amount to TIP-20 units (6 decimals)
28
+ * @param amount - Human-readable amount (e.g., "1.5")
29
+ * @returns Amount in TIP-20 smallest units as bigint
30
+ * @example amountToTip20Units("1.5") => 1500000n
31
+ */
32
+ export declare function amountToTip20Units(amount: string): bigint;
33
+ /**
34
+ * Convert TIP-20 units (6 decimals) to human-readable amount
35
+ * @param units - Amount in TIP-20 smallest units
36
+ * @returns Human-readable amount string
37
+ * @example tip20UnitsToAmount(1500000n) => "1.5"
38
+ */
39
+ export declare function tip20UnitsToAmount(units: bigint): string;
40
+ /**
41
+ * Convert string to bytes32 for memo field
42
+ * @param memo - Memo string to encode
43
+ * @returns Hex-encoded bytes32 value
44
+ * @example stringToBytes32("INVOICE-001") => "0x494e564f4943452d30303100..."
45
+ */
46
+ export declare function stringToBytes32(memo: string): Hex;
47
+ /**
48
+ * Encode TIP-20 transferWithMemo function call using ethers.js
49
+ * @param to - Recipient address
50
+ * @param amount - Amount in TIP-20 units (bigint)
51
+ * @param memo - Optional memo string
52
+ * @returns Encoded function call data
53
+ */
54
+ export declare function encodeTip20TransferWithMemo(to: Address, amount: bigint, memo?: string): Hex;
55
+ /**
56
+ * Validate TIP-20 amount format
57
+ * @param amount - Amount string to validate
58
+ * @returns true if valid, false otherwise
59
+ */
60
+ export declare function isValidTip20Amount(amount: string): boolean;
19
61
  declare const utils: {
20
62
  isValidAddress: typeof isValidAddress;
21
63
  isValidPublicKey: typeof isValidPublicKey;
22
64
  isValidPrivateKey: typeof isValidPrivateKey;
65
+ amountToTip20Units: typeof amountToTip20Units;
66
+ tip20UnitsToAmount: typeof tip20UnitsToAmount;
67
+ stringToBytes32: typeof stringToBytes32;
68
+ encodeTip20TransferWithMemo: typeof encodeTip20TransferWithMemo;
69
+ isValidTip20Amount: typeof isValidTip20Amount;
23
70
  };
24
71
  export default utils;
25
72
  //# sourceMappingURL=utils.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/lib/utils.ts"],"names":[],"mappings":"AAEA;;GAEG;AAEH;;;GAGG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAGvD;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAG3D;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAG7D;AAED,QAAA,MAAM,KAAK;;;;CAIV,CAAC;AAEF,eAAe,KAAK,CAAC"}
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/lib/utils.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAOH,KAAK,OAAO,GAAG,MAAM,CAAC;AACtB,KAAK,GAAG,GAAG,MAAM,CAAC;AAElB;;;GAGG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAKvD;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAU3D;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAU7D;AAED;;GAEG;AAEH;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAMzD;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAExD;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,GAAG,CAOjD;AAED;;;;;;GAMG;AACH,wBAAgB,2BAA2B,CAAC,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,GAAG,CAK3F;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAc1D;AAED,QAAA,MAAM,KAAK;;;;;;;;;CASV,CAAC;AAEF,eAAe,KAAK,CAAC"}
@@ -1,40 +1,146 @@
1
1
  "use strict";
2
+ /**
3
+ * Tempo Utility Functions
4
+ *
5
+ * Since Tempo is EVM-compatible, we can reuse Ethereum utilities
6
+ */
2
7
  Object.defineProperty(exports, "__esModule", { value: true });
3
8
  exports.isValidAddress = isValidAddress;
4
9
  exports.isValidPublicKey = isValidPublicKey;
5
10
  exports.isValidPrivateKey = isValidPrivateKey;
11
+ exports.amountToTip20Units = amountToTip20Units;
12
+ exports.tip20UnitsToAmount = tip20UnitsToAmount;
13
+ exports.stringToBytes32 = stringToBytes32;
14
+ exports.encodeTip20TransferWithMemo = encodeTip20TransferWithMemo;
15
+ exports.isValidTip20Amount = isValidTip20Amount;
16
+ const secp256k1_1 = require("@bitgo-beta/secp256k1");
17
+ const ethers_1 = require("ethers");
6
18
  const constants_1 = require("./constants");
19
+ const tip20Abi_1 = require("./tip20Abi");
7
20
  /**
8
- * Utility functions for Tempo
9
- */
10
- /**
11
- * Check if the address is valid
12
- * @param address
21
+ * Check if address is valid Ethereum-style address
22
+ * Uses ethers.js isAddress for proper validation including checksum
13
23
  */
14
24
  function isValidAddress(address) {
15
- // TODO: Implement proper address validation for Tempo
16
- return constants_1.VALID_ADDRESS_REGEX.test(address);
25
+ if (typeof address !== 'string') {
26
+ return false;
27
+ }
28
+ return ethers_1.ethers.utils.isAddress(address);
17
29
  }
18
30
  /**
19
- * Check if the public key is valid
20
- * @param publicKey
31
+ * Check if public key is valid (BIP32 xpub format)
32
+ * TODO: Replace with ETH utils when implementing
21
33
  */
22
34
  function isValidPublicKey(publicKey) {
23
- // TODO: Implement proper public key validation for Tempo
24
- return constants_1.VALID_PUBLIC_KEY_REGEX.test(publicKey);
35
+ if (typeof publicKey !== 'string') {
36
+ return false;
37
+ }
38
+ try {
39
+ const hdNode = secp256k1_1.bip32.fromBase58(publicKey);
40
+ return hdNode.isNeutered();
41
+ }
42
+ catch (e) {
43
+ return false;
44
+ }
25
45
  }
26
46
  /**
27
- * Check if the private key is valid
28
- * @param privateKey
47
+ * Check if private key is valid (BIP32 xprv format)
48
+ * TODO: Replace with ETH utils when implementing
29
49
  */
30
50
  function isValidPrivateKey(privateKey) {
31
- // TODO: Implement proper private key validation for Tempo
32
- return privateKey.length === 64;
51
+ if (typeof privateKey !== 'string') {
52
+ return false;
53
+ }
54
+ try {
55
+ const hdNode = secp256k1_1.bip32.fromBase58(privateKey);
56
+ return !hdNode.isNeutered();
57
+ }
58
+ catch (e) {
59
+ return false;
60
+ }
61
+ }
62
+ /**
63
+ * TIP-20 Utility Functions
64
+ */
65
+ /**
66
+ * Convert human-readable amount to TIP-20 units (6 decimals)
67
+ * @param amount - Human-readable amount (e.g., "1.5")
68
+ * @returns Amount in TIP-20 smallest units as bigint
69
+ * @example amountToTip20Units("1.5") => 1500000n
70
+ */
71
+ function amountToTip20Units(amount) {
72
+ try {
73
+ return BigInt(ethers_1.ethers.utils.parseUnits(amount, constants_1.TIP20_DECIMALS).toString());
74
+ }
75
+ catch (error) {
76
+ throw new Error(`Invalid amount format: ${amount}. Expected decimal string.`);
77
+ }
78
+ }
79
+ /**
80
+ * Convert TIP-20 units (6 decimals) to human-readable amount
81
+ * @param units - Amount in TIP-20 smallest units
82
+ * @returns Human-readable amount string
83
+ * @example tip20UnitsToAmount(1500000n) => "1.5"
84
+ */
85
+ function tip20UnitsToAmount(units) {
86
+ return ethers_1.ethers.utils.formatUnits(units.toString(), constants_1.TIP20_DECIMALS);
87
+ }
88
+ /**
89
+ * Convert string to bytes32 for memo field
90
+ * @param memo - Memo string to encode
91
+ * @returns Hex-encoded bytes32 value
92
+ * @example stringToBytes32("INVOICE-001") => "0x494e564f4943452d30303100..."
93
+ */
94
+ function stringToBytes32(memo) {
95
+ const memoByteLength = new TextEncoder().encode(memo).length;
96
+ if (memoByteLength > 32) {
97
+ throw new Error(`Memo too long: ${memoByteLength} bytes. Maximum 32 bytes.`);
98
+ }
99
+ const hexString = ethers_1.ethers.utils.hexlify(ethers_1.ethers.utils.toUtf8Bytes(memo));
100
+ return ethers_1.ethers.utils.hexZeroPad(hexString, 32);
101
+ }
102
+ /**
103
+ * Encode TIP-20 transferWithMemo function call using ethers.js
104
+ * @param to - Recipient address
105
+ * @param amount - Amount in TIP-20 units (bigint)
106
+ * @param memo - Optional memo string
107
+ * @returns Encoded function call data
108
+ */
109
+ function encodeTip20TransferWithMemo(to, amount, memo) {
110
+ const memoBytes = memo ? stringToBytes32(memo) : ethers_1.ethers.utils.hexZeroPad('0x', 32);
111
+ const iface = new ethers_1.ethers.utils.Interface(tip20Abi_1.TIP20_TRANSFER_WITH_MEMO_ABI);
112
+ return iface.encodeFunctionData('transferWithMemo', [to, amount, memoBytes]);
113
+ }
114
+ /**
115
+ * Validate TIP-20 amount format
116
+ * @param amount - Amount string to validate
117
+ * @returns true if valid, false otherwise
118
+ */
119
+ function isValidTip20Amount(amount) {
120
+ if (typeof amount !== 'string' || amount.trim() === '') {
121
+ return false;
122
+ }
123
+ // Check for negative amounts before parsing
124
+ if (amount.startsWith('-')) {
125
+ return false;
126
+ }
127
+ try {
128
+ const parsed = ethers_1.ethers.utils.parseUnits(amount, constants_1.TIP20_DECIMALS);
129
+ return parsed.gte(0);
130
+ }
131
+ catch {
132
+ return false;
133
+ }
33
134
  }
34
135
  const utils = {
35
136
  isValidAddress,
36
137
  isValidPublicKey,
37
138
  isValidPrivateKey,
139
+ amountToTip20Units,
140
+ tip20UnitsToAmount,
141
+ stringToBytes32,
142
+ encodeTip20TransferWithMemo,
143
+ isValidTip20Amount,
38
144
  };
39
145
  exports.default = utils;
40
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBVUEsd0NBR0M7QUFNRCw0Q0FHQztBQU1ELDhDQUdDO0FBL0JELDJDQUEwRTtBQUUxRTs7R0FFRztBQUVIOzs7R0FHRztBQUNILFNBQWdCLGNBQWMsQ0FBQyxPQUFlO0lBQzVDLHNEQUFzRDtJQUN0RCxPQUFPLCtCQUFtQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUMzQyxDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsU0FBZ0IsZ0JBQWdCLENBQUMsU0FBaUI7SUFDaEQseURBQXlEO0lBQ3pELE9BQU8sa0NBQXNCLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0FBQ2hELENBQUM7QUFFRDs7O0dBR0c7QUFDSCxTQUFnQixpQkFBaUIsQ0FBQyxVQUFrQjtJQUNsRCwwREFBMEQ7SUFDMUQsT0FBTyxVQUFVLENBQUMsTUFBTSxLQUFLLEVBQUUsQ0FBQztBQUNsQyxDQUFDO0FBRUQsTUFBTSxLQUFLLEdBQUc7SUFDWixjQUFjO0lBQ2QsZ0JBQWdCO0lBQ2hCLGlCQUFpQjtDQUNsQixDQUFDO0FBRUYsa0JBQWUsS0FBSyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVkFMSURfQUREUkVTU19SRUdFWCwgVkFMSURfUFVCTElDX0tFWV9SRUdFWCB9IGZyb20gJy4vY29uc3RhbnRzJztcblxuLyoqXG4gKiBVdGlsaXR5IGZ1bmN0aW9ucyBmb3IgVGVtcG9cbiAqL1xuXG4vKipcbiAqIENoZWNrIGlmIHRoZSBhZGRyZXNzIGlzIHZhbGlkXG4gKiBAcGFyYW0gYWRkcmVzc1xuICovXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZEFkZHJlc3MoYWRkcmVzczogc3RyaW5nKTogYm9vbGVhbiB7XG4gIC8vIFRPRE86IEltcGxlbWVudCBwcm9wZXIgYWRkcmVzcyB2YWxpZGF0aW9uIGZvciBUZW1wb1xuICByZXR1cm4gVkFMSURfQUREUkVTU19SRUdFWC50ZXN0KGFkZHJlc3MpO1xufVxuXG4vKipcbiAqIENoZWNrIGlmIHRoZSBwdWJsaWMga2V5IGlzIHZhbGlkXG4gKiBAcGFyYW0gcHVibGljS2V5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkUHVibGljS2V5KHB1YmxpY0tleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIC8vIFRPRE86IEltcGxlbWVudCBwcm9wZXIgcHVibGljIGtleSB2YWxpZGF0aW9uIGZvciBUZW1wb1xuICByZXR1cm4gVkFMSURfUFVCTElDX0tFWV9SRUdFWC50ZXN0KHB1YmxpY0tleSk7XG59XG5cbi8qKlxuICogQ2hlY2sgaWYgdGhlIHByaXZhdGUga2V5IGlzIHZhbGlkXG4gKiBAcGFyYW0gcHJpdmF0ZUtleVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZFByaXZhdGVLZXkocHJpdmF0ZUtleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIC8vIFRPRE86IEltcGxlbWVudCBwcm9wZXIgcHJpdmF0ZSBrZXkgdmFsaWRhdGlvbiBmb3IgVGVtcG9cbiAgcmV0dXJuIHByaXZhdGVLZXkubGVuZ3RoID09PSA2NDtcbn1cblxuY29uc3QgdXRpbHMgPSB7XG4gIGlzVmFsaWRBZGRyZXNzLFxuICBpc1ZhbGlkUHVibGljS2V5LFxuICBpc1ZhbGlkUHJpdmF0ZUtleSxcbn07XG5cbmV4cG9ydCBkZWZhdWx0IHV0aWxzO1xuIl19
146
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7OztHQUlHOztBQWNILHdDQUtDO0FBTUQsNENBVUM7QUFNRCw4Q0FVQztBQVlELGdEQU1DO0FBUUQsZ0RBRUM7QUFRRCwwQ0FPQztBQVNELGtFQUtDO0FBT0QsZ0RBY0M7QUEvSEQscURBQThDO0FBQzlDLG1DQUFnQztBQUNoQywyQ0FBNkM7QUFDN0MseUNBQTBEO0FBSzFEOzs7R0FHRztBQUNILFNBQWdCLGNBQWMsQ0FBQyxPQUFlO0lBQzVDLElBQUksT0FBTyxPQUFPLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDaEMsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBQ0QsT0FBTyxlQUFNLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUN6QyxDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsU0FBZ0IsZ0JBQWdCLENBQUMsU0FBaUI7SUFDaEQsSUFBSSxPQUFPLFNBQVMsS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUNsQyxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFDRCxJQUFJLENBQUM7UUFDSCxNQUFNLE1BQU0sR0FBRyxpQkFBSyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUMzQyxPQUFPLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUM3QixDQUFDO0lBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztRQUNYLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztBQUNILENBQUM7QUFFRDs7O0dBR0c7QUFDSCxTQUFnQixpQkFBaUIsQ0FBQyxVQUFrQjtJQUNsRCxJQUFJLE9BQU8sVUFBVSxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQ25DLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUNELElBQUksQ0FBQztRQUNILE1BQU0sTUFBTSxHQUFHLGlCQUFLLENBQUMsVUFB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SUFDaEIsaUJBQWlCO0lBQ2pCLGtCQUFrQjtJQUNsQixrQkFBa0I7SUFDbEIsZUFBZTtJQUNmLDJCQUEyQjtJQUMzQixrQkFBa0I7Q0FDbkIsQ0FBQztBQUVGLGtCQUFlLEtBQUssQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVGVtcG8gVXRpbGl0eSBGdW5jdGlvbnNcbiAqXG4gKiBTaW5jZSBUZW1wbyBpcyBFVk0tY29tcGF0aWJsZSwgd2UgY2FuIHJldXNlIEV0aGVyZXVtIHV0aWxpdGllc1xuICovXG5cbmltcG9ydCB7IGJpcDMyIH0gZnJvbSAnQGJpdGdvLWJldGEvc2VjcDI1NmsxJztcbmltcG9ydCB7IGV0aGVycyB9IGZyb20gJ2V0aGVycyc7XG5pbXBvcnQgeyBUSVAyMF9ERUNJTUFMUyB9IGZyb20gJy4vY29uc3RhbnRzJztcbmltcG9ydCB7IFRJUDIwX1RSQU5TRkVSX1dJVEhfTUVNT19BQkkgfSBmcm9tICcuL3RpcDIwQWJpJztcblxudHlwZSBBZGRyZXNzID0gc3RyaW5nO1xudHlwZSBIZXggPSBzdHJpbmc7XG5cbi8qKlxuICogQ2hlY2sgaWYgYWRkcmVzcyBpcyB2YWxpZCBFdGhlcmV1bS1zdHlsZSBhZGRyZXNzXG4gKiBVc2VzIGV0aGVycy5qcyBpc0FkZHJlc3MgZm9yIHByb3BlciB2YWxpZGF0aW9uIGluY2x1ZGluZyBjaGVja3N1bVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZEFkZHJlc3MoYWRkcmVzczogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGlmICh0eXBlb2YgYWRkcmVzcyAhPT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIGV0aGVycy51dGlscy5pc0FkZHJlc3MoYWRkcmVzcyk7XG59XG5cbi8qKlxuICogQ2hlY2sgaWYgcHVibGljIGtleSBpcyB2YWxpZCAoQklQMzIgeHB1YiBmb3JtYXQpXG4gKiBUT0RPOiBSZXBsYWNlIHdpdGggRVRIIHV0aWxzIHdoZW4gaW1wbGVtZW50aW5nXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkUHVibGljS2V5KHB1YmxpY0tleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGlmICh0eXBlb2YgcHVibGljS2V5ICE9PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB0cnkge1xuICAgIGNvbnN0IGhkTm9kZSA9IGJpcDMyLmZyb21CYXNlNTgocHVibGljS2V5KTtcbiAgICByZXR1cm4gaGROb2RlLmlzTmV1dGVyZWQoKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG4vKipcbiAqIENoZWNrIGlmIHByaXZhdGUga2V5IGlzIHZhbGlkIChCSVAzMiB4cHJ2IGZvcm1hdClcbiAqIFRPRE86IFJlcGxhY2Ugd2l0aCBFVEggdXRpbHMgd2hlbiBpbXBsZW1lbnRpbmdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVmFsaWRQcml2YXRlS2V5KHByaXZhdGVLZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBpZiAodHlwZW9mIHByaXZhdGVLZXkgIT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHRyeSB7XG4gICAgY29uc3QgaGROb2RlID0gYmlwMzIuZnJvbUJhc2U1OChwcml2YXRlS2V5KTtcbiAgICByZXR1cm4gIWhkTm9kZS5pc05ldXRlcmVkKCk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuLyoqXG4gKiBUSVAtMjAgVXRpbGl0eSBGdW5jdGlvbnNcbiAqL1xuXG4vKipcbiAqIENvbnZlcnQgaHVtYW4tcmVhZGFibGUgYW1vdW50IHRvIFRJUC0yMCB1bml0cyAoNiBkZWNpbWFscylcbiAqIEBwYXJhbSBhbW91bnQgLSBIdW1hbi1yZWFkYWJsZSBhbW91bnQgKGUuZy4sIFwiMS41XCIpXG4gKiBAcmV0dXJucyBBbW91bnQgaW4gVElQLTIwIHNtYWxsZXN0IHVuaXRzIGFzIGJpZ2ludFxuICogQGV4YW1wbGUgYW1vdW50VG9UaXAyMFVuaXRzKFwiMS41XCIpID0+IDE1MDAwMDBuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhbW91bnRUb1RpcDIwVW5pdHMoYW1vdW50OiBzdHJpbmcpOiBiaWdpbnQge1xuICB0cnkge1xuICAgIHJldHVybiBCaWdJbnQoZXRoZXJzLnV0aWxzLnBhcnNlVW5pdHMoYW1vdW50LCBUSVAyMF9ERUNJTUFMUykudG9TdHJpbmcoKSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGFtb3VudCBmb3JtYXQ6ICR7YW1vdW50fS4gRXhwZWN0ZWQgZGVjaW1hbCBzdHJpbmcuYCk7XG4gIH1cbn1cblxuLyoqXG4gKiBDb252ZXJ0IFRJUC0yMCB1bml0cyAoNiBkZWNpbWFscykgdG8gaHVtYW4tcmVhZGFibGUgYW1vdW50XG4gKiBAcGFyYW0gdW5pdHMgLSBBbW91bnQgaW4gVElQLTIwIHNtYWxsZXN0IHVuaXRzXG4gKiBAcmV0dXJucyBIdW1hbi1yZWFkYWJsZSBhbW91bnQgc3RyaW5nXG4gKiBAZXhhbXBsZSB0aXAyMFVuaXRzVG9BbW91bnQoMTUwMDAwMG4pID0+IFwiMS41XCJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRpcDIwVW5pdHNUb0Ftb3VudCh1bml0czogYmlnaW50KTogc3RyaW5nIHtcbiAgcmV0dXJuIGV0aGVycy51dGlscy5mb3JtYXRVbml0cyh1bml0cy50b1N0cmluZygpLCBUSVAyMF9ERUNJTUFMUyk7XG59XG5cbi8qKlxuICogQ29udmVydCBzdHJpbmcgdG8gYnl0ZXMzMiBmb3IgbWVtbyBmaWVsZFxuICogQHBhcmFtIG1lbW8gLSBNZW1vIHN0cmluZyB0byBlbmNvZGVcbiAqIEByZXR1cm5zIEhleC1lbmNvZGVkIGJ5dGVzMzIgdmFsdWVcbiAqIEBleGFtcGxlIHN0cmluZ1RvQnl0ZXMzMihcIklOVk9JQ0UtMDAxXCIpID0+IFwiMHg0OTRlNTY0ZjQ5NDM0NTJkMzAzMDMxMDAuLi5cIlxuICovXG5leHBvcnQgZnVuY3Rpb24gc3RyaW5nVG9CeXRlczMyKG1lbW86IHN0cmluZyk6IEhleCB7XG4gIGNvbnN0IG1lbW9CeXRlTGVuZ3RoID0gbmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKG1lbW8pLmxlbmd0aDtcbiAgaWYgKG1lbW9CeXRlTGVuZ3RoID4gMzIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYE1lbW8gdG9vIGxvbmc6ICR7bWVtb0J5dGVMZW5ndGh9IGJ5dGVzLiBNYXhpbXVtIDMyIGJ5dGVzLmApO1xuICB9XG4gIGNvbnN0IGhleFN0cmluZyA9IGV0aGVycy51dGlscy5oZXhsaWZ5KGV0aGVycy51dGlscy50b1V0ZjhCeXRlcyhtZW1vKSk7XG4gIHJldHVybiBldGhlcnMudXRpbHMuaGV4WmVyb1BhZChoZXhTdHJpbmcsIDMyKTtcbn1cblxuLyoqXG4gKiBFbmNvZGUgVElQLTIwIHRyYW5zZmVyV2l0aE1lbW8gZnVuY3Rpb24gY2FsbCB1c2luZyBldGhlcnMuanNcbiAqIEBwYXJhbSB0byAtIFJlY2lwaWVudCBhZGRyZXNzXG4gKiBAcGFyYW0gYW1vdW50IC0gQW1vdW50IGluIFRJUC0yMCB1bml0cyAoYmlnaW50KVxuICogQHBhcmFtIG1lbW8gLSBPcHRpb25hbCBtZW1vIHN0cmluZ1xuICogQHJldHVybnMgRW5jb2RlZCBmdW5jdGlvbiBjYWxsIGRhdGFcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVuY29kZVRpcDIwVHJhbnNmZXJXaXRoTWVtbyh0bzogQWRkcmVzcywgYW1vdW50OiBiaWdpbnQsIG1lbW8/OiBzdHJpbmcpOiBIZXgge1xuICBjb25zdCBtZW1vQnl0ZXMgPSBtZW1vID8gc3RyaW5nVG9CeXRlczMyKG1lbW8pIDogZXRoZXJzLnV0aWxzLmhleFplcm9QYWQoJzB4JywgMzIpO1xuXG4gIGNvbnN0IGlmYWNlID0gbmV3IGV0aGVycy51dGlscy5JbnRlcmZhY2UoVElQMjBfVFJBTlNGRVJfV0lUSF9NRU1PX0FCSSk7XG4gIHJldHVybiBpZmFjZS5lbmNvZGVGdW5jdGlvbkRhdGEoJ3RyYW5zZmVyV2l0aE1lbW8nLCBbdG8sIGFtb3VudCwgbWVtb0J5dGVzXSk7XG59XG5cbi8qKlxuICogVmFsaWRhdGUgVElQLTIwIGFtb3VudCBmb3JtYXRcbiAqIEBwYXJhbSBhbW91bnQgLSBBbW91bnQgc3RyaW5nIHRvIHZhbGlkYXRlXG4gKiBAcmV0dXJucyB0cnVlIGlmIHZhbGlkLCBmYWxzZSBvdGhlcndpc2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVmFsaWRUaXAyMEFtb3VudChhbW91bnQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBpZiAodHlwZW9mIGFtb3VudCAhPT0gJ3N0cmluZycgfHwgYW1vdW50LnRyaW0oKSA9PT0gJycpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgLy8gQ2hlY2sgZm9yIG5lZ2F0aXZlIGFtb3VudHMgYmVmb3JlIHBhcnNpbmdcbiAgaWYgKGFtb3VudC5zdGFydHNXaXRoKCctJykpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgdHJ5IHtcbiAgICBjb25zdCBwYXJzZWQgPSBldGhlcnMudXRpbHMucGFyc2VVbml0cyhhbW91bnQsIFRJUDIwX0RFQ0lNQUxTKTtcbiAgICByZXR1cm4gcGFyc2VkLmd0ZSgwKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmNvbnN0IHV0aWxzID0ge1xuICBpc1ZhbGlkQWRkcmVzcyxcbiAgaXNWYWxpZFB1YmxpY0tleSxcbiAgaXNWYWxpZFByaXZhdGVLZXksXG4gIGFtb3VudFRvVGlwMjBVbml0cyxcbiAgdGlwMjBVbml0c1RvQW1vdW50LFxuICBzdHJpbmdUb0J5dGVzMzIsXG4gIGVuY29kZVRpcDIwVHJhbnNmZXJXaXRoTWVtbyxcbiAgaXNWYWxpZFRpcDIwQW1vdW50LFxufTtcblxuZXhwb3J0IGRlZmF1bHQgdXRpbHM7XG4iXX0=
@@ -1,3 +1,7 @@
1
1
  import { BitGoBase } from '@bitgo-beta/sdk-core';
2
+ /**
3
+ * Register Tempo and TIP20 tokens with the SDK
4
+ * @param sdk - BitGo SDK instance
5
+ */
2
6
  export declare const register: (sdk: BitGoBase) => void;
3
7
  //# sourceMappingURL=register.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"register.d.ts","sourceRoot":"","sources":["../../src/register.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAIjD,eAAO,MAAM,QAAQ,QAAS,SAAS,KAAG,IAGzC,CAAC"}
1
+ {"version":3,"file":"register.d.ts","sourceRoot":"","sources":["../../src/register.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAKjD;;;GAGG;AACH,eAAO,MAAM,QAAQ,QAAS,SAAS,KAAG,IAyBzC,CAAC"}