@bitgo/sdk-coin-sui 5.19.2 → 5.19.4
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/test/integration/index.d.ts +1 -0
- package/dist/test/integration/index.d.ts.map +1 -0
- package/dist/test/integration/index.js +1 -0
- package/dist/test/local_fullnode/RpcClient.d.ts +60 -0
- package/dist/test/local_fullnode/RpcClient.d.ts.map +1 -0
- package/dist/test/local_fullnode/RpcClient.js +111 -0
- package/dist/test/local_fullnode/faucet.d.ts +6 -0
- package/dist/test/local_fullnode/faucet.d.ts.map +1 -0
- package/dist/test/local_fullnode/faucet.js +17 -0
- package/dist/test/local_fullnode/transactions.d.ts +2 -0
- package/dist/test/local_fullnode/transactions.d.ts.map +1 -0
- package/dist/test/local_fullnode/transactions.js +190 -0
- package/dist/test/resources/sui.d.ts +463 -0
- package/dist/test/resources/sui.d.ts.map +1 -0
- package/dist/test/resources/sui.js +632 -0
- package/dist/test/unit/compareTransactionBlocks.d.ts +2 -0
- package/dist/test/unit/compareTransactionBlocks.d.ts.map +1 -0
- package/dist/test/unit/compareTransactionBlocks.js +64 -0
- package/dist/test/unit/getBuilderFactory.d.ts +3 -0
- package/dist/test/unit/getBuilderFactory.d.ts.map +1 -0
- package/dist/test/unit/getBuilderFactory.js +10 -0
- package/dist/test/unit/keyPair.d.ts +2 -0
- package/dist/test/unit/keyPair.d.ts.map +1 -0
- package/dist/test/unit/keyPair.js +72 -0
- package/dist/test/unit/sui.d.ts +2 -0
- package/dist/test/unit/sui.d.ts.map +1 -0
- package/dist/test/unit/sui.js +2399 -0
- package/dist/test/unit/suiToken.d.ts +2 -0
- package/dist/test/unit/suiToken.d.ts.map +1 -0
- package/dist/test/unit/suiToken.js +39 -0
- package/dist/test/unit/transactionBuilder/customTransactionBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/customTransactionBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/customTransactionBuilder.js +106 -0
- package/dist/test/unit/transactionBuilder/stakingBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/stakingBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/stakingBuilder.js +152 -0
- package/dist/test/unit/transactionBuilder/tokenTransferBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/tokenTransferBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/tokenTransferBuilder.js +149 -0
- package/dist/test/unit/transactionBuilder/transactionBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/transactionBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/transactionBuilder.js +639 -0
- package/dist/test/unit/transactionBuilder/transferBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/transferBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/transferBuilder.js +192 -0
- package/dist/test/unit/transactionBuilder/unstakingBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/unstakingBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/unstakingBuilder.js +115 -0
- package/dist/test/unit/transactionBuilder/walrusStakingBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/walrusStakingBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/walrusStakingBuilder.js +162 -0
- package/dist/test/unit/transactionBuilder/walrusWithdrawBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/walrusWithdrawBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/walrusWithdrawBuilder.js +181 -0
- package/dist/test/unit/transferTransaction.d.ts +2 -0
- package/dist/test/unit/transferTransaction.d.ts.map +1 -0
- package/dist/test/unit/transferTransaction.js +94 -0
- package/dist/test/unit/utils.d.ts +2 -0
- package/dist/test/unit/utils.d.ts.map +1 -0
- package/dist/test/unit/utils.js +81 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +11 -8
- package/.eslintignore +0 -6
- package/.mocharc.yml +0 -7
- package/CHANGELOG.md +0 -1166
|
@@ -0,0 +1 @@
|
|
|
1
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../test/integration/index.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90ZXN0L2ludGVncmF0aW9uL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyIiXX0=
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { SuiObjectData, SuiTransactionBlockResponse } from '../../src/lib/mystenlab/types';
|
|
2
|
+
import { DelegatedStake } from '../../src/lib/mystenlab/types/validator';
|
|
3
|
+
export declare class RpcError extends Error {
|
|
4
|
+
rpcError: {
|
|
5
|
+
code: number;
|
|
6
|
+
message: string;
|
|
7
|
+
};
|
|
8
|
+
constructor(rpcError: {
|
|
9
|
+
code: number;
|
|
10
|
+
message: string;
|
|
11
|
+
});
|
|
12
|
+
static isRpcErrorWithCode(e: Error, code: number): boolean;
|
|
13
|
+
}
|
|
14
|
+
export type Coin = {
|
|
15
|
+
coinType: string;
|
|
16
|
+
coinObjectId: string;
|
|
17
|
+
version: string;
|
|
18
|
+
digest: string;
|
|
19
|
+
balance: string;
|
|
20
|
+
previousTransaction: string;
|
|
21
|
+
};
|
|
22
|
+
/** Wrapper around https://docs.sui.io/sui-jsonrpc */
|
|
23
|
+
export declare class RpcClient {
|
|
24
|
+
url: string;
|
|
25
|
+
id: number;
|
|
26
|
+
constructor(url: string);
|
|
27
|
+
static createCheckedConnection(url: string): Promise<RpcClient>;
|
|
28
|
+
exec<T>(method: string, ...params: unknown[]): Promise<T>;
|
|
29
|
+
/**
|
|
30
|
+
* https://docs.sui.io/sui-jsonrpc#suix_getCoins
|
|
31
|
+
*/
|
|
32
|
+
getCoins(owner: string, coinType?: string, cursor?: string, limit?: number): Promise<{
|
|
33
|
+
data: Coin[];
|
|
34
|
+
nextCursor?: string;
|
|
35
|
+
hasNextPage?: boolean;
|
|
36
|
+
}>;
|
|
37
|
+
executeTransactionBlock(tx_bytes: string, signatures: string[], options?: unknown, request_type?: unknown): Promise<SuiTransactionBlockResponse>;
|
|
38
|
+
/**
|
|
39
|
+
* https://docs.sui.io/sui-jsonrpc#suix_getValidatorsApy
|
|
40
|
+
* APY = Annual Percentage Yield
|
|
41
|
+
*/
|
|
42
|
+
getValidatorsApy(): Promise<{
|
|
43
|
+
apys: {
|
|
44
|
+
address: string;
|
|
45
|
+
apy: string;
|
|
46
|
+
}[];
|
|
47
|
+
epoch: string;
|
|
48
|
+
}>;
|
|
49
|
+
/**
|
|
50
|
+
* https://docs.sui.io/sui-jsonrpc#suix_getStakes
|
|
51
|
+
*/
|
|
52
|
+
getStakes(owner: string): Promise<DelegatedStake[]>;
|
|
53
|
+
/**
|
|
54
|
+
* https://docs.sui.io/sui-jsonrpc#sui_getObject
|
|
55
|
+
*/
|
|
56
|
+
getObject(object_id: string): Promise<{
|
|
57
|
+
data: SuiObjectData;
|
|
58
|
+
}>;
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=RpcClient.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RpcClient.d.ts","sourceRoot":"","sources":["../../../test/local_fullnode/RpcClient.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,aAAa,EAAE,2BAA2B,EAAE,MAAM,+BAA+B,CAAC;AAC3F,OAAO,EAAE,cAAc,EAAE,MAAM,yCAAyC,CAAC;AAqBzE,qBAAa,QAAS,SAAQ,KAAK;IAC1B,QAAQ,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;gBAEvC,QAAQ,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE;IAKvD,MAAM,CAAC,kBAAkB,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO;CAG3D;AAED,MAAM,MAAM,IAAI,GAAG;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,mBAAmB,EAAE,MAAM,CAAC;CAC7B,CAAC;AAEF,qDAAqD;AACrD,qBAAa,SAAS;IACb,GAAG,EAAE,MAAM,CAAC;IAEnB,EAAE,SAAK;gBAEK,GAAG,EAAE,MAAM;WAIV,uBAAuB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;IAQ/D,IAAI,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC;IAwB/D;;OAEG;IACG,QAAQ,CACZ,KAAK,EAAE,MAAM,EACb,QAAQ,CAAC,EAAE,MAAM,EACjB,MAAM,CAAC,EAAE,MAAM,EACf,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC;QACT,IAAI,EAAE,IAAI,EAAE,CAAC;QACb,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,WAAW,CAAC,EAAE,OAAO,CAAC;KACvB,CAAC;IAII,uBAAuB,CAC3B,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,EAAE,EACpB,OAAO,CAAC,EAAE,OAAO,EACjB,YAAY,CAAC,EAAE,OAAO,GACrB,OAAO,CAAC,2BAA2B,CAAC;IAiBvC;;;OAGG;IACG,gBAAgB,IAAI,OAAO,CAAC;QAChC,IAAI,EAAE;YAAE,OAAO,EAAE,MAAM,CAAC;YAAC,GAAG,EAAE,MAAM,CAAA;SAAE,EAAE,CAAC;QACzC,KAAK,EAAE,MAAM,CAAC;KACf,CAAC;IAIF;;OAEG;IACG,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAIzD;;OAEG;IACG,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,IAAI,EAAE,aAAa,CAAA;KAAE,CAAC;CAGrE"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.RpcClient = exports.RpcError = void 0;
|
|
7
|
+
const util_1 = __importDefault(require("util"));
|
|
8
|
+
const axios_1 = __importDefault(require("axios"));
|
|
9
|
+
const debug_1 = __importDefault(require("debug"));
|
|
10
|
+
const debug = (0, debug_1.default)('RpcClient');
|
|
11
|
+
function elideResponse(method) {
|
|
12
|
+
return method === 'sui_getProtocolConfig';
|
|
13
|
+
}
|
|
14
|
+
function unwrapResult(method, v) {
|
|
15
|
+
if ('error' in v) {
|
|
16
|
+
debug('< %s ERROR', method, v.error);
|
|
17
|
+
throw new Error(JSON.stringify(v.error));
|
|
18
|
+
}
|
|
19
|
+
if (elideResponse(method)) {
|
|
20
|
+
debug('< %s ...', method);
|
|
21
|
+
}
|
|
22
|
+
else {
|
|
23
|
+
debug('< %s', method, util_1.default.inspect(v.result, { depth: 10 }));
|
|
24
|
+
}
|
|
25
|
+
return v.result;
|
|
26
|
+
}
|
|
27
|
+
class RpcError extends Error {
|
|
28
|
+
constructor(rpcError) {
|
|
29
|
+
super(`RPC error: ${rpcError.message} (code=${rpcError.code})`);
|
|
30
|
+
this.rpcError = rpcError;
|
|
31
|
+
}
|
|
32
|
+
static isRpcErrorWithCode(e, code) {
|
|
33
|
+
return e instanceof RpcError && e.rpcError.code === code;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
exports.RpcError = RpcError;
|
|
37
|
+
/** Wrapper around https://docs.sui.io/sui-jsonrpc */
|
|
38
|
+
class RpcClient {
|
|
39
|
+
constructor(url) {
|
|
40
|
+
// Running counter, increments every request
|
|
41
|
+
this.id = 0;
|
|
42
|
+
this.url = url;
|
|
43
|
+
}
|
|
44
|
+
static async createCheckedConnection(url) {
|
|
45
|
+
const rpcClient = new RpcClient(url);
|
|
46
|
+
const { protocolVersion } = await rpcClient.exec('sui_getProtocolConfig');
|
|
47
|
+
const chainId = await rpcClient.exec('sui_getChainIdentifier');
|
|
48
|
+
debug('Connected to', url, 'protocolVersion', protocolVersion, 'chainId', chainId);
|
|
49
|
+
return rpcClient;
|
|
50
|
+
}
|
|
51
|
+
async exec(method, ...params) {
|
|
52
|
+
params = params.filter((v) => v !== undefined);
|
|
53
|
+
try {
|
|
54
|
+
debug('>', this.url, method, params);
|
|
55
|
+
const response = await axios_1.default.post(this.url, {
|
|
56
|
+
jsonrpc: '2.0',
|
|
57
|
+
method,
|
|
58
|
+
params,
|
|
59
|
+
id: `${this.id++}`,
|
|
60
|
+
});
|
|
61
|
+
return unwrapResult(method, response.data);
|
|
62
|
+
}
|
|
63
|
+
catch (e) {
|
|
64
|
+
if (e.isAxiosError && e.response) {
|
|
65
|
+
e = e;
|
|
66
|
+
debug('< %s ERROR', method, e.response.statusText, util_1.default.inspect(e.response.data, { depth: 10 }));
|
|
67
|
+
e = e;
|
|
68
|
+
const { error = {} } = e.response.data;
|
|
69
|
+
throw new RpcError(error);
|
|
70
|
+
}
|
|
71
|
+
throw e;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* https://docs.sui.io/sui-jsonrpc#suix_getCoins
|
|
76
|
+
*/
|
|
77
|
+
async getCoins(owner, coinType, cursor, limit) {
|
|
78
|
+
return this.exec('suix_getCoins', owner, coinType, cursor, limit);
|
|
79
|
+
}
|
|
80
|
+
async executeTransactionBlock(tx_bytes, signatures, options, request_type) {
|
|
81
|
+
return this.exec('sui_executeTransactionBlock', tx_bytes, signatures, {
|
|
82
|
+
showInput: true,
|
|
83
|
+
showRawInput: true,
|
|
84
|
+
showEffects: true,
|
|
85
|
+
showEvents: true,
|
|
86
|
+
showObjectChanges: true,
|
|
87
|
+
showBalanceChanges: true,
|
|
88
|
+
}, request_type);
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* https://docs.sui.io/sui-jsonrpc#suix_getValidatorsApy
|
|
92
|
+
* APY = Annual Percentage Yield
|
|
93
|
+
*/
|
|
94
|
+
async getValidatorsApy() {
|
|
95
|
+
return this.exec('suix_getValidatorsApy');
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* https://docs.sui.io/sui-jsonrpc#suix_getStakes
|
|
99
|
+
*/
|
|
100
|
+
async getStakes(owner) {
|
|
101
|
+
return this.exec('suix_getStakes', owner);
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* https://docs.sui.io/sui-jsonrpc#sui_getObject
|
|
105
|
+
*/
|
|
106
|
+
async getObject(object_id) {
|
|
107
|
+
return this.exec('sui_getObject', object_id, { showData: true });
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
exports.RpcClient = RpcClient;
|
|
111
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUnBjQ2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdGVzdC9sb2NhbF9mdWxsbm9kZS9ScGNDbGllbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsZ0RBQXdCO0FBQ3hCLGtEQUEwQztBQUMxQyxrREFBK0I7QUFJL0IsTUFBTSxLQUFLLEdBQUcsSUFBQSxlQUFVLEVBQUMsV0FBVyxDQUFDLENBQUM7QUFFdEMsU0FBUyxhQUFhLENBQUMsTUFBYztJQUNuQyxPQUFPLE1BQU0sS0FBSyx1QkFBdUIsQ0FBQztBQUM1QyxDQUFDO0FBRUQsU0FBUyxZQUFZLENBQUksTUFBYyxFQUFFLENBQStEO0lBQ3RHLElBQUksT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQ2pCLEtBQUssQ0FBQyxZQUFZLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNyQyxNQUFNLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUNELElBQUksYUFBYSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFDMUIsS0FBSyxDQUFDLFVBQVUsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUM1QixDQUFDO1NBQU0sQ0FBQztRQUNOLEtBQUssQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLGNBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDL0QsQ0FBQztJQUNELE9BQU8sQ0FBQyxDQUFDLE1BQU0sQ0FBQztBQUNsQixDQUFDO0FBRUQsTUFBYSxRQUFTLFNBQVEsS0FBSztJQUdqQyxZQUFZLFFBQTJDO1FBQ3JELEtBQUssQ0FBQyxjQUFjLFFBQVEsQ0FBQyxPQUFPLFVBQVUsUUFBUSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUM7UUFD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akIsWUFBc0I7UUFFdEIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUNkLDZCQUE2QixFQUM3QixRQUFRLEVBQ1IsVUFBVSxFQUNWO1lBQ0UsU0FBUyxFQUFFLElBQUk7WUFDZixZQUFZLEVBQUUsSUFBSTtZQUNsQixXQUFXLEVBQUUsSUFBSTtZQUNqQixVQUFVLEVBQUUsSUFBSTtZQUNoQixpQkFBaUIsRUFBRSxJQUFJO1lBQ3ZCLGtCQUFrQixFQUFFLElBQUk7U0FDekIsRUFDRCxZQUFZLENBQ2IsQ0FBQztJQUNKLENBQUM7SUFFRDs7O09BR0c7SUFDSCxLQUFLLENBQUMsZ0JBQWdCO1FBSXBCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO0lBQzVDLENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxTQUFTLENBQUMsS0FBYTtRQUMzQixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDNUMsQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLFNBQVMsQ0FBQyxTQUFpQjtRQUMvQixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLFNBQVMsRUFBRSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ25FLENBQUM7Q0FDRjtBQXZHRCw4QkF1R0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdXRpbCBmcm9tICd1dGlsJztcbmltcG9ydCBheGlvcywgeyBBeGlvc0Vycm9yIH0gZnJvbSAnYXhpb3MnO1xuaW1wb3J0IGJ1aWxkRGVidWcgZnJvbSAnZGVidWcnO1xuaW1wb3J0IHsgU3VpT2JqZWN0RGF0YSwgU3VpVHJhbnNhY3Rpb25CbG9ja1Jlc3BvbnNlIH0gZnJvbSAnLi4vLi4vc3JjL2xpYi9teXN0ZW5sYWIvdHlwZXMnO1xuaW1wb3J0IHsgRGVsZWdhdGVkU3Rha2UgfSBmcm9tICcuLi8uLi9zcmMvbGliL215c3RlbmxhYi90eXBlcy92YWxpZGF0b3InO1xuXG5jb25zdCBkZWJ1ZyA9IGJ1aWxkRGVidWcoJ1JwY0NsaWVudCcpO1xuXG5mdW5jdGlvbiBlbGlkZVJlc3BvbnNlKG1ldGhvZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBtZXRob2QgPT09ICdzdWlfZ2V0UHJvdG9jb2xDb25maWcnO1xufVxuXG5mdW5jdGlvbiB1bndyYXBSZXN1bHQ8QT4obWV0aG9kOiBzdHJpbmcsIHY6IHsgcmVzdWx0OiBBIH0gfCB7IGVycm9yOiB7IGNvZGU6IG51bWJlcjsgbWVzc2FnZTogc3RyaW5nIH0gfSk6IEEge1xuICBpZiAoJ2Vycm9yJyBpbiB2KSB7XG4gICAgZGVidWcoJzwgJXMgRVJST1InLCBtZXRob2QsIHYuZXJyb3IpO1xuICAgIHRocm93IG5ldyBFcnJvcihKU09OLnN0cmluZ2lmeSh2LmVycm9yKSk7XG4gIH1cbiAgaWYgKGVsaWRlUmVzcG9uc2UobWV0aG9kKSkge1xuICAgIGRlYnVnKCc8ICVzIC4uLicsIG1ldGhvZCk7XG4gIH0gZWxzZSB7XG4gICAgZGVidWcoJzwgJXMnLCBtZXRob2QsIHV0aWwuaW5zcGVjdCh2LnJlc3VsdCwgeyBkZXB0aDogMTAgfSkpO1xuICB9XG4gIHJldHVybiB2LnJlc3VsdDtcbn1cblxuZXhwb3J0IGNsYXNzIFJwY0Vycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBwdWJsaWMgcnBjRXJyb3I6IHsgY29kZTogbnVtYmVyOyBtZXNzYWdlOiBzdHJpbmcgfTtcblxuICBjb25zdHJ1Y3RvcihycGNFcnJvcjogeyBjb2RlOiBudW1iZXI7IG1lc3NhZ2U6IHN0cmluZyB9KSB7XG4gICAgc3VwZXIoYFJQQyBlcnJvcjogJHtycGNFcnJvci5tZXNzYWdlfSAoY29kZT0ke3JwY0Vycm9yLmNvZGV9KWApO1xuICAgIHRoaXMucnBjRXJyb3IgPSBycGNFcnJvcjtcbiAgfVxuXG4gIHN0YXRpYyBpc1JwY0Vycm9yV2l0aENvZGUoZTogRXJyb3IsIGNvZGU6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIHJldHVybiBlIGluc3RhbmNlb2YgUnBjRXJyb3IgJiYgZS5ycGNFcnJvci5jb2RlID09PSBjb2RlO1xuICB9XG59XG5cbmV4cG9ydCB0eXBlIENvaW4gPSB7XG4gIGNvaW5UeXBlOiBzdHJpbmc7XG4gIGNvaW5PYmplY3RJZDogc3RyaW5nO1xuICB2ZXJzaW9uOiBzdHJpbmc7XG4gIGRpZ2VzdDogc3RyaW5nO1xuICBiYWxhbmNlOiBzdHJpbmc7XG4gIHByZXZpb3VzVHJhbnNhY3Rpb246IHN0cmluZztcbn07XG5cbi8qKiBXcmFwcGVyIGFyb3VuZCBodHRwczovL2RvY3Muc3VpLmlvL3N1aS1qc29ucnBjICovXG5leHBvcnQgY2xhc3MgUnBjQ2xpZW50IHtcbiAgcHVibGljIHVybDogc3RyaW5nO1xuICAvLyBSdW5uaW5nIGNvdW50ZXIsIGluY3JlbWVudHMgZXZlcnkgcmVxdWVzdFxuICBpZCA9IDA7XG5cbiAgY29uc3RydWN0b3IodXJsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnVybCA9IHVybDtcbiAgfVxuXG4gIHN0YXRpYyBhc3luYyBjcmVhdGVDaGVja2VkQ29ubmVjdGlvbih1cmw6IHN0cmluZyk6IFByb21pc2U8UnBjQ2xpZW50PiB7XG4gICAgY29uc3QgcnBjQ2xpZW50ID0gbmV3IFJwY0NsaWVudCh1cmwpO1xuICAgIGNvbnN0IHsgcHJvdG9jb2xWZXJzaW9uIH0gPSBhd2FpdCBycGNDbGllbnQuZXhlYzx7IHByb3RvY29sVmVyc2lvbjogc3RyaW5nIH0+KCdzdWlfZ2V0UHJvdG9jb2xDb25maWcnKTtcbiAgICBjb25zdCBjaGFpbklkID0gYXdhaXQgcnBjQ2xpZW50LmV4ZWMoJ3N1aV9nZXRDaGFpbklkZW50aWZpZXInKTtcbiAgICBkZWJ1ZygnQ29ubmVjdGVkIHRvJywgdXJsLCAncHJvdG9jb2xWZXJzaW9uJywgcHJvdG9jb2xWZXJzaW9uLCAnY2hhaW5JZCcsIGNoYWluSWQpO1xuICAgIHJldHVybiBycGNDbGllbnQ7XG4gIH1cblxuICBhc3luYyBleGVjPFQ+KG1ldGhvZDogc3RyaW5nLCAuLi5wYXJhbXM6IHVua25vd25bXSk6IFByb21pc2U8VD4ge1xuICAgIHBhcmFtcyA9IHBhcmFtcy5maWx0ZXIoKHYpID0+IHYgIT09IHVuZGVmaW5lZCk7XG4gICAgdHJ5IHtcbiAgICAgIGRlYnVnKCc+JywgdGhpcy51cmwsIG1ldGhvZCwgcGFyYW1zKTtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3MucG9zdCh0aGlzLnVybCwge1xuICAgICAgICBqc29ucnBjOiAnMi4wJyxcbiAgICAgICAgbWV0aG9kLFxuICAgICAgICBwYXJhbXMsXG4gICAgICAgIGlkOiBgJHt0aGlzLmlkKyt9YCxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHVud3JhcFJlc3VsdChtZXRob2QsIHJlc3BvbnNlLmRhdGEpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGlmIChlLmlzQXhpb3NFcnJvciAmJiBlLnJlc3BvbnNlKSB7XG4gICAgICAgIGUgPSBlIGFzIEF4aW9zRXJyb3I7XG4gICAgICAgIGRlYnVnKCc8ICVzIEVSUk9SJywgbWV0aG9kLCBlLnJlc3BvbnNlLnN0YXR1c1RleHQsIHV0aWwuaW5zcGVjdChlLnJlc3BvbnNlLmRhdGEsIHsgZGVwdGg6IDEwIH0pKTtcbiAgICAgICAgZSA9IGUgYXMgQXhpb3NFcnJvcjtcbiAgICAgICAgY29uc3QgeyBlcnJvciA9IHt9IH0gPSBlLnJlc3BvbnNlLmRhdGE7XG4gICAgICAgIHRocm93IG5ldyBScGNFcnJvcihlcnJvcik7XG4gICAgICB9XG5cbiAgICAgIHRocm93IGU7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIGh0dHBzOi8vZG9jcy5zdWkuaW8vc3VpLWpzb25ycGMjc3VpeF9nZXRDb2luc1xuICAgKi9cbiAgYXN5bmMgZ2V0Q29pbnMoXG4gICAgb3duZXI6IHN0cmluZyxcbiAgICBjb2luVHlwZT86IHN0cmluZyxcbiAgICBjdXJzb3I/OiBzdHJpbmcsXG4gICAgbGltaXQ/OiBudW1iZXJcbiAgKTogUHJvbWlzZTx7XG4gICAgZGF0YTogQ29pbltdO1xuICAgIG5leHRDdXJzb3I/OiBzdHJpbmc7XG4gICAgaGFzTmV4dFBhZ2U/OiBib29sZWFuO1xuICB9PiB7XG4gICAgcmV0dXJuIHRoaXMuZXhlYygnc3VpeF9nZXRDb2lucycsIG93bmVyLCBjb2luVHlwZSwgY3Vyc29yLCBsaW1pdCk7XG4gIH1cblxuICBhc3luYyBleGVjdXRlVHJhbnNhY3Rpb25CbG9jayhcbiAgICB0eF9ieXRlczogc3RyaW5nLFxuICAgIHNpZ25hdHVyZXM6IHN0cmluZ1tdLFxuICAgIG9wdGlvbnM/OiB1bmtub3duLFxuICAgIHJlcXVlc3RfdHlwZT86IHVua25vd25cbiAgKTogUHJvbWlzZTxTdWlUcmFuc2FjdGlvbkJsb2NrUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5leGVjKFxuICAgICAgJ3N1aV9leGVjdXRlVHJhbnNhY3Rpb25CbG9jaycsXG4gICAgICB0eF9ieXRlcyxcbiAgICAgIHNpZ25hdHVyZXMsXG4gICAgICB7XG4gICAgICAgIHNob3dJbnB1dDogdHJ1ZSxcbiAgICAgICAgc2hvd1Jhd0lucHV0OiB0cnVlLFxuICAgICAgICBzaG93RWZmZWN0czogdHJ1ZSxcbiAgICAgICAgc2hvd0V2ZW50czogdHJ1ZSxcbiAgICAgICAgc2hvd09iamVjdENoYW5nZXM6IHRydWUsXG4gICAgICAgIHNob3dCYWxhbmNlQ2hhbmdlczogdHJ1ZSxcbiAgICAgIH0sXG4gICAgICByZXF1ZXN0X3R5cGVcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIGh0dHBzOi8vZG9jcy5zdWkuaW8vc3VpLWpzb25ycGMjc3VpeF9nZXRWYWxpZGF0b3JzQXB5XG4gICAqIEFQWSA9IEFubnVhbCBQZXJjZW50YWdlIFlpZWxkXG4gICAqL1xuICBhc3luYyBnZXRWYWxpZGF0b3JzQXB5KCk6IFByb21pc2U8e1xuICAgIGFweXM6IHsgYWRkcmVzczogc3RyaW5nOyBhcHk6IHN0cmluZyB9W107XG4gICAgZXBvY2g6IHN0cmluZztcbiAgfT4ge1xuICAgIHJldHVybiB0aGlzLmV4ZWMoJ3N1aXhfZ2V0VmFsaWRhdG9yc0FweScpO1xuICB9XG5cbiAgLyoqXG4gICAqIGh0dHBzOi8vZG9jcy5zdWkuaW8vc3VpLWpzb25ycGMjc3VpeF9nZXRTdGFrZXNcbiAgICovXG4gIGFzeW5jIGdldFN0YWtlcyhvd25lcjogc3RyaW5nKTogUHJvbWlzZTxEZWxlZ2F0ZWRTdGFrZVtdPiB7XG4gICAgcmV0dXJuIHRoaXMuZXhlYygnc3VpeF9nZXRTdGFrZXMnLCBvd25lcik7XG4gIH1cblxuICAvKipcbiAgICogaHR0cHM6Ly9kb2NzLnN1aS5pby9zdWktanNvbnJwYyNzdWlfZ2V0T2JqZWN0XG4gICAqL1xuICBhc3luYyBnZXRPYmplY3Qob2JqZWN0X2lkOiBzdHJpbmcpOiBQcm9taXNlPHsgZGF0YTogU3VpT2JqZWN0RGF0YSB9PiB7XG4gICAgcmV0dXJuIHRoaXMuZXhlYygnc3VpX2dldE9iamVjdCcsIG9iamVjdF9pZCwgeyBzaG93RGF0YTogdHJ1ZSB9KTtcbiAgfVxufVxuIl19
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"faucet.d.ts","sourceRoot":"","sources":["../../../test/local_fullnode/faucet.ts"],"names":[],"mappings":"AAEA,qBAAa,MAAM;IACV,GAAG,EAAE,MAAM,CAAC;gBACP,GAAG,EAAE,MAAM;IAIjB,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAG/D"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.Faucet = void 0;
|
|
7
|
+
const axios_1 = __importDefault(require("axios"));
|
|
8
|
+
class Faucet {
|
|
9
|
+
constructor(url) {
|
|
10
|
+
this.url = url;
|
|
11
|
+
}
|
|
12
|
+
async getCoins(address, amount) {
|
|
13
|
+
await axios_1.default.post(this.url + '/gas', { FixedAmountRequest: { recipient: address } });
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
exports.Faucet = Faucet;
|
|
17
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmF1Y2V0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdGVzdC9sb2NhbF9mdWxsbm9kZS9mYXVjZXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsa0RBQTBCO0FBRTFCLE1BQWEsTUFBTTtJQUVqQixZQUFZLEdBQVc7UUFDckIsSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUM7SUFDakIsQ0FBQztJQUVELEtBQUssQ0FBQyxRQUFRLENBQUMsT0FBZSxFQUFFLE1BQWM7UUFDNUMsTUFBTSxlQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsTUFBTSxFQUFFLEVBQUUsa0JBQWtCLEVBQUUsRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ3RGLENBQUM7Q0FDRjtBQVRELHdCQVNDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGF4aW9zIGZyb20gJ2F4aW9zJztcblxuZXhwb3J0IGNsYXNzIEZhdWNldCB7XG4gIHB1YmxpYyB1cmw6IHN0cmluZztcbiAgY29uc3RydWN0b3IodXJsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnVybCA9IHVybDtcbiAgfVxuXG4gIGFzeW5jIGdldENvaW5zKGFkZHJlc3M6IHN0cmluZywgYW1vdW50OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCBheGlvcy5wb3N0KHRoaXMudXJsICsgJy9nYXMnLCB7IEZpeGVkQW1vdW50UmVxdWVzdDogeyByZWNpcGllbnQ6IGFkZHJlc3MgfSB9KTtcbiAgfVxufVxuIl19
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transactions.d.ts","sourceRoot":"","sources":["../../../test/local_fullnode/transactions.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
process.env.DEBUG = 'RpcClient,SuiTransactionTypes';
|
|
7
|
+
const assert_1 = __importDefault(require("assert"));
|
|
8
|
+
const util_1 = __importDefault(require("util"));
|
|
9
|
+
const faucet_1 = require("./faucet");
|
|
10
|
+
const debug_1 = __importDefault(require("debug"));
|
|
11
|
+
const crypto_1 = require("crypto");
|
|
12
|
+
const src_1 = require("../../src");
|
|
13
|
+
const RpcClient_1 = require("./RpcClient");
|
|
14
|
+
const getBuilderFactory_1 = require("../unit/getBuilderFactory");
|
|
15
|
+
const iface_1 = require("../../src/lib/iface");
|
|
16
|
+
const constants_1 = require("../../src/lib/constants");
|
|
17
|
+
const debug = (0, debug_1.default)('SuiTransactionTypes');
|
|
18
|
+
async function getAllCoins(conn, address) {
|
|
19
|
+
return (await conn.getCoins(address)).data.map((v) => {
|
|
20
|
+
return {
|
|
21
|
+
digest: v.digest,
|
|
22
|
+
objectId: v.coinObjectId,
|
|
23
|
+
version: v.version,
|
|
24
|
+
};
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* @returns The stakes array with the stakedSui amount reduced by amount. If amount is undefined, the stakedSui is removed.
|
|
29
|
+
*/
|
|
30
|
+
function subtractStake(stakes, stakedSui, amount) {
|
|
31
|
+
return stakes.flatMap((s) => {
|
|
32
|
+
if (s.stakedSuiId === stakedSui.stakedSuiId) {
|
|
33
|
+
if (amount === undefined) {
|
|
34
|
+
// remove the stake
|
|
35
|
+
return [];
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
// reduce the stake by amount
|
|
39
|
+
return [{ ...s, principal: Number(s.principal) - amount }];
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
// keep the stake unchanged
|
|
44
|
+
return [s];
|
|
45
|
+
}
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Asserts that the stakesAfter array is the same as the stakesBefore array with the stakedSui amount reduced by amount.
|
|
50
|
+
*/
|
|
51
|
+
function assertReducedStake(stakesBefore, stakesAfter, stakedSui, amount) {
|
|
52
|
+
/*
|
|
53
|
+
* Normalize the stake objects by converting the principal to a number and removing the estimatedReward.
|
|
54
|
+
*/
|
|
55
|
+
function normStake(s) {
|
|
56
|
+
return { ...s, principal: Number(s.principal), estimatedReward: undefined };
|
|
57
|
+
}
|
|
58
|
+
stakesBefore = stakesBefore.map(normStake);
|
|
59
|
+
stakesAfter = stakesAfter.map(normStake);
|
|
60
|
+
assert_1.default.deepStrictEqual(stakesAfter, subtractStake(stakesBefore, stakedSui, amount));
|
|
61
|
+
}
|
|
62
|
+
async function getStakes(conn, owner, params = {}) {
|
|
63
|
+
const all = await conn.getStakes(owner);
|
|
64
|
+
const result = await Promise.all(all.flatMap((s) => s.stakes
|
|
65
|
+
.filter((v) => params.filterStatus === undefined || v.status === params.filterStatus)
|
|
66
|
+
.filter((v) => params.filterMinValue === undefined || params.filterMinValue <= Number(v.principal))));
|
|
67
|
+
if (result.length) {
|
|
68
|
+
return result;
|
|
69
|
+
}
|
|
70
|
+
const { attempts = 60, sleepMs = 1000 } = params;
|
|
71
|
+
if (0 < attempts) {
|
|
72
|
+
await new Promise((resolve) => setTimeout(resolve, sleepMs));
|
|
73
|
+
return await getStakes(conn, owner, { ...params, attempts: attempts - 1, sleepMs });
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
throw new Error('getAllActiveStakedSuis: no active staked suis found');
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
async function resolveStakedSui(conn, stake) {
|
|
80
|
+
return (await conn.getObject(stake.stakedSuiId)).data;
|
|
81
|
+
}
|
|
82
|
+
function getKeyPair(seed) {
|
|
83
|
+
const seedBuf = (0, crypto_1.createHash)('sha256').update(seed).digest();
|
|
84
|
+
return new src_1.KeyPair({ seed: seedBuf });
|
|
85
|
+
}
|
|
86
|
+
async function signAndSubmit(conn, keyPair, txb) {
|
|
87
|
+
txb.sign({ key: keyPair.getKeys().prv });
|
|
88
|
+
const tx = (await txb.build());
|
|
89
|
+
debug('tx', util_1.default.inspect(tx.suiTransaction.tx, { depth: 10 }));
|
|
90
|
+
const result = await conn.executeTransactionBlock(tx.toBroadcastFormat(), [
|
|
91
|
+
Buffer.from(tx.serializedSig).toString('base64'),
|
|
92
|
+
]);
|
|
93
|
+
if (result.effects?.status.status !== 'success') {
|
|
94
|
+
throw new Error(`Transaction failed: ${JSON.stringify(result.effects?.status)}`);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
async function fundFromFaucet(url, v, amount = 100e9) {
|
|
98
|
+
if (typeof v !== 'string') {
|
|
99
|
+
v = v.getAddress();
|
|
100
|
+
}
|
|
101
|
+
await new faucet_1.Faucet(url).getCoins(v, 10e9);
|
|
102
|
+
}
|
|
103
|
+
describe('Sui Transaction Types', function () {
|
|
104
|
+
if (process.env.DRONE) {
|
|
105
|
+
console.log('skipping local_fullnode/transactions.ts on drone');
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
const keyPair = getKeyPair('test');
|
|
109
|
+
const address = keyPair.getAddress();
|
|
110
|
+
debug('address', address);
|
|
111
|
+
const fullnodeUrl = process.env.SUI_FULLNODE_URL || 'http://127.0.0.1:9000';
|
|
112
|
+
const faucetUrl = process.env.SUI_FAUCET_URL || 'http://127.0.0.1:9123';
|
|
113
|
+
async function getDefaultGasData(keyPair) {
|
|
114
|
+
return {
|
|
115
|
+
owner: keyPair.getAddress(),
|
|
116
|
+
payment: await getAllCoins(conn, keyPair.getAddress()),
|
|
117
|
+
budget: 100000000,
|
|
118
|
+
price: constants_1.DUMMY_SUI_GAS_PRICE,
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
let conn;
|
|
122
|
+
let validator;
|
|
123
|
+
before('establish connection', async function () {
|
|
124
|
+
conn = await RpcClient_1.RpcClient.createCheckedConnection(fullnodeUrl);
|
|
125
|
+
const { apys } = await conn.getValidatorsApy();
|
|
126
|
+
validator = apys[0].address;
|
|
127
|
+
});
|
|
128
|
+
before('fund via faucet', async function () {
|
|
129
|
+
if (faucetUrl) {
|
|
130
|
+
await fundFromFaucet(faucetUrl, address);
|
|
131
|
+
}
|
|
132
|
+
});
|
|
133
|
+
it('has coins', async function () {
|
|
134
|
+
const { data } = await conn.getCoins(address);
|
|
135
|
+
assert_1.default.notStrictEqual(data.length, 0);
|
|
136
|
+
});
|
|
137
|
+
it('can transfer coins', async function () {
|
|
138
|
+
const builder = (0, getBuilderFactory_1.getBuilderFactory)('tsui').getTransferBuilder();
|
|
139
|
+
const txb = builder
|
|
140
|
+
.type(iface_1.SuiTransactionType.Transfer)
|
|
141
|
+
.sender(address)
|
|
142
|
+
.send([{ address, amount: (111111).toString() }])
|
|
143
|
+
.gasData(await getDefaultGasData(keyPair));
|
|
144
|
+
await signAndSubmit(conn, keyPair, txb);
|
|
145
|
+
});
|
|
146
|
+
async function stakeAmount(keyPair, amount) {
|
|
147
|
+
const builder = (0, getBuilderFactory_1.getBuilderFactory)('tsui').getStakingBuilder();
|
|
148
|
+
const txb = builder
|
|
149
|
+
.type(iface_1.SuiTransactionType.AddStake)
|
|
150
|
+
.sender(keyPair.getAddress())
|
|
151
|
+
.stake([{ amount, validatorAddress: validator }])
|
|
152
|
+
.gasData(await getDefaultGasData(keyPair));
|
|
153
|
+
await signAndSubmit(conn, keyPair, txb);
|
|
154
|
+
}
|
|
155
|
+
it('can stake coins', async function () {
|
|
156
|
+
await stakeAmount(keyPair, 1e9);
|
|
157
|
+
});
|
|
158
|
+
function testUnstake(amount) {
|
|
159
|
+
describe(`unstake (amount=${amount})`, function () {
|
|
160
|
+
const keyPairStakeTest = getKeyPair(`stake-test-amount-${amount !== undefined}`);
|
|
161
|
+
const address = keyPairStakeTest.getAddress();
|
|
162
|
+
before('stake coins', async function () {
|
|
163
|
+
await fundFromFaucet(faucetUrl, address);
|
|
164
|
+
await stakeAmount(keyPairStakeTest, 10e9);
|
|
165
|
+
});
|
|
166
|
+
it(`can unstake`, async function () {
|
|
167
|
+
const activeStakedSui = await getStakes(conn, address, {
|
|
168
|
+
filterStatus: 'Active',
|
|
169
|
+
filterMinValue: constants_1.MIN_STAKING_THRESHOLD + (amount || 0),
|
|
170
|
+
});
|
|
171
|
+
(0, assert_1.default)(activeStakedSui.length > 0, 'No staked coins found');
|
|
172
|
+
for (const stakedSui of activeStakedSui.slice(0, 3)) {
|
|
173
|
+
debug('unstaking', stakedSui);
|
|
174
|
+
const builder = (0, getBuilderFactory_1.getBuilderFactory)('tsui').getUnstakingBuilder();
|
|
175
|
+
const stakedBefore = await getStakes(conn, address);
|
|
176
|
+
const txb = builder
|
|
177
|
+
.type(iface_1.SuiTransactionType.WithdrawStake)
|
|
178
|
+
.sender(address)
|
|
179
|
+
.unstake({ stakedSui: await resolveStakedSui(conn, stakedSui), amount })
|
|
180
|
+
.gasData(await getDefaultGasData(keyPairStakeTest));
|
|
181
|
+
await signAndSubmit(conn, keyPairStakeTest, txb);
|
|
182
|
+
assertReducedStake(stakedBefore, await getStakes(conn, address), stakedSui, amount);
|
|
183
|
+
}
|
|
184
|
+
});
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
testUnstake(undefined);
|
|
188
|
+
testUnstake(1e9);
|
|
189
|
+
});
|
|
190
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb25zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdGVzdC9sb2NhbF9mdWxsbm9kZS90cmFuc2FjdGlvbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFFQSxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssR0FBRywrQkFBK0IsQ0FBQztBQUVwRCxvREFBNEI7QUFDNUIsZ0RBQXdCO0FBQ3hCLHFDQUFrQztBQUNsQyxrREFBK0I7QUFDL0IsbUNBQW9DO0FBRXBDLG1DQVFtQjtBQUNuQiwyQ0FBd0M7QUFDeEMsaUVBQThEO0FBQzlELCtDQUF5RDtBQUV6RCx1REFBcUY7QUFFckYsTUFBTSxLQUFLLEdBQUcsSUFBQSxlQUFVLEVBQUMscUJBQXFCLENBQUMsQ0FBQztBQUVoRCxLQUFLLFVBQVUsV0FBVyxDQUFDLElBQWUsRUFBRSxPQUFlO0lBQ3pELE9BQU8sQ0FBQyxNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7UUFDbkQsT0FBTztZQUNMLE1BQU0sRUFBRSxDQUFDLENBQUMsTUFBTTtZQUNoQixRQUFRLEVBQUUsQ0FBQyxDQUFDLFlBQVk7WUFDeEIsT0FBTyxFQUFFLENBQUMsQ0FBQyxPQUFPO1NBQ25CLENBQUM7SUFDSixDQUFDLENBQUMsQ0FBQztBQUNMLENBQUM7QUFFRDs7R0FFRztBQUNILFNBQVMsYUFBYSxDQUFDLE1BQXFCLEVBQUUsU0FBc0IsRUFBRSxNQUEwQjtJQUM5RixPQUFPLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQWlCLEVBQUU7UUFDekMsSUFBSSxDQUFDLENBQUMsV0FBVyxLQUFLLFNBQVMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUM1QyxJQUFJLE1BQU0sS0FBSyxTQUFTLEVBQUUsQ0FBQztnQkFDekIsbUJBQW1CO2dCQUNuQixPQUFPLEVBQUUsQ0FBQztZQUNa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QUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU3Rha2VPYmplY3QgfSBmcm9tICcuLi8uLi9zcmMvbGliL215c3RlbmxhYi90eXBlcy92YWxpZGF0b3InO1xuXG5wcm9jZXNzLmVudi5ERUJVRyA9ICdScGNDbGllbnQsU3VpVHJhbnNhY3Rpb25UeXBlcyc7XG5cbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCB1dGlsIGZyb20gJ3V0aWwnO1xuaW1wb3J0IHsgRmF1Y2V0IH0gZnJvbSAnLi9mYXVjZXQnO1xuaW1wb3J0IGJ1aWxkRGVidWcgZnJvbSAnZGVidWcnO1xuaW1wb3J0IHsgY3JlYXRlSGFzaCB9IGZyb20gJ2NyeXB0byc7XG5cbmltcG9ydCB7XG4gIEtleVBhaXIsXG4gIFN0YWtpbmdCdWlsZGVyLFxuICBTdGFraW5nVHJhbnNhY3Rpb24sXG4gIFRyYW5zZmVyQnVpbGRlcixcbiAgVHJhbnNmZXJUcmFuc2FjdGlvbixcbiAgVW5zdGFraW5nQnVpbGRlcixcbiAgVW5zdGFraW5nVHJhbnNhY3Rpb24sXG59IGZyb20gJy4uLy4uL3NyYyc7XG5pbXBvcnQgeyBScGNDbGllbnQgfSBmcm9tICcuL1JwY0NsaWVudCc7XG5pbXBvcnQgeyBnZXRCdWlsZGVyRmFjdG9yeSB9IGZyb20gJy4uL3VuaXQvZ2V0QnVpbGRlckZhY3RvcnknO1xuaW1wb3J0IHsgU3VpVHJhbnNhY3Rpb25UeXBlIH0gZnJvbSAnLi4vLi4vc3JjL2xpYi9pZmFjZSc7XG5pbXBvcnQgeyBHYXNEYXRhLCBTdWlPYmplY3RSZWYgfSBmcm9tICcuLi8uLi9zcmMvbGliL215c3RlbmxhYi90eXBlcyc7XG5pbXBvcnQgeyBEVU1NWV9TVUlfR0FTX1BSSUNFLCBNSU5fU1RBS0lOR19USFJFU0hPTEQgfSBmcm9tICcuLi8uLi9zcmMvbGliL2NvbnN0YW50cyc7XG5cbmNvbnN0IGRlYnVnID0gYnVpbGREZWJ1ZygnU3VpVHJhbnNhY3Rpb25UeXBlcycpO1xuXG5hc3luYyBmdW5jdGlvbiBnZXRBbGxDb2lucyhjb25uOiBScGNDbGllbnQsIGFkZHJlc3M6IHN0cmluZyk6IFByb21pc2U8U3VpT2JqZWN0UmVmW10+IHtcbiAgcmV0dXJuIChhd2FpdCBjb25uLmdldENvaW5zKGFkZHJlc3MpKS5kYXRhLm1hcCgodikgPT4ge1xuICAgIHJldHVybiB7XG4gICAgICBkaWdlc3Q6IHYuZGlnZXN0LFxuICAgICAgb2JqZWN0SWQ6IHYuY29pbk9iamVjdElkLFxuICAgICAgdmVyc2lvbjogdi52ZXJzaW9uLFxuICAgIH07XG4gIH0pO1xufVxuXG4vKipcbiAqIEByZXR1cm5zIFRoZSBzdGFrZXMgYXJyYXkgd2l0aCB0aGUgc3Rha2VkU3VpIGFtb3VudCByZWR1Y2VkIGJ5IGFtb3VudC4gSWYgYW1vdW50IGlzIHVuZGVmaW5lZCwgdGhlIHN0YWtlZFN1aSBpcyByZW1vdmVkLlxuICovXG5mdW5jdGlvbiBzdWJ0cmFjdFN0YWtlKHN0YWtlczogU3Rha2VPYmplY3RbXSwgc3Rha2VkU3VpOiBTdGFrZU9iamVjdCwgYW1vdW50OiBudW1iZXIgfCB1bmRlZmluZWQpOiBTdGFrZU9iamVjdFtdIHtcbiAgcmV0dXJuIHN0YWtlcy5mbGF0TWFwKChzKTogU3Rha2VPYmplY3RbXSA9PiB7XG4gICAgaWYgKHMuc3Rha2VkU3VpSWQgPT09IHN0YWtlZFN1aS5zdGFrZWRTdWlJZCkge1xuICAgICAgaWYgKGFtb3VudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vIHJlbW92ZSB0aGUgc3Rha2VcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gcmVkdWNlIHRoZSBzdGFrZSBieSBhbW91bnRcbiAgICAgICAgcmV0dXJuIFt7IC4uLnMsIHByaW5jaXBhbDogTnVtYmVyKHMucHJpbmNpcGFsKSAtIGFtb3VudCB9XTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8ga2VlcCB0aGUgc3Rha2UgdW5jaGFuZ2VkXG4gICAgICByZXR1cm4gW3NdO1xuICAgIH1cbiAgfSk7XG59XG5cbi8qKlxuICogQXNzZXJ0cyB0aGF0IHRoZSBzdGFrZXNBZnRlciBhcnJheSBpcyB0aGUgc2FtZSBhcyB0aGUgc3Rha2VzQmVmb3JlIGFycmF5IHdpdGggdGhlIHN0YWtlZFN1aSBhbW91bnQgcmVkdWNlZCBieSBhbW91bnQuXG4gKi9cbmZ1bmN0aW9uIGFzc2VydFJlZHVjZWRTdGFrZShcbiAgc3Rha2VzQmVmb3JlOiBTdGFrZU9iamVjdFtdLFxuICBzdGFrZXNBZnRlcjogU3Rha2VPYmplY3RbXSxcbiAgc3Rha2VkU3VpOiBTdGFrZU9iamVjdCxcbiAgYW1vdW50OiBudW1iZXIgfCB1bmRlZmluZWRcbikge1xuICAvKlxuICAgKiBOb3JtYWxpemUgdGhlIHN0YWtlIG9iamVjdHMgYnkgY29udmVydGluZyB0aGUgcHJpbmNpcGFsIHRvIGEgbnVtYmVyIGFuZCByZW1vdmluZyB0aGUgZXN0aW1hdGVkUmV3YXJkLlxuICAgKi9cbiAgZnVuY3Rpb24gbm9ybVN0YWtlKHM6IFN0YWtlT2JqZWN0KTogU3Rha2VPYmplY3Qge1xuICAgIHJldHVybiB7IC4uLnMsIHByaW5jaXBhbDogTnVtYmVyKHMucHJpbmNpcGFsKSwgZXN0aW1hdGVkUmV3YXJkOiB1bmRlZmluZWQgfTtcbiAgfVxuICBzdGFrZXNCZWZvcmUgPSBzdGFrZXNCZWZvcmUubWFwKG5vcm1TdGFrZSk7XG4gIHN0YWtlc0FmdGVyID0gc3Rha2VzQWZ0ZXIubWFwKG5vcm1TdGFrZSk7XG4gIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwoc3Rha2VzQWZ0ZXIsIHN1YnRyYWN0U3Rha2Uoc3Rha2VzQmVmb3JlLCBzdGFrZWRTdWksIGFtb3VudCkpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRTdGFrZXMoXG4gIGNvbm46IFJwY0NsaWVudCxcbiAgb3duZXI6IHN0cmluZyxcbiAgcGFyYW1zOiB7XG4gICAgZmlsdGVyU3RhdHVzPzogU3Rha2VPYmplY3RbJ3N0YXR1cyddO1xuICAgIGZpbHRlck1pblZhbHVlPzogbnVtYmVyO1xuICAgIGF0dGVtcHRzPzogbnVtYmVyO1xuICAgIHNsZWVwTXM/OiBudW1iZXI7XG4gIH0gPSB7fVxuKTogUHJvbWlzZTxTdGFrZU9iamVjdFtdPiB7XG4gIGNvbnN0IGFsbCA9IGF3YWl0IGNvbm4uZ2V0U3Rha2VzKG93bmVyKTtcbiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgYWxsLmZsYXRNYXAoKHMpID0+XG4gICAgICBzLnN0YWtlc1xuICAgICAgICAuZmlsdGVyKCh2KSA9PiBwYXJhbXMuZmlsdGVyU3RhdHVzID09PSB1bmRlZmluZWQgfHwgdi5zdGF0dXMgPT09IHBhcmFtcy5maWx0ZXJTdGF0dXMpXG4gICAgICAgIC5maWx0ZXIoKHYpID0+IHBhcmFtcy5maWx0ZXJNaW5WYWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHBhcmFtcy5maWx0ZXJNaW5WYWx1ZSA8PSBOdW1iZXIodi5wcmluY2lwYWwpKVxuICAgIClcbiAgKTtcbiAgaWYgKHJlc3VsdC5sZW5ndGgpIHtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIGNvbnN0IHsgYXR0ZW1wdHMgPSA2MCwgc2xlZXBNcyA9IDEwMDAgfSA9IHBhcmFtcztcbiAgaWYgKDAgPCBhdHRlbXB0cykge1xuICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIHNsZWVwTXMpKTtcbiAgICByZXR1cm4gYXdhaXQgZ2V0U3Rha2VzKGNvbm4sIG93bmVyLCB7IC4uLnBhcmFtcywgYXR0ZW1wdHM6IGF0dGVtcHRzIC0gMSwgc2xlZXBNcyB9KTtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2dldEFsbEFjdGl2ZVN0YWtlZFN1aXM6IG5vIGFjdGl2ZSBzdGFrZWQgc3VpcyBmb3VuZCcpO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlc29sdmVTdGFrZWRTdWkoY29ubjogUnBjQ2xpZW50LCBzdGFrZTogU3Rha2VPYmplY3QpOiBQcm9taXNlPFN1aU9iamVjdFJlZj4ge1xuICByZXR1cm4gKGF3YWl0IGNvbm4uZ2V0T2JqZWN0KHN0YWtlLnN0YWtlZFN1aUlkKSkuZGF0YTtcbn1cblxuZnVuY3Rpb24gZ2V0S2V5UGFpcihzZWVkOiBzdHJpbmcpOiBLZXlQYWlyIHtcbiAgY29uc3Qgc2VlZEJ1ZiA9IGNyZWF0ZUhhc2goJ3NoYTI1NicpLnVwZGF0ZShzZWVkKS5kaWdlc3QoKTtcbiAgcmV0dXJuIG5ldyBLZXlQYWlyKHsgc2VlZDogc2VlZEJ1ZiB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2lnbkFuZFN1Ym1pdChcbiAgY29ubjogUnBjQ2xpZW50LFxuICBrZXlQYWlyOiBLZXlQYWlyLFxuICB0eGI6IFRyYW5zZmVyQnVpbGRlciB8IFN0YWtpbmdCdWlsZGVyIHwgVW5zdGFraW5nQnVpbGRlclxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIHR4Yi5zaWduKHsga2V5OiBrZXlQYWlyLmdldEtleXMoKS5wcnYgfSk7XG4gIGNvbnN0IHR4ID0gKGF3YWl0IHR4Yi5idWlsZCgpKSBhcyBUcmFuc2ZlclRyYW5zYWN0aW9uIHwgU3Rha2luZ1RyYW5zYWN0aW9uIHwgVW5zdGFraW5nVHJhbnNhY3Rpb247XG4gIGRlYnVnKCd0eCcsIHV0aWwuaW5zcGVjdCh0eC5zdWlUcmFuc2FjdGlvbi50eCwgeyBkZXB0aDogMTAgfSkpO1xuICBjb25zdCByZXN1bHQgPSBhd2FpdCBjb25uLmV4ZWN1dGVUcmFuc2FjdGlvbkJsb2NrKHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCksIFtcbiAgICBCdWZmZXIuZnJvbSh0eC5zZXJpYWxpemVkU2lnKS50b1N0cmluZygnYmFzZTY0JyksXG4gIF0pO1xuICBpZiAocmVzdWx0LmVmZmVjdHM/LnN0YXR1cy5zdGF0dXMgIT09ICdzdWNjZXNzJykge1xuICAgIHRocm93IG5ldyBFcnJvcihgVHJhbnNhY3Rpb24gZmFpbGVkOiAke0pTT04uc3RyaW5naWZ5KHJlc3VsdC5lZmZlY3RzPy5zdGF0dXMpfWApO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZ1bmRGcm9tRmF1Y2V0KHVybDogc3RyaW5nLCB2OiBLZXlQYWlyIHwgc3RyaW5nLCBhbW91bnQgPSAxMDBlOSk6IFByb21pc2U8dm9pZD4ge1xuICBpZiAodHlwZW9mIHYgIT09ICdzdHJpbmcnKSB7XG4gICAgdiA9IHYuZ2V0QWRkcmVzcygpO1xuICB9XG4gIGF3YWl0IG5ldyBGYXVjZXQodXJsKS5nZXRDb2lucyh2LCAxMGU5KTtcbn1cblxuZGVzY3JpYmUoJ1N1aSBUcmFuc2FjdGlvbiBUeXBlcycsIGZ1bmN0aW9uICgpIHtcbiAgaWYgKHByb2Nlc3MuZW52LkRST05FKSB7XG4gICAgY29uc29sZS5sb2coJ3NraXBwaW5nIGxvY2FsX2Z1bGxub2RlL3RyYW5zYWN0aW9ucy50cyBvbiBkcm9uZScpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGtleVBhaXIgPSBnZXRLZXlQYWlyKCd0ZXN0Jyk7XG4gIGNvbnN0IGFkZHJlc3MgPSBrZXlQYWlyLmdldEFkZHJlc3MoKTtcbiAgZGVidWcoJ2FkZHJlc3MnLCBhZGRyZXNzKTtcblxuICBjb25zdCBmdWxsbm9kZVVybCA9IHByb2Nlc3MuZW52LlNVSV9GVUxMTk9ERV9VUkwgfHwgJ2h0dHA6Ly8xMjcuMC4wLjE6OTAwMCc7XG4gIGNvbnN0IGZhdWNldFVybCA9IHByb2Nlc3MuZW52LlNVSV9GQVVDRVRfVVJMIHx8ICdodHRwOi8vMTI3LjAuMC4xOjkxMjMnO1xuXG4gIGFzeW5jIGZ1bmN0aW9uIGdldERlZmF1bHRHYXNEYXRhKGtleVBhaXI6IEtleVBhaXIpOiBQcm9taXNlPEdhc0RhdGE+IHtcbiAgICByZXR1cm4ge1xuICAgICAgb3duZXI6IGtleVBhaXIuZ2V0QWRkcmVzcygpLFxuICAgICAgcGF5bWVudDogYXdhaXQgZ2V0QWxsQ29pbnMoY29ubiwga2V5UGFpci5nZXRBZGRyZXNzKCkpLFxuICAgICAgYnVkZ2V0OiAxMDBfMDAwXzAwMCxcbiAgICAgIHByaWNlOiBEVU1NWV9TVUlfR0FTX1BSSUNFLFxuICAgIH07XG4gIH1cblxuICBsZXQgY29ubjogUnBjQ2xpZW50O1xuICBsZXQgdmFsaWRhdG9yOiBzdHJpbmc7XG4gIGJlZm9yZSgnZXN0YWJsaXNoIGNvbm5lY3Rpb24nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgY29ubiA9IGF3YWl0IFJwY0NsaWVudC5jcmVhdGVDaGVja2VkQ29ubmVjdGlvbihmdWxsbm9kZVVybCk7XG4gICAgY29uc3QgeyBhcHlzIH0gPSBhd2FpdCBjb25uLmdldFZhbGlkYXRvcnNBcHkoKTtcbiAgICB2YWxpZGF0b3IgPSBhcHlzWzBdLmFkZHJlc3M7XG4gIH0pO1xuXG4gIGJlZm9yZSgnZnVuZCB2aWEgZmF1Y2V0JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGlmIChmYXVjZXRVcmwpIHtcbiAgICAgIGF3YWl0IGZ1bmRGcm9tRmF1Y2V0KGZhdWNldFVybCwgYWRkcmVzcyk7XG4gICAgfVxuICB9KTtcblxuICBpdCgnaGFzIGNvaW5zJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHsgZGF0YSB9ID0gYXdhaXQgY29ubi5nZXRDb2lucyhhZGRyZXNzKTtcbiAgICBhc3NlcnQubm90U3RyaWN0RXF1YWwoZGF0YS5sZW5ndGgsIDApO1xuICB9KTtcblxuICBpdCgnY2FuIHRyYW5zZmVyIGNvaW5zJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IGJ1aWxkZXIgPSBnZXRCdWlsZGVyRmFjdG9yeSgndHN1aScpLmdldFRyYW5zZmVyQnVpbGRlcigpO1xuICAgIGNvbnN0IHR4YiA9IGJ1aWxkZXJcbiAgICAgIC50eXBlKFN1aVRyYW5zYWN0aW9uVHlwZS5UcmFuc2ZlcilcbiAgICAgIC5zZW5kZXIoYWRkcmVzcylcbiAgICAgIC5zZW5kKFt7IGFkZHJlc3MsIGFtb3VudDogKDExMV8xMTEpLnRvU3RyaW5nKCkgfV0pXG4gICAgICAuZ2FzRGF0YShhd2FpdCBnZXREZWZhdWx0R2FzRGF0YShrZXlQYWlyKSk7XG5cbiAgICBhd2FpdCBzaWduQW5kU3VibWl0KGNvbm4sIGtleVBhaXIsIHR4Yik7XG4gIH0pO1xuXG4gIGFzeW5jIGZ1bmN0aW9uIHN0YWtlQW1vdW50KGtleVBhaXI6IEtleVBhaXIsIGFtb3VudDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgYnVpbGRlciA9IGdldEJ1aWxkZXJGYWN0b3J5KCd0c3VpJykuZ2V0U3Rha2luZ0J1aWxkZXIoKTtcbiAgICBjb25zdCB0eGIgPSBidWlsZGVyXG4gICAgICAudHlwZShTdWlUcmFuc2FjdGlvblR5cGUuQWRkU3Rha2UpXG4gICAgICAuc2VuZGVyKGtleVBhaXIuZ2V0QWRkcmVzcygpKVxuICAgICAgLnN0YWtlKFt7IGFtb3VudCwgdmFsaWRhdG9yQWRkcmVzczogdmFsaWRhdG9yIH1dKVxuICAgICAgLmdhc0RhdGEoYXdhaXQgZ2V0RGVmYXVsdEdhc0RhdGEoa2V5UGFpcikpO1xuXG4gICAgYXdhaXQgc2lnbkFuZFN1Ym1pdChjb25uLCBrZXlQYWlyLCB0eGIpO1xuICB9XG5cbiAgaXQoJ2NhbiBzdGFrZSBjb2lucycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBhd2FpdCBzdGFrZUFtb3VudChrZXlQYWlyLCAxZTkpO1xuICB9KTtcblxuICBmdW5jdGlvbiB0ZXN0VW5zdGFrZShhbW91bnQ6IG51bWJlciB8IHVuZGVmaW5lZCkge1xuICAgIGRlc2NyaWJlKGB1bnN0YWtlIChhbW91bnQ9JHthbW91bnR9KWAsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGtleVBhaXJTdGFrZVRlc3QgPSBnZXRLZXlQYWlyKGBzdGFrZS10ZXN0LWFtb3VudC0ke2Ftb3VudCAhPT0gdW5kZWZpbmVkfWApO1xuICAgICAgY29uc3QgYWRkcmVzcyA9IGtleVBhaXJTdGFrZVRlc3QuZ2V0QWRkcmVzcygpO1xuXG4gICAgICBiZWZvcmUoJ3N0YWtlIGNvaW5zJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBhd2FpdCBmdW5kRnJvbUZhdWNldChmYXVjZXRVcmwsIGFkZHJlc3MpO1xuICAgICAgICBhd2FpdCBzdGFrZUFtb3VudChrZXlQYWlyU3Rha2VUZXN0LCAxMGU5KTtcbiAgICAgIH0pO1xuXG4gICAgICBpdChgY2FuIHVuc3Rha2VgLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IGFjdGl2ZVN0YWtlZFN1aSA9IGF3YWl0IGdldFN0YWtlcyhjb25uLCBhZGRyZXNzLCB7XG4gICAgICAgICAgZmlsdGVyU3RhdHVzOiAnQWN0aXZlJyxcbiAgICAgICAgICBmaWx0ZXJNaW5WYWx1ZTogTUlOX1NUQUtJTkdfVEhSRVNIT0xEICsgKGFtb3VudCB8fCAwKSxcbiAgICAgICAgfSk7XG4gICAgICAgIGFzc2VydChhY3RpdmVTdGFrZWRTdWkubGVuZ3RoID4gMCwgJ05vIHN0YWtlZCBjb2lucyBmb3VuZCcpO1xuXG4gICAgICAgIGZvciAoY29uc3Qgc3Rha2VkU3VpIG9mIGFjdGl2ZVN0YWtlZFN1aS5zbGljZSgwLCAzKSkge1xuICAgICAgICAgIGRlYnVnKCd1bnN0YWtpbmcnLCBzdGFrZWRTdWkpO1xuICAgICAgICAgIGNvbnN0IGJ1aWxkZXIgPSBnZXRCdWlsZGVyRmFjdG9yeSgndHN1aScpLmdldFVuc3Rha2luZ0J1aWxkZXIoKTtcbiAgICAgICAgICBjb25zdCBzdGFrZWRCZWZvcmUgPSBhd2FpdCBnZXRTdGFrZXMoY29ubiwgYWRkcmVzcyk7XG4gICAgICAgICAgY29uc3QgdHhiID0gYnVpbGRlclxuICAgICAgICAgICAgLnR5cGUoU3VpVHJhbnNhY3Rpb25UeXBlLldpdGhkcmF3U3Rha2UpXG4gICAgICAgICAgICAuc2VuZGVyKGFkZHJlc3MpXG4gICAgICAgICAgICAudW5zdGFrZSh7IHN0YWtlZFN1aTogYXdhaXQgcmVzb2x2ZVN0YWtlZFN1aShjb25uLCBzdGFrZWRTdWkpLCBhbW91bnQgfSlcbiAgICAgICAgICAgIC5nYXNEYXRhKGF3YWl0IGdldERlZmF1bHRHYXNEYXRhKGtleVBhaXJTdGFrZVRlc3QpKTtcbiAgICAgICAgICBhd2FpdCBzaWduQW5kU3VibWl0KGNvbm4sIGtleVBhaXJTdGFrZVRlc3QsIHR4Yik7XG5cbiAgICAgICAgICBhc3NlcnRSZWR1Y2VkU3Rha2Uoc3Rha2VkQmVmb3JlLCBhd2FpdCBnZXRTdGFrZXMoY29ubiwgYWRkcmVzcyksIHN0YWtlZFN1aSwgYW1vdW50KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICB0ZXN0VW5zdGFrZSh1bmRlZmluZWQpO1xuICB0ZXN0VW5zdGFrZSgxZTkpO1xufSk7XG4iXX0=
|