@bitgo-beta/sdk-coin-tempo 1.0.1-beta.31 → 1.0.1-beta.310

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 (51) 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 +21 -1
  5. package/dist/src/lib/constants.d.ts.map +1 -1
  6. package/dist/src/lib/constants.js +25 -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 +5 -25
  11. package/dist/src/lib/keyPair.d.ts.map +1 -1
  12. package/dist/src/lib/keyPair.js +9 -97
  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 +144 -0
  17. package/dist/src/lib/transaction.d.ts.map +1 -0
  18. package/dist/src/lib/transaction.js +216 -0
  19. package/dist/src/lib/transactionBuilder.d.ts +139 -0
  20. package/dist/src/lib/transactionBuilder.d.ts.map +1 -0
  21. package/dist/src/lib/transactionBuilder.js +408 -0
  22. package/dist/src/lib/types.d.ts +27 -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 +70 -7
  26. package/dist/src/lib/utils.d.ts.map +1 -1
  27. package/dist/src/lib/utils.js +148 -16
  28. package/dist/src/register.d.ts.map +1 -1
  29. package/dist/src/register.js +5 -1
  30. package/dist/src/tempo.d.ts +95 -41
  31. package/dist/src/tempo.d.ts.map +1 -1
  32. package/dist/src/tempo.js +447 -76
  33. package/dist/src/tip20Token.d.ts +83 -0
  34. package/dist/src/tip20Token.d.ts.map +1 -0
  35. package/dist/src/tip20Token.js +202 -0
  36. package/dist/test/integration/tip20.d.ts +7 -0
  37. package/dist/test/integration/tip20.d.ts.map +1 -0
  38. package/dist/test/integration/tip20.js +178 -0
  39. package/dist/test/resources/tempo.d.ts +61 -0
  40. package/dist/test/resources/tempo.d.ts.map +1 -0
  41. package/dist/test/resources/tempo.js +79 -0
  42. package/dist/test/unit/index.js +172 -3
  43. package/dist/test/unit/tempo.d.ts +2 -0
  44. package/dist/test/unit/tempo.d.ts.map +1 -0
  45. package/dist/test/unit/tempo.js +207 -0
  46. package/dist/test/unit/transactionBuilder.d.ts +2 -0
  47. package/dist/test/unit/transactionBuilder.d.ts.map +1 -0
  48. package/dist/test/unit/transactionBuilder.js +858 -0
  49. package/dist/test/unit/utils.js +6 -5
  50. package/dist/tsconfig.tsbuildinfo +1 -1
  51. package/package.json +12 -7
