@triadxyz/triad-protocol 0.1.0 → 0.1.1-alpha.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,12 +1,36 @@
1
1
  "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
2
25
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.decodeString = exports.encodeString = exports.getTickerPDA = void 0;
26
+ exports.formatNumber = exports.getUserPositionAddressSync = exports.getTokenVaultAddressSync = exports.getVaultAddressSync = exports.decodeString = exports.encodeString = exports.getTickerAddressSync = void 0;
4
27
  const web3_js_1 = require("@solana/web3.js");
5
- const getTickerPDA = (address, programId) => {
6
- const [TickerPDA] = web3_js_1.PublicKey.findProgramAddressSync([Buffer.from('ticker'), address.toBuffer()], programId);
28
+ const anchor = __importStar(require("@coral-xyz/anchor"));
29
+ const getTickerAddressSync = (programId, tickerName) => {
30
+ const [TickerPDA] = web3_js_1.PublicKey.findProgramAddressSync([Buffer.from('ticker'), Buffer.from(tickerName)], programId);
7
31
  return TickerPDA;
8
32
  };
9
- exports.getTickerPDA = getTickerPDA;
33
+ exports.getTickerAddressSync = getTickerAddressSync;
10
34
  const encodeString = (value) => {
11
35
  const buffer = Buffer.alloc(32);
12
36
  buffer.fill(value);
@@ -19,3 +43,32 @@ const decodeString = (bytes) => {
19
43
  return buffer.toString('utf8').trim();
20
44
  };
21
45
  exports.decodeString = decodeString;
46
+ const getVaultAddressSync = (programId, tickerAddress) => {
47
+ const [VaultPDA] = web3_js_1.PublicKey.findProgramAddressSync([
48
+ Buffer.from(anchor.utils.bytes.utf8.encode('vault')),
49
+ tickerAddress.toBuffer()
50
+ ], programId);
51
+ return VaultPDA;
52
+ };
53
+ exports.getVaultAddressSync = getVaultAddressSync;
54
+ const getTokenVaultAddressSync = (programId, vault) => {
55
+ const [VaultTokenPDA] = web3_js_1.PublicKey.findProgramAddressSync([
56
+ Buffer.from(anchor.utils.bytes.utf8.encode('vault_token_account')),
57
+ vault.toBuffer()
58
+ ], programId);
59
+ return VaultTokenPDA;
60
+ };
61
+ exports.getTokenVaultAddressSync = getTokenVaultAddressSync;
62
+ function getUserPositionAddressSync(programId, authority, ticker) {
63
+ const [UserPositionPDA] = web3_js_1.PublicKey.findProgramAddressSync([
64
+ Buffer.from(anchor.utils.bytes.utf8.encode('user_position')),
65
+ authority.toBuffer(),
66
+ ticker.toBuffer()
67
+ ], programId);
68
+ return UserPositionPDA;
69
+ }
70
+ exports.getUserPositionAddressSync = getUserPositionAddressSync;
71
+ const formatNumber = (number, decimals = 6) => {
72
+ return Number(number.toString()) / Math.pow(10, decimals);
73
+ };
74
+ exports.formatNumber = formatNumber;
@@ -0,0 +1,75 @@
1
+ /// <reference types="bn.js" />
2
+ import { AnchorProvider, BN, Program } from '@coral-xyz/anchor';
3
+ import { PublicKey } from '@solana/web3.js';
4
+ import { TriadProtocol } from './types/triad_protocol';
5
+ export default class Vault {
6
+ program: Program<TriadProtocol>;
7
+ provider: AnchorProvider;
8
+ constructor(program: Program<TriadProtocol>, provider: AnchorProvider);
9
+ /**
10
+ * Get all vaults
11
+ */
12
+ getVaults(): Promise<import("@coral-xyz/anchor").ProgramAccount<{
13
+ bump: number;
14
+ authority: PublicKey;
15
+ name: string;
16
+ tokenAccount: PublicKey;
17
+ tickerAddress: PublicKey;
18
+ totalDeposited: BN;
19
+ totalWithdrawn: BN;
20
+ initTs: BN;
21
+ netDeposits: BN;
22
+ netWithdraws: BN;
23
+ longBalance: BN;
24
+ shortBalance: BN;
25
+ longPositionsOpened: BN;
26
+ shortPositionsOpened: BN;
27
+ }>[]>;
28
+ /**
29
+ * Get vault by ticker Address
30
+ */
31
+ getVaultByTickerAddress(tickerAddress: PublicKey): Promise<{
32
+ tvl: number;
33
+ bump: number;
34
+ authority: PublicKey;
35
+ name: string;
36
+ tokenAccount: PublicKey;
37
+ tickerAddress: PublicKey;
38
+ totalDeposited: BN;
39
+ totalWithdrawn: BN;
40
+ initTs: BN;
41
+ netDeposits: BN;
42
+ netWithdraws: BN;
43
+ longBalance: BN;
44
+ shortBalance: BN;
45
+ longPositionsOpened: BN;
46
+ shortPositionsOpened: BN;
47
+ }>;
48
+ /**
49
+ * Open Position
50
+ * @param tickerPDA - Ticker PDA
51
+ * @param amount - The amount to deposit
52
+ * @param position - Long or Short
53
+ * @param mint - Token mint for the vault (e.g. USDC)
54
+ */
55
+ openPosition({ tickerPDA, amount, position, mint }: {
56
+ tickerPDA: PublicKey;
57
+ amount: string;
58
+ position: 'Long' | 'Short';
59
+ mint: PublicKey;
60
+ }): Promise<string>;
61
+ /**
62
+ * Withdraw from a vault
63
+ * @param tickerPDA - Ticker PDA
64
+ * @param amount - The amount to deposit
65
+ * @param position - Long or Short
66
+ * @param mint - Token mint for the vault (e.g. USDC)
67
+ * @param positionPubkey - The position public key
68
+ *
69
+ */
70
+ closePosition({ tickerPDA, mint, positionIndex }: {
71
+ tickerPDA: PublicKey;
72
+ mint: PublicKey;
73
+ positionIndex: number;
74
+ }): Promise<string>;
75
+ }
package/dist/vault.js ADDED
@@ -0,0 +1,161 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ const anchor_1 = require("@coral-xyz/anchor");
13
+ const web3_js_1 = require("@solana/web3.js");
14
+ const helpers_1 = require("./utils/helpers");
15
+ const spl_token_1 = require("@solana/spl-token");
16
+ class Vault {
17
+ constructor(program, provider) {
18
+ this.provider = provider;
19
+ this.program = program;
20
+ }
21
+ /**
22
+ * Get all vaults
23
+ */
24
+ getVaults() {
25
+ return __awaiter(this, void 0, void 0, function* () {
26
+ return this.program.account.vault.all();
27
+ });
28
+ }
29
+ /**
30
+ * Get vault by ticker Address
31
+ */
32
+ getVaultByTickerAddress(tickerAddress) {
33
+ return __awaiter(this, void 0, void 0, function* () {
34
+ const VaultPDA = (0, helpers_1.getVaultAddressSync)(this.program.programId, tickerAddress);
35
+ try {
36
+ const vault = yield this.program.account.vault.fetch(VaultPDA);
37
+ const tokenAcc = yield (0, spl_token_1.getAccount)(this.provider.connection, vault.tokenAccount);
38
+ return Object.assign(Object.assign({}, vault), { tvl: (0, helpers_1.formatNumber)(tokenAcc.amount) });
39
+ }
40
+ catch (e) {
41
+ throw new Error(e);
42
+ }
43
+ });
44
+ }
45
+ /**
46
+ * Open Position
47
+ * @param tickerPDA - Ticker PDA
48
+ * @param amount - The amount to deposit
49
+ * @param position - Long or Short
50
+ * @param mint - Token mint for the vault (e.g. USDC)
51
+ */
52
+ openPosition({ tickerPDA, amount, position, mint }) {
53
+ return __awaiter(this, void 0, void 0, function* () {
54
+ try {
55
+ const UserPositionPDA = (0, helpers_1.getUserPositionAddressSync)(this.program.programId, this.provider.wallet.publicKey, tickerPDA);
56
+ const VaultPDA = (0, helpers_1.getVaultAddressSync)(this.program.programId, tickerPDA);
57
+ const VaultTokenAccountPDA = (0, helpers_1.getTokenVaultAddressSync)(this.program.programId, VaultPDA);
58
+ const userTokenAccount = yield (0, spl_token_1.getAssociatedTokenAddress)(mint, this.provider.wallet.publicKey);
59
+ let hasUserPosition = false;
60
+ try {
61
+ yield this.program.account.userPosition.fetch(UserPositionPDA);
62
+ hasUserPosition = true;
63
+ }
64
+ catch (_a) { }
65
+ const instructions = [];
66
+ if (!hasUserPosition) {
67
+ instructions.push(yield this.program.methods
68
+ .createUserPosition()
69
+ .accounts({
70
+ signer: this.provider.wallet.publicKey,
71
+ userPosition: UserPositionPDA,
72
+ ticker: tickerPDA
73
+ })
74
+ .instruction());
75
+ }
76
+ instructions.push(yield this.program.methods
77
+ .openPosition({
78
+ amount: new anchor_1.BN(amount),
79
+ isLong: position === 'Long'
80
+ })
81
+ .accounts({
82
+ userPosition: UserPositionPDA,
83
+ ticker: tickerPDA,
84
+ vault: VaultPDA,
85
+ vaultTokenAccount: VaultTokenAccountPDA,
86
+ userTokenAccount
87
+ })
88
+ .instruction());
89
+ const { blockhash } = yield this.provider.connection.getLatestBlockhash();
90
+ const message = new web3_js_1.TransactionMessage({
91
+ payerKey: this.provider.wallet.publicKey,
92
+ recentBlockhash: blockhash,
93
+ instructions
94
+ }).compileToV0Message();
95
+ return this.provider.sendAndConfirm(new web3_js_1.VersionedTransaction(message));
96
+ }
97
+ catch (error) {
98
+ console.error(error);
99
+ }
100
+ });
101
+ }
102
+ /**
103
+ * Withdraw from a vault
104
+ * @param tickerPDA - Ticker PDA
105
+ * @param amount - The amount to deposit
106
+ * @param position - Long or Short
107
+ * @param mint - Token mint for the vault (e.g. USDC)
108
+ * @param positionPubkey - The position public key
109
+ *
110
+ */
111
+ closePosition({ tickerPDA, mint, positionIndex }) {
112
+ return __awaiter(this, void 0, void 0, function* () {
113
+ try {
114
+ const UserPositionPDA = (0, helpers_1.getUserPositionAddressSync)(this.program.programId, this.provider.wallet.publicKey, tickerPDA);
115
+ const VaultPDA = (0, helpers_1.getVaultAddressSync)(this.program.programId, tickerPDA);
116
+ const VaultTokenAccountPDA = (0, helpers_1.getTokenVaultAddressSync)(this.program.programId, VaultPDA);
117
+ const userTokenAccount = yield (0, spl_token_1.getAssociatedTokenAddress)(mint, this.provider.wallet.publicKey);
118
+ let hasUser = false;
119
+ try {
120
+ yield this.program.account.userPosition.fetch(UserPositionPDA);
121
+ hasUser = true;
122
+ }
123
+ catch (e) {
124
+ console.log(e);
125
+ }
126
+ const instructions = [];
127
+ if (!hasUser) {
128
+ instructions.push(yield this.program.methods
129
+ .createUserPosition()
130
+ .accounts({
131
+ signer: this.provider.wallet.publicKey,
132
+ userPosition: UserPositionPDA,
133
+ ticker: tickerPDA
134
+ })
135
+ .instruction());
136
+ }
137
+ instructions.push(yield this.program.methods
138
+ .closePosition({ positionIndex })
139
+ .accounts({
140
+ userPosition: UserPositionPDA,
141
+ ticker: tickerPDA,
142
+ vault: VaultPDA,
143
+ vaultTokenAccount: VaultTokenAccountPDA,
144
+ userTokenAccount
145
+ })
146
+ .instruction());
147
+ const { blockhash } = yield this.provider.connection.getLatestBlockhash();
148
+ const message = new web3_js_1.TransactionMessage({
149
+ payerKey: this.provider.wallet.publicKey,
150
+ recentBlockhash: blockhash,
151
+ instructions
152
+ }).compileToV0Message();
153
+ return this.provider.sendAndConfirm(new web3_js_1.VersionedTransaction(message));
154
+ }
155
+ catch (error) {
156
+ console.error(error);
157
+ }
158
+ });
159
+ }
160
+ }
161
+ exports.default = Vault;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@triadxyz/triad-protocol",
3
- "version": "0.1.0",
3
+ "version": "0.1.1-alpha.2",
4
4
  "main": "./dist/index.js",
5
5
  "module": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",
@@ -8,7 +8,7 @@
8
8
  "clean": "rimraf dist",
9
9
  "build": "yarn run clean && tsc",
10
10
  "prepublishOnly": "yarn build",
11
- "start": "yarn build && node ./dist/index.js"
11
+ "start": "yarn build && node ./dist/test.js"
12
12
  },
13
13
  "publishConfig": {
14
14
  "access": "public"
@@ -26,7 +26,7 @@
26
26
  "triad",
27
27
  "trading protocols"
28
28
  ],
29
- "author": "Lineup",
29
+ "author": "Triad Labs",
30
30
  "license": "ISC",
31
31
  "dependencies": {
32
32
  "@coral-xyz/anchor": "0.28.0",
@@ -46,6 +46,7 @@
46
46
  "eslint-config-prettier": "9.0.0",
47
47
  "eslint-plugin-prettier": "5.0.0",
48
48
  "prettier": "3.2.4",
49
+ "rimraf": "^5.0.5",
49
50
  "typedoc": "0.25.1",
50
51
  "typescript": "5.2.2"
51
52
  }