@ritbit/v4-client-js 2.5.0 → 2.5.1
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/build/cjs/src/clients/composite-client.js +21 -15
- package/build/cjs/src/clients/helpers/asset-registry.js +90 -0
- package/build/cjs/src/clients/helpers/collateral.js +69 -0
- package/build/cjs/src/clients/modules/get.js +22 -1
- package/build/cjs/src/clients/modules/proto-includes.js +3 -2
- package/build/cjs/src/clients/validator-client.js +42 -1
- package/build/cjs/src/index.js +4 -1
- package/build/cjs/src/lib/validation.js +10 -5
- package/build/cjs/tsconfig.cjs.tsbuildinfo +1 -1
- package/build/esm/node_modules/@ritbit/v4-proto/src/codegen/ritbit/assets/query.d.ts.map +1 -1
- package/build/esm/src/clients/composite-client.d.ts +12 -7
- package/build/esm/src/clients/composite-client.d.ts.map +1 -1
- package/build/esm/src/clients/composite-client.js +21 -15
- package/build/esm/src/clients/helpers/asset-registry.d.ts +50 -0
- package/build/esm/src/clients/helpers/asset-registry.d.ts.map +1 -0
- package/build/esm/src/clients/helpers/asset-registry.js +86 -0
- package/build/esm/src/clients/helpers/collateral.d.ts +41 -0
- package/build/esm/src/clients/helpers/collateral.d.ts.map +1 -0
- package/build/esm/src/clients/helpers/collateral.js +59 -0
- package/build/esm/src/clients/modules/get.d.ts +14 -1
- package/build/esm/src/clients/modules/get.d.ts.map +1 -1
- package/build/esm/src/clients/modules/get.js +23 -2
- package/build/esm/src/clients/modules/proto-includes.d.ts +1 -0
- package/build/esm/src/clients/modules/proto-includes.d.ts.map +1 -1
- package/build/esm/src/clients/modules/proto-includes.js +2 -1
- package/build/esm/src/clients/validator-client.d.ts +17 -0
- package/build/esm/src/clients/validator-client.d.ts.map +1 -1
- package/build/esm/src/clients/validator-client.js +42 -1
- package/build/esm/src/index.d.ts +2 -0
- package/build/esm/src/index.d.ts.map +1 -1
- package/build/esm/src/index.js +4 -1
- package/build/esm/src/lib/validation.d.ts +6 -2
- package/build/esm/src/lib/validation.d.ts.map +1 -1
- package/build/esm/src/lib/validation.js +10 -5
- package/build/esm/tsconfig.esm.tsbuildinfo +1 -1
- package/package.json +1 -1
|
@@ -9,6 +9,8 @@ const tendermint_rpc_1 = require("@cosmjs/tendermint-rpc");
|
|
|
9
9
|
const long_1 = __importDefault(require("long"));
|
|
10
10
|
const protobufjs_1 = __importDefault(require("protobufjs"));
|
|
11
11
|
const constants_1 = require("./constants");
|
|
12
|
+
const asset_registry_1 = require("./helpers/asset-registry");
|
|
13
|
+
const collateral_1 = require("./helpers/collateral");
|
|
12
14
|
const get_1 = require("./modules/get");
|
|
13
15
|
const post_1 = require("./modules/post");
|
|
14
16
|
const tendermintClient_1 = require("./modules/tendermintClient");
|
|
@@ -30,6 +32,11 @@ class ValidatorClient {
|
|
|
30
32
|
return client;
|
|
31
33
|
}
|
|
32
34
|
constructor(config) {
|
|
35
|
+
// On-chain asset registry + oracle prices, fetched at connect for the
|
|
36
|
+
// dual / multi-asset collateral model. Falls back to the canonical
|
|
37
|
+
// USDC + RUB1 set if the chain queries fail at connect.
|
|
38
|
+
this._assetRegistry = asset_registry_1.AssetRegistry.fallback();
|
|
39
|
+
this._priceMap = new Map();
|
|
33
40
|
this.config = config;
|
|
34
41
|
}
|
|
35
42
|
/**
|
|
@@ -48,6 +55,29 @@ class ValidatorClient {
|
|
|
48
55
|
get post() {
|
|
49
56
|
return this._post;
|
|
50
57
|
}
|
|
58
|
+
/**
|
|
59
|
+
* @description The on-chain asset registry (collateral metadata), fetched at connect.
|
|
60
|
+
*/
|
|
61
|
+
get assetRegistry() {
|
|
62
|
+
return this._assetRegistry;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* @description Latest oracle prices by market id, fetched at connect. Used to value
|
|
66
|
+
* non-settle collateral (e.g. RUB1) into USD shards.
|
|
67
|
+
*/
|
|
68
|
+
get priceMap() {
|
|
69
|
+
return this._priceMap;
|
|
70
|
+
}
|
|
71
|
+
/** @description Re-fetch and cache the on-chain asset registry. */
|
|
72
|
+
async refreshAssets() {
|
|
73
|
+
const response = await this.get.getAllAssets();
|
|
74
|
+
this._assetRegistry = asset_registry_1.AssetRegistry.fromAssets(response.asset);
|
|
75
|
+
}
|
|
76
|
+
/** @description Re-fetch and cache oracle prices for all markets. */
|
|
77
|
+
async refreshPrices() {
|
|
78
|
+
const response = await this.get.getAllPrices();
|
|
79
|
+
this._priceMap = (0, collateral_1.buildPriceMap)(response);
|
|
80
|
+
}
|
|
51
81
|
get selectedGasDenom() {
|
|
52
82
|
if (!this._post)
|
|
53
83
|
return undefined;
|
|
@@ -76,7 +106,18 @@ class ValidatorClient {
|
|
|
76
106
|
const queryClient = stargate_1.QueryClient.withExtensions(tendermint37Client, stargate_1.setupTxExtension);
|
|
77
107
|
this._get = new get_1.Get(tendermintClient, queryClient);
|
|
78
108
|
this._post = new post_1.Post(this._get, this.config.chainId, this.config.denoms, this.config.defaultClientMemo, this.config.useTimestampNonce, this.config.timestampNonceOffsetMs);
|
|
109
|
+
// Pull the asset registry + oracle prices from chain (dual/multi-asset
|
|
110
|
+
// collateral). Non-fatal: keep the fallback registry on failure so a
|
|
111
|
+
// transient query error does not block connecting.
|
|
112
|
+
await Promise.all([
|
|
113
|
+
this.refreshAssets().catch((error) => {
|
|
114
|
+
console.warn('ValidatorClient: failed to fetch asset registry, using fallback', error);
|
|
115
|
+
}),
|
|
116
|
+
this.refreshPrices().catch((error) => {
|
|
117
|
+
console.warn('ValidatorClient: failed to fetch oracle prices, using empty price map', error);
|
|
118
|
+
}),
|
|
119
|
+
]);
|
|
79
120
|
}
|
|
80
121
|
}
|
|
81
122
|
exports.ValidatorClient = ValidatorClient;
|
|
82
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
123
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdG9yLWNsaWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jbGllbnRzL3ZhbGlkYXRvci1jbGllbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsK0NBQThFO0FBQzlFLDJEQUE0RDtBQUM1RCxnREFBd0I7QUFDeEIsNERBQWtDO0FBRWxDLDJDQUtxQjtBQUNyQiw2REFBeUQ7QUFDekQscURBQStEO0FBQy9ELHVDQUFvQztBQUNwQyx5Q0FBc0M7QUFDdEMsaUVBQThEO0FBRTlELG9FQUFvRTtBQUNwRSxxRUFBcUU7QUFDckUsd0VBQXdFO0FBQ3hFLGtFQUFrRTtBQUNsRSxvQkFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsY0FBSSxDQUFDO0FBQzFCLG9CQUFRLENBQUMsU0FBUyxFQUFFLENBQUM7QUFFckIsTUFBYSxlQUFlO0lBVTFCOzs7O09BSUc7SUFDSCxNQUFNLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUF1QjtRQUMxQyxNQUFNLE1BQU0sR0FBRyxJQUFJLGVBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUMzQyxNQUFNLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUMxQixPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRUQsWUFBb0IsTUFBdUI7UUFqQjNDLHNFQUFzRTtRQUN0RSxtRUFBbUU7UUFDbkUsd0RBQXdEO1FBQ2hELG1CQUFjLEdBQWtCLDhCQUFhLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDekQsY0FBUyxHQUFhLElBQUksR0FBRyxFQUFFLENBQUM7UUFjdEMsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7SUFDdkIsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxJQUFJLEdBQUc7UUFDTCxPQUFPLElBQUksQ0FBQyxJQUFLLENBQUM7SUFDcEIsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxJQUFJLElBQUk7UUFDTixPQUFPLElBQUksQ0FBQyxLQUFN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
|
package/build/cjs/src/index.js
CHANGED
|
@@ -70,4 +70,7 @@ Object.defineProperty(exports, "encodeJson", { enumerable: true, get: function (
|
|
|
70
70
|
Object.defineProperty(exports, "ByteArrayEncoding", { enumerable: true, get: function () { return helpers_1.ByteArrayEncoding; } });
|
|
71
71
|
var network_optimizer_1 = require("./network_optimizer");
|
|
72
72
|
Object.defineProperty(exports, "NetworkOptimizer", { enumerable: true, get: function () { return network_optimizer_1.NetworkOptimizer; } });
|
|
73
|
-
|
|
73
|
+
// Dual / multi-asset collateral helpers.
|
|
74
|
+
__exportStar(require("./clients/helpers/asset-registry"), exports);
|
|
75
|
+
__exportStar(require("./clients/helpers/collateral"), exports);
|
|
76
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsU0FBUztBQUNULDBDQUF3QjtBQUV4QixxQkFBcUI7QUFDckIseURBQXlDO0FBQ3pDLCtEQUErQztBQUMvQywyRUFBMkQ7QUFDM0QscURBQXFDO0FBQ3JDLCtEQUErQztBQUMvQywrREFBNkQ7QUFBcEQsbUhBQUEsZUFBZSxPQUFBO0FBQ3hCLHlEQUF1RDtBQUE5Qyw2R0FBQSxZQUFZLE9BQUE7QUFDckIsMkRBQXlEO0FBQWhELCtHQUFBLGFBQWEsT0FBQTtBQUN0QiwrREFBd0U7QUFBL0QsNEhBQUEsT0FBTyxPQUFlO0FBQy9CLHVEQUFxRDtBQUE1QywyR0FBQSxXQUFXLE9BQUE7QUFDcEIseURBQXVEO0FBQTlDLDZHQUFBLFlBQVksT0FBQTtBQUNyQixtREFBMEY7QUFBakYsOEdBQUEsY0FBYyxPQUFvQjtBQUFFLDRHQUFBLGNBQWMsT0FBQTtBQUMzRCwrREFBNkQ7QUFBcEQsbUhBQUEsZUFBZSxPQUFBO0FBQ3hCLHlDQUE4RDtBQUFyRCxxR0FBQSxVQUFVLE9BQUE7QUFBRSw0R0FBQSxpQkFBaUIsT0FBQTtBQUN0Qyx5REFBdUQ7QUFBOUMscUhBQUEsZ0JBQWdCLE9BQUE7QUFFekIseUNBQXlDO0FBQ3pDLG1FQUFpRDtBQUNqRCwrREFBNkMifQ==
|
|
@@ -87,17 +87,22 @@ function validateBatchCancelOrderMessage(subaccountNumber, orders) {
|
|
|
87
87
|
}
|
|
88
88
|
/**
|
|
89
89
|
* @describe validateTransferMessage validates that a transfer to place has fields that would be
|
|
90
|
-
* valid on-chain.
|
|
90
|
+
* valid on-chain. The asset is validated against the on-chain asset registry
|
|
91
|
+
* (fetched via `getAllAssets` and exposed as `validatorClient.assetRegistry`), so any
|
|
92
|
+
* registered collateral asset (e.g. USDC id 0, RUB1 id 2) is accepted and unknown
|
|
93
|
+
* asset ids are rejected. Final collateral-eligibility is enforced on-chain (ante).
|
|
91
94
|
*/
|
|
92
|
-
function validateTransferMessage(transfer) {
|
|
95
|
+
function validateTransferMessage(transfer, assetRegistry) {
|
|
93
96
|
if (!verifySubaccountNumber(transfer.sender.number || 0)) {
|
|
94
97
|
return new errors_1.UserError(`senderSubaccountNumber: ${transfer.sender.number || 0} cannot be < 0 or > ${constants_1.MAX_SUBACCOUNT_NUMBER}`);
|
|
95
98
|
}
|
|
96
99
|
if (!verifySubaccountNumber(transfer.recipient.number || 0)) {
|
|
97
100
|
return new errors_1.UserError(`recipientSubaccountNumber: ${transfer.recipient.number || 0} cannot be < 0 or > ${constants_1.MAX_SUBACCOUNT_NUMBER}`);
|
|
98
101
|
}
|
|
99
|
-
|
|
100
|
-
|
|
102
|
+
// The asset must be a registered chain asset (fetched into the registry from
|
|
103
|
+
// getAllAssets). Collateral eligibility itself is enforced on-chain (ante decorator).
|
|
104
|
+
if (assetRegistry.get(transfer.assetId) === undefined) {
|
|
105
|
+
return new errors_1.UserError(`asset id: ${transfer.assetId} is not a registered chain asset`);
|
|
101
106
|
}
|
|
102
107
|
if (transfer.amount.lessThanOrEqual(long_1.default.ZERO)) {
|
|
103
108
|
return new errors_1.UserError(`amount: ${transfer.amount} cannot be <= 0`);
|
|
@@ -147,4 +152,4 @@ function isValidAddress(address) {
|
|
|
147
152
|
// An address is valid if it starts with the BECH32 prefix and is Bech32 format.
|
|
148
153
|
return address.startsWith(constants_1.BECH32_PREFIX + '1') && verifyIsBech32(address) === undefined;
|
|
149
154
|
}
|
|
150
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
155
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvdmFsaWRhdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQWtCQSw4REE0QkM7QUFNRCxnRUFnQ0M7QUFNRCwwRUF1QkM7QUFTRCwwREFnQ0M7QUEwQkQsNENBTUM7QUFFRCwwQ0FFQztBQVlELHdDQUdDO0FBN01ELG1DQUFnQztBQUNoQyxnREFBd0I7QUFFeEIsb0RBQXlGO0FBRXpGLDRDQU0wQjtBQUMxQixxQ0FBcUM7QUFFckM7OztHQUdHO0FBQ0gsU0FBZ0IseUJBQXlCLENBQ3ZDLGdCQUF3QixFQUN4QixLQUFrQjtJQUVsQixJQUFJLENBQUMsb0JBQW9CLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7UUFDMUMsT0FBTyxJQUFJLGtCQUFTLENBQUMsYUFBYSxLQUFLLENBQUMsUUFBUSx3QkFBd0IsQ0FBQyxDQUFDO0lBQzVFLENBQUM7SUFDRCxJQUFJLEtBQUssQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDLGNBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQzlDLE9BQU8sSUFBSSxrQkFBUyxDQUFDLGFBQWEsS0FBSyxDQUFDLFFBQVEsaUJBQWlCLENBQUMsQ0FBQztJQUNyRSxDQUFDO0lBQ0QsSUFBSSxLQUFLLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxjQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUM5QyxPQUFPLElBQUksa0JBQVMsQ0FBQyxhQUFhLEtBQUssQ0FBQyxRQUFRLGlCQUFpQixDQUFDLENBQUM7SUFDckUsQ0FBQztJQUNELElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLENBQUM7UUFDOUMsT0FBTyxJQUFJLGtCQUFTLENBQ2xCLHFCQUFxQixnQkFBZ0IsdUJBQXVCLGlDQUFxQixFQUFFLENBQ3BGLENBQUM7SUFDSixDQUFDO0lBQ0QsSUFBSSxDQUFD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
|