@@ -0,0 +1,216 @@
1
+ "use strict";
2
+ /**
3
+ * TIP-20 Transaction
4
+ *
5
+ * Represents a Tempo Account Abstraction (AA) transaction (type 0x76)
6
+ * Supports single or batch TIP-20 token transfers with memos
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.Tip20Transaction = void 0;
10
+ const sdk_core_1 = require("@bitgo-beta/sdk-core");
11
+ const ethers_1 = require("ethers");
12
+ const utils_1 = require("./utils");
13
+ class Tip20Transaction extends sdk_core_1.BaseTransaction {
14
+ constructor(_coinConfig, request, operations = [], rawCalls = []) {
15
+ super(_coinConfig);
16
+ this.txRequest = request;
17
+ this._operations = operations;
18
+ this._rawCalls = rawCalls;
19
+ this._outputs = [
20
+ ...operations.map((op) => ({
21
+ address: op.to,
22
+ value: (0, utils_1.amountToTip20Units)(op.amount).toString(),
23
+ coin: op.token,
24
+ })),
25
+ ...rawCalls.map((call) => ({
26
+ address: call.to,
27
+ value: call.value || '0',
28
+ coin: _coinConfig.name,
29
+ })),
30
+ ];
31
+ const totalUnits = operations.reduce((sum, op) => sum + (0, utils_1.amountToTip20Units)(op.amount), 0n);
32
+ this._inputs = [{ address: '', value: totalUnits.toString(), coin: _coinConfig.name }];
33
+ }
34
+ get type() {
35
+ return sdk_core_1.TransactionType.Send;
36
+ }
37
+ canSign() {
38
+ return true;
39
+ }
40
+ async serialize(signature) {
41
+ const sig = signature || this._signature;
42
+ return this.serializeTransaction(sig);
43
+ }
44
+ /**
45
+ * Encode calls as RLP tuples for atomic batch execution
46
+ * @returns Array of [to, value, data] tuples
47
+ * @private
48
+ */
49
+ encodeCallsAsTuples() {
50
+ return this.txRequest.calls.map((call) => [call.to, this.bigintToHex(call.value), call.data]);
51
+ }
52
+ /**
53
+ * Encode EIP-2930 access list as RLP tuples
54
+ * @returns Array of [address, storageKeys[]] tuples
55
+ * @private
56
+ */
57
+ encodeAccessList() {
58
+ return (this.txRequest.accessList ?? []).map((item) => [item.address, item.storageKeys || []]);
59
+ }
60
+ /**
61
+ * Convert bigint to hex string for RLP encoding
62
+ * @param value bigint value to convert
63
+ * @returns Hex string
64
+ * @private
65
+ */
66
+ bigintToHex(value) {
67
+ if (value === 0n) {
68
+ return '0x';
69
+ }
70
+ const hex = value.toString(16);
71
+ return '0x' + (hex.length % 2 ? '0' : '') + hex;
72
+ }
73
+ /**
74
+ * Build base RLP data array per Tempo EIP-7702 specification
75
+ * @param callsTuples Encoded calls
76
+ * @param accessTuples Encoded access list
77
+ * @returns RLP-ready array of transaction fields
78
+ * @private
79
+ */
80
+ buildBaseRlpData(callsTuples, accessTuples) {
81
+ return [
82
+ ethers_1.ethers.utils.hexlify(this.txRequest.chainId),
83
+ this.txRequest.maxPriorityFeePerGas ? this.bigintToHex(this.txRequest.maxPriorityFeePerGas) : '0x',
84
+ this.bigintToHex(this.txRequest.maxFeePerGas),
85
+ this.bigintToHex(this.txRequest.gas),
86
+ callsTuples,
87
+ accessTuples,
88
+ '0x', // nonceKey (reserved for 2D nonce system)
89
+ this.txRequest.nonce ? this.bigintToHex(BigInt(this.txRequest.nonce)) : '0x',
90
+ '0x', // validBefore (reserved for time bounds)
91
+ '0x', // validAfter (reserved for time bounds)
92
+ this.txRequest.feeToken || '0x',
93
+ '0x', // feePayerSignature (reserved for sponsorship)
94
+ [], // authorizationList (EIP-7702)
95
+ ];
96
+ }
97
+ /**
98
+ * Encode secp256k1 signature as 65-byte envelope
99
+ * @param signature ECDSA signature components
100
+ * @returns Hex string of concatenated r (32) + s (32) + v (1) bytes
101
+ * @private
102
+ */
103
+ encodeSignature(signature) {
104
+ const v = signature.yParity + 27;
105
+ const signatureBytes = ethers_1.ethers.utils.concat([
106
+ ethers_1.ethers.utils.zeroPad(signature.r, 32),
107
+ ethers_1.ethers.utils.zeroPad(signature.s, 32),
108
+ ethers_1.ethers.utils.hexlify(v),
109
+ ]);
110
+ return ethers_1.ethers.utils.hexlify(signatureBytes);
111
+ }
112
+ /**
113
+ * RLP encode and prepend transaction type byte
114
+ * @param rlpData Transaction fields array
115
+ * @returns Hex string with 0x76 prefix
116
+ * @private
117
+ */
118
+ rlpEncodeWithTypePrefix(rlpData) {
119
+ try {
120
+ const encoded = ethers_1.ethers.utils.RLP.encode(rlpData);
121
+ return ('0x76' + encoded.slice(2));
122
+ }
123
+ catch (error) {
124
+ throw new sdk_core_1.ParseTransactionError(`Failed to RLP encode transaction: ${error}`);
125
+ }
126
+ }
127
+ /**
128
+ * Serialize Tempo AA transaction (type 0x76) per EIP-7702 specification
129
+ * Format: 0x76 || RLP([chainId, fees, gas, calls, accessList, nonce fields, feeToken, sponsorship, authList, signature?])
130
+ * @param signature Optional ECDSA signature (omit for unsigned transactions)
131
+ * @returns RLP-encoded transaction hex string
132
+ * @private
133
+ */
134
+ serializeTransaction(signature) {
135
+ const callsTuples = this.encodeCallsAsTuples();
136
+ const accessTuples = this.encodeAccessList();
137
+ const rlpData = this.buildBaseRlpData(callsTuples, accessTuples);
138
+ if (signature) {
139
+ rlpData.push(this.encodeSignature(signature));
140
+ }
141
+ return this.rlpEncodeWithTypePrefix(rlpData);
142
+ }
143
+ getOperations() {
144
+ return [...this._operations];
145
+ }
146
+ getRawCalls() {
147
+ return [...this._rawCalls];
148
+ }
149
+ getFeeToken() {
150
+ return this.txRequest.feeToken;
151
+ }
152
+ getOperationCount() {
153
+ return this._operations.length + this._rawCalls.length;
154
+ }
155
+ isBatch() {
156
+ return this.txRequest.calls.length > 1;
157
+ }
158
+ setSignature(signature) {
159
+ this._signature = signature;
160
+ }
161
+ getSignature() {
162
+ return this._signature;
163
+ }
164
+ /**
165
+ * Recover the signer address from the transaction signature.
166
+ * @returns Checksummed sender address, or undefined if unsigned
167
+ */
168
+ getSenderAddress() {
169
+ if (!this._signature) {
170
+ return undefined;
171
+ }
172
+ const unsignedHex = this.serializeTransaction();
173
+ const msgHash = ethers_1.ethers.utils.keccak256(ethers_1.ethers.utils.arrayify(unsignedHex));
174
+ return ethers_1.ethers.utils.recoverAddress(msgHash, {
175
+ r: this._signature.r,
176
+ s: this._signature.s,
177
+ recoveryParam: this._signature.yParity,
178
+ });
179
+ }
180
+ toJson() {
181
+ return {
182
+ type: this.txRequest.type,
183
+ chainId: this.txRequest.chainId,
184
+ nonce: this.txRequest.nonce,
185
+ maxFeePerGas: this.txRequest.maxFeePerGas.toString(),
186
+ maxPriorityFeePerGas: this.txRequest.maxPriorityFeePerGas.toString(),
187
+ gas: this.txRequest.gas.toString(),
188
+ callCount: this.txRequest.calls.length,
189
+ feeToken: this.txRequest.feeToken,
190
+ operations: this._operations,
191
+ rawCalls: this._rawCalls,
192
+ signature: this._signature,
193
+ };
194
+ }
195
+ async toBroadcastFormat() {
196
+ return await this.serialize(this._signature);
197
+ }
198
+ /** @inheritdoc */
199
+ get id() {
200
+ try {
201
+ const serialized = this.serializeTransaction(this._signature);
202
+ return ethers_1.ethers.utils.keccak256(ethers_1.ethers.utils.arrayify(serialized));
203
+ }
204
+ catch {
205
+ return 'pending';
206
+ }
207
+ }
208
+ toString() {
209
+ return JSON.stringify(this.toJson(), null, 2);
210
+ }
211
+ canBroadcast() {
212
+ return this.txRequest.calls.length > 0 && this.txRequest.chainId > 0;
213
+ }
214
+ }
215
+ exports.Tip20Transaction = Tip20Transaction;
216
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3RyYW5zYWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7R0FLRzs7O0FBRUgsbURBQStGO0FBRS9GLG1DQUFnQztBQUVoQyxtQ0FBNkM7QUF5QzdDLE1BQWEsZ0JBQWlCLFNBQVEsMEJBQWU7SUFNbkQsWUFDRSxXQUFpQyxFQUNqQyxPQUFnQyxFQUNoQyxhQUErQixFQUFFLEVBQ2pDLFdBQThCLEVBQUU7UUFFaEMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ25CLElBQUksQ0FBQyxTQUFTLEdBQUcsT0FBTyxDQUFDO1FBQ3pCLElBQUksQ0FBQyxXQUFXLEdBQUcsVUFBVSxDQUFDO1FBQzlCLElBQUksQ0FBQyxTQUFTLEdBQUcsUUFBUSxDQUFDO1FBQzFCLElBQUksQ0FBQyxRQUFRLEdBQUc7WUFDZCxHQUFHLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7Z0JBQ3pCLE9BQU8sRUFBRSxFQUFFLENBQUMsRUFBRTtnQkFDZCxLQUFLLEVBQUUsSUFBQSwwQkFBa0IsRUFBQyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsUUFBUSxFQUFFO2dCQUMvQyxJQUFJLEVBQUUsRUFBRSxDQUFDLEtBQUs7YUFDZixDQUFDLENBQUM7WUFDSCxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7Z0JBQ3pCLE9BQU8sRUFBRSxJQUFJLENBQUMsRUFBRTtnQkFDaEIsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLElBQUksR0FBRztnQkFDeEIsSUFBSSxFQUFFLFdBQVcsQ0FBQyxJQUFJO2FBQ3ZCLENBQUMsQ0FBQztTQUNKLENBQUM7UUFDRixNQUFNLFVBQVUsR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsRUFBRSxF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QUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDOUQsT0FBTyxlQUFNLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxlQUFNLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO1FBQ25FLENBQUM7UUFBQyxNQUFNLENBQUM7WUFDUCxPQUFPLFNBQVMsQ0FBQztRQUNuQixDQUFDO0lBQ0gsQ0FBQztJQUVELFFBQVE7UUFDTixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNoRCxDQUFDO0lBRUQsWUFBWTtRQUNWLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUM7SUFDdkUsQ0FBQztDQUNGO0FBM09ELDRDQTJPQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVElQLTIwIFRyYW5zYWN0aW9uXG4gKlxuICogUmVwcmVzZW50cyBhIFRlbXBvIEFjY291bnQgQWJzdHJhY3Rpb24gKEFBKSB0cmFuc2FjdGlvbiAodHlwZSAweDc2KVxuICogU3VwcG9ydHMgc2luZ2xlIG9yIGJhdGNoIFRJUC0yMCB0b2tlbiB0cmFuc2ZlcnMgd2l0aCBtZW1vc1xuICovXG5cbmltcG9ydCB7IEJhc2VUcmFuc2FjdGlvbiwgUGFyc2VUcmFuc2FjdGlvbkVycm9yLCBUcmFuc2FjdGlvblR5cGUgfSBmcm9tICdAYml0Z28tYmV0YS9zZGstY29yZSc7XG5pbXBvcnQgeyBCYXNlQ29pbiBhcyBDb2luQ29uZmlnIH0gZnJvbSAnQGJpdGdvLWJldGEvc3RhdGljcyc7XG5pbXBvcnQgeyBldGhlcnMgfSBmcm9tICdldGhlcnMnO1xuaW1wb3J0IHsgQWRkcmVzcywgSGV4LCBSYXdDb250cmFjdENhbGwsIFRpcDIwT3BlcmF0aW9uIH0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyBhbW91bnRUb1RpcDIwVW5pdHMgfSBmcm9tICcuL3V0aWxzJztcblxuLyoqXG4gKiBUSVAtMjAgVHJhbnNhY3Rpb24gUmVxdWVzdCBTdHJ1Y3R1cmVcbiAqIFJlcHJlc2VudHMgdGhlIHJhdyB0cmFuc2FjdGlvbiBkYXRhIGZvciBUZW1wbyBBY2NvdW50IEFic3RyYWN0aW9uIChFSVAtNzcwMilcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUaXAyMFRyYW5zYWN0aW9uUmVxdWVzdCB7XG4gIC8qKiBUcmFuc2FjdGlvbiB0eXBlICgweDc2IGZvciBUZW1wbyBBQSkgKi9cbiAgdHlwZTogbnVtYmVyIHwgc3RyaW5nO1xuICAvKiogQ2hhaW4gSUQgZm9yIHRoZSBUZW1wbyBuZXR3b3JrICovXG4gIGNoYWluSWQ6IG51bWJlcjtcbiAgLyoqIFRyYW5zYWN0aW9uIG5vbmNlICovXG4gIG5vbmNlOiBudW1iZXI7XG4gIC8qKiBNYXhpbXVtIGZlZSBwZXIgZ2FzIChFSVAtMTU1OSkgKi9cbiAgbWF4RmVlUGVyR2FzOiBiaWdpbnQ7XG4gIC8qKiBNYXhpbXVtIHByaW9yaXR5IGZlZSBwZXIgZ2FzIChFSVAtMTU1OSkgKi9cbiAgbWF4UHJpb3JpdHlGZWVQZXJHYXM6IGJpZ2ludDtcbiAgLyoqIEdhcyBsaW1pdCBmb3IgdGhlIHRyYW5zYWN0aW9uICovXG4gIGdhczogYmlnaW50O1xuICAvKiogQXJyYXkgb2YgY2FsbHMgdG8gZXhlY3V0ZSBpbiB0aGlzIHRyYW5zYWN0aW9uICovXG4gIGNhbGxzOiB7IHRvOiBBZGRyZXNzOyBkYXRhOiBIZXg7IHZhbHVlOiBiaWdpbnQgfVtdO1xuICAvKiogQWNjZXNzIGxpc3QgKG9wdGlvbmFsLCB0eXBpY2FsbHkgZW1wdHkgZm9yIFRJUC0yMCkgKi9cbiAgYWNjZXNzTGlzdD86IHVua25vd25bXTtcbiAgLyoqIE9wdGlvbmFsIFRJUC0yMCB0b2tlbiB0byB1c2UgZm9yIHBheWluZyBmZWVzICovXG4gIGZlZVRva2VuPzogQWRkcmVzcztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUeERhdGEge1xuICB0eXBlOiBudW1iZXIgfCBzdHJpbmc7XG4gIGNoYWluSWQ6IG51bWJlcjtcbiAgbm9uY2U6IG51bWJlcjtcbiAgbWF4RmVlUGVyR2FzOiBzdHJpbmc7XG4gIG1heFByaW9yaXR5RmVlUGVyR2FzOiBzdHJpbmc7XG4gIGdhczogc3RyaW5nO1xuICBjYWxsQ291bnQ6IG51bWJlcjtcbiAgZmVlVG9rZW4/OiBzdHJpbmc7XG4gIG9wZXJhdGlvbnM6IFRpcDIwT3BlcmF0aW9uW107XG4gIHJhd0NhbGxzOiBSYXdDb250cmFjdENhbGxbXTtcbiAgc2lnbmF0dXJlPzogeyByOiBIZXg7IHM6IEhleDsgeVBhcml0eTogbnVtYmVyIH07XG59XG5cbmV4cG9ydCBjbGFzcyBUaXAyMFRyYW5zYWN0aW9uIGV4dGVuZHMgQmFzZVRyYW5zYWN0aW9uIHtcbiAgcHJpdmF0ZSB0eFJlcXVlc3Q6IFRpcDIwVHJhbnNhY3Rpb25SZXF1ZXN0O1xuICBwcml2YXRlIF9vcGVyYXRpb25zOiBUaXAyME9wZXJhdGlvbltdO1xuICBwcml2YXRlIF9yYXdDYWxsczogUmF3Q29udHJhY3RDYWxsW107XG4gIHByaXZhdGUgX3NpZ25hdHVyZT86IHsgcjogSGV4OyBzOiBIZXg7IHlQYXJpdHk6IG51bWJlciB9O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIF9jb2luQ29uZmlnOiBSZWFkb25seTxDb2luQ29uZmlnPixcbiAgICByZXF1ZXN0OiBUaXAyMFRyYW5zYWN0aW9uUmVxdWVzdCxcbiAgICBvcGVyYXRpb25zOiBUaXAyME9wZXJhdGlvbltdID0gW10sXG4gICAgcmF3Q2FsbHM6IFJhd0NvbnRyYWN0Q2FsbFtdID0gW11cbiAgKSB7XG4gICAgc3VwZXIoX2NvaW5Db25maWcpO1xuICAgIHRoaXMudHhSZXF1ZXN0ID0gcmVxdWVzdDtcbiAgICB0aGlzLl9vcGVyYXRpb25zID0gb3BlcmF0aW9ucztcbiAgICB0aGlzLl9yYXdDYWxscyA9IHJhd0NhbGxzO1xuICAgIHRoaXMuX291dHB1dHMgPSBbXG4gICAgICAuLi5vcGVyYXRpb25zLm1hcCgob3ApID0+ICh7XG4gICAgICAgIGFkZHJlc3M6IG9wLnRvLFxuICAgICAgICB2YWx1ZTogYW1vdW50VG9UaXAyMFVuaXRzKG9wLmFtb3VudCkudG9TdHJpbmcoKSxcbiAgICAgICAgY29pbjogb3AudG9rZW4sXG4gICAgICB9KSksXG4gICAgICAuLi5yYXdDYWxscy5tYXAoKGNhbGwpID0+ICh7XG4gICAgICAgIGFkZHJlc3M6IGNhbGwudG8sXG4gICAgICAgIHZhbHVlOiBjYWxsLnZhbHVlIHx8ICcwJyxcbiAgICAgICAgY29pbjogX2NvaW5Db25maWcubmFtZSxcbiAgICAgIH0pKSxcbiAgICBdO1xuICAgIGNvbnN0IHRvdGFsVW5pdHMgPSBvcGVyYXRpb25zLnJlZHVjZSgoc3VtLCBvcCkgPT4gc3VtICsgYW1vdW50VG9UaXAyMFVuaXRzKG9wLmFtb3VudCksIDBuKTtcbiAgICB0aGlzLl9pbnB1dHMgPSBbeyBhZGRyZXNzOiAnJywgdmFsdWU6IHRvdGFsVW5pdHMudG9TdHJpbmcoKSwgY29pbjogX2NvaW5Db25maWcubmFtZSB9XTtcbiAgfVxuXG4gIGdldCB0eXBlKCk6IFRyYW5zYWN0aW9uVHlwZSB7XG4gICAgcmV0dXJuIFRyYW5zYWN0aW9uVHlwZS5TZW5kO1xuICB9XG5cbiAgY2FuU2lnbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGFzeW5jIHNlcmlhbGl6ZShzaWduYXR1cmU/OiB7IHI6IEhleDsgczogSGV4OyB5UGFyaXR5OiBudW1iZXIgfSk6IFByb21pc2U8SGV4PiB7XG4gICAgY29uc3Qgc2lnID0gc2lnbmF0dXJlIHx8IHRoaXMuX3NpZ25hdHVyZTtcbiAgICByZXR1cm4gdGhpcy5zZXJpYWxpemVUcmFuc2FjdGlvbihzaWcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEVuY29kZSBjYWxscyBhcyBSTFAgdHVwbGVzIGZvciBhdG9taWMgYmF0Y2ggZXhlY3V0aW9uXG4gICAqIEByZXR1cm5zIEFycmF5IG9mIFt0bywgdmFsdWUsIGRhdGFdIHR1cGxlc1xuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBlbmNvZGVDYWxsc0FzVHVwbGVzKCk6IGFueVtdIHtcbiAgICByZXR1cm4gdGhpcy50eFJlcXVlc3QuY2FsbHMubWFwKChjYWxsKSA9PiBbY2FsbC50bywgdGhpcy5iaWdpbnRUb0hleChjYWxsLnZhbHVlKSwgY2FsbC5kYXRhXSk7XG4gIH1cblxuICAvKipcbiAgICogRW5jb2RlIEVJUC0yOTMwIGFjY2VzcyBsaXN0IGFzIFJMUCB0dXBsZXNcbiAgICogQHJldHVybnMgQXJyYXkgb2YgW2FkZHJlc3MsIHN0b3JhZ2VLZXlzW11dIHR1cGxlc1xuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBlbmNvZGVBY2Nlc3NMaXN0KCk6IGFueVtdIHtcbiAgICByZXR1cm4gKHRoaXMudHhSZXF1ZXN0LmFjY2Vzc0xpc3QgPz8gW10pLm1hcCgoaXRlbTogYW55KSA9PiBbaXRlbS5hZGRyZXNzLCBpdGVtLnN0b3JhZ2VLZXlzIHx8IFtdXSk7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydCBiaWdpbnQgdG8gaGV4IHN0cmluZyBmb3IgUkxQIGVuY29kaW5nXG4gICAqIEBwYXJhbSB2YWx1ZSBiaWdpbnQgdmFsdWUgdG8gY29udmVydFxuICAgKiBAcmV0dXJucyBIZXggc3RyaW5nXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIGJpZ2ludFRvSGV4KHZhbHVlOiBiaWdpbnQpOiBzdHJpbmcge1xuICAgIGlmICh2YWx1ZSA9PT0gMG4pIHtcbiAgICAgIHJldHVybiAnMHgnO1xuICAgIH1cbiAgICBjb25zdCBoZXggPSB2YWx1ZS50b1N0cmluZygxNik7XG4gICAgcmV0dXJuICcweCcgKyAoaGV4Lmxlbmd0aCAlIDIgPyAnMCcgOiAnJykgKyBoZXg7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGQgYmFzZSBSTFAgZGF0YSBhcnJheSBwZXIgVGVtcG8gRUlQLTc3MDIgc3BlY2lmaWNhdGlvblxuICAgKiBAcGFyYW0gY2FsbHNUdXBsZXMgRW5jb2RlZCBjYWxsc1xuICAgKiBAcGFyYW0gYWNjZXNzVHVwbGVzIEVuY29kZWQgYWNjZXNzIGxpc3RcbiAgICogQHJldHVybnMgUkxQLXJlYWR5IGFycmF5IG9mIHRyYW5zYWN0aW9uIGZpZWxkc1xuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBidWlsZEJhc2VSbHBEYXRhKGNhbGxzVHVwbGVzOiBhbnlbXSwgYWNjZXNzVHVwbGVzOiBhbnlbXSk6IGFueVtdIHtcbiAgICByZXR1cm4gW1xuICAgICAgZXRoZXJzLnV0aWxzLmhleGxpZnkodGhpcy50eFJlcXVlc3QuY2hhaW5JZCksXG4gICAgICB0aGlzLnR4UmVxdWVzdC5tYXhQcmlvcml0eUZlZVBlckdhcyA/IHRoaXMuYmlnaW50VG9IZXgodGhpcy50eFJlcXVlc3QubWF4UHJpb3JpdHlGZWVQZXJHYXMpIDogJzB4JyxcbiAgICAgIHRoaXMuYmlnaW50VG9IZXgodGhpcy50eFJlcXVlc3QubWF4RmVlUGVyR2FzKSxcbiAgICAgIHRoaXMuYmlnaW50VG9IZXgodGhpcy50eFJlcXVlc3QuZ2FzKSxcbiAgICAgIGNhbGxzVHVwbGVzLFxuICAgICAgYWNjZXNzVHVwbGVzLFxuICAgICAgJzB4JywgLy8gbm9uY2VLZXkgKHJlc2VydmVkIGZvciAyRCBub25jZSBzeXN0ZW0pXG4gICAgICB0aGlzLnR4UmVxdWVzdC5ub25jZSA/IHRoaXMuYmlnaW50VG9IZXgoQmlnSW50KHRoaXMudHhSZXF1ZXN0Lm5vbmNlKSkgOiAnMHgnLFxuICAgICAgJzB4JywgLy8gdmFsaWRCZWZvcmUgKHJlc2VydmVkIGZvciB0aW1lIGJvdW5kcylcbiAgICAgICcweCcsIC8vIHZhbGlkQWZ0ZXIgKHJlc2VydmVkIGZvciB0aW1lIGJvdW5kcylcbiAgICAgIHRoaXMudHhSZXF1ZXN0LmZlZVRva2VuIHx8ICcweCcsXG4gICAgICAnMHgnLCAvLyBmZWVQYXllclNpZ25hdHVyZSAocmVzZXJ2ZWQgZm9yIHNwb25zb3JzaGlwKVxuICAgICAgW10sIC8vIGF1dGhvcml6YXRpb25MaXN0IChFSVAtNzcwMilcbiAgICBdO1xuICB9XG5cbiAgLyoqXG4gICAqIEVuY29kZSBzZWNwMjU2azEgc2lnbmF0dXJlIGFzIDY1LWJ5dGUgZW52ZWxvcGVcbiAgICogQHBhcmFtIHNpZ25hdHVyZSBFQ0RTQSBzaWduYXR1cmUgY29tcG9uZW50c1xuICAgKiBAcmV0dXJucyBIZXggc3RyaW5nIG9mIGNvbmNhdGVuYXRlZCByICgzMikgKyBzICgzMikgKyB2ICgxKSBieXRlc1xuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBlbmNvZGVTaWduYXR1cmUoc2lnbmF0dXJlOiB7IHI6IEhleDsgczogSGV4OyB5UGFyaXR5OiBudW1iZXIgfSk6IHN0cmluZyB7XG4gICAgY29uc3QgdiA9IHNpZ25hdHVyZS55UGFyaXR5ICsgMjc7XG4gICAgY29uc3Qgc2lnbmF0dXJlQnl0ZXMgPSBldGhlcnMudXRpbHMuY29uY2F0KFtcbiAgICAgIGV0aGVycy51dGlscy56ZXJvUGFkKHNpZ25hdHVyZS5yLCAzMiksXG4gICAgICBldGhlcnMudXRpbHMuemVyb1BhZChzaWduYXR1cmUucywgMzIpLFxuICAgICAgZXRoZXJzLnV0aWxzLmhleGxpZnkodiksXG4gICAgXSk7XG4gICAgcmV0dXJuIGV0aGVycy51dGlscy5oZXhsaWZ5KHNpZ25hdHVyZUJ5dGVzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSTFAgZW5jb2RlIGFuZCBwcmVwZW5kIHRyYW5zYWN0aW9uIHR5cGUgYnl0ZVxuICAgKiBAcGFyYW0gcmxwRGF0YSBUcmFuc2FjdGlvbiBmaWVsZHMgYXJyYXlcbiAgICogQHJldHVybnMgSGV4IHN0cmluZyB3aXRoIDB4NzYgcHJlZml4XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIHJscEVuY29kZVdpdGhUeXBlUHJlZml4KHJscERhdGE6IGFueVtdKTogSGV4IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZW5jb2RlZCA9IGV0aGVycy51dGlscy5STFAuZW5jb2RlKHJscERhdGEpO1xuICAgICAgcmV0dXJuICgnMHg3NicgKyBlbmNvZGVkLnNsaWNlKDIpKSBhcyBIZXg7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRocm93IG5ldyBQYXJzZVRyYW5zYWN0aW9uRXJyb3IoYEZhaWxlZCB0byBSTFAgZW5jb2RlIHRyYW5zYWN0aW9uOiAke2Vycm9yfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZXJpYWxpemUgVGVtcG8gQUEgdHJhbnNhY3Rpb24gKHR5cGUgMHg3NikgcGVyIEVJUC03NzAyIHNwZWNpZmljYXRpb25cbiAgICogRm9ybWF0OiAweDc2IHx8IFJMUChbY2hhaW5JZCwgZmVlcywgZ2FzLCBjYWxscywgYWNjZXNzTGlzdCwgbm9uY2UgZmllbGRzLCBmZWVUb2tlbiwgc3BvbnNvcnNoaXAsIGF1dGhMaXN0LCBzaWduYXR1cmU/XSlcbiAgICogQHBhcmFtIHNpZ25hdHVyZSBPcHRpb25hbCBFQ0RTQSBzaWduYXR1cmUgKG9taXQgZm9yIHVuc2lnbmVkIHRyYW5zYWN0aW9ucylcbiAgICogQHJldHVybnMgUkxQLWVuY29kZWQgdHJhbnNhY3Rpb24gaGV4IHN0cmluZ1xuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBzZXJpYWxpemVUcmFuc2FjdGlvbihzaWduYXR1cmU/OiB7IHI6IEhleDsgczogSGV4OyB5UGFyaXR5OiBudW1iZXIgfSk6IEhleCB7XG4gICAgY29uc3QgY2FsbHNUdXBsZXMgPSB0aGlzLmVuY29kZUNhbGxzQXNUdXBsZXMoKTtcbiAgICBjb25zdCBhY2Nlc3NUdXBsZXMgPSB0aGlzLmVuY29kZUFjY2Vzc0xpc3QoKTtcbiAgICBjb25zdCBybHBEYXRhID0gdGhpcy5idWlsZEJhc2VSbHBEYXRhKGNhbGxzVHVwbGVzLCBhY2Nlc3NUdXBsZXMpO1xuXG4gICAgaWYgKHNpZ25hdHVyZSkge1xuICAgICAgcmxwRGF0YS5wdXNoKHRoaXMuZW5jb2RlU2lnbmF0dXJlKHNpZ25hdHVyZSkpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnJscEVuY29kZVdpdGhUeXBlUHJlZml4KHJscERhdGEpO1xuICB9XG5cbiAgZ2V0T3BlcmF0aW9ucygpOiBUaXAyME9wZXJhdGlvbltdIHtcbiAgICByZXR1cm4gWy4uLnRoaXMuX29wZXJhdGlvbnNdO1xuICB9XG5cbiAgZ2V0UmF3Q2FsbHMoKTogUmF3Q29udHJhY3RDYWxsW10ge1xuICAgIHJldHVybiBbLi4udGhpcy5fcmF3Q2FsbHNdO1xuICB9XG5cbiAgZ2V0RmVlVG9rZW4oKTogQWRkcmVzcyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMudHhSZXF1ZXN0LmZlZVRva2VuO1xuICB9XG5cbiAgZ2V0T3BlcmF0aW9uQ291bnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fb3BlcmF0aW9ucy5sZW5ndGggKyB0aGlzLl9yYXdDYWxscy5sZW5ndGg7XG4gIH1cblxuICBpc0JhdGNoKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnR4UmVxdWVzdC5jYWxscy5sZW5ndGggPiAxO1xuICB9XG5cbiAgc2V0U2lnbmF0dXJlKHNpZ25hdHVyZTogeyByOiBIZXg7IHM6IEhleDsgeVBhcml0eTogbnVtYmVyIH0pOiB2b2lkIHtcbiAgICB0aGlzLl9zaWduYXR1cmUgPSBzaWduYXR1cmU7XG4gIH1cblxuICBnZXRTaWduYXR1cmUoKTogeyByOiBIZXg7IHM6IEhleDsgeVBhcml0eTogbnVtYmVyIH0gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9zaWduYXR1cmU7XG4gIH1cblxuICAvKipcbiAgICogUmVjb3ZlciB0aGUgc2lnbmVyIGFkZHJlc3MgZnJvbSB0aGUgdHJhbnNhY3Rpb24gc2lnbmF0dXJlLlxuICAgKiBAcmV0dXJucyBDaGVja3N1bW1lZCBzZW5kZXIgYWRkcmVzcywgb3IgdW5kZWZpbmVkIGlmIHVuc2lnbmVkXG4gICAqL1xuICBnZXRTZW5kZXJBZGRyZXNzKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCF0aGlzLl9zaWduYXR1cmUpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgY29uc3QgdW5zaWduZWRIZXggPSB0aGlzLnNlcmlhbGl6ZVRyYW5zYWN0aW9uKCk7XG4gICAgY29uc3QgbXNnSGFzaCA9IGV0aGVycy51dGlscy5rZWNjYWsyNTYoZXRoZXJzLnV0aWxzLmFycmF5aWZ5KHVuc2lnbmVkSGV4KSk7XG4gICAgcmV0dXJuIGV0aGVycy51dGlscy5yZWNvdmVyQWRkcmVzcyhtc2dIYXNoLCB7XG4gICAgICByOiB0aGlzLl9zaWduYXR1cmUucixcbiAgICAgIHM6IHRoaXMuX3NpZ25hdHVyZS5zLFxuICAgICAgcmVjb3ZlcnlQYXJhbTogdGhpcy5fc2lnbmF0dXJlLnlQYXJpdHksXG4gICAgfSk7XG4gIH1cblxuICB0b0pzb24oKTogVHhEYXRhIHtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogdGhpcy50eFJlcXVlc3QudHlwZSxcbiAgICAgIGNoYWluSWQ6IHRoaXMudHhSZXF1ZXN0LmNoYWluSWQsXG4gICAgICBub25jZTogdGhpcy50eFJlcXVlc3Qubm9uY2UsXG4gICAgICBtYXhGZWVQZXJHYXM6IHRoaXMudHhSZXF1ZXN0Lm1heEZlZVBlckdhcy50b1N0cmluZygpLFxuICAgICAgbWF4UHJpb3JpdHlGZWVQZXJHYXM6IHRoaXMudHhSZXF1ZXN0Lm1heFByaW9yaXR5RmVlUGVyR2FzLnRvU3RyaW5nKCksXG4gICAgICBnYXM6IHRoaXMudHhSZXF1ZXN0Lmdhcy50b1N0cmluZygpLFxuICAgICAgY2FsbENvdW50OiB0aGlzLnR4UmVxdWVzdC5jYWxscy5sZW5ndGgsXG4gICAgICBmZWVUb2tlbjogdGhpcy50eFJlcXVlc3QuZmVlVG9rZW4sXG4gICAgICBvcGVyYXRpb25zOiB0aGlzLl9vcGVyYXRpb25zLFxuICAgICAgcmF3Q2FsbHM6IHRoaXMuX3Jhd0NhbGxzLFxuICAgICAgc2lnbmF0dXJlOiB0aGlzLl9zaWduYXR1cmUsXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIHRvQnJvYWRjYXN0Rm9ybWF0KCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuc2VyaWFsaXplKHRoaXMuX3NpZ25hdHVyZSk7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgZ2V0IGlkKCk6IHN0cmluZyB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHNlcmlhbGl6ZWQgPSB0aGlzLnNlcmlhbGl6ZVRyYW5zYWN0aW9uKHRoaXMuX3NpZ25hdHVyZSk7XG4gICAgICByZXR1cm4gZXRoZXJzLnV0aWxzLmtlY2NhazI1NihldGhlcnMudXRpbHMuYXJyYXlpZnkoc2VyaWFsaXplZCkpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuICdwZW5kaW5nJztcbiAgICB9XG4gIH1cblxuICB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh0aGlzLnRvSnNvbigpLCBudWxsLCAyKTtcbiAgfVxuXG4gIGNhbkJyb2FkY2FzdCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy50eFJlcXVlc3QuY2FsbHMubGVuZ3RoID4gMCAmJiB0aGlzLnR4UmVxdWVzdC5jaGFpbklkID4gMDtcbiAgfVxufVxuIl19
@@ -0,0 +1,139 @@
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 { Transaction as EthTransaction, 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, RawContractCall, 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 rawCalls;
21
+ private _feeToken?;
22
+ private _nonce?;
23
+ private _gas?;
24
+ private _maxFeePerGas?;
25
+ private _maxPriorityFeePerGas?;
26
+ private _restoredSignature?;
27
+ constructor(_coinConfig: Readonly<CoinConfig>);
28
+ /**
29
+ * Implement the transfer method from abstract class
30
+ * Note: For TIP-20 transactions, use addOperation() instead
31
+ */
32
+ transfer(data?: string, isFirstSigner?: boolean): TransferBuilder;
33
+ /**
34
+ * Validate the transaction has all required fields for Tempo AA transactions.
35
+ * Overrides parent class validation since AA transactions use a different model
36
+ * (operations-based rather than single contract address).
37
+ *
38
+ * @throws BuildTransactionError if validation fails
39
+ */
40
+ validateTransaction(): void;
41
+ /** @inheritdoc */
42
+ validateRawTransaction(rawTransaction: any): void;
43
+ /** @inheritdoc */
44
+ protected fromImplementation(rawTransaction: string, isFirstSigner?: boolean): EthTransaction;
45
+ /**
46
+ * Deserialize a type 0x76 transaction and restore builder state.
47
+ * RLP field layout mirrors buildBaseRlpData() in transaction.ts.
48
+ */
49
+ private fromTip20Transaction;
50
+ /**
51
+ * Decode a single AA call's data back into a Tip20Operation.
52
+ * Returns null if the call is not a transferWithMemo — it will be stored as a RawContractCall instead.
53
+ * This preserves calldata fidelity for arbitrary smart contract interactions.
54
+ */
55
+ private decodeCallToOperation;
56
+ /**
57
+ * Build the transaction from configured TIP-20 operations and transaction parameters.
58
+ * Signs with _sourceKeyPair if it has been set via sign({ key }).
59
+ */
60
+ protected buildImplementation(): Promise<BaseTransaction>;
61
+ /**
62
+ * Add a single operation to the transaction
63
+ * Can be called multiple times to create batch transactions
64
+ *
65
+ * @param operation - TIP-20 operation with token, recipient, amount, and optional memo
66
+ * @returns this builder instance for chaining
67
+ */
68
+ addOperation(operation: Tip20Operation): this;
69
+ /**
70
+ * Add a raw smart contract call with pre-encoded calldata
71
+ * Use this for arbitrary contract interactions where the UI provides ABI-encoded calldata
72
+ *
73
+ * @param call - Raw contract call with target address and pre-encoded calldata
74
+ * @returns this builder instance for chaining
75
+ */
76
+ addRawCall(call: RawContractCall): this;
77
+ /**
78
+ * Get all raw contract calls in this transaction
79
+ * @returns Array of raw contract calls
80
+ */
81
+ getRawCalls(): RawContractCall[];
82
+ /**
83
+ * Set which TIP-20 token will be used to pay transaction fees
84
+ * This is a global setting for the entire transaction
85
+ *
86
+ * @param tokenAddress - Address of the TIP-20 token to use for fees
87
+ * @returns this builder instance for chaining
88
+ */
89
+ feeToken(tokenAddress: string): this;
90
+ /**
91
+ * Set the transaction nonce
92
+ *
93
+ * @param nonce - Transaction nonce
94
+ * @returns this builder instance for chaining
95
+ */
96
+ nonce(nonce: number): this;
97
+ /**
98
+ * Set the gas limit for the transaction
99
+ *
100
+ * @param gas - Gas limit
101
+ * @returns this builder instance for chaining
102
+ */
103
+ gas(gas: string | bigint): this;
104
+ /**
105
+ * Set the maximum fee per gas (EIP-1559)
106
+ *
107
+ * @param maxFeePerGas - Maximum fee per gas in wei
108
+ * @returns this builder instance for chaining
109
+ */
110
+ maxFeePerGas(maxFeePerGas: string | bigint): this;
111
+ /**
112
+ * Set the maximum priority fee per gas (EIP-1559)
113
+ *
114
+ * @param maxPriorityFeePerGas - Maximum priority fee per gas in wei
115
+ * @returns this builder instance for chaining
116
+ */
117
+ maxPriorityFeePerGas(maxPriorityFeePerGas: string | bigint): this;
118
+ /**
119
+ * Get all operations in this transaction
120
+ * @returns Array of TIP-20 operations
121
+ */
122
+ getOperations(): Tip20Operation[];
123
+ /**
124
+ * Get the fee token address if set
125
+ * @returns Fee token address or undefined
126
+ */
127
+ getFeeToken(): Address | undefined;
128
+ /**
129
+ * Validate a single operation
130
+ * @param operation - Operation to validate
131
+ * @throws BuildTransactionError if invalid
132
+ */
133
+ private validateOperation;
134
+ /**
135
+ * Convert a TIP-20 operation to an AA call
136
+ */
137
+ private operationToCall;
138
+ }
139
+ //# 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,EACL,WAAW,IAAI,cAAc,EAC7B,kBAAkB,IAAI,0BAA0B,EAChD,eAAe,EAChB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACL,eAAe,EAIhB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,QAAQ,IAAI,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAE7D,OAAO,EAAE,OAAO,EAAO,eAAe,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAexE;;;GAGG;AACH,qBAAa,uBAAwB,SAAQ,0BAA0B;IACrE,OAAO,CAAC,UAAU,CAAwB;IAC1C,OAAO,CAAC,QAAQ,CAAyB;IACzC,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;IACvC,OAAO,CAAC,kBAAkB,CAAC,CAAsC;gBAErD,WAAW,EAAE,QAAQ,CAAC,UAAU,CAAC;IAI7C;;;OAGG;IACH,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,OAAO,GAAG,eAAe;IASjE;;;;;;OAMG;IACH,mBAAmB,IAAI,IAAI;IAsB3B,kBAAkB;IAClB,sBAAsB,CAAC,cAAc,EAAE,GAAG,GAAG,IAAI;IAYjD,kBAAkB;IAClB,SAAS,CAAC,kBAAkB,CAAC,cAAc,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,OAAO,GAAG,cAAc;IAU7F;;;OAGG;IACH,OAAO,CAAC,oBAAoB;IAmF5B;;;;OAIG;IACH,OAAO,CAAC,qBAAqB;IAoB7B;;;OAGG;cACa,mBAAmB,IAAI,OAAO,CAAC,eAAe,CAAC;IA6D/D;;;;;;OAMG;IACH,YAAY,CAAC,SAAS,EAAE,cAAc,GAAG,IAAI;IAM7C;;;;;;OAMG;IACH,UAAU,CAAC,IAAI,EAAE,eAAe,GAAG,IAAI;IAmBvC;;;OAGG;IACH,WAAW,IAAI,eAAe,EAAE;IAIhC;;;;;;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;IAkBzB;;OAEG;IACH,OAAO,CAAC,eAAe;CAUxB"}