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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. package/dist/src/index.d.ts +1 -0
  2. package/dist/src/index.d.ts.map +1 -1
  3. package/dist/src/index.js +2 -1
  4. package/dist/src/lib/constants.d.ts +21 -1
  5. package/dist/src/lib/constants.d.ts.map +1 -1
  6. package/dist/src/lib/constants.js +25 -5
  7. package/dist/src/lib/index.d.ts +4 -0
  8. package/dist/src/lib/index.d.ts.map +1 -1
  9. package/dist/src/lib/index.js +5 -1
  10. package/dist/src/lib/keyPair.d.ts +5 -25
  11. package/dist/src/lib/keyPair.d.ts.map +1 -1
  12. package/dist/src/lib/keyPair.js +9 -97
  13. package/dist/src/lib/tip20Abi.d.ts +98 -0
  14. package/dist/src/lib/tip20Abi.d.ts.map +1 -0
  15. package/dist/src/lib/tip20Abi.js +62 -0
  16. package/dist/src/lib/transaction.d.ts +144 -0
  17. package/dist/src/lib/transaction.d.ts.map +1 -0
  18. package/dist/src/lib/transaction.js +216 -0
  19. package/dist/src/lib/transactionBuilder.d.ts +139 -0
  20. package/dist/src/lib/transactionBuilder.d.ts.map +1 -0
  21. package/dist/src/lib/transactionBuilder.js +408 -0
  22. package/dist/src/lib/types.d.ts +27 -0
  23. package/dist/src/lib/types.d.ts.map +1 -0
  24. package/dist/src/lib/types.js +3 -0
  25. package/dist/src/lib/utils.d.ts +70 -7
  26. package/dist/src/lib/utils.d.ts.map +1 -1
  27. package/dist/src/lib/utils.js +148 -16
  28. package/dist/src/register.d.ts.map +1 -1
  29. package/dist/src/register.js +5 -1
  30. package/dist/src/tempo.d.ts +95 -41
  31. package/dist/src/tempo.d.ts.map +1 -1
  32. package/dist/src/tempo.js +447 -76
  33. package/dist/src/tip20Token.d.ts +83 -0
  34. package/dist/src/tip20Token.d.ts.map +1 -0
  35. package/dist/src/tip20Token.js +202 -0
  36. package/dist/test/integration/tip20.d.ts +7 -0
  37. package/dist/test/integration/tip20.d.ts.map +1 -0
  38. package/dist/test/integration/tip20.js +178 -0
  39. package/dist/test/resources/tempo.d.ts +61 -0
  40. package/dist/test/resources/tempo.d.ts.map +1 -0
  41. package/dist/test/resources/tempo.js +79 -0
  42. package/dist/test/unit/index.js +172 -3
  43. package/dist/test/unit/tempo.d.ts +2 -0
  44. package/dist/test/unit/tempo.d.ts.map +1 -0
  45. package/dist/test/unit/tempo.js +207 -0
  46. package/dist/test/unit/transactionBuilder.d.ts +2 -0
  47. package/dist/test/unit/transactionBuilder.d.ts.map +1 -0
  48. package/dist/test/unit/transactionBuilder.js +858 -0
  49. package/dist/test/unit/utils.js +6 -5
  50. package/dist/tsconfig.tsbuildinfo +1 -1
  51. package/package.json +12 -7
