@ritbit/v4-client-js 1.3.17
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/.env +1 -0
- package/.eslintignore +2 -0
- package/.eslintrc.js +15 -0
- package/.gitleaks.toml +24 -0
- package/.gitleaksignore +1 -0
- package/.nvmrc +1 -0
- package/.prettierignore +3 -0
- package/.prettierrc.json +6 -0
- package/.releaserc +10 -0
- package/.vscode/launch.json +11 -0
- package/LICENSE +13 -0
- package/README.md +83 -0
- package/__native__/__ios__/v4-native-client.js +209891 -0
- package/__native__/__ios__/v4-native-client.js.map +1 -0
- package/__tests__/clients/composite-client.test.ts +140 -0
- package/__tests__/helpers/baseClients.ts +23 -0
- package/__tests__/helpers/constants.ts +130 -0
- package/__tests__/lib/helpers.test.ts +53 -0
- package/__tests__/lib/util.test.ts +77 -0
- package/__tests__/lib/validation.test.ts +289 -0
- package/__tests__/modules/client/AccountEndpoints.test.ts +236 -0
- package/__tests__/modules/client/FaucetEndpoint.test.ts +14 -0
- package/__tests__/modules/client/MarketsEndpoints.test.ts +84 -0
- package/__tests__/modules/client/Transfers.test.ts +44 -0
- package/__tests__/modules/client/UtilityEndpoints.test.ts +29 -0
- package/__tests__/modules/client/ValidatorGetEndpoints.test.ts +50 -0
- package/__tests__/modules/client/ValidatorPostEndpoints.test.ts +52 -0
- package/__tests__/modules/client/constants.ts +5 -0
- package/__tests__/modules/onboarding.test.ts +66 -0
- package/build/cjs/clients/composite-client.js +788 -0
- package/build/cjs/clients/constants.js +293 -0
- package/build/cjs/clients/faucet-client.js +36 -0
- package/build/cjs/clients/helpers/chain-helpers.js +178 -0
- package/build/cjs/clients/helpers/request-helpers.js +65 -0
- package/build/cjs/clients/indexer-client.js +56 -0
- package/build/cjs/clients/lib/axios/axiosRequest.js +34 -0
- package/build/cjs/clients/lib/axios/errors.js +28 -0
- package/build/cjs/clients/lib/axios/index.js +23 -0
- package/build/cjs/clients/lib/axios/types.js +11 -0
- package/build/cjs/clients/lib/cctpProto.js +3242 -0
- package/build/cjs/clients/lib/errors.js +58 -0
- package/build/cjs/clients/lib/registry.js +51 -0
- package/build/cjs/clients/modules/account.js +223 -0
- package/build/cjs/clients/modules/composer.js +404 -0
- package/build/cjs/clients/modules/get.js +469 -0
- package/build/cjs/clients/modules/local-wallet.js +59 -0
- package/build/cjs/clients/modules/markets.js +54 -0
- package/build/cjs/clients/modules/post.js +391 -0
- package/build/cjs/clients/modules/proto-includes.js +72 -0
- package/build/cjs/clients/modules/rest.js +33 -0
- package/build/cjs/clients/modules/signer.js +93 -0
- package/build/cjs/clients/modules/tendermintClient.js +137 -0
- package/build/cjs/clients/modules/utility.js +44 -0
- package/build/cjs/clients/modules/vault.js +25 -0
- package/build/cjs/clients/noble-client.js +75 -0
- package/build/cjs/clients/socket-client.js +301 -0
- package/build/cjs/clients/subaccount.js +33 -0
- package/build/cjs/clients/types.js +43 -0
- package/build/cjs/clients/validator-client.js +81 -0
- package/build/cjs/index.js +73 -0
- package/build/cjs/lib/constants.js +23 -0
- package/build/cjs/lib/errors.js +37 -0
- package/build/cjs/lib/helpers.js +98 -0
- package/build/cjs/lib/onboarding.js +75 -0
- package/build/cjs/lib/trading-key-utils.js +108 -0
- package/build/cjs/lib/utils.js +79 -0
- package/build/cjs/lib/validation.js +150 -0
- package/build/cjs/network_optimizer.js +96 -0
- package/build/cjs/package.json +1 -0
- package/build/cjs/tsconfig.cjs.tsbuildinfo +1 -0
- package/build/cjs/types.js +25 -0
- package/build/esm/__tests__/clients/composite-client.test.d.ts +2 -0
- package/build/esm/__tests__/clients/composite-client.test.d.ts.map +1 -0
- package/build/esm/__tests__/clients/composite-client.test.js +128 -0
- package/build/esm/__tests__/helpers/baseClients.d.ts +19 -0
- package/build/esm/__tests__/helpers/baseClients.d.ts.map +1 -0
- package/build/esm/__tests__/helpers/baseClients.js +22 -0
- package/build/esm/__tests__/helpers/constants.d.ts +19 -0
- package/build/esm/__tests__/helpers/constants.d.ts.map +1 -0
- package/build/esm/__tests__/helpers/constants.js +104 -0
- package/build/esm/__tests__/lib/helpers.test.d.ts +2 -0
- package/build/esm/__tests__/lib/helpers.test.d.ts.map +1 -0
- package/build/esm/__tests__/lib/helpers.test.js +40 -0
- package/build/esm/__tests__/lib/util.test.d.ts +2 -0
- package/build/esm/__tests__/lib/util.test.d.ts.map +1 -0
- package/build/esm/__tests__/lib/util.test.js +65 -0
- package/build/esm/__tests__/lib/validation.test.d.ts +2 -0
- package/build/esm/__tests__/lib/validation.test.d.ts.map +1 -0
- package/build/esm/__tests__/lib/validation.test.js +249 -0
- package/build/esm/__tests__/modules/client/AccountEndpoints.test.d.ts +2 -0
- package/build/esm/__tests__/modules/client/AccountEndpoints.test.d.ts.map +1 -0
- package/build/esm/__tests__/modules/client/AccountEndpoints.test.js +169 -0
- package/build/esm/__tests__/modules/client/FaucetEndpoint.test.d.ts +2 -0
- package/build/esm/__tests__/modules/client/FaucetEndpoint.test.d.ts.map +1 -0
- package/build/esm/__tests__/modules/client/FaucetEndpoint.test.js +13 -0
- package/build/esm/__tests__/modules/client/MarketsEndpoints.test.d.ts +2 -0
- package/build/esm/__tests__/modules/client/MarketsEndpoints.test.d.ts.map +1 -0
- package/build/esm/__tests__/modules/client/MarketsEndpoints.test.js +66 -0
- package/build/esm/__tests__/modules/client/Transfers.test.d.ts +2 -0
- package/build/esm/__tests__/modules/client/Transfers.test.d.ts.map +1 -0
- package/build/esm/__tests__/modules/client/Transfers.test.js +39 -0
- package/build/esm/__tests__/modules/client/UtilityEndpoints.test.d.ts +2 -0
- package/build/esm/__tests__/modules/client/UtilityEndpoints.test.d.ts.map +1 -0
- package/build/esm/__tests__/modules/client/UtilityEndpoints.test.js +26 -0
- package/build/esm/__tests__/modules/client/ValidatorGetEndpoints.test.d.ts +2 -0
- package/build/esm/__tests__/modules/client/ValidatorGetEndpoints.test.d.ts.map +1 -0
- package/build/esm/__tests__/modules/client/ValidatorGetEndpoints.test.js +44 -0
- package/build/esm/__tests__/modules/client/ValidatorPostEndpoints.test.d.ts +2 -0
- package/build/esm/__tests__/modules/client/ValidatorPostEndpoints.test.d.ts.map +1 -0
- package/build/esm/__tests__/modules/client/ValidatorPostEndpoints.test.js +48 -0
- package/build/esm/__tests__/modules/client/constants.d.ts +4 -0
- package/build/esm/__tests__/modules/client/constants.d.ts.map +1 -0
- package/build/esm/__tests__/modules/client/constants.js +4 -0
- package/build/esm/__tests__/modules/onboarding.test.d.ts +2 -0
- package/build/esm/__tests__/modules/onboarding.test.d.ts.map +1 -0
- package/build/esm/__tests__/modules/onboarding.test.js +48 -0
- package/build/esm/examples/account_endpoints.d.ts +5 -0
- package/build/esm/examples/account_endpoints.d.ts.map +1 -0
- package/build/esm/examples/account_endpoints.js +127 -0
- package/build/esm/examples/batch_cancel_orders_example.d.ts +2 -0
- package/build/esm/examples/batch_cancel_orders_example.d.ts.map +1 -0
- package/build/esm/examples/batch_cancel_orders_example.js +88 -0
- package/build/esm/examples/composite_example.d.ts +2 -0
- package/build/esm/examples/composite_example.d.ts.map +1 -0
- package/build/esm/examples/composite_example.js +45 -0
- package/build/esm/examples/constants.d.ts +13 -0
- package/build/esm/examples/constants.d.ts.map +1 -0
- package/build/esm/examples/constants.js +29 -0
- package/build/esm/examples/faucet_endpoint.d.ts +5 -0
- package/build/esm/examples/faucet_endpoint.d.ts.map +1 -0
- package/build/esm/examples/faucet_endpoint.js +21 -0
- package/build/esm/examples/gov_add_new_market.d.ts +2 -0
- package/build/esm/examples/gov_add_new_market.d.ts.map +1 -0
- package/build/esm/examples/gov_add_new_market.js +72 -0
- package/build/esm/examples/human_readable_orders.json +86 -0
- package/build/esm/examples/human_readable_short_term_orders.json +42 -0
- package/build/esm/examples/json-encoding.d.ts +2 -0
- package/build/esm/examples/json-encoding.d.ts.map +1 -0
- package/build/esm/examples/json-encoding.js +27 -0
- package/build/esm/examples/long_term_order_cancel_example.d.ts +2 -0
- package/build/esm/examples/long_term_order_cancel_example.d.ts.map +1 -0
- package/build/esm/examples/long_term_order_cancel_example.js +58 -0
- package/build/esm/examples/markets_endpoints.d.ts +5 -0
- package/build/esm/examples/markets_endpoints.d.ts.map +1 -0
- package/build/esm/examples/markets_endpoints.js +131 -0
- package/build/esm/examples/native_examples.d.ts +2 -0
- package/build/esm/examples/native_examples.d.ts.map +1 -0
- package/build/esm/examples/native_examples.js +110 -0
- package/build/esm/examples/noble_example.d.ts +2 -0
- package/build/esm/examples/noble_example.d.ts.map +1 -0
- package/build/esm/examples/noble_example.js +83 -0
- package/build/esm/examples/optimal_node.d.ts +2 -0
- package/build/esm/examples/optimal_node.d.ts.map +1 -0
- package/build/esm/examples/optimal_node.js +68 -0
- package/build/esm/examples/permissioned_keys_example.d.ts +2 -0
- package/build/esm/examples/permissioned_keys_example.d.ts.map +1 -0
- package/build/esm/examples/permissioned_keys_example.js +99 -0
- package/build/esm/examples/raw_orders.json +130 -0
- package/build/esm/examples/short_term_order_cancel_example.d.ts +2 -0
- package/build/esm/examples/short_term_order_cancel_example.d.ts.map +1 -0
- package/build/esm/examples/short_term_order_cancel_example.js +49 -0
- package/build/esm/examples/short_term_order_composite_example.d.ts +2 -0
- package/build/esm/examples/short_term_order_composite_example.d.ts.map +1 -0
- package/build/esm/examples/short_term_order_composite_example.js +63 -0
- package/build/esm/examples/test.d.ts +2 -0
- package/build/esm/examples/test.d.ts.map +1 -0
- package/build/esm/examples/test.js +45 -0
- package/build/esm/examples/transfer_example_deposit.d.ts +2 -0
- package/build/esm/examples/transfer_example_deposit.d.ts.map +1 -0
- package/build/esm/examples/transfer_example_deposit.js +24 -0
- package/build/esm/examples/transfer_example_send.d.ts +2 -0
- package/build/esm/examples/transfer_example_send.d.ts.map +1 -0
- package/build/esm/examples/transfer_example_send.js +37 -0
- package/build/esm/examples/transfer_example_subaccount_transfer.d.ts +2 -0
- package/build/esm/examples/transfer_example_subaccount_transfer.d.ts.map +1 -0
- package/build/esm/examples/transfer_example_subaccount_transfer.js +24 -0
- package/build/esm/examples/transfer_example_withdraw.d.ts +2 -0
- package/build/esm/examples/transfer_example_withdraw.d.ts.map +1 -0
- package/build/esm/examples/transfer_example_withdraw.js +25 -0
- package/build/esm/examples/transfer_example_withdraw_other.d.ts +2 -0
- package/build/esm/examples/transfer_example_withdraw_other.d.ts.map +1 -0
- package/build/esm/examples/transfer_example_withdraw_other.js +37 -0
- package/build/esm/examples/utility_endpoints.d.ts +5 -0
- package/build/esm/examples/utility_endpoints.d.ts.map +1 -0
- package/build/esm/examples/utility_endpoints.js +40 -0
- package/build/esm/examples/validator_get_example.d.ts +2 -0
- package/build/esm/examples/validator_get_example.d.ts.map +1 -0
- package/build/esm/examples/validator_get_example.js +156 -0
- package/build/esm/examples/validator_post_example.d.ts +2 -0
- package/build/esm/examples/validator_post_example.d.ts.map +1 -0
- package/build/esm/examples/validator_post_example.js +71 -0
- package/build/esm/examples/wallet_address.d.ts +2 -0
- package/build/esm/examples/wallet_address.d.ts.map +1 -0
- package/build/esm/examples/wallet_address.js +17 -0
- package/build/esm/examples/websocket_example.d.ts +2 -0
- package/build/esm/examples/websocket_example.d.ts.map +1 -0
- package/build/esm/examples/websocket_example.js +34 -0
- package/build/esm/examples/websocket_orderbook_example.d.ts +2 -0
- package/build/esm/examples/websocket_orderbook_example.d.ts.map +1 -0
- package/build/esm/examples/websocket_orderbook_example.js +194 -0
- package/build/esm/src/clients/composite-client.d.ts +406 -0
- package/build/esm/src/clients/composite-client.d.ts.map +1 -0
- package/build/esm/src/clients/composite-client.js +781 -0
- package/build/esm/src/clients/constants.d.ts +170 -0
- package/build/esm/src/clients/constants.d.ts.map +1 -0
- package/build/esm/src/clients/constants.js +269 -0
- package/build/esm/src/clients/faucet-client.d.ts +18 -0
- package/build/esm/src/clients/faucet-client.d.ts.map +1 -0
- package/build/esm/src/clients/faucet-client.js +29 -0
- package/build/esm/src/clients/helpers/chain-helpers.d.ts +15 -0
- package/build/esm/src/clients/helpers/chain-helpers.d.ts.map +1 -0
- package/build/esm/src/clients/helpers/chain-helpers.js +163 -0
- package/build/esm/src/clients/helpers/request-helpers.d.ts +3 -0
- package/build/esm/src/clients/helpers/request-helpers.d.ts.map +1 -0
- package/build/esm/src/clients/helpers/request-helpers.js +58 -0
- package/build/esm/src/clients/indexer-client.d.ts +40 -0
- package/build/esm/src/clients/indexer-client.d.ts.map +1 -0
- package/build/esm/src/clients/indexer-client.js +49 -0
- package/build/esm/src/clients/lib/axios/axiosRequest.d.ts +9 -0
- package/build/esm/src/clients/lib/axios/axiosRequest.d.ts.map +1 -0
- package/build/esm/src/clients/lib/axios/axiosRequest.js +28 -0
- package/build/esm/src/clients/lib/axios/errors.d.ts +31 -0
- package/build/esm/src/clients/lib/axios/errors.d.ts.map +1 -0
- package/build/esm/src/clients/lib/axios/errors.js +23 -0
- package/build/esm/src/clients/lib/axios/index.d.ts +7 -0
- package/build/esm/src/clients/lib/axios/index.d.ts.map +1 -0
- package/build/esm/src/clients/lib/axios/index.js +7 -0
- package/build/esm/src/clients/lib/axios/types.d.ts +7 -0
- package/build/esm/src/clients/lib/axios/types.d.ts.map +1 -0
- package/build/esm/src/clients/lib/axios/types.js +8 -0
- package/build/esm/src/clients/lib/cctpProto.d.ts +670 -0
- package/build/esm/src/clients/lib/cctpProto.d.ts.map +1 -0
- package/build/esm/src/clients/lib/cctpProto.js +3234 -0
- package/build/esm/src/clients/lib/errors.d.ts +38 -0
- package/build/esm/src/clients/lib/errors.d.ts.map +1 -0
- package/build/esm/src/clients/lib/errors.js +50 -0
- package/build/esm/src/clients/lib/registry.d.ts +4 -0
- package/build/esm/src/clients/lib/registry.d.ts.map +1 -0
- package/build/esm/src/clients/lib/registry.js +47 -0
- package/build/esm/src/clients/modules/account.d.ts +30 -0
- package/build/esm/src/clients/modules/account.d.ts.map +1 -0
- package/build/esm/src/clients/modules/account.js +217 -0
- package/build/esm/src/clients/modules/composer.d.ts +37 -0
- package/build/esm/src/clients/modules/composer.d.ts.map +1 -0
- package/build/esm/src/clients/modules/composer.js +397 -0
- package/build/esm/src/clients/modules/get.d.ts +193 -0
- package/build/esm/src/clients/modules/get.d.ts.map +1 -0
- package/build/esm/src/clients/modules/get.js +429 -0
- package/build/esm/src/clients/modules/local-wallet.d.ts +19 -0
- package/build/esm/src/clients/modules/local-wallet.d.ts.map +1 -0
- package/build/esm/src/clients/modules/local-wallet.js +53 -0
- package/build/esm/src/clients/modules/markets.d.ts +14 -0
- package/build/esm/src/clients/modules/markets.d.ts.map +1 -0
- package/build/esm/src/clients/modules/markets.js +48 -0
- package/build/esm/src/clients/modules/post.d.ts +133 -0
- package/build/esm/src/clients/modules/post.d.ts.map +1 -0
- package/build/esm/src/clients/modules/post.js +384 -0
- package/build/esm/src/clients/modules/proto-includes.d.ts +30 -0
- package/build/esm/src/clients/modules/proto-includes.d.ts.map +1 -0
- package/build/esm/src/clients/modules/proto-includes.js +32 -0
- package/build/esm/src/clients/modules/rest.d.ts +12 -0
- package/build/esm/src/clients/modules/rest.d.ts.map +1 -0
- package/build/esm/src/clients/modules/rest.js +27 -0
- package/build/esm/src/clients/modules/signer.d.ts +19 -0
- package/build/esm/src/clients/modules/signer.d.ts.map +1 -0
- package/build/esm/src/clients/modules/signer.js +86 -0
- package/build/esm/src/clients/modules/tendermintClient.d.ts +54 -0
- package/build/esm/src/clients/modules/tendermintClient.d.ts.map +1 -0
- package/build/esm/src/clients/modules/tendermintClient.js +133 -0
- package/build/esm/src/clients/modules/utility.d.ts +27 -0
- package/build/esm/src/clients/modules/utility.d.ts.map +1 -0
- package/build/esm/src/clients/modules/utility.js +38 -0
- package/build/esm/src/clients/modules/vault.d.ts +12 -0
- package/build/esm/src/clients/modules/vault.d.ts.map +1 -0
- package/build/esm/src/clients/modules/vault.js +19 -0
- package/build/esm/src/clients/native.d.ts +75 -0
- package/build/esm/src/clients/native.d.ts.map +1 -0
- package/build/esm/src/clients/native.js +1237 -0
- package/build/esm/src/clients/noble-client.d.ts +18 -0
- package/build/esm/src/clients/noble-client.d.ts.map +1 -0
- package/build/esm/src/clients/noble-client.js +71 -0
- package/build/esm/src/clients/socket-client.d.ts +146 -0
- package/build/esm/src/clients/socket-client.d.ts.map +1 -0
- package/build/esm/src/clients/socket-client.js +294 -0
- package/build/esm/src/clients/subaccount.d.ts +14 -0
- package/build/esm/src/clients/subaccount.d.ts.map +1 -0
- package/build/esm/src/clients/subaccount.js +29 -0
- package/build/esm/src/clients/types.d.ts +137 -0
- package/build/esm/src/clients/types.d.ts.map +1 -0
- package/build/esm/src/clients/types.js +26 -0
- package/build/esm/src/clients/validator-client.d.ts +35 -0
- package/build/esm/src/clients/validator-client.d.ts.map +1 -0
- package/build/esm/src/clients/validator-client.js +74 -0
- package/build/esm/src/index.d.ts +17 -0
- package/build/esm/src/index.d.ts.map +1 -0
- package/build/esm/src/index.js +19 -0
- package/build/esm/src/lib/constants.d.ts +13 -0
- package/build/esm/src/lib/constants.d.ts.map +1 -0
- package/build/esm/src/lib/constants.js +20 -0
- package/build/esm/src/lib/errors.d.ts +23 -0
- package/build/esm/src/lib/errors.d.ts.map +1 -0
- package/build/esm/src/lib/errors.js +31 -0
- package/build/esm/src/lib/helpers.d.ts +22 -0
- package/build/esm/src/lib/helpers.d.ts.map +1 -0
- package/build/esm/src/lib/helpers.js +88 -0
- package/build/esm/src/lib/onboarding.d.ts +46 -0
- package/build/esm/src/lib/onboarding.d.ts.map +1 -0
- package/build/esm/src/lib/onboarding.js +69 -0
- package/build/esm/src/lib/trading-key-utils.d.ts +22 -0
- package/build/esm/src/lib/trading-key-utils.d.ts.map +1 -0
- package/build/esm/src/lib/trading-key-utils.js +99 -0
- package/build/esm/src/lib/utils.d.ts +39 -0
- package/build/esm/src/lib/utils.d.ts.map +1 -0
- package/build/esm/src/lib/utils.js +69 -0
- package/build/esm/src/lib/validation.d.ts +26 -0
- package/build/esm/src/lib/validation.d.ts.map +1 -0
- package/build/esm/src/lib/validation.js +138 -0
- package/build/esm/src/network_optimizer.d.ts +8 -0
- package/build/esm/src/network_optimizer.d.ts.map +1 -0
- package/build/esm/src/network_optimizer.js +91 -0
- package/build/esm/src/types.d.ts +26 -0
- package/build/esm/src/types.d.ts.map +1 -0
- package/build/esm/src/types.js +8 -0
- package/build/esm/tsconfig.esm.tsbuildinfo +1 -0
- package/commitlint.config.js +8 -0
- package/examples/account_endpoints.ts +129 -0
- package/examples/batch_cancel_orders_example.ts +130 -0
- package/examples/composite_example.ts +65 -0
- package/examples/constants.ts +42 -0
- package/examples/faucet_endpoint.ts +24 -0
- package/examples/gov_add_new_market.json +64 -0
- package/examples/gov_add_new_market.ts +95 -0
- package/examples/human_readable_orders.json +86 -0
- package/examples/human_readable_short_term_orders.json +42 -0
- package/examples/json-encoding.ts +33 -0
- package/examples/long_term_order_cancel_example.ts +87 -0
- package/examples/markets_endpoints.ts +134 -0
- package/examples/native_examples.ts +151 -0
- package/examples/noble_example.ts +107 -0
- package/examples/optimal_node.ts +70 -0
- package/examples/permissioned_keys_example.ts +162 -0
- package/examples/raw_orders.json +130 -0
- package/examples/short_term_order_cancel_example.ts +68 -0
- package/examples/short_term_order_composite_example.ts +80 -0
- package/examples/test.ts +65 -0
- package/examples/transfer_example_deposit.ts +28 -0
- package/examples/transfer_example_send.ts +60 -0
- package/examples/transfer_example_subaccount_transfer.ts +29 -0
- package/examples/transfer_example_withdraw.ts +31 -0
- package/examples/transfer_example_withdraw_other.ts +60 -0
- package/examples/utility_endpoints.ts +42 -0
- package/examples/validator_get_example.ts +160 -0
- package/examples/validator_post_example.ts +81 -0
- package/examples/wallet_address.ts +18 -0
- package/examples/websocket_example.ts +44 -0
- package/examples/websocket_orderbook_example.ts +239 -0
- package/jest.config.js +12 -0
- package/jest.globalSetup.js +5 -0
- package/jest.setup.js +1 -0
- package/package.json +113 -0
- package/ritbit-v4-client-js-1.3.17.tgz +0 -0
- package/scripts/bump_version.sh +16 -0
- package/scripts/generate-cctp-protos.sh +41 -0
- package/scripts/mobile_build_pack.sh +5 -0
- package/scripts/publish-if-not-exists.sh +21 -0
- package/src/clients/composite-client.ts +1431 -0
- package/src/clients/constants.ts +358 -0
- package/src/clients/faucet-client.ts +48 -0
- package/src/clients/helpers/chain-helpers.ts +231 -0
- package/src/clients/helpers/request-helpers.ts +71 -0
- package/src/clients/indexer-client.ts +61 -0
- package/src/clients/lib/axios/axiosRequest.ts +41 -0
- package/src/clients/lib/axios/errors.ts +41 -0
- package/src/clients/lib/axios/index.ts +7 -0
- package/src/clients/lib/axios/types.ts +6 -0
- package/src/clients/lib/cctpProto.ts +4197 -0
- package/src/clients/lib/errors.ts +63 -0
- package/src/clients/lib/registry.ts +88 -0
- package/src/clients/modules/account.ts +388 -0
- package/src/clients/modules/composer.ts +645 -0
- package/src/clients/modules/get.ts +740 -0
- package/src/clients/modules/local-wallet.ts +79 -0
- package/src/clients/modules/markets.ts +71 -0
- package/src/clients/modules/post.ts +1016 -0
- package/src/clients/modules/proto-includes.ts +33 -0
- package/src/clients/modules/rest.ts +40 -0
- package/src/clients/modules/signer.ts +139 -0
- package/src/clients/modules/tendermintClient.ts +168 -0
- package/src/clients/modules/utility.ts +47 -0
- package/src/clients/modules/vault.ts +23 -0
- package/src/clients/native.ts +1508 -0
- package/src/clients/noble-client.ts +108 -0
- package/src/clients/socket-client.ts +331 -0
- package/src/clients/subaccount.ts +57 -0
- package/src/clients/types.ts +191 -0
- package/src/clients/validator-client.ts +103 -0
- package/src/index.ts +20 -0
- package/src/lib/constants.ts +28 -0
- package/src/lib/errors.ts +38 -0
- package/src/lib/helpers.ts +99 -0
- package/src/lib/onboarding.ts +96 -0
- package/src/lib/trading-key-utils.ts +136 -0
- package/src/lib/utils.ts +84 -0
- package/src/lib/validation.ts +197 -0
- package/src/network_optimizer.ts +132 -0
- package/src/types.ts +44 -0
- package/tasks.json +16 -0
- package/tsconfig.base.json +15 -0
- package/tsconfig.cjs.json +20 -0
- package/tsconfig.eslint.json +14 -0
- package/tsconfig.esm.json +11 -0
- package/webpack.config.js +56 -0
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { HDKey } from '@scure/bip32';
|
|
2
|
+
import { entropyToMnemonic, mnemonicToSeedSync } from '@scure/bip39';
|
|
3
|
+
import { wordlist } from '@scure/bip39/wordlists/english';
|
|
4
|
+
import { keccak256 } from 'ethereum-cryptography/keccak';
|
|
5
|
+
import { stripHexPrefix } from './helpers';
|
|
6
|
+
/**
|
|
7
|
+
* @description Get Mnemonic and priv/pub keys from privateKeyBytes and BIP44 HD path
|
|
8
|
+
*
|
|
9
|
+
* @url https://github.com/confio/cosmos-hd-key-derivation-spec#bip44
|
|
10
|
+
*
|
|
11
|
+
* @param entropy used to generate mnemonic
|
|
12
|
+
*
|
|
13
|
+
* @param path BIP44 HD Path. Default is The Cosmos Hub path
|
|
14
|
+
*
|
|
15
|
+
* @throws Error if the hdkey does not exist
|
|
16
|
+
*
|
|
17
|
+
* @returns Mnemonic and priv/pub keys
|
|
18
|
+
*/
|
|
19
|
+
export const exportMnemonicAndPrivateKey = (entropy, path = "m/44'/118'/0'/0/0") => {
|
|
20
|
+
const mnemonic = entropyToMnemonic(entropy, wordlist);
|
|
21
|
+
const { privateKey, publicKey } = deriveHDKeyFromMnemonic(mnemonic, path);
|
|
22
|
+
return {
|
|
23
|
+
mnemonic,
|
|
24
|
+
privateKey,
|
|
25
|
+
publicKey,
|
|
26
|
+
};
|
|
27
|
+
};
|
|
28
|
+
/**
|
|
29
|
+
* @description Get private information for onboarding using an Ethereum Signature.
|
|
30
|
+
*
|
|
31
|
+
* @returns Mnemonic and Public/Private HD keys
|
|
32
|
+
*/
|
|
33
|
+
export const deriveHDKeyFromEthereumSignature = (signature) => {
|
|
34
|
+
const buffer = Buffer.from(stripHexPrefix(signature), 'hex');
|
|
35
|
+
if (buffer.length !== 65) {
|
|
36
|
+
throw new Error('Signature must be 65 bytes');
|
|
37
|
+
}
|
|
38
|
+
// Remove the 'v' value by taking only the first 64 bytes of the signature
|
|
39
|
+
const rsValues = buffer.subarray(0, 64);
|
|
40
|
+
// Hash the 'r' and 's' values down to 32 bytes (256 bits) using Keccak-256
|
|
41
|
+
const entropy = keccak256(rsValues);
|
|
42
|
+
return exportMnemonicAndPrivateKey(entropy);
|
|
43
|
+
};
|
|
44
|
+
/**
|
|
45
|
+
* @description Derive priv/pub keys from mnemonic and BIP44 HD path
|
|
46
|
+
*
|
|
47
|
+
* @url https://github.com/confio/cosmos-hd-key-derivation-spec#bip44
|
|
48
|
+
*
|
|
49
|
+
* @param mnemonic used to generate seed
|
|
50
|
+
*
|
|
51
|
+
* @param path BIP44 HD Path. Default is The Cosmos Hub path
|
|
52
|
+
*
|
|
53
|
+
* @throws Error if the hdkey does not exist
|
|
54
|
+
*
|
|
55
|
+
* @returns Priv/pub keys
|
|
56
|
+
*/
|
|
57
|
+
export const deriveHDKeyFromMnemonic = (mnemonic, path = "m/44'/118'/0'/0/0") => {
|
|
58
|
+
const seed = mnemonicToSeedSync(mnemonic);
|
|
59
|
+
const hdkey = HDKey.fromMasterSeed(seed);
|
|
60
|
+
const derivedHdkey = hdkey.derive(path);
|
|
61
|
+
if (!hdkey.privateKey) {
|
|
62
|
+
throw new Error('null hd key');
|
|
63
|
+
}
|
|
64
|
+
return {
|
|
65
|
+
privateKey: derivedHdkey.privateKey,
|
|
66
|
+
publicKey: derivedHdkey.publicKey,
|
|
67
|
+
};
|
|
68
|
+
};
|
|
69
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib25ib2FyZGluZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvb25ib2FyZGluZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ3JDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUNyRSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDMUQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBRXpELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFM0M7Ozs7Ozs7Ozs7OztHQVlHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sMkJBQTJCLEdBQUcsQ0FDekMsT0FBbUIsRUFDbkIsT0FBZSxtQkFBbUIsRUFLbEMsRUFBRTtJQUNGLE1BQU0sUUFBUSxHQUFHLGlCQUFpQixDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsQ0FBQztJQUN0RCxNQUFNLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxHQUFHLHVCQUF1QixDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUMxRSxPQUFPO1FBQ0wsUUFBUTtRQUNSLFVBQVU7UUFDVixTQUFTO0tBQ1YsQ0FBQztBQUNKLENBQUMsQ0FBQztBQUVGOzs7O0dBSUc7QUFDSCxNQUFNLENBQUMsTUFBTSxnQ0FBZ0MsR0FBRyxDQUM5QyxTQUFpQixFQUtqQixFQUFFO0lBQ0YsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFFN0QsSUFBSSxNQUFNLENBQUMsTUFBTSxLQUFLLEVBQUUsRUFBRSxDQUFDO1FBQ3pCLE1BQU0sSUFBSSxLQUFLLENBQUMsNEJBQTRCLENBQUMsQ0FBQztJQUNoRCxDQUFDO0lBRUQsMEVBQTBFO0lBQzFFLE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ3hDLDJFQUEyRTtJQUMzRSxNQUFNLE9BQU8sR0FBRyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDcEMsT0FBTywyQkFBMkIsQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUM5QyxDQUFDLENBQUM7QUFFRjs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSCxNQUFNLENBQUMsTUFBTSx1QkFBdUIsR0FBRyxDQUNyQyxRQUFnQixFQUNoQixPQUFlLG1CQUFtQixFQUlsQyxFQUFFO0lBQ0YsTUFBTSxJQUFJLEdBQUcsa0JBQWtCLENBQUMsUUFBUSxDQUFDLENBQUM7SUFFMUMsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN6QyxNQUFNLFlBQVksR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBRXhDLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDdEIsTUFBTSxJQUFJLEtBQUssQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUNqQyxDQUFDO0lBRUQsT0FBTztRQUNMLFVBQVUsRUFBRSxZQUFZLENBQUMsVUFBVTtRQUNuQyxTQUFTLEVBQUUsWUFBWSxDQUFDLFNBQVM7S0FDbEMsQ0FBQztBQUNKLENBQUMsQ0FBQyJ9
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { AuthenticatorType } from '../clients/constants';
|
|
2
|
+
import { type Get } from '../clients/modules/get';
|
|
3
|
+
export declare const createNewRandomDydxWallet: () => Promise<{
|
|
4
|
+
privateKeyHex: string;
|
|
5
|
+
mnemonic: string;
|
|
6
|
+
publicKey: string;
|
|
7
|
+
address: string;
|
|
8
|
+
} | undefined>;
|
|
9
|
+
export declare const getAuthorizeNewTradingKeyArguments: ({ generatedWalletPubKey, }: {
|
|
10
|
+
generatedWalletPubKey: string;
|
|
11
|
+
}) => {
|
|
12
|
+
type: AuthenticatorType;
|
|
13
|
+
data: Uint8Array;
|
|
14
|
+
};
|
|
15
|
+
type Awaited<T> = T extends Promise<infer U> ? U : T;
|
|
16
|
+
export declare const getAuthorizedTradingKeysMetadata: (authorizedKeys: Awaited<ReturnType<Get["getAuthenticators"]>>["accountAuthenticators"]) => Array<{
|
|
17
|
+
id: string;
|
|
18
|
+
publicKey: string;
|
|
19
|
+
address: string;
|
|
20
|
+
}>;
|
|
21
|
+
export {};
|
|
22
|
+
//# sourceMappingURL=trading-key-utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trading-key-utils.d.ts","sourceRoot":"","sources":["../../../../src/lib/trading-key-utils.ts"],"names":[],"mappings":"AAKA,OAAO,EAEL,iBAAiB,EAIlB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,KAAK,GAAG,EAAE,MAAM,wBAAwB,CAAC;AAKlD,eAAO,MAAM,yBAAyB,QAAa,OAAO,CACxD;IAAE,aAAa,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAwB5F,CAAC;AAIF,eAAO,MAAM,kCAAkC,GAAI,4BAEhD;IACD,qBAAqB,EAAE,MAAM,CAAC;CAC/B,KAAG;IAAE,IAAI,EAAE,iBAAiB,CAAC;IAAC,IAAI,EAAE,UAAU,CAAA;CA6C9C,CAAC;AAGF,KAAK,OAAO,CAAC,CAAC,IAAI,CAAC,SAAS,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AAIrD,eAAO,MAAM,gCAAgC,GAC3C,gBAAgB,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,uBAAuB,CAAC,KACrF,KAAK,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CA+B1D,CAAC"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { fromBase64, toBase64, toBech32, toHex } from '@cosmjs/encoding';
|
|
2
|
+
import { rawSecp256k1PubkeyToRawAddress } from '@cosmjs/tendermint-rpc';
|
|
3
|
+
import { generateMnemonic } from '@scure/bip39';
|
|
4
|
+
import { wordlist } from '@scure/bip39/wordlists/english';
|
|
5
|
+
import { AuthenticatorType, TYPE_URL_BATCH_CANCEL, TYPE_URL_MSG_CANCEL_ORDER, TYPE_URL_MSG_PLACE_ORDER, } from '../clients/constants';
|
|
6
|
+
import LocalWallet from '../clients/modules/local-wallet';
|
|
7
|
+
import { BECH32_PREFIX } from './constants';
|
|
8
|
+
import { deriveHDKeyFromMnemonic } from './onboarding';
|
|
9
|
+
export const createNewRandomDydxWallet = async () => {
|
|
10
|
+
const mnemonic = generateMnemonic(wordlist, 128);
|
|
11
|
+
const { privateKey: privateKeyRaw } = deriveHDKeyFromMnemonic(mnemonic);
|
|
12
|
+
const wallet = await LocalWallet.fromMnemonic(mnemonic, BECH32_PREFIX);
|
|
13
|
+
const privateKeyHex = privateKeyRaw != null ? `0x${toHex(privateKeyRaw)}` : undefined;
|
|
14
|
+
const publicKey = wallet.pubKey;
|
|
15
|
+
const address = wallet.address;
|
|
16
|
+
if (privateKeyHex == null || publicKey == null || address == null) {
|
|
17
|
+
return undefined;
|
|
18
|
+
}
|
|
19
|
+
return {
|
|
20
|
+
// 12 english words
|
|
21
|
+
mnemonic,
|
|
22
|
+
// toHex of the raw private key bits
|
|
23
|
+
privateKeyHex,
|
|
24
|
+
// base64, not hex
|
|
25
|
+
publicKey: publicKey.value,
|
|
26
|
+
// valid dydx address corresponding to the key pair
|
|
27
|
+
address,
|
|
28
|
+
};
|
|
29
|
+
};
|
|
30
|
+
// arguments to authorize a given wallet public key to trade on behalf of the user.
|
|
31
|
+
// allows place order, cancel order, batch cancel on subaccount 0 only.
|
|
32
|
+
export const getAuthorizeNewTradingKeyArguments = ({ generatedWalletPubKey, }) => {
|
|
33
|
+
const wrapAndEncode64 = (s) => toBase64(new TextEncoder().encode(s));
|
|
34
|
+
const messageFilterSubAuth = [
|
|
35
|
+
{
|
|
36
|
+
type: AuthenticatorType.MESSAGE_FILTER,
|
|
37
|
+
config: wrapAndEncode64(TYPE_URL_MSG_PLACE_ORDER),
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
type: AuthenticatorType.MESSAGE_FILTER,
|
|
41
|
+
config: wrapAndEncode64(TYPE_URL_MSG_CANCEL_ORDER),
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
type: AuthenticatorType.MESSAGE_FILTER,
|
|
45
|
+
config: wrapAndEncode64(TYPE_URL_BATCH_CANCEL),
|
|
46
|
+
},
|
|
47
|
+
];
|
|
48
|
+
const anyOfMessageFilterConfigB64 = wrapAndEncode64(JSON.stringify(messageFilterSubAuth));
|
|
49
|
+
const subAuth = [
|
|
50
|
+
{
|
|
51
|
+
type: AuthenticatorType.SIGNATURE_VERIFICATION,
|
|
52
|
+
config: generatedWalletPubKey,
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
type: AuthenticatorType.ANY_OF,
|
|
56
|
+
config: anyOfMessageFilterConfigB64,
|
|
57
|
+
},
|
|
58
|
+
// we limit to cross markets to make it slightly harder to drain user funds on low liquidity markets with trading keys
|
|
59
|
+
// could undo this in the future if people are angry about it
|
|
60
|
+
{
|
|
61
|
+
type: AuthenticatorType.SUBACCOUNT_FILTER,
|
|
62
|
+
config: wrapAndEncode64('0'),
|
|
63
|
+
},
|
|
64
|
+
];
|
|
65
|
+
const jsonString = JSON.stringify(subAuth);
|
|
66
|
+
const encodedData = new TextEncoder().encode(jsonString);
|
|
67
|
+
const topLevelType = AuthenticatorType.ALL_OF;
|
|
68
|
+
return {
|
|
69
|
+
type: topLevelType,
|
|
70
|
+
data: encodedData,
|
|
71
|
+
};
|
|
72
|
+
};
|
|
73
|
+
const isTruthy = (n) => Boolean(n);
|
|
74
|
+
// just parses out keys that match the format created in getAuthorizeNewTradingKeyArguments
|
|
75
|
+
export const getAuthorizedTradingKeysMetadata = (authorizedKeys) => {
|
|
76
|
+
return authorizedKeys
|
|
77
|
+
.map(({ config, id, type }) => {
|
|
78
|
+
var _a;
|
|
79
|
+
if (type !== AuthenticatorType.ALL_OF) {
|
|
80
|
+
return null;
|
|
81
|
+
}
|
|
82
|
+
const parsedConfig = JSON.parse(new TextDecoder().decode(config));
|
|
83
|
+
if (parsedConfig == null) {
|
|
84
|
+
return null;
|
|
85
|
+
}
|
|
86
|
+
const publicKey = (_a = parsedConfig.find((t) => t.type === AuthenticatorType.SIGNATURE_VERIFICATION)) === null || _a === void 0 ? void 0 : _a.config;
|
|
87
|
+
if (publicKey == null || typeof publicKey !== 'string') {
|
|
88
|
+
return null;
|
|
89
|
+
}
|
|
90
|
+
const address = toBech32(BECH32_PREFIX, rawSecp256k1PubkeyToRawAddress(fromBase64(publicKey)));
|
|
91
|
+
return {
|
|
92
|
+
id: id.toString(),
|
|
93
|
+
publicKey,
|
|
94
|
+
address,
|
|
95
|
+
};
|
|
96
|
+
})
|
|
97
|
+
.filter(isTruthy);
|
|
98
|
+
};
|
|
99
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhZGluZy1rZXktdXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3RyYWRpbmcta2V5LXV0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUN6RSxPQUFPLEVBQUUsOEJBQThCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN4RSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDaEQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBRTFELE9BQU8sRUFFTCxpQkFBaUIsRUFDakIscUJBQXFCLEVBQ3JCLHlCQUF5QixFQUN6Qix3QkFBd0IsR0FDekIsTUFBTSxzQkFBc0IsQ0FBQztBQUU5QixPQUFPLFdBQVcsTUFBTSxpQ0FBaUMsQ0FBQztBQUMxRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzVDLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUV2RCxNQUFNLENBQUMsTUFBTSx5QkFBeUIsR0FBRyxLQUFLLElBRTVDLEVBQUU7SUFDRixNQUFNLFFBQVEsR0FBRyxnQkFBZ0IsQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDakQsTUFBTSxFQUFFLFVBQVUsRUFBRSxhQUFhLEVBQUUsR0FBRyx1QkFBdUIsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUN4RSxNQUFNLE1BQU0sR0FBRyxNQUFNLFdBQVcsQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFFLGFBQWEsQ0FBQyxDQUFDO0lBRXZFLE1BQU0sYUFBYSxHQUFHLGFBQWEsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssS0FBSyxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUN0RixN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
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { AxiosProxyConfig } from 'axios';
|
|
2
|
+
import { HttpsProxyAgent } from 'https-proxy-agent';
|
|
3
|
+
/**
|
|
4
|
+
* Returns a random integer value between 0 and (n-1).
|
|
5
|
+
*/
|
|
6
|
+
export declare function randomInt(n: number): number;
|
|
7
|
+
/**
|
|
8
|
+
* Generate a random clientId.
|
|
9
|
+
*/
|
|
10
|
+
export declare function generateRandomClientId(): number;
|
|
11
|
+
/**
|
|
12
|
+
* Deterministically generate a valid clientId from an arbitrary string by performing a
|
|
13
|
+
* quick hashing function on the string.
|
|
14
|
+
*/
|
|
15
|
+
export declare function clientIdFromString(input: string): number;
|
|
16
|
+
/**
|
|
17
|
+
* Pauses the execution of the program for a specified time.
|
|
18
|
+
* @param ms - The number of milliseconds to pause the program.
|
|
19
|
+
* @returns A promise that resolves after the specified number of milliseconds.
|
|
20
|
+
*/
|
|
21
|
+
export declare function sleep(ms: number): Promise<void>;
|
|
22
|
+
/**
|
|
23
|
+
* Returns a title to use for a gov proposal that adds a new market.
|
|
24
|
+
*
|
|
25
|
+
* @param ticker ticker symbol for the new market.
|
|
26
|
+
* @returns title for the gov proposal.
|
|
27
|
+
*/
|
|
28
|
+
export declare function getGovAddNewMarketTitle(ticker: string): string;
|
|
29
|
+
/**
|
|
30
|
+
* Returns a summary to use for a gov proposal that adds a new market.
|
|
31
|
+
*
|
|
32
|
+
* @param ticker ticker symbol for the new market.
|
|
33
|
+
* @param delayBlocks number of blocks to wait before activating the market.
|
|
34
|
+
* @returns summary for the gov proposal.
|
|
35
|
+
*/
|
|
36
|
+
export declare function getGovAddNewMarketSummary(ticker: string, delayBlocks: number): string;
|
|
37
|
+
export declare function calculateClockOffsetFromFetchDateHeader(clientRequestStartTime: number, serverReportedTime: number, clientRequestEndTime: number): number;
|
|
38
|
+
export declare function getProxyAgent(proxy: AxiosProxyConfig): HttpsProxyAgent<string>;
|
|
39
|
+
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../../src/lib/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,OAAO,CAAC;AACzC,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAIpD;;GAEG;AACH,wBAAgB,SAAS,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAE3C;AAED;;GAEG;AACH,wBAAgB,sBAAsB,IAAI,MAAM,CAE/C;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAWxD;AAED;;;;GAIG;AACH,wBAAsB,KAAK,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAErD;AAED;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAE9D;AAED;;;;;;GAMG;AACH,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAErF;AAED,wBAAgB,uCAAuC,CACrD,sBAAsB,EAAE,MAAM,EAC9B,kBAAkB,EAAE,MAAM,EAC1B,oBAAoB,EAAE,MAAM,GAC3B,MAAM,CAQR;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,gBAAgB,GAAG,eAAe,CAAC,MAAM,CAAC,CAG9E"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { HttpsProxyAgent } from 'https-proxy-agent';
|
|
2
|
+
import { MAX_UINT_32 } from '../clients/constants';
|
|
3
|
+
/**
|
|
4
|
+
* Returns a random integer value between 0 and (n-1).
|
|
5
|
+
*/
|
|
6
|
+
export function randomInt(n) {
|
|
7
|
+
return Math.floor(Math.random() * n);
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Generate a random clientId.
|
|
11
|
+
*/
|
|
12
|
+
export function generateRandomClientId() {
|
|
13
|
+
return randomInt(MAX_UINT_32 + 1);
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Deterministically generate a valid clientId from an arbitrary string by performing a
|
|
17
|
+
* quick hashing function on the string.
|
|
18
|
+
*/
|
|
19
|
+
export function clientIdFromString(input) {
|
|
20
|
+
let hash = 0;
|
|
21
|
+
if (input.length === 0)
|
|
22
|
+
return hash;
|
|
23
|
+
for (let i = 0; i < input.length; i++) {
|
|
24
|
+
hash = (hash << 5) - hash + input.charCodeAt(i); // eslint-disable-line no-bitwise
|
|
25
|
+
hash |= 0; // eslint-disable-line no-bitwise
|
|
26
|
+
}
|
|
27
|
+
// Bitwise operators covert the value to a 32-bit integer.
|
|
28
|
+
// We must coerce this into a 32-bit unsigned integer.
|
|
29
|
+
return hash + 2 ** 31;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Pauses the execution of the program for a specified time.
|
|
33
|
+
* @param ms - The number of milliseconds to pause the program.
|
|
34
|
+
* @returns A promise that resolves after the specified number of milliseconds.
|
|
35
|
+
*/
|
|
36
|
+
export async function sleep(ms) {
|
|
37
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Returns a title to use for a gov proposal that adds a new market.
|
|
41
|
+
*
|
|
42
|
+
* @param ticker ticker symbol for the new market.
|
|
43
|
+
* @returns title for the gov proposal.
|
|
44
|
+
*/
|
|
45
|
+
export function getGovAddNewMarketTitle(ticker) {
|
|
46
|
+
return `Add ${ticker} perpetual market`;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Returns a summary to use for a gov proposal that adds a new market.
|
|
50
|
+
*
|
|
51
|
+
* @param ticker ticker symbol for the new market.
|
|
52
|
+
* @param delayBlocks number of blocks to wait before activating the market.
|
|
53
|
+
* @returns summary for the gov proposal.
|
|
54
|
+
*/
|
|
55
|
+
export function getGovAddNewMarketSummary(ticker, delayBlocks) {
|
|
56
|
+
return `Add the x/prices, x/perpetuals and x/clob parameters needed for a ${ticker} perpetual market. Create the market in INITIALIZING status and transition it to ACTIVE status after ${delayBlocks} blocks.`;
|
|
57
|
+
}
|
|
58
|
+
export function calculateClockOffsetFromFetchDateHeader(clientRequestStartTime, serverReportedTime, clientRequestEndTime) {
|
|
59
|
+
// use midpoint, so assume that time for request reach server === time for response to reach us
|
|
60
|
+
const estimatedLocalTimeAtServerArrival = (clientRequestStartTime + clientRequestEndTime) / 2;
|
|
61
|
+
// we need an offset such that estimatedLocalTimeAtServerArrival + offset = serverReportedTime
|
|
62
|
+
const offset = serverReportedTime - estimatedLocalTimeAtServerArrival;
|
|
63
|
+
return Math.floor(offset);
|
|
64
|
+
}
|
|
65
|
+
export function getProxyAgent(proxy) {
|
|
66
|
+
const auth = proxy.auth ? `${proxy.auth.username}:${proxy.auth.password}@` : '';
|
|
67
|
+
return new HttpsProxyAgent(`${proxy.protocol}://${auth}${proxy.host}:${proxy.port}`);
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUVwRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFbkQ7O0dBRUc7QUFDSCxNQUFNLFVBQVUsU0FBUyxDQUFDLENBQVM7SUFDakMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUN2QyxDQUFDO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLFVBQVUsc0JBQXNCO0lBQ3BDLE9BQU8sU0FBUyxDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUNwQyxDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLGtCQUFrQixDQUFDLEtBQWE7SUFDOUMsSUFBSSxJQUFJLEdBQVcsQ0FBQyxDQUFDO0lBQ3JCLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDcEMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUN0QyxJQUFJLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxpQ0FBaUM7UUFDbEYsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLGlDQUFpQztJQUM5QyxDQUFDO0lBRUQsMERBQTBEO0lBQzFELHNEQUFzRDtJQUN0RCxPQUFPLElBQUksR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDO0FBQ3hCLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxLQUFLLENBQUMsRUFBVTtJQUNwQyxPQUFPLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDM0QsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLHVCQUF1QixDQUFDLE1BQWM7SUFDcEQsT0FBTyxPQUFPLE1BQU0sbUJBQW1CLENBQUM7QUFDMUMsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILE1BQU0sVUFBVSx5QkFBeUIsQ0FBQyxNQUFjLEVBQUUsV0FBbUI7SUFDM0UsT0FBTyxxRUFBcUUsTUFBTSx3R0FBd0csV0FBVyxVQUFVLENBQUM7QUFDbE4sQ0FBQztBQUVELE1BQU0sVUFBVSx1Q0FBdUMsQ0FDckQsc0JBQThCLEVBQzlCLGtCQUEwQixFQUMxQixvQkFBNEI7SUFFNUIsK0ZBQStGO0lBQy9GLE1BQU0saUNBQWlDLEdBQUcsQ0FBQyxzQkFBc0IsR0FBRyxvQkFBb0IsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUU5Riw4RkFBOEY7SUFDOUYsTUFBTSxNQUFNLEdBQUcsa0JBQWtCLEdBQUcsaUNBQWlDLENBQUM7SUFFdEUsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQzVCLENBQUM7QUFFRCxNQUFNLFVBQVUsYUFBYSxDQUFDLEtBQXVCO0lBQ25ELE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0lBQ2hGLE9BQU8sSUFBSSxlQUFlLENBQUMsR0FBRyxLQUFLLENBQUMsUUFBUSxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsSUFBSSxJQUFJLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO0FBQ3ZGLENBQUMifQ==
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { Transfer, OrderFlags, ICancelOrder, IPlaceOrder, IBatchCancelOrder } from '../clients/types';
|
|
2
|
+
import { UserError } from './errors';
|
|
3
|
+
/**
|
|
4
|
+
* @describe validatePlaceOrderMessage validates that an order to place has fields that would be
|
|
5
|
+
* valid on-chain.
|
|
6
|
+
*/
|
|
7
|
+
export declare function validatePlaceOrderMessage(subaccountNumber: number, order: IPlaceOrder): UserError | undefined;
|
|
8
|
+
/**
|
|
9
|
+
* @describe validateCancelOrderMessage validates that an order to cancel has fields that would be
|
|
10
|
+
* valid on-chain.
|
|
11
|
+
*/
|
|
12
|
+
export declare function validateCancelOrderMessage(subaccountNumber: number, order: ICancelOrder): UserError | undefined;
|
|
13
|
+
/**
|
|
14
|
+
* @describe validateBatchCancelOrderMessage validates that orders to batch cancel have fields that would be
|
|
15
|
+
* valid on-chain.
|
|
16
|
+
*/
|
|
17
|
+
export declare function validateBatchCancelOrderMessage(subaccountNumber: number, orders: IBatchCancelOrder): UserError | undefined;
|
|
18
|
+
/**
|
|
19
|
+
* @describe validateTransferMessage validates that a transfer to place has fields that would be
|
|
20
|
+
* valid on-chain.
|
|
21
|
+
*/
|
|
22
|
+
export declare function validateTransferMessage(transfer: Transfer): UserError | undefined;
|
|
23
|
+
export declare function verifyOrderFlags(orderFlags: OrderFlags): boolean;
|
|
24
|
+
export declare function isStatefulOrder(orderFlags: OrderFlags): boolean;
|
|
25
|
+
export declare function isValidAddress(address: string): boolean;
|
|
26
|
+
//# sourceMappingURL=validation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../../../src/lib/validation.ts"],"names":[],"mappings":"AAIA,OAAO,EACL,QAAQ,EACR,UAAU,EACV,YAAY,EACZ,WAAW,EACX,iBAAiB,EAClB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAErC;;;GAGG;AACH,wBAAgB,yBAAyB,CACvC,gBAAgB,EAAE,MAAM,EACxB,KAAK,EAAE,WAAW,GACjB,SAAS,GAAG,SAAS,CAyBvB;AAED;;;GAGG;AACH,wBAAgB,0BAA0B,CACxC,gBAAgB,EAAE,MAAM,EACxB,KAAK,EAAE,YAAY,GAClB,SAAS,GAAG,SAAS,CA6BvB;AAED;;;GAGG;AACH,wBAAgB,+BAA+B,CAC7C,gBAAgB,EAAE,MAAM,EACxB,MAAM,EAAE,iBAAiB,GACxB,SAAS,GAAG,SAAS,CAoBvB;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,QAAQ,GAAG,SAAS,GAAG,SAAS,CA2BjF;AA0BD,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO,CAMhE;AAED,wBAAgB,eAAe,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO,CAE/D;AAYD,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAGvD"}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
import { decode } from 'bech32';
|
|
2
|
+
import Long from 'long';
|
|
3
|
+
import { BECH32_PREFIX, MAX_SUBACCOUNT_NUMBER, MAX_UINT_32 } from '../clients/constants';
|
|
4
|
+
import { OrderFlags, } from '../clients/types';
|
|
5
|
+
import { UserError } from './errors';
|
|
6
|
+
/**
|
|
7
|
+
* @describe validatePlaceOrderMessage validates that an order to place has fields that would be
|
|
8
|
+
* valid on-chain.
|
|
9
|
+
*/
|
|
10
|
+
export function validatePlaceOrderMessage(subaccountNumber, order) {
|
|
11
|
+
if (!verifyNumberIsUint32(order.clientId)) {
|
|
12
|
+
return new UserError(`clientId: ${order.clientId} is not a valid uint32`);
|
|
13
|
+
}
|
|
14
|
+
if (order.quantums.lessThanOrEqual(Long.ZERO)) {
|
|
15
|
+
return new UserError(`quantums: ${order.quantums} cannot be <= 0`);
|
|
16
|
+
}
|
|
17
|
+
if (order.subticks.lessThanOrEqual(Long.ZERO)) {
|
|
18
|
+
return new UserError(`subticks: ${order.subticks} cannot be <= 0`);
|
|
19
|
+
}
|
|
20
|
+
if (!verifySubaccountNumber(subaccountNumber)) {
|
|
21
|
+
return new UserError(`subaccountNumber: ${subaccountNumber} cannot be < 0 or > ${MAX_SUBACCOUNT_NUMBER}`);
|
|
22
|
+
}
|
|
23
|
+
if (!isStatefulOrder(order.orderFlags) && !verifyGoodTilBlock(order.goodTilBlock)) {
|
|
24
|
+
return new UserError(`goodTilBlock: ${order.goodTilBlock} is not a valid uint32 or is 0`);
|
|
25
|
+
}
|
|
26
|
+
if (isStatefulOrder(order.orderFlags) && !verifyGoodTilBlockTime(order.goodTilBlockTime)) {
|
|
27
|
+
return new UserError(`goodTilBlockTime: ${order.goodTilBlockTime} is not a valid uint32 or is 0`);
|
|
28
|
+
}
|
|
29
|
+
return undefined;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* @describe validateCancelOrderMessage validates that an order to cancel has fields that would be
|
|
33
|
+
* valid on-chain.
|
|
34
|
+
*/
|
|
35
|
+
export function validateCancelOrderMessage(subaccountNumber, order) {
|
|
36
|
+
if (!verifyNumberIsUint32(order.clientId)) {
|
|
37
|
+
return new UserError(`clientId: ${order.clientId} is not a valid uint32`);
|
|
38
|
+
}
|
|
39
|
+
if (!isStatefulOrder(order.orderFlags) && !verifyGoodTilBlock(order.goodTilBlock)) {
|
|
40
|
+
return new UserError(`goodTilBlock: ${order.goodTilBlock} is not a valid uint32 or is 0`);
|
|
41
|
+
}
|
|
42
|
+
if (!isStatefulOrder(order.orderFlags) && order.goodTilBlockTime !== undefined) {
|
|
43
|
+
return new UserError(`goodTilBlockTime is ${order.goodTilBlockTime}, but should not be set for non-stateful orders`);
|
|
44
|
+
}
|
|
45
|
+
if (isStatefulOrder(order.orderFlags) && !verifyGoodTilBlockTime(order.goodTilBlockTime)) {
|
|
46
|
+
return new UserError(`goodTilBlockTime: ${order.goodTilBlockTime} is not a valid uint32 or is 0`);
|
|
47
|
+
}
|
|
48
|
+
if (isStatefulOrder(order.orderFlags) && order.goodTilBlock !== undefined) {
|
|
49
|
+
return new UserError(`goodTilBlock is ${order.goodTilBlock}, but should not be set for stateful orders`);
|
|
50
|
+
}
|
|
51
|
+
if (!verifySubaccountNumber(subaccountNumber)) {
|
|
52
|
+
return new UserError(`subaccountNumber: ${subaccountNumber} cannot be < 0 or > ${MAX_SUBACCOUNT_NUMBER}`);
|
|
53
|
+
}
|
|
54
|
+
return undefined;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* @describe validateBatchCancelOrderMessage validates that orders to batch cancel have fields that would be
|
|
58
|
+
* valid on-chain.
|
|
59
|
+
*/
|
|
60
|
+
export function validateBatchCancelOrderMessage(subaccountNumber, orders) {
|
|
61
|
+
for (const orderBatch of orders.shortTermOrders) {
|
|
62
|
+
for (const clientId of orderBatch.clientIds) {
|
|
63
|
+
if (!verifyNumberIsUint32(clientId)) {
|
|
64
|
+
return new UserError(`clientId: ${clientId} is not a valid uint32`);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
if (!verifyGoodTilBlock(orders.goodTilBlock)) {
|
|
69
|
+
return new UserError(`goodTilBlock: ${orders.goodTilBlock} is not a valid uint32 or is 0`);
|
|
70
|
+
}
|
|
71
|
+
if (!verifySubaccountNumber(subaccountNumber)) {
|
|
72
|
+
return new UserError(`subaccountNumber: ${subaccountNumber} cannot be < 0 or > ${MAX_SUBACCOUNT_NUMBER}`);
|
|
73
|
+
}
|
|
74
|
+
return undefined;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* @describe validateTransferMessage validates that a transfer to place has fields that would be
|
|
78
|
+
* valid on-chain.
|
|
79
|
+
*/
|
|
80
|
+
export function validateTransferMessage(transfer) {
|
|
81
|
+
if (!verifySubaccountNumber(transfer.sender.number || 0)) {
|
|
82
|
+
return new UserError(`senderSubaccountNumber: ${transfer.sender.number || 0} cannot be < 0 or > ${MAX_SUBACCOUNT_NUMBER}`);
|
|
83
|
+
}
|
|
84
|
+
if (!verifySubaccountNumber(transfer.recipient.number || 0)) {
|
|
85
|
+
return new UserError(`recipientSubaccountNumber: ${transfer.recipient.number || 0} cannot be < 0 or > ${MAX_SUBACCOUNT_NUMBER}`);
|
|
86
|
+
}
|
|
87
|
+
if (transfer.assetId !== 0) {
|
|
88
|
+
return new UserError(`asset id: ${transfer.assetId} not supported`);
|
|
89
|
+
}
|
|
90
|
+
if (transfer.amount.lessThanOrEqual(Long.ZERO)) {
|
|
91
|
+
return new UserError(`amount: ${transfer.amount} cannot be <= 0`);
|
|
92
|
+
}
|
|
93
|
+
const addressError = verifyIsBech32(transfer.recipient.owner);
|
|
94
|
+
if (addressError !== undefined) {
|
|
95
|
+
return new UserError(addressError.toString());
|
|
96
|
+
}
|
|
97
|
+
return undefined;
|
|
98
|
+
}
|
|
99
|
+
function verifyGoodTilBlock(goodTilBlock) {
|
|
100
|
+
if (goodTilBlock === undefined) {
|
|
101
|
+
return false;
|
|
102
|
+
}
|
|
103
|
+
return verifyNumberIsUint32(goodTilBlock) && goodTilBlock > 0;
|
|
104
|
+
}
|
|
105
|
+
function verifyGoodTilBlockTime(goodTilBlockTime) {
|
|
106
|
+
if (goodTilBlockTime === undefined) {
|
|
107
|
+
return false;
|
|
108
|
+
}
|
|
109
|
+
return verifyNumberIsUint32(goodTilBlockTime) && goodTilBlockTime > 0;
|
|
110
|
+
}
|
|
111
|
+
function verifySubaccountNumber(subaccountNumber) {
|
|
112
|
+
return subaccountNumber >= 0 && subaccountNumber <= MAX_SUBACCOUNT_NUMBER;
|
|
113
|
+
}
|
|
114
|
+
function verifyNumberIsUint32(num) {
|
|
115
|
+
return num >= 0 && num <= MAX_UINT_32;
|
|
116
|
+
}
|
|
117
|
+
export function verifyOrderFlags(orderFlags) {
|
|
118
|
+
return (orderFlags === OrderFlags.SHORT_TERM ||
|
|
119
|
+
orderFlags === OrderFlags.LONG_TERM ||
|
|
120
|
+
orderFlags === OrderFlags.CONDITIONAL);
|
|
121
|
+
}
|
|
122
|
+
export function isStatefulOrder(orderFlags) {
|
|
123
|
+
return orderFlags === OrderFlags.LONG_TERM || orderFlags === OrderFlags.CONDITIONAL;
|
|
124
|
+
}
|
|
125
|
+
function verifyIsBech32(address) {
|
|
126
|
+
try {
|
|
127
|
+
decode(address);
|
|
128
|
+
}
|
|
129
|
+
catch (error) {
|
|
130
|
+
return error;
|
|
131
|
+
}
|
|
132
|
+
return undefined;
|
|
133
|
+
}
|
|
134
|
+
export function isValidAddress(address) {
|
|
135
|
+
// An address is valid if it starts with the BECH32 prefix and is Bech32 format.
|
|
136
|
+
return address.startsWith(BECH32_PREFIX + '1') && verifyIsBech32(address) === undefined;
|
|
137
|
+
}
|
|
138
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvdmFsaWRhdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBQ2hDLE9BQU8sSUFBSSxNQUFNLE1BQU0sQ0FBQztBQUV4QixPQUFPLEVBQUUsYUFBYSxFQUFFLHFCQUFxQixFQUFFLFdBQVcsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3pGLE9BQU8sRUFFTCxVQUFVLEdBSVgsTUFBTSxrQkFBa0IsQ0FBQztBQUMxQixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBRXJDOzs7R0FHRztBQUNILE1BQU0sVUFBVSx5QkFBeUIsQ0FDdkMsZ0JBQXdCLEVBQ3hCLEtBQWtCO0lBRWxCLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztRQUMxQyxPQUFPLElBQUksU0FBUyxDQUFDLGFBQWEsS0FBSyxDQUFDLFFBQVEsd0JBQXdCLENBQUMsQ0FBQztJQUM1RSxDQUFDO0lBQ0QsSUFBSSxLQUFLLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUM5QyxPQUFPLElBQUksU0FBUyxDQUFDLGFBQWEsS0FBSyxDQUFDLFFBQVEsaUJBQWlCLENBQUMsQ0FBQztJQUNyRSxDQUFDO0lBQ0QsSUFBSSxLQUFLLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUM5QyxPQUFPLElBQUksU0FBUyxDQUFDLGFBQWEsS0FBSyxDQUFDLFFBQVEsaUJBQWlCLENBQUMsQ0FBQztJQUNyRSxDQUFDO0lBQ0QsSUFBSSxDQUFDLHNCQUFzQixDQUFDLGdCQUFnQixDQUFDLEVBQUUsQ0FBQztRQUM5QyxPQUFPLElBQUksU0FBUyxDQUNsQixx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
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export declare const isTruthy: <T>(n?: T | false | null | undefined | 0) => n is T;
|
|
2
|
+
export declare class NetworkOptimizer {
|
|
3
|
+
private validatorClients;
|
|
4
|
+
private indexerClients;
|
|
5
|
+
findOptimalNode(endpointUrls: string[], chainId: string): Promise<string>;
|
|
6
|
+
findOptimalIndexer(endpointUrls: string[]): Promise<string>;
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=network_optimizer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"network_optimizer.d.ts","sourceRoot":"","sources":["../../../src/network_optimizer.ts"],"names":[],"mappings":"AAgBA,eAAO,MAAM,QAAQ,GAAI,CAAC,EAAE,IAAI,CAAC,GAAG,KAAK,GAAG,IAAI,GAAG,SAAS,GAAG,CAAC,KAAG,CAAC,IAAI,CAAe,CAAC;AAExF,qBAAa,gBAAgB;YACb,gBAAgB;IAoB9B,OAAO,CAAC,cAAc;IAehB,eAAe,CAAC,YAAY,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAuCzE,kBAAkB,CAAC,YAAY,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;CAsClE"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { IndexerClient } from './clients/indexer-client';
|
|
2
|
+
import { ValidatorClient } from './clients/validator-client';
|
|
3
|
+
import { encodeJson } from './lib/helpers';
|
|
4
|
+
import { IndexerConfig, ValidatorConfig } from './types';
|
|
5
|
+
class PingResponse {
|
|
6
|
+
constructor(height) {
|
|
7
|
+
this.height = height;
|
|
8
|
+
this.responseTime = new Date();
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
export const isTruthy = (n) => Boolean(n);
|
|
12
|
+
export class NetworkOptimizer {
|
|
13
|
+
async validatorClients(endpointUrls, chainId) {
|
|
14
|
+
return (await Promise.all(endpointUrls.map((endpointUrl) => ValidatorClient.connect(new ValidatorConfig(endpointUrl, chainId, {
|
|
15
|
+
CHAINTOKEN_DENOM: 'placeholder',
|
|
16
|
+
CHAINTOKEN_DECIMALS: 18,
|
|
17
|
+
USDC_DENOM: 'uusdc',
|
|
18
|
+
USDC_DECIMALS: 6,
|
|
19
|
+
})).catch((_) => undefined)))).filter(isTruthy);
|
|
20
|
+
}
|
|
21
|
+
indexerClients(endpointUrls) {
|
|
22
|
+
return endpointUrls
|
|
23
|
+
.map((endpointUrl) => new IndexerClient(
|
|
24
|
+
// socket is not used for finding optimal indexer, but required as a parameter to the config
|
|
25
|
+
new IndexerConfig(endpointUrl, endpointUrl.replace('https://', 'wss://').replace('http://', 'ws://'))))
|
|
26
|
+
.filter(isTruthy);
|
|
27
|
+
}
|
|
28
|
+
async findOptimalNode(endpointUrls, chainId) {
|
|
29
|
+
if (endpointUrls.length === 0) {
|
|
30
|
+
const errorResponse = {
|
|
31
|
+
error: {
|
|
32
|
+
message: 'No nodes provided',
|
|
33
|
+
},
|
|
34
|
+
};
|
|
35
|
+
return encodeJson(errorResponse);
|
|
36
|
+
}
|
|
37
|
+
const clients = await this.validatorClients(endpointUrls, chainId);
|
|
38
|
+
const responses = (await Promise.all(clients
|
|
39
|
+
.map(async (client) => {
|
|
40
|
+
const block = await client.get.latestBlock();
|
|
41
|
+
const response = new PingResponse(block.header.height);
|
|
42
|
+
return {
|
|
43
|
+
endpoint: client.config.restEndpoint,
|
|
44
|
+
height: response.height,
|
|
45
|
+
time: response.responseTime.getTime(),
|
|
46
|
+
};
|
|
47
|
+
})
|
|
48
|
+
.map((promise) => promise.catch((_) => undefined)))).filter(isTruthy);
|
|
49
|
+
if (responses.length === 0) {
|
|
50
|
+
throw new Error('Could not connect to endpoints');
|
|
51
|
+
}
|
|
52
|
+
const maxHeight = Math.max(...responses.map(({ height }) => height));
|
|
53
|
+
return (responses
|
|
54
|
+
// Only consider nodes at `maxHeight` or `maxHeight - 1`
|
|
55
|
+
.filter(({ height }) => height === maxHeight || height === maxHeight - 1)
|
|
56
|
+
// Return the endpoint with the fastest response time
|
|
57
|
+
.sort((a, b) => a.time - b.time)[0].endpoint);
|
|
58
|
+
}
|
|
59
|
+
async findOptimalIndexer(endpointUrls) {
|
|
60
|
+
if (endpointUrls.length === 0) {
|
|
61
|
+
const errorResponse = {
|
|
62
|
+
error: {
|
|
63
|
+
message: 'No URL provided',
|
|
64
|
+
},
|
|
65
|
+
};
|
|
66
|
+
return encodeJson(errorResponse);
|
|
67
|
+
}
|
|
68
|
+
const clients = this.indexerClients(endpointUrls);
|
|
69
|
+
const responses = (await Promise.all(clients
|
|
70
|
+
.map(async (client) => {
|
|
71
|
+
const block = await client.utility.getHeight();
|
|
72
|
+
const response = new PingResponse(+block.height);
|
|
73
|
+
return {
|
|
74
|
+
endpoint: client.config.restEndpoint,
|
|
75
|
+
height: response.height,
|
|
76
|
+
time: response.responseTime.getTime(),
|
|
77
|
+
};
|
|
78
|
+
})
|
|
79
|
+
.map((promise) => promise.catch((_) => undefined)))).filter(isTruthy);
|
|
80
|
+
if (responses.length === 0) {
|
|
81
|
+
throw new Error('Could not connect to endpoints');
|
|
82
|
+
}
|
|
83
|
+
const maxHeight = Math.max(...responses.map(({ height }) => height));
|
|
84
|
+
return (responses
|
|
85
|
+
// Only consider nodes at `maxHeight` or `maxHeight - 1`
|
|
86
|
+
.filter(({ height }) => height === maxHeight || height === maxHeight - 1)
|
|
87
|
+
// Return the endpoint with the fastest response time
|
|
88
|
+
.sort((a, b) => a.time - b.time)[0].endpoint);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV0d29ya19vcHRpbWl6ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbmV0d29ya19vcHRpbWl6ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3pELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUM3RCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxhQUFhLEVBQUUsZUFBZSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBRXpELE1BQU0sWUFBWTtJQUtoQixZQUFZLE1BQWM7UUFDeEIsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDckIsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO0lBQ2pDLENBQUM7Q0FDRjtBQUVELE1BQU0sQ0FBQyxNQUFNLFFBQVEsR0FBRyxDQUFJLENBQW9DLEVBQVUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUV4RixNQUFNLE9BQU8sZ0JBQWdCO0lBQ25CLEtBQUssQ0FBQyxnQkFBZ0IsQ0FDNUIsWUFBc0IsRUFDdEIsT0FBZTtRQUVmLE9BQU8sQ0FDTCxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQ2YsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQy9CLGVBQWUsQ0FBQyxPQUFPLENBQ3JCLElBQUksZUFBZSxDQUFDLFdBQVcsRUFBRSxPQUFPLEVBQUU7WUFDeEMsZ0JBQWdCLEVBQUUsYUFBYTtZQUMvQixtQkFBbUIsRUFBRSxFQUFFO1lBQ3ZCLFVBQVUsRUFBRSxPQUFPO1lBQ25CLGFBQWEsRUFBRSxDQUFDO1NBQ2pCLENBQUMsQ0FDSCxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsU0FBUyxDQUFDLENBQzFCLENBQ0YsQ0FDRixD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
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { StdFee } from '@cosmjs/amino';
|
|
2
|
+
import { Method } from '@cosmjs/tendermint-rpc';
|
|
3
|
+
import { TransactionOptions } from './clients/types';
|
|
4
|
+
export * from './clients/types';
|
|
5
|
+
export * from './clients/constants';
|
|
6
|
+
export interface BroadcastOptions {
|
|
7
|
+
broadcastPollIntervalMs: number;
|
|
8
|
+
broadcastTimeoutMs: number;
|
|
9
|
+
}
|
|
10
|
+
export interface ApiOptions {
|
|
11
|
+
faucetHost?: string;
|
|
12
|
+
indexerHost?: string;
|
|
13
|
+
timeout?: number;
|
|
14
|
+
}
|
|
15
|
+
export type BroadcastMode = Method.BroadcastTxAsync | Method.BroadcastTxSync | Method.BroadcastTxCommit;
|
|
16
|
+
export interface Options {
|
|
17
|
+
transactionOptions?: TransactionOptions;
|
|
18
|
+
memo?: string;
|
|
19
|
+
broadcastMode?: BroadcastMode;
|
|
20
|
+
fee?: StdFee;
|
|
21
|
+
}
|
|
22
|
+
export declare enum ClobPairId {
|
|
23
|
+
PERPETUAL_PAIR_BTC_USD = 0,
|
|
24
|
+
PERPETUAL_PAIR_ETH_USD = 1
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AACvC,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAEhD,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAErD,cAAc,iBAAiB,CAAC;AAChC,cAAc,qBAAqB,CAAC;AAIpC,MAAM,WAAW,gBAAgB;IAC/B,uBAAuB,EAAE,MAAM,CAAC;IAChC,kBAAkB,EAAE,MAAM,CAAC;CAC5B;AAGD,MAAM,WAAW,UAAU;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAOD,MAAM,MAAM,aAAa,GACrB,MAAM,CAAC,gBAAgB,GACvB,MAAM,CAAC,eAAe,GACtB,MAAM,CAAC,iBAAiB,CAAC;AAG7B,MAAM,WAAW,OAAO;IACtB,kBAAkB,CAAC,EAAE,kBAAkB,CAAC;IACxC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,oBAAY,UAAU;IACpB,sBAAsB,IAAI;IAC1B,sBAAsB,IAAI;CAC3B"}
|