2021-10-16 09:47:57 -07:00
|
|
|
import * as assert from "assert";
|
|
|
|
import * as anchor from "@project-serum/anchor";
|
|
|
|
import { Program } from "@project-serum/anchor";
|
|
|
|
import { createMintAndVault } from "@project-serum/common";
|
|
|
|
import BN from "bn.js";
|
|
|
|
import {
|
|
|
|
PublicKey,
|
|
|
|
Keypair,
|
|
|
|
SystemProgram,
|
|
|
|
SYSVAR_RENT_PUBKEY,
|
|
|
|
} from "@solana/web3.js";
|
|
|
|
import {
|
|
|
|
Token,
|
|
|
|
TOKEN_PROGRAM_ID,
|
|
|
|
ASSOCIATED_TOKEN_PROGRAM_ID,
|
|
|
|
} from "@solana/spl-token";
|
|
|
|
import { GovernanceRegistry } from "../target/types/governance_registry";
|
|
|
|
|
|
|
|
describe("voting-rights", () => {
|
2021-10-05 13:40:01 -07:00
|
|
|
anchor.setProvider(anchor.Provider.env());
|
|
|
|
|
2021-10-16 09:47:57 -07:00
|
|
|
const program = anchor.workspace
|
|
|
|
.GovernanceRegistry as Program<GovernanceRegistry>;
|
2021-10-05 13:40:01 -07:00
|
|
|
|
2021-10-15 11:22:05 -07:00
|
|
|
// Initialized variables shared across tests.
|
|
|
|
const realm = Keypair.generate().publicKey;
|
|
|
|
const votingMintDecimals = 6;
|
|
|
|
const tokenProgram = TOKEN_PROGRAM_ID;
|
|
|
|
const associatedTokenProgram = ASSOCIATED_TOKEN_PROGRAM_ID;
|
|
|
|
const rent = SYSVAR_RENT_PUBKEY;
|
|
|
|
const systemProgram = SystemProgram.programId;
|
|
|
|
|
|
|
|
// Uninitialized variables shared across tests.
|
|
|
|
let registrar: PublicKey,
|
2021-10-16 09:47:57 -07:00
|
|
|
votingMint: PublicKey,
|
|
|
|
voter: PublicKey,
|
|
|
|
votingToken: PublicKey,
|
|
|
|
exchangeVaultA: PublicKey,
|
|
|
|
exchangeVaultB: PublicKey;
|
2021-10-15 11:22:05 -07:00
|
|
|
let registrarBump: number, votingMintBump: number, voterBump: number;
|
|
|
|
let mintA: PublicKey, mintB: PublicKey, godA: PublicKey, godB: PublicKey;
|
2021-10-16 09:47:57 -07:00
|
|
|
let tokenAClient: Token, tokenBClient: Token, votingTokenClient: Token;
|
2021-10-15 11:22:05 -07:00
|
|
|
|
2021-10-16 09:47:57 -07:00
|
|
|
it("Creates tokens and mints", async () => {
|
2021-10-15 11:22:05 -07:00
|
|
|
const decimals = 6;
|
|
|
|
const [_mintA, _godA] = await createMintAndVault(
|
|
|
|
program.provider,
|
|
|
|
new BN("1000000000000000000"),
|
|
|
|
undefined,
|
|
|
|
decimals
|
|
|
|
);
|
|
|
|
const [_mintB, _godB] = await createMintAndVault(
|
|
|
|
program.provider,
|
|
|
|
new BN("1000000000000000000"),
|
|
|
|
undefined,
|
|
|
|
decimals
|
|
|
|
);
|
|
|
|
|
|
|
|
mintA = _mintA;
|
|
|
|
mintB = _mintB;
|
|
|
|
godA = _godA;
|
|
|
|
godB = _godB;
|
|
|
|
});
|
|
|
|
|
2021-10-16 09:47:57 -07:00
|
|
|
it("Creates PDAs", async () => {
|
2021-10-15 11:22:05 -07:00
|
|
|
const [_registrar, _registrarBump] = await PublicKey.findProgramAddress(
|
|
|
|
[realm.toBuffer()],
|
2021-10-16 09:47:57 -07:00
|
|
|
program.programId
|
2021-10-15 11:22:05 -07:00
|
|
|
);
|
|
|
|
const [_votingMint, _votingMintBump] = await PublicKey.findProgramAddress(
|
|
|
|
[_registrar.toBuffer()],
|
2021-10-16 09:47:57 -07:00
|
|
|
program.programId
|
2021-10-15 11:22:05 -07:00
|
|
|
);
|
|
|
|
const [_voter, _voterBump] = await PublicKey.findProgramAddress(
|
|
|
|
[_registrar.toBuffer(), program.provider.wallet.publicKey.toBuffer()],
|
2021-10-16 09:47:57 -07:00
|
|
|
program.programId
|
2021-10-15 11:22:05 -07:00
|
|
|
);
|
|
|
|
votingToken = await Token.getAssociatedTokenAddress(
|
|
|
|
associatedTokenProgram,
|
|
|
|
tokenProgram,
|
|
|
|
_votingMint,
|
2021-10-16 09:47:57 -07:00
|
|
|
program.provider.wallet.publicKey
|
2021-10-15 11:22:05 -07:00
|
|
|
);
|
|
|
|
exchangeVaultA = await Token.getAssociatedTokenAddress(
|
|
|
|
associatedTokenProgram,
|
|
|
|
tokenProgram,
|
|
|
|
mintA,
|
|
|
|
_registrar,
|
2021-10-16 09:47:57 -07:00
|
|
|
true
|
2021-10-15 11:22:05 -07:00
|
|
|
);
|
|
|
|
exchangeVaultB = await Token.getAssociatedTokenAddress(
|
|
|
|
associatedTokenProgram,
|
|
|
|
tokenProgram,
|
|
|
|
mintB,
|
|
|
|
_registrar,
|
2021-10-16 09:47:57 -07:00
|
|
|
true
|
2021-10-15 11:22:05 -07:00
|
|
|
);
|
|
|
|
|
|
|
|
registrar = _registrar;
|
|
|
|
votingMint = _votingMint;
|
|
|
|
voter = _voter;
|
|
|
|
|
|
|
|
registrarBump = _registrarBump;
|
|
|
|
votingMintBump = _votingMintBump;
|
|
|
|
voterBump = _voterBump;
|
|
|
|
});
|
2021-10-05 13:40:01 -07:00
|
|
|
|
2021-10-16 09:47:57 -07:00
|
|
|
it("Creates token clients", async () => {
|
|
|
|
tokenAClient = new Token(
|
|
|
|
program.provider.connection,
|
|
|
|
mintA,
|
|
|
|
TOKEN_PROGRAM_ID,
|
|
|
|
// @ts-ignore
|
|
|
|
program.provider.wallet.payer
|
|
|
|
);
|
|
|
|
tokenBClient = new Token(
|
|
|
|
program.provider.connection,
|
|
|
|
mintB,
|
|
|
|
TOKEN_PROGRAM_ID,
|
|
|
|
// @ts-ignore
|
|
|
|
program.provider.wallet.payer
|
|
|
|
);
|
|
|
|
votingTokenClient = new Token(
|
|
|
|
program.provider.connection,
|
|
|
|
votingMint,
|
|
|
|
TOKEN_PROGRAM_ID,
|
|
|
|
// @ts-ignore
|
|
|
|
program.provider.wallet.payer
|
|
|
|
);
|
2021-10-05 13:40:01 -07:00
|
|
|
});
|
|
|
|
|
2021-10-16 09:47:57 -07:00
|
|
|
it("Initializes a registrar", async () => {
|
|
|
|
await program.rpc.createRegistrar(
|
2021-10-18 17:55:15 -07:00
|
|
|
new BN(0),
|
2021-10-16 09:47:57 -07:00
|
|
|
registrarBump,
|
|
|
|
votingMintBump,
|
|
|
|
votingMintDecimals,
|
|
|
|
{
|
|
|
|
accounts: {
|
|
|
|
registrar,
|
|
|
|
votingMint,
|
|
|
|
realm,
|
|
|
|
authority: program.provider.wallet.publicKey,
|
|
|
|
payer: program.provider.wallet.publicKey,
|
|
|
|
systemProgram,
|
|
|
|
tokenProgram,
|
|
|
|
rent,
|
|
|
|
},
|
|
|
|
}
|
|
|
|
);
|
|
|
|
});
|
|
|
|
|
|
|
|
it("Initializes a voter", async () => {
|
|
|
|
await program.rpc.createVoter(voterBump, {
|
2021-10-15 11:22:05 -07:00
|
|
|
accounts: {
|
|
|
|
voter,
|
|
|
|
votingToken,
|
|
|
|
votingMint,
|
|
|
|
registrar,
|
|
|
|
authority: program.provider.wallet.publicKey,
|
|
|
|
systemProgram,
|
|
|
|
associatedTokenProgram,
|
|
|
|
tokenProgram,
|
|
|
|
rent,
|
2021-10-16 09:47:57 -07:00
|
|
|
},
|
2021-10-15 11:22:05 -07:00
|
|
|
});
|
|
|
|
});
|
|
|
|
|
2021-10-16 09:47:57 -07:00
|
|
|
it("Adds an exchange rate", async () => {
|
2021-10-15 11:22:05 -07:00
|
|
|
const er = {
|
|
|
|
isUsed: false,
|
|
|
|
mint: mintA,
|
|
|
|
rate: new BN(1),
|
2021-10-16 09:47:57 -07:00
|
|
|
};
|
|
|
|
await program.rpc.createExchangeRate(er, {
|
2021-10-15 11:22:05 -07:00
|
|
|
accounts: {
|
|
|
|
exchangeVault: exchangeVaultA,
|
|
|
|
depositMint: mintA,
|
|
|
|
registrar,
|
|
|
|
authority: program.provider.wallet.publicKey,
|
|
|
|
payer: program.provider.wallet.publicKey,
|
|
|
|
rent,
|
|
|
|
tokenProgram,
|
|
|
|
associatedTokenProgram,
|
|
|
|
systemProgram,
|
2021-10-16 09:47:57 -07:00
|
|
|
},
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
it("Deposits unlocked A tokens", async () => {
|
|
|
|
const amount = new BN(10);
|
2021-10-18 17:55:15 -07:00
|
|
|
const lockup = { kind: { cliff: {} }, start_ts: 0, end_ts: 100 };
|
|
|
|
await program.rpc.createDeposit(amount, lockup, {
|
2021-10-16 09:47:57 -07:00
|
|
|
accounts: {
|
|
|
|
deposit: {
|
|
|
|
voter,
|
|
|
|
exchangeVault: exchangeVaultA,
|
|
|
|
depositToken: godA,
|
|
|
|
votingToken,
|
|
|
|
authority: program.provider.wallet.publicKey,
|
|
|
|
registrar,
|
|
|
|
depositMint: mintA,
|
|
|
|
votingMint,
|
|
|
|
tokenProgram,
|
|
|
|
},
|
|
|
|
},
|
|
|
|
});
|
|
|
|
|
|
|
|
const voterAccount = await program.account.voter.fetch(voter);
|
|
|
|
const deposit = voterAccount.deposits[0];
|
|
|
|
assert.ok(deposit.isUsed);
|
|
|
|
assert.ok(deposit.amount.toNumber() === 10);
|
|
|
|
assert.ok(deposit.rateIdx === 0);
|
|
|
|
|
|
|
|
const vtAccount = await votingTokenClient.getAccountInfo(votingToken);
|
|
|
|
assert.ok(vtAccount.amount.toNumber() === 10);
|
2021-10-15 11:22:05 -07:00
|
|
|
});
|
|
|
|
|
2021-10-16 09:47:57 -07:00
|
|
|
it("Withdraws unlocked A tokens", async () => {
|
|
|
|
const depositId = 0;
|
2021-10-15 11:22:05 -07:00
|
|
|
const amount = new BN(10);
|
2021-10-16 09:47:57 -07:00
|
|
|
await program.rpc.withdraw(depositId, amount, {
|
2021-10-15 11:22:05 -07:00
|
|
|
accounts: {
|
2021-10-16 09:47:57 -07:00
|
|
|
registrar,
|
2021-10-15 11:22:05 -07:00
|
|
|
voter,
|
|
|
|
exchangeVault: exchangeVaultA,
|
2021-10-16 09:47:57 -07:00
|
|
|
withdrawMint: mintA,
|
2021-10-15 11:22:05 -07:00
|
|
|
votingToken,
|
|
|
|
votingMint,
|
2021-10-16 09:47:57 -07:00
|
|
|
destination: godA,
|
|
|
|
authority: program.provider.wallet.publicKey,
|
2021-10-15 11:22:05 -07:00
|
|
|
tokenProgram,
|
|
|
|
},
|
|
|
|
});
|
2021-10-05 13:40:01 -07:00
|
|
|
|
2021-10-16 09:47:57 -07:00
|
|
|
const voterAccount = await program.account.voter.fetch(voter);
|
|
|
|
const deposit = voterAccount.deposits[0];
|
|
|
|
assert.ok(deposit.isUsed);
|
|
|
|
assert.ok(deposit.amount.toNumber() === 0);
|
|
|
|
assert.ok(deposit.rateIdx === 0);
|
2021-10-05 13:40:01 -07:00
|
|
|
|
2021-10-16 09:47:57 -07:00
|
|
|
const vtAccount = await votingTokenClient.getAccountInfo(votingToken);
|
|
|
|
assert.ok(vtAccount.amount.toNumber() === 0);
|
2021-10-15 11:22:05 -07:00
|
|
|
});
|
|
|
|
|
2021-10-16 09:47:57 -07:00
|
|
|
it("Deposits locked A tokens", async () => {
|
|
|
|
// todo
|
2021-10-15 11:22:05 -07:00
|
|
|
});
|
2021-10-05 13:40:01 -07:00
|
|
|
});
|