@triadxyz/triad-protocol 0.5.4-beta.devnet → 0.5.5-beta.devnet
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.
- package/dist/index.d.ts +5 -5
- package/dist/index.js +43 -33
- package/dist/local-test.js +47 -9
- package/dist/stake.d.ts +5 -5
- package/dist/stake.js +9 -10
- package/dist/trade.d.ts +18 -3
- package/dist/trade.js +66 -5
- package/dist/types/idl_triad_protocol.json +197 -218
- package/dist/types/stake.d.ts +3 -3
- package/dist/types/trade.d.ts +23 -1
- package/dist/types/triad_protocol.d.ts +297 -695
- package/dist/utils/constants.d.ts +1 -0
- package/dist/utils/constants.js +2 -1
- package/dist/utils/helpers.d.ts +3 -4
- package/dist/utils/helpers.js +16 -51
- package/package.json +2 -2
package/dist/index.d.ts
CHANGED
|
@@ -14,22 +14,22 @@ export default class TriadProtocolClient {
|
|
|
14
14
|
* Get User by wallet
|
|
15
15
|
* @param wallet - User wallet
|
|
16
16
|
*/
|
|
17
|
-
getUser
|
|
17
|
+
getUser(wallet: PublicKey): Promise<import("./types/stake").UserResponse>;
|
|
18
18
|
/**
|
|
19
19
|
* Get User by wallet
|
|
20
20
|
* @param wallet - User wallet
|
|
21
21
|
*/
|
|
22
|
-
getUsers
|
|
22
|
+
getUsers(): Promise<import("./types/stake").UserResponse[]>;
|
|
23
23
|
/**
|
|
24
24
|
* Check if user exists
|
|
25
25
|
* @param username - User name
|
|
26
26
|
*/
|
|
27
|
-
hasUser
|
|
27
|
+
hasUser(wallet: PublicKey): Promise<boolean>;
|
|
28
28
|
/**
|
|
29
29
|
* Get Refferal
|
|
30
30
|
* @param name - User name
|
|
31
31
|
*/
|
|
32
|
-
getReferral
|
|
32
|
+
getReferral(name: string): Promise<string>;
|
|
33
33
|
/**
|
|
34
34
|
* Create User
|
|
35
35
|
* @param wallet - User wallet
|
|
@@ -37,5 +37,5 @@ export default class TriadProtocolClient {
|
|
|
37
37
|
* @param referral - user referral
|
|
38
38
|
*
|
|
39
39
|
*/
|
|
40
|
-
createUser
|
|
40
|
+
createUser({ wallet, name, referral }: CreateUserArgs, options?: RpcOptions): Promise<string>;
|
|
41
41
|
}
|
package/dist/index.js
CHANGED
|
@@ -20,30 +20,40 @@ const helpers_1 = require("./utils/helpers");
|
|
|
20
20
|
const stake_1 = __importDefault(require("./stake"));
|
|
21
21
|
class TriadProtocolClient {
|
|
22
22
|
constructor(connection, wallet) {
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
23
|
+
this.provider = new anchor_1.AnchorProvider(connection, wallet, anchor_1.AnchorProvider.defaultOptions());
|
|
24
|
+
this.program = new anchor_1.Program(idl_triad_protocol_json_1.default, this.provider);
|
|
25
|
+
this.trade = new trade_1.default(this.program, this.provider);
|
|
26
|
+
this.stake = new stake_1.default(this.program, this.provider);
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Get User by wallet
|
|
30
|
+
* @param wallet - User wallet
|
|
31
|
+
*/
|
|
32
|
+
getUser(wallet) {
|
|
33
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
28
34
|
const UserPDA = (0, helpers_1.getUserAddressSync)(this.program.programId, wallet);
|
|
29
35
|
const response = yield this.program.account.user.fetch(UserPDA);
|
|
30
36
|
return (0, helpers_1.formatUser)(response);
|
|
31
37
|
});
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Get User by wallet
|
|
41
|
+
* @param wallet - User wallet
|
|
42
|
+
*/
|
|
43
|
+
getUsers() {
|
|
44
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
37
45
|
const response = yield this.program.account.user.all();
|
|
38
46
|
return response
|
|
39
47
|
.map((item) => (0, helpers_1.formatUser)(item.account))
|
|
40
48
|
.sort((a, b) => b.referred - a.referred);
|
|
41
49
|
});
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Check if user exists
|
|
53
|
+
* @param username - User name
|
|
54
|
+
*/
|
|
55
|
+
hasUser(wallet) {
|
|
56
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
47
57
|
try {
|
|
48
58
|
yield this.program.account.user.fetch((0, helpers_1.getUserAddressSync)(this.program.programId, wallet));
|
|
49
59
|
return true;
|
|
@@ -52,11 +62,13 @@ class TriadProtocolClient {
|
|
|
52
62
|
return false;
|
|
53
63
|
}
|
|
54
64
|
});
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Get Refferal
|
|
68
|
+
* @param name - User name
|
|
69
|
+
*/
|
|
70
|
+
getReferral(name) {
|
|
71
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
60
72
|
try {
|
|
61
73
|
const users = yield this.program.account.user.all([
|
|
62
74
|
{
|
|
@@ -76,14 +88,16 @@ class TriadProtocolClient {
|
|
|
76
88
|
return '';
|
|
77
89
|
}
|
|
78
90
|
});
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Create User
|
|
94
|
+
* @param wallet - User wallet
|
|
95
|
+
* @param name - user name
|
|
96
|
+
* @param referral - user referral
|
|
97
|
+
*
|
|
98
|
+
*/
|
|
99
|
+
createUser({ wallet, name, referral }, options) {
|
|
100
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
87
101
|
const method = this.program.methods
|
|
88
102
|
.createUser({
|
|
89
103
|
name
|
|
@@ -101,11 +115,7 @@ class TriadProtocolClient {
|
|
|
101
115
|
]);
|
|
102
116
|
}
|
|
103
117
|
return method.rpc({ skipPreflight: options === null || options === void 0 ? void 0 : options.skipPreflight });
|
|
104
|
-
};
|
|
105
|
-
this.provider = new anchor_1.AnchorProvider(connection, wallet, anchor_1.AnchorProvider.defaultOptions());
|
|
106
|
-
this.program = new anchor_1.Program(idl_triad_protocol_json_1.default, this.provider);
|
|
107
|
-
this.trade = new trade_1.default(this.program, this.provider);
|
|
108
|
-
this.stake = new stake_1.default(this.program, this.provider);
|
|
118
|
+
});
|
|
109
119
|
}
|
|
110
120
|
}
|
|
111
121
|
exports.default = TriadProtocolClient;
|
package/dist/local-test.js
CHANGED
|
@@ -13,22 +13,29 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
13
13
|
};
|
|
14
14
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
15
|
const fs_1 = __importDefault(require("fs"));
|
|
16
|
-
const web3_js_1 = require("@solana/web3.js");
|
|
17
16
|
const index_1 = __importDefault(require("./index"));
|
|
18
17
|
const anchor_1 = require("@coral-xyz/anchor");
|
|
19
|
-
const constants_1 = require("./utils/constants");
|
|
20
18
|
const axios_1 = __importDefault(require("axios"));
|
|
21
|
-
const
|
|
22
|
-
const
|
|
19
|
+
const web3_js_1 = require("@solana/web3.js");
|
|
20
|
+
const file = fs_1.default.readFileSync('/Users/dannpl/.config/solana/id.json');
|
|
21
|
+
const rpc_file = fs_1.default.readFileSync('/Users/dannpl/.config/solana/rpc-devnet.txt');
|
|
23
22
|
const keypair = web3_js_1.Keypair.fromSecretKey(new Uint8Array(JSON.parse(file.toString())));
|
|
24
23
|
const connection = new web3_js_1.Connection(rpc_file.toString(), 'confirmed');
|
|
25
24
|
const wallet = new anchor_1.Wallet(keypair);
|
|
26
25
|
const triadProtocol = new index_1.default(connection, wallet);
|
|
27
|
-
const
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
26
|
+
const markets = [
|
|
27
|
+
{ name: 'JUPITER/TRD', marketId: 0 },
|
|
28
|
+
{ name: 'DRIFT/TRD', marketId: 1 },
|
|
29
|
+
{ name: 'PYTH/TRD', marketId: 2 },
|
|
30
|
+
{ name: 'UNDEAD/TRD', marketId: 3 },
|
|
31
|
+
{ name: 'MADLADS/TRD', marketId: 4 },
|
|
32
|
+
{ name: 'DEGODS/TRD', marketId: 5 },
|
|
33
|
+
{ name: 'ISLANDDAO/TRD', marketId: 6 },
|
|
34
|
+
{ name: 'COLOSSEUM/TRD', marketId: 7 }
|
|
35
|
+
];
|
|
36
|
+
const updateStakeVault = () => __awaiter(void 0, void 0, void 0, function* () {
|
|
37
|
+
const response = yield triadProtocol.stake.updateStakeVault({
|
|
38
|
+
wallet: wallet.publicKey
|
|
32
39
|
});
|
|
33
40
|
console.log(response);
|
|
34
41
|
});
|
|
@@ -51,3 +58,34 @@ const updateBoost = () => __awaiter(void 0, void 0, void 0, function* () {
|
|
|
51
58
|
});
|
|
52
59
|
console.log(updateBoostResponse);
|
|
53
60
|
});
|
|
61
|
+
const getMarkets = () => __awaiter(void 0, void 0, void 0, function* () {
|
|
62
|
+
const response = yield triadProtocol.trade.getMarkets();
|
|
63
|
+
console.log(response);
|
|
64
|
+
});
|
|
65
|
+
const initializeAllMarkets = () => __awaiter(void 0, void 0, void 0, function* () {
|
|
66
|
+
for (const market of markets) {
|
|
67
|
+
try {
|
|
68
|
+
const response = yield triadProtocol.trade.initializeMarket(market, {
|
|
69
|
+
skipPreflight: true
|
|
70
|
+
});
|
|
71
|
+
console.log(`Initialized market ${market.name}:`, response);
|
|
72
|
+
}
|
|
73
|
+
catch (error) {
|
|
74
|
+
console.error(`Error initializing market ${market.name}:`, error);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
});
|
|
78
|
+
const openOrder = () => __awaiter(void 0, void 0, void 0, function* () {
|
|
79
|
+
const response = yield triadProtocol.trade.openOrder(0, {
|
|
80
|
+
amount: 100,
|
|
81
|
+
direction: {
|
|
82
|
+
hype: {}
|
|
83
|
+
},
|
|
84
|
+
orderType: {
|
|
85
|
+
market: {}
|
|
86
|
+
},
|
|
87
|
+
comment: 'test'
|
|
88
|
+
});
|
|
89
|
+
console.log(response);
|
|
90
|
+
});
|
|
91
|
+
openOrder();
|
package/dist/stake.d.ts
CHANGED
|
@@ -3,7 +3,7 @@ import { AnchorProvider, Program } from '@coral-xyz/anchor';
|
|
|
3
3
|
import { PublicKey } from '@solana/web3.js';
|
|
4
4
|
import { TriadProtocol } from './types/triad_protocol';
|
|
5
5
|
import { RpcOptions } from './types';
|
|
6
|
-
import {
|
|
6
|
+
import { UpdateStakeVaultArgs, StakeNftArgs, RequestWithdrawArgs, WithdrawArgs, StakeResponse, ClaimStakeRewardsArgs, StakeTokenArgs, UpdateBoostArgs } from './types/stake';
|
|
7
7
|
export default class Stake {
|
|
8
8
|
program: Program<TriadProtocol>;
|
|
9
9
|
provider: AnchorProvider;
|
|
@@ -52,13 +52,13 @@ export default class Stake {
|
|
|
52
52
|
*/
|
|
53
53
|
stakeToken({ name, wallet, amount }: StakeTokenArgs, options?: RpcOptions): Promise<string>;
|
|
54
54
|
/**
|
|
55
|
-
*
|
|
55
|
+
* Update Stake Vault
|
|
56
56
|
* @param wallet - User wallet
|
|
57
|
-
* @param
|
|
58
|
-
* @param
|
|
57
|
+
* @param amount - Reward amount to deposit (optional)
|
|
58
|
+
* @param status - Status of the stake vault (optional)
|
|
59
59
|
*
|
|
60
60
|
*/
|
|
61
|
-
|
|
61
|
+
updateStakeVault({ wallet, amount, status }: UpdateStakeVaultArgs, options?: RpcOptions): Promise<string>;
|
|
62
62
|
/**
|
|
63
63
|
* Request Withdraw
|
|
64
64
|
* @param wallet - User wallet
|
package/dist/stake.js
CHANGED
|
@@ -135,13 +135,11 @@ class Stake {
|
|
|
135
135
|
}));
|
|
136
136
|
}
|
|
137
137
|
const { blockhash } = yield this.provider.connection.getLatestBlockhash();
|
|
138
|
-
|
|
138
|
+
return this.provider.sendAndConfirm(new web3_js_1.VersionedTransaction(new web3_js_1.TransactionMessage({
|
|
139
139
|
instructions: ixs,
|
|
140
140
|
recentBlockhash: blockhash,
|
|
141
141
|
payerKey: wallet
|
|
142
|
-
}).compileToV0Message()
|
|
143
|
-
const tx = new web3_js_1.VersionedTransaction(messageV0);
|
|
144
|
-
return this.provider.sendAndConfirm(tx, [], {
|
|
142
|
+
}).compileToV0Message()), [], {
|
|
145
143
|
skipPreflight: options === null || options === void 0 ? void 0 : options.skipPreflight,
|
|
146
144
|
commitment: 'confirmed'
|
|
147
145
|
});
|
|
@@ -179,22 +177,23 @@ class Stake {
|
|
|
179
177
|
});
|
|
180
178
|
}
|
|
181
179
|
/**
|
|
182
|
-
*
|
|
180
|
+
* Update Stake Vault
|
|
183
181
|
* @param wallet - User wallet
|
|
184
|
-
* @param
|
|
185
|
-
* @param
|
|
182
|
+
* @param amount - Reward amount to deposit (optional)
|
|
183
|
+
* @param status - Status of the stake vault (optional)
|
|
186
184
|
*
|
|
187
185
|
*/
|
|
188
|
-
|
|
186
|
+
updateStakeVault({ wallet, amount, status }, options) {
|
|
189
187
|
return __awaiter(this, void 0, void 0, function* () {
|
|
190
188
|
const method = this.program.methods
|
|
191
|
-
.
|
|
189
|
+
.updateStakeVault({
|
|
192
190
|
amount,
|
|
191
|
+
status,
|
|
193
192
|
stakeVault: this.stakeVaultName
|
|
194
193
|
})
|
|
195
194
|
.accounts({
|
|
196
195
|
signer: wallet,
|
|
197
|
-
mint:
|
|
196
|
+
mint: constants_1.TRD_MINT
|
|
198
197
|
});
|
|
199
198
|
if (options === null || options === void 0 ? void 0 : options.microLamports) {
|
|
200
199
|
method.postInstructions([
|
package/dist/trade.d.ts
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { AnchorProvider, Program } from '@coral-xyz/anchor';
|
|
2
2
|
import { TriadProtocol } from './types/triad_protocol';
|
|
3
|
-
import { Market } from './types/trade';
|
|
4
3
|
import { PublicKey } from '@solana/web3.js';
|
|
4
|
+
import { Market, OrderDirection, OrderType } from './types/trade';
|
|
5
|
+
import { RpcOptions } from './types';
|
|
5
6
|
export default class Trade {
|
|
6
7
|
program: Program<TriadProtocol>;
|
|
7
8
|
provider: AnchorProvider;
|
|
@@ -10,8 +11,22 @@ export default class Trade {
|
|
|
10
11
|
* Get all Markets
|
|
11
12
|
*/
|
|
12
13
|
getMarkets(): Promise<Market[]>;
|
|
14
|
+
getMarketByAddress(address: PublicKey): Promise<Market>;
|
|
13
15
|
/**
|
|
14
|
-
*
|
|
16
|
+
* Initialize Market
|
|
17
|
+
* @param market id - new markert id - length + 1
|
|
18
|
+
* @param name - PYTH/TRD JUP/TRD DRIFT/TRD
|
|
19
|
+
*
|
|
15
20
|
*/
|
|
16
|
-
|
|
21
|
+
initializeMarket({ marketId, name }: {
|
|
22
|
+
marketId: number;
|
|
23
|
+
name: string;
|
|
24
|
+
}, options?: RpcOptions): Promise<string>;
|
|
25
|
+
openOrder(marketId: number, args: {
|
|
26
|
+
amount: number;
|
|
27
|
+
direction: OrderDirection;
|
|
28
|
+
orderType: OrderType;
|
|
29
|
+
limitPrice?: number;
|
|
30
|
+
comment?: string;
|
|
31
|
+
}, options?: RpcOptions): Promise<string>;
|
|
17
32
|
}
|
package/dist/trade.js
CHANGED
|
@@ -8,7 +8,14 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
8
8
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
9
|
});
|
|
10
10
|
};
|
|
11
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
|
+
};
|
|
11
14
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
const web3_js_1 = require("@solana/web3.js");
|
|
16
|
+
const bn_js_1 = __importDefault(require("bn.js"));
|
|
17
|
+
const constants_1 = require("./utils/constants");
|
|
18
|
+
const helpers_1 = require("./utils/helpers");
|
|
12
19
|
class Trade {
|
|
13
20
|
constructor(program, provider) {
|
|
14
21
|
this.provider = provider;
|
|
@@ -33,7 +40,8 @@ class Trade {
|
|
|
33
40
|
totalVolume: account.totalVolume.toNumber(),
|
|
34
41
|
vaultTokenAccount: account.vaultTokenAccount.toString(),
|
|
35
42
|
mint: account.mint.toString(),
|
|
36
|
-
|
|
43
|
+
ts: account.ts.toNumber(),
|
|
44
|
+
updateTs: account.updateTs.toNumber(),
|
|
37
45
|
openOrdersCount: account.openOrdersCount.toNumber(),
|
|
38
46
|
nextOrderId: account.nextOrderId.toNumber(),
|
|
39
47
|
feeBps: account.feeBps,
|
|
@@ -43,9 +51,6 @@ class Trade {
|
|
|
43
51
|
})));
|
|
44
52
|
});
|
|
45
53
|
}
|
|
46
|
-
/**
|
|
47
|
-
* Get Market By Address
|
|
48
|
-
*/
|
|
49
54
|
getMarketByAddress(address) {
|
|
50
55
|
return __awaiter(this, void 0, void 0, function* () {
|
|
51
56
|
const account = yield this.program.account.market.fetch(address);
|
|
@@ -63,7 +68,8 @@ class Trade {
|
|
|
63
68
|
totalVolume: account.totalVolume.toNumber(),
|
|
64
69
|
vaultTokenAccount: account.vaultTokenAccount.toString(),
|
|
65
70
|
mint: account.mint.toString(),
|
|
66
|
-
|
|
71
|
+
ts: account.ts.toNumber(),
|
|
72
|
+
updateTs: account.updateTs.toNumber(),
|
|
67
73
|
openOrdersCount: account.openOrdersCount.toNumber(),
|
|
68
74
|
nextOrderId: account.nextOrderId.toNumber(),
|
|
69
75
|
feeBps: account.feeBps,
|
|
@@ -73,5 +79,60 @@ class Trade {
|
|
|
73
79
|
};
|
|
74
80
|
});
|
|
75
81
|
}
|
|
82
|
+
/**
|
|
83
|
+
* Initialize Market
|
|
84
|
+
* @param market id - new markert id - length + 1
|
|
85
|
+
* @param name - PYTH/TRD JUP/TRD DRIFT/TRD
|
|
86
|
+
*
|
|
87
|
+
*/
|
|
88
|
+
initializeMarket({ marketId, name }, options) {
|
|
89
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
90
|
+
const method = this.program.methods
|
|
91
|
+
.initializeMarket({
|
|
92
|
+
marketId: new bn_js_1.default(marketId),
|
|
93
|
+
name: name
|
|
94
|
+
})
|
|
95
|
+
.accounts({
|
|
96
|
+
signer: this.provider.publicKey,
|
|
97
|
+
mint: constants_1.TRD_MINT
|
|
98
|
+
});
|
|
99
|
+
if (options === null || options === void 0 ? void 0 : options.microLamports) {
|
|
100
|
+
method.postInstructions([
|
|
101
|
+
web3_js_1.ComputeBudgetProgram.setComputeUnitPrice({
|
|
102
|
+
microLamports: options.microLamports
|
|
103
|
+
})
|
|
104
|
+
]);
|
|
105
|
+
}
|
|
106
|
+
return method.rpc({ skipPreflight: options === null || options === void 0 ? void 0 : options.skipPreflight });
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
openOrder(marketId, args, options) {
|
|
110
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
111
|
+
const marketPDA = (0, helpers_1.getMarketAddressSync)(this.program.programId, marketId);
|
|
112
|
+
const method = this.program.methods
|
|
113
|
+
.openOrder({
|
|
114
|
+
amount: new bn_js_1.default(args.amount / Math.pow(10, constants_1.TRD_DECIMALS)),
|
|
115
|
+
direction: args.direction,
|
|
116
|
+
orderType: args.orderType,
|
|
117
|
+
limitPrice: args.limitPrice
|
|
118
|
+
? new bn_js_1.default(args.limitPrice / Math.pow(10, constants_1.TRD_DECIMALS))
|
|
119
|
+
: undefined,
|
|
120
|
+
comment: (0, helpers_1.encodeString)(args.comment, 64)
|
|
121
|
+
})
|
|
122
|
+
.accounts({
|
|
123
|
+
signer: this.provider.publicKey,
|
|
124
|
+
market: marketPDA,
|
|
125
|
+
mint: constants_1.TRD_MINT
|
|
126
|
+
});
|
|
127
|
+
if (options === null || options === void 0 ? void 0 : options.microLamports) {
|
|
128
|
+
method.postInstructions([
|
|
129
|
+
web3_js_1.ComputeBudgetProgram.setComputeUnitPrice({
|
|
130
|
+
microLamports: options.microLamports
|
|
131
|
+
})
|
|
132
|
+
]);
|
|
133
|
+
}
|
|
134
|
+
return method.rpc({ skipPreflight: options === null || options === void 0 ? void 0 : options.skipPreflight });
|
|
135
|
+
});
|
|
136
|
+
}
|
|
76
137
|
}
|
|
77
138
|
exports.default = Trade;
|