Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions light-sdk-ts/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
"test-verifiers": "ts-mocha --resolveJsonModule ./tsconfig.json -t 100000000 tests/verifiers.test.ts --exit",
"test-transaction": "ts-mocha --resolveJsonModule ./tsconfig.json -t 100000000 tests/transaction.test.ts --exit",
"test-account": "ts-mocha --resolveJsonModule ./tsconfig.json -t 100000000 tests/account.test.ts --exit",
"test-relayer": "ts-mocha --resolveJsonModule ./tsconfig.json -t 100000000 tests/relayer.test.ts --exit",
"build": "yarn tsc",
"format": "prettier --write \"src/**/*.{ts,js}\"",
"lint:fix": "prettier */*.js \"*/**/*{.js,.ts}\" -w",
Expand Down
9 changes: 9 additions & 0 deletions light-sdk-ts/src/errors.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,13 @@ export enum UtxoErrorCode {
ASSET_NOT_FOUND = "ASSET_NOT_FOUND",
}

export enum RelayerErrorCode {
RELAYER_FEE_UNDEFINED = "RELAYER_FEE_UNDEFINED",
RELAYER_PUBKEY_UNDEFINED = "RELAYER_PUBKEY_UNDEFINED",
LOOK_UP_TABLE_UNDEFINED = "LOOK_UP_TABLE_UNDEFINED",
RELAYER_RECIPIENT_UNDEFINED = "RELAYER_RECIPIENT_UNDEFINED",
}

export enum AccountErrorCode {
INVALID_SEED_SIZE = "INVALID_SEED_SIZE",
SEED_UNDEFINED = "SEED_UNDEFINED",
Expand Down Expand Up @@ -122,3 +129,5 @@ export class UtxoError extends MetaError {}
export class VerifierError extends MetaError {}

export class AccountError extends MetaError {}

export class RelayerError extends MetaError {}
25 changes: 25 additions & 0 deletions light-sdk-ts/src/relayer.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import { Keypair, PublicKey } from "@solana/web3.js";
import { BN } from "@coral-xyz/anchor";
import { RelayerError, RelayerErrorCode } from "./errors";

export class Relayer {
accounts: {
Expand All @@ -22,6 +23,30 @@ export class Relayer {
relayerRecipient?: PublicKey,
relayerFee: BN = new BN(0),
) {
if (!relayerPubkey) {
throw new RelayerError(
RelayerErrorCode.RELAYER_PUBKEY_UNDEFINED,
"constructor",
);
}
if (!lookUpTable) {
throw new RelayerError(
RelayerErrorCode.LOOK_UP_TABLE_UNDEFINED,
"constructor",
);
}
if (relayerRecipient && relayerFee.toString() === "0") {
throw new RelayerError(
RelayerErrorCode.RELAYER_FEE_UNDEFINED,
"constructor",
);
}
if (relayerFee.toString() !== "0" && !relayerRecipient) {
throw new RelayerError(
RelayerErrorCode.RELAYER_RECIPIENT_UNDEFINED,
"constructor",
);
}
if (relayerRecipient) {
this.accounts = {
relayerPubkey,
Expand Down
110 changes: 110 additions & 0 deletions light-sdk-ts/tests/relayer.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,110 @@
import { assert, expect } from "chai";

import { Keypair as SolanaKeypair } from "@solana/web3.js";
import * as anchor from "@coral-xyz/anchor";
import { it } from "mocha";

import { Relayer, RelayerError, RelayerErrorCode } from "../src";

process.env.ANCHOR_PROVIDER_URL = "http://127.0.0.1:8899";
process.env.ANCHOR_WALLET = process.env.HOME + "/.config/solana/id.json";
let mockKeypair = SolanaKeypair.generate();
let mockKeypair1 = SolanaKeypair.generate();
let relayerFee = new anchor.BN("123214");
let relayerRecipient = SolanaKeypair.generate().publicKey;

describe("Test Relayer Functional", () => {
it("Relayer Deposit", () => {
let relayer = new Relayer(mockKeypair.publicKey, mockKeypair1.publicKey);
assert.equal(
relayer.accounts.lookUpTable.toBase58(),
mockKeypair1.publicKey.toBase58(),
);
assert.equal(
relayer.accounts.relayerPubkey.toBase58(),
mockKeypair.publicKey.toBase58(),
);
assert.equal(relayer.relayerFee.toString(), "0");
});

it("Relayer Transfer/Withdrawal", () => {
let relayer = new Relayer(
mockKeypair.publicKey,
mockKeypair1.publicKey,
relayerRecipient,
relayerFee,
);
assert.equal(
relayer.accounts.lookUpTable.toBase58(),
mockKeypair1.publicKey.toBase58(),
);
assert.equal(
relayer.accounts.relayerPubkey.toBase58(),
mockKeypair.publicKey.toBase58(),
);
assert.equal(relayer.relayerFee.toString(), relayerFee.toString());
assert.equal(
relayer.accounts.relayerRecipient.toBase58(),
relayerRecipient.toBase58(),
);
});
});

describe("Test Relayer Errors", () => {
it("RELAYER_PUBKEY_UNDEFINED", () => {
expect(() => {
// @ts-ignore
new Relayer();
})
.to.throw(RelayerError)
.includes({
code: RelayerErrorCode.RELAYER_PUBKEY_UNDEFINED,
functionName: "constructor",
});
});

it("LOOK_UP_TABLE_UNDEFINED", () => {
expect(() => {
// @ts-ignore
new Relayer(mockKeypair.publicKey);
})
.to.throw(RelayerError)
.includes({
code: RelayerErrorCode.LOOK_UP_TABLE_UNDEFINED,
functionName: "constructor",
});
});

it("RELAYER_FEE_UNDEFINED", () => {
expect(() => {
// @ts-ignore
new Relayer(
mockKeypair.publicKey,
mockKeypair1.publicKey,
relayerRecipient,
);
})
.to.throw(RelayerError)
.includes({
code: RelayerErrorCode.RELAYER_FEE_UNDEFINED,
functionName: "constructor",
});
});

it("RELAYER_RECIPIENT_UNDEFINED", () => {
expect(() => {
// @ts-ignore
new Relayer(
mockKeypair.publicKey,
mockKeypair1.publicKey,
undefined,
relayerFee,
);
})
.to.throw(RelayerError)
.includes({
code: RelayerErrorCode.RELAYER_RECIPIENT_UNDEFINED,
functionName: "constructor",
});
});
});
2 changes: 1 addition & 1 deletion mock-app-verifier/tests/functional_test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -134,7 +134,7 @@ describe("Mock verifier functional", () => {
ADMIN_AUTH_KEYPAIR.publicKey,
lightProvider.lookUpTable,
relayerRecipient,
new BN(0),
new BN(100000),
);
await provider.connection.confirmTransaction(
await provider.connection.requestAirdrop(relayerRecipient, 10000000),
Expand Down