@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.
- 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 +21 -1
- package/dist/src/lib/constants.d.ts.map +1 -1
- package/dist/src/lib/constants.js +25 -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 +5 -25
- package/dist/src/lib/keyPair.d.ts.map +1 -1
- package/dist/src/lib/keyPair.js +9 -97
- 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 +144 -0
- package/dist/src/lib/transaction.d.ts.map +1 -0
- package/dist/src/lib/transaction.js +216 -0
- package/dist/src/lib/transactionBuilder.d.ts +139 -0
- package/dist/src/lib/transactionBuilder.d.ts.map +1 -0
- package/dist/src/lib/transactionBuilder.js +408 -0
- package/dist/src/lib/types.d.ts +27 -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 +70 -7
- package/dist/src/lib/utils.d.ts.map +1 -1
- package/dist/src/lib/utils.js +148 -16
- package/dist/src/register.d.ts.map +1 -1
- package/dist/src/register.js +5 -1
- package/dist/src/tempo.d.ts +95 -41
- package/dist/src/tempo.d.ts.map +1 -1
- package/dist/src/tempo.js +447 -76
- package/dist/src/tip20Token.d.ts +83 -0
- package/dist/src/tip20Token.d.ts.map +1 -0
- package/dist/src/tip20Token.js +202 -0
- package/dist/test/integration/tip20.d.ts +7 -0
- package/dist/test/integration/tip20.d.ts.map +1 -0
- package/dist/test/integration/tip20.js +178 -0
- package/dist/test/resources/tempo.d.ts +61 -0
- package/dist/test/resources/tempo.d.ts.map +1 -0
- package/dist/test/resources/tempo.js +79 -0
- package/dist/test/unit/index.js +172 -3
- package/dist/test/unit/tempo.d.ts +2 -0
- package/dist/test/unit/tempo.d.ts.map +1 -0
- package/dist/test/unit/tempo.js +207 -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 +858 -0
- package/dist/test/unit/utils.js +6 -5
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +12 -7
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @prettier
|
|
3
|
+
*/
|
|
4
|
+
import { BitGoBase, CoinConstructor, MPCAlgorithm, NamedCoinConstructor } from '@bitgo-beta/sdk-core';
|
|
5
|
+
import { Tip20TokenConfig } from '@bitgo-beta/statics';
|
|
6
|
+
import { GetSendMethodArgsOptions, SendMethodArgs } from '@bitgo-beta/abstract-eth';
|
|
7
|
+
import { Tempo } from './tempo';
|
|
8
|
+
export { Tip20TokenConfig };
|
|
9
|
+
/**
|
|
10
|
+
* TIP20 Token Implementation (Skeleton)
|
|
11
|
+
*
|
|
12
|
+
* This is a minimal skeleton for TIP20 tokens on Tempo blockchain.
|
|
13
|
+
*
|
|
14
|
+
* TODO: All methods will be implemented progressively
|
|
15
|
+
*/
|
|
16
|
+
export declare class Tip20Token extends Tempo {
|
|
17
|
+
readonly tokenConfig: Tip20TokenConfig;
|
|
18
|
+
readonly contractAddress: string;
|
|
19
|
+
constructor(bitgo: BitGoBase, tokenConfig: Tip20TokenConfig);
|
|
20
|
+
/**
|
|
21
|
+
* Create a coin constructor for a specific token
|
|
22
|
+
*/
|
|
23
|
+
static createTokenConstructor(config: Tip20TokenConfig): CoinConstructor;
|
|
24
|
+
/**
|
|
25
|
+
* Create token constructors for all TIP20 tokens
|
|
26
|
+
* @param tokenConfigs - Array of token configurations; defaults to all TIP20 tokens from statics
|
|
27
|
+
*/
|
|
28
|
+
static createTokenConstructors(tokenConfigs?: Tip20TokenConfig[]): NamedCoinConstructor[];
|
|
29
|
+
/** Get the token type */
|
|
30
|
+
get type(): string;
|
|
31
|
+
/** Get the token name */
|
|
32
|
+
get name(): string;
|
|
33
|
+
/** Get the base coin */
|
|
34
|
+
get coin(): string;
|
|
35
|
+
/** Get the network */
|
|
36
|
+
get network(): string;
|
|
37
|
+
/** Get the token contract address */
|
|
38
|
+
get tokenContractAddress(): string;
|
|
39
|
+
/** Get token decimal places */
|
|
40
|
+
get decimalPlaces(): number;
|
|
41
|
+
/** @inheritDoc */
|
|
42
|
+
getChain(): string;
|
|
43
|
+
/** @inheritDoc */
|
|
44
|
+
getBaseChain(): string;
|
|
45
|
+
/** @inheritDoc */
|
|
46
|
+
getFullName(): string;
|
|
47
|
+
/** @inheritDoc */
|
|
48
|
+
getBaseFactor(): number;
|
|
49
|
+
/** @inheritDoc */
|
|
50
|
+
valuelessTransferAllowed(): boolean;
|
|
51
|
+
/** @inheritDoc */
|
|
52
|
+
supportsTss(): boolean;
|
|
53
|
+
/** @inheritDoc */
|
|
54
|
+
getMPCAlgorithm(): MPCAlgorithm;
|
|
55
|
+
/**
|
|
56
|
+
* Verify that the transaction coin/token matches this token
|
|
57
|
+
* @param txPrebuild - Transaction prebuild object
|
|
58
|
+
* @returns true if valid, false otherwise
|
|
59
|
+
*/
|
|
60
|
+
verifyCoin(txPrebuild: {
|
|
61
|
+
coin?: string;
|
|
62
|
+
token?: string;
|
|
63
|
+
}): boolean;
|
|
64
|
+
/**
|
|
65
|
+
* Get send method arguments for TIP-20 token transfer with memo
|
|
66
|
+
* @param txInfo - Transaction information including recipient and amount
|
|
67
|
+
* @returns Array of send method arguments for ABI encoding
|
|
68
|
+
*/
|
|
69
|
+
getSendMethodArgs(txInfo: GetSendMethodArgsOptions): SendMethodArgs[];
|
|
70
|
+
/**
|
|
71
|
+
* Get operation object for TIP-20 token transfer (for batch transactions)
|
|
72
|
+
* @param recipient - Recipient information with address, amount, and optional memo
|
|
73
|
+
* @param expireTime - Transaction expiration time
|
|
74
|
+
* @param contractSequenceId - Contract sequence ID
|
|
75
|
+
* @returns Operation array for ABI encoding
|
|
76
|
+
*/
|
|
77
|
+
getOperation(recipient: {
|
|
78
|
+
address: string;
|
|
79
|
+
amount: string;
|
|
80
|
+
memo?: string;
|
|
81
|
+
}, expireTime: number, contractSequenceId: number): (string | Buffer)[][];
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=tip20Token.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tip20Token.d.ts","sourceRoot":"","sources":["../../src/tip20Token.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,YAAY,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AACtG,OAAO,EAAiB,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACtE,OAAO,EAAE,wBAAwB,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAEpF,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAGhC,OAAO,EAAE,gBAAgB,EAAE,CAAC;AAE5B;;;;;;GAMG;AACH,qBAAa,UAAW,SAAQ,KAAK;IACnC,SAAgB,WAAW,EAAE,gBAAgB,CAAC;IAC9C,SAAgB,eAAe,EAAE,MAAM,CAAC;gBAE5B,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,gBAAgB;IAO3D;;OAEG;IACH,MAAM,CAAC,sBAAsB,CAAC,MAAM,EAAE,gBAAgB,GAAG,eAAe;IAIxE;;;OAGG;IACH,MAAM,CAAC,uBAAuB,CAC5B,YAAY,GAAE,gBAAgB,EAAqE,GAClG,oBAAoB,EAAE;IAezB,yBAAyB;IACzB,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,yBAAyB;IACzB,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,wBAAwB;IACxB,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,sBAAsB;IACtB,IAAI,OAAO,IAAI,MAAM,CAEpB;IAED,qCAAqC;IACrC,IAAI,oBAAoB,IAAI,MAAM,CAEjC;IAED,+BAA+B;IAC/B,IAAI,aAAa,IAAI,MAAM,CAE1B;IAED,kBAAkB;IAClB,QAAQ,IAAI,MAAM;IAIlB,kBAAkB;IAClB,YAAY,IAAI,MAAM;IAItB,kBAAkB;IAClB,WAAW,IAAI,MAAM;IAIrB,kBAAkB;IAClB,aAAa,IAAI,MAAM;IAIvB,kBAAkB;IAClB,wBAAwB,IAAI,OAAO;IAInC,kBAAkB;IAClB,WAAW,IAAI,OAAO;IAItB,kBAAkB;IAClB,eAAe,IAAI,YAAY;IAI/B;;;;OAIG;IACH,UAAU,CAAC,UAAU,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO;IAelE;;;;OAIG;IACH,iBAAiB,CAAC,MAAM,EAAE,wBAAwB,GAAG,cAAc,EAAE;IA+DrE;;;;;;OAMG;IACH,YAAY,CACV,SAAS,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,EAC7D,UAAU,EAAE,MAAM,EAClB,kBAAkB,EAAE,MAAM,GACzB,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,EAAE;CA0BzB"}
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Tip20Token = void 0;
|
|
4
|
+
const statics_1 = require("@bitgo-beta/statics");
|
|
5
|
+
const tempo_1 = require("./tempo");
|
|
6
|
+
const utils_1 = require("./lib/utils");
|
|
7
|
+
/**
|
|
8
|
+
* TIP20 Token Implementation (Skeleton)
|
|
9
|
+
*
|
|
10
|
+
* This is a minimal skeleton for TIP20 tokens on Tempo blockchain.
|
|
11
|
+
*
|
|
12
|
+
* TODO: All methods will be implemented progressively
|
|
13
|
+
*/
|
|
14
|
+
class Tip20Token extends tempo_1.Tempo {
|
|
15
|
+
constructor(bitgo, tokenConfig) {
|
|
16
|
+
const staticsCoin = tokenConfig.network === 'Mainnet' ? statics_1.coins.get('tempo') : statics_1.coins.get('ttempo');
|
|
17
|
+
super(bitgo, staticsCoin);
|
|
18
|
+
this.tokenConfig = tokenConfig;
|
|
19
|
+
this.contractAddress = tokenConfig.tokenContractAddress;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Create a coin constructor for a specific token
|
|
23
|
+
*/
|
|
24
|
+
static createTokenConstructor(config) {
|
|
25
|
+
return (bitgo) => new Tip20Token(bitgo, config);
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Create token constructors for all TIP20 tokens
|
|
29
|
+
* @param tokenConfigs - Array of token configurations; defaults to all TIP20 tokens from statics
|
|
30
|
+
*/
|
|
31
|
+
static createTokenConstructors(tokenConfigs = [...statics_1.tokens.bitcoin.tempo.tokens, ...statics_1.tokens.testnet.tempo.tokens]) {
|
|
32
|
+
const configs = tokenConfigs;
|
|
33
|
+
const tokensCtors = [];
|
|
34
|
+
for (const token of configs) {
|
|
35
|
+
const tokenConstructor = Tip20Token.createTokenConstructor(token);
|
|
36
|
+
// Register by token type
|
|
37
|
+
tokensCtors.push({ name: token.type, coinConstructor: tokenConstructor });
|
|
38
|
+
// Also register by contract address for lookups
|
|
39
|
+
tokensCtors.push({ name: token.tokenContractAddress, coinConstructor: tokenConstructor });
|
|
40
|
+
}
|
|
41
|
+
return tokensCtors;
|
|
42
|
+
}
|
|
43
|
+
/** Get the token type */
|
|
44
|
+
get type() {
|
|
45
|
+
return this.tokenConfig.type;
|
|
46
|
+
}
|
|
47
|
+
/** Get the token name */
|
|
48
|
+
get name() {
|
|
49
|
+
return this.tokenConfig.name;
|
|
50
|
+
}
|
|
51
|
+
/** Get the base coin */
|
|
52
|
+
get coin() {
|
|
53
|
+
return this.tokenConfig.coin;
|
|
54
|
+
}
|
|
55
|
+
/** Get the network */
|
|
56
|
+
get network() {
|
|
57
|
+
return this.tokenConfig.network;
|
|
58
|
+
}
|
|
59
|
+
/** Get the token contract address */
|
|
60
|
+
get tokenContractAddress() {
|
|
61
|
+
return this.tokenConfig.tokenContractAddress;
|
|
62
|
+
}
|
|
63
|
+
/** Get token decimal places */
|
|
64
|
+
get decimalPlaces() {
|
|
65
|
+
return this.tokenConfig.decimalPlaces;
|
|
66
|
+
}
|
|
67
|
+
/** @inheritDoc */
|
|
68
|
+
getChain() {
|
|
69
|
+
return this.tokenConfig.type;
|
|
70
|
+
}
|
|
71
|
+
/** @inheritDoc */
|
|
72
|
+
getBaseChain() {
|
|
73
|
+
return this.coin;
|
|
74
|
+
}
|
|
75
|
+
/** @inheritDoc */
|
|
76
|
+
getFullName() {
|
|
77
|
+
return 'TIP20 Token';
|
|
78
|
+
}
|
|
79
|
+
/** @inheritDoc */
|
|
80
|
+
getBaseFactor() {
|
|
81
|
+
return Math.pow(10, this.tokenConfig.decimalPlaces);
|
|
82
|
+
}
|
|
83
|
+
/** @inheritDoc */
|
|
84
|
+
valuelessTransferAllowed() {
|
|
85
|
+
return true;
|
|
86
|
+
}
|
|
87
|
+
/** @inheritDoc */
|
|
88
|
+
supportsTss() {
|
|
89
|
+
return true;
|
|
90
|
+
}
|
|
91
|
+
/** @inheritDoc */
|
|
92
|
+
getMPCAlgorithm() {
|
|
93
|
+
return 'ecdsa';
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Verify that the transaction coin/token matches this token
|
|
97
|
+
* @param txPrebuild - Transaction prebuild object
|
|
98
|
+
* @returns true if valid, false otherwise
|
|
99
|
+
*/
|
|
100
|
+
verifyCoin(txPrebuild) {
|
|
101
|
+
if (!txPrebuild) {
|
|
102
|
+
return false;
|
|
103
|
+
}
|
|
104
|
+
// Check if the coin or token matches this token's configuration
|
|
105
|
+
const coinMatch = txPrebuild.coin === this.tokenConfig.coin || txPrebuild.coin === this.tokenConfig.type;
|
|
106
|
+
const tokenMatch = !txPrebuild.token ||
|
|
107
|
+
txPrebuild.token === this.tokenConfig.tokenContractAddress ||
|
|
108
|
+
txPrebuild.token === this.tokenConfig.type;
|
|
109
|
+
return coinMatch && tokenMatch;
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Get send method arguments for TIP-20 token transfer with memo
|
|
113
|
+
* @param txInfo - Transaction information including recipient and amount
|
|
114
|
+
* @returns Array of send method arguments for ABI encoding
|
|
115
|
+
*/
|
|
116
|
+
getSendMethodArgs(txInfo) {
|
|
117
|
+
const { recipient } = txInfo;
|
|
118
|
+
if (!recipient) {
|
|
119
|
+
throw new Error('Recipient is required for token transfer');
|
|
120
|
+
}
|
|
121
|
+
if (!(0, utils_1.isValidAddress)(recipient.address)) {
|
|
122
|
+
throw new Error(`Invalid recipient address: ${recipient.address}`);
|
|
123
|
+
}
|
|
124
|
+
if (!(0, utils_1.isValidTip20Amount)(recipient.amount)) {
|
|
125
|
+
throw new Error(`Invalid amount: ${recipient.amount}`);
|
|
126
|
+
}
|
|
127
|
+
const memo = recipient.memo;
|
|
128
|
+
if (memo && Buffer.byteLength(memo, 'utf-8') > 32) {
|
|
129
|
+
throw new Error('Memo too long: maximum 32 bytes');
|
|
130
|
+
}
|
|
131
|
+
const amountInUnits = (0, utils_1.amountToTip20Units)(recipient.amount);
|
|
132
|
+
const data = (0, utils_1.encodeTip20TransferWithMemo)(recipient.address, amountInUnits, memo);
|
|
133
|
+
return [
|
|
134
|
+
{
|
|
135
|
+
name: 'toAddress',
|
|
136
|
+
type: 'address',
|
|
137
|
+
value: recipient.address,
|
|
138
|
+
},
|
|
139
|
+
{
|
|
140
|
+
name: 'value',
|
|
141
|
+
type: 'uint',
|
|
142
|
+
value: recipient.amount,
|
|
143
|
+
},
|
|
144
|
+
{
|
|
145
|
+
name: 'tokenContractAddress',
|
|
146
|
+
type: 'address',
|
|
147
|
+
value: this.tokenConfig.tokenContractAddress,
|
|
148
|
+
},
|
|
149
|
+
{
|
|
150
|
+
name: 'data',
|
|
151
|
+
type: 'bytes',
|
|
152
|
+
value: Buffer.from(data.slice(2), 'hex'),
|
|
153
|
+
},
|
|
154
|
+
{
|
|
155
|
+
name: 'expireTime',
|
|
156
|
+
type: 'uint',
|
|
157
|
+
value: txInfo.expireTime,
|
|
158
|
+
},
|
|
159
|
+
{
|
|
160
|
+
name: 'sequenceId',
|
|
161
|
+
type: 'uint',
|
|
162
|
+
value: txInfo.contractSequenceId,
|
|
163
|
+
},
|
|
164
|
+
{
|
|
165
|
+
name: 'signature',
|
|
166
|
+
type: 'bytes',
|
|
167
|
+
value: Buffer.from(txInfo.signature.replace('0x', ''), 'hex'),
|
|
168
|
+
},
|
|
169
|
+
];
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Get operation object for TIP-20 token transfer (for batch transactions)
|
|
173
|
+
* @param recipient - Recipient information with address, amount, and optional memo
|
|
174
|
+
* @param expireTime - Transaction expiration time
|
|
175
|
+
* @param contractSequenceId - Contract sequence ID
|
|
176
|
+
* @returns Operation array for ABI encoding
|
|
177
|
+
*/
|
|
178
|
+
getOperation(recipient, expireTime, contractSequenceId) {
|
|
179
|
+
if (!(0, utils_1.isValidAddress)(recipient.address)) {
|
|
180
|
+
throw new Error(`Invalid recipient address: ${recipient.address}`);
|
|
181
|
+
}
|
|
182
|
+
if (!(0, utils_1.isValidTip20Amount)(recipient.amount)) {
|
|
183
|
+
throw new Error(`Invalid amount: ${recipient.amount}`);
|
|
184
|
+
}
|
|
185
|
+
// Validate memo byte length (handles multi-byte UTF-8 characters)
|
|
186
|
+
if (recipient.memo !== undefined && recipient.memo !== null && recipient.memo !== '') {
|
|
187
|
+
const memoByteLength = new TextEncoder().encode(recipient.memo).length;
|
|
188
|
+
if (memoByteLength > 32) {
|
|
189
|
+
throw new Error(`Memo too long: ${memoByteLength} bytes. Maximum 32 bytes.`);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
const amountInUnits = (0, utils_1.amountToTip20Units)(recipient.amount);
|
|
193
|
+
const data = (0, utils_1.encodeTip20TransferWithMemo)(recipient.address, amountInUnits, recipient.memo);
|
|
194
|
+
// Return format compatible with parent class for ABI encoding
|
|
195
|
+
return [
|
|
196
|
+
['address', 'bytes'],
|
|
197
|
+
[this.tokenConfig.tokenContractAddress, Buffer.from(data.slice(2), 'hex')],
|
|
198
|
+
];
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
exports.Tip20Token = Tip20Token;
|
|
202
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGlwMjBUb2tlbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90aXAyMFRva2VuLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUlBLGlEQUFzRTtBQUd0RSxtQ0FBZ0M7QUFDaEMsdUNBQWtIO0FBSWxIOzs7Ozs7R0FNRztBQUNILE1BQWEsVUFBVyxTQUFRLGFBQUs7SUFJbkMsWUFBWSxLQUFnQixFQUFFLFdBQTZCO1FBQ3pELE1BQU0sV0FBVyxHQUFHLFdBQVcsQ0FBQyxPQUFPLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxlQUFLLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxlQUFLLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ2pHLEtBQUssQ0FBQyxLQUFLLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDMUIsSUFBSSxDQUFDLFdBQVcsR0FBRyxXQUFXLENBQUM7UUFDL0IsSUFBSSxDQUFDLGVBQWUsR0FBRyxXQUFXLENBQUMsb0JBQW9CLENBQUM7SUFDMUQsQ0FBQztJQUVEOztPQUVHO0lBQ0gsTUFBTSxDQUFDLHNCQUFzQixDQUFDLE1BQXdCO1FBQ3BELE9BQU8sQ0FBQyxLQUFnQixFQUFFLEVBQUUsQ0FBQyxJQUFJLFVBQVUsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDN0QsQ0FBQztJQUVEOzs7T0FHRztJQUNILE1BQU0sQ0FBQyx1QkFBdUIsQ0FDNUIsZUFBbUMsQ0FBQyxHQUFHLGdCQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsR0FBRyxnQkFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDO1FBRW5HLE1BQU0sT0FBTyxHQUFHLFlBQVksQ0FBQztRQUM3QixNQUFNLFdBQVcsR0FBMkIsRUFBRSxDQUFDO1FBRS9DLEtBQUssTUFBTSxLQUFLLElBQUksT0FBTyxFQUFFLENBQUM7WUFDNUIsTUFBTSxnQkFBZ0IsR0FB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QUFJLEtBQUssRUFBRSxFQUFFLENBQUM7WUFDckYsTUFBTSxjQUFjLEdBQUcsSUFBSSxXQUFXLEVBQUUsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQztZQUN2RSxJQUFJLGNBQWMsR0FBRyxFQUFFLEVBQUUsQ0FBQztnQkFDeEIsTUFBTSxJQUFJLEtBQUssQ0FBQyxrQkFBa0IsY0FBYywyQkFBMkIsQ0FBQyxDQUFDO1lBQy9FLENBQUM7UUFDSCxDQUFDO1FBRUQsTUFBTSxhQUFhLEdBQUcsSUFBQSwwQkFBa0IsRUFBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDM0QsTUFBTSxJQUFJLEdBQUcsSUFBQSxtQ0FBMkIsRUFBQyxTQUFTLENBQUMsT0FBa0IsRUFBRSxhQUFhLEVBQUUsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRXRHLDhEQUE4RDtRQUM5RCxPQUFPO1lBQ0wsQ0FBQyxTQUFTLEVBQUUsT0FBTyxDQUFDO1lBQ3BCLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxvQkFBb0IsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7U0FDM0UsQ0FBQztJQUNKLENBQUM7Q0FDRjtBQXJPRCxnQ0FxT0MiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBwcmV0dGllclxuICovXG5pbXBvcnQgeyBCaXRHb0Jhc2UsIENvaW5Db25zdHJ1Y3RvciwgTVBDQWxnb3JpdGhtLCBOYW1lZENvaW5Db25zdHJ1Y3RvciB9IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1jb3JlJztcbmltcG9ydCB7IGNvaW5zLCB0b2tlbnMsIFRpcDIwVG9rZW5Db25maWcgfSBmcm9tICdAYml0Z28tYmV0YS9zdGF0aWNzJztcbmltcG9ydCB7IEdldFNlbmRNZXRob2RBcmdzT3B0aW9ucywgU2VuZE1ldGhvZEFyZ3MgfSBmcm9tICdAYml0Z28tYmV0YS9hYnN0cmFjdC1ldGgnO1xuaW1wb3J0IHsgQWRkcmVzcyB9IGZyb20gJy4vbGliL3R5cGVzJztcbmltcG9ydCB7IFRlbXBvIH0gZnJvbSAnLi90ZW1wbyc7XG5pbXBvcnQgeyBlbmNvZGVUaXAyMFRyYW5zZmVyV2l0aE1lbW8sIGFtb3VudFRvVGlwMjBVbml0cywgaXNWYWxpZEFkZHJlc3MsIGlzVmFsaWRUaXAyMEFtb3VudCB9IGZyb20gJy4vbGliL3V0aWxzJztcblxuZXhwb3J0IHsgVGlwMjBUb2tlbkNvbmZpZyB9O1xuXG4vKipcbiAqIFRJUDIwIFRva2VuIEltcGxlbWVudGF0aW9uIChTa2VsZXRvbilcbiAqXG4gKiBUaGlzIGlzIGEgbWluaW1hbCBza2VsZXRvbiBmb3IgVElQMjAgdG9rZW5zIG9uIFRlbXBvIGJsb2NrY2hhaW4uXG4gKlxuICogVE9ETzogQWxsIG1ldGhvZHMgd2lsbCBiZSBpbXBsZW1lbnRlZCBwcm9ncmVzc2l2ZWx5XG4gKi9cbmV4cG9ydCBjbGFzcyBUaXAyMFRva2VuIGV4dGVuZHMgVGVtcG8ge1xuICBwdWJsaWMgcmVhZG9ubHkgdG9rZW5Db25maWc6IFRpcDIwVG9rZW5Db25maWc7XG4gIHB1YmxpYyByZWFkb25seSBjb250cmFjdEFkZHJlc3M6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihiaXRnbzogQml0R29CYXNlLCB0b2tlbkNvbmZpZzogVGlwMjBUb2tlbkNvbmZpZykge1xuICAgIGNvbnN0IHN0YXRpY3NDb2luID0gdG9rZW5Db25maWcubmV0d29yayA9PT0gJ01haW5uZXQnID8gY29pbnMuZ2V0KCd0ZW1wbycpIDogY29pbnMuZ2V0KCd0dGVtcG8nKTtcbiAgICBzdXBlcihiaXRnbywgc3RhdGljc0NvaW4pO1xuICAgIHRoaXMudG9rZW5Db25maWcgPSB0b2tlbkNvbmZpZztcbiAgICB0aGlzLmNvbnRyYWN0QWRkcmVzcyA9IHRva2VuQ29uZmlnLnRva2VuQ29udHJhY3RBZGRyZXNzO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIGNvaW4gY29uc3RydWN0b3IgZm9yIGEgc3BlY2lmaWMgdG9rZW5cbiAgICovXG4gIHN0YXRpYyBjcmVhdGVUb2tlbkNvbnN0cnVjdG9yKGNvbmZpZzogVGlwMjBUb2tlbkNvbmZpZyk6IENvaW5Db25zdHJ1Y3RvciB7XG4gICAgcmV0dXJuIChiaXRnbzogQml0R29CYXNlKSA9PiBuZXcgVGlwMjBUb2tlbihiaXRnbywgY29uZmlnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgdG9rZW4gY29uc3RydWN0b3JzIGZvciBhbGwgVElQMjAgdG9rZW5zXG4gICAqIEBwYXJhbSB0b2tlbkNvbmZpZ3MgLSBBcnJheSBvZiB0b2tlbiBjb25maWd1cmF0aW9uczsgZGVmYXVsdHMgdG8gYWxsIFRJUDIwIHRva2VucyBmcm9tIHN0YXRpY3NcbiAgICovXG4gIHN0YXRpYyBjcmVhdGVUb2tlbkNvbnN0cnVjdG9ycyhcbiAgICB0b2tlbkNvbmZpZ3M6IFRpcDIwVG9rZW5Db25maWdbXSA9IFsuLi50b2tlbnMuYml0Y29pbi50ZW1wby50b2tlbnMsIC4uLnRva2Vucy50ZXN0bmV0LnRlbXBvLnRva2Vuc11cbiAgKTogTmFtZWRDb2luQ29uc3RydWN0b3JbXSB7XG4gICAgY29uc3QgY29uZmlncyA9IHRva2VuQ29uZmlncztcbiAgICBjb25zdCB0b2tlbnNDdG9yczogTmFtZWRDb2luQ29uc3RydWN0b3JbXSA9IFtdO1xuXG4gICAgZm9yIChjb25zdCB0b2tlbiBvZiBjb25maWdzKSB7XG4gICAgICBjb25zdCB0b2tlbkNvbnN0cnVjdG9yID0gVGlwMjBUb2tlbi5jcmVhdGVUb2tlbkNvbnN0cnVjdG9yKHRva2VuKTtcbiAgICAgIC8vIFJlZ2lzdGVyIGJ5IHRva2VuIHR5cGVcbiAgICAgIHRva2Vuc0N0b3JzLnB1c2goeyBuYW1lOiB0b2tlbi50eXBlLCBjb2luQ29uc3RydWN0b3I6IHRva2VuQ29uc3RydWN0b3IgfSk7XG4gICAgICAvLyBBbHNvIHJlZ2lzdGVyIGJ5IGNvbnRyYWN0IGFkZHJlc3MgZm9yIGxvb2t1cHNcbiAgICAgIHRva2Vuc0N0b3JzLnB1c2goeyBuYW1lOiB0b2tlbi50b2tlbkNvbnRyYWN0QWRkcmVzcywgY29pbkNvbnN0cnVjdG9yOiB0b2tlbkNvbnN0cnVjdG9yIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB0b2tlbnNDdG9ycztcbiAgfVxuXG4gIC8qKiBHZXQgdGhlIHRva2VuIHR5cGUgKi9cbiAgZ2V0IHR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy50b2tlbkNvbmZpZy50eXBlO1xuICB9XG5cbiAgLyoqIEdldCB0aGUgdG9rZW4gbmFtZSAqL1xuICBnZXQgbmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnRva2VuQ29uZmlnLm5hbWU7XG4gIH1cblxuICAvKiogR2V0IHRoZSBiYXNlIGNvaW4gKi9cbiAgZ2V0IGNvaW4oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy50b2tlbkNvbmZpZy5jb2luO1xuICB9XG5cbiAgLyoqIEdldCB0aGUgbmV0d29yayAqL1xuICBnZXQgbmV0d29yaygpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnRva2VuQ29uZmlnLm5ldHdvcms7XG4gIH1cblxuICAvKiogR2V0IHRoZSB0b2tlbiBjb250cmFjdCBhZGRyZXNzICovXG4gIGdldCB0b2tlbkNvbnRyYWN0QWRkcmVzcygpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnRva2VuQ29uZmlnLnRva2VuQ29udHJhY3RBZGRyZXNzO1xuICB9XG5cbiAgLyoqIEdldCB0b2tlbiBkZWNpbWFsIHBsYWNlcyAqL1xuICBnZXQgZGVjaW1hbFBsYWNlcygpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnRva2VuQ29uZmlnLmRlY2ltYWxQbGFjZXM7XG4gIH1cblxuICAvKiogQGluaGVyaXREb2MgKi9cbiAgZ2V0Q2hhaW4oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy50b2tlbkNvbmZpZy50eXBlO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0RG9jICovXG4gIGdldEJhc2VDaGFpbigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmNvaW47XG4gIH1cblxuICAvKiogQGluaGVyaXREb2MgKi9cbiAgZ2V0RnVsbE5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gJ1RJUDIwIFRva2VuJztcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdERvYyAqL1xuICBnZXRCYXNlRmFjdG9yKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIE1hdGgucG93KDEwLCB0aGlzLnRva2VuQ29uZmlnLmRlY2ltYWxQbGFjZXMpO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0RG9jICovXG4gIHZhbHVlbGVzc1RyYW5zZmVyQWxsb3dlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdERvYyAqL1xuICBzdXBwb3J0c1RzcygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdERvYyAqL1xuICBnZXRNUENBbGdvcml0aG0oKTogTVBDQWxnb3JpdGhtIHtcbiAgICByZXR1cm4gJ2VjZHNhJztcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZnkgdGhhdCB0aGUgdHJhbnNhY3Rpb24gY29pbi90b2tlbiBtYXRjaGVzIHRoaXMgdG9rZW5cbiAgICogQHBhcmFtIHR4UHJlYnVpbGQgLSBUcmFuc2FjdGlvbiBwcmVidWlsZCBvYmplY3RcbiAgICogQHJldHVybnMgdHJ1ZSBpZiB2YWxpZCwgZmFsc2Ugb3RoZXJ3aXNlXG4gICAqL1xuICB2ZXJpZnlDb2luKHR4UHJlYnVpbGQ6IHsgY29pbj86IHN0cmluZzsgdG9rZW4/OiBzdHJpbmcgfSk6IGJvb2xlYW4ge1xuICAgIGlmICghdHhQcmVidWlsZCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGlmIHRoZSBjb2luIG9yIHRva2VuIG1hdGNoZXMgdGhpcyB0b2tlbidzIGNvbmZpZ3VyYXRpb25cbiAgICBjb25zdCBjb2luTWF0Y2ggPSB0eFByZWJ1aWxkLmNvaW4gPT09IHRoaXMudG9rZW5Db25maWcuY29pbiB8fCB0eFByZWJ1aWxkLmNvaW4gPT09IHRoaXMudG9rZW5Db25maWcudHlwZTtcbiAgICBjb25zdCB0b2tlbk1hdGNoID1cbiAgICAgICF0eFByZWJ1aWxkLnRva2VuIHx8XG4gICAgICB0eFByZWJ1aWxkLnRva2VuID09PSB0aGlzLnRva2VuQ29uZmlnLnRva2VuQ29udHJhY3RBZGRyZXNzIHx8XG4gICAgICB0eFByZWJ1aWxkLnRva2VuID09PSB0aGlzLnRva2VuQ29uZmlnLnR5cGU7XG5cbiAgICByZXR1cm4gY29pbk1hdGNoICYmIHRva2VuTWF0Y2g7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHNlbmQgbWV0aG9kIGFyZ3VtZW50cyBmb3IgVElQLTIwIHRva2VuIHRyYW5zZmVyIHdpdGggbWVtb1xuICAgKiBAcGFyYW0gdHhJbmZvIC0gVHJhbnNhY3Rpb24gaW5mb3JtYXRpb24gaW5jbHVkaW5nIHJlY2lwaWVudCBhbmQgYW1vdW50XG4gICAqIEByZXR1cm5zIEFycmF5IG9mIHNlbmQgbWV0aG9kIGFyZ3VtZW50cyBmb3IgQUJJIGVuY29kaW5nXG4gICAqL1xuICBnZXRTZW5kTWV0aG9kQXJncyh0eEluZm86IEdldFNlbmRNZXRob2RBcmdzT3B0aW9ucyk6IFNlbmRNZXRob2RBcmdzW10ge1xuICAgIGNvbnN0IHsgcmVjaXBpZW50IH0gPSB0eEluZm87XG5cbiAgICBpZiAoIXJlY2lwaWVudCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZWNpcGllbnQgaXMgcmVxdWlyZWQgZm9yIHRva2VuIHRyYW5zZmVyJyk7XG4gICAgfVxuXG4gICAgaWYgKCFpc1ZhbGlkQWRkcmVzcyhyZWNpcGllbnQuYWRkcmVzcykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCByZWNpcGllbnQgYWRkcmVzczogJHtyZWNpcGllbnQuYWRkcmVzc31gKTtcbiAgICB9XG5cbiAgICBpZiAoIWlzVmFsaWRUaXAyMEFtb3VudChyZWNpcGllbnQuYW1vdW50KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGFtb3VudDogJHtyZWNpcGllbnQuYW1vdW50fWApO1xuICAgIH1cblxuICAgIGNvbnN0IG1lbW8gPSAocmVjaXBpZW50IGFzIHsgbWVtbz86IHN0cmluZyB9KS5tZW1vO1xuXG4gICAgaWYgKG1lbW8gJiYgQnVmZmVyLmJ5dGVMZW5ndGgobWVtbywgJ3V0Zi04JykgPiAzMikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNZW1vIHRvbyBsb25nOiBtYXhpbXVtIDMyIGJ5dGVzJyk7XG4gICAgfVxuXG4gICAgY29uc3QgYW1vdW50SW5Vbml0cyA9IGFtb3VudFRvVGlwMjBVbml0cyhyZWNpcGllbnQuYW1vdW50KTtcbiAgICBjb25zdCBkYXRhID0gZW5jb2RlVGlwMjBUcmFuc2ZlcldpdGhNZW1vKHJlY2lwaWVudC5hZGRyZXNzIGFzIEFkZHJlc3MsIGFtb3VudEluVW5pdHMsIG1lbW8pO1xuXG4gICAgcmV0dXJuIFtcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ3RvQWRkcmVzcycsXG4gICAgICAgIHR5cGU6ICdhZGRyZXNzJyxcbiAgICAgICAgdmFsdWU6IHJlY2lwaWVudC5hZGRyZXNzLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ3ZhbHVlJyxcbiAgICAgICAgdHlwZTogJ3VpbnQnLFxuICAgICAgICB2YWx1ZTogcmVjaXBpZW50LmFtb3VudCxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICd0b2tlbkNvbnRyYWN0QWRkcmVzcycsXG4gICAgICAgIHR5cGU6ICdhZGRyZXNzJyxcbiAgICAgICAgdmFsdWU6IHRoaXMudG9rZW5Db25maWcudG9rZW5Db250cmFjdEFkZHJlc3MsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBuYW1lOiAnZGF0YScsXG4gICAgICAgIHR5cGU6ICdieXRlcycsXG4gICAgICAgIHZhbHVlOiBCdWZmZXIuZnJvbShkYXRhLnNsaWNlKDIpLCAnaGV4JyksXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBuYW1lOiAnZXhwaXJlVGltZScsXG4gICAgICAgIHR5cGU6ICd1aW50JyxcbiAgICAgICAgdmFsdWU6IHR4SW5mby5leHBpcmVUaW1lLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ3NlcXVlbmNlSWQnLFxuICAgICAgICB0eXBlOiAndWludCcsXG4gICAgICAgIHZhbHVlOiB0eEluZm8uY29udHJhY3RTZXF1ZW5jZUlkLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ3NpZ25hdHVyZScsXG4gICAgICAgIHR5cGU6ICdieXRlcycsXG4gICAgICAgIHZhbHVlOiBCdWZmZXIuZnJvbSh0eEluZm8uc2lnbmF0dXJlLnJlcGxhY2UoJzB4JywgJycpLCAnaGV4JyksXG4gICAgICB9LFxuICAgIF07XG4gIH1cblxuICAvKipcbiAgICogR2V0IG9wZXJhdGlvbiBvYmplY3QgZm9yIFRJUC0yMCB0b2tlbiB0cmFuc2ZlciAoZm9yIGJhdGNoIHRyYW5zYWN0aW9ucylcbiAgICogQHBhcmFtIHJlY2lwaWVudCAtIFJlY2lwaWVudCBpbmZvcm1hdGlvbiB3aXRoIGFkZHJlc3MsIGFtb3VudCwgYW5kIG9wdGlvbmFsIG1lbW9cbiAgICogQHBhcmFtIGV4cGlyZVRpbWUgLSBUcmFuc2FjdGlvbiBleHBpcmF0aW9uIHRpbWVcbiAgICogQHBhcmFtIGNvbnRyYWN0U2VxdWVuY2VJZCAtIENvbnRyYWN0IHNlcXVlbmNlIElEXG4gICAqIEByZXR1cm5zIE9wZXJhdGlvbiBhcnJheSBmb3IgQUJJIGVuY29kaW5nXG4gICAqL1xuICBnZXRPcGVyYXRpb24oXG4gICAgcmVjaXBpZW50OiB7IGFkZHJlc3M6IHN0cmluZzsgYW1vdW50OiBzdHJpbmc7IG1lbW8/OiBzdHJpbmcgfSxcbiAgICBleHBpcmVUaW1lOiBudW1iZXIsXG4gICAgY29udHJhY3RTZXF1ZW5jZUlkOiBudW1iZXJcbiAgKTogKHN0cmluZyB8IEJ1ZmZlcilbXVtdIHtcbiAgICBpZiAoIWlzVmFsaWRBZGRyZXNzKHJlY2lwaWVudC5hZGRyZXNzKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHJlY2lwaWVudCBhZGRyZXNzOiAke3JlY2lwaWVudC5hZGRyZXNzfWApO1xuICAgIH1cblxuICAgIGlmICghaXNWYWxpZFRpcDIwQW1vdW50KHJlY2lwaWVudC5hbW91bnQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgYW1vdW50OiAke3JlY2lwaWVudC5hbW91bnR9YCk7XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgbWVtbyBieXRlIGxlbmd0aCAoaGFuZGxlcyBtdWx0aS1ieXRlIFVURi04IGNoYXJhY3RlcnMpXG4gICAgaWYgKHJlY2lwaWVudC5tZW1vICE9PSB1bmRlZmluZWQgJiYgcmVjaXBpZW50Lm1lbW8gIT09IG51bGwgJiYgcmVjaXBpZW50Lm1lbW8gIT09ICcnKSB7XG4gICAgICBjb25zdCBtZW1vQnl0ZUxlbmd0aCA9IG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZShyZWNpcGllbnQubWVtbykubGVuZ3RoO1xuICAgICAgaWYgKG1lbW9CeXRlTGVuZ3RoID4gMzIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBNZW1vIHRvbyBsb25nOiAke21lbW9CeXRlTGVuZ3RofSBieXRlcy4gTWF4aW11bSAzMiBieXRlcy5gKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBhbW91bnRJblVuaXRzID0gYW1vdW50VG9UaXAyMFVuaXRzKHJlY2lwaWVudC5hbW91bnQpO1xuICAgIGNvbnN0IGRhdGEgPSBlbmNvZGVUaXAyMFRyYW5zZmVyV2l0aE1lbW8ocmVjaXBpZW50LmFkZHJlc3MgYXMgQWRkcmVzcywgYW1vdW50SW5Vbml0cywgcmVjaXBpZW50Lm1lbW8pO1xuXG4gICAgLy8gUmV0dXJuIGZvcm1hdCBjb21wYXRpYmxlIHdpdGggcGFyZW50IGNsYXNzIGZvciBBQkkgZW5jb2RpbmdcbiAgICByZXR1cm4gW1xuICAgICAgWydhZGRyZXNzJywgJ2J5dGVzJ10sXG4gICAgICBbdGhpcy50b2tlbkNvbmZpZy50b2tlbkNvbnRyYWN0QWRkcmVzcywgQnVmZmVyLmZyb20oZGF0YS5zbGljZSgyKSwgJ2hleCcpXSxcbiAgICBdO1xuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tip20.d.ts","sourceRoot":"","sources":["../../../test/integration/tip20.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* TIP-20 Integration Tests
|
|
4
|
+
*
|
|
5
|
+
* End-to-end flows for TIP-20 token transactions on Tempo using testnet token addresses.
|
|
6
|
+
*/
|
|
7
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
8
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
9
|
+
};
|
|
10
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
|
+
const assert_1 = __importDefault(require("assert"));
|
|
12
|
+
const mocha_1 = require("mocha");
|
|
13
|
+
const ethers_1 = require("ethers");
|
|
14
|
+
const statics_1 = require("@bitgo-beta/statics");
|
|
15
|
+
const transactionBuilder_1 = require("../../src/lib/transactionBuilder");
|
|
16
|
+
const transaction_1 = require("../../src/lib/transaction");
|
|
17
|
+
const constants_1 = require("../../src/lib/constants");
|
|
18
|
+
const tempo_1 = require("../resources/tempo");
|
|
19
|
+
const mockCoinConfig = statics_1.coins.get('ttempo');
|
|
20
|
+
const ALPHA_USD_TOKEN = tempo_1.TESTNET_TOKENS.alphaUSD.address;
|
|
21
|
+
const BETA_USD_TOKEN = tempo_1.TESTNET_TOKENS.betaUSD.address;
|
|
22
|
+
const THETA_USD_TOKEN = tempo_1.TESTNET_TOKENS.thetaUSD.address;
|
|
23
|
+
const RECEIVER_ADDRESS = tempo_1.TEST_RECIPIENT_ADDRESS;
|
|
24
|
+
(0, mocha_1.describe)('TIP-20 Integration Tests', () => {
|
|
25
|
+
(0, mocha_1.describe)('Single Transfer', () => {
|
|
26
|
+
(0, mocha_1.it)('should build and serialize single TIP-20 transfer', async () => {
|
|
27
|
+
const builder = new transactionBuilder_1.Tip20TransactionBuilder(mockCoinConfig);
|
|
28
|
+
builder
|
|
29
|
+
.addOperation({
|
|
30
|
+
token: ALPHA_USD_TOKEN,
|
|
31
|
+
to: RECEIVER_ADDRESS,
|
|
32
|
+
amount: '1',
|
|
33
|
+
memo: '1',
|
|
34
|
+
})
|
|
35
|
+
.feeToken(ALPHA_USD_TOKEN)
|
|
36
|
+
.nonce(0)
|
|
37
|
+
.gas(tempo_1.TX_PARAMS.defaultGas)
|
|
38
|
+
.maxFeePerGas(tempo_1.TX_PARAMS.defaultMaxFeePerGas)
|
|
39
|
+
.maxPriorityFeePerGas(tempo_1.TX_PARAMS.defaultMaxPriorityFeePerGas);
|
|
40
|
+
const tx = (await builder.build());
|
|
41
|
+
assert_1.default.ok(tx instanceof transaction_1.Tip20Transaction);
|
|
42
|
+
assert_1.default.strictEqual(tx.getOperationCount(), 1);
|
|
43
|
+
assert_1.default.strictEqual(tx.isBatch(), false);
|
|
44
|
+
assert_1.default.strictEqual(tx.getOperations()[0].memo, '1');
|
|
45
|
+
const serialized = await tx.serialize();
|
|
46
|
+
assert_1.default.ok(serialized.startsWith(constants_1.AA_TRANSACTION_TYPE));
|
|
47
|
+
});
|
|
48
|
+
});
|
|
49
|
+
(0, mocha_1.describe)('Batch Transfer', () => {
|
|
50
|
+
(0, mocha_1.it)('should build multi-token batch transfer', async () => {
|
|
51
|
+
const builder = new transactionBuilder_1.Tip20TransactionBuilder(mockCoinConfig);
|
|
52
|
+
builder
|
|
53
|
+
.addOperation({ token: ALPHA_USD_TOKEN, to: RECEIVER_ADDRESS, amount: '15', memo: '1' })
|
|
54
|
+
.addOperation({ token: BETA_USD_TOKEN, to: RECEIVER_ADDRESS, amount: '20', memo: '2' })
|
|
55
|
+
.addOperation({ token: THETA_USD_TOKEN, to: RECEIVER_ADDRESS, amount: '7', memo: '3' })
|
|
56
|
+
.feeToken(BETA_USD_TOKEN)
|
|
57
|
+
.nonce(10)
|
|
58
|
+
.gas(400000n)
|
|
59
|
+
.maxFeePerGas(tempo_1.TX_PARAMS.defaultMaxFeePerGas)
|
|
60
|
+
.maxPriorityFeePerGas(tempo_1.TX_PARAMS.defaultMaxPriorityFeePerGas);
|
|
61
|
+
const tx = (await builder.build());
|
|
62
|
+
assert_1.default.strictEqual(tx.getOperationCount(), 3);
|
|
63
|
+
assert_1.default.strictEqual(tx.isBatch(), true);
|
|
64
|
+
assert_1.default.strictEqual(tx.getFeeToken(), BETA_USD_TOKEN);
|
|
65
|
+
const operations = tx.getOperations();
|
|
66
|
+
assert_1.default.strictEqual(operations[0].token, ALPHA_USD_TOKEN);
|
|
67
|
+
assert_1.default.strictEqual(operations[1].token, BETA_USD_TOKEN);
|
|
68
|
+
assert_1.default.strictEqual(operations[2].token, THETA_USD_TOKEN);
|
|
69
|
+
});
|
|
70
|
+
});
|
|
71
|
+
(0, mocha_1.describe)('Transaction Signing', () => {
|
|
72
|
+
(0, mocha_1.it)('should produce unsigned transaction with correct RLP structure', async () => {
|
|
73
|
+
const builder = new transactionBuilder_1.Tip20TransactionBuilder(mockCoinConfig);
|
|
74
|
+
builder
|
|
75
|
+
.addOperation({ token: ALPHA_USD_TOKEN, to: RECEIVER_ADDRESS, amount: '1' })
|
|
76
|
+
.feeToken(ALPHA_USD_TOKEN)
|
|
77
|
+
.nonce(0)
|
|
78
|
+
.gas(tempo_1.TX_PARAMS.defaultGas)
|
|
79
|
+
.maxFeePerGas(tempo_1.TX_PARAMS.defaultMaxFeePerGas)
|
|
80
|
+
.maxPriorityFeePerGas(tempo_1.TX_PARAMS.defaultMaxPriorityFeePerGas);
|
|
81
|
+
const tx = (await builder.build());
|
|
82
|
+
const unsignedHex = await tx.serialize();
|
|
83
|
+
assert_1.default.ok(unsignedHex.startsWith(constants_1.AA_TRANSACTION_TYPE));
|
|
84
|
+
assert_1.default.strictEqual(tx.getSignature(), undefined);
|
|
85
|
+
// Verify RLP structure (13 fields for unsigned)
|
|
86
|
+
const rlpPart = '0x' + unsignedHex.slice(4);
|
|
87
|
+
const decoded = ethers_1.ethers.utils.RLP.decode(rlpPart);
|
|
88
|
+
assert_1.default.strictEqual(decoded.length, 13);
|
|
89
|
+
});
|
|
90
|
+
(0, mocha_1.it)('should apply signature and produce broadcast format', async () => {
|
|
91
|
+
const builder = new transactionBuilder_1.Tip20TransactionBuilder(mockCoinConfig);
|
|
92
|
+
builder
|
|
93
|
+
.addOperation({ token: ALPHA_USD_TOKEN, to: RECEIVER_ADDRESS, amount: '1' })
|
|
94
|
+
.feeToken(ALPHA_USD_TOKEN)
|
|
95
|
+
.nonce(0)
|
|
96
|
+
.gas(tempo_1.TX_PARAMS.defaultGas)
|
|
97
|
+
.maxFeePerGas(tempo_1.TX_PARAMS.defaultMaxFeePerGas)
|
|
98
|
+
.maxPriorityFeePerGas(tempo_1.TX_PARAMS.defaultMaxPriorityFeePerGas);
|
|
99
|
+
const tx = (await builder.build());
|
|
100
|
+
tx.setSignature(tempo_1.SIGNATURE_TEST_DATA.validSignature);
|
|
101
|
+
const signedHex = await tx.toBroadcastFormat();
|
|
102
|
+
// Verify it includes signature (14 fields)
|
|
103
|
+
assert_1.default.ok(signedHex.startsWith(constants_1.AA_TRANSACTION_TYPE));
|
|
104
|
+
const rlpPart = '0x' + signedHex.slice(4);
|
|
105
|
+
const decoded = ethers_1.ethers.utils.RLP.decode(rlpPart);
|
|
106
|
+
assert_1.default.strictEqual(decoded.length, 14);
|
|
107
|
+
const storedSig = tx.getSignature();
|
|
108
|
+
assert_1.default.ok(storedSig);
|
|
109
|
+
assert_1.default.strictEqual(storedSig?.r, tempo_1.SIGNATURE_TEST_DATA.validSignature.r);
|
|
110
|
+
});
|
|
111
|
+
});
|
|
112
|
+
(0, mocha_1.describe)('Fee Token Selection', () => {
|
|
113
|
+
(0, mocha_1.it)('should pay fees with different token than transfer', async () => {
|
|
114
|
+
const builder = new transactionBuilder_1.Tip20TransactionBuilder(mockCoinConfig);
|
|
115
|
+
builder
|
|
116
|
+
.addOperation({ token: ALPHA_USD_TOKEN, to: RECEIVER_ADDRESS, amount: '1' })
|
|
117
|
+
.feeToken(BETA_USD_TOKEN)
|
|
118
|
+
.nonce(0)
|
|
119
|
+
.gas(tempo_1.TX_PARAMS.defaultGas)
|
|
120
|
+
.maxFeePerGas(tempo_1.TX_PARAMS.defaultMaxFeePerGas)
|
|
121
|
+
.maxPriorityFeePerGas(tempo_1.TX_PARAMS.defaultMaxPriorityFeePerGas);
|
|
122
|
+
const tx = (await builder.build());
|
|
123
|
+
assert_1.default.strictEqual(tx.getOperations()[0].token, ALPHA_USD_TOKEN);
|
|
124
|
+
assert_1.default.strictEqual(tx.getFeeToken(), BETA_USD_TOKEN);
|
|
125
|
+
});
|
|
126
|
+
(0, mocha_1.it)('should build transaction without explicit fee token', async () => {
|
|
127
|
+
const builder = new transactionBuilder_1.Tip20TransactionBuilder(mockCoinConfig);
|
|
128
|
+
builder
|
|
129
|
+
.addOperation({ token: ALPHA_USD_TOKEN, to: RECEIVER_ADDRESS, amount: '1' })
|
|
130
|
+
.nonce(0)
|
|
131
|
+
.gas(tempo_1.TX_PARAMS.defaultGas)
|
|
132
|
+
.maxFeePerGas(tempo_1.TX_PARAMS.defaultMaxFeePerGas)
|
|
133
|
+
.maxPriorityFeePerGas(tempo_1.TX_PARAMS.defaultMaxPriorityFeePerGas);
|
|
134
|
+
const tx = (await builder.build());
|
|
135
|
+
assert_1.default.strictEqual(tx.getFeeToken(), undefined);
|
|
136
|
+
const serialized = await tx.serialize();
|
|
137
|
+
assert_1.default.ok(serialized.startsWith(constants_1.AA_TRANSACTION_TYPE));
|
|
138
|
+
});
|
|
139
|
+
});
|
|
140
|
+
(0, mocha_1.describe)('Transaction JSON', () => {
|
|
141
|
+
(0, mocha_1.it)('should produce complete JSON representation', async () => {
|
|
142
|
+
const builder = new transactionBuilder_1.Tip20TransactionBuilder(mockCoinConfig);
|
|
143
|
+
builder
|
|
144
|
+
.addOperation({ token: ALPHA_USD_TOKEN, to: RECEIVER_ADDRESS, amount: '123456', memo: '5' })
|
|
145
|
+
.feeToken(BETA_USD_TOKEN)
|
|
146
|
+
.nonce(42)
|
|
147
|
+
.gas(150000n)
|
|
148
|
+
.maxFeePerGas(3000000000n)
|
|
149
|
+
.maxPriorityFeePerGas(1500000000n);
|
|
150
|
+
const tx = (await builder.build());
|
|
151
|
+
const json = tx.toJson();
|
|
152
|
+
assert_1.default.strictEqual(json.type, constants_1.AA_TRANSACTION_TYPE);
|
|
153
|
+
assert_1.default.strictEqual(json.chainId, constants_1.TEMPO_CHAIN_IDS.TESTNET);
|
|
154
|
+
assert_1.default.strictEqual(json.nonce, 42);
|
|
155
|
+
assert_1.default.strictEqual(json.gas, '150000');
|
|
156
|
+
assert_1.default.strictEqual(json.feeToken, BETA_USD_TOKEN);
|
|
157
|
+
const ops = json.operations;
|
|
158
|
+
assert_1.default.strictEqual(ops[0].token, ALPHA_USD_TOKEN);
|
|
159
|
+
assert_1.default.strictEqual(ops[0].amount, '123456');
|
|
160
|
+
assert_1.default.strictEqual(ops[0].memo, '5');
|
|
161
|
+
});
|
|
162
|
+
});
|
|
163
|
+
(0, mocha_1.describe)('canBroadcast Check', () => {
|
|
164
|
+
(0, mocha_1.it)('should return true for valid transaction', async () => {
|
|
165
|
+
const builder = new transactionBuilder_1.Tip20TransactionBuilder(mockCoinConfig);
|
|
166
|
+
builder
|
|
167
|
+
.addOperation({ token: ALPHA_USD_TOKEN, to: RECEIVER_ADDRESS, amount: '1' })
|
|
168
|
+
.feeToken(ALPHA_USD_TOKEN)
|
|
169
|
+
.nonce(0)
|
|
170
|
+
.gas(tempo_1.TX_PARAMS.defaultGas)
|
|
171
|
+
.maxFeePerGas(tempo_1.TX_PARAMS.defaultMaxFeePerGas)
|
|
172
|
+
.maxPriorityFeePerGas(tempo_1.TX_PARAMS.defaultMaxPriorityFeePerGas);
|
|
173
|
+
const tx = (await builder.build());
|
|
174
|
+
assert_1.default.strictEqual(tx.canBroadcast(), true);
|
|
175
|
+
});
|
|
176
|
+
});
|
|
177
|
+
});
|
|
178
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGlwMjAuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90ZXN0L2ludGVncmF0aW9uL3RpcDIwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7OztHQUlHOzs7OztBQUVILG9EQUE0QjtBQUM1QixpQ0FBcUM7QUFDckMsbUNBQWdDO0FBQ2hDLGlEQUE0QztBQUM1Qyx5RUFBMkU7QUFDM0UsMkRBQTZEO0FBRTdELHVEQUErRTtBQUMvRSw4Q0FBNEc7QUFFNUcsTUFBTSxjQUFjLEdBQUcsZUFBSyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUUzQyxNQUFNLGVBQWUsR0FBRyxzQkFBYyxDQUFDLFFBQVEsQ0FBQyxPQUFrQixDQUFDO0FBQ25FLE1BQU0sY0FBYyxHQUFHLHNCQUFjLENBQUMsT0FBTyxDQUFDLE9BQWtCLENBQUM7QUFDakUsTUFBTSxlQUFlLEdBQUcsc0JBQWMsQ0FBQyxRQUFRLENBQUMsT0FBa0IsQ0FBQztBQUNuRSxNQUFNLGdCQUFnQixHQUFHLDhCQUFpQyxDQUFDO0FBRTNELElBQUEsZ0JBQVEsRUFBQywwQkFBMEIsRUFBRSxHQUFHLEVBQUU7SUFDeEMsSUFBQSxnQkFBUSxFQUFDLGlCQUFpQixFQUFFLEdBQUcsRUFBRTtRQUMvQixJQUFBLFVBQUUsRUFBQyxtREFBbUQsRUFBRSxLQUFLLElBQUksRUFBRTtZQUNqRSxNQUFNLE9BQU8sR0FBRyxJQUFJLDRDQUF1QixDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBRTVELE9BQU87aUJBQ0osWUFBWSxDQUFDO2dCQUNaLEtBQUssRUFBRSxlQUFlO2dCQUN0QixFQUFFLEVBQUUsZ0JBQWdCO2dCQUNwQixNQUFNLEVBQUUsR0FBRztnQkFDWCxJQUFJLEVBQUUsR0FBRzthQUNWLENBQUM7aUJBQ0QsUUFBUSxDQUFDLGVBQWUsQ0FBQztpQkFDekIsS0FBSyxDQUFDLENBQUMsQ0FBQztpQkFDUixHQUFHLENBQUMsaUJBQVMsQ0FBQyxVQUFVLENBQUM7aUJBQ3pC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SUFBSSxFQUFFO1lBQ3hELE1BQU0sT0FBTyxHQUFHLElBQUksNENBQXVCLENBQUMsY0FBYyxDQUFDLENBQUM7WUFFNUQsT0FBTztpQkFDSixZQUFZLENBQUMsRUFBRSxLQUFLLEVBQUUsZUFBZSxFQUFFLEVBQUUsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUM7aUJBQzNFLFFBQVEsQ0FBQyxlQUFlLENBQUM7aUJBQ3pCLEtBQUssQ0FBQyxDQUFDLENBQUM7aUJBQ1IsR0FBRyxDQUFDLGlCQUFTLENBQUMsVUFBVSxDQUFDO2lCQUN6QixZQUFZLENBQUMsaUJBQVMsQ0FBQyxtQkFBbUIsQ0FBQztpQkFDM0Msb0JBQW9CLENBQUMsaUJBQVMsQ0FBQywyQkFBMkIsQ0FBQyxDQUFDO1lBRS9ELE1BQU0sRUFBRSxHQUFHLENBQUMsTUFBTSxPQUFPLENBQUMsS0FBSyxFQUFFLENBQXFCLENBQUM7WUFDdkQsZ0JBQU0sQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLFlBQVksRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzlDLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVElQLTIwIEludGVncmF0aW9uIFRlc3RzXG4gKlxuICogRW5kLXRvLWVuZCBmbG93cyBmb3IgVElQLTIwIHRva2VuIHRyYW5zYWN0aW9ucyBvbiBUZW1wbyB1c2luZyB0ZXN0bmV0IHRva2VuIGFkZHJlc3Nlcy5cbiAqL1xuXG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgeyBkZXNjcmliZSwgaXQgfSBmcm9tICdtb2NoYSc7XG5pbXBvcnQgeyBldGhlcnMgfSBmcm9tICdldGhlcnMnO1xuaW1wb3J0IHsgY29pbnMgfSBmcm9tICdAYml0Z28tYmV0YS9zdGF0aWNzJztcbmltcG9ydCB7IFRpcDIwVHJhbnNhY3Rpb25CdWlsZGVyIH0gZnJvbSAnLi4vLi4vc3JjL2xpYi90cmFuc2FjdGlvbkJ1aWxkZXInO1xuaW1wb3J0IHsgVGlwMjBUcmFuc2FjdGlvbiB9IGZyb20gJy4uLy4uL3NyYy9saWIvdHJhbnNhY3Rpb24nO1xuaW1wb3J0IHsgQWRkcmVzcyB9IGZyb20gJy4uLy4uL3NyYy9saWIvdHlwZXMnO1xuaW1wb3J0IHsgQUFfVFJBTlNBQ1RJT05fVFlQRSwgVEVNUE9fQ0hBSU5fSURTIH0gZnJvbSAnLi4vLi4vc3JjL2xpYi9jb25zdGFudHMnO1xuaW1wb3J0IHsgVEVTVE5FVF9UT0tFTlMsIFRYX1BBUkFNUywgU0lHTkFUVVJFX1RFU1RfREFUQSwgVEVTVF9SRUNJUElFTlRfQUREUkVTUyB9IGZyb20gJy4uL3Jlc291cmNlcy90ZW1wbyc7XG5cbmNvbnN0IG1vY2tDb2luQ29uZmlnID0gY29pbnMuZ2V0KCd0dGVtcG8nKTtcblxuY29uc3QgQUxQSEFfVVNEX1RPS0VOID0gVEVTVE5FVF9UT0tFTlMuYWxwaGFVU0QuYWRkcmVzcyBhcyBBZGRyZXNzO1xuY29uc3QgQkVUQV9VU0RfVE9LRU4gPSBURVNUTkVUX1RPS0VOUy5iZXRhVVNELmFkZHJlc3MgYXMgQWRkcmVzcztcbmNvbnN0IFRIRVRBX1VTRF9UT0tFTiA9IFRFU1RORVRfVE9LRU5TLnRoZXRhVVNELmFkZHJlc3MgYXMgQWRkcmVzcztcbmNvbnN0IFJFQ0VJVkVSX0FERFJFU1MgPSBURVNUX1JFQ0lQSUVOVF9BRERSRVNTIGFzIEFkZHJlc3M7XG5cbmRlc2NyaWJlKCdUSVAtMjAgSW50ZWdyYXRpb24gVGVzdHMnLCAoKSA9PiB7XG4gIGRlc2NyaWJlKCdTaW5nbGUgVHJhbnNmZXInLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBidWlsZCBhbmQgc2VyaWFsaXplIHNpbmdsZSBUSVAtMjAgdHJhbnNmZXInLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gbmV3IFRpcDIwVHJhbnNhY3Rpb25CdWlsZGVyKG1vY2tDb2luQ29uZmlnKTtcblxuICAgICAgYnVpbGRlclxuICAgICAgICAuYWRkT3BlcmF0aW9uKHtcbiAgICAgICAgICB0b2tlbjogQUxQSEFfVVNEX1RPS0VOLFxuICAgICAgICAgIHRvOiBSRUNFSVZFUl9BRERSRVNTLFxuICAgICAgICAgIGFtb3VudDogJzEnLFxuICAgICAgICAgIG1lbW86ICcxJyxcbiAgICAgICAgfSlcbiAgICAgICAgLmZlZVRva2VuKEFMUEhBX1VTRF9UT0tFTilcbiAgICAgICAgLm5vbmNlKDApXG4gICAgICAgIC5nYXMoVFhfUEFSQU1TLmRlZmF1bHRHYXMpXG4gICAgICAgIC5tYXhGZWVQZXJHYXMoVFhfUEFSQU1TLmRlZmF1bHRNYXhGZWVQZXJHYXMpXG4gICAgICAgIC5tYXhQcmlvcml0eUZlZVBlckdhcyhUWF9QQVJBTVMuZGVmYXVsdE1heFByaW9yaXR5RmVlUGVyR2FzKTtcblxuICAgICAgY29uc3QgdHggPSAoYXdhaXQgYnVpbGRlci5idWlsZCgpKSBhcyBUaXAyMFRyYW5zYWN0aW9uO1xuXG4gICAgICBhc3NlcnQub2sodHggaW5zdGFuY2VvZiBUaXAyMFRyYW5zYWN0aW9uKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbCh0eC5nZXRPcGVyYXRpb25Db3VudCgpLCAxKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbCh0eC5pc0JhdGNoKCksIGZhbHNlKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbCh0eC5nZXRPcGVyYXRpb25zKClbMF0ubWVtbywgJzEnKTtcblxuICAgICAgY29uc3Qgc2VyaWFsaXplZCA9IGF3YWl0IHR4LnNlcmlhbGl6ZSgpO1xuICAgICAgYXNzZXJ0Lm9rKHNlcmlhbGl6ZWQuc3RhcnRzV2l0aChBQV9UUkFOU0FDVElPTl9UWVBFKSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdCYXRjaCBUcmFuc2ZlcicsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGJ1aWxkIG11bHRpLXRva2VuIGJhdGNoIHRyYW5zZmVyJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgYnVpbGRlciA9IG5ldyBUaXAyMFRyYW5zYWN0aW9uQnVpbGRlcihtb2NrQ29pbkNvbmZpZyk7XG5cbiAgICAgIGJ1aWxkZXJcbiAgICAgICAgLmFkZE9wZXJhdGlvbih7IHRva2VuOiBBTFBIQV9VU0RfVE9LRU4sIHRvOiBSRUNFSVZFUl9BRERSRVNTLCBhbW91bnQ6ICcxNScsIG1lbW86ICcxJyB9KVxuICAgICAgICAuYWRkT3BlcmF0aW9uKHsgdG9rZW46IEJFVEFfVVNEX1RPS0VOLCB0bzogUkVDRUlWRVJfQUREUkVTUywgYW1vdW50OiAnMjAnLCBtZW1vOiAnMicgfSlcbiAgICAgICAgLmFkZE9wZXJhdGlvbih7IHRva2VuOiBUSEVUQV9VU0RfVE9LRU4sIHRvOiBSRUNFSVZFUl9BRERSRVNTLCBhbW91bnQ6ICc3JywgbWVtbzogJzMnIH0pXG4gICAgICAgIC5mZWVUb2tlbihCRVRBX1VTRF9UT0tFTilcbiAgICAgICAgLm5vbmNlKDEwKVxuICAgICAgICAuZ2FzKDQwMDAwMG4pXG4gICAgICAgIC5tYXhGZWVQZXJHYXMoVFhfUEFSQU1TLmRlZmF1bHRNYXhGZWVQZXJHYXMpXG4gICAgICAgIC5tYXhQcmlvcml0eUZlZVBlckdhcyhUWF9QQVJBTVMuZGVmYXVsdE1heFByaW9yaXR5RmVlUGVyR2FzKTtcblxuICAgICAgY29uc3QgdHggPSAoYXdhaXQgYnVpbGRlci5idWlsZCgpKSBhcyBUaXAyMFRyYW5zYWN0aW9uO1xuXG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwodHguZ2V0T3BlcmF0aW9uQ291bnQoKSwgMyk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwodHguaXNCYXRjaCgpLCB0cnVlKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbCh0eC5nZXRGZWVUb2tlbigpLCBCRVRBX1VTRF9UT0tFTik7XG5cbiAgICAgIGNvbnN0IG9wZXJhdGlvbnMgPSB0eC5nZXRPcGVyYXRpb25zKCk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwob3BlcmF0aW9uc1swXS50b2tlbiwgQUxQSEFfVVNEX1RPS0VOKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChvcGVyYXRpb25zWzFdLnRva2VuLCBCRVRBX1VTRF9UT0tFTik7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwob3BlcmF0aW9uc1syXS50b2tlbiwgVEhFVEFfVVNEX1RPS0VOKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ1RyYW5zYWN0aW9uIFNpZ25pbmcnLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBwcm9kdWNlIHVuc2lnbmVkIHRyYW5zYWN0aW9uIHdpdGggY29ycmVjdCBSTFAgc3RydWN0dXJlJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgYnVpbGRlciA9IG5ldyBUaXAyMFRyYW5zYWN0aW9uQnVpbGRlcihtb2NrQ29pbkNvbmZpZyk7XG5cbiAgICAgIGJ1aWxkZXJcbiAgICAgICAgLmFkZE9wZXJhdGlvbih7IHRva2VuOiBBTFBIQV9VU0RfVE9LRU4sIHRvOiBSRUNFSVZFUl9BRERSRVNTLCBhbW91bnQ6ICcxJyB9KVxuICAgICAgICAuZmVlVG9rZW4oQUxQSEFfVVNEX1RPS0VOKVxuICAgICAgICAubm9uY2UoMClcbiAgICAgICAgLmdhcyhUWF9QQVJBTVMuZGVmYXVsdEdhcylcbiAgICAgICAgLm1heEZlZVBlckdhcyhUWF9QQVJBTVMuZGVmYXVsdE1heEZlZVBlckdhcylcbiAgICAgICAgLm1heFByaW9yaXR5RmVlUGVyR2FzKFRYX1BBUkFNUy5kZWZhdWx0TWF4UHJpb3JpdHlGZWVQZXJHYXMpO1xuXG4gICAgICBjb25zdCB0eCA9IChhd2FpdCBidWlsZGVyLmJ1aWxkKCkpIGFzIFRpcDIwVHJhbnNhY3Rpb247XG4gICAgICBjb25zdCB1bnNpZ25lZEhleCA9IGF3YWl0IHR4LnNlcmlhbGl6ZSgpO1xuXG4gICAgICBhc3NlcnQub2sodW5zaWduZWRIZXguc3RhcnRzV2l0aChBQV9UUkFOU0FDVElPTl9UWVBFKSk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwodHguZ2V0U2lnbmF0dXJlKCksIHVuZGVmaW5lZCk7XG5cbiAgICAgIC8vIFZlcmlmeSBSTFAgc3RydWN0dXJlICgxMyBmaWVsZHMgZm9yIHVuc2lnbmVkKVxuICAgICAgY29uc3QgcmxwUGFydCA9ICcweCcgKyB1bnNpZ25lZEhleC5zbGljZSg0KTtcbiAgICAgIGNvbnN0IGRlY29kZWQgPSBldGhlcnMudXRpbHMuUkxQLmRlY29kZShybHBQYXJ0KTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChkZWNvZGVkLmxlbmd0aCwgMTMpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBhcHBseSBzaWduYXR1cmUgYW5kIHByb2R1Y2UgYnJvYWRjYXN0IGZvcm1hdCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBuZXcgVGlwMjBUcmFuc2FjdGlvbkJ1aWxkZXIobW9ja0NvaW5Db25maWcpO1xuXG4gICAgICBidWlsZGVyXG4gICAgICAgIC5hZGRPcGVyYXRpb24oeyB0b2tlbjogQUxQSEFfVVNEX1RPS0VOLCB0bzogUkVDRUlWRVJfQUREUkVTUywgYW1vdW50OiAnMScgfSlcbiAgICAgICAgLmZlZVRva2VuKEFMUEhBX1VTRF9UT0tFTilcbiAgICAgICAgLm5vbmNlKDApXG4gICAgICAgIC5nYXMoVFhfUEFSQU1TLmRlZmF1bHRHYXMpXG4gICAgICAgIC5tYXhGZWVQZXJHYXMoVFhfUEFSQU1TLmRlZmF1bHRNYXhGZWVQZXJHYXMpXG4gICAgICAgIC5tYXhQcmlvcml0eUZlZVBlckdhcyhUWF9QQVJBTVMuZGVmYXVsdE1heFByaW9yaXR5RmVlUGVyR2FzKTtcblxuICAgICAgY29uc3QgdHggPSAoYXdhaXQgYnVpbGRlci5idWlsZCgpKSBhcyBUaXAyMFRyYW5zYWN0aW9uO1xuICAgICAgdHguc2V0U2lnbmF0dXJlKFNJR05BVFVSRV9URVNUX0RBVEEudmFsaWRTaWduYXR1cmUpO1xuXG4gICAgICBjb25zdCBzaWduZWRIZXggPSBhd2FpdCB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuXG4gICAgICAvLyBWZXJpZnkgaXQgaW5jbHVkZXMgc2lnbmF0dXJlICgxNCBmaWVsZHMpXG4gICAgICBhc3NlcnQub2soc2lnbmVkSGV4LnN0YXJ0c1dpdGgoQUFfVFJBTlNBQ1RJT05fVFlQRSkpO1xuICAgICAgY29uc3QgcmxwUGFydCA9ICcweCcgKyBzaWduZWRIZXguc2xpY2UoNCk7XG4gICAgICBjb25zdCBkZWNvZGVkID0gZXRoZXJzLnV0aWxzLlJMUC5kZWNvZGUocmxwUGFydCk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoZGVjb2RlZC5sZW5ndGgsIDE0KTtcblxuICAgICAgY29uc3Qgc3RvcmVkU2lnID0gdHguZ2V0U2lnbmF0dXJlKCk7XG4gICAgICBhc3NlcnQub2soc3RvcmVkU2lnKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChzdG9yZWRTaWc/LnIsIFNJR05BVFVSRV9URVNUX0RBVEEudmFsaWRTaWduYXR1cmUucik7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdGZWUgVG9rZW4gU2VsZWN0aW9uJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgcGF5IGZlZXMgd2l0aCBkaWZmZXJlbnQgdG9rZW4gdGhhbiB0cmFuc2ZlcicsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBuZXcgVGlwMjBUcmFuc2FjdGlvbkJ1aWxkZXIobW9ja0NvaW5Db25maWcpO1xuXG4gICAgICBidWlsZGVyXG4gICAgICAgIC5hZGRPcGVyYXRpb24oeyB0b2tlbjogQUxQSEFfVVNEX1RPS0VOLCB0bzogUkVDRUlWRVJfQUREUkVTUywgYW1vdW50OiAnMScgfSlcbiAgICAgICAgLmZlZVRva2VuKEJFVEFfVVNEX1RPS0VOKVxuICAgICAgICAubm9uY2UoMClcbiAgICAgICAgLmdhcyhUWF9QQVJBTVMuZGVmYXVsdEdhcylcbiAgICAgICAgLm1heEZlZVBlckdhcyhUWF9QQVJBTVMuZGVmYXVsdE1heEZlZVBlckdhcylcbiAgICAgICAgLm1heFByaW9yaXR5RmVlUGVyR2FzKFRYX1BBUkFNUy5kZWZhdWx0TWF4UHJpb3JpdHlGZWVQZXJHYXMpO1xuXG4gICAgICBjb25zdCB0eCA9IChhd2FpdCBidWlsZGVyLmJ1aWxkKCkpIGFzIFRpcDIwVHJhbnNhY3Rpb247XG5cbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbCh0eC5nZXRPcGVyYXRpb25zKClbMF0udG9rZW4sIEFMUEhBX1VTRF9UT0tFTik7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwodHguZ2V0RmVlVG9rZW4oKSwgQkVUQV9VU0RfVE9LRU4pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBidWlsZCB0cmFuc2FjdGlvbiB3aXRob3V0IGV4cGxpY2l0IGZlZSB0b2tlbicsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBuZXcgVGlwMjBUcmFuc2FjdGlvbkJ1aWxkZXIobW9ja0NvaW5Db25maWcpO1xuXG4gICAgICBidWlsZGVyXG4gICAgICAgIC5hZGRPcGVyYXRpb24oeyB0b2tlbjogQUxQSEFfVVNEX1RPS0VOLCB0bzogUkVDRUlWRVJfQUREUkVTUywgYW1vdW50OiAnMScgfSlcbiAgICAgICAgLm5vbmNlKDApXG4gICAgICAgIC5nYXMoVFhfUEFSQU1TLmRlZmF1bHRHYXMpXG4gICAgICAgIC5tYXhGZWVQZXJHYXMoVFhfUEFSQU1TLmRlZmF1bHRNYXhGZWVQZXJHYXMpXG4gICAgICAgIC5tYXhQcmlvcml0eUZlZVBlckdhcyhUWF9QQVJBTVMuZGVmYXVsdE1heFByaW9yaXR5RmVlUGVyR2FzKTtcblxuICAgICAgY29uc3QgdHggPSAoYXdhaXQgYnVpbGRlci5idWlsZCgpKSBhcyBUaXAyMFRyYW5zYWN0aW9uO1xuXG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwodHguZ2V0RmVlVG9rZW4oKSwgdW5kZWZpbmVkKTtcbiAgICAgIGNvbnN0IHNlcmlhbGl6ZWQgPSBhd2FpdCB0eC5zZXJpYWxpemUoKTtcbiAgICAgIGFzc2VydC5vayhzZXJpYWxpemVkLnN0YXJ0c1dpdGgoQUFfVFJBTlNBQ1RJT05fVFlQRSkpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnVHJhbnNhY3Rpb24gSlNPTicsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHByb2R1Y2UgY29tcGxldGUgSlNPTiByZXByZXNlbnRhdGlvbicsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBuZXcgVGlwMjBUcmFuc2FjdGlvbkJ1aWxkZXIobW9ja0NvaW5Db25maWcpO1xuXG4gICAgICBidWlsZGVyXG4gICAgICAgIC5hZGRPcGVyYXRpb24oeyB0b2tlbjogQUxQSEFfVVNEX1RPS0VOLCB0bzogUkVDRUlWRVJfQUREUkVTUywgYW1vdW50OiAnMTIzNDU2JywgbWVtbzogJzUnIH0pXG4gICAgICAgIC5mZWVUb2tlbihCRVRBX1VTRF9UT0tFTilcbiAgICAgICAgLm5vbmNlKDQyKVxuICAgICAgICAuZ2FzKDE1MDAwMG4pXG4gICAgICAgIC5tYXhGZWVQZXJHYXMoMzAwMDAwMDAwMG4pXG4gICAgICAgIC5tYXhQcmlvcml0eUZlZVBlckdhcygxNTAwMDAwMDAwbik7XG5cbiAgICAgIGNvbnN0IHR4ID0gKGF3YWl0IGJ1aWxkZXIuYnVpbGQoKSkgYXMgVGlwMjBUcmFuc2FjdGlvbjtcbiAgICAgIGNvbnN0IGpzb24gPSB0eC50b0pzb24oKTtcblxuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGpzb24udHlwZSwgQUFfVFJBTlNBQ1RJT05fVFlQRSk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoanNvbi5jaGFpbklkLCBURU1QT19DSEFJTl9JRFMuVEVTVE5FVCk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoanNvbi5ub25jZSwgNDIpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGpzb24uZ2FzLCAnMTUwMDAwJyk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoanNvbi5mZWVUb2tlbiwgQkVUQV9VU0RfVE9LRU4pO1xuXG4gICAgICBjb25zdCBvcHMgPSBqc29uLm9wZXJhdGlvbnMgYXMgYW55W107XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwob3BzWzBdLnRva2VuLCBBTFBIQV9VU0RfVE9LRU4pO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKG9wc1swXS5hbW91bnQsICcxMjM0NTYnKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChvcHNbMF0ubWVtbywgJzUnKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2NhbkJyb2FkY2FzdCBDaGVjaycsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHJldHVybiB0cnVlIGZvciB2YWxpZCB0cmFuc2FjdGlvbicsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBuZXcgVGlwMjBUcmFuc2FjdGlvbkJ1aWxkZXIobW9ja0NvaW5Db25maWcpO1xuXG4gICAgICBidWlsZGVyXG4gICAgICAgIC5hZGRPcGVyYXRpb24oeyB0b2tlbjogQUxQSEFfVVNEX1RPS0VOLCB0bzogUkVDRUlWRVJfQUREUkVTUywgYW1vdW50OiAnMScgfSlcbiAgICAgICAgLmZlZVRva2VuKEFMUEhBX1VTRF9UT0tFTilcbiAgICAgICAgLm5vbmNlKDApXG4gICAgICAgIC5nYXMoVFhfUEFSQU1TLmRlZmF1bHRHYXMpXG4gICAgICAgIC5tYXhGZWVQZXJHYXMoVFhfUEFSQU1TLmRlZmF1bHRNYXhGZWVQZXJHYXMpXG4gICAgICAgIC5tYXhQcmlvcml0eUZlZVBlckdhcyhUWF9QQVJBTVMuZGVmYXVsdE1heFByaW9yaXR5RmVlUGVyR2FzKTtcblxuICAgICAgY29uc3QgdHggPSAoYXdhaXQgYnVpbGRlci5idWlsZCgpKSBhcyBUaXAyMFRyYW5zYWN0aW9uO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHR4LmNhbkJyb2FkY2FzdCgpLCB0cnVlKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Test resources for Tempo SDK
|
|
3
|
+
*/
|
|
4
|
+
export declare const TESTNET_TOKENS: {
|
|
5
|
+
pathUSD: {
|
|
6
|
+
address: string;
|
|
7
|
+
name: string;
|
|
8
|
+
};
|
|
9
|
+
alphaUSD: {
|
|
10
|
+
address: string;
|
|
11
|
+
name: string;
|
|
12
|
+
};
|
|
13
|
+
betaUSD: {
|
|
14
|
+
address: string;
|
|
15
|
+
name: string;
|
|
16
|
+
};
|
|
17
|
+
thetaUSD: {
|
|
18
|
+
address: string;
|
|
19
|
+
name: string;
|
|
20
|
+
};
|
|
21
|
+
usd1: {
|
|
22
|
+
address: string;
|
|
23
|
+
name: string;
|
|
24
|
+
};
|
|
25
|
+
stgUSD1: {
|
|
26
|
+
address: string;
|
|
27
|
+
name: string;
|
|
28
|
+
};
|
|
29
|
+
};
|
|
30
|
+
export declare const TEST_RECIPIENT_ADDRESS = "0x742d35Cc6634C0532925a3b844Bc454e4438f44e";
|
|
31
|
+
export declare const TX_PARAMS: {
|
|
32
|
+
defaultGas: bigint;
|
|
33
|
+
defaultMaxFeePerGas: bigint;
|
|
34
|
+
defaultMaxPriorityFeePerGas: bigint;
|
|
35
|
+
};
|
|
36
|
+
export declare const SIGNATURE_TEST_DATA: {
|
|
37
|
+
validSignature: {
|
|
38
|
+
r: `0x${string}`;
|
|
39
|
+
s: `0x${string}`;
|
|
40
|
+
yParity: number;
|
|
41
|
+
};
|
|
42
|
+
};
|
|
43
|
+
export declare const MEMO_TEST_CASES: {
|
|
44
|
+
valid: {
|
|
45
|
+
input: string;
|
|
46
|
+
description: string;
|
|
47
|
+
}[];
|
|
48
|
+
invalid: {
|
|
49
|
+
input: string;
|
|
50
|
+
description: string;
|
|
51
|
+
}[];
|
|
52
|
+
};
|
|
53
|
+
export declare const ERROR_MESSAGES: {
|
|
54
|
+
noOperations: RegExp;
|
|
55
|
+
missingNonce: RegExp;
|
|
56
|
+
missingGas: RegExp;
|
|
57
|
+
missingMaxFeePerGas: RegExp;
|
|
58
|
+
missingMaxPriorityFeePerGas: RegExp;
|
|
59
|
+
invalidMemo: RegExp;
|
|
60
|
+
};
|
|
61
|
+
//# sourceMappingURL=tempo.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tempo.d.ts","sourceRoot":"","sources":["../../../test/resources/tempo.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;CAyB1B,CAAC;AAGF,eAAO,MAAM,sBAAsB,+CAA+C,CAAC;AAMnF,eAAO,MAAM,SAAS;;;;CAIrB,CAAC;AAMF,eAAO,MAAM,mBAAmB;;WAE+C,KAAK,MAAM,EAAE;WACb,KAAK,MAAM,EAAE;;;CAG3F,CAAC;AAMF,eAAO,MAAM,eAAe;;;;;;;;;CAQ3B,CAAC;AAMF,eAAO,MAAM,cAAc;;;;;;;CAO1B,CAAC"}
|