UNPKG

@d8x/perpetuals-sdk

Version:

Node TypeScript SDK for D8X Perpetual Futures

445 lines (388 loc) 20.3 kB
<a name="BrokerTool"></a> ## BrokerTool ⇐ <code>WriteAccessHandler</code> <p>Functions for white-label partners to determine fees, deposit lots, and sign-up traders. This class requires a private key and executes smart-contract interactions that require gas-payments.</p> **Kind**: global class **Extends**: <code>WriteAccessHandler</code> * [BrokerTool](#BrokerTool) ⇐ <code>WriteAccessHandler</code> * [new BrokerTool(config, privateKey, signer)](#new_BrokerTool_new) * [.getBrokerInducedFee(poolSymbolName)](#BrokerTool+getBrokerInducedFee) ⇒ <code>number</code> * [.getFeeForBrokerDesignation(poolSymbolName, [lots])](#BrokerTool+getFeeForBrokerDesignation) ⇒ <code>number</code> * [.getFeeForBrokerVolume(poolSymbolName)](#BrokerTool+getFeeForBrokerVolume) ⇒ <code>number</code> * [.getFeeForBrokerStake([brokerAddr])](#BrokerTool+getFeeForBrokerStake) ⇒ <code>number</code> * [.determineExchangeFee(order, traderAddr)](#BrokerTool+determineExchangeFee) ⇒ <code>number</code> * [.getCurrentBrokerVolume(poolSymbolName)](#BrokerTool+getCurrentBrokerVolume) ⇒ <code>number</code> * [.getLotSize(poolSymbolName)](#BrokerTool+getLotSize) ⇒ <code>number</code> * [.getBrokerDesignation(poolSymbolName)](#BrokerTool+getBrokerDesignation) ⇒ <code>number</code> * [.depositBrokerLots(poolSymbolName, lots)](#BrokerTool+depositBrokerLots) ⇒ <code>ContractTransaction</code> * [.signOrder(order, traderAddr)](#BrokerTool+signOrder) ⇒ <code>Order</code> * [.signSCOrder(scOrder, traderAddr)](#BrokerTool+signSCOrder) ⇒ <code>string</code> * [.transferOwnership(poolSymbolName, newAddress)](#BrokerTool+transferOwnership) ⇒ <code>ContractTransaction</code> <a name="new_BrokerTool_new"></a> ### new BrokerTool(config, privateKey, signer) <p>Constructor</p> | Param | Type | Description | | --- | --- | --- | | config | <code>NodeSDKConfig</code> | <p>Configuration object, see PerpetualDataHandler. readSDKConfig.</p> | | privateKey | <code>string</code> | <p>Private key of a white-label partner.</p> | | signer | <code>Signer</code> | <p>Signer (ignored if a private key is provided)</p> | **Example** ```js import { BrokerTool, PerpetualDataHandler } from '@d8x/perpetuals-sdk'; async function main() { console.log(BrokerTool); // load configuration for Polygon zkEVM (testnet) const config = PerpetualDataHandler.readSDKConfig("cardona"); // BrokerTool (authentication required, PK is an environment variable with a private key) const pk: string = <string>process.env.PK; let brokTool = new BrokerTool(config, pk); // Create a proxy instance to access the blockchain await brokTool.createProxyInstance(); } main(); ``` <a name="BrokerTool+getBrokerInducedFee"></a> ### brokerTool.getBrokerInducedFee(poolSymbolName) ⇒ <code>number</code> <p>Determine the exchange fee based on lots, traded volume, and D8X balance of this white-label partner. This is the final exchange fee that this white-label partner can offer to traders that trade through him.</p> **Kind**: instance method of [<code>BrokerTool</code>](#BrokerTool) **Returns**: <code>number</code> - <p>Exchange fee for this white-label partner, in decimals (i.e. 0.1% is 0.001)</p> | Param | Type | Description | | --- | --- | --- | | poolSymbolName | <code>string</code> | <p>Pool symbol name (e.g. MATIC, USDC, etc).</p> | **Example** ```js import { BrokerTool, PerpetualDataHandler } from '@d8x/perpetuals-sdk'; async function main() { console.log(BrokerTool); // setup (authentication required, PK is an environment variable with a private key) const config = PerpetualDataHandler.readSDKConfig("cardona"); const pk: string = <string>process.env.PK; let brokTool = new BrokerTool(config, pk); await brokTool.createProxyInstance(); // get white-label partner induced fee let brokFee = await brokTool.getBrokerInducedFee("MATIC"); console.log(brokFee); } main(); ``` <a name="BrokerTool+getFeeForBrokerDesignation"></a> ### brokerTool.getFeeForBrokerDesignation(poolSymbolName, [lots]) ⇒ <code>number</code> <p>Determine the exchange fee based on lots purchased by this white-label partner. The final exchange fee that this white-label partner can offer to traders that trade through him is equal to maximum(brokerTool.getFeeForBrokerDesignation(poolSymbolName), brokerTool.getFeeForBrokerVolume(poolSymbolName), brokerTool.getFeeForBrokerStake())</p> **Kind**: instance method of [<code>BrokerTool</code>](#BrokerTool) **Returns**: <code>number</code> - <p>Fee based solely on this white-label partner's designation, in decimals (i.e. 0.1% is 0.001).</p> | Param | Type | Description | | --- | --- | --- | | poolSymbolName | <code>string</code> | <p>Pool symbol name (e.g. MATIC, USDC, etc).</p> | | [lots] | <code>number</code> | <p>Optional, designation to use if different from this white-label partner's.</p> | **Example** ```js import { BrokerTool, PerpetualDataHandler } from '@d8x/perpetuals-sdk'; async function main() { console.log(BrokerTool); // setup (authentication required, PK is an environment variable with a private key) const config = PerpetualDataHandler.readSDKConfig("cardona"); const pk: string = <string>process.env.PK; let brokTool = new BrokerTool(config, pk); await brokTool.createProxyInstance(); // get white-label partner fee induced by lots let brokFeeLots = await brokTool.getFeeForBrokerDesignation("MATIC"); console.log(brokFeeLots); } main(); ``` <a name="BrokerTool+getFeeForBrokerVolume"></a> ### brokerTool.getFeeForBrokerVolume(poolSymbolName) ⇒ <code>number</code> <p>Determine the exchange fee based on volume traded under this white-label partner. The final exchange fee that this white-label partner can offer to traders that trade through him is equal to maximum(brokerTool.getFeeForBrokerDesignation(poolSymbolName), brokerTool.getFeeForBrokerVolume(poolSymbolName), brokerTool.getFeeForBrokerStake())</p> **Kind**: instance method of [<code>BrokerTool</code>](#BrokerTool) **Returns**: <code>number</code> - <p>Fee based solely on a white-label partner's traded volume in the corresponding pool, in decimals (i.e. 0.1% is 0.001).</p> | Param | Type | Description | | --- | --- | --- | | poolSymbolName | <code>string</code> | <p>Pool symbol name (e.g. MATIC, USDC, etc).</p> | **Example** ```js import { BrokerTool, PerpetualDataHandler } from '@d8x/perpetuals-sdk'; async function main() { console.log(BrokerTool); // setup (authentication required, PK is an environment variable with a private key) const config = PerpetualDataHandler.readSDKConfig("cardona"); const pk: string = <string>process.env.PK; let brokTool = new BrokerTool(config, pk); await brokTool.createProxyInstance(); // get white-label partner fee induced by volume let brokFeeVol = await brokTool.getFeeForBrokerVolume("MATIC"); console.log(brokFeeVol); } main(); ``` <a name="BrokerTool+getFeeForBrokerStake"></a> ### brokerTool.getFeeForBrokerStake([brokerAddr]) ⇒ <code>number</code> <p>Determine the exchange fee based on the current D8X balance in a white-label partner's wallet. The final exchange fee that this white-label partner can offer to traders that trade through him is equal to maximum(brokerTool.getFeeForBrokerDesignation(symbol, lots), brokerTool.getFeeForBrokerVolume(symbol), brokerTool.getFeeForBrokerStake)</p> **Kind**: instance method of [<code>BrokerTool</code>](#BrokerTool) **Returns**: <code>number</code> - <p>Fee based solely on a white-label partner's D8X balance, in decimals (i.e. 0.1% is 0.001).</p> | Param | Type | Description | | --- | --- | --- | | [brokerAddr] | <code>string</code> | <p>Address of the white-label partner in question, if different from the one calling this function.</p> | **Example** ```js import { BrokerTool, PerpetualDataHandler } from '@d8x/perpetuals-sdk'; async function main() { console.log(BrokerTool); // setup (authentication required, PK is an environment variable with a private key) const config = PerpetualDataHandler.readSDKConfig("cardona"); const pk: string = <string>process.env.PK; let brokTool = new BrokerTool(config, pk); await brokTool.createProxyInstance(); // get white-label partner fee induced by staked d8x let brokFeeStake = await brokTool.getFeeForBrokerStake("0xAb5801a7D398351b8bE11C439e05C5B3259aeC9B"); console.log(brokFeeStake); } main(); ``` <a name="BrokerTool+determineExchangeFee"></a> ### brokerTool.determineExchangeFee(order, traderAddr) ⇒ <code>number</code> <p>Determine exchange fee based on an order and a trader. This is the fee charged by the exchange only, excluding the white-label partner fee, For regular perpetuals, the result takes into account whether the order given here has been signed by a white-label partner or not. Use this, for instance, to verify that the fee to be charged for a given order is as expected, before and after signing it with brokerTool.signOrder. This fee is equal or lower than the white-label partner induced fee, provided the order is properly signed.</p> <p>For prediction markets, the correct fee is to be applied as tradeamt * fee/s3.</p> **Kind**: instance method of [<code>BrokerTool</code>](#BrokerTool) **Returns**: <code>number</code> - <p>Fee in decimals (i.e. 0.1% is 0.001).</p> | Param | Type | Description | | --- | --- | --- | | order | <code>Order</code> | <p>Order structure. As a minimum the structure needs to specify symbol, side, type and quantity.</p> | | traderAddr | <code>string</code> | <p>Address of the trader for whom to determine the fee.</p> | **Example** ```js import { BrokerTool, PerpetualDataHandler, Order } from '@d8x/perpetuals-sdk'; async function main() { console.log(BrokerTool); // setup (authentication required, PK is an environment variable with a private key) const config = PerpetualDataHandler.readSDKConfig("cardona"); const pk: string = <string>process.env.PK; let brokTool = new BrokerTool(config, pk); await brokTool.createProxyInstance(); // get exchange fee based on an order and trader let order: Order = { symbol: "MATIC-USD-MATIC", side: "BUY", type: "MARKET", quantity: 100, executionTimestamp: Date.now()/1000 }; let exchFee = await brokTool.determineExchangeFee(order, "0xAb5801a7D398351b8bE11C439e05C5B3259aeC9B"); console.log(exchFee); } main(); ``` <a name="BrokerTool+getCurrentBrokerVolume"></a> ### brokerTool.getCurrentBrokerVolume(poolSymbolName) ⇒ <code>number</code> <p>Exponentially weighted EMA of the total trading volume of all trades performed under this white-label partner. The weights are chosen so that in average this coincides with the 30 day volume.</p> **Kind**: instance method of [<code>BrokerTool</code>](#BrokerTool) **Returns**: <code>number</code> - <p>Current trading volume for this white-label partner, in USD.</p> | Param | Type | Description | | --- | --- | --- | | poolSymbolName | <code>string</code> | <p>Pool symbol name (e.g. MATIC, USDC, etc).</p> | **Example** ```js import { BrokerTool, PerpetualDataHandler } from '@d8x/perpetuals-sdk'; async function main() { console.log(BrokerTool); // setup (authentication required, PK is an environment variable with a private key) const config = PerpetualDataHandler.readSDKConfig("cardona"); const pk: string = <string>process.env.PK; let brokTool = new BrokerTool(config, pk); await brokTool.createProxyInstance(); // get 30 day volume for white-label partner let brokVolume = await brokTool.getCurrentBrokerVolume("MATIC"); console.log(brokVolume); } main(); ``` <a name="BrokerTool+getLotSize"></a> ### brokerTool.getLotSize(poolSymbolName) ⇒ <code>number</code> <p>Total amount of collateral currency a white-label partner has to deposit into the default fund to purchase one lot. This is equivalent to the price of a lot expressed in a given pool's currency (e.g. MATIC, USDC, etc).</p> **Kind**: instance method of [<code>BrokerTool</code>](#BrokerTool) **Returns**: <code>number</code> - <p>White-label partner lot size in a given pool's currency, e.g. in MATIC for poolSymbolName MATIC.</p> | Param | Type | Description | | --- | --- | --- | | poolSymbolName | <code>string</code> | <p>Pool symbol name (e.g. MATIC, USDC, etc).</p> | **Example** ```js import { BrokerTool, PerpetualDataHandler } from '@d8x/perpetuals-sdk'; async function main() { console.log(BrokerTool); // setup (authentication required, PK is an environment variable with a private key) const config = PerpetualDataHandler.readSDKConfig("cardona"); const pk: string = <string>process.env.PK; let brokTool = new BrokerTool(config, pk); await brokTool.createProxyInstance(); // get lot price let brokLotSize = await brokTool.getLotSize("MATIC"); console.log(brokLotSize); } main(); ``` <a name="BrokerTool+getBrokerDesignation"></a> ### brokerTool.getBrokerDesignation(poolSymbolName) ⇒ <code>number</code> <p>Provides information on how many lots a white-label partner purchased for a given pool. This is relevant to determine the white-label partner's fee tier.</p> **Kind**: instance method of [<code>BrokerTool</code>](#BrokerTool) **Returns**: <code>number</code> - <p>Number of lots purchased by this white-label partner.</p> | Param | Type | Description | | --- | --- | --- | | poolSymbolName | <code>string</code> | <p>Pool symbol name (e.g. MATIC, USDC, etc).</p> | **Example** ```js import { BrokerTool, PerpetualDataHandler } from '@d8x/perpetuals-sdk'; async function main() { console.log(BrokerTool); // setup (authentication required, PK is an environment variable with a private key) const config = PerpetualDataHandler.readSDKConfig("cardona"); const pk: string = <string>process.env.PK; let brokTool = new BrokerTool(config, pk); await brokTool.createProxyInstance(); // get white-label partner designation let brokDesignation = await brokTool.getBrokerDesignation("MATIC"); console.log(brokDesignation); } main(); ``` <a name="BrokerTool+depositBrokerLots"></a> ### brokerTool.depositBrokerLots(poolSymbolName, lots) ⇒ <code>ContractTransaction</code> <p>Deposit lots to the default fund of a given pool.</p> **Kind**: instance method of [<code>BrokerTool</code>](#BrokerTool) **Returns**: <code>ContractTransaction</code> - <p>ContractTransaction object.</p> | Param | Type | Description | | --- | --- | --- | | poolSymbolName | <code>string</code> | <p>Pool symbol name (e.g. MATIC, USDC, etc).</p> | | lots | <code>number</code> | <p>Number of lots to deposit into this pool.</p> | **Example** ```js import { BrokerTool, PerpetualDataHandler } from '@d8x/perpetuals-sdk'; async function main() { console.log(BrokerTool); // setup (authentication required, PK is an environment variable with a private key) const config = PerpetualDataHandler.readSDKConfig("cardona"); const pk: string = <string>process.env.PK; let brokTool = new BrokerTool(config, pk); await brokTool.createProxyInstance(); // deposit to perpetuals await brokTool.setAllowance("MATIC"); let respDeposit = await brokTool.depositBrokerLots("MATIC",1); console.log(respDeposit); } main(); ``` <a name="BrokerTool+signOrder"></a> ### brokerTool.signOrder(order, traderAddr) ⇒ <code>Order</code> <p>Adds this white-label partner's signature to a user-friendly order. An order signed by a white-label partner is considered to be routed through this white-label partner and benefits from the white-label partner's fee conditions.</p> **Kind**: instance method of [<code>BrokerTool</code>](#BrokerTool) **Returns**: <code>Order</code> - <p>An order signed by this white-label partner, which can be submitted directly with AccountTrade.order.</p> | Param | Type | Description | | --- | --- | --- | | order | <code>Order</code> | <p>Order to sign. It must contain valid white-label partner fee, white-label partner address, and order deadline.</p> | | traderAddr | <code>string</code> | <p>Address of trader submitting the order.</p> | **Example** ```js import { BrokerTool, PerpetualDataHandler } from '@d8x/perpetuals-sdk'; async function main() { console.log(BrokerTool); // setup (authentication required, PK is an environment variable with a private key) const config = PerpetualDataHandler.readSDKConfig("cardona"); const pk: string = <string>process.env.PK; let brokTool = new BrokerTool(config, pk); await brokTool.createProxyInstance(); // sign order let order = {symbol: "ETH-USD-MATIC", side: "BUY", type: "MARKET", quantity: 1, executionTimestamp: Date.now()/1000 }; let signedOrder = await brokTool.signOrder(order, "0xAb5801a7D398351b8bE11C439e05C5B3259aeC9B", 0.0001, 1669723339); console.log(signedOrder); // execute order let orderTransaction = await accTrade.order(signedOrder); console.log(orderTransaction.hash); } main(); ``` <a name="BrokerTool+signSCOrder"></a> ### brokerTool.signSCOrder(scOrder, traderAddr) ⇒ <code>string</code> <p>Generates a white-label partner's signature of a smart-contract ready order. An order signed by a white-label partner is considered to be routed through this white-label partner and benefits from the white-label partner's fee conditions.</p> **Kind**: instance method of [<code>BrokerTool</code>](#BrokerTool) **Returns**: <code>string</code> - <p>Signature of order.</p> | Param | Type | Description | | --- | --- | --- | | scOrder | <code>SmartContractOrder</code> | <p>Order to sign. It must contain valid white-label partner fee, white-label partner address, and order deadline.</p> | | traderAddr | <code>string</code> | <p>Address of trader submitting the order.</p> | **Example** ```js import { BrokerTool, PerpetualDataHandler } from '@d8x/perpetuals-sdk'; async function main() { console.log(BrokerTool); // setup (authentication required, PK is an environment variable with a private key) const config = PerpetualDataHandler.readSDKConfig("cardona"); const pk: string = <string>process.env.PK; const brokTool = new BrokerTool(config, pk); const traderAPI = new TraderInterface(config); await brokTool.createProxyInstance(); await traderAPI.createProxyInstance(); // sign order const order = {symbol: "ETH-USD-MATIC", side: "BUY", type: "MARKET", quantity: 1, executionTimestamp: Date.now()/1000 }; const scOrder = await traderAPI.createSmartContractOrder(order, "0xAb5801a7D398351b8bE11C439e05C5B3259aeC9B") const signature = await brokTool.signSCOrder(order, "0xAb5801a7D398351b8bE11C439e05C5B3259aeC9B", 0.0001, 1669723339); console.log(signature); } main(); ``` <a name="BrokerTool+transferOwnership"></a> ### brokerTool.transferOwnership(poolSymbolName, newAddress) ⇒ <code>ContractTransaction</code> <p>Transfer ownership of a white-label partner's status to a new wallet. This function transfers the values related to (i) trading volume and (ii) deposited lots to newAddress. The white-label partner needs in addition to manually transfer his D8X holdings to newAddress. Until this transfer is completed, the white-label partner will not have his current designation reflected at newAddress.</p> **Kind**: instance method of [<code>BrokerTool</code>](#BrokerTool) **Returns**: <code>ContractTransaction</code> - <p>ethers transaction object</p> | Param | Type | Description | | --- | --- | --- | | poolSymbolName | <code>string</code> | <p>Pool symbol name (e.g. MATIC, USDC, etc).</p> | | newAddress | <code>string</code> | <p>The address this white-label partner wants to use from now on.</p> | **Example** ```js import { BrokerTool, PerpetualDataHandler } from '@d8x/perpetuals-sdk'; async function main() { console.log(BrokerTool); // setup (authentication required, PK is an environment variable with a private key) const config = PerpetualDataHandler.readSDKConfig("cardona"); const pk: string = <string>process.env.PK; let brokTool = new BrokerTool(config, pk); await brokTool.createProxyInstance(); // transfer ownership let respTransferOwnership = await brokTool.transferOwnership("MATIC", "0xAb5801a7D398351b8bE11C439e05C5B3259aeC9B"); console.log(respTransferOwnership); } main(); ```