@@ -0,0 +1,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,7 @@
1
+ /**
2
+ * TIP-20 Integration Tests
3
+ *
4
+ * End-to-end flows for TIP-20 token transactions on Tempo using testnet token addresses.
5
+ */
6
+ export {};
7
+ //# sourceMappingURL=tip20.d.ts.map
@@ -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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGlwMjAuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90ZXN0L2ludGVncmF0aW9uL3RpcDIwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7OztHQUlHOzs7OztBQUVILG9EQUE0QjtBQUM1QixpQ0FBcUM7QUFDckMsbUNBQWdDO0FBQ2hDLGlEQUE0QztBQUM1Qyx5RUFBMkU7QUFDM0UsMkRBQTZEO0FBRTdELHVEQUErRTtBQUMvRSw4Q0FBNEc7QUFFNUcsTUFBTSxjQUFjLEdBQUcsZUFBSyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUUzQyxNQUFNLGVBQWUsR0FBRyxzQkFBYyxDQUFDLFFBQVEsQ0FBQyxPQUFrQixDQUFDO0FBQ25FLE1BQU0sY0FBYyxHQUFHLHNCQUFjLENBQUMsT0FBTyxDQUFDLE9BQWtCLENBQUM7QUFDakUsTUFBTSxlQUFlLEdBQUcsc0JBQWMsQ0FBQyxRQUFRLENBQUMsT0FBa0IsQ0FBQztBQUNuRSxNQUFNLGdCQUFnQixHQUFHLDhCQUFpQyxDQUFDO0FBRTNELElBQUEsZ0JBQVEsRUFBQywwQkFBMEIsRUFBRSxHQUFHLEVBQUU7SUFDeEMsSUFBQSxnQkFBUSxFQUFDLGlCQUFpQixFQUFFLEdBQUcsRUFBRTtRQUMvQixJQUFBLFVBQUUsRUFBQyxtREFBbUQsRUFBRSxLQUFLLElBQUksRUFBRTtZQUNqRSxNQUFNLE9BQU8sR0FBRyxJQUFJLDRDQUF1QixDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBRTVELE9BQU87aUJBQ0osWUFBWSxDQUFDO2dCQUNaLEtBQUssRUFBRSxlQUFlO2dCQUN0QixFQUFFLEVBQUUsZ0JBQWdCO2dCQUNwQixNQUFNLEVBQUUsR0FBRztnQkFDWCxJQUFJLEVBQUUsR0FBRzthQUNWLENBQUM7aUJBQ0QsUUFBUSxDQUFDLGVBQWUsQ0FBQztpQkFDekIsS0FBSyxDQUFDLENBQUMsQ0FBQztpQkFDUixHQUFHLENBQUMsaUJBQVMsQ0FBQyxVQUFVLENBQUM7aUJBQ3pCLFlBQVksQ0FBQyxpQkFBUyxDQUFDLG1CQUFtQixDQUFDO2lCQUMzQyxvQkFBb0IsQ0FBQyxpQkFBUyxDQUFDLDJCQUEyQixDQUFDLENBQUM7WUFFL0QsTUFBTSxFQUFFLEdBQUcsQ0FBQyxNQUFNLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBcUIsQ0FBQztZQUV2RCxnQkFBTSxDQUFDLEVBQUUsQ0FBQyxFQUFFLFlBQVksOEJBQWdCLENBQUMsQ0FBQztZQUMxQyxnQkFBTSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsaUJBQWlCLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUM5QyxnQkFBTSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDeEMsZ0JBQU0sQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQztZQUVwRCxNQUFNLFVBQVUsR0FBRyxNQUFNLEVBQUUsQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUN4QyxnQkFBTSxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLCtCQUFtQixDQUFDLENBQUMsQ0FBQztRQUN4RCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsSUFBQSxnQkFBUSxFQUFDLGdCQUFnQixFQUFFLEdBQUcsRUFBRTtRQUM5QixJQUFBLFVBQUUsRUFBQyx5Q0FBeUMsRUFBRSxLQUFLLElBQUksRUFBRTtZQUN2RCxNQUFNLE9BQU8sR0FBRyxJQUFJLDRDQUF1QixDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBRTVELE9BQU87aUJBQ0osWUFBWSxDQUFDLEVBQUUsS0FBSyxFQUFFLGVBQWUsRUFBRSxFQUFFLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLENBQUM7aUJBQ3ZGLFlBQVksQ0FBQyxFQUFFLEtBQUssRUFBRSxjQUFjLEVBQUUsRUFBRSxFQUFFLGdCQUFnQixFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxDQUFDO2lCQUN0RixZQUFZLENBQUMsRUFBRSxLQUFLLEVBQUUsZUFBZSxFQUFFLEVBQUUsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsQ0FBQztpQkFDdEYsUUFBUSxDQUFDLGNBQWMsQ0FBQztpQkFDeEIsS0FBSyxDQUFDLEVBQUUsQ0FBQztpQkFDVCxHQUFHLENBQUMsT0FBTyxDQUFDO2lCQUNaLFlBQVksQ0FBQyxpQkFBUyxDQUFDLG1CQUFtQixDQUFDO2lCQUMzQyxvQkFBb0IsQ0FBQyxpQkFBUyxDQUFDLDJCQUEyQixDQUFDLENBQUM7WUFFL0QsTUFBTSxFQUFFLEdBQUcsQ0FBQyxNQUFNLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBcUIsQ0FBQztZQUV2RCxnQkFBTSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsaUJBQWlCLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUM5QyxnQkFBTSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDdkMsZ0JBQU0sQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLFdBQVcsRUFBRSxFQUFFLGNBQWMsQ0FBQyxDQUFDO1lBRXJELE1BQU0sVUFBVSxHQUFHLEVBQUUsQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUN0QyxnQkFBTSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLGVBQWUsQ0FBQyxDQUFDO1lBQ3pELGdCQUFNLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsY0FBYyxDQUFDLENBQUM7WUFDeEQsZ0JBQU0sQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxlQUFlLENBQUMsQ0FBQztRQUMzRCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsSUFBQSxnQkFBUSxFQUFDLHFCQUFxQixFQUFFLEdBQUcsRUFBRTtRQUNuQyxJQUFBLFVBQUUsRUFBQyxnRUFBZ0UsRUFBRSxLQUFLLElBQUksRUFBRTtZQUM5RSxNQUFNLE9BQU8sR0FBRyxJQUFJLDRDQUF1QixDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBRTVELE9BQU87aUJBQ0osWUFBWSxDQUFDLEVBQUUsS0FBSyxFQUFFLGVBQWUsRUFBRSxFQUFFLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDO2lCQUMzRSxRQUFRLENBQUMsZUFBZSxDQUFDO2lCQUN6QixLQUFLLENBQUMsQ0FBQyxDQUFDO2lCQUNSLEdBQUcsQ0FBQyxpQkFBUyxDQUFDLFVBQVUsQ0FBQztpQkFDekIsWUFBWSxDQUFDLGlCQUFTLENBQUMsbUJBQW1CLENBQUM7aUJBQzNDLG9CQUFvQixDQUFDLGlCQUFTLENBQUMsMkJBQTJCLENBQUMsQ0FBQztZQUUvRCxNQUFNLEVBQUUsR0FBRyxDQUFDLE1BQU0sT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFxQixDQUFDO1lBQ3ZELE1BQU0sV0FBVyxHQUFHLE1BQU0sRUFBRSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBRXpDLGdCQUFNLENBQUMsRUFBRSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsK0JBQW1CLENBQUMsQ0FBQyxDQUFDO1lBQ3ZELGdCQUFNLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxZQUFZLEVBQUUsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUVqRCxnREFBZ0Q7WUFDaEQsTUFBTSxPQUFPLEdBQUcsSUFBSSxHQUFHLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDNUMsTUFBTSxPQUFPLEdBQUcsZUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ2pELGdCQUFNLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDekMsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFBLFVBQUUsRUFBQyxxREFBcUQsRUFBRSxLQUFLLElBQUksRUFBRTtZQUNuRSxNQUFNLE9BQU8sR0FBRyxJQUFJLDRDQUF1QixDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBRTVELE9BQU87aUJBQ0osWUFBWSxDQUFDLEVBQUUsS0FBSyxFQUFFLGVBQWUsRUFBRSxFQUFFLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDO2lCQUMzRSxRQUFRLENBQUMsZUFBZSxDQUFDO2lCQUN6QixLQUFLLENBQUMsQ0FBQyxDQUFDO2lCQUNSLEdBQUcsQ0FBQyxpQkFBUyxDQUFDLFVBQVUsQ0FBQztpQkFDekIsWUFBWSxDQUFDLGlCQUFTLENBQUMsbUJBQW1CLENBQUM7aUJBQzNDLG9CQUFvQixDQUFDLGlCQUFTLENBQUMsMkJBQTJCLENBQUMsQ0FBQztZQUUvRCxNQUFNLEVBQUUsR0FBRyxDQUFDLE1BQU0sT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFxQixDQUFDO1lBQ3ZELEVBQUUsQ0FBQyxZQUFZLENBQUMsMkJBQW1CLENBQUMsY0FBYyxDQUFDLENBQUM7WUFFcEQsTUFBTSxTQUFTLEdBQUcsTUFBTSxFQUFFLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztZQUUvQywyQ0FBMkM7WUFDM0MsZ0JBQU0sQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQywrQkFBbUIsQ0FBQyxDQUFDLENBQUM7WUFDckQsTUFBTSxPQUFPLEdBQUcsSUFBSSxHQUFHLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDMUMsTUFBTSxPQUFPLEdBQUcsZUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ2pELGdCQUFNLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFFdkMsTUFBTSxTQUFTLEdBQUcsRUFBRSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3BDLGdCQUFNLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ3JCLGdCQUFNLENBQUMsV0FBVyxDQUFDLFNBQVMsRUFBRSxDQUFDLEVBQUUsMkJBQW1CLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3pFLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxJQUFBLGdCQUFRLEVBQUMscUJBQXFCLEVBQUUsR0FBRyxFQUFFO1FBQ25DLElBQUEsVUFBRSxFQUFDLG9EQUFvRCxFQUFFLEtBQUssSUFBSSxFQUFFO1lBQ2xFLE1BQU0sT0FBTyxHQUFHLElBQUksNENBQXVCLENBQUMsY0FBYyxDQUFDLENBQUM7WUFFNUQsT0FBTztpQkFDSixZQUFZLENBQUMsRUFBRSxLQUFLLEVBQUUsZUFBZSxFQUFFLEVBQUUsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUM7aUJBQzNFLFFBQVEsQ0FBQyxjQUFjLENBQUM7aUJBQ3hCLEtBQUssQ0FBQyxDQUFDLENBQUM7aUJBQ1IsR0FBRyxDQUFDLGlCQUFTLENBQUMsVUFBVSxDQUFDO2lCQUN6QixZQUFZLENBQUMsaUJBQVMsQ0FBQyxtQkFBbUIsQ0FBQztpQkFDM0Msb0JBQW9CLENBQUMsaUJBQVMsQ0FBQywyQkFBMkIsQ0FBQyxDQUFDO1lBRS9ELE1BQU0sRUFBRSxHQUFHLENBQUMsTUFBTSxPQUFPLENBQUMsS0FBSyxFQUFFLENBQXFCLENBQUM7WUFFdkQsZ0JBQU0sQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxlQUFlLENBQUMsQ0FBQztZQUNqRSxnQkFBTSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsV0FBVyxFQUFFLEVBQUUsY0FBYyxDQUFDLENBQUM7UUFDdkQsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFBLFVBQUUsRUFBQyxxREFBcUQsRUFBRSxLQUFLLElBQUksRUFBRTtZQUNuRSxNQUFNLE9BQU8sR0FBRyxJQUFJLDRDQUF1QixDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBRTVELE9BQU87aUJBQ0osWUFBWSxDQUFDLEVBQUUsS0FBSyxFQUFFLGVBQWUsRUFBRSxFQUFFLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDO2lCQUMzRSxLQUFLLENBQUMsQ0FBQyxDQUFDO2lCQUNSLEdBQUcsQ0FBQyxpQkFBUyxDQUFDLFVBQVUsQ0FBQztpQkFDekIsWUFBWSxDQUFDLGlCQUFTLENBQUMsbUJBQW1CLENBQUM7aUJBQzNDLG9CQUFvQixDQUFDLGlCQUFTLENBQUMsMkJBQTJCLENBQUMsQ0FBQztZQUUvRCxNQUFNLEVBQUUsR0FBRyxDQUFDLE1BQU0sT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFxQixDQUFDO1lBRXZELGdCQUFNLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxXQUFXLEVBQUUsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUNoRCxNQUFNLFVBQVUsR0FBRyxNQUFNLEVBQUUsQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUN4QyxnQkFBTSxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLCtCQUFtQixDQUFDLENBQUMsQ0FBQztRQUN4RCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsSUFBQSxnQkFBUSxFQUFDLGtCQUFrQixFQUFFLEdBQUcsRUFBRTtRQUNoQyxJQUFBLFVBQUUsRUFBQyw2Q0FBNkMsRUFBRSxLQUFLLElBQUksRUFBRTtZQUMzRCxNQUFNLE9BQU8sR0FBRyxJQUFJLDRDQUF1QixDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBRTVELE9BQU87aUJBQ0osWUFBWSxDQUFDLEVBQUUsS0FBSyxFQUFFLGVBQWUsRUFBRSxFQUFFLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLENBQUM7aUJBQzNGLFFBQVEsQ0FBQyxjQUFjLENBQUM7aUJBQ3hCLEtBQUssQ0FBQyxFQUFFLENBQUM7aUJBQ1QsR0FBRyxDQUFDLE9BQU8sQ0FBQztpQkFDWixZQUFZLENBQUMsV0FBVyxDQUFDO2lCQUN6QixvQkFBb0IsQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUVyQyxNQUFNLEVBQUUsR0FBRyxDQUFDLE1BQU0sT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFxQixDQUFDO1lBQ3ZELE1BQU0sSUFBSSxHQUFHLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUV6QixnQkFBTSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLCtCQUFtQixDQUFDLENBQUM7WUFDbkQsZ0JBQU0sQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSwyQkFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQzFELGdCQUFNLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDbkMsZ0JBQU0sQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxRQUFRLENBQUMsQ0FBQztZQUN2QyxnQkFBTSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLGNBQWMsQ0FBQyxDQUFDO1lBRWxELE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxVQUFtQixDQUFDO1lBQ3JDLGdCQUFNLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsZUFBZSxDQUFDLENBQUM7WUFDbEQsZ0JBQU0sQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsQ0FBQztZQUM1QyxnQkFBTSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ3ZDLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxJQUFBLGdCQUFRLEVBQUMsb0JBQW9CLEVBQUUsR0FBRyxFQUFFO1FBQ2xDLElBQUEsVUFBRSxFQUFDLDBDQUEwQyxFQUFFLEtBQUssSUFBSSxFQUFFO1lBQ3hELE1BQU0sT0FBTyxHQUFHLElBQUksNENBQXVCLENBQUMsY0FBYyxDQUFDLENBQUM7WUFFNUQsT0FBTztpQkFDSixZQUFZLENBQUMsRUFBRSxLQUFLLEVBQUUsZUFBZSxFQUFFLEVBQUUsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUM7aUJBQzNFLFFBQVEsQ0FBQyxlQUFlLENBQUM7aUJBQ3pCLEtBQUssQ0FBQyxDQUFDLENBQUM7aUJBQ1IsR0FBRyxDQUFDLGlCQUFTLENBQUMsVUFBVSxDQUFDO2lCQUN6QixZQUFZLENBQUMsaUJBQVMsQ0FBQyxtQkFBbUIsQ0FBQztpQkFDM0Msb0JBQW9CLENBQUMsaUJBQVMsQ0FBQywyQkFBMkIsQ0FBQyxDQUFDO1lBRS9ELE1BQU0sRUFBRSxHQUFHLENBQUMsTUFBTSxPQUFPLENBQUMsS0FBSyxFQUFFLENBQXFCLENBQUM7WUFDdkQsZ0JBQU0sQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLFlBQVksRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzlDLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVElQLTIwIEludGVncmF0aW9uIFRlc3RzXG4gKlxuICogRW5kLXRvLWVuZCBmbG93cyBmb3IgVElQLTIwIHRva2VuIHRyYW5zYWN0aW9ucyBvbiBUZW1wbyB1c2luZyB0ZXN0bmV0IHRva2VuIGFkZHJlc3Nlcy5cbiAqL1xuXG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgeyBkZXNjcmliZSwgaXQgfSBmcm9tICdtb2NoYSc7XG5pbXBvcnQgeyBldGhlcnMgfSBmcm9tICdldGhlcnMnO1xuaW1wb3J0IHsgY29pbnMgfSBmcm9tICdAYml0Z28tYmV0YS9zdGF0aWNzJztcbmltcG9ydCB7IFRpcDIwVHJhbnNhY3Rpb25CdWlsZGVyIH0gZnJvbSAnLi4vLi4vc3JjL2xpYi90cmFuc2FjdGlvbkJ1aWxkZXInO1xuaW1wb3J0IHsgVGlwMjBUcmFuc2FjdGlvbiB9IGZyb20gJy4uLy4uL3NyYy9saWIvdHJhbnNhY3Rpb24nO1xuaW1wb3J0IHsgQWRkcmVzcyB9IGZyb20gJy4uLy4uL3NyYy9saWIvdHlwZXMnO1xuaW1wb3J0IHsgQUFfVFJBTlNBQ1RJT05fVFlQRSwgVEVNUE9fQ0hBSU5fSURTIH0gZnJvbSAnLi4vLi4vc3JjL2xpYi9jb25zdGFudHMnO1xuaW1wb3J0IHsgVEVTVE5FVF9UT0tFTlMsIFRYX1BBUkFNUywgU0lHTkFUVVJFX1RFU1RfREFUQSwgVEVTVF9SRUNJUElFTlRfQUREUkVTUyB9IGZyb20gJy4uL3Jlc291cmNlcy90ZW1wbyc7XG5cbmNvbnN0IG1vY2tDb2luQ29uZmlnID0gY29pbnMuZ2V0KCd0dGVtcG8nKTtcblxuY29uc3QgQUxQSEFfVVNEX1RPS0VOID0gVEVTVE5FVF9UT0tFTlMuYWxwaGFVU0QuYWRkcmVzcyBhcyBBZGRyZXNzO1xuY29uc3QgQkVUQV9VU0RfVE9LRU4gPSBURVNUTkVUX1RPS0VOUy5iZXRhVVNELmFkZHJlc3MgYXMgQWRkcmVzcztcbmNvbnN0IFRIRVRBX1VTRF9UT0tFTiA9IFRFU1RORVRfVE9LRU5TLnRoZXRhVVNELmFkZHJlc3MgYXMgQWRkcmVzcztcbmNvbnN0IFJFQ0VJVkVSX0FERFJFU1MgPSBURVNUX1JFQ0lQSUVOVF9BRERSRVNTIGFzIEFkZHJlc3M7XG5cbmRlc2NyaWJlKCdUSVAtMjAgSW50ZWdyYXRpb24gVGVzdHMnLCAoKSA9PiB7XG4gIGRlc2NyaWJlKCdTaW5nbGUgVHJhbnNmZXInLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBidWlsZCBhbmQgc2VyaWFsaXplIHNpbmdsZSBUSVAtMjAgdHJhbnNmZXInLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gbmV3IFRpcDIwVHJhbnNhY3Rpb25CdWlsZGVyKG1vY2tDb2luQ29uZmlnKTtcblxuICAgICAgYnVpbGRlclxuICAgICAgICAuYWRkT3BlcmF0aW9uKHtcbiAgICAgICAgICB0b2tlbjogQUxQSEFfVVNEX1RPS0VOLFxuICAgICAgICAgIHRvOiBSRUNFSVZFUl9BRERSRVNTLFxuICAgICAgICAgIGFtb3VudDogJzEnLFxuICAgICAgICAgIG1lbW86ICcxJyxcbiAgICAgICAgfSlcbiAgICAgICAgLmZlZVRva2VuKEFMUEhBX1VTRF9UT0tFTilcbiAgICAgICAgLm5vbmNlKDApXG4gICAgICAgIC5nYXMoVFhfUEFSQU1TLmRlZmF1bHRHYXMpXG4gICAgICAgIC5tYXhGZWVQZXJHYXMoVFhfUEFSQU1TLmRlZmF1bHRNYXhGZWVQZXJHYXMpXG4gICAgICAgIC5tYXhQcmlvcml0eUZlZVBlckdhcyhUWF9QQVJBTVMuZGVmYXVsdE1heFByaW9yaXR5RmVlUGVyR2FzKTtcblxuICAgICAgY29uc3QgdHggPSAoYXdhaXQgYnVpbGRlci5idWlsZCgpKSBhcyBUaXAyMFRyYW5zYWN0aW9uO1xuXG4gICAgICBhc3NlcnQub2sodHggaW5zdGFuY2VvZiBUaXAyMFRyYW5zYWN0aW9uKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbCh0eC5nZXRPcGVyYXRpb25Db3VudCgpLCAxKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbCh0eC5pc0JhdGNoKCksIGZhbHNlKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbCh0eC5nZXRPcGVyYXRpb25zKClbMF0ubWVtbywgJzEnKTtcblxuICAgICAgY29uc3Qgc2VyaWFsaXplZCA9IGF3YWl0IHR4LnNlcmlhbGl6ZSgpO1xuICAgICAgYXNzZXJ0Lm9rKHNlcmlhbGl6ZWQuc3RhcnRzV2l0aChBQV9UUkFOU0FDVElPTl9UWVBFKSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdCYXRjaCBUcmFuc2ZlcicsICgpID0+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"}