@ritbit/v4-client-js 2.1.0 → 2.1.2
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/__tests__/lib/helpers.test.ts +2 -0
- package/build/cjs/__tests__/clients/composite-client.test.js +130 -0
- package/build/cjs/__tests__/helpers/baseClients.js +29 -0
- package/build/cjs/__tests__/helpers/constants.js +110 -0
- package/build/cjs/__tests__/lib/helpers.test.js +46 -0
- package/build/cjs/__tests__/lib/util.test.js +67 -0
- package/build/cjs/__tests__/lib/validation.test.js +254 -0
- package/build/cjs/__tests__/modules/client/AccountEndpoints.test.js +171 -0
- package/build/cjs/__tests__/modules/client/FaucetEndpoint.test.js +15 -0
- package/build/cjs/__tests__/modules/client/MarketsEndpoints.test.js +69 -0
- package/build/cjs/__tests__/modules/client/Transfers.test.js +44 -0
- package/build/cjs/__tests__/modules/client/UtilityEndpoints.test.js +28 -0
- package/build/cjs/__tests__/modules/client/ValidatorGetEndpoints.test.js +46 -0
- package/build/cjs/__tests__/modules/client/ValidatorPostEndpoints.test.js +53 -0
- package/build/cjs/__tests__/modules/client/constants.js +7 -0
- package/build/cjs/__tests__/modules/onboarding.test.js +50 -0
- package/build/cjs/examples/account_endpoints.js +129 -0
- package/build/cjs/examples/batch_cancel_orders_example.js +93 -0
- package/build/cjs/examples/composite_example.js +50 -0
- package/build/cjs/examples/constants.js +35 -0
- package/build/cjs/examples/faucet_endpoint.js +23 -0
- package/build/cjs/examples/gov_add_new_market.js +77 -0
- package/build/cjs/examples/human_readable_orders.json +86 -0
- package/build/cjs/examples/human_readable_short_term_orders.json +42 -0
- package/build/cjs/examples/json-encoding.js +32 -0
- package/build/cjs/examples/long_term_order_cancel_example.js +63 -0
- package/build/cjs/examples/markets_endpoints.js +134 -0
- package/build/cjs/examples/native_examples.js +112 -0
- package/build/cjs/examples/noble_example.js +88 -0
- package/build/cjs/examples/optimal_node.js +70 -0
- package/build/cjs/examples/permissioned_keys_example.js +104 -0
- package/build/cjs/examples/raw_orders.json +130 -0
- package/build/cjs/examples/short_term_order_cancel_example.js +54 -0
- package/build/cjs/examples/short_term_order_composite_example.js +68 -0
- package/build/cjs/examples/test.js +50 -0
- package/build/cjs/examples/transfer_example_deposit.js +29 -0
- package/build/cjs/examples/transfer_example_send.js +42 -0
- package/build/cjs/examples/transfer_example_subaccount_transfer.js +29 -0
- package/build/cjs/examples/transfer_example_withdraw.js +30 -0
- package/build/cjs/examples/transfer_example_withdraw_other.js +42 -0
- package/build/cjs/examples/utility_endpoints.js +42 -0
- package/build/cjs/examples/validator_get_example.js +158 -0
- package/build/cjs/examples/validator_post_example.js +76 -0
- package/build/cjs/examples/wallet_address.js +22 -0
- package/build/cjs/examples/websocket_example.js +36 -0
- package/build/cjs/examples/websocket_orderbook_example.js +196 -0
- package/build/cjs/{clients → src/clients}/composite-client.js +1 -1
- package/build/cjs/{clients → src/clients}/constants.js +1 -1
- package/build/cjs/{clients → src/clients}/faucet-client.js +1 -1
- package/build/cjs/{clients → src/clients}/helpers/chain-helpers.js +1 -1
- package/build/cjs/src/clients/helpers/request-helpers.js +65 -0
- package/build/cjs/{clients → src/clients}/indexer-client.js +1 -1
- package/build/cjs/{clients → src/clients}/lib/axios/axiosRequest.js +1 -1
- package/build/cjs/{clients → src/clients}/lib/axios/errors.js +1 -1
- package/build/cjs/{clients → src/clients}/lib/axios/index.js +1 -1
- package/build/cjs/{clients → src/clients}/lib/axios/types.js +1 -1
- package/build/cjs/{clients → src/clients}/lib/cctpProto.js +1 -1
- package/build/cjs/{clients → src/clients}/lib/errors.js +1 -1
- package/build/cjs/{clients → src/clients}/lib/registry.js +1 -1
- package/build/cjs/{clients → src/clients}/modules/account.js +1 -1
- package/build/cjs/{clients → src/clients}/modules/composer.js +1 -1
- package/build/cjs/{clients → src/clients}/modules/get.js +1 -1
- package/build/cjs/{clients → src/clients}/modules/local-wallet.js +1 -1
- package/build/cjs/{clients → src/clients}/modules/markets.js +1 -1
- package/build/cjs/{clients → src/clients}/modules/post.js +1 -1
- package/build/cjs/{clients → src/clients}/modules/proto-includes.js +1 -1
- package/build/cjs/{clients → src/clients}/modules/rest.js +1 -1
- package/build/cjs/{clients → src/clients}/modules/signer.js +1 -1
- package/build/cjs/{clients → src/clients}/modules/tendermintClient.js +1 -1
- package/build/cjs/{clients → src/clients}/modules/utility.js +1 -1
- package/build/cjs/{clients → src/clients}/modules/vault.js +1 -1
- package/build/cjs/src/clients/native.js +1330 -0
- package/build/cjs/{clients → src/clients}/noble-client.js +1 -1
- package/build/cjs/{clients → src/clients}/socket-client.js +1 -1
- package/build/cjs/{clients → src/clients}/subaccount.js +1 -1
- package/build/cjs/{clients → src/clients}/types.js +1 -1
- package/build/cjs/{clients → src/clients}/validator-client.js +1 -1
- package/build/cjs/{index.js → src/index.js} +1 -1
- package/build/cjs/{lib → src/lib}/constants.js +1 -1
- package/build/cjs/{lib → src/lib}/errors.js +1 -1
- package/build/cjs/{lib → src/lib}/helpers.js +1 -1
- package/build/cjs/{lib → src/lib}/onboarding.js +1 -1
- package/build/cjs/{lib → src/lib}/trading-key-utils.js +1 -1
- package/build/cjs/{lib → src/lib}/utils.js +1 -1
- package/build/cjs/{lib → src/lib}/validation.js +1 -1
- package/build/cjs/src/network_optimizer.js +96 -0
- package/build/cjs/{types.js → src/types.js} +1 -1
- package/build/cjs/tsconfig.cjs.tsbuildinfo +1 -1
- package/build/esm/__tests__/lib/helpers.test.js +2 -1
- package/build/esm/tsconfig.esm.tsbuildinfo +1 -1
- package/package.json +11 -11
- package/ritbit-v4-client-js-2.1.1.tgz +0 -0
- package/tsconfig.base.json +1 -2
- package/tsconfig.cjs.json +3 -13
- package/tsconfig.eslint.json +1 -4
- package/tsconfig.esm.json +1 -2
- package/build/cjs/clients/helpers/request-helpers.js +0 -65
- package/build/cjs/network_optimizer.js +0 -96
|
@@ -0,0 +1,1330 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
3
|
+
/*
|
|
4
|
+
Native app can call JS functions with primitives.
|
|
5
|
+
*/
|
|
6
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
7
|
+
if (k2 === undefined) k2 = k;
|
|
8
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
9
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
10
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
11
|
+
}
|
|
12
|
+
Object.defineProperty(o, k2, desc);
|
|
13
|
+
}) : (function(o, m, k, k2) {
|
|
14
|
+
if (k2 === undefined) k2 = k;
|
|
15
|
+
o[k2] = m[k];
|
|
16
|
+
}));
|
|
17
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
18
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
19
|
+
}) : function(o, v) {
|
|
20
|
+
o["default"] = v;
|
|
21
|
+
});
|
|
22
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
23
|
+
var ownKeys = function(o) {
|
|
24
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
25
|
+
var ar = [];
|
|
26
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
27
|
+
return ar;
|
|
28
|
+
};
|
|
29
|
+
return ownKeys(o);
|
|
30
|
+
};
|
|
31
|
+
return function (mod) {
|
|
32
|
+
if (mod && mod.__esModule) return mod;
|
|
33
|
+
var result = {};
|
|
34
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
35
|
+
__setModuleDefault(result, mod);
|
|
36
|
+
return result;
|
|
37
|
+
};
|
|
38
|
+
})();
|
|
39
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
40
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
41
|
+
};
|
|
42
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
43
|
+
exports.connectClient = connectClient;
|
|
44
|
+
exports.connectNetwork = connectNetwork;
|
|
45
|
+
exports.connectWallet = connectWallet;
|
|
46
|
+
exports.connect = connect;
|
|
47
|
+
exports.deriveMnemomicFromEthereumSignature = deriveMnemomicFromEthereumSignature;
|
|
48
|
+
exports.getHeight = getHeight;
|
|
49
|
+
exports.getFeeTiers = getFeeTiers;
|
|
50
|
+
exports.getUserFeeTier = getUserFeeTier;
|
|
51
|
+
exports.getEquityTiers = getEquityTiers;
|
|
52
|
+
exports.getPerpetualMarkets = getPerpetualMarkets;
|
|
53
|
+
exports.isWalletConnected = isWalletConnected;
|
|
54
|
+
exports.placeOrder = placeOrder;
|
|
55
|
+
exports.wrappedError = wrappedError;
|
|
56
|
+
exports.cancelOrder = cancelOrder;
|
|
57
|
+
exports.deposit = deposit;
|
|
58
|
+
exports.withdraw = withdraw;
|
|
59
|
+
exports.faucet = faucet;
|
|
60
|
+
exports.withdrawToIBC = withdrawToIBC;
|
|
61
|
+
exports.transferNativeToken = transferNativeToken;
|
|
62
|
+
exports.getAccountBalance = getAccountBalance;
|
|
63
|
+
exports.getAccountBalances = getAccountBalances;
|
|
64
|
+
exports.getUserStats = getUserStats;
|
|
65
|
+
exports.simulateDeposit = simulateDeposit;
|
|
66
|
+
exports.simulateWithdraw = simulateWithdraw;
|
|
67
|
+
exports.simulateTransferNativeToken = simulateTransferNativeToken;
|
|
68
|
+
exports.signRawPlaceOrder = signRawPlaceOrder;
|
|
69
|
+
exports.signPlaceOrder = signPlaceOrder;
|
|
70
|
+
exports.signCancelOrder = signCancelOrder;
|
|
71
|
+
exports.encodeAccountRequestData = encodeAccountRequestData;
|
|
72
|
+
exports.decodeAccountResponseValue = decodeAccountResponseValue;
|
|
73
|
+
exports.getOptimalNode = getOptimalNode;
|
|
74
|
+
exports.getOptimalIndexer = getOptimalIndexer;
|
|
75
|
+
exports.getRewardsParams = getRewardsParams;
|
|
76
|
+
exports.getDelegatorDelegations = getDelegatorDelegations;
|
|
77
|
+
exports.getStakingRewards = getStakingRewards;
|
|
78
|
+
exports.getCurrentUnstaking = getCurrentUnstaking;
|
|
79
|
+
exports.getMarketPrice = getMarketPrice;
|
|
80
|
+
exports.getNobleBalance = getNobleBalance;
|
|
81
|
+
exports.sendNobleIBC = sendNobleIBC;
|
|
82
|
+
exports.withdrawToNobleIBC = withdrawToNobleIBC;
|
|
83
|
+
exports.cctpWithdraw = cctpWithdraw;
|
|
84
|
+
exports.cctpMultiMsgWithdraw = cctpMultiMsgWithdraw;
|
|
85
|
+
exports.getWithdrawalCapacityByDenom = getWithdrawalCapacityByDenom;
|
|
86
|
+
exports.getWithdrawalAndTransferGatingStatus = getWithdrawalAndTransferGatingStatus;
|
|
87
|
+
exports.subaccountTransfer = subaccountTransfer;
|
|
88
|
+
exports.signCompliancePayload = signCompliancePayload;
|
|
89
|
+
exports.signPushNotificationTokenRegistrationPayload = signPushNotificationTokenRegistrationPayload;
|
|
90
|
+
exports.setSelectedGasDenom = setSelectedGasDenom;
|
|
91
|
+
exports.getMegavaultOwnerShares = getMegavaultOwnerShares;
|
|
92
|
+
exports.getMegavaultWithdrawalInfo = getMegavaultWithdrawalInfo;
|
|
93
|
+
exports.depositToMegavault = depositToMegavault;
|
|
94
|
+
exports.withdrawFromMegavault = withdrawFromMegavault;
|
|
95
|
+
exports.getAllPerpMarketFeeDiscounts = getAllPerpMarketFeeDiscounts;
|
|
96
|
+
exports.getAllStakingTiers = getAllStakingTiers;
|
|
97
|
+
exports.getUserStakingTier = getUserStakingTier;
|
|
98
|
+
const crypto_1 = require("@cosmjs/crypto");
|
|
99
|
+
const proto_signing_1 = require("@cosmjs/proto-signing");
|
|
100
|
+
const stargate_1 = require("@cosmjs/stargate");
|
|
101
|
+
const tendermint_rpc_1 = require("@cosmjs/tendermint-rpc");
|
|
102
|
+
const AuthModule = __importStar(require("cosmjs-types/cosmos/auth/v1beta1/query"));
|
|
103
|
+
const long_1 = __importDefault(require("long"));
|
|
104
|
+
const constants_1 = require("../lib/constants");
|
|
105
|
+
const errors_1 = require("../lib/errors");
|
|
106
|
+
const helpers_1 = require("../lib/helpers");
|
|
107
|
+
const onboarding_1 = require("../lib/onboarding");
|
|
108
|
+
const network_optimizer_1 = require("../network_optimizer");
|
|
109
|
+
const composite_client_1 = require("./composite-client");
|
|
110
|
+
const constants_2 = require("./constants");
|
|
111
|
+
const faucet_client_1 = require("./faucet-client");
|
|
112
|
+
const request_helpers_1 = require("./helpers/request-helpers");
|
|
113
|
+
const local_wallet_1 = __importDefault(require("./modules/local-wallet"));
|
|
114
|
+
const noble_client_1 = require("./noble-client");
|
|
115
|
+
const subaccount_1 = require("./subaccount");
|
|
116
|
+
async function connectClient(network) {
|
|
117
|
+
try {
|
|
118
|
+
globalThis.client = await composite_client_1.CompositeClient.connect(network);
|
|
119
|
+
return (0, helpers_1.encodeJson)(network);
|
|
120
|
+
}
|
|
121
|
+
catch (e) {
|
|
122
|
+
return wrappedError(e);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
async function connectNetwork(paramsJSON) {
|
|
126
|
+
try {
|
|
127
|
+
const params = JSON.parse(paramsJSON);
|
|
128
|
+
const { indexerUrl, websocketUrl, validatorUrl, chainId, faucetUrl, nobleValidatorUrl, USDC_DENOM, USDC_DECIMALS, USDC_GAS_DENOM, CHAINTOKEN_DENOM, CHAINTOKEN_DECIMALS, CHAINTOKEN_GAS_DENOM, txnMemo, } = params;
|
|
129
|
+
if (indexerUrl === undefined ||
|
|
130
|
+
websocketUrl === undefined ||
|
|
131
|
+
validatorUrl === undefined ||
|
|
132
|
+
chainId === undefined) {
|
|
133
|
+
throw new errors_1.UserError('Missing required network params');
|
|
134
|
+
}
|
|
135
|
+
if (USDC_DENOM === undefined ||
|
|
136
|
+
USDC_DECIMALS === undefined ||
|
|
137
|
+
CHAINTOKEN_DENOM === undefined ||
|
|
138
|
+
CHAINTOKEN_DECIMALS === undefined) {
|
|
139
|
+
throw new errors_1.UserError('Missing required token params');
|
|
140
|
+
}
|
|
141
|
+
if (txnMemo === undefined) {
|
|
142
|
+
throw new errors_1.UserError('Missing required transaction memo (`txnMemo`)');
|
|
143
|
+
}
|
|
144
|
+
const denomConfig = {
|
|
145
|
+
USDC_DENOM,
|
|
146
|
+
USDC_DECIMALS,
|
|
147
|
+
USDC_GAS_DENOM,
|
|
148
|
+
CHAINTOKEN_DENOM,
|
|
149
|
+
CHAINTOKEN_DECIMALS,
|
|
150
|
+
CHAINTOKEN_GAS_DENOM,
|
|
151
|
+
};
|
|
152
|
+
const indexerConfig = new constants_2.IndexerConfig(indexerUrl, websocketUrl);
|
|
153
|
+
const validatorConfig = new constants_2.ValidatorConfig(validatorUrl, chainId, denomConfig, undefined, txnMemo);
|
|
154
|
+
const config = new constants_2.Network('native', indexerConfig, validatorConfig);
|
|
155
|
+
globalThis.client = await composite_client_1.CompositeClient.connect(config);
|
|
156
|
+
if (faucetUrl !== undefined) {
|
|
157
|
+
globalThis.faucetClient = new faucet_client_1.FaucetClient(faucetUrl);
|
|
158
|
+
}
|
|
159
|
+
else {
|
|
160
|
+
globalThis.faucetClient = null;
|
|
161
|
+
}
|
|
162
|
+
try {
|
|
163
|
+
globalThis.nobleClient = new noble_client_1.NobleClient(nobleValidatorUrl, txnMemo);
|
|
164
|
+
if (globalThis.nobleWallet) {
|
|
165
|
+
await globalThis.nobleClient.connect(globalThis.nobleWallet);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
catch (e) {
|
|
169
|
+
console.error('Failed to connect to noble validator');
|
|
170
|
+
}
|
|
171
|
+
return (0, helpers_1.encodeJson)(config);
|
|
172
|
+
}
|
|
173
|
+
catch (e) {
|
|
174
|
+
return wrappedError(e);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
async function connectWallet(mnemonic) {
|
|
178
|
+
var _a;
|
|
179
|
+
try {
|
|
180
|
+
globalThis.wallet = await local_wallet_1.default.fromMnemonic(mnemonic, constants_1.BECH32_PREFIX);
|
|
181
|
+
globalThis.nobleWallet = await local_wallet_1.default.fromMnemonic(mnemonic, constants_1.NOBLE_BECH32_PREFIX);
|
|
182
|
+
const { privateKey, publicKey } = (0, onboarding_1.deriveHDKeyFromMnemonic)(mnemonic);
|
|
183
|
+
globalThis.hdKey = {
|
|
184
|
+
privateKey,
|
|
185
|
+
publicKey,
|
|
186
|
+
};
|
|
187
|
+
try {
|
|
188
|
+
await ((_a = globalThis.nobleClient) === null || _a === void 0 ? void 0 : _a.connect(globalThis.nobleWallet));
|
|
189
|
+
}
|
|
190
|
+
catch (e) {
|
|
191
|
+
console.error('Failed to connect to noble validator');
|
|
192
|
+
}
|
|
193
|
+
const address = globalThis.wallet.address;
|
|
194
|
+
return (0, helpers_1.encodeJson)({ address });
|
|
195
|
+
}
|
|
196
|
+
catch (e) {
|
|
197
|
+
return wrappedError(e);
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
async function connect(network, mnemonic) {
|
|
201
|
+
try {
|
|
202
|
+
await connectClient(network);
|
|
203
|
+
return connectWallet(mnemonic);
|
|
204
|
+
}
|
|
205
|
+
catch (e) {
|
|
206
|
+
return wrappedError(e);
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
async function deriveMnemomicFromEthereumSignature(signature) {
|
|
210
|
+
try {
|
|
211
|
+
const { mnemonic, privateKey, publicKey } = (0, onboarding_1.deriveHDKeyFromEthereumSignature)(signature);
|
|
212
|
+
const wallet = await local_wallet_1.default.fromMnemonic(mnemonic, constants_1.BECH32_PREFIX);
|
|
213
|
+
globalThis.hdKey = {
|
|
214
|
+
privateKey,
|
|
215
|
+
publicKey,
|
|
216
|
+
};
|
|
217
|
+
const result = { mnemonic, address: wallet.address };
|
|
218
|
+
return new Promise((resolve) => {
|
|
219
|
+
resolve((0, helpers_1.encodeJson)(result));
|
|
220
|
+
});
|
|
221
|
+
}
|
|
222
|
+
catch (e) {
|
|
223
|
+
return wrappedError(e);
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
async function getHeight() {
|
|
227
|
+
var _a;
|
|
228
|
+
try {
|
|
229
|
+
const client = globalThis.client;
|
|
230
|
+
if (client === undefined) {
|
|
231
|
+
throw new errors_1.UserError('client is not connected. Call connectClient() first');
|
|
232
|
+
}
|
|
233
|
+
const block = await ((_a = globalThis.client) === null || _a === void 0 ? void 0 : _a.validatorClient.get.latestBlock());
|
|
234
|
+
return (0, helpers_1.encodeJson)(block);
|
|
235
|
+
}
|
|
236
|
+
catch (e) {
|
|
237
|
+
return wrappedError(e);
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
async function getFeeTiers() {
|
|
241
|
+
var _a;
|
|
242
|
+
try {
|
|
243
|
+
const client = globalThis.client;
|
|
244
|
+
if (client === undefined) {
|
|
245
|
+
throw new errors_1.UserError('client is not connected. Call connectClient() first');
|
|
246
|
+
}
|
|
247
|
+
const feeTiers = await ((_a = globalThis.client) === null || _a === void 0 ? void 0 : _a.validatorClient.get.getFeeTiers());
|
|
248
|
+
return (0, helpers_1.encodeJson)(feeTiers);
|
|
249
|
+
}
|
|
250
|
+
catch (e) {
|
|
251
|
+
return wrappedError(e);
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
async function getUserFeeTier(payload) {
|
|
255
|
+
var _a;
|
|
256
|
+
try {
|
|
257
|
+
const client = globalThis.client;
|
|
258
|
+
if (client === undefined) {
|
|
259
|
+
throw new errors_1.UserError('client is not connected. Call connectClient() first');
|
|
260
|
+
}
|
|
261
|
+
const json = JSON.parse(payload);
|
|
262
|
+
const address = json.address;
|
|
263
|
+
if (address === undefined) {
|
|
264
|
+
throw new errors_1.UserError('address is not set');
|
|
265
|
+
}
|
|
266
|
+
const feeTiers = await ((_a = globalThis.client) === null || _a === void 0 ? void 0 : _a.validatorClient.get.getUserFeeTier(address));
|
|
267
|
+
return (0, helpers_1.encodeJson)(feeTiers);
|
|
268
|
+
}
|
|
269
|
+
catch (e) {
|
|
270
|
+
return wrappedError(e);
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
async function getEquityTiers() {
|
|
274
|
+
var _a;
|
|
275
|
+
try {
|
|
276
|
+
const client = globalThis.client;
|
|
277
|
+
if (client === undefined) {
|
|
278
|
+
throw new errors_1.UserError('client is not connected. Call connectClient() first');
|
|
279
|
+
}
|
|
280
|
+
const equityTiers = await ((_a = globalThis.client) === null || _a === void 0 ? void 0 : _a.validatorClient.get.getEquityTierLimitConfiguration());
|
|
281
|
+
return (0, helpers_1.encodeJson)(equityTiers, helpers_1.ByteArrayEncoding.BIGINT);
|
|
282
|
+
}
|
|
283
|
+
catch (e) {
|
|
284
|
+
return wrappedError(e);
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
async function getPerpetualMarkets() {
|
|
288
|
+
var _a;
|
|
289
|
+
try {
|
|
290
|
+
const client = globalThis.client;
|
|
291
|
+
if (client === undefined) {
|
|
292
|
+
throw new errors_1.UserError('client is not connected. Call connectClient() first');
|
|
293
|
+
}
|
|
294
|
+
const markets = await ((_a = globalThis.client) === null || _a === void 0 ? void 0 : _a.indexerClient.markets.getPerpetualMarkets());
|
|
295
|
+
return (0, helpers_1.encodeJson)(markets);
|
|
296
|
+
}
|
|
297
|
+
catch (e) {
|
|
298
|
+
return wrappedError(e);
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
async function isWalletConnected() {
|
|
302
|
+
try {
|
|
303
|
+
const client = globalThis.client;
|
|
304
|
+
if (client === undefined) {
|
|
305
|
+
throw new errors_1.UserError('client is not connected. Call connectClient() first');
|
|
306
|
+
}
|
|
307
|
+
const wallet = globalThis.wallet;
|
|
308
|
+
if (wallet === undefined) {
|
|
309
|
+
throw new errors_1.UserError('wallet is not set. Call connectWallet() first');
|
|
310
|
+
}
|
|
311
|
+
return await (0, helpers_1.encodeJson)({ result: true });
|
|
312
|
+
}
|
|
313
|
+
catch (e) {
|
|
314
|
+
return wrappedError(e);
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
async function placeOrder(payload) {
|
|
318
|
+
var _a, _b, _c, _d, _e, _f, _g;
|
|
319
|
+
try {
|
|
320
|
+
const client = globalThis.client;
|
|
321
|
+
if (client === undefined) {
|
|
322
|
+
throw new errors_1.UserError('client is not connected. Call connectClient() first');
|
|
323
|
+
}
|
|
324
|
+
const wallet = globalThis.wallet;
|
|
325
|
+
if (wallet === undefined) {
|
|
326
|
+
throw new errors_1.UserError('wallet is not set. Call connectWallet() first');
|
|
327
|
+
}
|
|
328
|
+
const json = JSON.parse(payload);
|
|
329
|
+
const subaccountNumber = json.subaccountNumber;
|
|
330
|
+
if (subaccountNumber === undefined) {
|
|
331
|
+
throw new errors_1.UserError('subaccountNumber is not set');
|
|
332
|
+
}
|
|
333
|
+
const marketId = json.marketId;
|
|
334
|
+
if (marketId === undefined) {
|
|
335
|
+
throw new errors_1.UserError('marketId is not set');
|
|
336
|
+
}
|
|
337
|
+
const type = json.type;
|
|
338
|
+
if (type === undefined) {
|
|
339
|
+
throw new errors_1.UserError('type is not set');
|
|
340
|
+
}
|
|
341
|
+
const side = json.side;
|
|
342
|
+
if (side === undefined) {
|
|
343
|
+
throw new errors_1.UserError('side is not set');
|
|
344
|
+
}
|
|
345
|
+
const price = json.price;
|
|
346
|
+
if (price === undefined) {
|
|
347
|
+
throw new errors_1.UserError('price is not set');
|
|
348
|
+
}
|
|
349
|
+
// trigger_price: number, // not used for MARKET and LIMIT
|
|
350
|
+
const size = json.size;
|
|
351
|
+
if (size === undefined) {
|
|
352
|
+
throw new errors_1.UserError('size is not set');
|
|
353
|
+
}
|
|
354
|
+
const clientId = json.clientId;
|
|
355
|
+
if (clientId === undefined) {
|
|
356
|
+
throw new errors_1.UserError('clientId is not set');
|
|
357
|
+
}
|
|
358
|
+
const timeInForce = json.timeInForce;
|
|
359
|
+
const goodTilTimeInSeconds = (_a = json.goodTilTimeInSeconds) !== null && _a !== void 0 ? _a : 0;
|
|
360
|
+
const goodTilBlock = (_b = json.goodTilBlock) !== null && _b !== void 0 ? _b : undefined;
|
|
361
|
+
const execution = json.execution;
|
|
362
|
+
const postOnly = (_c = json.postOnly) !== null && _c !== void 0 ? _c : false;
|
|
363
|
+
const reduceOnly = (_d = json.reduceOnly) !== null && _d !== void 0 ? _d : false;
|
|
364
|
+
const triggerPrice = (_e = json.triggerPrice) !== null && _e !== void 0 ? _e : undefined;
|
|
365
|
+
const marketInfo = (_f = json.marketInfo) !== null && _f !== void 0 ? _f : undefined;
|
|
366
|
+
const currentHeight = (_g = json.currentHeight) !== null && _g !== void 0 ? _g : undefined;
|
|
367
|
+
const subaccount = subaccount_1.SubaccountInfo.forLocalWallet(wallet, subaccountNumber);
|
|
368
|
+
const tx = await client.placeOrder(subaccount, marketId, type, side, price, size, clientId, timeInForce, goodTilTimeInSeconds, execution, postOnly, reduceOnly, triggerPrice, marketInfo, currentHeight, goodTilBlock);
|
|
369
|
+
return (0, helpers_1.encodeJson)(tx);
|
|
370
|
+
}
|
|
371
|
+
catch (error) {
|
|
372
|
+
return wrappedError(error);
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
function wrappedError(error) {
|
|
376
|
+
const text = JSON.stringify(error, Object.getOwnPropertyNames(error));
|
|
377
|
+
return `{"error": ${text}}`;
|
|
378
|
+
}
|
|
379
|
+
async function cancelOrder(payload) {
|
|
380
|
+
try {
|
|
381
|
+
const client = globalThis.client;
|
|
382
|
+
if (client === undefined) {
|
|
383
|
+
throw new errors_1.UserError('client is not connected. Call connectNetwork() first');
|
|
384
|
+
}
|
|
385
|
+
const wallet = globalThis.wallet;
|
|
386
|
+
if (wallet === undefined) {
|
|
387
|
+
throw new errors_1.UserError('wallet is not set. Call connectWallet() first');
|
|
388
|
+
}
|
|
389
|
+
const json = JSON.parse(payload);
|
|
390
|
+
const subaccountNumber = json.subaccountNumber;
|
|
391
|
+
if (subaccountNumber === undefined) {
|
|
392
|
+
throw new errors_1.UserError('subaccountNumber is not set');
|
|
393
|
+
}
|
|
394
|
+
const clientId = json.clientId;
|
|
395
|
+
if (clientId === undefined) {
|
|
396
|
+
throw new errors_1.UserError('clientId is not set');
|
|
397
|
+
}
|
|
398
|
+
const orderFlags = json.orderFlags;
|
|
399
|
+
if (orderFlags === undefined) {
|
|
400
|
+
throw new errors_1.UserError('orderFlags is not set');
|
|
401
|
+
}
|
|
402
|
+
const clobPairId = json.clobPairId;
|
|
403
|
+
if (clobPairId === undefined) {
|
|
404
|
+
throw new errors_1.UserError('clobPairId is not set');
|
|
405
|
+
}
|
|
406
|
+
const goodTilBlock = json.goodTilBlock;
|
|
407
|
+
const goodTilBlockTime = json.goodTilBlockTime;
|
|
408
|
+
const subaccount = subaccount_1.SubaccountInfo.forLocalWallet(wallet, subaccountNumber);
|
|
409
|
+
const tx = await client.cancelRawOrder(subaccount, clientId, orderFlags, clobPairId, goodTilBlock !== 0 ? goodTilBlock : undefined, goodTilBlockTime !== 0 ? goodTilBlockTime : undefined);
|
|
410
|
+
return (0, helpers_1.encodeJson)(tx);
|
|
411
|
+
}
|
|
412
|
+
catch (error) {
|
|
413
|
+
return wrappedError(error);
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
async function deposit(payload) {
|
|
417
|
+
try {
|
|
418
|
+
const client = globalThis.client;
|
|
419
|
+
if (client === undefined) {
|
|
420
|
+
throw new errors_1.UserError('client is not connected. Call connectNetwork() first');
|
|
421
|
+
}
|
|
422
|
+
const wallet = globalThis.wallet;
|
|
423
|
+
if (wallet === undefined) {
|
|
424
|
+
throw new errors_1.UserError('wallet is not set. Call connectWallet() first');
|
|
425
|
+
}
|
|
426
|
+
const json = JSON.parse(payload);
|
|
427
|
+
const subaccountNumber = json.subaccountNumber;
|
|
428
|
+
if (subaccountNumber === undefined) {
|
|
429
|
+
throw new errors_1.UserError('subaccountNumber is not set');
|
|
430
|
+
}
|
|
431
|
+
const amount = json.amount;
|
|
432
|
+
if (amount === undefined) {
|
|
433
|
+
throw new errors_1.UserError('amount is not set');
|
|
434
|
+
}
|
|
435
|
+
const subaccount = subaccount_1.SubaccountInfo.forLocalWallet(wallet, subaccountNumber);
|
|
436
|
+
const tx = await client.depositToSubaccount(subaccount, amount);
|
|
437
|
+
return (0, helpers_1.encodeJson)(tx);
|
|
438
|
+
}
|
|
439
|
+
catch (error) {
|
|
440
|
+
return wrappedError(error);
|
|
441
|
+
}
|
|
442
|
+
}
|
|
443
|
+
async function withdraw(payload) {
|
|
444
|
+
try {
|
|
445
|
+
const client = globalThis.client;
|
|
446
|
+
if (client === undefined) {
|
|
447
|
+
throw new errors_1.UserError('client is not connected. Call connectNetwork() first');
|
|
448
|
+
}
|
|
449
|
+
const wallet = globalThis.wallet;
|
|
450
|
+
if (wallet === undefined) {
|
|
451
|
+
throw new errors_1.UserError('wallet is not set. Call connectWallet() first');
|
|
452
|
+
}
|
|
453
|
+
const json = JSON.parse(payload);
|
|
454
|
+
const subaccountNumber = json.subaccountNumber;
|
|
455
|
+
if (subaccountNumber === undefined) {
|
|
456
|
+
throw new errors_1.UserError('subaccountNumber is not set');
|
|
457
|
+
}
|
|
458
|
+
const amount = json.amount;
|
|
459
|
+
if (amount === undefined) {
|
|
460
|
+
throw new errors_1.UserError('amount is not set');
|
|
461
|
+
}
|
|
462
|
+
const subaccount = subaccount_1.SubaccountInfo.forLocalWallet(wallet, subaccountNumber);
|
|
463
|
+
const tx = await client.withdrawFromSubaccount(subaccount, amount, json.recipient, json.memo);
|
|
464
|
+
return (0, helpers_1.encodeJson)(tx);
|
|
465
|
+
}
|
|
466
|
+
catch (error) {
|
|
467
|
+
return wrappedError(error);
|
|
468
|
+
}
|
|
469
|
+
}
|
|
470
|
+
async function faucet(payload) {
|
|
471
|
+
try {
|
|
472
|
+
const faucetClient = globalThis.faucetClient;
|
|
473
|
+
if (!faucetClient) {
|
|
474
|
+
throw new errors_1.UserError('faucetClient is not connected. Call connectNetwork() first');
|
|
475
|
+
}
|
|
476
|
+
const wallet = globalThis.wallet;
|
|
477
|
+
if (wallet === undefined) {
|
|
478
|
+
throw new errors_1.UserError('wallet is not set. Call connectWallet() first');
|
|
479
|
+
}
|
|
480
|
+
const json = JSON.parse(payload);
|
|
481
|
+
const subaccountNumber = json.subaccountNumber;
|
|
482
|
+
if (subaccountNumber === undefined) {
|
|
483
|
+
throw new errors_1.UserError('subaccountNumber is not set');
|
|
484
|
+
}
|
|
485
|
+
const amount = json.amount;
|
|
486
|
+
if (amount === undefined) {
|
|
487
|
+
throw new errors_1.UserError('amount is not set');
|
|
488
|
+
}
|
|
489
|
+
const response = await faucetClient.fill(wallet.address, subaccountNumber, amount);
|
|
490
|
+
const sanitized = {
|
|
491
|
+
data: response.data,
|
|
492
|
+
status: response.status,
|
|
493
|
+
headers: response.headers,
|
|
494
|
+
};
|
|
495
|
+
return (0, helpers_1.encodeJson)(sanitized);
|
|
496
|
+
}
|
|
497
|
+
catch (error) {
|
|
498
|
+
return wrappedError(error);
|
|
499
|
+
}
|
|
500
|
+
}
|
|
501
|
+
async function withdrawToIBC(subaccountNumber, amount, payload) {
|
|
502
|
+
try {
|
|
503
|
+
const client = globalThis.client;
|
|
504
|
+
if (client === undefined) {
|
|
505
|
+
throw new errors_1.UserError('client is not connected. Call connectClient() first');
|
|
506
|
+
}
|
|
507
|
+
const wallet = globalThis.wallet;
|
|
508
|
+
if (wallet === undefined) {
|
|
509
|
+
throw new errors_1.UserError('wallet is not set. Call connectWallet() first');
|
|
510
|
+
}
|
|
511
|
+
const decode = (str) => Buffer.from(str, 'base64').toString('binary');
|
|
512
|
+
const decoded = decode(payload);
|
|
513
|
+
const json = JSON.parse(decoded);
|
|
514
|
+
const ibcMsg = {
|
|
515
|
+
typeUrl: json.msgTypeUrl, // '/ibc.applications.transfer.v1.MsgTransfer',
|
|
516
|
+
value: {
|
|
517
|
+
...json.msg,
|
|
518
|
+
// Squid returns timeoutTimestamp as Long, but the signer expects BigInt
|
|
519
|
+
timeoutTimestamp: json.msg.timeoutTimestamp
|
|
520
|
+
? BigInt(long_1.default.fromValue(json.msg.timeoutTimestamp).toString())
|
|
521
|
+
: undefined,
|
|
522
|
+
},
|
|
523
|
+
};
|
|
524
|
+
const subaccount = subaccount_1.SubaccountInfo.forLocalWallet(wallet, subaccountNumber);
|
|
525
|
+
const subaccountMsg = client.withdrawFromSubaccountMessage(subaccount, amount);
|
|
526
|
+
const msgs = [subaccountMsg, ibcMsg];
|
|
527
|
+
const encodeObjects = new Promise((resolve) => resolve(msgs));
|
|
528
|
+
const tx = await client.send(subaccount, () => {
|
|
529
|
+
return encodeObjects;
|
|
530
|
+
}, false, undefined, undefined);
|
|
531
|
+
return (0, helpers_1.encodeJson)(tx);
|
|
532
|
+
}
|
|
533
|
+
catch (error) {
|
|
534
|
+
return wrappedError(error);
|
|
535
|
+
}
|
|
536
|
+
}
|
|
537
|
+
async function transferNativeToken(payload) {
|
|
538
|
+
try {
|
|
539
|
+
const client = globalThis.client;
|
|
540
|
+
if (client === undefined) {
|
|
541
|
+
throw new errors_1.UserError('client is not connected. Call connectClient() first');
|
|
542
|
+
}
|
|
543
|
+
const wallet = globalThis.wallet;
|
|
544
|
+
if (wallet === undefined) {
|
|
545
|
+
throw new errors_1.UserError('wallet is not set. Call connectWallet() first');
|
|
546
|
+
}
|
|
547
|
+
const json = JSON.parse(payload);
|
|
548
|
+
const amount = json.amount;
|
|
549
|
+
if (amount === undefined) {
|
|
550
|
+
throw new errors_1.UserError('amount is not set');
|
|
551
|
+
}
|
|
552
|
+
const msg = client.sendTokenMessage(wallet, amount, json.recipient);
|
|
553
|
+
const msgs = [msg];
|
|
554
|
+
const encodeObjects = new Promise((resolve) => resolve(msgs));
|
|
555
|
+
const tx = await client.send(subaccount_1.SubaccountInfo.forLocalWallet(wallet), () => {
|
|
556
|
+
return encodeObjects;
|
|
557
|
+
}, false, client.validatorClient.post.defaultDydxGasPrice, json.memo);
|
|
558
|
+
return (0, helpers_1.encodeJson)(tx);
|
|
559
|
+
}
|
|
560
|
+
catch (error) {
|
|
561
|
+
return wrappedError(error);
|
|
562
|
+
}
|
|
563
|
+
}
|
|
564
|
+
async function getAccountBalance() {
|
|
565
|
+
try {
|
|
566
|
+
const client = globalThis.client;
|
|
567
|
+
if (client === undefined) {
|
|
568
|
+
throw new errors_1.UserError('client is not connected. Call connectClient() first');
|
|
569
|
+
}
|
|
570
|
+
const wallet = globalThis.wallet;
|
|
571
|
+
if (wallet === undefined) {
|
|
572
|
+
throw new errors_1.UserError('wallet is not set. Call connectWallet() first');
|
|
573
|
+
}
|
|
574
|
+
const address = globalThis.wallet.address;
|
|
575
|
+
const tx = await client.validatorClient.get.getAccountBalance(address, client.validatorClient.config.denoms.USDC_DENOM);
|
|
576
|
+
return (0, helpers_1.encodeJson)(tx);
|
|
577
|
+
}
|
|
578
|
+
catch (error) {
|
|
579
|
+
return wrappedError(error);
|
|
580
|
+
}
|
|
581
|
+
}
|
|
582
|
+
async function getAccountBalances() {
|
|
583
|
+
try {
|
|
584
|
+
const client = globalThis.client;
|
|
585
|
+
if (client === undefined) {
|
|
586
|
+
throw new errors_1.UserError('client is not connected. Call connectClient() first');
|
|
587
|
+
}
|
|
588
|
+
const wallet = globalThis.wallet;
|
|
589
|
+
if (wallet === undefined) {
|
|
590
|
+
throw new errors_1.UserError('wallet is not set. Call connectWallet() first');
|
|
591
|
+
}
|
|
592
|
+
const address = globalThis.wallet.address;
|
|
593
|
+
const tx = await client.validatorClient.get.getAccountBalances(address);
|
|
594
|
+
return (0, helpers_1.encodeJson)(tx);
|
|
595
|
+
}
|
|
596
|
+
catch (error) {
|
|
597
|
+
return wrappedError(error);
|
|
598
|
+
}
|
|
599
|
+
}
|
|
600
|
+
async function getUserStats(payload) {
|
|
601
|
+
try {
|
|
602
|
+
const client = globalThis.client;
|
|
603
|
+
if (client === undefined) {
|
|
604
|
+
throw new errors_1.UserError('client is not connected. Call connectClient() first');
|
|
605
|
+
}
|
|
606
|
+
const json = JSON.parse(payload);
|
|
607
|
+
const address = json.address;
|
|
608
|
+
if (address === undefined) {
|
|
609
|
+
throw new errors_1.UserError('address is not set');
|
|
610
|
+
}
|
|
611
|
+
const tx = await client.validatorClient.get.getUserStats(address);
|
|
612
|
+
return (0, helpers_1.encodeJson)(tx);
|
|
613
|
+
}
|
|
614
|
+
catch (error) {
|
|
615
|
+
return wrappedError(error);
|
|
616
|
+
}
|
|
617
|
+
}
|
|
618
|
+
async function simulateDeposit(payload) {
|
|
619
|
+
try {
|
|
620
|
+
const client = globalThis.client;
|
|
621
|
+
if (client === undefined) {
|
|
622
|
+
throw new errors_1.UserError('client is not connected. Call connectClient() first');
|
|
623
|
+
}
|
|
624
|
+
const wallet = globalThis.wallet;
|
|
625
|
+
if (wallet === undefined) {
|
|
626
|
+
throw new errors_1.UserError('wallet is not set. Call connectWallet() first');
|
|
627
|
+
}
|
|
628
|
+
const json = JSON.parse(payload);
|
|
629
|
+
const subaccountNumber = json.subaccountNumber;
|
|
630
|
+
if (subaccountNumber === undefined) {
|
|
631
|
+
throw new errors_1.UserError('subaccountNumber is not set');
|
|
632
|
+
}
|
|
633
|
+
const amount = json.amount;
|
|
634
|
+
if (amount === undefined) {
|
|
635
|
+
throw new errors_1.UserError('amount is not set');
|
|
636
|
+
}
|
|
637
|
+
const subaccount = subaccount_1.SubaccountInfo.forLocalWallet(wallet, subaccountNumber);
|
|
638
|
+
const msg = client.depositToSubaccountMessage(subaccount, amount);
|
|
639
|
+
const msgs = [msg];
|
|
640
|
+
const encodeObjects = new Promise((resolve) => resolve(msgs));
|
|
641
|
+
const stdFee = await client.simulate(subaccount, () => {
|
|
642
|
+
return encodeObjects;
|
|
643
|
+
});
|
|
644
|
+
return JSON.stringify(stdFee);
|
|
645
|
+
}
|
|
646
|
+
catch (error) {
|
|
647
|
+
return wrappedError(error);
|
|
648
|
+
}
|
|
649
|
+
}
|
|
650
|
+
async function simulateWithdraw(payload) {
|
|
651
|
+
try {
|
|
652
|
+
const client = globalThis.client;
|
|
653
|
+
if (client === undefined) {
|
|
654
|
+
throw new errors_1.UserError('client is not connected. Call connectClient() first');
|
|
655
|
+
}
|
|
656
|
+
const wallet = globalThis.wallet;
|
|
657
|
+
if (wallet === undefined) {
|
|
658
|
+
throw new errors_1.UserError('wallet is not set. Call connectWallet() first');
|
|
659
|
+
}
|
|
660
|
+
const json = JSON.parse(payload);
|
|
661
|
+
const subaccountNumber = json.subaccountNumber;
|
|
662
|
+
if (subaccountNumber === undefined) {
|
|
663
|
+
throw new errors_1.UserError('subaccountNumber is not set');
|
|
664
|
+
}
|
|
665
|
+
const amount = json.amount;
|
|
666
|
+
if (amount === undefined) {
|
|
667
|
+
throw new errors_1.UserError('amount is not set');
|
|
668
|
+
}
|
|
669
|
+
const subaccount = subaccount_1.SubaccountInfo.forLocalWallet(wallet, subaccountNumber);
|
|
670
|
+
const msg = client.withdrawFromSubaccountMessage(subaccount, amount, json.recipient);
|
|
671
|
+
const msgs = [msg];
|
|
672
|
+
const encodeObjects = new Promise((resolve) => resolve(msgs));
|
|
673
|
+
const stdFee = await client.simulate(subaccount, () => {
|
|
674
|
+
return encodeObjects;
|
|
675
|
+
});
|
|
676
|
+
return (0, helpers_1.encodeJson)(stdFee);
|
|
677
|
+
}
|
|
678
|
+
catch (error) {
|
|
679
|
+
return wrappedError(error);
|
|
680
|
+
}
|
|
681
|
+
}
|
|
682
|
+
async function simulateTransferNativeToken(payload) {
|
|
683
|
+
try {
|
|
684
|
+
const client = globalThis.client;
|
|
685
|
+
if (client === undefined) {
|
|
686
|
+
throw new errors_1.UserError('client is not connected. Call connectClient() first');
|
|
687
|
+
}
|
|
688
|
+
const wallet = globalThis.wallet;
|
|
689
|
+
if (wallet === undefined) {
|
|
690
|
+
throw new errors_1.UserError('wallet is not set. Call connectWallet() first');
|
|
691
|
+
}
|
|
692
|
+
const json = JSON.parse(payload);
|
|
693
|
+
const recipient = json.recipient;
|
|
694
|
+
if (recipient === undefined) {
|
|
695
|
+
throw new errors_1.UserError('recipient is not set');
|
|
696
|
+
}
|
|
697
|
+
const amount = json.amount;
|
|
698
|
+
if (amount === undefined) {
|
|
699
|
+
throw new errors_1.UserError('amount is not set');
|
|
700
|
+
}
|
|
701
|
+
const msg = client.sendTokenMessage(wallet, amount, json.recipient);
|
|
702
|
+
const msgs = [msg];
|
|
703
|
+
const encodeObjects = new Promise((resolve) => resolve(msgs));
|
|
704
|
+
const stdFee = await client.simulate(subaccount_1.SubaccountInfo.forLocalWallet(wallet), () => {
|
|
705
|
+
return encodeObjects;
|
|
706
|
+
}, client.validatorClient.post.defaultDydxGasPrice);
|
|
707
|
+
return (0, helpers_1.encodeJson)(stdFee);
|
|
708
|
+
}
|
|
709
|
+
catch (error) {
|
|
710
|
+
return wrappedError(error);
|
|
711
|
+
}
|
|
712
|
+
}
|
|
713
|
+
async function signRawPlaceOrder(subaccountNumber, clientId, clobPairId, side, quantums, subticks, timeInForce, orderFlags, reduceOnly, goodTilBlock, goodTilBlockTime, clientMetadata) {
|
|
714
|
+
try {
|
|
715
|
+
const client = globalThis.client;
|
|
716
|
+
if (client === undefined) {
|
|
717
|
+
throw new errors_1.UserError('client is not connected. Call connectClient() first');
|
|
718
|
+
}
|
|
719
|
+
const wallet = globalThis.wallet;
|
|
720
|
+
if (wallet === undefined) {
|
|
721
|
+
throw new errors_1.UserError('wallet is not set. Call connectWallet() first');
|
|
722
|
+
}
|
|
723
|
+
const msgs = new Promise((resolve) => {
|
|
724
|
+
const msg = client.validatorClient.post.composer.composeMsgPlaceOrder(wallet.address, subaccountNumber, clientId, clobPairId, orderFlags, goodTilBlock, goodTilBlockTime, side, quantums, subticks, timeInForce, reduceOnly, clientMetadata !== null && clientMetadata !== void 0 ? clientMetadata : 0);
|
|
725
|
+
resolve([msg]);
|
|
726
|
+
});
|
|
727
|
+
const signed = await client.sign(subaccount_1.SubaccountInfo.forLocalWallet(wallet, subaccountNumber), () => msgs, true);
|
|
728
|
+
return Buffer.from(signed).toString('base64');
|
|
729
|
+
}
|
|
730
|
+
catch (error) {
|
|
731
|
+
return wrappedError(error);
|
|
732
|
+
}
|
|
733
|
+
}
|
|
734
|
+
async function signPlaceOrder(subaccountNumber, marketId, type, side, price,
|
|
735
|
+
// trigger_price: number, // not used for MARKET and LIMIT
|
|
736
|
+
size, clientId, timeInForce, goodTilTimeInSeconds, execution, postOnly, reduceOnly) {
|
|
737
|
+
try {
|
|
738
|
+
const client = globalThis.client;
|
|
739
|
+
if (client === undefined) {
|
|
740
|
+
throw new errors_1.UserError('client is not connected. Call connectClient() first');
|
|
741
|
+
}
|
|
742
|
+
const wallet = globalThis.wallet;
|
|
743
|
+
if (wallet === undefined) {
|
|
744
|
+
throw new errors_1.UserError('wallet is not set. Call connectWallet() first');
|
|
745
|
+
}
|
|
746
|
+
const subaccount = subaccount_1.SubaccountInfo.forLocalWallet(wallet, subaccountNumber);
|
|
747
|
+
const signed = await client.signPlaceOrder(subaccount, marketId, type, side, price, size, clientId, timeInForce, goodTilTimeInSeconds, execution, postOnly, reduceOnly);
|
|
748
|
+
return signed;
|
|
749
|
+
}
|
|
750
|
+
catch (error) {
|
|
751
|
+
return wrappedError(error);
|
|
752
|
+
}
|
|
753
|
+
}
|
|
754
|
+
async function signCancelOrder(subaccountNumber, clientId, orderFlags, clobPairId, goodTilBlock, goodTilBlockTime) {
|
|
755
|
+
try {
|
|
756
|
+
const client = globalThis.client;
|
|
757
|
+
if (client === undefined) {
|
|
758
|
+
throw new errors_1.UserError('client is not connected. Call connectClient() first');
|
|
759
|
+
}
|
|
760
|
+
const wallet = globalThis.wallet;
|
|
761
|
+
if (wallet === undefined) {
|
|
762
|
+
throw new errors_1.UserError('wallet is not set. Call connectWallet() first');
|
|
763
|
+
}
|
|
764
|
+
const subaccount = subaccount_1.SubaccountInfo.forLocalWallet(wallet, subaccountNumber);
|
|
765
|
+
const signed = await client.signCancelOrder(subaccount, clientId, orderFlags, clobPairId, goodTilBlock, goodTilBlockTime);
|
|
766
|
+
return signed;
|
|
767
|
+
}
|
|
768
|
+
catch (error) {
|
|
769
|
+
return wrappedError(error);
|
|
770
|
+
}
|
|
771
|
+
}
|
|
772
|
+
async function encodeAccountRequestData(address) {
|
|
773
|
+
return new Promise((resolve, reject) => {
|
|
774
|
+
try {
|
|
775
|
+
const requestData = Uint8Array.from(AuthModule.QueryAccountRequest.encode({ address }).finish());
|
|
776
|
+
resolve(Buffer.from(requestData).toString('hex'));
|
|
777
|
+
}
|
|
778
|
+
catch (error) {
|
|
779
|
+
reject(error);
|
|
780
|
+
}
|
|
781
|
+
});
|
|
782
|
+
}
|
|
783
|
+
async function decodeAccountResponseValue(value) {
|
|
784
|
+
return new Promise((resolve, reject) => {
|
|
785
|
+
try {
|
|
786
|
+
const rawData = Buffer.from(value, 'base64');
|
|
787
|
+
const rawAccount = AuthModule.QueryAccountResponse.decode(rawData).account;
|
|
788
|
+
// The promise should have been rejected if the rawAccount was undefined.
|
|
789
|
+
if (rawAccount === undefined) {
|
|
790
|
+
throw Error('rawAccount is undefined');
|
|
791
|
+
}
|
|
792
|
+
const account = (0, stargate_1.accountFromAny)(rawAccount);
|
|
793
|
+
resolve((0, helpers_1.encodeJson)(account));
|
|
794
|
+
}
|
|
795
|
+
catch (error) {
|
|
796
|
+
reject(error);
|
|
797
|
+
}
|
|
798
|
+
});
|
|
799
|
+
}
|
|
800
|
+
async function getOptimalNode(endpointUrlsAsJson) {
|
|
801
|
+
/*
|
|
802
|
+
param:
|
|
803
|
+
endpointUrlsAsJson:
|
|
804
|
+
{
|
|
805
|
+
"endpointUrls": [
|
|
806
|
+
"https://rpc.testnet.near.org"
|
|
807
|
+
],
|
|
808
|
+
"chainId": "testnet"
|
|
809
|
+
}
|
|
810
|
+
*/
|
|
811
|
+
try {
|
|
812
|
+
const param = JSON.parse(endpointUrlsAsJson);
|
|
813
|
+
const endpointUrls = param.endpointUrls;
|
|
814
|
+
const chainId = param.chainId;
|
|
815
|
+
const networkOptimizer = new network_optimizer_1.NetworkOptimizer();
|
|
816
|
+
const optimalUrl = await networkOptimizer.findOptimalNode(endpointUrls, chainId);
|
|
817
|
+
const url = {
|
|
818
|
+
url: optimalUrl,
|
|
819
|
+
};
|
|
820
|
+
return (0, helpers_1.encodeJson)(url);
|
|
821
|
+
}
|
|
822
|
+
catch (error) {
|
|
823
|
+
return wrappedError(error);
|
|
824
|
+
}
|
|
825
|
+
}
|
|
826
|
+
async function getOptimalIndexer(endpointUrlsAsJson) {
|
|
827
|
+
/*
|
|
828
|
+
param:
|
|
829
|
+
endpointUrlsAsJson:
|
|
830
|
+
{
|
|
831
|
+
"endpointUrls": [
|
|
832
|
+
"https://api.example.org"
|
|
833
|
+
]
|
|
834
|
+
}
|
|
835
|
+
*/
|
|
836
|
+
try {
|
|
837
|
+
const param = JSON.parse(endpointUrlsAsJson);
|
|
838
|
+
const endpointUrls = param.endpointUrls;
|
|
839
|
+
const networkOptimizer = new network_optimizer_1.NetworkOptimizer();
|
|
840
|
+
const optimalUrl = await networkOptimizer.findOptimalIndexer(endpointUrls);
|
|
841
|
+
const url = {
|
|
842
|
+
url: optimalUrl,
|
|
843
|
+
};
|
|
844
|
+
return (0, helpers_1.encodeJson)(url);
|
|
845
|
+
}
|
|
846
|
+
catch (error) {
|
|
847
|
+
return wrappedError(error);
|
|
848
|
+
}
|
|
849
|
+
}
|
|
850
|
+
async function getRewardsParams() {
|
|
851
|
+
var _a;
|
|
852
|
+
try {
|
|
853
|
+
const client = globalThis.client;
|
|
854
|
+
if (client === undefined) {
|
|
855
|
+
throw new errors_1.UserError('client is not connected. Call connectClient() first');
|
|
856
|
+
}
|
|
857
|
+
const rewardsParams = await ((_a = globalThis.client) === null || _a === void 0 ? void 0 : _a.validatorClient.get.getRewardsParams());
|
|
858
|
+
return (0, helpers_1.encodeJson)(rewardsParams);
|
|
859
|
+
}
|
|
860
|
+
catch (e) {
|
|
861
|
+
return wrappedError(e);
|
|
862
|
+
}
|
|
863
|
+
}
|
|
864
|
+
async function getDelegatorDelegations(payload) {
|
|
865
|
+
var _a;
|
|
866
|
+
try {
|
|
867
|
+
const client = globalThis.client;
|
|
868
|
+
if (client === undefined) {
|
|
869
|
+
throw new errors_1.UserError('client is not connected. Call connectClient() first');
|
|
870
|
+
}
|
|
871
|
+
const json = JSON.parse(payload);
|
|
872
|
+
const address = json.address;
|
|
873
|
+
if (address === undefined) {
|
|
874
|
+
throw new errors_1.UserError('address is not set');
|
|
875
|
+
}
|
|
876
|
+
const delegations = await ((_a = globalThis.client) === null || _a === void 0 ? void 0 : _a.validatorClient.get.getDelegatorDelegations(address));
|
|
877
|
+
return (0, helpers_1.encodeJson)(delegations);
|
|
878
|
+
}
|
|
879
|
+
catch (e) {
|
|
880
|
+
return wrappedError(e);
|
|
881
|
+
}
|
|
882
|
+
}
|
|
883
|
+
async function getStakingRewards(payload) {
|
|
884
|
+
var _a;
|
|
885
|
+
try {
|
|
886
|
+
const client = globalThis.client;
|
|
887
|
+
if (client === undefined) {
|
|
888
|
+
throw new errors_1.UserError('client is not connected. Call connectClient() first');
|
|
889
|
+
}
|
|
890
|
+
const json = JSON.parse(payload);
|
|
891
|
+
const address = json.address;
|
|
892
|
+
if (address === undefined) {
|
|
893
|
+
throw new errors_1.UserError('address is not set');
|
|
894
|
+
}
|
|
895
|
+
const delegations = await ((_a = globalThis.client) === null || _a === void 0 ? void 0 : _a.validatorClient.get.getDelegationTotalRewards(address));
|
|
896
|
+
return (0, helpers_1.encodeJson)(delegations);
|
|
897
|
+
}
|
|
898
|
+
catch (e) {
|
|
899
|
+
return wrappedError(e);
|
|
900
|
+
}
|
|
901
|
+
}
|
|
902
|
+
async function getCurrentUnstaking(payload) {
|
|
903
|
+
var _a;
|
|
904
|
+
try {
|
|
905
|
+
const client = globalThis.client;
|
|
906
|
+
if (client === undefined) {
|
|
907
|
+
throw new errors_1.UserError('client is not connected. Call connectClient() first');
|
|
908
|
+
}
|
|
909
|
+
const json = JSON.parse(payload);
|
|
910
|
+
const address = json.address;
|
|
911
|
+
if (address === undefined) {
|
|
912
|
+
throw new errors_1.UserError('address is not set');
|
|
913
|
+
}
|
|
914
|
+
const delegations = await ((_a = globalThis.client) === null || _a === void 0 ? void 0 : _a.validatorClient.get.getDelegatorUnbondingDelegations(address));
|
|
915
|
+
return (0, helpers_1.encodeJson)(delegations);
|
|
916
|
+
}
|
|
917
|
+
catch (e) {
|
|
918
|
+
return wrappedError(e);
|
|
919
|
+
}
|
|
920
|
+
}
|
|
921
|
+
async function getMarketPrice(payload) {
|
|
922
|
+
try {
|
|
923
|
+
const client = globalThis.client;
|
|
924
|
+
if (client === undefined) {
|
|
925
|
+
throw new errors_1.UserError('client is not connected. Call connectClient() first');
|
|
926
|
+
}
|
|
927
|
+
const json = JSON.parse(payload);
|
|
928
|
+
const marketId = json.marketId;
|
|
929
|
+
if (marketId === undefined) {
|
|
930
|
+
throw new errors_1.UserError('marketId is not set');
|
|
931
|
+
}
|
|
932
|
+
const marketPrice = await client.validatorClient.get.getPrice(marketId);
|
|
933
|
+
return (0, helpers_1.encodeJson)(marketPrice);
|
|
934
|
+
}
|
|
935
|
+
catch (e) {
|
|
936
|
+
return wrappedError(e);
|
|
937
|
+
}
|
|
938
|
+
}
|
|
939
|
+
async function getNobleBalance() {
|
|
940
|
+
try {
|
|
941
|
+
const client = globalThis.nobleClient;
|
|
942
|
+
if (client === undefined || !client.isConnected) {
|
|
943
|
+
throw new errors_1.UserError('client is not connected.');
|
|
944
|
+
}
|
|
945
|
+
const coin = await client.getAccountBalance('uusdc');
|
|
946
|
+
return (0, helpers_1.encodeJson)(coin);
|
|
947
|
+
}
|
|
948
|
+
catch (error) {
|
|
949
|
+
return wrappedError(error);
|
|
950
|
+
}
|
|
951
|
+
}
|
|
952
|
+
async function sendNobleIBC(squidPayload) {
|
|
953
|
+
try {
|
|
954
|
+
const client = globalThis.nobleClient;
|
|
955
|
+
if (client === undefined || !client.isConnected) {
|
|
956
|
+
throw new errors_1.UserError('client is not connected.');
|
|
957
|
+
}
|
|
958
|
+
const json = JSON.parse(squidPayload);
|
|
959
|
+
const ibcMsg = {
|
|
960
|
+
typeUrl: json.msgTypeUrl,
|
|
961
|
+
value: {
|
|
962
|
+
...json.msg,
|
|
963
|
+
// Squid returns timeoutTimestamp as Long, but the signer expects BigInt
|
|
964
|
+
timeoutTimestamp: json.msg.timeoutTimestamp
|
|
965
|
+
? BigInt(long_1.default.fromValue(json.msg.timeoutTimestamp).toString())
|
|
966
|
+
: undefined,
|
|
967
|
+
},
|
|
968
|
+
};
|
|
969
|
+
const fee = await client.simulateTransaction([ibcMsg]);
|
|
970
|
+
if (!ibcMsg.value.token) {
|
|
971
|
+
throw new errors_1.UserError('Payload missing token field');
|
|
972
|
+
}
|
|
973
|
+
// take out fee from amount before sweeping
|
|
974
|
+
const amount = parseInt(ibcMsg.value.token.amount, 10) -
|
|
975
|
+
Math.floor(parseInt(fee.amount[0].amount, 10) * constants_1.GAS_MULTIPLIER);
|
|
976
|
+
if (amount <= 0) {
|
|
977
|
+
throw new errors_1.UserError('noble balance does not cover fees');
|
|
978
|
+
}
|
|
979
|
+
ibcMsg.value.token = (0, proto_signing_1.coin)(amount.toString(), ibcMsg.value.token.denom);
|
|
980
|
+
const tx = await client.IBCTransfer(ibcMsg);
|
|
981
|
+
return (0, helpers_1.encodeJson)(tx);
|
|
982
|
+
}
|
|
983
|
+
catch (error) {
|
|
984
|
+
return wrappedError(error);
|
|
985
|
+
}
|
|
986
|
+
}
|
|
987
|
+
async function withdrawToNobleIBC(payload) {
|
|
988
|
+
try {
|
|
989
|
+
const client = globalThis.client;
|
|
990
|
+
if (client === undefined) {
|
|
991
|
+
throw new errors_1.UserError('client is not connected. Call connectClient() first');
|
|
992
|
+
}
|
|
993
|
+
const wallet = globalThis.wallet;
|
|
994
|
+
if (wallet === undefined) {
|
|
995
|
+
throw new errors_1.UserError('wallet is not set. Call connectWallet() first');
|
|
996
|
+
}
|
|
997
|
+
const json = JSON.parse(payload);
|
|
998
|
+
const { subaccountNumber, amount, ibcPayload } = json !== null && json !== void 0 ? json : {};
|
|
999
|
+
const decode = (str) => Buffer.from(str, 'base64').toString('binary');
|
|
1000
|
+
const decoded = decode(ibcPayload);
|
|
1001
|
+
const parsedIbcPayload = JSON.parse(decoded);
|
|
1002
|
+
const subaccount = subaccount_1.SubaccountInfo.forLocalWallet(wallet, subaccountNumber);
|
|
1003
|
+
const msg = client.withdrawFromSubaccountMessage(subaccount, parseFloat(amount).toFixed(client.validatorClient.config.denoms.USDC_DECIMALS));
|
|
1004
|
+
const ibcMsg = {
|
|
1005
|
+
typeUrl: parsedIbcPayload.msgTypeUrl,
|
|
1006
|
+
value: {
|
|
1007
|
+
...parsedIbcPayload.msg,
|
|
1008
|
+
// Squid returns timeoutTimestamp as Long, but the signer expects BigInt
|
|
1009
|
+
timeoutTimestamp: parsedIbcPayload.msg.timeoutTimestamp
|
|
1010
|
+
? BigInt(long_1.default.fromValue(parsedIbcPayload.msg.timeoutTimestamp).toString())
|
|
1011
|
+
: undefined,
|
|
1012
|
+
},
|
|
1013
|
+
};
|
|
1014
|
+
const tx = await client.send(subaccount, () => Promise.resolve([msg, ibcMsg]), false);
|
|
1015
|
+
return (0, helpers_1.encodeJson)({
|
|
1016
|
+
txHash: `0x${Buffer.from(tx === null || tx === void 0 ? void 0 : tx.hash).toString('hex')}`,
|
|
1017
|
+
});
|
|
1018
|
+
}
|
|
1019
|
+
catch (error) {
|
|
1020
|
+
return wrappedError(error);
|
|
1021
|
+
}
|
|
1022
|
+
}
|
|
1023
|
+
async function cctpWithdraw(squidPayload) {
|
|
1024
|
+
try {
|
|
1025
|
+
const client = globalThis.nobleClient;
|
|
1026
|
+
if (client === undefined || !client.isConnected) {
|
|
1027
|
+
throw new errors_1.UserError('client is not connected.');
|
|
1028
|
+
}
|
|
1029
|
+
const json = JSON.parse(squidPayload);
|
|
1030
|
+
const ibcMsg = {
|
|
1031
|
+
typeUrl: json.typeUrl, // '/circle.cctp.v1.MsgDepositForBurn',
|
|
1032
|
+
value: json.value,
|
|
1033
|
+
};
|
|
1034
|
+
const fee = await client.simulateTransaction([ibcMsg]);
|
|
1035
|
+
// take out fee from amount before sweeping
|
|
1036
|
+
const amount = parseInt(ibcMsg.value.amount, 10) -
|
|
1037
|
+
Math.floor(parseInt(fee.amount[0].amount, 10) * constants_1.GAS_MULTIPLIER);
|
|
1038
|
+
if (amount <= 0) {
|
|
1039
|
+
throw new Error('noble balance does not cover fees');
|
|
1040
|
+
}
|
|
1041
|
+
ibcMsg.value.amount = amount.toString();
|
|
1042
|
+
const tx = await client.send([ibcMsg]);
|
|
1043
|
+
return (0, helpers_1.encodeJson)(tx);
|
|
1044
|
+
}
|
|
1045
|
+
catch (error) {
|
|
1046
|
+
return wrappedError(error);
|
|
1047
|
+
}
|
|
1048
|
+
}
|
|
1049
|
+
async function cctpMultiMsgWithdraw(cosmosPayload) {
|
|
1050
|
+
try {
|
|
1051
|
+
const client = globalThis.nobleClient;
|
|
1052
|
+
const messages = JSON.parse(cosmosPayload);
|
|
1053
|
+
if (client === undefined || !client.isConnected) {
|
|
1054
|
+
throw new errors_1.UserError('client is not connected.');
|
|
1055
|
+
}
|
|
1056
|
+
const ibcMsgs = messages.map(({ typeUrl, value }) => ({
|
|
1057
|
+
typeUrl, // '/circle.cctp.v1.MsgDepositForBurnWithCaller', '/cosmos.bank.v1beta1.MsgSend'
|
|
1058
|
+
value,
|
|
1059
|
+
}));
|
|
1060
|
+
const fee = await client.simulateTransaction(ibcMsgs);
|
|
1061
|
+
// take out fee from amount before sweeping
|
|
1062
|
+
const amount = parseInt(ibcMsgs[0].value.amount, 10) -
|
|
1063
|
+
Math.floor(parseInt(fee.amount[0].amount, 10) * constants_1.GAS_MULTIPLIER);
|
|
1064
|
+
if (amount <= 0) {
|
|
1065
|
+
throw new Error('noble balance does not cover fees');
|
|
1066
|
+
}
|
|
1067
|
+
ibcMsgs[0].value.amount = amount.toString();
|
|
1068
|
+
const tx = await client.send(ibcMsgs);
|
|
1069
|
+
return (0, helpers_1.encodeJson)(tx);
|
|
1070
|
+
}
|
|
1071
|
+
catch (error) {
|
|
1072
|
+
return wrappedError(error);
|
|
1073
|
+
}
|
|
1074
|
+
}
|
|
1075
|
+
async function getWithdrawalCapacityByDenom(payload) {
|
|
1076
|
+
try {
|
|
1077
|
+
const client = globalThis.client;
|
|
1078
|
+
if (client === undefined) {
|
|
1079
|
+
throw new errors_1.UserError('client is not connected. Call connectClient() first');
|
|
1080
|
+
}
|
|
1081
|
+
const json = JSON.parse(payload);
|
|
1082
|
+
const denom = json.denom;
|
|
1083
|
+
if (denom === undefined) {
|
|
1084
|
+
throw new errors_1.UserError('denom is not set');
|
|
1085
|
+
}
|
|
1086
|
+
const response = await client.validatorClient.get.getWithdrawalCapacityByDenom(denom);
|
|
1087
|
+
return (0, helpers_1.encodeJson)(response, helpers_1.ByteArrayEncoding.BIGINT);
|
|
1088
|
+
}
|
|
1089
|
+
catch (error) {
|
|
1090
|
+
return wrappedError(error);
|
|
1091
|
+
}
|
|
1092
|
+
}
|
|
1093
|
+
async function getWithdrawalAndTransferGatingStatus(perpetualId) {
|
|
1094
|
+
try {
|
|
1095
|
+
const client = globalThis.client;
|
|
1096
|
+
if (client === undefined) {
|
|
1097
|
+
throw new errors_1.UserError('client is not connected. Call connectClient() first');
|
|
1098
|
+
}
|
|
1099
|
+
const response = await client.validatorClient.get.getWithdrawalAndTransferGatingStatus(perpetualId);
|
|
1100
|
+
return (0, helpers_1.encodeJson)(response);
|
|
1101
|
+
}
|
|
1102
|
+
catch (error) {
|
|
1103
|
+
return wrappedError(error);
|
|
1104
|
+
}
|
|
1105
|
+
}
|
|
1106
|
+
async function subaccountTransfer(payload) {
|
|
1107
|
+
try {
|
|
1108
|
+
const client = globalThis.client;
|
|
1109
|
+
if (client === undefined) {
|
|
1110
|
+
throw new errors_1.UserError('client is not connected. Call connectNetwork() first');
|
|
1111
|
+
}
|
|
1112
|
+
const wallet = globalThis.wallet;
|
|
1113
|
+
if (wallet === undefined) {
|
|
1114
|
+
throw new errors_1.UserError('wallet is not set. Call connectWallet() first');
|
|
1115
|
+
}
|
|
1116
|
+
const json = JSON.parse(payload);
|
|
1117
|
+
const subaccountNumber = json.subaccountNumber;
|
|
1118
|
+
if (subaccountNumber === undefined) {
|
|
1119
|
+
throw new errors_1.UserError('subaccountNumber is not set');
|
|
1120
|
+
}
|
|
1121
|
+
const amount = json.amount;
|
|
1122
|
+
if (amount === undefined) {
|
|
1123
|
+
throw new errors_1.UserError('amount is not set');
|
|
1124
|
+
}
|
|
1125
|
+
let destinationAddress = json.destinationAddress;
|
|
1126
|
+
if (destinationAddress === undefined) {
|
|
1127
|
+
destinationAddress = wallet.address;
|
|
1128
|
+
}
|
|
1129
|
+
const destinationSubaccountNumber = json.destinationSubaccountNumber;
|
|
1130
|
+
if (destinationSubaccountNumber === undefined) {
|
|
1131
|
+
throw new errors_1.UserError('destinationSubaccountNumber is not set');
|
|
1132
|
+
}
|
|
1133
|
+
const subaccount = subaccount_1.SubaccountInfo.forLocalWallet(wallet, subaccountNumber);
|
|
1134
|
+
const tx = await client.transferToSubaccount(subaccount, destinationAddress, destinationSubaccountNumber, parseFloat(amount).toFixed(6), tendermint_rpc_1.Method.BroadcastTxCommit);
|
|
1135
|
+
return (0, helpers_1.encodeJson)(tx);
|
|
1136
|
+
}
|
|
1137
|
+
catch (error) {
|
|
1138
|
+
return wrappedError(error);
|
|
1139
|
+
}
|
|
1140
|
+
}
|
|
1141
|
+
async function signCompliancePayload(payload) {
|
|
1142
|
+
var _a, _b;
|
|
1143
|
+
try {
|
|
1144
|
+
const json = JSON.parse(payload);
|
|
1145
|
+
const message = json.message;
|
|
1146
|
+
if (message === undefined) {
|
|
1147
|
+
throw new errors_1.UserError('message is not set');
|
|
1148
|
+
}
|
|
1149
|
+
const action = json.action;
|
|
1150
|
+
if (action === undefined) {
|
|
1151
|
+
throw new errors_1.UserError('action is not set');
|
|
1152
|
+
}
|
|
1153
|
+
const currentStatus = json.status;
|
|
1154
|
+
if (currentStatus === undefined) {
|
|
1155
|
+
throw new errors_1.UserError('status is not set');
|
|
1156
|
+
}
|
|
1157
|
+
if (!((_a = globalThis.hdKey) === null || _a === void 0 ? void 0 : _a.privateKey) || !((_b = globalThis.hdKey) === null || _b === void 0 ? void 0 : _b.publicKey)) {
|
|
1158
|
+
throw new Error('Missing hdKey');
|
|
1159
|
+
}
|
|
1160
|
+
const timestampInSeconds = Math.floor(Date.now() / 1000);
|
|
1161
|
+
const messageToSign = `${message}:${action}"${currentStatus !== null && currentStatus !== void 0 ? currentStatus : ''}:${timestampInSeconds}`;
|
|
1162
|
+
const messageHash = (0, crypto_1.sha256)(Buffer.from(messageToSign));
|
|
1163
|
+
const signed = await crypto_1.Secp256k1.createSignature(messageHash, globalThis.hdKey.privateKey);
|
|
1164
|
+
const signedMessage = signed.toFixedLength();
|
|
1165
|
+
return (0, helpers_1.encodeJson)({
|
|
1166
|
+
signedMessage: Buffer.from(signedMessage).toString('base64'),
|
|
1167
|
+
publicKey: Buffer.from(globalThis.hdKey.publicKey).toString('base64'),
|
|
1168
|
+
timestamp: timestampInSeconds,
|
|
1169
|
+
});
|
|
1170
|
+
}
|
|
1171
|
+
catch (error) {
|
|
1172
|
+
return wrappedError(error);
|
|
1173
|
+
}
|
|
1174
|
+
}
|
|
1175
|
+
async function signPushNotificationTokenRegistrationPayload(payload) {
|
|
1176
|
+
var _a, _b;
|
|
1177
|
+
try {
|
|
1178
|
+
const json = JSON.parse(payload);
|
|
1179
|
+
const message = json.message;
|
|
1180
|
+
if (message === undefined) {
|
|
1181
|
+
throw new errors_1.UserError('message is not set');
|
|
1182
|
+
}
|
|
1183
|
+
if (!((_a = globalThis.hdKey) === null || _a === void 0 ? void 0 : _a.privateKey) || !((_b = globalThis.hdKey) === null || _b === void 0 ? void 0 : _b.publicKey)) {
|
|
1184
|
+
throw new Error('Missing hdKey');
|
|
1185
|
+
}
|
|
1186
|
+
const timestampInSeconds = Math.floor(Date.now() / 1000);
|
|
1187
|
+
const messageToSign = `${message}:REGISTER_TOKEN"${''}:${timestampInSeconds}`;
|
|
1188
|
+
const messageHash = (0, crypto_1.sha256)(Buffer.from(messageToSign));
|
|
1189
|
+
const signed = await crypto_1.Secp256k1.createSignature(messageHash, globalThis.hdKey.privateKey);
|
|
1190
|
+
const signedMessage = signed.toFixedLength();
|
|
1191
|
+
return (0, helpers_1.encodeJson)({
|
|
1192
|
+
signedMessage: Buffer.from(signedMessage).toString('base64'),
|
|
1193
|
+
publicKey: Buffer.from(globalThis.hdKey.publicKey).toString('base64'),
|
|
1194
|
+
timestamp: timestampInSeconds,
|
|
1195
|
+
});
|
|
1196
|
+
}
|
|
1197
|
+
catch (error) {
|
|
1198
|
+
return wrappedError(error);
|
|
1199
|
+
}
|
|
1200
|
+
}
|
|
1201
|
+
async function setSelectedGasDenom(gasDenom) {
|
|
1202
|
+
try {
|
|
1203
|
+
const client = globalThis.client;
|
|
1204
|
+
if (client === undefined) {
|
|
1205
|
+
throw new errors_1.UserError('client is not connected. Call connectClient() first');
|
|
1206
|
+
}
|
|
1207
|
+
await client.setSelectedGasDenom(gasDenom);
|
|
1208
|
+
return (0, helpers_1.encodeJson)('success');
|
|
1209
|
+
}
|
|
1210
|
+
catch (error) {
|
|
1211
|
+
return wrappedError(error);
|
|
1212
|
+
}
|
|
1213
|
+
}
|
|
1214
|
+
async function getMegavaultOwnerShares(payload) {
|
|
1215
|
+
var _a;
|
|
1216
|
+
try {
|
|
1217
|
+
const client = globalThis.client;
|
|
1218
|
+
if (client === undefined) {
|
|
1219
|
+
throw new errors_1.UserError('client is not connected. Call connectClient() first');
|
|
1220
|
+
}
|
|
1221
|
+
const json = JSON.parse(payload);
|
|
1222
|
+
const address = json.address;
|
|
1223
|
+
if (address === undefined) {
|
|
1224
|
+
throw new errors_1.UserError('address is not set');
|
|
1225
|
+
}
|
|
1226
|
+
const response = await ((_a = globalThis.client) === null || _a === void 0 ? void 0 : _a.validatorClient.get.getMegavaultOwnerShares(address));
|
|
1227
|
+
return (0, helpers_1.encodeJson)((0, request_helpers_1.parseToPrimitives)(response));
|
|
1228
|
+
}
|
|
1229
|
+
catch (e) {
|
|
1230
|
+
return wrappedError(e);
|
|
1231
|
+
}
|
|
1232
|
+
}
|
|
1233
|
+
async function getMegavaultWithdrawalInfo(sharesToWithdraw) {
|
|
1234
|
+
var _a;
|
|
1235
|
+
try {
|
|
1236
|
+
const client = globalThis.client;
|
|
1237
|
+
if (client === undefined) {
|
|
1238
|
+
throw new errors_1.UserError('client is not connected. Call connectClient() first');
|
|
1239
|
+
}
|
|
1240
|
+
const response = await ((_a = globalThis.client) === null || _a === void 0 ? void 0 : _a.validatorClient.get.getMegavaultWithdrawalInfo(sharesToWithdraw));
|
|
1241
|
+
return (0, helpers_1.encodeJson)((0, request_helpers_1.parseToPrimitives)(response));
|
|
1242
|
+
}
|
|
1243
|
+
catch (e) {
|
|
1244
|
+
return wrappedError(e);
|
|
1245
|
+
}
|
|
1246
|
+
}
|
|
1247
|
+
async function depositToMegavault(subaccountNumber, amountUsdc) {
|
|
1248
|
+
try {
|
|
1249
|
+
const client = globalThis.client;
|
|
1250
|
+
if (client === undefined) {
|
|
1251
|
+
throw new errors_1.UserError('client is not connected. Call connectNetwork() first');
|
|
1252
|
+
}
|
|
1253
|
+
const wallet = globalThis.wallet;
|
|
1254
|
+
if (wallet === undefined) {
|
|
1255
|
+
throw new errors_1.UserError('wallet is not set. Call connectWallet() first');
|
|
1256
|
+
}
|
|
1257
|
+
const subaccount = subaccount_1.SubaccountInfo.forLocalWallet(wallet, subaccountNumber);
|
|
1258
|
+
const tx = await client.depositToMegavault(subaccount, amountUsdc, tendermint_rpc_1.Method.BroadcastTxCommit);
|
|
1259
|
+
return (0, helpers_1.encodeJson)((0, request_helpers_1.parseToPrimitives)(tx));
|
|
1260
|
+
}
|
|
1261
|
+
catch (error) {
|
|
1262
|
+
return wrappedError(error);
|
|
1263
|
+
}
|
|
1264
|
+
}
|
|
1265
|
+
async function withdrawFromMegavault(subaccountNumber, shares, minAmount) {
|
|
1266
|
+
try {
|
|
1267
|
+
const client = globalThis.client;
|
|
1268
|
+
if (client === undefined) {
|
|
1269
|
+
throw new errors_1.UserError('client is not connected. Call connectNetwork() first');
|
|
1270
|
+
}
|
|
1271
|
+
const wallet = globalThis.wallet;
|
|
1272
|
+
if (wallet === undefined) {
|
|
1273
|
+
throw new errors_1.UserError('wallet is not set. Call connectWallet() first');
|
|
1274
|
+
}
|
|
1275
|
+
const subaccount = subaccount_1.SubaccountInfo.forLocalWallet(wallet, subaccountNumber);
|
|
1276
|
+
const tx = await client.withdrawFromMegavault(subaccount, shares, minAmount, tendermint_rpc_1.Method.BroadcastTxCommit);
|
|
1277
|
+
return (0, helpers_1.encodeJson)((0, request_helpers_1.parseToPrimitives)(tx));
|
|
1278
|
+
}
|
|
1279
|
+
catch (error) {
|
|
1280
|
+
return wrappedError(error);
|
|
1281
|
+
}
|
|
1282
|
+
}
|
|
1283
|
+
async function getAllPerpMarketFeeDiscounts() {
|
|
1284
|
+
var _a;
|
|
1285
|
+
try {
|
|
1286
|
+
const client = globalThis.client;
|
|
1287
|
+
if (client === undefined) {
|
|
1288
|
+
throw new errors_1.UserError('client is not connected. Call connectClient() first');
|
|
1289
|
+
}
|
|
1290
|
+
const response = await ((_a = globalThis.client) === null || _a === void 0 ? void 0 : _a.validatorClient.get.getAllPerpMarketFeeDiscounts());
|
|
1291
|
+
return (0, helpers_1.encodeJson)(response);
|
|
1292
|
+
}
|
|
1293
|
+
catch (error) {
|
|
1294
|
+
return wrappedError(error);
|
|
1295
|
+
}
|
|
1296
|
+
}
|
|
1297
|
+
async function getAllStakingTiers() {
|
|
1298
|
+
var _a;
|
|
1299
|
+
try {
|
|
1300
|
+
const client = globalThis.client;
|
|
1301
|
+
if (client === undefined) {
|
|
1302
|
+
throw new errors_1.UserError('client is not connected. Call connectClient() first');
|
|
1303
|
+
}
|
|
1304
|
+
const response = await ((_a = globalThis.client) === null || _a === void 0 ? void 0 : _a.validatorClient.get.getAllStakingTiers());
|
|
1305
|
+
return (0, helpers_1.encodeJson)(response);
|
|
1306
|
+
}
|
|
1307
|
+
catch (error) {
|
|
1308
|
+
return wrappedError(error);
|
|
1309
|
+
}
|
|
1310
|
+
}
|
|
1311
|
+
async function getUserStakingTier(payload) {
|
|
1312
|
+
var _a;
|
|
1313
|
+
try {
|
|
1314
|
+
const client = globalThis.client;
|
|
1315
|
+
if (client === undefined) {
|
|
1316
|
+
throw new errors_1.UserError('client is not connected. Call connectClient() first');
|
|
1317
|
+
}
|
|
1318
|
+
const json = JSON.parse(payload);
|
|
1319
|
+
const address = json.address;
|
|
1320
|
+
if (address === undefined) {
|
|
1321
|
+
throw new errors_1.UserError('address is not set');
|
|
1322
|
+
}
|
|
1323
|
+
const response = await ((_a = globalThis.client) === null || _a === void 0 ? void 0 : _a.validatorClient.get.getUserStakingTier(address));
|
|
1324
|
+
return (0, helpers_1.encodeJson)(response);
|
|
1325
|
+
}
|
|
1326
|
+
catch (error) {
|
|
1327
|
+
return wrappedError(error);
|
|
1328
|
+
}
|
|
1329
|
+
}
|
|
1330
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmF0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NsaWVudHMvbmF0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSx1REFBdUQ7QUFDdkQ7O0VBRUU7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBd0RGLHNDQU9DO0FBRUQsd0NBNEVDO0FBRUQsc0NBc0JDO0FBRUQsMEJBT0M7QUFFRCxrRkFlQztBQUVELDhCQVdDO0FBRUQsa0NBV0M7QUFFRCx3Q0FnQkM7QUFFRCx3Q0FZQztBQUVELGtEQVdDO0FBRUQsOENBY0M7QUFFRCxnQ0EyRUM7QUFFRCxvQ0FHQztBQUVELGtDQTRDQztBQUVELDBCQTJCQztBQUVELDRCQTJCQztBQUVELHdCQWdDQztBQUVELHNDQWtEQztBQUVELGtEQWtDQztBQUVELDhDQW9CQztBQUVELGdEQWlCQztBQUVELG9DQWlCQztBQUVELDBDQWdDQztBQUVELDRDQW9DQztBQUVELGtFQW1DQztBQUVELDhDQW1EQztBQUVELHdDQTRDQztBQUVELDBDQStCQztBQUVELDREQVdDO0FBRUQsZ0VBZUM7QUFFRCx3Q0F3QkM7QUFFRCw4Q0FzQkM7QUFFRCw0Q0FXQztBQUVELDBEQWlCQztBQUVELDhDQWlCQztBQUVELGtEQWlCQztBQUVELHdDQWdCQztBQUVELDBDQVdDO0FBRUQsb0NBd0NDO0FBRUQsZ0RBMkNDO0FBRUQsb0NBZ0NDO0FBRUQsb0RBK0JDO0FBRUQsb0VBaUJDO0FBRUQsb0ZBYUM7QUFFRCxnREEyQ0M7QUFFRCxzREFrQ0M7QUFFRCxvR0E0QkM7QUFFRCxrREFXQztBQUVELDBEQWdCQztBQUVELGdFQVlDO0FBRUQsZ0RBbUJDO0FBRUQsc0RBeUJDO0FBRUQsb0VBV0M7QUFFRCxnREFXQztBQUVELGdEQWdCQztBQTk5Q0QsMkNBQW1EO0FBQ25ELHlEQUF5RTtBQUN6RSwrQ0FBMkU7QUFDM0UsMkRBQWdEO0FBS2hELG1GQUFxRTtBQUNyRSxnREFB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
|