@rosen-bridge/minimum-fee 0.1.12 → 0.1.13-672ee610
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/README.md +28 -0
- package/dist/lib/MinimumFeeBox.d.ts +38 -0
- package/dist/lib/MinimumFeeBox.d.ts.map +1 -0
- package/dist/lib/MinimumFeeBox.js +132 -0
- package/dist/lib/MinimumFeeBoxBuilder.d.ts +47 -0
- package/dist/lib/MinimumFeeBoxBuilder.d.ts.map +1 -0
- package/dist/lib/MinimumFeeBoxBuilder.js +149 -0
- package/dist/lib/MinimumFeeConfig.d.ts +23 -0
- package/dist/lib/MinimumFeeConfig.d.ts.map +1 -0
- package/dist/lib/MinimumFeeConfig.js +38 -0
- package/dist/lib/errors.d.ts +16 -0
- package/dist/lib/errors.d.ts.map +1 -0
- package/dist/lib/errors.js +26 -0
- package/dist/lib/handleApiError.d.ts +18 -0
- package/dist/lib/handleApiError.d.ts.map +1 -0
- package/dist/lib/handleApiError.js +35 -0
- package/dist/lib/index.d.ts +5 -2
- package/dist/lib/index.d.ts.map +1 -1
- package/dist/lib/index.js +6 -2
- package/dist/lib/types.d.ts +13 -15
- package/dist/lib/types.d.ts.map +1 -1
- package/dist/lib/types.js +6 -2
- package/dist/tsconfig.build.tsbuildinfo +1 -0
- package/package.json +13 -8
- package/dist/lib/BridgeMinimumFee.d.ts +0 -27
- package/dist/lib/BridgeMinimumFee.d.ts.map +0 -1
- package/dist/lib/BridgeMinimumFee.js +0 -111
- package/dist/lib/consts.d.ts +0 -5
- package/dist/lib/consts.d.ts.map +0 -1
- package/dist/lib/consts.js +0 -5
- package/dist/lib/parser.d.ts +0 -12
- package/dist/lib/parser.d.ts.map +0 -1
- package/dist/lib/parser.js +0 -40
- package/dist/tsconfig.tsbuildinfo +0 -1
package/README.md
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# @rosen-bridge/minimum-fee
|
|
2
|
+
|
|
3
|
+
## Table of contents
|
|
4
|
+
|
|
5
|
+
- [Introduction](#introduction)
|
|
6
|
+
- [Installation](#installation)
|
|
7
|
+
|
|
8
|
+
## Introduction
|
|
9
|
+
|
|
10
|
+
`@rosen-bridge/minimum-fee` Typescript package to build and get minimum fee of the bridge for supported tokens from blockchain
|
|
11
|
+
|
|
12
|
+
## Installation
|
|
13
|
+
|
|
14
|
+
npm:
|
|
15
|
+
|
|
16
|
+
```sh
|
|
17
|
+
npm i @rosen-bridge/minimum-fee
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
yarn:
|
|
21
|
+
|
|
22
|
+
```sh
|
|
23
|
+
yarn add @rosen-bridge/minimum-fee
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
#### Examples
|
|
27
|
+
|
|
28
|
+
**TODO**
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { ErgoBox } from 'ergo-lib-wasm-nodejs';
|
|
2
|
+
import { ErgoNetworkType } from './types';
|
|
3
|
+
import ergoExplorerClientFactory from '@rosen-clients/ergo-explorer';
|
|
4
|
+
import ergoNodeClientFactory from '@rosen-clients/ergo-node';
|
|
5
|
+
import { AbstractLogger } from '@rosen-bridge/logger-interface';
|
|
6
|
+
export declare class MinimumFeeBox {
|
|
7
|
+
protected readonly BOX_FETCHING_PAGE_SIZE = 50;
|
|
8
|
+
protected logger: AbstractLogger;
|
|
9
|
+
protected box: ErgoBox;
|
|
10
|
+
protected tokenId: string;
|
|
11
|
+
protected minimumFeeNFT: string;
|
|
12
|
+
protected address: string;
|
|
13
|
+
protected explorerClient: ReturnType<typeof ergoExplorerClientFactory>;
|
|
14
|
+
protected nodeClient: ReturnType<typeof ergoNodeClientFactory>;
|
|
15
|
+
constructor(tokenId: string, minimumFeeNFT: string, address: string, networkType: ErgoNetworkType, networkUrl: string, logger?: AbstractLogger);
|
|
16
|
+
/**
|
|
17
|
+
* fetches the box from the blockchain
|
|
18
|
+
*/
|
|
19
|
+
fetchBox: () => Promise<void>;
|
|
20
|
+
/**
|
|
21
|
+
* returns fetched box or throws approprite error if found more or none
|
|
22
|
+
* @param eligibleBoxes
|
|
23
|
+
*/
|
|
24
|
+
protected selectEligibleBox: (eligibleBoxes: Array<ErgoBox>) => ErgoBox;
|
|
25
|
+
/**
|
|
26
|
+
* fetches box from the blockchain using explorer client
|
|
27
|
+
*/
|
|
28
|
+
protected fetchBoxUsingExplorer: () => Promise<ErgoBox>;
|
|
29
|
+
/**
|
|
30
|
+
* fetches the box from the blockchain using node client
|
|
31
|
+
*/
|
|
32
|
+
protected fetchBoxUsingNode: () => Promise<ErgoBox>;
|
|
33
|
+
/**
|
|
34
|
+
* returns fetched config box
|
|
35
|
+
*/
|
|
36
|
+
getBox: () => ErgoBox;
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=MinimumFeeBox.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MinimumFeeBox.d.ts","sourceRoot":"","sources":["../../lib/MinimumFeeBox.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAE1C,OAAO,yBAAyB,MAAM,8BAA8B,CAAC;AACrE,OAAO,qBAEN,MAAM,0BAA0B,CAAC;AAGlC,OAAO,EAAE,cAAc,EAAe,MAAM,gCAAgC,CAAC;AAI7E,qBAAa,aAAa;IACxB,SAAS,CAAC,QAAQ,CAAC,sBAAsB,MAAM;IAC/C,SAAS,CAAC,MAAM,EAAE,cAAc,CAAC;IACjC,SAAS,CAAC,GAAG,EAAE,OAAO,CAAC;IACvB,SAAS,CAAC,OAAO,EAAE,MAAM,CAAC;IAC1B,SAAS,CAAC,aAAa,EAAE,MAAM,CAAC;IAChC,SAAS,CAAC,OAAO,EAAE,MAAM,CAAC;IAC1B,SAAS,CAAC,cAAc,EAAE,UAAU,CAAC,OAAO,yBAAyB,CAAC,CAAC;IACvE,SAAS,CAAC,UAAU,EAAE,UAAU,CAAC,OAAO,qBAAqB,CAAC,CAAC;gBAG7D,OAAO,EAAE,MAAM,EACf,aAAa,EAAE,MAAM,EACrB,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,eAAe,EAC5B,UAAU,EAAE,MAAM,EAClB,MAAM,CAAC,EAAE,cAAc;IAWzB;;OAEG;IACH,QAAQ,QAAa,QAAQ,IAAI,CAAC,CAGhC;IAEF;;;OAGG;IACH,SAAS,CAAC,iBAAiB,kBAAmB,MAAM,OAAO,CAAC,KAAG,OAAO,CAyBpE;IAEF;;OAEG;IACH,SAAS,CAAC,qBAAqB,QAAa,QAAQ,OAAO,CAAC,CA+C1D;IAEF;;OAEG;IACH,SAAS,CAAC,iBAAiB,QAAa,QAAQ,OAAO,CAAC,CAyDtD;IAEF;;OAEG;IACH,MAAM,QAAO,OAAO,CAAa;CAClC"}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import { ErgoBox } from 'ergo-lib-wasm-nodejs';
|
|
2
|
+
import { ErgoNetworkType } from './types';
|
|
3
|
+
import { FailedError, NotFoundError } from './errors';
|
|
4
|
+
import ergoExplorerClientFactory from '@rosen-clients/ergo-explorer';
|
|
5
|
+
import ergoNodeClientFactory from '@rosen-clients/ergo-node';
|
|
6
|
+
import JsonBigInt from '@rosen-bridge/json-bigint';
|
|
7
|
+
import handleApiError from './handleApiError';
|
|
8
|
+
import { DummyLogger } from '@rosen-bridge/logger-interface';
|
|
9
|
+
const ERGO_NATIVE_TOKEN = 'erg';
|
|
10
|
+
export class MinimumFeeBox {
|
|
11
|
+
BOX_FETCHING_PAGE_SIZE = 50;
|
|
12
|
+
logger;
|
|
13
|
+
box;
|
|
14
|
+
tokenId;
|
|
15
|
+
minimumFeeNFT;
|
|
16
|
+
address;
|
|
17
|
+
explorerClient;
|
|
18
|
+
nodeClient;
|
|
19
|
+
constructor(tokenId, minimumFeeNFT, address, networkType, networkUrl, logger) {
|
|
20
|
+
this.tokenId = tokenId;
|
|
21
|
+
this.minimumFeeNFT = minimumFeeNFT;
|
|
22
|
+
this.address = address;
|
|
23
|
+
if (networkType === ErgoNetworkType.explorer)
|
|
24
|
+
this.explorerClient = ergoExplorerClientFactory(networkUrl);
|
|
25
|
+
else
|
|
26
|
+
this.nodeClient = ergoNodeClientFactory(networkUrl);
|
|
27
|
+
this.logger = logger ? logger : new DummyLogger();
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* fetches the box from the blockchain
|
|
31
|
+
*/
|
|
32
|
+
fetchBox = async () => {
|
|
33
|
+
if (this.explorerClient)
|
|
34
|
+
this.box = await this.fetchBoxUsingExplorer();
|
|
35
|
+
else
|
|
36
|
+
this.box = await this.fetchBoxUsingNode();
|
|
37
|
+
};
|
|
38
|
+
/**
|
|
39
|
+
* returns fetched box or throws approprite error if found more or none
|
|
40
|
+
* @param eligibleBoxes
|
|
41
|
+
*/
|
|
42
|
+
selectEligibleBox = (eligibleBoxes) => {
|
|
43
|
+
this.logger.debug(`Found [${eligibleBoxes.length}] minimum-fee boxes: ${JsonBigInt.stringify(eligibleBoxes.map((box) => box.to_json()))}`);
|
|
44
|
+
if (eligibleBoxes.length === 0)
|
|
45
|
+
throw new NotFoundError(`Found no minimum-fee box for token [${this.tokenId}] and address [${this.address}]`);
|
|
46
|
+
else if (eligibleBoxes.length > 1)
|
|
47
|
+
throw new FailedError(`Found [${eligibleBoxes.length}] minimum-fee boxes for token [${this.tokenId}] and address [${this.address}]`);
|
|
48
|
+
else {
|
|
49
|
+
this.logger.debug(`Found minimum-fee box [${eligibleBoxes[0]
|
|
50
|
+
.box_id()
|
|
51
|
+
.to_str()}] for token [${this.tokenId}] and address [${this.address}]`);
|
|
52
|
+
return eligibleBoxes[0];
|
|
53
|
+
}
|
|
54
|
+
};
|
|
55
|
+
/**
|
|
56
|
+
* fetches box from the blockchain using explorer client
|
|
57
|
+
*/
|
|
58
|
+
fetchBoxUsingExplorer = async () => {
|
|
59
|
+
const eligibleBoxes = [];
|
|
60
|
+
try {
|
|
61
|
+
let currentPage = 0;
|
|
62
|
+
let boxesPage = await this.explorerClient.v1.getApiV1BoxesUnspentBytokenidP1(this.minimumFeeNFT, {
|
|
63
|
+
offset: currentPage * this.BOX_FETCHING_PAGE_SIZE,
|
|
64
|
+
limit: this.BOX_FETCHING_PAGE_SIZE,
|
|
65
|
+
});
|
|
66
|
+
while (boxesPage.items?.length) {
|
|
67
|
+
this.logger.debug(`requested 'explorerClient.getApiV1BoxesUnspentBytokenidP1' for token [${this.minimumFeeNFT}]. res: ${JsonBigInt.stringify(boxesPage)}`);
|
|
68
|
+
eligibleBoxes.push(...boxesPage.items
|
|
69
|
+
.filter((box) => box.address === this.address && this.tokenId === ERGO_NATIVE_TOKEN
|
|
70
|
+
? box.assets?.length === 1
|
|
71
|
+
: box.assets?.length === 2 &&
|
|
72
|
+
box.assets?.some((asset) => asset.tokenId === this.tokenId))
|
|
73
|
+
.map((box) => ErgoBox.from_json(JsonBigInt.stringify(box))));
|
|
74
|
+
currentPage++;
|
|
75
|
+
boxesPage =
|
|
76
|
+
await this.explorerClient.v1.getApiV1BoxesUnspentBytokenidP1(this.minimumFeeNFT, {
|
|
77
|
+
offset: currentPage * this.BOX_FETCHING_PAGE_SIZE,
|
|
78
|
+
limit: this.BOX_FETCHING_PAGE_SIZE,
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
catch (error) {
|
|
83
|
+
return handleApiError(error, 'Failed to get boxes by token id from Ergo Explorer:');
|
|
84
|
+
}
|
|
85
|
+
return this.selectEligibleBox(eligibleBoxes);
|
|
86
|
+
};
|
|
87
|
+
/**
|
|
88
|
+
* fetches the box from the blockchain using node client
|
|
89
|
+
*/
|
|
90
|
+
fetchBoxUsingNode = async () => {
|
|
91
|
+
const eligibleBoxes = [];
|
|
92
|
+
try {
|
|
93
|
+
const boxHasConfigToken = (box) => box.assets?.some((asset) => asset.tokenId === this.minimumFeeNFT);
|
|
94
|
+
const boxHasAppropriateToken = (box) => this.tokenId === ERGO_NATIVE_TOKEN
|
|
95
|
+
? box.assets?.length === 1
|
|
96
|
+
: box.assets?.length === 2 &&
|
|
97
|
+
box.assets?.some((asset) => asset.tokenId === this.tokenId);
|
|
98
|
+
let currentPage = 0;
|
|
99
|
+
let boxesPage = await this.nodeClient.getBoxesByAddressUnspent(this.address, {
|
|
100
|
+
offset: currentPage * this.BOX_FETCHING_PAGE_SIZE,
|
|
101
|
+
limit: this.BOX_FETCHING_PAGE_SIZE,
|
|
102
|
+
});
|
|
103
|
+
while (boxesPage.length !== 0) {
|
|
104
|
+
this.logger.debug(`requested 'nodeClient.getBoxesByAddressUnspent' for token [${this.minimumFeeNFT}]. res: ${JsonBigInt.stringify(boxesPage)}`);
|
|
105
|
+
eligibleBoxes.push(...boxesPage
|
|
106
|
+
.filter((box) => boxHasConfigToken(box) && boxHasAppropriateToken(box))
|
|
107
|
+
.map((box) => ErgoBox.from_json(JsonBigInt.stringify(box))));
|
|
108
|
+
currentPage++;
|
|
109
|
+
boxesPage = await this.nodeClient.getBoxesByAddressUnspent(this.address, {
|
|
110
|
+
offset: currentPage * this.BOX_FETCHING_PAGE_SIZE,
|
|
111
|
+
limit: this.BOX_FETCHING_PAGE_SIZE,
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
catch (error) {
|
|
116
|
+
const baseError = 'Failed to get boxes by token id from Ergo Node:';
|
|
117
|
+
handleApiError(error, baseError, {
|
|
118
|
+
handleRespondedState: (error) => {
|
|
119
|
+
if (error.response.status === 400)
|
|
120
|
+
return;
|
|
121
|
+
throw new FailedError(`${baseError} [${error.response.status}] ${error.response.data.reason}`);
|
|
122
|
+
},
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
return this.selectEligibleBox(eligibleBoxes);
|
|
126
|
+
};
|
|
127
|
+
/**
|
|
128
|
+
* returns fetched config box
|
|
129
|
+
*/
|
|
130
|
+
getBox = () => this.box;
|
|
131
|
+
}
|
|
132
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWluaW11bUZlZUJveC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL2xpYi9NaW5pbXVtRmVlQm94LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUMvQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQzFDLE9BQU8sRUFBRSxXQUFXLEVBQUUsYUFBYSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ3RELE9BQU8seUJBQXlCLE1BQU0sOEJBQThCLENBQUM7QUFDckUsT0FBTyxxQkFFTixNQUFNLDBCQUEwQixDQUFDO0FBQ2xDLE9BQU8sVUFBVSxNQUFNLDJCQUEyQixDQUFDO0FBQ25ELE9BQU8sY0FBYyxNQUFNLGtCQUFrQixDQUFDO0FBQzlDLE9BQU8sRUFBa0IsV0FBVyxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFFN0UsTUFBTSxpQkFBaUIsR0FBRyxLQUFLLENBQUM7QUFFaEMsTUFBTSxPQUFPLGFBQWE7SUFDTCxzQkFBc0IsR0FBRyxFQUFFLENBQUM7SUFDckMsTUFBTSxDQUFpQjtJQUN2QixHQUFHLENBQVU7SUFDYixPQUFPLENBQVM7SUFDaEIsYUFBYSxDQUFTO0lBQ3RCLE9BQU8sQ0FBUztJQUNoQixjQUFjLENBQStDO0lBQzdELFVBQVUsQ0FBMkM7SUFFL0QsWUFDRSxPQUFlLEVBQ2YsYUFBcUIsRUFDckIsT0FBZSxFQUNmLFdBQTRCLEVBQzVCLFVBQWtCLEVBQ2xCLE1BQXVCO1FBRXZCLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxhQUFhLEdBQUcsYUFBYSxDQUFDO1FBQ25DLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO1FBQ3ZCLElBQUksV0FBVyxLQUFLLGVBQWUsQ0FBQyxRQUFRO1lBQzFDLElBQUksQ0FBQyxjQUFjLEdBQUcseUJBQXlCLENBQUMsVUFBVSxDQUFDLENBQUM7O1lB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QUssRUFBRSxJQUFJLENBQUMsc0JBQXNCO2lCQUNuQyxDQUNGLENBQUM7YUFDSDtTQUNGO1FBQUMsT0FBTyxLQUFLLEVBQUU7WUFDZCxNQUFNLFNBQVMsR0FBRyxpREFBaUQsQ0FBQztZQUNwRSxjQUFjLENBQUMsS0FBSyxFQUFFLFNBQVMsRUFBRTtnQkFDL0Isb0JBQW9CLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRTtvQkFDOUIsSUFBSSxLQUFLLENBQUMsUUFBUSxDQUFDLE1BQU0sS0FBSyxHQUFHO3dCQUFFLE9BQU87b0JBQzFDLE1BQU0sSUFBSSxXQUFXLENBQ25CLEdBQUcsU0FBUyxLQUFLLEtBQUssQ0FBQyxRQUFRLENBQUMsTUFBTSxLQUFLLEtBQUssQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUN4RSxDQUFDO2dCQUNKLENBQUM7YUFDRixDQUFDLENBQUM7U0FDSjtRQUVELE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQy9DLENBQUMsQ0FBQztJQUVGOztPQUVHO0lBQ0gsTUFBTSxHQUFHLEdBQVksRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUM7Q0FDbEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFcmdvQm94IH0gZnJvbSAnZXJnby1saWItd2FzbS1ub2RlanMnO1xuaW1wb3J0IHsgRXJnb05ldHdvcmtUeXBlIH0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyBGYWlsZWRFcnJvciwgTm90Rm91bmRFcnJvciB9IGZyb20gJy4vZXJyb3JzJztcbmltcG9ydCBlcmdvRXhwbG9yZXJDbGllbnRGYWN0b3J5IGZyb20gJ0Byb3Nlbi1jbGllbnRzL2VyZ28tZXhwbG9yZXInO1xuaW1wb3J0IGVyZ29Ob2RlQ2xpZW50RmFjdG9yeSwge1xuICBJbmRleGVkRXJnb0JveCxcbn0gZnJvbSAnQHJvc2VuLWNsaWVudHMvZXJnby1ub2RlJztcbmltcG9ydCBKc29uQmlnSW50IGZyb20gJ0Byb3Nlbi1icmlkZ2UvanNvbi1iaWdpbnQnO1xuaW1wb3J0IGhhbmRsZUFwaUVycm9yIGZyb20gJy4vaGFuZGxlQXBpRXJyb3InO1xuaW1wb3J0IHsgQWJzdHJhY3RMb2dnZXIsIER1bW15TG9nZ2VyIH0gZnJvbSAnQHJvc2VuLWJyaWRnZS9sb2dnZXItaW50ZXJmYWNlJztcblxuY29uc3QgRVJHT19OQVRJVkVfVE9LRU4gPSAnZXJnJztcblxuZXhwb3J0IGNsYXNzIE1pbmltdW1GZWVCb3gge1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgQk9YX0ZFVENISU5HX1BBR0VfU0laRSA9IDUwO1xuICBwcm90ZWN0ZWQgbG9nZ2VyOiBBYnN0cmFjdExvZ2dlcjtcbiAgcHJvdGVjdGVkIGJveDogRXJnb0JveDtcbiAgcHJvdGVjdGVkIHRva2VuSWQ6IHN0cmluZztcbiAgcHJvdGVjdGVkIG1pbmltdW1GZWVORlQ6IHN0cmluZztcbiAgcHJvdGVjdGVkIGFkZHJlc3M6IHN0cmluZztcbiAgcHJvdGVjdGVkIGV4cGxvcmVyQ2xpZW50OiBSZXR1cm5UeXBlPHR5cGVvZiBlcmdvRXhwbG9yZXJDbGllbnRGYWN0b3J5PjtcbiAgcHJvdGVjdGVkIG5vZGVDbGllbnQ6IFJldHVyblR5cGU8dHlwZW9mIGVyZ29Ob2RlQ2xpZW50RmFjdG9yeT47XG5cbiAgY29uc3RydWN0b3IoXG4gICAgdG9rZW5JZDogc3RyaW5nLFxuICAgIG1pbmltdW1GZWVORlQ6IHN0cmluZyxcbiAgICBhZGRyZXNzOiBzdHJpbmcsXG4gICAgbmV0d29ya1R5cGU6IEVyZ29OZXR3b3JrVHlwZSxcbiAgICBuZXR3b3JrVXJsOiBzdHJpbmcsXG4gICAgbG9nZ2VyPzogQWJzdHJhY3RMb2dnZXJcbiAgKSB7XG4gICAgdGhpcy50b2tlbklkID0gdG9rZW5JZDtcbiAgICB0aGlzLm1pbmltdW1GZWVORlQgPSBtaW5pbXVtRmVlTkZUO1xuICAgIHRoaXMuYWRkcmVzcyA9IGFkZHJlc3M7XG4gICAgaWYgKG5ldHdvcmtUeXBlID09PSBFcmdvTmV0d29ya1R5cGUuZXhwbG9yZXIpXG4gICAgICB0aGlzLmV4cGxvcmVyQ2xpZW50ID0gZXJnb0V4cGxvcmVyQ2xpZW50RmFjdG9yeShuZXR3b3JrVXJsKTtcbiAgICBlbHNlIHRoaXMubm9kZUNsaWVudCA9IGVyZ29Ob2RlQ2xpZW50RmFjdG9yeShuZXR3b3JrVXJsKTtcbiAgICB0aGlzLmxvZ2dlciA9IGxvZ2dlciA/IGxvZ2dlciA6IG5ldyBEdW1teUxvZ2dlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIGZldGNoZXMgdGhlIGJveCBmcm9tIHRoZSBibG9ja2NoYWluXG4gICAqL1xuICBmZXRjaEJveCA9IGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICBpZiAodGhpcy5leHBsb3JlckNsaWVudCkgdGhpcy5ib3ggPSBhd2FpdCB0aGlzLmZldGNoQm94VXNpbmdFeHBsb3JlcigpO1xuICAgIGVsc2UgdGhpcy5ib3ggPSBhd2FpdCB0aGlzLmZldGNoQm94VXNpbmdOb2RlKCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIHJldHVybnMgZmV0Y2hlZCBib3ggb3IgdGhyb3dzIGFwcHJvcHJpdGUgZXJyb3IgaWYgZm91bmQgbW9yZSBvciBub25lXG4gICAqIEBwYXJhbSBlbGlnaWJsZUJveGVzXG4gICAqL1xuICBwcm90ZWN0ZWQgc2VsZWN0RWxpZ2libGVCb3ggPSAoZWxpZ2libGVCb3hlczogQXJyYXk8RXJnb0JveD4pOiBFcmdvQm94ID0+IHtcbiAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhcbiAgICAgIGBGb3VuZCBbJHtcbiAgICAgICAgZWxpZ2libGVCb3hlcy5sZW5ndGhcbiAgICAgIH1dIG1pbmltdW0tZmVlIGJveGVzOiAke0pzb25CaWdJbnQuc3RyaW5naWZ5KFxuICAgICAgICBlbGlnaWJsZUJveGVzLm1hcCgoYm94KSA9PiBib3gudG9fanNvbigpKVxuICAgICAgKX1gXG4gICAgKTtcblxuICAgIGlmIChlbGlnaWJsZUJveGVzLmxlbmd0aCA9PT0gMClcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEVycm9yKFxuICAgICAgICBgRm91bmQgbm8gbWluaW11bS1mZWUgYm94IGZvciB0b2tlbiBbJHt0aGlzLnRva2VuSWR9XSBhbmQgYWRkcmVzcyBbJHt0aGlzLmFkZHJlc3N9XWBcbiAgICAgICk7XG4gICAgZWxzZSBpZiAoZWxpZ2libGVCb3hlcy5sZW5ndGggPiAxKVxuICAgICAgdGhyb3cgbmV3IEZhaWxlZEVycm9yKFxuICAgICAgICBgRm91bmQgWyR7ZWxpZ2libGVCb3hlcy5sZW5ndGh9XSBtaW5pbXVtLWZlZSBib3hlcyBmb3IgdG9rZW4gWyR7dGhpcy50b2tlbklkfV0gYW5kIGFkZHJlc3MgWyR7dGhpcy5hZGRyZXNzfV1gXG4gICAgICApO1xuICAgIGVsc2Uge1xuICAgICAgdGhpcy5sb2dnZXIuZGVidWcoXG4gICAgICAgIGBGb3VuZCBtaW5pbXVtLWZlZSBib3ggWyR7ZWxpZ2libGVCb3hlc1swXVxuICAgICAgICAgIC5ib3hfaWQoKVxuICAgICAgICAgIC50b19zdHIoKX1dIGZvciB0b2tlbiBbJHt0aGlzLnRva2VuSWR9XSBhbmQgYWRkcmVzcyBbJHt0aGlzLmFkZHJlc3N9XWBcbiAgICAgICk7XG4gICAgICByZXR1cm4gZWxpZ2libGVCb3hlc1swXTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIGZldGNoZXMgYm94IGZyb20gdGhlIGJsb2NrY2hhaW4gdXNpbmcgZXhwbG9yZXIgY2xpZW50XG4gICAqL1xuICBwcm90ZWN0ZWQgZmV0Y2hCb3hVc2luZ0V4cGxvcmVyID0gYXN5bmMgKCk6IFByb21pc2U8RXJnb0JveD4gPT4ge1xuICAgIGNvbnN0IGVsaWdpYmxlQm94ZXM6IEFycmF5PEVyZ29Cb3g+ID0gW107XG4gICAgdHJ5IHtcbiAgICAgIGxldCBjdXJyZW50UGFnZSA9IDA7XG4gICAgICBsZXQgYm94ZXNQYWdlID1cbiAgICAgICAgYXdhaXQgdGhpcy5leHBsb3JlckNsaWVudC52MS5nZXRBcGlWMUJveGVzVW5zcGVudEJ5dG9rZW5pZFAxKFxuICAgICAgICAgIHRoaXMubWluaW11bUZlZU5GVCxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBvZmZzZXQ6IGN1cnJlbnRQYWdlICogdGhpcy5CT1hfRkVUQ0hJTkdfUEFHRV9TSVpFLFxuICAgICAgICAgICAgbGltaXQ6IHRoaXMuQk9YX0ZFVENISU5HX1BBR0VfU0laRSxcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICB3aGlsZSAoYm94ZXNQYWdlLml0ZW1zPy5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoXG4gICAgICAgICAgYHJlcXVlc3RlZCAnZXhwbG9yZXJDbGllbnQuZ2V0QXBpVjFCb3hlc1Vuc3BlbnRCeXRva2VuaWRQMScgZm9yIHRva2VuIFske1xuICAgICAgICAgICAgdGhpcy5taW5pbXVtRmVlTkZUXG4gICAgICAgICAgfV0uIHJlczogJHtKc29uQmlnSW50LnN0cmluZ2lmeShib3hlc1BhZ2UpfWBcbiAgICAgICAgKTtcblxuICAgICAgICBlbGlnaWJsZUJveGVzLnB1c2goXG4gICAgICAgICAgLi4uYm94ZXNQYWdlLml0ZW1zXG4gICAgICAgICAgICAuZmlsdGVyKChib3gpID0+XG4gICAgICAgICAgICAgIGJveC5hZGRyZXNzID09PSB0aGlzLmFkZHJlc3MgJiYgdGhpcy50b2tlbklkID09PSBFUkdPX05BVElWRV9UT0tFTlxuICAgICAgICAgICAgICAgID8gYm94LmFzc2V0cz8ubGVuZ3RoID09PSAxXG4gICAgICAgICAgICAgICAgOiBib3guYXNzZXRzPy5sZW5ndGggPT09IDIgJiZcbiAgICAgICAgICAgICAgICAgIGJveC5hc3NldHM/LnNvbWUoKGFzc2V0KSA9PiBhc3NldC50b2tlbklkID09PSB0aGlzLnRva2VuSWQpXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAubWFwKChib3g6IGFueSkgPT4gRXJnb0JveC5mcm9tX2pzb24oSnNvbkJpZ0ludC5zdHJpbmdpZnkoYm94KSkpXG4gICAgICAgICk7XG4gICAgICAgIGN1cnJlbnRQYWdlKys7XG4gICAgICAgIGJveGVzUGFnZSA9XG4gICAgICAgICAgYXdhaXQgdGhpcy5leHBsb3JlckNsaWVudC52MS5nZXRBcGlWMUJveGVzVW5zcGVudEJ5dG9rZW5pZFAxKFxuICAgICAgICAgICAgdGhpcy5taW5pbXVtRmVlTkZULFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBvZmZzZXQ6IGN1cnJlbnRQYWdlICogdGhpcy5CT1hfRkVUQ0hJTkdfUEFHRV9TSVpFLFxuICAgICAgICAgICAgICBsaW1pdDogdGhpcy5CT1hfRkVUQ0hJTkdfUEFHRV9TSVpFLFxuICAgICAgICAgICAgfVxuICAgICAgICAgICk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiBoYW5kbGVBcGlFcnJvcihcbiAgICAgICAgZXJyb3IsXG4gICAgICAgICdGYWlsZWQgdG8gZ2V0IGJveGVzIGJ5IHRva2VuIGlkIGZyb20gRXJnbyBFeHBsb3JlcjonXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnNlbGVjdEVsaWdpYmxlQm94KGVsaWdpYmxlQm94ZXMpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBmZXRjaGVzIHRoZSBib3ggZnJvbSB0aGUgYmxvY2tjaGFpbiB1c2luZyBub2RlIGNsaWVudFxuICAgKi9cbiAgcHJvdGVjdGVkIGZldGNoQm94VXNpbmdOb2RlID0gYXN5bmMgKCk6IFByb21pc2U8RXJnb0JveD4gPT4ge1xuICAgIGNvbnN0IGVsaWdpYmxlQm94ZXM6IEFycmF5PEVyZ29Cb3g+ID0gW107XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGJveEhhc0NvbmZpZ1Rva2VuID0gKGJveDogSW5kZXhlZEVyZ29Cb3gpID0+XG4gICAgICAgIGJveC5hc3NldHM/LnNvbWUoKGFzc2V0KSA9PiBhc3NldC50b2tlbklkID09PSB0aGlzLm1pbmltdW1GZWVORlQpO1xuICAgICAgY29uc3QgYm94SGFzQXBwcm9wcmlhdGVUb2tlbiA9IChib3g6IEluZGV4ZWRFcmdvQm94KSA9PlxuICAgICAgICB0aGlzLnRva2VuSWQgPT09IEVSR09fTkFUSVZFX1RPS0VOXG4gICAgICAgICAgPyBib3guYXNzZXRzPy5sZW5ndGggPT09IDFcbiAgICAgICAgICA6IGJveC5hc3NldHM/Lmxlbmd0aCA9PT0gMiAmJlxuICAgICAgICAgICAgYm94LmFzc2V0cz8uc29tZSgoYXNzZXQpID0+IGFzc2V0LnRva2VuSWQgPT09IHRoaXMudG9rZW5JZCk7XG5cbiAgICAgIGxldCBjdXJyZW50UGFnZSA9IDA7XG4gICAgICBsZXQgYm94ZXNQYWdlID0gYXdhaXQgdGhpcy5ub2RlQ2xpZW50LmdldEJveGVzQnlBZGRyZXNzVW5zcGVudChcbiAgICAgICAgdGhpcy5hZGRyZXNzLFxuICAgICAgICB7XG4gICAgICAgICAgb2Zmc2V0OiBjdXJyZW50UGFnZSAqIHRoaXMuQk9YX0ZFVENISU5HX1BBR0VfU0laRSxcbiAgICAgICAgICBsaW1pdDogdGhpcy5CT1hfRkVUQ0hJTkdfUEFHRV9TSVpFLFxuICAgICAgICB9XG4gICAgICApO1xuICAgICAgd2hpbGUgKGJveGVzUGFnZS5sZW5ndGggIT09IDApIHtcbiAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoXG4gICAgICAgICAgYHJlcXVlc3RlZCAnbm9kZUNsaWVudC5nZXRCb3hlc0J5QWRkcmVzc1Vuc3BlbnQnIGZvciB0b2tlbiBbJHtcbiAgICAgICAgICAgIHRoaXMubWluaW11bUZlZU5GVFxuICAgICAgICAgIH1dLiByZXM6ICR7SnNvbkJpZ0ludC5zdHJpbmdpZnkoYm94ZXNQYWdlKX1gXG4gICAgICAgICk7XG5cbiAgICAgICAgZWxpZ2libGVCb3hlcy5wdXNoKFxuICAgICAgICAgIC4uLmJveGVzUGFnZVxuICAgICAgICAgICAgLmZpbHRlcihcbiAgICAgICAgICAgICAgKGJveCkgPT4gYm94SGFzQ29uZmlnVG9rZW4oYm94KSAmJiBib3hIYXNBcHByb3ByaWF0ZVRva2VuKGJveClcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5tYXAoKGJveDogSW5kZXhlZEVyZ29Cb3gpID0+XG4gICAgICAgICAgICAgIEVyZ29Cb3guZnJvbV9qc29uKEpzb25CaWdJbnQuc3RyaW5naWZ5KGJveCkpXG4gICAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICAgIGN1cnJlbnRQYWdlKys7XG4gICAgICAgIGJveGVzUGFnZSA9IGF3YWl0IHRoaXMubm9kZUNsaWVudC5nZXRCb3hlc0J5QWRkcmVzc1Vuc3BlbnQoXG4gICAgICAgICAgdGhpcy5hZGRyZXNzLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG9mZnNldDogY3VycmVudFBhZ2UgKiB0aGlzLkJPWF9GRVRDSElOR19QQUdFX1NJWkUsXG4gICAgICAgICAgICBsaW1pdDogdGhpcy5CT1hfRkVUQ0hJTkdfUEFHRV9TSVpFLFxuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc3QgYmFzZUVycm9yID0gJ0ZhaWxlZCB0byBnZXQgYm94ZXMgYnkgdG9rZW4gaWQgZnJvbSBFcmdvIE5vZGU6JztcbiAgICAgIGhhbmRsZUFwaUVycm9yKGVycm9yLCBiYXNlRXJyb3IsIHtcbiAgICAgICAgaGFuZGxlUmVzcG9uZGVkU3RhdGU6IChlcnJvcikgPT4ge1xuICAgICAgICAgIGlmIChlcnJvci5yZXNwb25zZS5zdGF0dXMgPT09IDQwMCkgcmV0dXJuO1xuICAgICAgICAgIHRocm93IG5ldyBGYWlsZWRFcnJvcihcbiAgICAgICAgICAgIGAke2Jhc2VFcnJvcn0gWyR7ZXJyb3IucmVzcG9uc2Uuc3RhdHVzfV0gJHtlcnJvci5yZXNwb25zZS5kYXRhLnJlYXNvbn1gXG4gICAgICAgICAgKTtcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnNlbGVjdEVsaWdpYmxlQm94KGVsaWdpYmxlQm94ZXMpO1xuICB9O1xuXG4gIC8qKlxuICAgKiByZXR1cm5zIGZldGNoZWQgY29uZmlnIGJveFxuICAgKi9cbiAgZ2V0Qm94ID0gKCk6IEVyZ29Cb3ggPT4gdGhpcy5ib3g7XG59XG4iXX0=
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { BoxValue, ErgoBoxCandidate } from 'ergo-lib-wasm-nodejs';
|
|
2
|
+
import { MinimumFeeConfig } from './MinimumFeeConfig';
|
|
3
|
+
import { Fee } from './types';
|
|
4
|
+
export declare class MinimumFeeBoxBuilder {
|
|
5
|
+
protected fees: Array<Fee>;
|
|
6
|
+
protected boxValue: BoxValue;
|
|
7
|
+
protected boxheight: number;
|
|
8
|
+
protected tokenId: string;
|
|
9
|
+
protected minimumFeeNFT: string;
|
|
10
|
+
protected address: string;
|
|
11
|
+
constructor(minimumFeeNFT: string, address: string);
|
|
12
|
+
/**
|
|
13
|
+
* adds a feeConfig
|
|
14
|
+
* @param feeConfig
|
|
15
|
+
*/
|
|
16
|
+
addConfig: (feeConfig: MinimumFeeConfig) => MinimumFeeBoxBuilder;
|
|
17
|
+
/**
|
|
18
|
+
* removes a config by index
|
|
19
|
+
* @param index
|
|
20
|
+
*/
|
|
21
|
+
removeConfig: (index: number) => MinimumFeeBoxBuilder;
|
|
22
|
+
/**
|
|
23
|
+
* sets ErgoBox Erg value
|
|
24
|
+
* @param nanoErg
|
|
25
|
+
* @returns
|
|
26
|
+
*/
|
|
27
|
+
setValue: (nanoErg: bigint) => MinimumFeeBoxBuilder;
|
|
28
|
+
/**
|
|
29
|
+
* sets ErgoBox creationheight
|
|
30
|
+
* @param currentHeight
|
|
31
|
+
*/
|
|
32
|
+
setHeight: (currentHeight: number) => MinimumFeeBoxBuilder;
|
|
33
|
+
/**
|
|
34
|
+
* sets config token id
|
|
35
|
+
* @param tokenId
|
|
36
|
+
*/
|
|
37
|
+
setToken: (tokenId: string) => MinimumFeeBoxBuilder;
|
|
38
|
+
/**
|
|
39
|
+
* validates some of specified configs
|
|
40
|
+
*/
|
|
41
|
+
protected validate: () => void;
|
|
42
|
+
/**
|
|
43
|
+
* validates specified configs and builds ErgoBoxCandidate of config box using them
|
|
44
|
+
*/
|
|
45
|
+
build: () => ErgoBoxCandidate;
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=MinimumFeeBoxBuilder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MinimumFeeBoxBuilder.d.ts","sourceRoot":"","sources":["../../lib/MinimumFeeBoxBuilder.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,QAAQ,EAOR,gBAAgB,EACjB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,GAAG,EAAE,MAAM,SAAS,CAAC;AAK9B,qBAAa,oBAAoB;IAC/B,SAAS,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;IAC3B,SAAS,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC7B,SAAS,CAAC,SAAS,EAAE,MAAM,CAAC;IAC5B,SAAS,CAAC,OAAO,EAAE,MAAM,CAAC;IAC1B,SAAS,CAAC,aAAa,EAAE,MAAM,CAAC;IAChC,SAAS,CAAC,OAAO,EAAE,MAAM,CAAC;gBAEd,aAAa,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;IAMlD;;;OAGG;IACH,SAAS,cAAe,gBAAgB,KAAG,oBAAoB,CAG7D;IAEF;;;OAGG;IACH,YAAY,UAAW,MAAM,KAAG,oBAAoB,CAGlD;IAEF;;;;OAIG;IACH,QAAQ,YAAa,MAAM,KAAG,oBAAoB,CAGhD;IAEF;;;OAGG;IACH,SAAS,kBAAmB,MAAM,KAAG,oBAAoB,CAGvD;IAEF;;;OAGG;IACH,QAAQ,YAAa,MAAM,KAAG,oBAAoB,CAGhD;IAEF;;OAEG;IACH,SAAS,CAAC,QAAQ,QAAO,IAAI,CA6B3B;IAEF;;OAEG;IACH,KAAK,QAAO,gBAAgB,CAmF1B;CACH"}
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
import { Address, BoxValue, Contract, ErgoBoxCandidateBuilder, I64, TokenAmount, TokenId, Constant, } from 'ergo-lib-wasm-nodejs';
|
|
2
|
+
import { InvalidConfig } from './errors';
|
|
3
|
+
const ERGO_NATIVE_TOKEN = 'erg';
|
|
4
|
+
export class MinimumFeeBoxBuilder {
|
|
5
|
+
fees;
|
|
6
|
+
boxValue;
|
|
7
|
+
boxheight;
|
|
8
|
+
tokenId;
|
|
9
|
+
minimumFeeNFT;
|
|
10
|
+
address;
|
|
11
|
+
constructor(minimumFeeNFT, address) {
|
|
12
|
+
this.fees = [];
|
|
13
|
+
this.minimumFeeNFT = minimumFeeNFT;
|
|
14
|
+
this.address = address;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* adds a feeConfig
|
|
18
|
+
* @param feeConfig
|
|
19
|
+
*/
|
|
20
|
+
addConfig = (feeConfig) => {
|
|
21
|
+
this.fees.push(feeConfig.getConfig());
|
|
22
|
+
return this;
|
|
23
|
+
};
|
|
24
|
+
/**
|
|
25
|
+
* removes a config by index
|
|
26
|
+
* @param index
|
|
27
|
+
*/
|
|
28
|
+
removeConfig = (index) => {
|
|
29
|
+
this.fees.splice(index);
|
|
30
|
+
return this;
|
|
31
|
+
};
|
|
32
|
+
/**
|
|
33
|
+
* sets ErgoBox Erg value
|
|
34
|
+
* @param nanoErg
|
|
35
|
+
* @returns
|
|
36
|
+
*/
|
|
37
|
+
setValue = (nanoErg) => {
|
|
38
|
+
this.boxValue = BoxValue.from_i64(I64.from_str(nanoErg.toString()));
|
|
39
|
+
return this;
|
|
40
|
+
};
|
|
41
|
+
/**
|
|
42
|
+
* sets ErgoBox creationheight
|
|
43
|
+
* @param currentHeight
|
|
44
|
+
*/
|
|
45
|
+
setHeight = (currentHeight) => {
|
|
46
|
+
this.boxheight = currentHeight;
|
|
47
|
+
return this;
|
|
48
|
+
};
|
|
49
|
+
/**
|
|
50
|
+
* sets config token id
|
|
51
|
+
* @param tokenId
|
|
52
|
+
*/
|
|
53
|
+
setToken = (tokenId) => {
|
|
54
|
+
this.tokenId = tokenId;
|
|
55
|
+
return this;
|
|
56
|
+
};
|
|
57
|
+
/**
|
|
58
|
+
* validates some of specified configs
|
|
59
|
+
*/
|
|
60
|
+
validate = () => {
|
|
61
|
+
if (!this.boxValue)
|
|
62
|
+
throw new InvalidConfig(`Box value argument is not defined`);
|
|
63
|
+
if (!this.boxheight)
|
|
64
|
+
throw new InvalidConfig(`Box creation height argument is not defined`);
|
|
65
|
+
if (!this.tokenId)
|
|
66
|
+
throw new InvalidConfig(`Config token id is not defined`);
|
|
67
|
+
if (this.fees.length === 0)
|
|
68
|
+
throw new InvalidConfig(`No config added. Please add at least one config`);
|
|
69
|
+
for (let i = 0; i < this.fees.length - 1; i++) {
|
|
70
|
+
const chains = Object.keys(this.fees[0].heights);
|
|
71
|
+
chains.forEach((chain) => {
|
|
72
|
+
if (!this.fees[i + 1].heights[chain])
|
|
73
|
+
throw new InvalidConfig(`Expected chain [${chain}] at index [${i + 1}]`);
|
|
74
|
+
if (this.fees[i + 1].heights[chain] < this.fees[i].heights[chain])
|
|
75
|
+
throw new InvalidConfig(`All heights for a chain should be ascending. Heights of chain [${chain}] at indexes [${i},${i + 1}] are invalid [${this.fees[i + 1].heights[chain]} < ${this.fees[i].heights[chain]}]`);
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
};
|
|
79
|
+
/**
|
|
80
|
+
* validates specified configs and builds ErgoBoxCandidate of config box using them
|
|
81
|
+
*/
|
|
82
|
+
build = () => {
|
|
83
|
+
this.validate();
|
|
84
|
+
// add box value, address and creation height
|
|
85
|
+
const boxBuilder = new ErgoBoxCandidateBuilder(this.boxValue, Contract.new(Address.from_base58(this.address).to_ergo_tree()), this.boxheight);
|
|
86
|
+
// add box tokens
|
|
87
|
+
boxBuilder.add_token(TokenId.from_str(this.minimumFeeNFT), TokenAmount.from_i64(I64.from_str('1')));
|
|
88
|
+
if (this.tokenId !== ERGO_NATIVE_TOKEN)
|
|
89
|
+
boxBuilder.add_token(TokenId.from_str(this.tokenId), TokenAmount.from_i64(I64.from_str('1')));
|
|
90
|
+
// generate register values
|
|
91
|
+
// extract chains
|
|
92
|
+
const chains = [];
|
|
93
|
+
this.fees.forEach((fee) => {
|
|
94
|
+
Object.keys(fee.heights).forEach((feeChain) => {
|
|
95
|
+
if (!chains.includes(feeChain))
|
|
96
|
+
chains.push(feeChain);
|
|
97
|
+
});
|
|
98
|
+
});
|
|
99
|
+
chains.sort();
|
|
100
|
+
// extract configs
|
|
101
|
+
const heights = [];
|
|
102
|
+
const brdigeFees = [];
|
|
103
|
+
const networkFees = [];
|
|
104
|
+
const rsnRatios = [];
|
|
105
|
+
const feeRatios = [];
|
|
106
|
+
this.fees.forEach((fee) => {
|
|
107
|
+
const heightsConfigs = [];
|
|
108
|
+
const brdigeFeesConfigs = [];
|
|
109
|
+
const networkFeesConfigs = [];
|
|
110
|
+
const rsnRatiosConfigs = [];
|
|
111
|
+
const feeRatiosConfigs = [];
|
|
112
|
+
chains.forEach((chain) => {
|
|
113
|
+
if (Object.hasOwn(fee.heights, chain))
|
|
114
|
+
heightsConfigs.push(fee.heights[chain]);
|
|
115
|
+
else
|
|
116
|
+
heightsConfigs.push(-1);
|
|
117
|
+
if (Object.hasOwn(fee.configs, chain)) {
|
|
118
|
+
brdigeFeesConfigs.push(fee.configs[chain].bridgeFee);
|
|
119
|
+
networkFeesConfigs.push(fee.configs[chain].networkFee);
|
|
120
|
+
rsnRatiosConfigs.push([
|
|
121
|
+
fee.configs[chain].rsnRatio,
|
|
122
|
+
fee.configs[chain].rsnRatioDivisor,
|
|
123
|
+
]);
|
|
124
|
+
feeRatiosConfigs.push(fee.configs[chain].feeRatio);
|
|
125
|
+
}
|
|
126
|
+
else {
|
|
127
|
+
brdigeFeesConfigs.push(-1n);
|
|
128
|
+
networkFeesConfigs.push(-1n);
|
|
129
|
+
rsnRatiosConfigs.push([-1n, -1n]);
|
|
130
|
+
feeRatiosConfigs.push(-1n);
|
|
131
|
+
}
|
|
132
|
+
});
|
|
133
|
+
heights.push(heightsConfigs);
|
|
134
|
+
brdigeFees.push(brdigeFeesConfigs);
|
|
135
|
+
networkFees.push(networkFeesConfigs);
|
|
136
|
+
rsnRatios.push(rsnRatiosConfigs);
|
|
137
|
+
feeRatios.push(feeRatiosConfigs);
|
|
138
|
+
});
|
|
139
|
+
// add box registers
|
|
140
|
+
boxBuilder.set_register_value(4, Constant.from_coll_coll_byte(chains.map((chain) => Buffer.from(chain))));
|
|
141
|
+
boxBuilder.set_register_value(5, Constant.from_js(heights));
|
|
142
|
+
boxBuilder.set_register_value(6, Constant.from_js(brdigeFees));
|
|
143
|
+
boxBuilder.set_register_value(7, Constant.from_js(networkFees));
|
|
144
|
+
boxBuilder.set_register_value(8, Constant.from_js(rsnRatios));
|
|
145
|
+
boxBuilder.set_register_value(9, Constant.from_js(feeRatios));
|
|
146
|
+
return boxBuilder.build();
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWluaW11bUZlZUJveEJ1aWxkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvTWluaW11bUZlZUJveEJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLE9BQU8sRUFDUCxRQUFRLEVBQ1IsUUFBUSxFQUNSLHVCQUF1QixFQUN2QixHQUFHLEVBQ0gsV0FBVyxFQUNYLE9BQU8sRUFDUCxRQUFRLEdBRVQsTUFBTSxzQkFBc0IsQ0FBQztBQUc5QixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBRXpDLE1BQU0saUJBQWlCLEdBQUcsS0FBSyxDQUFDO0FBRWhDLE1BQU0sT0FBTyxvQkFBb0I7SUFDckIsSUFBSSxDQUFhO0lBQ2pCLFFBQVEsQ0FBVztJQUNuQixTQUFTLENBQVM7SUFDbEIsT0FBTyxDQUFTO0lBQ2hCLGFBQWEsQ0FBUztJQUN0QixPQUFPLENBQVM7SUFFMUIsWUFBWSxhQUFxQixFQUFFLE9BQWU7UUFDaEQsSUFBSSxDQUFDLElBQUksR0FBRyxFQUFFLENBQUM7UUFDZixJQUFJLENBQUMsYUFBYSxHQUFHLGFBQWEsQ0FBQztRQUNuQyxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztJQUN6QixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsU0FBUyxHQUFHLENBQUMsU0FBMkIsRUFBd0IsRUFBRTtRQUNoRSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQztRQUN0QyxPQUFPLElBQUksQ0FBQztJQUNkLENBQUMsQ0FBQztJQUVGOzs7T0FHRztJQUNILFlBQVksR0FBRyxDQUFDLEtBQWEsRUFBd0IsRUFBRTtRQUNyRCxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN4QixPQUFPLElBQUksQ0FBQztJQUNkLENBQUMsQ0FBQztJQUVGOzs7O09BSUc7SUFDSCxRQUFRLEdBQUcs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LENBQUM7UUFDOUQsVUFBVSxDQUFDLGtCQUFrQixDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7UUFFOUQsT0FBTyxVQUFVLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDNUIsQ0FBQyxDQUFDO0NBQ0giLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBZGRyZXNzLFxuICBCb3hWYWx1ZSxcbiAgQ29udHJhY3QsXG4gIEVyZ29Cb3hDYW5kaWRhdGVCdWlsZGVyLFxuICBJNjQsXG4gIFRva2VuQW1vdW50LFxuICBUb2tlbklkLFxuICBDb25zdGFudCxcbiAgRXJnb0JveENhbmRpZGF0ZSxcbn0gZnJvbSAnZXJnby1saWItd2FzbS1ub2RlanMnO1xuaW1wb3J0IHsgTWluaW11bUZlZUNvbmZpZyB9IGZyb20gJy4vTWluaW11bUZlZUNvbmZpZyc7XG5pbXBvcnQgeyBGZWUgfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IEludmFsaWRDb25maWcgfSBmcm9tICcuL2Vycm9ycyc7XG5cbmNvbnN0IEVSR09fTkFUSVZFX1RPS0VOID0gJ2VyZyc7XG5cbmV4cG9ydCBjbGFzcyBNaW5pbXVtRmVlQm94QnVpbGRlciB7XG4gIHByb3RlY3RlZCBmZWVzOiBBcnJheTxGZWU+O1xuICBwcm90ZWN0ZWQgYm94VmFsdWU6IEJveFZhbHVlO1xuICBwcm90ZWN0ZWQgYm94aGVpZ2h0OiBudW1iZXI7XG4gIHByb3RlY3RlZCB0b2tlbklkOiBzdHJpbmc7XG4gIHByb3RlY3RlZCBtaW5pbXVtRmVlTkZUOiBzdHJpbmc7XG4gIHByb3RlY3RlZCBhZGRyZXNzOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IobWluaW11bUZlZU5GVDogc3RyaW5nLCBhZGRyZXNzOiBzdHJpbmcpIHtcbiAgICB0aGlzLmZlZXMgPSBbXTtcbiAgICB0aGlzLm1pbmltdW1GZWVORlQgPSBtaW5pbXVtRmVlTkZUO1xuICAgIHRoaXMuYWRkcmVzcyA9IGFkZHJlc3M7XG4gIH1cblxuICAvKipcbiAgICogYWRkcyBhIGZlZUNvbmZpZ1xuICAgKiBAcGFyYW0gZmVlQ29uZmlnXG4gICAqL1xuICBhZGRDb25maWcgPSAoZmVlQ29uZmlnOiBNaW5pbXVtRmVlQ29uZmlnKTogTWluaW11bUZlZUJveEJ1aWxkZXIgPT4ge1xuICAgIHRoaXMuZmVlcy5wdXNoKGZlZUNvbmZpZy5nZXRDb25maWcoKSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgLyoqXG4gICAqIHJlbW92ZXMgYSBjb25maWcgYnkgaW5kZXhcbiAgICogQHBhcmFtIGluZGV4XG4gICAqL1xuICByZW1vdmVDb25maWcgPSAoaW5kZXg6IG51bWJlcik6IE1pbmltdW1GZWVCb3hCdWlsZGVyID0+IHtcbiAgICB0aGlzLmZlZXMuc3BsaWNlKGluZGV4KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICAvKipcbiAgICogc2V0cyBFcmdvQm94IEVyZyB2YWx1ZVxuICAgKiBAcGFyYW0gbmFub0VyZ1xuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgc2V0VmFsdWUgPSAobmFub0VyZzogYmlnaW50KTogTWluaW11bUZlZUJveEJ1aWxkZXIgPT4ge1xuICAgIHRoaXMuYm94VmFsdWUgPSBCb3hWYWx1ZS5mcm9tX2k2NChJNjQuZnJvbV9zdHIobmFub0VyZy50b1N0cmluZygpKSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgLyoqXG4gICAqIHNldHMgRXJnb0JveCBjcmVhdGlvbmhlaWdodFxuICAgKiBAcGFyYW0gY3VycmVudEhlaWdodFxuICAgKi9cbiAgc2V0SGVpZ2h0ID0gKGN1cnJlbnRIZWlnaHQ6IG51bWJlcik6IE1pbmltdW1GZWVCb3hCdWlsZGVyID0+IHtcbiAgICB0aGlzLmJveGhlaWdodCA9IGN1cnJlbnRIZWlnaHQ7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgLyoqXG4gICAqIHNldHMgY29uZmlnIHRva2VuIGlkXG4gICAqIEBwYXJhbSB0b2tlbklkXG4gICAqL1xuICBzZXRUb2tlbiA9ICh0b2tlbklkOiBzdHJpbmcpOiBNaW5pbXVtRmVlQm94QnVpbGRlciA9PiB7XG4gICAgdGhpcy50b2tlbklkID0gdG9rZW5JZDtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICAvKipcbiAgICogdmFsaWRhdGVzIHNvbWUgb2Ygc3BlY2lmaWVkIGNvbmZpZ3NcbiAgICovXG4gIHByb3RlY3RlZCB2YWxpZGF0ZSA9ICgpOiB2b2lkID0+IHtcbiAgICBpZiAoIXRoaXMuYm94VmFsdWUpXG4gICAgICB0aHJvdyBuZXcgSW52YWxpZENvbmZpZyhgQm94IHZhbHVlIGFyZ3VtZW50IGlzIG5vdCBkZWZpbmVkYCk7XG4gICAgaWYgKCF0aGlzLmJveGhlaWdodClcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQ29uZmlnKGBCb3ggY3JlYXRpb24gaGVpZ2h0IGFyZ3VtZW50IGlzIG5vdCBkZWZpbmVkYCk7XG4gICAgaWYgKCF0aGlzLnRva2VuSWQpXG4gICAgICB0aHJvdyBuZXcgSW52YWxpZENvbmZpZyhgQ29uZmlnIHRva2VuIGlkIGlzIG5vdCBkZWZpbmVkYCk7XG4gICAgaWYgKHRoaXMuZmVlcy5sZW5ndGggPT09IDApXG4gICAgICB0aHJvdyBuZXcgSW52YWxpZENvbmZpZyhcbiAgICAgICAgYE5vIGNvbmZpZyBhZGRlZC4gUGxlYXNlIGFkZCBhdCBsZWFzdCBvbmUgY29uZmlnYFxuICAgICAgKTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5mZWVzLmxlbmd0aCAtIDE7IGkrKykge1xuICAgICAgY29uc3QgY2hhaW5zID0gT2JqZWN0LmtleXModGhpcy5mZWVzWzBdLmhlaWdodHMpO1xuICAgICAgY2hhaW5zLmZvckVhY2goKGNoYWluKSA9PiB7XG4gICAgICAgIGlmICghdGhpcy5mZWVzW2kgKyAxXS5oZWlnaHRzW2NoYWluXSlcbiAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZENvbmZpZyhcbiAgICAgICAgICAgIGBFeHBlY3RlZCBjaGFpbiBbJHtjaGFpbn1dIGF0IGluZGV4IFske2kgKyAxfV1gXG4gICAgICAgICAgKTtcbiAgICAgICAgaWYgKHRoaXMuZmVlc1tpICsgMV0uaGVpZ2h0c1tjaGFpbl0gPCB0aGlzLmZlZXNbaV0uaGVpZ2h0c1tjaGFpbl0pXG4gICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRDb25maWcoXG4gICAgICAgICAgICBgQWxsIGhlaWdodHMgZm9yIGEgY2hhaW4gc2hvdWxkIGJlIGFzY2VuZGluZy4gSGVpZ2h0cyBvZiBjaGFpbiBbJHtjaGFpbn1dIGF0IGluZGV4ZXMgWyR7aX0sJHtcbiAgICAgICAgICAgICAgaSArIDFcbiAgICAgICAgICAgIH1dIGFyZSBpbnZhbGlkIFske3RoaXMuZmVlc1tpICsgMV0uaGVpZ2h0c1tjaGFpbl19IDwgJHtcbiAgICAgICAgICAgICAgdGhpcy5mZWVzW2ldLmhlaWdodHNbY2hhaW5dXG4gICAgICAgICAgICB9XWBcbiAgICAgICAgICApO1xuICAgICAgfSk7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiB2YWxpZGF0ZXMgc3BlY2lmaWVkIGNvbmZpZ3MgYW5kIGJ1aWxkcyBFcmdvQm94Q2FuZGlkYXRlIG9mIGNvbmZpZyBib3ggdXNpbmcgdGhlbVxuICAgKi9cbiAgYnVpbGQgPSAoKTogRXJnb0JveENhbmRpZGF0ZSA9PiB7XG4gICAgdGhpcy52YWxpZGF0ZSgpO1xuXG4gICAgLy8gYWRkIGJveCB2YWx1ZSwgYWRkcmVzcyBhbmQgY3JlYXRpb24gaGVpZ2h0XG4gICAgY29uc3QgYm94QnVpbGRlciA9IG5ldyBFcmdvQm94Q2FuZGlkYXRlQnVpbGRlcihcbiAgICAgIHRoaXMuYm94VmFsdWUsXG4gICAgICBDb250cmFjdC5uZXcoQWRkcmVzcy5mcm9tX2Jhc2U1OCh0aGlzLmFkZHJlc3MpLnRvX2VyZ29fdHJlZSgpKSxcbiAgICAgIHRoaXMuYm94aGVpZ2h0XG4gICAgKTtcblxuICAgIC8vIGFkZCBib3ggdG9rZW5zXG4gICAgYm94QnVpbGRlci5hZGRfdG9rZW4oXG4gICAgICBUb2tlbklkLmZyb21fc3RyKHRoaXMubWluaW11bUZlZU5GVCksXG4gICAgICBUb2tlbkFtb3VudC5mcm9tX2k2NChJNjQuZnJvbV9zdHIoJzEnKSlcbiAgICApO1xuICAgIGlmICh0aGlzLnRva2VuSWQgIT09IEVSR09fTkFUSVZFX1RPS0VOKVxuICAgICAgYm94QnVpbGRlci5hZGRfdG9rZW4oXG4gICAgICAgIFRva2VuSWQuZnJvbV9zdHIodGhpcy50b2tlbklkKSxcbiAgICAgICAgVG9rZW5BbW91bnQuZnJvbV9pNjQoSTY0LmZyb21fc3RyKCcxJykpXG4gICAgICApO1xuXG4gICAgLy8gZ2VuZXJhdGUgcmVnaXN0ZXIgdmFsdWVzXG4gICAgLy8gIGV4dHJhY3QgY2hhaW5zXG4gICAgY29uc3QgY2hhaW5zOiBBcnJheTxzdHJpbmc+ID0gW107XG4gICAgdGhpcy5mZWVzLmZvckVhY2goKGZlZSkgPT4ge1xuICAgICAgT2JqZWN0LmtleXMoZmVlLmhlaWdodHMpLmZvckVhY2goKGZlZUNoYWluKSA9PiB7XG4gICAgICAgIGlmICghY2hhaW5zLmluY2x1ZGVzKGZlZUNoYWluKSkgY2hhaW5zLnB1c2goZmVlQ2hhaW4pO1xuICAgICAgfSk7XG4gICAgfSk7XG4gICAgY2hhaW5zLnNvcnQoKTtcbiAgICAvLyAgZXh0cmFjdCBjb25maWdzXG4gICAgY29uc3QgaGVpZ2h0czogQXJyYXk8QXJyYXk8bnVtYmVyPj4gPSBbXTtcbiAgICBjb25zdCBicmRpZ2VGZWVzOiBBcnJheTxBcnJheTxiaWdpbnQ+PiA9IFtdO1xuICAgIGNvbnN0IG5ldHdvcmtGZWVzOiBBcnJheTxBcnJheTxiaWdpbnQ+PiA9IFtdO1xuICAgIGNvbnN0IHJzblJhdGlvczogQXJyYXk8QXJyYXk8QXJyYXk8YmlnaW50Pj4+ID0gW107XG4gICAgY29uc3QgZmVlUmF0aW9zOiBBcnJheTxBcnJheTxiaWdpbnQ+PiA9IFtdO1xuICAgIHRoaXMuZmVlcy5mb3JFYWNoKChmZWUpID0+IHtcbiAgICAgIGNvbnN0IGhlaWdodHNDb25maWdzOiBBcnJheTxudW1iZXI+ID0gW107XG4gICAgICBjb25zdCBicmRpZ2VGZWVzQ29uZmlnczogQXJyYXk8YmlnaW50PiA9IFtdO1xuICAgICAgY29uc3QgbmV0d29ya0ZlZXNDb25maWdzOiBBcnJheTxiaWdpbnQ+ID0gW107XG4gICAgICBjb25zdCByc25SYXRpb3NDb25maWdzOiBBcnJheTxBcnJheTxiaWdpbnQ+PiA9IFtdO1xuICAgICAgY29uc3QgZmVlUmF0aW9zQ29uZmlnczogQXJyYXk8YmlnaW50PiA9IFtdO1xuXG4gICAgICBjaGFpbnMuZm9yRWFjaCgoY2hhaW4pID0+IHtcbiAgICAgICAgaWYgKE9iamVjdC5oYXNPd24oZmVlLmhlaWdodHMsIGNoYWluKSlcbiAgICAgICAgICBoZWlnaHRzQ29uZmlncy5wdXNoKGZlZS5oZWlnaHRzW2NoYWluXSk7XG4gICAgICAgIGVsc2UgaGVpZ2h0c0NvbmZpZ3MucHVzaCgtMSk7XG5cbiAgICAgICAgaWYgKE9iamVjdC5oYXNPd24oZmVlLmNvbmZpZ3MsIGNoYWluKSkge1xuICAgICAgICAgIGJyZGlnZUZlZXNDb25maWdzLnB1c2goZmVlLmNvbmZpZ3NbY2hhaW5dLmJyaWRnZUZlZSk7XG4gICAgICAgICAgbmV0d29ya0ZlZXNDb25maWdzLnB1c2goZmVlLmNvbmZpZ3NbY2hhaW5dLm5ldHdvcmtGZWUpO1xuICAgICAgICAgIHJzblJhdGlvc0NvbmZpZ3MucHVzaChbXG4gICAgICAgICAgICBmZWUuY29uZmlnc1tjaGFpbl0ucnNuUmF0aW8sXG4gICAgICAgICAgICBmZWUuY29uZmlnc1tjaGFpbl0ucnNuUmF0aW9EaXZpc29yLFxuICAgICAgICAgIF0pO1xuICAgICAgICAgIGZlZVJhdGlvc0NvbmZpZ3MucHVzaChmZWUuY29uZmlnc1tjaGFpbl0uZmVlUmF0aW8pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGJyZGlnZUZlZXNDb25maWdzLnB1c2goLTFuKTtcbiAgICAgICAgICBuZXR3b3JrRmVlc0NvbmZpZ3MucHVzaCgtMW4pO1xuICAgICAgICAgIHJzblJhdGlvc0NvbmZpZ3MucHVzaChbLTFuLCAtMW5dKTtcbiAgICAgICAgICBmZWVSYXRpb3NDb25maWdzLnB1c2goLTFuKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGhlaWdodHMucHVzaChoZWlnaHRzQ29uZmlncyk7XG4gICAgICBicmRpZ2VGZWVzLnB1c2goYnJkaWdlRmVlc0NvbmZpZ3MpO1xuICAgICAgbmV0d29ya0ZlZXMucHVzaChuZXR3b3JrRmVlc0NvbmZpZ3MpO1xuICAgICAgcnNuUmF0aW9zLnB1c2gocnNuUmF0aW9zQ29uZmlncyk7XG4gICAgICBmZWVSYXRpb3MucHVzaChmZWVSYXRpb3NDb25maWdzKTtcbiAgICB9KTtcblxuICAgIC8vIGFkZCBib3ggcmVnaXN0ZXJzXG4gICAgYm94QnVpbGRlci5zZXRfcmVnaXN0ZXJfdmFsdWUoXG4gICAgICA0LFxuICAgICAgQ29uc3RhbnQuZnJvbV9jb2xsX2NvbGxfYnl0ZShjaGFpbnMubWFwKChjaGFpbikgPT4gQnVmZmVyLmZyb20oY2hhaW4pKSlcbiAgICApO1xuICAgIGJveEJ1aWxkZXIuc2V0X3JlZ2lzdGVyX3ZhbHVlKDUsIENvbnN0YW50LmZyb21fanMoaGVpZ2h0cykpO1xuICAgIGJveEJ1aWxkZXIuc2V0X3JlZ2lzdGVyX3ZhbHVlKDYsIENvbnN0YW50LmZyb21fanMoYnJkaWdlRmVlcykpO1xuICAgIGJveEJ1aWxkZXIuc2V0X3JlZ2lzdGVyX3ZhbHVlKDcsIENvbnN0YW50LmZyb21fanMobmV0d29ya0ZlZXMpKTtcbiAgICBib3hCdWlsZGVyLnNldF9yZWdpc3Rlcl92YWx1ZSg4LCBDb25zdGFudC5mcm9tX2pzKHJzblJhdGlvcykpO1xuICAgIGJveEJ1aWxkZXIuc2V0X3JlZ2lzdGVyX3ZhbHVlKDksIENvbnN0YW50LmZyb21fanMoZmVlUmF0aW9zKSk7XG5cbiAgICByZXR1cm4gYm94QnVpbGRlci5idWlsZCgpO1xuICB9O1xufVxuIl19
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { ChainFee, Fee } from './types';
|
|
2
|
+
export declare class MinimumFeeConfig {
|
|
3
|
+
protected fee: Fee;
|
|
4
|
+
readonly feeRatioDivisor: bigint;
|
|
5
|
+
constructor();
|
|
6
|
+
/**
|
|
7
|
+
* sets fee for a chain
|
|
8
|
+
* @param chain
|
|
9
|
+
* @param height
|
|
10
|
+
* @param chainFee
|
|
11
|
+
*/
|
|
12
|
+
setChainConfig: (chain: string, height: number, chainFee: ChainFee | undefined) => MinimumFeeConfig;
|
|
13
|
+
/**
|
|
14
|
+
* removes fee for a chain
|
|
15
|
+
* @param chain
|
|
16
|
+
*/
|
|
17
|
+
removeChainConfig: (chain: string) => MinimumFeeConfig;
|
|
18
|
+
/**
|
|
19
|
+
* returns generated fee
|
|
20
|
+
*/
|
|
21
|
+
getConfig: () => Fee;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=MinimumFeeConfig.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MinimumFeeConfig.d.ts","sourceRoot":"","sources":["../../lib/MinimumFeeConfig.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,SAAS,CAAC;AAExC,qBAAa,gBAAgB;IAC3B,SAAS,CAAC,GAAG,EAAE,GAAG,CAAC;IACnB,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAU;;IAS1C;;;;;OAKG;IACH,cAAc,UACL,MAAM,UACL,MAAM,YACJ,QAAQ,GAAG,SAAS,KAC7B,gBAAgB,CAIjB;IAEF;;;OAGG;IACH,iBAAiB,UAAW,MAAM,KAAG,gBAAgB,CAInD;IAEF;;OAEG;IACH,SAAS,QAAO,GAAG,CAEjB;CACH"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
export class MinimumFeeConfig {
|
|
2
|
+
fee;
|
|
3
|
+
feeRatioDivisor = 10000n;
|
|
4
|
+
constructor() {
|
|
5
|
+
this.fee = {
|
|
6
|
+
heights: {},
|
|
7
|
+
configs: {},
|
|
8
|
+
};
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* sets fee for a chain
|
|
12
|
+
* @param chain
|
|
13
|
+
* @param height
|
|
14
|
+
* @param chainFee
|
|
15
|
+
*/
|
|
16
|
+
setChainConfig = (chain, height, chainFee) => {
|
|
17
|
+
this.fee.heights[chain] = height;
|
|
18
|
+
if (chainFee)
|
|
19
|
+
this.fee.configs[chain] = chainFee;
|
|
20
|
+
return this;
|
|
21
|
+
};
|
|
22
|
+
/**
|
|
23
|
+
* removes fee for a chain
|
|
24
|
+
* @param chain
|
|
25
|
+
*/
|
|
26
|
+
removeChainConfig = (chain) => {
|
|
27
|
+
delete this.fee.heights[chain];
|
|
28
|
+
delete this.fee.configs[chain];
|
|
29
|
+
return this;
|
|
30
|
+
};
|
|
31
|
+
/**
|
|
32
|
+
* returns generated fee
|
|
33
|
+
*/
|
|
34
|
+
getConfig = () => {
|
|
35
|
+
return this.fee;
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWluaW11bUZlZUNvbmZpZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL2xpYi9NaW5pbXVtRmVlQ29uZmlnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE1BQU0sT0FBTyxnQkFBZ0I7SUFDakIsR0FBRyxDQUFNO0lBQ1YsZUFBZSxHQUFXLE1BQU0sQ0FBQztJQUUxQztRQUNFLElBQUksQ0FBQyxHQUFHLEdBQUc7WUFDVCxPQUFPLEVBQUUsRUFBRTtZQUNYLE9BQU8sRUFBRSxFQUFFO1NBQ1osQ0FBQztJQUNKLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILGNBQWMsR0FBRyxDQUNmLEtBQWEsRUFDYixNQUFjLEVBQ2QsUUFBOEIsRUFDWixFQUFFO1FBQ3BCLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLE1BQU0sQ0FBQztRQUNqQyxJQUFJLFFBQVE7WUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxRQUFRLENBQUM7UUFDakQsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDLENBQUM7SUFFRjs7O09BR0c7SUFDSCxpQkFBaUIsR0FBRyxDQUFDLEtBQWEsRUFBb0IsRUFBRTtRQUN0RCxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQy9CLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDL0IsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDLENBQUM7SUFFRjs7T0FFRztJQUNILFNBQVMsR0FBRyxHQUFRLEVBQUU7UUFDcEIsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDO0lBQ2xCLENBQUMsQ0FBQztDQUNIIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhaW5GZWUsIEZlZSB9IGZyb20gJy4vdHlwZXMnO1xuXG5leHBvcnQgY2xhc3MgTWluaW11bUZlZUNvbmZpZyB7XG4gIHByb3RlY3RlZCBmZWU6IEZlZTtcbiAgcmVhZG9ubHkgZmVlUmF0aW9EaXZpc29yOiBiaWdpbnQgPSAxMDAwMG47XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5mZWUgPSB7XG4gICAgICBoZWlnaHRzOiB7fSxcbiAgICAgIGNvbmZpZ3M6IHt9LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogc2V0cyBmZWUgZm9yIGEgY2hhaW5cbiAgICogQHBhcmFtIGNoYWluXG4gICAqIEBwYXJhbSBoZWlnaHRcbiAgICogQHBhcmFtIGNoYWluRmVlXG4gICAqL1xuICBzZXRDaGFpbkNvbmZpZyA9IChcbiAgICBjaGFpbjogc3RyaW5nLFxuICAgIGhlaWdodDogbnVtYmVyLFxuICAgIGNoYWluRmVlOiBDaGFpbkZlZSB8IHVuZGVmaW5lZFxuICApOiBNaW5pbXVtRmVlQ29uZmlnID0+IHtcbiAgICB0aGlzLmZlZS5oZWlnaHRzW2NoYWluXSA9IGhlaWdodDtcbiAgICBpZiAoY2hhaW5GZWUpIHRoaXMuZmVlLmNvbmZpZ3NbY2hhaW5dID0gY2hhaW5GZWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgLyoqXG4gICAqIHJlbW92ZXMgZmVlIGZvciBhIGNoYWluXG4gICAqIEBwYXJhbSBjaGFpblxuICAgKi9cbiAgcmVtb3ZlQ2hhaW5Db25maWcgPSAoY2hhaW46IHN0cmluZyk6IE1pbmltdW1GZWVDb25maWcgPT4ge1xuICAgIGRlbGV0ZSB0aGlzLmZlZS5oZWlnaHRzW2NoYWluXTtcbiAgICBkZWxldGUgdGhpcy5mZWUuY29uZmlnc1tjaGFpbl07XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgLyoqXG4gICAqIHJldHVybnMgZ2VuZXJhdGVkIGZlZVxuICAgKi9cbiAgZ2V0Q29uZmlnID0gKCk6IEZlZSA9PiB7XG4gICAgcmV0dXJuIHRoaXMuZmVlO1xuICB9O1xufVxuIl19
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export declare class InvalidConfig extends Error {
|
|
2
|
+
constructor(msg: string);
|
|
3
|
+
}
|
|
4
|
+
export declare class FailedError extends Error {
|
|
5
|
+
constructor(msg: string);
|
|
6
|
+
}
|
|
7
|
+
export declare class NetworkError extends Error {
|
|
8
|
+
constructor(msg: string);
|
|
9
|
+
}
|
|
10
|
+
export declare class UnexpectedApiError extends Error {
|
|
11
|
+
constructor(msg: string);
|
|
12
|
+
}
|
|
13
|
+
export declare class NotFoundError extends Error {
|
|
14
|
+
constructor(msg: string);
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../lib/errors.ts"],"names":[],"mappings":"AAAA,qBAAa,aAAc,SAAQ,KAAK;gBAC1B,GAAG,EAAE,MAAM;CAGxB;AAED,qBAAa,WAAY,SAAQ,KAAK;gBACxB,GAAG,EAAE,MAAM;CAGxB;AAED,qBAAa,YAAa,SAAQ,KAAK;gBACzB,GAAG,EAAE,MAAM;CAGxB;AAED,qBAAa,kBAAmB,SAAQ,KAAK;gBAC/B,GAAG,EAAE,MAAM;CAGxB;AAED,qBAAa,aAAc,SAAQ,KAAK;gBAC1B,GAAG,EAAE,MAAM;CAGxB"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
export class InvalidConfig extends Error {
|
|
2
|
+
constructor(msg) {
|
|
3
|
+
super('InvalidConfig: ' + msg);
|
|
4
|
+
}
|
|
5
|
+
}
|
|
6
|
+
export class FailedError extends Error {
|
|
7
|
+
constructor(msg) {
|
|
8
|
+
super('FailedError: ' + msg);
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
export class NetworkError extends Error {
|
|
12
|
+
constructor(msg) {
|
|
13
|
+
super('NetworkError: ' + msg);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
export class UnexpectedApiError extends Error {
|
|
17
|
+
constructor(msg) {
|
|
18
|
+
super('UnexpectedApiError: ' + msg);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
export class NotFoundError extends Error {
|
|
22
|
+
constructor(msg) {
|
|
23
|
+
super('NotFoundError: ' + msg);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3JzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vbGliL2Vycm9ycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLE9BQU8sYUFBYyxTQUFRLEtBQUs7SUFDdEMsWUFBWSxHQUFXO1FBQ3JCLEtBQUssQ0FBQyxpQkFBaUIsR0FBRyxHQUFHLENBQUMsQ0FBQztJQUNqQyxDQUFDO0NBQ0Y7QUFFRCxNQUFNLE9BQU8sV0FBWSxTQUFRLEtBQUs7SUFDcEMsWUFBWSxHQUFXO1FBQ3JCLEtBQUssQ0FBQyxlQUFlLEdBQUcsR0FBRyxDQUFDLENBQUM7SUFDL0IsQ0FBQztDQUNGO0FBRUQsTUFBTSxPQUFPLFlBQWEsU0FBUSxLQUFLO0lBQ3JDLFlBQVksR0FBVztRQUNyQixLQUFLLENBQUMsZ0JBQWdCLEdBQUcsR0FBRyxDQUFDLENBQUM7SUFDaEMsQ0FBQztDQUNGO0FBRUQsTUFBTSxPQUFPLGtCQUFtQixTQUFRLEtBQUs7SUFDM0MsWUFBWSxHQUFXO1FBQ3JCLEtBQUssQ0FBQyxzQkFBc0IsR0FBRyxHQUFHLENBQUMsQ0FBQztJQUN0QyxDQUFDO0NBQ0Y7QUFFRCxNQUFNLE9BQU8sYUFBYyxTQUFRLEtBQUs7SUFDdEMsWUFBWSxHQUFXO1FBQ3JCLEtBQUssQ0FBQyxpQkFBaUIsR0FBRyxHQUFHLENBQUMsQ0FBQztJQUNqQyxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgY2xhc3MgSW52YWxpZENvbmZpZyBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IobXNnOiBzdHJpbmcpIHtcbiAgICBzdXBlcignSW52YWxpZENvbmZpZzogJyArIG1zZyk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEZhaWxlZEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3Rvcihtc2c6IHN0cmluZykge1xuICAgIHN1cGVyKCdGYWlsZWRFcnJvcjogJyArIG1zZyk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIE5ldHdvcmtFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IobXNnOiBzdHJpbmcpIHtcbiAgICBzdXBlcignTmV0d29ya0Vycm9yOiAnICsgbXNnKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgVW5leHBlY3RlZEFwaUVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3Rvcihtc2c6IHN0cmluZykge1xuICAgIHN1cGVyKCdVbmV4cGVjdGVkQXBpRXJyb3I6ICcgKyBtc2cpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBOb3RGb3VuZEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3Rvcihtc2c6IHN0cmluZykge1xuICAgIHN1cGVyKCdOb3RGb3VuZEVycm9yOiAnICsgbXNnKTtcbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
interface ErrorHandler<HandlerReturnType> {
|
|
2
|
+
(error: any): HandlerReturnType;
|
|
3
|
+
}
|
|
4
|
+
/**
|
|
5
|
+
* handle an axios api error, considering different kinds of events which may
|
|
6
|
+
* cause it
|
|
7
|
+
* @param error the error object
|
|
8
|
+
* @param baseMessage string to prepend the actual error message
|
|
9
|
+
* @param overrideHandlers an object for overriding how different kinds of error
|
|
10
|
+
* are handled
|
|
11
|
+
*/
|
|
12
|
+
declare const handleApiError: <RespondedStateHandlerReturnType = never, NotRespondedStateHandlerReturnType = never, UnknownStateHandlerReturnType = never>(error: any, baseMessage: string, overrideHandlers?: {
|
|
13
|
+
handleRespondedState?: ErrorHandler<RespondedStateHandlerReturnType> | undefined;
|
|
14
|
+
handleNotRespondedState?: ErrorHandler<NotRespondedStateHandlerReturnType> | undefined;
|
|
15
|
+
handleUnknownState?: ErrorHandler<UnknownStateHandlerReturnType> | undefined;
|
|
16
|
+
} | undefined) => RespondedStateHandlerReturnType | NotRespondedStateHandlerReturnType | UnknownStateHandlerReturnType;
|
|
17
|
+
export default handleApiError;
|
|
18
|
+
//# sourceMappingURL=handleApiError.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handleApiError.d.ts","sourceRoot":"","sources":["../../lib/handleApiError.ts"],"names":[],"mappings":"AAEA,UAAU,YAAY,CAAC,iBAAiB;IACtC,CAAC,KAAK,EAAE,GAAG,GAAG,iBAAiB,CAAC;CACjC;AAED;;;;;;;GAOG;AACH,QAAA,MAAM,cAAc,sIAKX,GAAG,eACG,MAAM;;;;sHAoCpB,CAAC;AAEF,eAAe,cAAc,CAAC"}
|