UNPKG

rubic-sdk

Version:
88 lines 5.16 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.CurveAbstractProvider = void 0; const bignumber_js_1 = __importDefault(require("bignumber.js")); const errors_1 = require("../../../../../../../common/errors"); const tokens_1 = require("../../../../../../../common/tokens"); const blockchain_1 = require("../../../../../../../common/utils/blockchain"); const options_1 = require("../../../../../../../common/utils/options"); const evm_web3_pure_1 = require("../../../../../../../core/blockchain/web3-pure/typed-web3-pure/evm-web3-pure/evm-web3-pure"); const on_chain_trade_type_1 = require("../../../common/models/on-chain-trade-type"); const address_provider_abi_1 = require("./constants/address-provider-abi"); const registry_abi_1 = require("./constants/registry-abi"); const registry_exchange_abi_1 = require("./constants/registry-exchange-abi"); const evm_provider_default_options_1 = require("../on-chain-provider/evm-on-chain-provider/constants/evm-provider-default-options"); const evm_on_chain_provider_1 = require("../on-chain-provider/evm-on-chain-provider/evm-on-chain-provider"); class CurveAbstractProvider extends evm_on_chain_provider_1.EvmOnChainProvider { constructor() { super(...arguments); this.addressProvider = '0x0000000022D53366457F9d5E68Ec105046FC4383'; this.defaultOptions = { ...evm_provider_default_options_1.evmProviderDefaultOptions, deadlineMinutes: 20, disableMultihops: false }; } get type() { return on_chain_trade_type_1.ON_CHAIN_TRADE_TYPE.CURVE; } async calculate(fromToken, toToken, options) { const fromAddress = fromToken.isNative ? CurveAbstractProvider.nativeAddress : fromToken.address; const toAddress = toToken.isNative ? CurveAbstractProvider.nativeAddress : toToken.address; const fromAmount = fromToken.stringWeiAmount; const registryExchangeAddress = await this.fetchRegistryExchangeAddress(); const registryAddress = await this.fetchRegistryAddress(); let poolAddress = await this.fetchPoolAddress(fromAddress, toAddress, registryAddress); if ((0, blockchain_1.compareAddresses)(poolAddress, evm_web3_pure_1.EvmWeb3Pure.EMPTY_ADDRESS)) { const bestRate = await this.fetchBestRate(fromAddress, toAddress, fromAmount, registryExchangeAddress); poolAddress = bestRate[0]; } if ((0, blockchain_1.compareAddresses)(poolAddress, evm_web3_pure_1.EvmWeb3Pure.EMPTY_ADDRESS)) { throw new errors_1.RubicSdkError('Token is not supported.'); } const amountOut = await this.fetchExchangeAmount(fromAddress, toAddress, fromAmount, poolAddress, registryExchangeAddress); const fullOptions = (0, options_1.combineOptions)(options, this.defaultOptions); const { fromWithoutFee, proxyFeeInfo } = await this.handleProxyContract(fromToken, fullOptions); const to = await tokens_1.PriceTokenAmount.createFromToken({ ...toToken.asStruct, weiAmount: new bignumber_js_1.default(amountOut) }); const tradeStruct = { from: fromToken, to, slippageTolerance: fullOptions.slippageTolerance, gasFeeInfo: null, useProxy: fullOptions.useProxy, proxyFeeInfo, fromWithoutFee, withDeflation: fullOptions.withDeflation, path: [fromToken, toToken], registryExchangeAddress, poolAddress }; return new this.Trade(tradeStruct, fullOptions.providerAddress); } async fetchRegistryExchangeAddress() { return this.web3Public.callContractMethod(this.addressProvider, address_provider_abi_1.addressProviderAbi, 'get_address', ['2']); } async fetchRegistryAddress() { return this.web3Public.callContractMethod(this.addressProvider, address_provider_abi_1.addressProviderAbi, 'get_address', ['0']); } async fetchPoolAddress(fromAddress, toAddress, registryAddress) { return this.web3Public.callContractMethod(registryAddress, registry_abi_1.registryAbi, 'find_pool_for_coins', [fromAddress, toAddress]); } async fetchBestRate(fromAddress, toAddress, fromAmount, registryExchangeAddress) { return this.web3Public.callContractMethod(registryExchangeAddress, registry_exchange_abi_1.registryExchangeAbi, 'get_best_rate', [fromAddress, toAddress, fromAmount]); } async fetchExchangeAmount(fromAddress, toAddress, fromAmount, poolAddress, registryExchangeAddress) { return this.web3Public.callContractMethod(registryExchangeAddress, registry_exchange_abi_1.registryExchangeAbi, 'get_exchange_amount', [poolAddress, fromAddress, toAddress, fromAmount]); } } exports.CurveAbstractProvider = CurveAbstractProvider; CurveAbstractProvider.nativeAddress = '0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE'; //# sourceMappingURL=curve-abstract-provider.js.map