UNPKG

@d8x/perpetuals-sdk

Version:

Node TypeScript SDK for D8X Perpetual Futures

64 lines 2.82 kB
import { Buffer } from "buffer"; import { AbiCoder, concat, keccak256, toUtf8Bytes } from "ethers"; export default class TraderDigests { /** * Creates an order-id from the digest. Order-id is the 'digest' used in the smart contract. * @param digest created with _createDigest * @returns orderId string * @ignore */ createOrderId(digest) { let digestBuffer = Buffer.from(digest.substring(2, digest.length), "hex"); const messagePrefix = "\x19Ethereum Signed Message:\n"; let tmp = concat([toUtf8Bytes(messagePrefix), toUtf8Bytes(String(digestBuffer.length)), digestBuffer]); // see: https://github.com/ethers-io/ethers.js/blob/c80fcddf50a9023486e9f9acb1848aba4c19f7b6/packages/hash/src.ts/message.ts#L7 return keccak256(tmp); } /** * Creates a digest (order-id) * @param order smart-contract-type order * @param chainId chainId of network * @param isNewOrder true unless we cancel * @param signer ethereum-type wallet * @param proxyAddress address of the contract * @returns digest * @ignore */ createDigest(order, chainId, isNewOrder, proxyAddress) { const NAME = "Perpetual Trade Manager"; const DOMAIN_TYPEHASH = keccak256(Buffer.from("EIP712Domain(string name,uint256 chainId,address verifyingContract)")); const defaultAbiCoder = new AbiCoder(); let domainSeparator = keccak256(defaultAbiCoder.encode(["bytes32", "bytes32", "uint256", "address"], [DOMAIN_TYPEHASH, keccak256(Buffer.from(NAME)), chainId, proxyAddress])); const TRADE_ORDER_TYPEHASH = keccak256(Buffer.from("Order(uint24 iPerpetualId,uint16 brokerFeeTbps,address traderAddr,address brokerAddr,int128 fAmount,int128 fLimitPrice,int128 fTriggerPrice,uint32 iDeadline,uint32 flags,uint16 leverageTDR,uint32 executionTimestamp)")); let structHash = keccak256(defaultAbiCoder.encode([ "bytes32", "uint24", "uint16", "address", "address", "int128", "int128", "int128", "uint64", "uint32", "uint16", "uint64", ], [ TRADE_ORDER_TYPEHASH, order.iPerpetualId, order.brokerFeeTbps, order.traderAddr, order.brokerAddr, order.fAmount, order.fLimitPrice, order.fTriggerPrice, order.iDeadline, order.flags, order.leverageTDR, order.executionTimestamp, ])); let digest = keccak256(defaultAbiCoder.encode(["bytes32", "bytes32", "bool"], [domainSeparator, structHash, isNewOrder])); return digest; } } //# sourceMappingURL=traderDigests.js.map