solana-options
Version:
Minting of options contract NFTs on the Solana blockchain
57 lines (56 loc) • 3.29 kB
JavaScript
;
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;