UNPKG

@tracer-protocol/pools-js

Version:

Javascript library for interacting with Tracer's Perpetual Pools

96 lines (78 loc) 2.68 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _types = require("@tracer-protocol/perpetual-pools-contracts/types"); var _bignumber = _interopRequireDefault(require("bignumber.js")); var _multicall = require("@0xsequence/multicall"); var _ethers = require("ethers"); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } /** * Oracle class for interacting with Chainlink Oracle Wrappers * The constructor is private so must be instantiated with {@linkcode Oracle.Create} */ class Oracle { /** * @private */ constructor() { this.address = ''; this.provider = undefined; this.multicallProvider = undefined; } /** * Replacement constructor pattern to support async initialisations * @param oracleInfo {@link IOracle | IOracle interface props} * @returns a Promise containing an initialised Oracle class ready to be used */ static Create = async oracleInfo => { const oracle = new Oracle(); // initialise the token; await oracle.init(oracleInfo); return oracle; }; /** * Creates an empty Oracle that can be used as a default * @returns default constructed token */ static CreateDefault = () => { const oracle = new Oracle(); return oracle; }; /** * Private initialisation function called in {@link Oracle.Create} * @private * @param oracleInfo {@link IOracle | IOracle interface props} */ init = async oracleInfo => { this.provider = oracleInfo.provider; this.multicallProvider = new _multicall.providers.MulticallProvider(oracleInfo.provider); this.address = oracleInfo.address; const contract = _types.ChainlinkOracleWrapper__factory.connect(oracleInfo.address, this.multicallProvider); this._contract = contract; }; /** * Replaces the provider and connects the contract instance * @param provider The new provider to connect to */ connect = provider => { if (!provider) { throw Error("Failed to connect Oracle: provider cannot be undefined"); } this.provider = provider; this.multicallProvider = new _multicall.providers.MulticallProvider(provider); this._contract = this._contract?.connect(provider); }; getPrice = async () => { if (!this._contract) { throw Error("Failed to fetch oracle price: Contract not defined"); } try { const price = await this._contract.getPrice(); return new _bignumber.default(_ethers.ethers.utils.formatEther(price)); } catch (err) { throw Error(`Failed to fetch oracle price: ${err}`); } }; } exports.default = Oracle;