@jpool/bond-sdk 0.9.0-next.23 → 0.9.0-next.25
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.mts +27 -5
- package/dist/index.d.ts +27 -5
- package/dist/index.js +188 -17
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +190 -19
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.d.mts
CHANGED
|
@@ -32,7 +32,7 @@ declare const ENV_PROGRAM_ID: Record<string, PublicKey>;
|
|
|
32
32
|
* IDL can be found at `target/idl/jbond.json`.
|
|
33
33
|
*/
|
|
34
34
|
type Jbond = {
|
|
35
|
-
"address": "
|
|
35
|
+
"address": "BondQ7KqZreTcW2UbeTNDcLCJQ3aXAtLn2Fm6ftaJDU";
|
|
36
36
|
"metadata": {
|
|
37
37
|
"name": "jbond";
|
|
38
38
|
"version": "0.2.1";
|
|
@@ -1231,7 +1231,7 @@ type Jbond = {
|
|
|
1231
1231
|
{
|
|
1232
1232
|
"name": "bondInitializeData";
|
|
1233
1233
|
"docs": [
|
|
1234
|
-
"Data required to initialize a
|
|
1234
|
+
"Data required to initialize a performance bond"
|
|
1235
1235
|
];
|
|
1236
1236
|
"type": {
|
|
1237
1237
|
"kind": "struct";
|
|
@@ -1728,8 +1728,6 @@ type TransactionHistoryItem = {
|
|
|
1728
1728
|
epoch: number;
|
|
1729
1729
|
type: BondTransactionType;
|
|
1730
1730
|
amount: number;
|
|
1731
|
-
beforeBalance?: number;
|
|
1732
|
-
afterBalance?: number;
|
|
1733
1731
|
};
|
|
1734
1732
|
declare enum BondTransactionType {
|
|
1735
1733
|
Deposit = "deposit",
|
|
@@ -1942,7 +1940,8 @@ declare class JBondClient {
|
|
|
1942
1940
|
/**
|
|
1943
1941
|
* Get all bond states with total collected collateral
|
|
1944
1942
|
*/
|
|
1945
|
-
getAllBondStates(bondType: BondType,
|
|
1943
|
+
getAllBondStates(bondType: BondType, sessionStatus?: SessionStatus): Promise<{
|
|
1944
|
+
publicKey: PublicKey;
|
|
1946
1945
|
bondState: {
|
|
1947
1946
|
name: string;
|
|
1948
1947
|
bondType: ({
|
|
@@ -2023,6 +2022,29 @@ declare class JBondClient {
|
|
|
2023
2022
|
* Get total collected collateral for a bond state
|
|
2024
2023
|
*/
|
|
2025
2024
|
getBondStateTotalCollected(bondType: BondType, bondName: string, votes: PublicKeyInitData[]): Promise<number>;
|
|
2025
|
+
/**
|
|
2026
|
+
* Get transaction history for a specific validator bond account
|
|
2027
|
+
*/
|
|
2028
|
+
getHistory(bondType: BondType, bondName: string, vote: PublicKey, options?: {
|
|
2029
|
+
cluster?: 'mainnet-beta' | 'testnet' | 'devnet';
|
|
2030
|
+
limit?: number;
|
|
2031
|
+
before?: string;
|
|
2032
|
+
until?: string;
|
|
2033
|
+
}): Promise<TransactionHistoryItem[]>;
|
|
2034
|
+
/**
|
|
2035
|
+
* Get full transaction history by paginating through results
|
|
2036
|
+
* @param bondType
|
|
2037
|
+
* @param bondName
|
|
2038
|
+
* @param voteAccount
|
|
2039
|
+
* @param pageSize
|
|
2040
|
+
*/
|
|
2041
|
+
getFullHistory(bondType: BondType, bondName: string, voteAccount: PublicKey, pageSize?: number): Promise<TransactionHistoryItem[]>;
|
|
2042
|
+
/**
|
|
2043
|
+
* Get instruction discriminator from IDL
|
|
2044
|
+
* @param instructionName
|
|
2045
|
+
* @private
|
|
2046
|
+
*/
|
|
2047
|
+
private getInstructionDiscriminator;
|
|
2026
2048
|
/**
|
|
2027
2049
|
* Get bond state stats
|
|
2028
2050
|
* @param state
|
package/dist/index.d.ts
CHANGED
|
@@ -32,7 +32,7 @@ declare const ENV_PROGRAM_ID: Record<string, PublicKey>;
|
|
|
32
32
|
* IDL can be found at `target/idl/jbond.json`.
|
|
33
33
|
*/
|
|
34
34
|
type Jbond = {
|
|
35
|
-
"address": "
|
|
35
|
+
"address": "BondQ7KqZreTcW2UbeTNDcLCJQ3aXAtLn2Fm6ftaJDU";
|
|
36
36
|
"metadata": {
|
|
37
37
|
"name": "jbond";
|
|
38
38
|
"version": "0.2.1";
|
|
@@ -1231,7 +1231,7 @@ type Jbond = {
|
|
|
1231
1231
|
{
|
|
1232
1232
|
"name": "bondInitializeData";
|
|
1233
1233
|
"docs": [
|
|
1234
|
-
"Data required to initialize a
|
|
1234
|
+
"Data required to initialize a performance bond"
|
|
1235
1235
|
];
|
|
1236
1236
|
"type": {
|
|
1237
1237
|
"kind": "struct";
|
|
@@ -1728,8 +1728,6 @@ type TransactionHistoryItem = {
|
|
|
1728
1728
|
epoch: number;
|
|
1729
1729
|
type: BondTransactionType;
|
|
1730
1730
|
amount: number;
|
|
1731
|
-
beforeBalance?: number;
|
|
1732
|
-
afterBalance?: number;
|
|
1733
1731
|
};
|
|
1734
1732
|
declare enum BondTransactionType {
|
|
1735
1733
|
Deposit = "deposit",
|
|
@@ -1942,7 +1940,8 @@ declare class JBondClient {
|
|
|
1942
1940
|
/**
|
|
1943
1941
|
* Get all bond states with total collected collateral
|
|
1944
1942
|
*/
|
|
1945
|
-
getAllBondStates(bondType: BondType,
|
|
1943
|
+
getAllBondStates(bondType: BondType, sessionStatus?: SessionStatus): Promise<{
|
|
1944
|
+
publicKey: PublicKey;
|
|
1946
1945
|
bondState: {
|
|
1947
1946
|
name: string;
|
|
1948
1947
|
bondType: ({
|
|
@@ -2023,6 +2022,29 @@ declare class JBondClient {
|
|
|
2023
2022
|
* Get total collected collateral for a bond state
|
|
2024
2023
|
*/
|
|
2025
2024
|
getBondStateTotalCollected(bondType: BondType, bondName: string, votes: PublicKeyInitData[]): Promise<number>;
|
|
2025
|
+
/**
|
|
2026
|
+
* Get transaction history for a specific validator bond account
|
|
2027
|
+
*/
|
|
2028
|
+
getHistory(bondType: BondType, bondName: string, vote: PublicKey, options?: {
|
|
2029
|
+
cluster?: 'mainnet-beta' | 'testnet' | 'devnet';
|
|
2030
|
+
limit?: number;
|
|
2031
|
+
before?: string;
|
|
2032
|
+
until?: string;
|
|
2033
|
+
}): Promise<TransactionHistoryItem[]>;
|
|
2034
|
+
/**
|
|
2035
|
+
* Get full transaction history by paginating through results
|
|
2036
|
+
* @param bondType
|
|
2037
|
+
* @param bondName
|
|
2038
|
+
* @param voteAccount
|
|
2039
|
+
* @param pageSize
|
|
2040
|
+
*/
|
|
2041
|
+
getFullHistory(bondType: BondType, bondName: string, voteAccount: PublicKey, pageSize?: number): Promise<TransactionHistoryItem[]>;
|
|
2042
|
+
/**
|
|
2043
|
+
* Get instruction discriminator from IDL
|
|
2044
|
+
* @param instructionName
|
|
2045
|
+
* @private
|
|
2046
|
+
*/
|
|
2047
|
+
private getInstructionDiscriminator;
|
|
2026
2048
|
/**
|
|
2027
2049
|
* Get bond state stats
|
|
2028
2050
|
* @param state
|
package/dist/index.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
var anchor = require('@coral-xyz/anchor');
|
|
4
|
+
var bytes = require('@coral-xyz/anchor/dist/cjs/utils/bytes');
|
|
4
5
|
var splStakePool = require('@solana/spl-stake-pool');
|
|
5
6
|
var splToken = require('@solana/spl-token');
|
|
6
7
|
var web3_js = require('@solana/web3.js');
|
|
@@ -4751,23 +4752,12 @@ var HistoryManager = class {
|
|
|
4751
4752
|
if (!type || amount <= 0) {
|
|
4752
4753
|
continue;
|
|
4753
4754
|
}
|
|
4754
|
-
let beforeBalance;
|
|
4755
|
-
let afterBalance;
|
|
4756
|
-
const accIdx = tx.transaction.message.accountKeys.findIndex(
|
|
4757
|
-
(k) => k.pubkey.equals(validatorBondAccount)
|
|
4758
|
-
);
|
|
4759
|
-
if (accIdx !== -1 && tx.meta.preBalances && tx.meta.postBalances) {
|
|
4760
|
-
beforeBalance = Number(tx.meta.preBalances[accIdx] ?? 0) / web3_js.LAMPORTS_PER_SOL;
|
|
4761
|
-
afterBalance = Number(tx.meta.postBalances[accIdx] ?? 0) / web3_js.LAMPORTS_PER_SOL;
|
|
4762
|
-
}
|
|
4763
4755
|
history.push({
|
|
4764
4756
|
signature: sig,
|
|
4765
4757
|
slot,
|
|
4766
4758
|
epoch: slotToEpoch(slot, cluster),
|
|
4767
4759
|
type,
|
|
4768
|
-
amount
|
|
4769
|
-
beforeBalance,
|
|
4770
|
-
afterBalance
|
|
4760
|
+
amount
|
|
4771
4761
|
});
|
|
4772
4762
|
}
|
|
4773
4763
|
}
|
|
@@ -4842,7 +4832,7 @@ var HistoryManager = class {
|
|
|
4842
4832
|
|
|
4843
4833
|
// src/idl/jbond.json
|
|
4844
4834
|
var jbond_default = {
|
|
4845
|
-
address: "
|
|
4835
|
+
address: "BondQ7KqZreTcW2UbeTNDcLCJQ3aXAtLn2Fm6ftaJDU",
|
|
4846
4836
|
metadata: {
|
|
4847
4837
|
name: "jbond",
|
|
4848
4838
|
version: "0.2.1",
|
|
@@ -6041,7 +6031,7 @@ var jbond_default = {
|
|
|
6041
6031
|
{
|
|
6042
6032
|
name: "BondInitializeData",
|
|
6043
6033
|
docs: [
|
|
6044
|
-
"Data required to initialize a
|
|
6034
|
+
"Data required to initialize a performance bond"
|
|
6045
6035
|
],
|
|
6046
6036
|
type: {
|
|
6047
6037
|
kind: "struct",
|
|
@@ -6941,19 +6931,20 @@ var JBondClient = class _JBondClient {
|
|
|
6941
6931
|
/**
|
|
6942
6932
|
* Get all bond states with total collected collateral
|
|
6943
6933
|
*/
|
|
6944
|
-
async getAllBondStates(bondType,
|
|
6934
|
+
async getAllBondStates(bondType, sessionStatus) {
|
|
6945
6935
|
const bondStates = [];
|
|
6946
6936
|
const bondStateAccounts = await this.program.account.bondState.all();
|
|
6947
|
-
for (const { account: state } of bondStateAccounts) {
|
|
6937
|
+
for (const { publicKey, account: state } of bondStateAccounts) {
|
|
6948
6938
|
if (!sameVariant(state.bondType, bondType)) {
|
|
6949
6939
|
continue;
|
|
6950
6940
|
}
|
|
6951
|
-
if (
|
|
6941
|
+
if (sessionStatus !== void 0 && this.getBondStateSessionStatus(state) !== sessionStatus) {
|
|
6952
6942
|
continue;
|
|
6953
6943
|
}
|
|
6954
6944
|
const bondStateStats = await this.getBondStateStats(state);
|
|
6955
6945
|
bondStates.push(
|
|
6956
6946
|
{
|
|
6947
|
+
publicKey,
|
|
6957
6948
|
bondState: state,
|
|
6958
6949
|
stateStats: bondStateStats
|
|
6959
6950
|
}
|
|
@@ -7104,6 +7095,186 @@ var JBondClient = class _JBondClient {
|
|
|
7104
7095
|
}
|
|
7105
7096
|
});
|
|
7106
7097
|
}
|
|
7098
|
+
/**
|
|
7099
|
+
* Get transaction history for a specific validator bond account
|
|
7100
|
+
*/
|
|
7101
|
+
async getHistory(bondType, bondName, vote, options) {
|
|
7102
|
+
const [legacyValidatorBondAccount] = web3_js.PublicKey.findProgramAddressSync(
|
|
7103
|
+
[
|
|
7104
|
+
Buffer.from("validator_bond" /* ValidatorBond */),
|
|
7105
|
+
new web3_js.PublicKey(vote).toBuffer()
|
|
7106
|
+
],
|
|
7107
|
+
this.programId
|
|
7108
|
+
);
|
|
7109
|
+
const validatorBond = this.pda.validatorBond(bondType, bondName, vote);
|
|
7110
|
+
console.log("Derived legacy validator bond account:", legacyValidatorBondAccount.toBase58());
|
|
7111
|
+
console.log("Derived new validator bond account:", validatorBond[0].toBase58());
|
|
7112
|
+
console.log("Fetching history for legacy validator bond account:", legacyValidatorBondAccount.toBase58());
|
|
7113
|
+
console.log("Fetching history for new validator bond account:", validatorBond[0].toBase58());
|
|
7114
|
+
const legacySignatures = (await this.connection.getSignaturesForAddress(
|
|
7115
|
+
legacyValidatorBondAccount,
|
|
7116
|
+
{
|
|
7117
|
+
limit: options?.limit || 1e3,
|
|
7118
|
+
before: options?.before,
|
|
7119
|
+
until: options?.until
|
|
7120
|
+
},
|
|
7121
|
+
"confirmed"
|
|
7122
|
+
)).filter((sig) => !sig.err);
|
|
7123
|
+
const newSignatures = (await this.connection.getSignaturesForAddress(
|
|
7124
|
+
validatorBond[0],
|
|
7125
|
+
{
|
|
7126
|
+
limit: options?.limit || 1e3,
|
|
7127
|
+
before: options?.before,
|
|
7128
|
+
until: options?.until
|
|
7129
|
+
},
|
|
7130
|
+
"confirmed"
|
|
7131
|
+
)).filter((sig) => !sig.err);
|
|
7132
|
+
const signatureStrings = legacySignatures.map((sig) => sig.signature);
|
|
7133
|
+
signatureStrings.push(...newSignatures.map((sig) => sig.signature));
|
|
7134
|
+
const signatures = [...legacySignatures, ...newSignatures];
|
|
7135
|
+
const BATCH_SIZE = 100;
|
|
7136
|
+
const allTransactions = [];
|
|
7137
|
+
for (let i = 0; i < signatureStrings.length; i += BATCH_SIZE) {
|
|
7138
|
+
const batch = signatureStrings.slice(i, i + BATCH_SIZE);
|
|
7139
|
+
const transactions = await this.connection.getParsedTransactions(
|
|
7140
|
+
batch,
|
|
7141
|
+
{
|
|
7142
|
+
maxSupportedTransactionVersion: 0,
|
|
7143
|
+
commitment: "confirmed"
|
|
7144
|
+
}
|
|
7145
|
+
);
|
|
7146
|
+
allTransactions.push(...transactions);
|
|
7147
|
+
}
|
|
7148
|
+
const cluster = options?.cluster || "mainnet-beta";
|
|
7149
|
+
const history = [];
|
|
7150
|
+
for (const [idx, tx] of allTransactions.entries()) {
|
|
7151
|
+
const sigInfo = signatures[idx];
|
|
7152
|
+
if (!tx || !tx.meta || tx.meta.err !== null) {
|
|
7153
|
+
continue;
|
|
7154
|
+
}
|
|
7155
|
+
try {
|
|
7156
|
+
const slot = tx.slot || 0;
|
|
7157
|
+
const instructions = tx.transaction.message.instructions;
|
|
7158
|
+
for (const instruction of instructions) {
|
|
7159
|
+
if ("programId" in instruction && instruction.programId.equals(this.options.programId ?? this.program.programId)) {
|
|
7160
|
+
const ixData = instruction;
|
|
7161
|
+
if ("parsed" in ixData && ixData.parsed) {
|
|
7162
|
+
continue;
|
|
7163
|
+
}
|
|
7164
|
+
const data = ixData.data;
|
|
7165
|
+
if (!data) {
|
|
7166
|
+
continue;
|
|
7167
|
+
}
|
|
7168
|
+
let type = null;
|
|
7169
|
+
let amount = 0;
|
|
7170
|
+
try {
|
|
7171
|
+
const dataBuffer = bytes.bs58.decode(data);
|
|
7172
|
+
if (dataBuffer.length >= 8) {
|
|
7173
|
+
const discriminator = dataBuffer.subarray(0, 8);
|
|
7174
|
+
const legacyRegisterDiscriminator = this.getInstructionDiscriminator("register");
|
|
7175
|
+
const legacyTopUpDiscriminator = this.getInstructionDiscriminator("topUp");
|
|
7176
|
+
const legacyClaimDiscriminator = this.getInstructionDiscriminator("claim");
|
|
7177
|
+
const legacyWithdrawDiscriminator = this.getInstructionDiscriminator("withdraw");
|
|
7178
|
+
const bondRegisterDiscriminator = this.getInstructionDiscriminator("bondRegister");
|
|
7179
|
+
const bondTopUpDiscriminator = this.getInstructionDiscriminator("bondTopUp");
|
|
7180
|
+
const bondClaimDiscriminator = this.getInstructionDiscriminator("bondClaim");
|
|
7181
|
+
const bondWithdrawDiscriminator = this.getInstructionDiscriminator("bondWithdraw");
|
|
7182
|
+
console.log("Discriminator:", Buffer.from(discriminator).toString("hex"));
|
|
7183
|
+
if (Buffer.from(discriminator).equals(Buffer.from(legacyRegisterDiscriminator)) || Buffer.from(discriminator).equals(Buffer.from(bondRegisterDiscriminator))) {
|
|
7184
|
+
type = "deposit" /* Deposit */;
|
|
7185
|
+
if (dataBuffer.length >= 16 && Buffer.from(discriminator).equals(Buffer.from(legacyRegisterDiscriminator))) {
|
|
7186
|
+
const amountBytes = dataBuffer.subarray(8, 16);
|
|
7187
|
+
const amountBN = new import_bn2.BN(amountBytes, "le");
|
|
7188
|
+
amount = amountBN.toNumber() / web3_js.LAMPORTS_PER_SOL;
|
|
7189
|
+
} else {
|
|
7190
|
+
amount = 0;
|
|
7191
|
+
}
|
|
7192
|
+
} else if (dataBuffer.length >= 16) {
|
|
7193
|
+
const amountBytes = dataBuffer.subarray(8, 16);
|
|
7194
|
+
const amountBN = new import_bn2.BN(amountBytes, "le");
|
|
7195
|
+
amount = amountBN.toNumber() / web3_js.LAMPORTS_PER_SOL;
|
|
7196
|
+
if (Buffer.from(discriminator).equals(Buffer.from(legacyTopUpDiscriminator)) || Buffer.from(discriminator).equals(Buffer.from(bondTopUpDiscriminator))) {
|
|
7197
|
+
type = "deposit" /* Deposit */;
|
|
7198
|
+
} else if (Buffer.from(discriminator).equals(Buffer.from(legacyClaimDiscriminator)) || Buffer.from(discriminator).equals(Buffer.from(bondClaimDiscriminator))) {
|
|
7199
|
+
type = "compensation" /* Compensation */;
|
|
7200
|
+
} else if (Buffer.from(discriminator).equals(Buffer.from(legacyWithdrawDiscriminator)) || Buffer.from(discriminator).equals(Buffer.from(bondWithdrawDiscriminator))) {
|
|
7201
|
+
type = "withdrawal" /* Withdrawal */;
|
|
7202
|
+
}
|
|
7203
|
+
}
|
|
7204
|
+
}
|
|
7205
|
+
} catch (e) {
|
|
7206
|
+
console.warn("Failed to decode instruction data:", e);
|
|
7207
|
+
}
|
|
7208
|
+
if (type && (amount > 0 || type === "deposit" /* Deposit */)) {
|
|
7209
|
+
history.push({
|
|
7210
|
+
signature: sigInfo.signature,
|
|
7211
|
+
slot,
|
|
7212
|
+
epoch: slotToEpoch(slot, cluster),
|
|
7213
|
+
type,
|
|
7214
|
+
amount
|
|
7215
|
+
});
|
|
7216
|
+
}
|
|
7217
|
+
}
|
|
7218
|
+
}
|
|
7219
|
+
} catch (error) {
|
|
7220
|
+
console.error(`Error processing transaction ${sigInfo.signature}:`, error);
|
|
7221
|
+
}
|
|
7222
|
+
}
|
|
7223
|
+
return history.toSorted((a, b) => b.slot - a.slot);
|
|
7224
|
+
}
|
|
7225
|
+
/**
|
|
7226
|
+
* Get full transaction history by paginating through results
|
|
7227
|
+
* @param bondType
|
|
7228
|
+
* @param bondName
|
|
7229
|
+
* @param voteAccount
|
|
7230
|
+
* @param pageSize
|
|
7231
|
+
*/
|
|
7232
|
+
async getFullHistory(bondType, bondName, voteAccount, pageSize = 100) {
|
|
7233
|
+
const allHistory = [];
|
|
7234
|
+
let before;
|
|
7235
|
+
while (true) {
|
|
7236
|
+
const batch = await this.getHistory(bondType, bondName, voteAccount, {
|
|
7237
|
+
limit: pageSize,
|
|
7238
|
+
before
|
|
7239
|
+
});
|
|
7240
|
+
if (batch.length === 0) {
|
|
7241
|
+
break;
|
|
7242
|
+
}
|
|
7243
|
+
allHistory.push(...batch);
|
|
7244
|
+
before = batch.at(-1)?.signature;
|
|
7245
|
+
if (batch.length < pageSize) {
|
|
7246
|
+
break;
|
|
7247
|
+
}
|
|
7248
|
+
}
|
|
7249
|
+
return allHistory;
|
|
7250
|
+
}
|
|
7251
|
+
/**
|
|
7252
|
+
* Get instruction discriminator from IDL
|
|
7253
|
+
* @param instructionName
|
|
7254
|
+
* @private
|
|
7255
|
+
*/
|
|
7256
|
+
getInstructionDiscriminator(instructionName) {
|
|
7257
|
+
const legacyDiscriminators = {
|
|
7258
|
+
register: [211, 124, 67, 15, 211, 194, 178, 240],
|
|
7259
|
+
topUp: [181, 157, 89, 67, 143, 182, 52, 72],
|
|
7260
|
+
claim: [62, 198, 214, 193, 213, 159, 108, 210],
|
|
7261
|
+
withdraw: [183, 18, 70, 156, 148, 109, 161, 34]
|
|
7262
|
+
};
|
|
7263
|
+
if (legacyDiscriminators[instructionName]) {
|
|
7264
|
+
return new Uint8Array(legacyDiscriminators[instructionName]);
|
|
7265
|
+
}
|
|
7266
|
+
if (instructionName.startsWith("bond")) {
|
|
7267
|
+
const instruction = this.program.idl.instructions.find((ix) => ix.name === instructionName);
|
|
7268
|
+
if (!instruction) {
|
|
7269
|
+
throw new Error(`Instruction ${instructionName} not found in IDL`);
|
|
7270
|
+
}
|
|
7271
|
+
if (!instruction.discriminator || !Array.isArray(instruction.discriminator)) {
|
|
7272
|
+
throw new Error(`Discriminator not found for instruction ${instructionName}`);
|
|
7273
|
+
}
|
|
7274
|
+
return new Uint8Array(instruction.discriminator);
|
|
7275
|
+
}
|
|
7276
|
+
throw new Error(`Unknown instruction: ${instructionName}`);
|
|
7277
|
+
}
|
|
7107
7278
|
/**
|
|
7108
7279
|
* Get bond state stats
|
|
7109
7280
|
* @param state
|