UNPKG

solana-options

Version:

Minting of options contract NFTs on the Solana blockchain

57 lines (56 loc) 3.29 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.verify_contract = exports.get_contract_from_blockchain = exports.print_contract = void 0; const web3_js_1 = require("@solana/web3.js"); const _1 = require("."); const layout_1 = require("./layout"); const assert_1 = __importDefault(require("assert")); const dayjs_1 = __importDefault(require("dayjs")); function print_contract(contract) { return { strike: contract.strike, expiry: contract.expiry, multiple: contract.multiple, instrument: contract.instrument.toString(), strike_instrument: contract.strike_instrument.toString(), nft_id: contract.nft_id.toString(), nft_account: contract.nft_account.toString(), account_id: contract.account_id.toString(), collateral_acc: contract.collateral_acc.toString(), writer_recv_acc: contract.writer_recv_acc.toString(), writer: contract.writer.toString(), kind: (contract.kind == _1.OptionType.call) ? "call" : "put" }; } exports.print_contract = print_contract; async function get_contract_from_blockchain(connection, account_id) { let account = await connection.getAccountInfo(account_id, "finalized"); let data = account.data; if (data.length != layout_1.OPTION_ACCOUNT_DATA_LAYOUT.span) throw "invalid account"; const decodedOptionsLayout = layout_1.OPTION_ACCOUNT_DATA_LAYOUT.decode(account.data); return decodedOptionsLayout; } exports.get_contract_from_blockchain = get_contract_from_blockchain; async function verify_contract(contract, option_layout) { assert_1.default.equal(contract.writer.toString(), new web3_js_1.PublicKey(option_layout.writer_pubkey).toString(), "wrong writer"); assert_1.default.equal(contract.nft_id.toString(), new web3_js_1.PublicKey(option_layout.ownership_nft_token).toString(), "wrong nft id"); assert_1.default.equal(contract.collateral_acc.toString(), new web3_js_1.PublicKey(option_layout.collateral_acc_pubkey).toString(), "wrong collateral account"); assert_1.default.equal(contract.writer_recv_acc.toString(), new web3_js_1.PublicKey(option_layout.recv_acc_pubkey).toString(), "wrong receiving address"); assert_1.default.equal(contract.strike, Number(option_layout.strike.readBigInt64LE()), "wrong strike"); assert_1.default.equal(contract.multiple, Number(option_layout.multiple.readBigInt64LE()), "wrong multiple"); assert_1.default.ok(Math.floor(contract.expiry) == Number(option_layout.expiry_date.readBigInt64LE()), "wrong date"); assert_1.default.equal(contract.kind, option_layout.kind, "wrong kind"); assert_1.default.equal(1, option_layout.is_initialized, "not initialized"); let today = (0, dayjs_1.default)(); let expiry = Number(option_layout.expiry_date.readBigInt64LE()); if (today > (0, dayjs_1.default)(expiry * 1000)) { console.error("This contract details are correct but it expired on %s , today is %s", (0, dayjs_1.default)(expiry * 1000).format(), today.format()); throw "contract has exipired"; } return true; } exports.verify_contract = verify_contract;