@bitgo-beta/sdk-coin-tempo 1.0.1-beta.8 → 1.0.1-beta.81
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/dist/src/index.d.ts +1 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +2 -1
- package/dist/src/lib/constants.d.ts +17 -1
- package/dist/src/lib/constants.d.ts.map +1 -1
- package/dist/src/lib/constants.js +22 -5
- package/dist/src/lib/index.d.ts +4 -0
- package/dist/src/lib/index.d.ts.map +1 -1
- package/dist/src/lib/index.js +5 -1
- package/dist/src/lib/keyPair.d.ts +8 -18
- package/dist/src/lib/keyPair.d.ts.map +1 -1
- package/dist/src/lib/keyPair.js +18 -84
- package/dist/src/lib/tip20Abi.d.ts +98 -0
- package/dist/src/lib/tip20Abi.d.ts.map +1 -0
- package/dist/src/lib/tip20Abi.js +62 -0
- package/dist/src/lib/transaction.d.ts +112 -0
- package/dist/src/lib/transaction.d.ts.map +1 -0
- package/dist/src/lib/transaction.js +164 -0
- package/dist/src/lib/transactionBuilder.d.ts +100 -0
- package/dist/src/lib/transactionBuilder.d.ts.map +1 -0
- package/dist/src/lib/transactionBuilder.js +204 -0
- package/dist/src/lib/types.d.ts +17 -0
- package/dist/src/lib/types.d.ts.map +1 -0
- package/dist/src/lib/types.js +3 -0
- package/dist/src/lib/utils.d.ts +54 -7
- package/dist/src/lib/utils.d.ts.map +1 -1
- package/dist/src/lib/utils.js +122 -16
- package/dist/src/register.d.ts +4 -0
- package/dist/src/register.d.ts.map +1 -1
- package/dist/src/register.js +26 -1
- package/dist/src/tempo.d.ts +37 -44
- package/dist/src/tempo.d.ts.map +1 -1
- package/dist/src/tempo.js +52 -84
- package/dist/src/tip20Token.d.ts +89 -0
- package/dist/src/tip20Token.d.ts.map +1 -0
- package/dist/src/tip20Token.js +198 -0
- package/dist/test/integration/tip20.d.ts +2 -0
- package/dist/test/integration/tip20.d.ts.map +1 -0
- package/dist/test/integration/tip20.js +115 -0
- package/dist/test/unit/transactionBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder.js +252 -0
- package/dist/test/unit/utils.js +6 -5
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +10 -6
|
@@ -0,0 +1,164 @@
|
|
|
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
|
+
class Tip20Transaction extends sdk_core_1.BaseTransaction {
|
|
13
|
+
constructor(_coinConfig, request, operations = []) {
|
|
14
|
+
super(_coinConfig);
|
|
15
|
+
this.txRequest = request;
|
|
16
|
+
this._operations = operations;
|
|
17
|
+
}
|
|
18
|
+
get type() {
|
|
19
|
+
return sdk_core_1.TransactionType.Send;
|
|
20
|
+
}
|
|
21
|
+
canSign() {
|
|
22
|
+
return true;
|
|
23
|
+
}
|
|
24
|
+
async serialize(signature) {
|
|
25
|
+
const sig = signature || this._signature;
|
|
26
|
+
return this.serializeTransaction(sig);
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Encode calls as RLP tuples for atomic batch execution
|
|
30
|
+
* @returns Array of [to, value, data] tuples
|
|
31
|
+
* @private
|
|
32
|
+
*/
|
|
33
|
+
encodeCallsAsTuples() {
|
|
34
|
+
return this.txRequest.calls.map((call) => [
|
|
35
|
+
call.to,
|
|
36
|
+
call.value ? ethers_1.ethers.utils.hexlify(call.value) : '0x',
|
|
37
|
+
call.data,
|
|
38
|
+
]);
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Encode EIP-2930 access list as RLP tuples
|
|
42
|
+
* @returns Array of [address, storageKeys[]] tuples
|
|
43
|
+
* @private
|
|
44
|
+
*/
|
|
45
|
+
encodeAccessList() {
|
|
46
|
+
return (this.txRequest.accessList ?? []).map((item) => [item.address, item.storageKeys || []]);
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Build base RLP data array per Tempo EIP-7702 specification
|
|
50
|
+
* @param callsTuples Encoded calls
|
|
51
|
+
* @param accessTuples Encoded access list
|
|
52
|
+
* @returns RLP-ready array of transaction fields
|
|
53
|
+
* @private
|
|
54
|
+
*/
|
|
55
|
+
buildBaseRlpData(callsTuples, accessTuples) {
|
|
56
|
+
return [
|
|
57
|
+
ethers_1.ethers.utils.hexlify(this.txRequest.chainId),
|
|
58
|
+
this.txRequest.maxPriorityFeePerGas ? ethers_1.ethers.utils.hexlify(this.txRequest.maxPriorityFeePerGas.toString()) : '0x',
|
|
59
|
+
ethers_1.ethers.utils.hexlify(this.txRequest.maxFeePerGas.toString()),
|
|
60
|
+
ethers_1.ethers.utils.hexlify(this.txRequest.gas.toString()),
|
|
61
|
+
callsTuples,
|
|
62
|
+
accessTuples,
|
|
63
|
+
'0x', // nonceKey (reserved for 2D nonce system)
|
|
64
|
+
ethers_1.ethers.utils.hexlify(this.txRequest.nonce),
|
|
65
|
+
'0x', // validBefore (reserved for time bounds)
|
|
66
|
+
'0x', // validAfter (reserved for time bounds)
|
|
67
|
+
this.txRequest.feeToken || '0x',
|
|
68
|
+
'0x', // feePayerSignature (reserved for sponsorship)
|
|
69
|
+
[], // authorizationList (EIP-7702)
|
|
70
|
+
];
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Encode secp256k1 signature as 65-byte envelope
|
|
74
|
+
* @param signature ECDSA signature components
|
|
75
|
+
* @returns Hex string of concatenated r (32) + s (32) + v (1) bytes
|
|
76
|
+
* @private
|
|
77
|
+
*/
|
|
78
|
+
encodeSignature(signature) {
|
|
79
|
+
const v = signature.yParity + 27;
|
|
80
|
+
const signatureBytes = ethers_1.ethers.utils.concat([
|
|
81
|
+
ethers_1.ethers.utils.zeroPad(signature.r, 32),
|
|
82
|
+
ethers_1.ethers.utils.zeroPad(signature.s, 32),
|
|
83
|
+
ethers_1.ethers.utils.hexlify(v),
|
|
84
|
+
]);
|
|
85
|
+
return ethers_1.ethers.utils.hexlify(signatureBytes);
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* RLP encode and prepend transaction type byte
|
|
89
|
+
* @param rlpData Transaction fields array
|
|
90
|
+
* @returns Hex string with 0x76 prefix
|
|
91
|
+
* @private
|
|
92
|
+
*/
|
|
93
|
+
rlpEncodeWithTypePrefix(rlpData) {
|
|
94
|
+
try {
|
|
95
|
+
const encoded = ethers_1.ethers.utils.RLP.encode(rlpData);
|
|
96
|
+
return ('0x76' + encoded.slice(2));
|
|
97
|
+
}
|
|
98
|
+
catch (error) {
|
|
99
|
+
throw new sdk_core_1.ParseTransactionError(`Failed to RLP encode transaction: ${error}`);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Serialize Tempo AA transaction (type 0x76) per EIP-7702 specification
|
|
104
|
+
* Format: 0x76 || RLP([chainId, fees, gas, calls, accessList, nonce fields, feeToken, sponsorship, authList, signature?])
|
|
105
|
+
* @param signature Optional ECDSA signature (omit for unsigned transactions)
|
|
106
|
+
* @returns RLP-encoded transaction hex string
|
|
107
|
+
* @private
|
|
108
|
+
*/
|
|
109
|
+
serializeTransaction(signature) {
|
|
110
|
+
const callsTuples = this.encodeCallsAsTuples();
|
|
111
|
+
const accessTuples = this.encodeAccessList();
|
|
112
|
+
const rlpData = this.buildBaseRlpData(callsTuples, accessTuples);
|
|
113
|
+
if (signature) {
|
|
114
|
+
rlpData.push(this.encodeSignature(signature));
|
|
115
|
+
}
|
|
116
|
+
return this.rlpEncodeWithTypePrefix(rlpData);
|
|
117
|
+
}
|
|
118
|
+
getOperations() {
|
|
119
|
+
return [...this._operations];
|
|
120
|
+
}
|
|
121
|
+
getFeeToken() {
|
|
122
|
+
return this.txRequest.feeToken;
|
|
123
|
+
}
|
|
124
|
+
getOperationCount() {
|
|
125
|
+
return this.txRequest.calls.length;
|
|
126
|
+
}
|
|
127
|
+
isBatch() {
|
|
128
|
+
return this.txRequest.calls.length > 1;
|
|
129
|
+
}
|
|
130
|
+
setSignature(signature) {
|
|
131
|
+
this._signature = signature;
|
|
132
|
+
}
|
|
133
|
+
getSignature() {
|
|
134
|
+
return this._signature;
|
|
135
|
+
}
|
|
136
|
+
toJson() {
|
|
137
|
+
return {
|
|
138
|
+
type: this.txRequest.type,
|
|
139
|
+
chainId: this.txRequest.chainId,
|
|
140
|
+
nonce: this.txRequest.nonce,
|
|
141
|
+
maxFeePerGas: this.txRequest.maxFeePerGas.toString(),
|
|
142
|
+
maxPriorityFeePerGas: this.txRequest.maxPriorityFeePerGas.toString(),
|
|
143
|
+
gas: this.txRequest.gas.toString(),
|
|
144
|
+
callCount: this.txRequest.calls.length,
|
|
145
|
+
feeToken: this.txRequest.feeToken,
|
|
146
|
+
operations: this._operations,
|
|
147
|
+
signature: this._signature,
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
async toBroadcastFormat() {
|
|
151
|
+
return await this.serialize(this._signature);
|
|
152
|
+
}
|
|
153
|
+
get id() {
|
|
154
|
+
return 'pending';
|
|
155
|
+
}
|
|
156
|
+
toString() {
|
|
157
|
+
return JSON.stringify(this.toJson(), null, 2);
|
|
158
|
+
}
|
|
159
|
+
canBroadcast() {
|
|
160
|
+
return this.txRequest.calls.length > 0 && this.txRequest.chainId > 0;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
exports.Tip20Transaction = Tip20Transaction;
|
|
164
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3RyYW5zYWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7R0FLRzs7O0FBRUgsbURBQStGO0FBRS9GLG1DQUFnQztBQTRCaEMsTUFBYSxnQkFBaUIsU0FBUSwwQkFBZTtJQUtuRCxZQUFZLFdBQWlDLEVBQUUsT0FBZ0MsRUFBRSxhQUErQixFQUFFO1FBQ2hILEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNuQixJQUFJLENBQUMsU0FBUyxHQUFHLE9BQU8sQ0FBQztRQUN6QixJQUFJLENBQUMsV0FBVyxHQUFHLFVBQVUsQ0FBQztJQUNoQyxDQUFDO0lBRUQsSUFBSSxJQUFJO1FBQ04sT0FBTywwQkFBZSxDQUFDLElBQUksQ0FBQztJQUM5QixDQUFDO0lBRUQsT0FBTztRQUNMLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELEtBQUssQ0FBQyxTQUFTLENBQUMsU0FBK0M7UUFDN0QsTUFBTSxHQUFHLEdBQUcsU0FBUyxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUM7UUFDekMsT0FBTyxJQUFJLENBQUMsb0JBQW9CLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUVEOzs7O09BSUc7SUFDSyxtQkFBbUI7UUFDekIsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDO1lBQ3hDLElBQUksQ0FBQyxFQUFFO1lBQ1AsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsZUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJO1lBQ3BELElBQUksQ0FBQyxJQUFJO1NBQ1YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7O09BSUc7SUFDSyxnQkFBZ0I7UUFDdEIsT0FBTyxD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QUFJLENBQUMsU0FBUyxDQUFDLFFBQVE7WUFDakMsVUFBVSxFQUFFLElBQUksQ0FBQyxXQUFXO1lBQzVCLFNBQVMsRUFBRSxJQUFJLENBQUMsVUFBVTtTQUMzQixDQUFDO0lBQ0osQ0FBQztJQUVELEtBQUssQ0FBQyxpQkFBaUI7UUFDckIsT0FBTyxNQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQy9DLENBQUM7SUFFRCxJQUFJLEVBQUU7UUFDSixPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBRUQsUUFBUTtRQUNOLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ2hELENBQUM7SUFFRCxZQUFZO1FBQ1YsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQztJQUN2RSxDQUFDO0NBQ0Y7QUEvS0QsNENBK0tDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBUSVAtMjAgVHJhbnNhY3Rpb25cbiAqXG4gKiBSZXByZXNlbnRzIGEgVGVtcG8gQWNjb3VudCBBYnN0cmFjdGlvbiAoQUEpIHRyYW5zYWN0aW9uICh0eXBlIDB4NzYpXG4gKiBTdXBwb3J0cyBzaW5nbGUgb3IgYmF0Y2ggVElQLTIwIHRva2VuIHRyYW5zZmVycyB3aXRoIG1lbW9zXG4gKi9cblxuaW1wb3J0IHsgQmFzZVRyYW5zYWN0aW9uLCBQYXJzZVRyYW5zYWN0aW9uRXJyb3IsIFRyYW5zYWN0aW9uVHlwZSB9IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1jb3JlJztcbmltcG9ydCB7IEJhc2VDb2luIGFzIENvaW5Db25maWcgfSBmcm9tICdAYml0Z28tYmV0YS9zdGF0aWNzJztcbmltcG9ydCB7IGV0aGVycyB9IGZyb20gJ2V0aGVycyc7XG5pbXBvcnQgeyBBZGRyZXNzLCBIZXgsIFRpcDIwT3BlcmF0aW9uIH0gZnJvbSAnLi90eXBlcyc7XG5cbi8qKlxuICogVElQLTIwIFRyYW5zYWN0aW9uIFJlcXVlc3QgU3RydWN0dXJlXG4gKiBSZXByZXNlbnRzIHRoZSByYXcgdHJhbnNhY3Rpb24gZGF0YSBmb3IgVGVtcG8gQWNjb3VudCBBYnN0cmFjdGlvbiAoRUlQLTc3MDIpXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVGlwMjBUcmFuc2FjdGlvblJlcXVlc3Qge1xuICAvKiogVHJhbnNhY3Rpb24gdHlwZSAoMHg3NiBmb3IgVGVtcG8gQUEpICovXG4gIHR5cGU6IG51bWJlciB8IHN0cmluZztcbiAgLyoqIENoYWluIElEIGZvciB0aGUgVGVtcG8gbmV0d29yayAqL1xuICBjaGFpbklkOiBudW1iZXI7XG4gIC8qKiBUcmFuc2FjdGlvbiBub25jZSAqL1xuICBub25jZTogbnVtYmVyO1xuICAvKiogTWF4aW11bSBmZWUgcGVyIGdhcyAoRUlQLTE1NTkpICovXG4gIG1heEZlZVBlckdhczogYmlnaW50O1xuICAvKiogTWF4aW11bSBwcmlvcml0eSBmZWUgcGVyIGdhcyAoRUlQLTE1NTkpICovXG4gIG1heFByaW9yaXR5RmVlUGVyR2FzOiBiaWdpbnQ7XG4gIC8qKiBHYXMgbGltaXQgZm9yIHRoZSB0cmFuc2FjdGlvbiAqL1xuICBnYXM6IGJpZ2ludDtcbiAgLyoqIEFycmF5IG9mIGNhbGxzIHRvIGV4ZWN1dGUgaW4gdGhpcyB0cmFuc2FjdGlvbiAqL1xuICBjYWxsczogeyB0bzogQWRkcmVzczsgZGF0YTogSGV4OyB2YWx1ZTogYmlnaW50IH1bXTtcbiAgLyoqIEFjY2VzcyBsaXN0IChvcHRpb25hbCwgdHlwaWNhbGx5IGVtcHR5IGZvciBUSVAtMjApICovXG4gIGFjY2Vzc0xpc3Q/OiB1bmtub3duW107XG4gIC8qKiBPcHRpb25hbCBUSVAtMjAgdG9rZW4gdG8gdXNlIGZvciBwYXlpbmcgZmVlcyAqL1xuICBmZWVUb2tlbj86IEFkZHJlc3M7XG59XG5cbmV4cG9ydCBjbGFzcyBUaXAyMFRyYW5zYWN0aW9uIGV4dGVuZHMgQmFzZVRyYW5zYWN0aW9uIHtcbiAgcHJpdmF0ZSB0eFJlcXVlc3Q6IFRpcDIwVHJhbnNhY3Rpb25SZXF1ZXN0O1xuICBwcml2YXRlIF9vcGVyYXRpb25zOiBUaXAyME9wZXJhdGlvbltdO1xuICBwcml2YXRlIF9zaWduYXR1cmU/OiB7IHI6IEhleDsgczogSGV4OyB5UGFyaXR5OiBudW1iZXIgfTtcblxuICBjb25zdHJ1Y3RvcihfY29pbkNvbmZpZzogUmVhZG9ubHk8Q29pbkNvbmZpZz4sIHJlcXVlc3Q6IFRpcDIwVHJhbnNhY3Rpb25SZXF1ZXN0LCBvcGVyYXRpb25zOiBUaXAyME9wZXJhdGlvbltdID0gW10pIHtcbiAgICBzdXBlcihfY29pbkNvbmZpZyk7XG4gICAgdGhpcy50eFJlcXVlc3QgPSByZXF1ZXN0O1xuICAgIHRoaXMuX29wZXJhdGlvbnMgPSBvcGVyYXRpb25zO1xuICB9XG5cbiAgZ2V0IHR5cGUoKTogVHJhbnNhY3Rpb25UeXBlIHtcbiAgICByZXR1cm4gVHJhbnNhY3Rpb25UeXBlLlNlbmQ7XG4gIH1cblxuICBjYW5TaWduKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgYXN5bmMgc2VyaWFsaXplKHNpZ25hdHVyZT86IHsgcjogSGV4OyBzOiBIZXg7IHlQYXJpdHk6IG51bWJlciB9KTogUHJvbWlzZTxIZXg+IHtcbiAgICBjb25zdCBzaWcgPSBzaWduYXR1cmUgfHwgdGhpcy5fc2lnbmF0dXJlO1xuICAgIHJldHVybiB0aGlzLnNlcmlhbGl6ZVRyYW5zYWN0aW9uKHNpZyk7XG4gIH1cblxuICAvKipcbiAgICogRW5jb2RlIGNhbGxzIGFzIFJMUCB0dXBsZXMgZm9yIGF0b21pYyBiYXRjaCBleGVjdXRpb25cbiAgICogQHJldHVybnMgQXJyYXkgb2YgW3RvLCB2YWx1ZSwgZGF0YV0gdHVwbGVzXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIGVuY29kZUNhbGxzQXNUdXBsZXMoKTogYW55W10ge1xuICAgIHJldHVybiB0aGlzLnR4UmVxdWVzdC5jYWxscy5tYXAoKGNhbGwpID0+IFtcbiAgICAgIGNhbGwudG8sXG4gICAgICBjYWxsLnZhbHVlID8gZXRoZXJzLnV0aWxzLmhleGxpZnkoY2FsbC52YWx1ZSkgOiAnMHgnLFxuICAgICAgY2FsbC5kYXRhLFxuICAgIF0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEVuY29kZSBFSVAtMjkzMCBhY2Nlc3MgbGlzdCBhcyBSTFAgdHVwbGVzXG4gICAqIEByZXR1cm5zIEFycmF5IG9mIFthZGRyZXNzLCBzdG9yYWdlS2V5c1tdXSB0dXBsZXNcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgZW5jb2RlQWNjZXNzTGlzdCgpOiBhbnlbXSB7XG4gICAgcmV0dXJuICh0aGlzLnR4UmVxdWVzdC5hY2Nlc3NMaXN0ID8/IFtdKS5tYXAoKGl0ZW06IGFueSkgPT4gW2l0ZW0uYWRkcmVzcywgaXRlbS5zdG9yYWdlS2V5cyB8fCBbXV0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIGJhc2UgUkxQIGRhdGEgYXJyYXkgcGVyIFRlbXBvIEVJUC03NzAyIHNwZWNpZmljYXRpb25cbiAgICogQHBhcmFtIGNhbGxzVHVwbGVzIEVuY29kZWQgY2FsbHNcbiAgICogQHBhcmFtIGFjY2Vzc1R1cGxlcyBFbmNvZGVkIGFjY2VzcyBsaXN0XG4gICAqIEByZXR1cm5zIFJMUC1yZWFkeSBhcnJheSBvZiB0cmFuc2FjdGlvbiBmaWVsZHNcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgYnVpbGRCYXNlUmxwRGF0YShjYWxsc1R1cGxlczogYW55W10sIGFjY2Vzc1R1cGxlczogYW55W10pOiBhbnlbXSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIGV0aGVycy51dGlscy5oZXhsaWZ5KHRoaXMudHhSZXF1ZXN0LmNoYWluSWQpLFxuICAgICAgdGhpcy50eFJlcXVlc3QubWF4UHJpb3JpdHlGZWVQZXJHYXMgPyBldGhlcnMudXRpbHMuaGV4bGlmeSh0aGlzLnR4UmVxdWVzdC5tYXhQcmlvcml0eUZlZVBlckdhcy50b1N0cmluZygpKSA6ICcweCcsXG4gICAgICBldGhlcnMudXRpbHMuaGV4bGlmeSh0aGlzLnR4UmVxdWVzdC5tYXhGZWVQZXJHYXMudG9TdHJpbmcoKSksXG4gICAgICBldGhlcnMudXRpbHMuaGV4bGlmeSh0aGlzLnR4UmVxdWVzdC5nYXMudG9TdHJpbmcoKSksXG4gICAgICBjYWxsc1R1cGxlcyxcbiAgICAgIGFjY2Vzc1R1cGxlcyxcbiAgICAgICcweCcsIC8vIG5vbmNlS2V5IChyZXNlcnZlZCBmb3IgMkQgbm9uY2Ugc3lzdGVtKVxuICAgICAgZXRoZXJzLnV0aWxzLmhleGxpZnkodGhpcy50eFJlcXVlc3Qubm9uY2UpLFxuICAgICAgJzB4JywgLy8gdmFsaWRCZWZvcmUgKHJlc2VydmVkIGZvciB0aW1lIGJvdW5kcylcbiAgICAgICcweCcsIC8vIHZhbGlkQWZ0ZXIgKHJlc2VydmVkIGZvciB0aW1lIGJvdW5kcylcbiAgICAgIHRoaXMudHhSZXF1ZXN0LmZlZVRva2VuIHx8ICcweCcsXG4gICAgICAnMHgnLCAvLyBmZWVQYXllclNpZ25hdHVyZSAocmVzZXJ2ZWQgZm9yIHNwb25zb3JzaGlwKVxuICAgICAgW10sIC8vIGF1dGhvcml6YXRpb25MaXN0IChFSVAtNzcwMilcbiAgICBdO1xuICB9XG5cbiAgLyoqXG4gICAqIEVuY29kZSBzZWNwMjU2azEgc2lnbmF0dXJlIGFzIDY1LWJ5dGUgZW52ZWxvcGVcbiAgICogQHBhcmFtIHNpZ25hdHVyZSBFQ0RTQSBzaWduYXR1cmUgY29tcG9uZW50c1xuICAgKiBAcmV0dXJucyBIZXggc3RyaW5nIG9mIGNvbmNhdGVuYXRlZCByICgzMikgKyBzICgzMikgKyB2ICgxKSBieXRlc1xuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBlbmNvZGVTaWduYXR1cmUoc2lnbmF0dXJlOiB7IHI6IEhleDsgczogSGV4OyB5UGFyaXR5OiBudW1iZXIgfSk6IHN0cmluZyB7XG4gICAgY29uc3QgdiA9IHNpZ25hdHVyZS55UGFyaXR5ICsgMjc7XG4gICAgY29uc3Qgc2lnbmF0dXJlQnl0ZXMgPSBldGhlcnMudXRpbHMuY29uY2F0KFtcbiAgICAgIGV0aGVycy51dGlscy56ZXJvUGFkKHNpZ25hdHVyZS5yLCAzMiksXG4gICAgICBldGhlcnMudXRpbHMuemVyb1BhZChzaWduYXR1cmUucywgMzIpLFxuICAgICAgZXRoZXJzLnV0aWxzLmhleGxpZnkodiksXG4gICAgXSk7XG4gICAgcmV0dXJuIGV0aGVycy51dGlscy5oZXhsaWZ5KHNpZ25hdHVyZUJ5dGVzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSTFAgZW5jb2RlIGFuZCBwcmVwZW5kIHRyYW5zYWN0aW9uIHR5cGUgYnl0ZVxuICAgKiBAcGFyYW0gcmxwRGF0YSBUcmFuc2FjdGlvbiBmaWVsZHMgYXJyYXlcbiAgICogQHJldHVybnMgSGV4IHN0cmluZyB3aXRoIDB4NzYgcHJlZml4XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIHJscEVuY29kZVdpdGhUeXBlUHJlZml4KHJscERhdGE6IGFueVtdKTogSGV4IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZW5jb2RlZCA9IGV0aGVycy51dGlscy5STFAuZW5jb2RlKHJscERhdGEpO1xuICAgICAgcmV0dXJuICgnMHg3NicgKyBlbmNvZGVkLnNsaWNlKDIpKSBhcyBIZXg7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRocm93IG5ldyBQYXJzZVRyYW5zYWN0aW9uRXJyb3IoYEZhaWxlZCB0byBSTFAgZW5jb2RlIHRyYW5zYWN0aW9uOiAke2Vycm9yfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZXJpYWxpemUgVGVtcG8gQUEgdHJhbnNhY3Rpb24gKHR5cGUgMHg3NikgcGVyIEVJUC03NzAyIHNwZWNpZmljYXRpb25cbiAgICogRm9ybWF0OiAweDc2IHx8IFJMUChbY2hhaW5JZCwgZmVlcywgZ2FzLCBjYWxscywgYWNjZXNzTGlzdCwgbm9uY2UgZmllbGRzLCBmZWVUb2tlbiwgc3BvbnNvcnNoaXAsIGF1dGhMaXN0LCBzaWduYXR1cmU/XSlcbiAgICogQHBhcmFtIHNpZ25hdHVyZSBPcHRpb25hbCBFQ0RTQSBzaWduYXR1cmUgKG9taXQgZm9yIHVuc2lnbmVkIHRyYW5zYWN0aW9ucylcbiAgICogQHJldHVybnMgUkxQLWVuY29kZWQgdHJhbnNhY3Rpb24gaGV4IHN0cmluZ1xuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBzZXJpYWxpemVUcmFuc2FjdGlvbihzaWduYXR1cmU/OiB7IHI6IEhleDsgczogSGV4OyB5UGFyaXR5OiBudW1iZXIgfSk6IEhleCB7XG4gICAgY29uc3QgY2FsbHNUdXBsZXMgPSB0aGlzLmVuY29kZUNhbGxzQXNUdXBsZXMoKTtcbiAgICBjb25zdCBhY2Nlc3NUdXBsZXMgPSB0aGlzLmVuY29kZUFjY2Vzc0xpc3QoKTtcbiAgICBjb25zdCBybHBEYXRhID0gdGhpcy5idWlsZEJhc2VSbHBEYXRhKGNhbGxzVHVwbGVzLCBhY2Nlc3NUdXBsZXMpO1xuXG4gICAgaWYgKHNpZ25hdHVyZSkge1xuICAgICAgcmxwRGF0YS5wdXNoKHRoaXMuZW5jb2RlU2lnbmF0dXJlKHNpZ25hdHVyZSkpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnJscEVuY29kZVdpdGhUeXBlUHJlZml4KHJscERhdGEpO1xuICB9XG5cbiAgZ2V0T3BlcmF0aW9ucygpOiBUaXAyME9wZXJhdGlvbltdIHtcbiAgICByZXR1cm4gWy4uLnRoaXMuX29wZXJhdGlvbnNdO1xuICB9XG5cbiAgZ2V0RmVlVG9rZW4oKTogQWRkcmVzcyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMudHhSZXF1ZXN0LmZlZVRva2VuO1xuICB9XG5cbiAgZ2V0T3BlcmF0aW9uQ291bnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy50eFJlcXVlc3QuY2FsbHMubGVuZ3RoO1xuICB9XG5cbiAgaXNCYXRjaCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy50eFJlcXVlc3QuY2FsbHMubGVuZ3RoID4gMTtcbiAgfVxuXG4gIHNldFNpZ25hdHVyZShzaWduYXR1cmU6IHsgcjogSGV4OyBzOiBIZXg7IHlQYXJpdHk6IG51bWJlciB9KTogdm9pZCB7XG4gICAgdGhpcy5fc2lnbmF0dXJlID0gc2lnbmF0dXJlO1xuICB9XG5cbiAgZ2V0U2lnbmF0dXJlKCk6IHsgcjogSGV4OyBzOiBIZXg7IHlQYXJpdHk6IG51bWJlciB9IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fc2lnbmF0dXJlO1xuICB9XG5cbiAgdG9Kc29uKCk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogdGhpcy50eFJlcXVlc3QudHlwZSxcbiAgICAgIGNoYWluSWQ6IHRoaXMudHhSZXF1ZXN0LmNoYWluSWQsXG4gICAgICBub25jZTogdGhpcy50eFJlcXVlc3Qubm9uY2UsXG4gICAgICBtYXhGZWVQZXJHYXM6IHRoaXMudHhSZXF1ZXN0Lm1heEZlZVBlckdhcy50b1N0cmluZygpLFxuICAgICAgbWF4UHJpb3JpdHlGZWVQZXJHYXM6IHRoaXMudHhSZXF1ZXN0Lm1heFByaW9yaXR5RmVlUGVyR2FzLnRvU3RyaW5nKCksXG4gICAgICBnYXM6IHRoaXMudHhSZXF1ZXN0Lmdhcy50b1N0cmluZygpLFxuICAgICAgY2FsbENvdW50OiB0aGlzLnR4UmVxdWVzdC5jYWxscy5sZW5ndGgsXG4gICAgICBmZWVUb2tlbjogdGhpcy50eFJlcXVlc3QuZmVlVG9rZW4sXG4gICAgICBvcGVyYXRpb25zOiB0aGlzLl9vcGVyYXRpb25zLFxuICAgICAgc2lnbmF0dXJlOiB0aGlzLl9zaWduYXR1cmUsXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIHRvQnJvYWRjYXN0Rm9ybWF0KCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuc2VyaWFsaXplKHRoaXMuX3NpZ25hdHVyZSk7XG4gIH1cblxuICBnZXQgaWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gJ3BlbmRpbmcnO1xuICB9XG5cbiAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodGhpcy50b0pzb24oKSwgbnVsbCwgMik7XG4gIH1cblxuICBjYW5Ccm9hZGNhc3QoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMudHhSZXF1ZXN0LmNhbGxzLmxlbmd0aCA+IDAgJiYgdGhpcy50eFJlcXVlc3QuY2hhaW5JZCA+IDA7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -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==
|
package/dist/src/lib/utils.d.ts
CHANGED
|
@@ -1,25 +1,72 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Utility
|
|
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
|
|
6
|
-
*
|
|
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
|
|
11
|
-
*
|
|
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
|
|
16
|
-
*
|
|
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":"
|
|
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"}
|