From c2029ac70ce65856e90f57417629df3fd3a95507 Mon Sep 17 00:00:00 2001 From: Armani Ferrante Date: Fri, 7 Jan 2022 16:44:12 -0500 Subject: [PATCH 01/16] ts: Coder as interface --- ts/src/coder/accounts.ts | 28 ++++++++-- ts/src/coder/event.ts | 3 +- ts/src/coder/index.ts | 79 ++++++++++++++++++++++------ ts/src/coder/instruction.ts | 15 +++--- ts/src/coder/state.ts | 2 +- ts/src/index.ts | 9 ++-- ts/src/program/event.ts | 2 +- ts/src/program/index.ts | 4 +- ts/src/program/namespace/account.ts | 40 +++----------- ts/src/program/namespace/index.ts | 4 +- ts/src/program/namespace/simulate.ts | 2 +- ts/src/program/namespace/state.ts | 4 +- 12 files changed, 122 insertions(+), 70 deletions(-) diff --git a/ts/src/coder/accounts.ts b/ts/src/coder/accounts.ts index 0be7433e84..8daa90ab99 100644 --- a/ts/src/coder/accounts.ts +++ b/ts/src/coder/accounts.ts @@ -1,9 +1,11 @@ +import bs58 from "bs58"; import { Buffer } from "buffer"; import { Layout } from "buffer-layout"; import { Idl } from "../idl.js"; import { IdlCoder } from "./idl.js"; import { sha256 } from "js-sha256"; import camelcase from "camelcase"; +import { AccountsCoder } from "."; /** * Number of bytes of the account discriminator. @@ -13,7 +15,8 @@ export const ACCOUNT_DISCRIMINATOR_SIZE = 8; /** * Encodes and decodes account objects. */ -export class AccountsCoder { +export class BorshAccountsCoder + implements AccountsCoder { /** * Maps account type identifier to a layout. */ @@ -39,11 +42,20 @@ export class AccountsCoder { } const len = layout.encode(account, buffer); let accountData = buffer.slice(0, len); - let discriminator = AccountsCoder.accountDiscriminator(accountName); + let discriminator = BorshAccountsCoder.accountDiscriminator(accountName); return Buffer.concat([discriminator, accountData]); } - public decode(accountName: A, ix: Buffer): T { + public decode(accountName: A, data: Buffer): T { + // Assert the account discriminator is correct. + const discriminator = BorshAccountsCoder.accountDiscriminator(accountName); + if (discriminator.compare(data.slice(0, 8))) { + throw new Error("Invalid account discriminator"); + } + return this.decodeUnchecked(accountName, data); + } + + public decodeUnchecked(accountName: A, ix: Buffer): T { // Chop off the discriminator before decoding. const data = ix.slice(ACCOUNT_DISCRIMINATOR_SIZE); const layout = this.accountLayouts.get(accountName); @@ -53,6 +65,16 @@ export class AccountsCoder { return layout.decode(data); } + public memcmp(accountName: A, appendData?: Buffer): any { + const discriminator = BorshAccountsCoder.accountDiscriminator(accountName); + return { + offset: 0, + bytes: bs58.encode( + appendData ? Buffer.concat([discriminator, appendData]) : discriminator + ), + }; + } + /** * Calculates and returns a unique 8 byte discriminator prepended to all anchor accounts. * diff --git a/ts/src/coder/event.ts b/ts/src/coder/event.ts index d98d081fc7..ac6435e999 100644 --- a/ts/src/coder/event.ts +++ b/ts/src/coder/event.ts @@ -5,8 +5,9 @@ import { sha256 } from "js-sha256"; import { Idl, IdlEvent, IdlTypeDef } from "../idl.js"; import { Event, EventData } from "../program/event.js"; import { IdlCoder } from "./idl.js"; +import { EventCoder } from "."; -export class EventCoder { +export class BorshEventCoder implements EventCoder { /** * Maps account type identifier to a layout. */ diff --git a/ts/src/coder/index.ts b/ts/src/coder/index.ts index 2389f106ab..9f88e61faa 100644 --- a/ts/src/coder/index.ts +++ b/ts/src/coder/index.ts @@ -1,20 +1,21 @@ -import { Idl } from "../idl.js"; -import { InstructionCoder } from "./instruction.js"; -import { AccountsCoder } from "./accounts.js"; -import { EventCoder } from "./event.js"; -import { StateCoder } from "./state.js"; +import { Idl, IdlEvent } from "../idl.js"; +import { BorshInstructionCoder } from "./instruction.js"; +import { BorshAccountsCoder } from "./accounts.js"; +import { BorshEventCoder } from "./event.js"; +import { BorshStateCoder } from "./state.js"; import { sighash } from "./common.js"; +import { Event } from "../program/event.js"; export { accountSize } from "./common.js"; -export { InstructionCoder } from "./instruction.js"; -export { AccountsCoder, ACCOUNT_DISCRIMINATOR_SIZE } from "./accounts.js"; -export { EventCoder, eventDiscriminator } from "./event.js"; -export { StateCoder, stateDiscriminator } from "./state.js"; +export { BorshInstructionCoder } from "./instruction.js"; +export { BorshAccountsCoder, ACCOUNT_DISCRIMINATOR_SIZE } from "./accounts.js"; +export { BorshEventCoder, eventDiscriminator } from "./event.js"; +export { BorshStateCoder, stateDiscriminator } from "./state.js"; /** * Coder provides a facade for encoding and decoding all IDL related objects. */ -export default class Coder { +export interface Coder { /** * Instruction coder. */ @@ -23,7 +24,7 @@ export default class Coder { /** * Account coder. */ - readonly accounts: AccountsCoder; + readonly accounts: AccountsCoder; /** * Coder for state structs. @@ -34,13 +35,61 @@ export default class Coder { * Coder for events. */ readonly events: EventCoder; +} + +export interface StateCoder { + encode(name: string, account: T): Promise; + decode(ix: Buffer): T; +} + +export interface AccountsCoder { + encode(accountName: A, account: T): Promise; + decode(accountName: A, ix: Buffer): T; + decodeUnchecked(accountName: A, ix: Buffer): T; + memcmp(accountName: A, appendData?: Buffer): any; +} + +export interface InstructionCoder { + encode(ixName: string, ix: any): Buffer; + encodeState(ixName: string, ix: any): Buffer; +} + +export interface EventCoder { + decode>( + log: string + ): Event | null; +} + +/** + * BorshCoder is the default Coder for Anchor programs. + */ +export class BorshCoder implements Coder { + /** + * Instruction coder. + */ + readonly instruction: BorshInstructionCoder; + + /** + * Account coder. + */ + readonly accounts: BorshAccountsCoder; + + /** + * Coder for state structs. + */ + readonly state: BorshStateCoder; + + /** + * Coder for events. + */ + readonly events: BorshEventCoder; constructor(idl: Idl) { - this.instruction = new InstructionCoder(idl); - this.accounts = new AccountsCoder(idl); - this.events = new EventCoder(idl); + this.instruction = new BorshInstructionCoder(idl); + this.accounts = new BorshAccountsCoder(idl); + this.events = new BorshEventCoder(idl); if (idl.state) { - this.state = new StateCoder(idl); + this.state = new BorshStateCoder(idl); } } diff --git a/ts/src/coder/instruction.ts b/ts/src/coder/instruction.ts index f80ca29729..4da03c23bd 100644 --- a/ts/src/coder/instruction.ts +++ b/ts/src/coder/instruction.ts @@ -1,8 +1,9 @@ +import bs58 from "bs58"; import { Buffer } from "buffer"; -import camelCase from "camelcase"; import { Layout } from "buffer-layout"; +import camelCase from "camelcase"; import * as borsh from "@project-serum/borsh"; -import bs58 from "bs58"; +import { AccountMeta, PublicKey } from "@solana/web3.js"; import { Idl, IdlField, @@ -19,7 +20,7 @@ import { } from "../idl"; import { IdlCoder } from "./idl.js"; import { sighash } from "./common.js"; -import { AccountMeta, PublicKey } from "@solana/web3.js"; +import { InstructionCoder } from "."; /** * Namespace for state method function signatures. @@ -34,7 +35,7 @@ export const SIGHASH_GLOBAL_NAMESPACE = "global"; /** * Encodes and decodes program instructions. */ -export class InstructionCoder { +export class BorshInstructionCoder implements InstructionCoder { // Instruction args layout. Maps namespaced method private ixLayout: Map; @@ -42,7 +43,7 @@ export class InstructionCoder { private sighashLayouts: Map; public constructor(private idl: Idl) { - this.ixLayout = InstructionCoder.parseIxLayout(idl); + this.ixLayout = BorshInstructionCoder.parseIxLayout(idl); const sighashLayouts = new Map(); idl.instructions.forEach((ix) => { @@ -69,14 +70,14 @@ export class InstructionCoder { /** * Encodes a program instruction. */ - public encode(ixName: string, ix: any) { + public encode(ixName: string, ix: any): Buffer { return this._encode(SIGHASH_GLOBAL_NAMESPACE, ixName, ix); } /** * Encodes a program state instruction. */ - public encodeState(ixName: string, ix: any) { + public encodeState(ixName: string, ix: any): Buffer { return this._encode(SIGHASH_STATE_NAMESPACE, ixName, ix); } diff --git a/ts/src/coder/state.ts b/ts/src/coder/state.ts index 4c02fd571d..60189d49bb 100644 --- a/ts/src/coder/state.ts +++ b/ts/src/coder/state.ts @@ -5,7 +5,7 @@ import { Idl } from "../idl.js"; import { IdlCoder } from "./idl.js"; import * as features from "../utils/features.js"; -export class StateCoder { +export class BorshStateCoder { private layout: Layout; public constructor(idl: Idl) { diff --git a/ts/src/index.ts b/ts/src/index.ts index 35fc903fc3..6efba031b9 100644 --- a/ts/src/index.ts +++ b/ts/src/index.ts @@ -4,17 +4,20 @@ export { default as BN } from "bn.js"; export * as web3 from "@solana/web3.js"; export { default as Provider, getProvider, setProvider } from "./provider.js"; export { - default as Coder, + Coder, InstructionCoder, EventCoder, StateCoder, AccountsCoder, + BorshCoder, + BorshInstructionCoder, + BorshEventCoder, + BorshStateCoder, + BorshAccountsCoder, } from "./coder/index.js"; - export * from "./error.js"; export { Instruction } from "./coder/instruction.js"; export { Idl } from "./idl.js"; - export * as utils from "./utils/index.js"; export * from "./program/index.js"; diff --git a/ts/src/program/event.ts b/ts/src/program/event.ts index ef3f5fcf67..fa80ba5dc7 100644 --- a/ts/src/program/event.ts +++ b/ts/src/program/event.ts @@ -1,7 +1,7 @@ import { PublicKey } from "@solana/web3.js"; import * as assert from "assert"; import { IdlEvent, IdlEventField } from "../idl.js"; -import Coder from "../coder/index.js"; +import { Coder } from "../coder/index.js"; import { DecodeType } from "./namespace/types.js"; import Provider from "../provider.js"; diff --git a/ts/src/program/index.ts b/ts/src/program/index.ts index 4561ddf171..e4917cbf9c 100644 --- a/ts/src/program/index.ts +++ b/ts/src/program/index.ts @@ -2,7 +2,7 @@ import { inflate } from "pako"; import { PublicKey } from "@solana/web3.js"; import Provider, { getProvider } from "../provider.js"; import { Idl, idlAddress, decodeIdlAccount } from "../idl.js"; -import Coder from "../coder/index.js"; +import { Coder, BorshCoder } from "../coder/index.js"; import NamespaceFactory, { RpcNamespace, InstructionNamespace, @@ -260,7 +260,7 @@ export class Program { this._idl = idl; this._provider = provider; this._programId = programId; - this._coder = new Coder(idl); + this._coder = new BorshCoder(idl); this._events = new EventManager(this._programId, provider, this._coder); // Dynamic namespaces. diff --git a/ts/src/program/namespace/account.ts b/ts/src/program/namespace/account.ts index f166f8f36c..a2d12a35fc 100644 --- a/ts/src/program/namespace/account.ts +++ b/ts/src/program/namespace/account.ts @@ -1,7 +1,5 @@ -import { Buffer } from "buffer"; import camelCase from "camelcase"; import EventEmitter from "eventemitter3"; -import bs58 from "bs58"; import { Signer, PublicKey, @@ -13,10 +11,11 @@ import { } from "@solana/web3.js"; import Provider, { getProvider } from "../../provider.js"; import { Idl, IdlTypeDef } from "../../idl.js"; -import Coder, { +import { ACCOUNT_DISCRIMINATOR_SIZE, accountSize, - AccountsCoder, + Coder, + BorshCoder, } from "../../coder/index.js"; import { Subscription, Address, translateAddress } from "../common.js"; import { AllAccountsMap, IdlTypes, TypeDef } from "./types.js"; @@ -126,7 +125,7 @@ export class AccountClient< this._idlAccount = idlAccount; this._programId = programId; this._provider = provider ?? getProvider(); - this._coder = coder ?? new Coder(idl); + this._coder = coder ?? new BorshCoder(idl); this._size = ACCOUNT_DISCRIMINATOR_SIZE + (accountSize(idl, idlAccount) ?? 0); } @@ -144,15 +143,6 @@ export class AccountClient< if (accountInfo === null) { return null; } - - // Assert the account discriminator is correct. - const discriminator = AccountsCoder.accountDiscriminator( - this._idlAccount.name - ); - if (discriminator.compare(accountInfo.data.slice(0, 8))) { - throw new Error("Invalid account discriminator"); - } - return this._coder.accounts.decode( this._idlAccount.name, accountInfo.data @@ -188,17 +178,11 @@ export class AccountClient< commitment ); - const discriminator = AccountsCoder.accountDiscriminator( - this._idlAccount.name - ); // Decode accounts where discriminator is correct, null otherwise return accounts.map((account) => { if (account == null) { return null; } - if (discriminator.compare(account?.account.data.slice(0, 8))) { - return null; - } return this._coder.accounts.decode( this._idlAccount.name, account?.account.data @@ -223,24 +207,16 @@ export class AccountClient< async all( filters?: Buffer | GetProgramAccountsFilter[] ): Promise[]> { - const discriminator = AccountsCoder.accountDiscriminator( - this._idlAccount.name - ); - let resp = await this._provider.connection.getProgramAccounts( this._programId, { commitment: this._provider.connection.commitment, filters: [ { - memcmp: { - offset: 0, - bytes: bs58.encode( - filters instanceof Buffer - ? Buffer.concat([discriminator, filters]) - : discriminator - ), - }, + memcmp: this.coder.accounts.memcmp( + this._idlAccount.name, + filters instanceof Buffer ? filters : undefined + ), }, ...(Array.isArray(filters) ? filters : []), ], diff --git a/ts/src/program/namespace/index.ts b/ts/src/program/namespace/index.ts index 467f1748f9..53b34100dc 100644 --- a/ts/src/program/namespace/index.ts +++ b/ts/src/program/namespace/index.ts @@ -1,8 +1,8 @@ import camelCase from "camelcase"; import { PublicKey } from "@solana/web3.js"; -import Coder from "../../coder/index.js"; +import { Coder } from "../../coder/index.js"; import Provider from "../../provider.js"; -import { Idl, IdlInstruction } from "../../idl.js"; +import { Idl } from "../../idl.js"; import StateFactory, { StateClient } from "./state.js"; import InstructionFactory, { InstructionNamespace } from "./instruction.js"; import TransactionFactory, { TransactionNamespace } from "./transaction.js"; diff --git a/ts/src/program/namespace/simulate.ts b/ts/src/program/namespace/simulate.ts index 362b4b9ce4..e15dfd985d 100644 --- a/ts/src/program/namespace/simulate.ts +++ b/ts/src/program/namespace/simulate.ts @@ -7,7 +7,7 @@ import Provider from "../../provider.js"; import { splitArgsAndCtx } from "../context.js"; import { TransactionFn } from "./transaction.js"; import { EventParser, Event } from "../event.js"; -import Coder from "../../coder/index.js"; +import { Coder } from "../../coder/index.js"; import { Idl, IdlEvent } from "../../idl.js"; import { ProgramError } from "../../error.js"; import * as features from "../../utils/features.js"; diff --git a/ts/src/program/namespace/state.ts b/ts/src/program/namespace/state.ts index 68da547ca8..2e3bc6f468 100644 --- a/ts/src/program/namespace/state.ts +++ b/ts/src/program/namespace/state.ts @@ -8,7 +8,7 @@ import { } from "@solana/web3.js"; import Provider, { getProvider } from "../../provider.js"; import { Idl, IdlInstruction, IdlStateMethod, IdlTypeDef } from "../../idl.js"; -import Coder, { stateDiscriminator } from "../../coder/index.js"; +import { BorshCoder, Coder, stateDiscriminator } from "../../coder/index.js"; import { RpcNamespace, InstructionNamespace, @@ -87,7 +87,7 @@ export class StateClient { /** * Returns the coder. */ - public readonly coder: Coder = new Coder(idl) + public readonly coder: Coder = new BorshCoder(idl) ) { this._idl = idl; this._programId = programId; From ded739ef6af43500b89021200e839f5765389a0e Mon Sep 17 00:00:00 2001 From: Armani Ferrante Date: Fri, 7 Jan 2022 16:55:52 -0500 Subject: [PATCH 02/16] Fix unit tests --- ts/tests/events.spec.ts | 4 ++-- ts/tests/transaction.spec.ts | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/ts/tests/events.spec.ts b/ts/tests/events.spec.ts index 85f13f67e6..5e8456adb0 100644 --- a/ts/tests/events.spec.ts +++ b/ts/tests/events.spec.ts @@ -1,6 +1,6 @@ import { PublicKey } from "@solana/web3.js"; import { EventParser } from "../src/program/event"; -import { Coder } from "../src"; +import { BorshCoder } from "../src"; describe("Events", () => { it("Parses multiple instructions", async () => { @@ -22,7 +22,7 @@ describe("Events", () => { }, ], }; - const coder = new Coder(idl); + const coder = new BorshCoder(idl); const programId = PublicKey.default; const eventParser = new EventParser(programId, coder); diff --git a/ts/tests/transaction.spec.ts b/ts/tests/transaction.spec.ts index 403124815d..4a3e69aea1 100644 --- a/ts/tests/transaction.spec.ts +++ b/ts/tests/transaction.spec.ts @@ -1,6 +1,6 @@ import TransactionFactory from "../src/program/namespace/transaction"; import InstructionFactory from "../src/program/namespace/instruction"; -import { Coder } from "../src"; +import { BorshCoder } from "../src"; import { PublicKey, TransactionInstruction } from "@solana/web3.js"; describe("Transaction", () => { @@ -27,7 +27,7 @@ describe("Transaction", () => { }; it("should add pre instructions before method ix", async () => { - const coder = new Coder(idl); + const coder = new BorshCoder(idl); const programId = PublicKey.default; const ixItem = InstructionFactory.build( idl.instructions[0], @@ -41,7 +41,7 @@ describe("Transaction", () => { }); it("should add post instructions after method ix", async () => { - const coder = new Coder(idl); + const coder = new BorshCoder(idl); const programId = PublicKey.default; const ixItem = InstructionFactory.build( idl.instructions[0], @@ -55,7 +55,7 @@ describe("Transaction", () => { }); it("should throw error if both preInstructions and instructions are used", async () => { - const coder = new Coder(idl); + const coder = new BorshCoder(idl); const programId = PublicKey.default; const ixItem = InstructionFactory.build( idl.instructions[0], From 576f474f11d7713dda1a40521e95b7ac111cce0e Mon Sep 17 00:00:00 2001 From: Armani Ferrante Date: Fri, 7 Jan 2022 18:28:09 -0500 Subject: [PATCH 03/16] Move borsh into separate folder --- ts/src/coder/{ => borsh}/accounts.ts | 4 +- ts/src/coder/{ => borsh}/common.ts | 10 ++++- ts/src/coder/{ => borsh}/event.ts | 6 +-- ts/src/coder/{ => borsh}/idl.ts | 4 +- ts/src/coder/borsh/index.ts | 51 +++++++++++++++++++++++++ ts/src/coder/{ => borsh}/instruction.ts | 4 +- ts/src/coder/{ => borsh}/state.ts | 4 +- ts/src/coder/index.ts | 51 +------------------------ ts/src/index.ts | 15 +------- 9 files changed, 74 insertions(+), 75 deletions(-) rename ts/src/coder/{ => borsh}/accounts.ts (97%) rename ts/src/coder/{ => borsh}/common.ts (95%) rename ts/src/coder/{ => borsh}/event.ts (93%) rename ts/src/coder/{ => borsh}/idl.ts (98%) create mode 100644 ts/src/coder/borsh/index.ts rename ts/src/coder/{ => borsh}/instruction.ts (99%) rename ts/src/coder/{ => borsh}/state.ts (93%) diff --git a/ts/src/coder/accounts.ts b/ts/src/coder/borsh/accounts.ts similarity index 97% rename from ts/src/coder/accounts.ts rename to ts/src/coder/borsh/accounts.ts index 8daa90ab99..b236351295 100644 --- a/ts/src/coder/accounts.ts +++ b/ts/src/coder/borsh/accounts.ts @@ -1,11 +1,11 @@ import bs58 from "bs58"; import { Buffer } from "buffer"; import { Layout } from "buffer-layout"; -import { Idl } from "../idl.js"; +import { Idl } from "../../idl.js"; import { IdlCoder } from "./idl.js"; import { sha256 } from "js-sha256"; import camelcase from "camelcase"; -import { AccountsCoder } from "."; +import { AccountsCoder } from "../index.js"; /** * Number of bytes of the account discriminator. diff --git a/ts/src/coder/common.ts b/ts/src/coder/borsh/common.ts similarity index 95% rename from ts/src/coder/common.ts rename to ts/src/coder/borsh/common.ts index b221035ca0..38e4e3f24e 100644 --- a/ts/src/coder/common.ts +++ b/ts/src/coder/borsh/common.ts @@ -1,8 +1,14 @@ import { Buffer } from "buffer"; import { snakeCase } from "snake-case"; import { sha256 } from "js-sha256"; -import { Idl, IdlField, IdlTypeDef, IdlEnumVariant, IdlType } from "../idl.js"; -import { IdlError } from "../error.js"; +import { + Idl, + IdlField, + IdlTypeDef, + IdlEnumVariant, + IdlType, +} from "../../idl.js"; +import { IdlError } from "../../error.js"; export function accountSize(idl: Idl, idlAccount: IdlTypeDef): number { if (idlAccount.type.kind === "enum") { diff --git a/ts/src/coder/event.ts b/ts/src/coder/borsh/event.ts similarity index 93% rename from ts/src/coder/event.ts rename to ts/src/coder/borsh/event.ts index ac6435e999..6581c62372 100644 --- a/ts/src/coder/event.ts +++ b/ts/src/coder/borsh/event.ts @@ -2,10 +2,10 @@ import { Buffer } from "buffer"; import * as base64 from "base64-js"; import { Layout } from "buffer-layout"; import { sha256 } from "js-sha256"; -import { Idl, IdlEvent, IdlTypeDef } from "../idl.js"; -import { Event, EventData } from "../program/event.js"; +import { Idl, IdlEvent, IdlTypeDef } from "../../idl.js"; +import { Event, EventData } from "../../program/event.js"; import { IdlCoder } from "./idl.js"; -import { EventCoder } from "."; +import { EventCoder } from "../index.js"; export class BorshEventCoder implements EventCoder { /** diff --git a/ts/src/coder/idl.ts b/ts/src/coder/borsh/idl.ts similarity index 98% rename from ts/src/coder/idl.ts rename to ts/src/coder/borsh/idl.ts index b1391f05cc..304fe70555 100644 --- a/ts/src/coder/idl.ts +++ b/ts/src/coder/borsh/idl.ts @@ -1,8 +1,8 @@ import camelCase from "camelcase"; import { Layout } from "buffer-layout"; import * as borsh from "@project-serum/borsh"; -import { IdlField, IdlTypeDef, IdlEnumVariant, IdlType } from "../idl.js"; -import { IdlError } from "../error.js"; +import { IdlField, IdlTypeDef, IdlEnumVariant, IdlType } from "../../idl.js"; +import { IdlError } from "../../error.js"; export class IdlCoder { public static fieldLayout( diff --git a/ts/src/coder/borsh/index.ts b/ts/src/coder/borsh/index.ts new file mode 100644 index 0000000000..633b812c06 --- /dev/null +++ b/ts/src/coder/borsh/index.ts @@ -0,0 +1,51 @@ +import { Idl } from "../../idl.js"; +import { BorshInstructionCoder } from "./instruction.js"; +import { BorshAccountsCoder } from "./accounts.js"; +import { BorshEventCoder } from "./event.js"; +import { BorshStateCoder } from "./state.js"; +import { sighash } from "./common.js"; +import { Coder } from "../index.js"; + +export { accountSize } from "./common.js"; +export { BorshInstructionCoder } from "./instruction.js"; +export { BorshAccountsCoder, ACCOUNT_DISCRIMINATOR_SIZE } from "./accounts.js"; +export { BorshEventCoder, eventDiscriminator } from "./event.js"; +export { BorshStateCoder, stateDiscriminator } from "./state.js"; + +/** + * BorshCoder is the default Coder for Anchor programs. + */ +export class BorshCoder implements Coder { + /** + * Instruction coder. + */ + readonly instruction: BorshInstructionCoder; + + /** + * Account coder. + */ + readonly accounts: BorshAccountsCoder; + + /** + * Coder for state structs. + */ + readonly state: BorshStateCoder; + + /** + * Coder for events. + */ + readonly events: BorshEventCoder; + + constructor(idl: Idl) { + this.instruction = new BorshInstructionCoder(idl); + this.accounts = new BorshAccountsCoder(idl); + this.events = new BorshEventCoder(idl); + if (idl.state) { + this.state = new BorshStateCoder(idl); + } + } + + public sighash(nameSpace: string, ixName: string): Buffer { + return sighash(nameSpace, ixName); + } +} diff --git a/ts/src/coder/instruction.ts b/ts/src/coder/borsh/instruction.ts similarity index 99% rename from ts/src/coder/instruction.ts rename to ts/src/coder/borsh/instruction.ts index 4da03c23bd..7f09c06906 100644 --- a/ts/src/coder/instruction.ts +++ b/ts/src/coder/borsh/instruction.ts @@ -17,10 +17,10 @@ import { IdlTypeOption, IdlTypeDefined, IdlAccounts, -} from "../idl"; +} from "../../idl.js"; import { IdlCoder } from "./idl.js"; import { sighash } from "./common.js"; -import { InstructionCoder } from "."; +import { InstructionCoder } from "../index.js"; /** * Namespace for state method function signatures. diff --git a/ts/src/coder/state.ts b/ts/src/coder/borsh/state.ts similarity index 93% rename from ts/src/coder/state.ts rename to ts/src/coder/borsh/state.ts index 60189d49bb..b33f7b20db 100644 --- a/ts/src/coder/state.ts +++ b/ts/src/coder/borsh/state.ts @@ -1,9 +1,9 @@ import { Buffer } from "buffer"; import { Layout } from "buffer-layout"; import { sha256 } from "js-sha256"; -import { Idl } from "../idl.js"; +import { Idl } from "../../idl.js"; import { IdlCoder } from "./idl.js"; -import * as features from "../utils/features.js"; +import * as features from "../../utils/features.js"; export class BorshStateCoder { private layout: Layout; diff --git a/ts/src/coder/index.ts b/ts/src/coder/index.ts index 9f88e61faa..2276ff3bc4 100644 --- a/ts/src/coder/index.ts +++ b/ts/src/coder/index.ts @@ -1,16 +1,7 @@ -import { Idl, IdlEvent } from "../idl.js"; -import { BorshInstructionCoder } from "./instruction.js"; -import { BorshAccountsCoder } from "./accounts.js"; -import { BorshEventCoder } from "./event.js"; -import { BorshStateCoder } from "./state.js"; -import { sighash } from "./common.js"; +import { IdlEvent } from "../idl.js"; import { Event } from "../program/event.js"; -export { accountSize } from "./common.js"; -export { BorshInstructionCoder } from "./instruction.js"; -export { BorshAccountsCoder, ACCOUNT_DISCRIMINATOR_SIZE } from "./accounts.js"; -export { BorshEventCoder, eventDiscriminator } from "./event.js"; -export { BorshStateCoder, stateDiscriminator } from "./state.js"; +export * from "./borsh/index.js"; /** * Coder provides a facade for encoding and decoding all IDL related objects. @@ -59,41 +50,3 @@ export interface EventCoder { log: string ): Event | null; } - -/** - * BorshCoder is the default Coder for Anchor programs. - */ -export class BorshCoder implements Coder { - /** - * Instruction coder. - */ - readonly instruction: BorshInstructionCoder; - - /** - * Account coder. - */ - readonly accounts: BorshAccountsCoder; - - /** - * Coder for state structs. - */ - readonly state: BorshStateCoder; - - /** - * Coder for events. - */ - readonly events: BorshEventCoder; - - constructor(idl: Idl) { - this.instruction = new BorshInstructionCoder(idl); - this.accounts = new BorshAccountsCoder(idl); - this.events = new BorshEventCoder(idl); - if (idl.state) { - this.state = new BorshStateCoder(idl); - } - } - - public sighash(nameSpace: string, ixName: string): Buffer { - return sighash(nameSpace, ixName); - } -} diff --git a/ts/src/index.ts b/ts/src/index.ts index 6efba031b9..f296869f1d 100644 --- a/ts/src/index.ts +++ b/ts/src/index.ts @@ -3,21 +3,10 @@ import { isBrowser } from "./utils/common.js"; export { default as BN } from "bn.js"; export * as web3 from "@solana/web3.js"; export { default as Provider, getProvider, setProvider } from "./provider.js"; -export { - Coder, - InstructionCoder, - EventCoder, - StateCoder, - AccountsCoder, - BorshCoder, - BorshInstructionCoder, - BorshEventCoder, - BorshStateCoder, - BorshAccountsCoder, -} from "./coder/index.js"; export * from "./error.js"; -export { Instruction } from "./coder/instruction.js"; +export { Instruction } from "./coder/borsh/instruction.js"; export { Idl } from "./idl.js"; +export * from "./coder/index.js"; export * as utils from "./utils/index.js"; export * from "./program/index.js"; From f5977547eccb75ee1f89d8d7daca4085ccfad348 Mon Sep 17 00:00:00 2001 From: Armani Ferrante Date: Fri, 7 Jan 2022 18:46:24 -0500 Subject: [PATCH 04/16] Create SPL token coder scaffolding --- ts/src/coder/borsh/index.ts | 3 ++- ts/src/coder/index.ts | 1 + ts/src/coder/spl-token/accounts.ts | 32 +++++++++++++++++++++++++++ ts/src/coder/spl-token/events.ts | 14 ++++++++++++ ts/src/coder/spl-token/index.ts | 21 ++++++++++++++++++ ts/src/coder/spl-token/instruction.ts | 17 ++++++++++++++ ts/src/coder/spl-token/state.ts | 10 +++++++++ 7 files changed, 97 insertions(+), 1 deletion(-) create mode 100644 ts/src/coder/spl-token/accounts.ts create mode 100644 ts/src/coder/spl-token/events.ts create mode 100644 ts/src/coder/spl-token/index.ts create mode 100644 ts/src/coder/spl-token/instruction.ts create mode 100644 ts/src/coder/spl-token/state.ts diff --git a/ts/src/coder/borsh/index.ts b/ts/src/coder/borsh/index.ts index 633b812c06..79bcbe51af 100644 --- a/ts/src/coder/borsh/index.ts +++ b/ts/src/coder/borsh/index.ts @@ -13,7 +13,8 @@ export { BorshEventCoder, eventDiscriminator } from "./event.js"; export { BorshStateCoder, stateDiscriminator } from "./state.js"; /** - * BorshCoder is the default Coder for Anchor programs. + * BorshCoder is the default Coder for Anchor programs implementing the + * borsh based serialization interface. */ export class BorshCoder implements Coder { /** diff --git a/ts/src/coder/index.ts b/ts/src/coder/index.ts index 2276ff3bc4..2e132a076d 100644 --- a/ts/src/coder/index.ts +++ b/ts/src/coder/index.ts @@ -2,6 +2,7 @@ import { IdlEvent } from "../idl.js"; import { Event } from "../program/event.js"; export * from "./borsh/index.js"; +export * from "./spl-token/index.js"; /** * Coder provides a facade for encoding and decoding all IDL related objects. diff --git a/ts/src/coder/spl-token/accounts.ts b/ts/src/coder/spl-token/accounts.ts new file mode 100644 index 0000000000..a974f7282d --- /dev/null +++ b/ts/src/coder/spl-token/accounts.ts @@ -0,0 +1,32 @@ +import { AccountsCoder } from "../index.js"; +import { Idl } from "../../idl.js"; + +export class SplTokenAccountsCoder + implements AccountsCoder { + constructor(idl: Idl) { + // todo + } + + encode(accountName: A, account: T): Promise { + // todo + // @ts-ignore + return Buffer.from([]); + } + + decode(accountName: A, ix: Buffer): T { + // todo + // @ts-ignore + return null; + } + + decodeUnchecked(accountName: A, ix: Buffer): T { + // todo + // @ts-ignore + return null; + } + + memcmp(accountName: A, appendData?: Buffer): any { + // todo + return null; + } +} diff --git a/ts/src/coder/spl-token/events.ts b/ts/src/coder/spl-token/events.ts new file mode 100644 index 0000000000..973258f4cf --- /dev/null +++ b/ts/src/coder/spl-token/events.ts @@ -0,0 +1,14 @@ +import { EventCoder } from "../index.js"; +import { Idl } from "../../idl.js"; +import { Event } from "../../program/event"; +import { IdlEvent } from "../../idl"; + +export class SplTokenEventsCoder implements EventCoder { + constructor(_idl: Idl) {} + + decode>( + _log: string + ): Event | null { + throw new Error("SPL token program does not have events"); + } +} diff --git a/ts/src/coder/spl-token/index.ts b/ts/src/coder/spl-token/index.ts new file mode 100644 index 0000000000..c49a4d6ee5 --- /dev/null +++ b/ts/src/coder/spl-token/index.ts @@ -0,0 +1,21 @@ +import { Idl } from "../../idl.js"; +import { SplTokenInstructionCoder } from "./instruction.js"; +import { SplTokenStateCoder } from "./state.js"; +import { SplTokenAccountsCoder } from "./accounts.js"; +import { SplTokenEventsCoder } from "./events.js"; + +/** + * Coder for the SPL token program. + */ +export class SplTokenCoder { + readonly instruction: SplTokenInstructionCoder; + readonly accounts: SplTokenAccountsCoder; + readonly state: SplTokenStateCoder; + readonly events: SplTokenEventsCoder; + + constructor(idl: Idl) { + this.instruction = new SplTokenInstructionCoder(idl); + this.accounts = new SplTokenAccountsCoder(idl); + this.events = new SplTokenEventsCoder(idl); + } +} diff --git a/ts/src/coder/spl-token/instruction.ts b/ts/src/coder/spl-token/instruction.ts new file mode 100644 index 0000000000..5c12417f2b --- /dev/null +++ b/ts/src/coder/spl-token/instruction.ts @@ -0,0 +1,17 @@ +import { InstructionCoder } from "../index.js"; +import { Idl } from "../../idl.js"; + +export class SplTokenInstructionCoder implements InstructionCoder { + constructor(idl: Idl) { + // todo + } + + encode(ixName: string, ix: any): Buffer { + // todo + return Buffer.from([]); + } + + encodeState(_ixName: string, _ix: any): Buffer { + throw new Error("SPL token does not have state"); + } +} diff --git a/ts/src/coder/spl-token/state.ts b/ts/src/coder/spl-token/state.ts new file mode 100644 index 0000000000..f8ac3c3f04 --- /dev/null +++ b/ts/src/coder/spl-token/state.ts @@ -0,0 +1,10 @@ +import { StateCoder } from "../index.js"; + +export class SplTokenStateCoder implements StateCoder { + encode(_name: string, _account: T): Promise { + throw new Error("SPL token does not have state"); + } + decode(_ix: Buffer): T { + throw new Error("SPL token does not have state"); + } +} From 2fa187a7b6f8e702a2558edbe25257e3ebb3174f Mon Sep 17 00:00:00 2001 From: Armani Ferrante Date: Sat, 8 Jan 2022 13:25:53 -0500 Subject: [PATCH 05/16] begin ix coder for spl token --- tests/custom-coder/.gitignore | 6 + tests/custom-coder/Anchor.toml | 13 + tests/custom-coder/Cargo.toml | 4 + tests/custom-coder/migrations/deploy.ts | 12 + tests/custom-coder/package.json | 19 + .../programs/custom-coder/Cargo.toml | 19 + .../programs/custom-coder/Xargo.toml | 2 + .../programs/custom-coder/src/lib.rs | 14 + .../programs/spl-token/Cargo.toml | 19 + .../programs/spl-token/Xargo.toml | 2 + .../programs/spl-token/src/lib.rs | 268 ++++ tests/custom-coder/tests/custom-coder.ts | 15 + tests/custom-coder/tsconfig.json | 10 + tests/custom-coder/yarn.lock | 1197 +++++++++++++++++ tests/package.json | 1 + ts/package.json | 3 + ts/src/coder/spl-token/index.ts | 1 + ts/src/coder/spl-token/instruction.ts | 275 +++- ts/src/coder/spl-token/state.ts | 3 + ts/src/idl.ts | 5 + ts/src/index.ts | 1 + ts/src/program/index.ts | 9 +- ts/src/spl/index.ts | 10 + ts/src/spl/token.ts | 872 ++++++++++++ ts/yarn.lock | 96 +- 25 files changed, 2867 insertions(+), 9 deletions(-) create mode 100644 tests/custom-coder/.gitignore create mode 100644 tests/custom-coder/Anchor.toml create mode 100644 tests/custom-coder/Cargo.toml create mode 100644 tests/custom-coder/migrations/deploy.ts create mode 100644 tests/custom-coder/package.json create mode 100644 tests/custom-coder/programs/custom-coder/Cargo.toml create mode 100644 tests/custom-coder/programs/custom-coder/Xargo.toml create mode 100644 tests/custom-coder/programs/custom-coder/src/lib.rs create mode 100644 tests/custom-coder/programs/spl-token/Cargo.toml create mode 100644 tests/custom-coder/programs/spl-token/Xargo.toml create mode 100644 tests/custom-coder/programs/spl-token/src/lib.rs create mode 100644 tests/custom-coder/tests/custom-coder.ts create mode 100644 tests/custom-coder/tsconfig.json create mode 100644 tests/custom-coder/yarn.lock create mode 100644 ts/src/spl/index.ts create mode 100644 ts/src/spl/token.ts diff --git a/tests/custom-coder/.gitignore b/tests/custom-coder/.gitignore new file mode 100644 index 0000000000..51448d4dab --- /dev/null +++ b/tests/custom-coder/.gitignore @@ -0,0 +1,6 @@ + +.anchor +.DS_Store +target +**/*.rs.bk +node_modules diff --git a/tests/custom-coder/Anchor.toml b/tests/custom-coder/Anchor.toml new file mode 100644 index 0000000000..589023aa22 --- /dev/null +++ b/tests/custom-coder/Anchor.toml @@ -0,0 +1,13 @@ +[programs.localnet] +custom_coder = "Fg6PaFpoGXkYsidMpWTK6W2BeZ7FEfcYkg476zPFsLnS" +spl_token = "FmpfPa1LHEYRbueNMnwNVd2JvyQ89GXGWdyZEXNNKV8w" + +[registry] +url = "https://anchor.projectserum.com" + +[provider] +cluster = "localnet" +wallet = "~/.config/solana/id.json" + +[scripts] +test = "yarn run ts-mocha -p ./tsconfig.json -t 1000000 tests/**/*.ts" diff --git a/tests/custom-coder/Cargo.toml b/tests/custom-coder/Cargo.toml new file mode 100644 index 0000000000..a60de986d3 --- /dev/null +++ b/tests/custom-coder/Cargo.toml @@ -0,0 +1,4 @@ +[workspace] +members = [ + "programs/*" +] diff --git a/tests/custom-coder/migrations/deploy.ts b/tests/custom-coder/migrations/deploy.ts new file mode 100644 index 0000000000..325cf3d0ec --- /dev/null +++ b/tests/custom-coder/migrations/deploy.ts @@ -0,0 +1,12 @@ +// Migrations are an early feature. Currently, they're nothing more than this +// single deploy script that's invoked from the CLI, injecting a provider +// configured from the workspace's Anchor.toml. + +const anchor = require("@project-serum/anchor"); + +module.exports = async function (provider) { + // Configure client to use the provider. + anchor.setProvider(provider); + + // Add your deploy script here. +} diff --git a/tests/custom-coder/package.json b/tests/custom-coder/package.json new file mode 100644 index 0000000000..802bc74d8c --- /dev/null +++ b/tests/custom-coder/package.json @@ -0,0 +1,19 @@ +{ + "name": "custom-coder", + "version": "0.20.0", + "license": "(MIT OR Apache-2.0)", + "homepage": "https://github.com/project-serum/anchor#readme", + "bugs": { + "url": "https://github.com/project-serum/anchor/issues" + }, + "repository": { + "type": "git", + "url": "https://github.com/project-serum/anchor.git" + }, + "engines": { + "node": ">=11" + }, + "scripts": { + "test": "anchor test" + } +} diff --git a/tests/custom-coder/programs/custom-coder/Cargo.toml b/tests/custom-coder/programs/custom-coder/Cargo.toml new file mode 100644 index 0000000000..12d92d1f14 --- /dev/null +++ b/tests/custom-coder/programs/custom-coder/Cargo.toml @@ -0,0 +1,19 @@ +[package] +name = "custom-coder" +version = "0.1.0" +description = "Created with Anchor" +edition = "2018" + +[lib] +crate-type = ["cdylib", "lib"] +name = "custom_coder" + +[features] +no-entrypoint = [] +no-idl = [] +no-log-ix-name = [] +cpi = ["no-entrypoint"] +default = [] + +[dependencies] +anchor-lang = "0.20.0" diff --git a/tests/custom-coder/programs/custom-coder/Xargo.toml b/tests/custom-coder/programs/custom-coder/Xargo.toml new file mode 100644 index 0000000000..475fb71ed1 --- /dev/null +++ b/tests/custom-coder/programs/custom-coder/Xargo.toml @@ -0,0 +1,2 @@ +[target.bpfel-unknown-unknown.dependencies.std] +features = [] diff --git a/tests/custom-coder/programs/custom-coder/src/lib.rs b/tests/custom-coder/programs/custom-coder/src/lib.rs new file mode 100644 index 0000000000..fa18cb4123 --- /dev/null +++ b/tests/custom-coder/programs/custom-coder/src/lib.rs @@ -0,0 +1,14 @@ +use anchor_lang::prelude::*; + +declare_id!("Fg6PaFpoGXkYsidMpWTK6W2BeZ7FEfcYkg476zPFsLnS"); + +#[program] +pub mod custom_coder { + use super::*; + pub fn initialize(_ctx: Context, a: Option) -> ProgramResult { + Ok(()) + } +} + +#[derive(Accounts)] +pub struct Initialize {} diff --git a/tests/custom-coder/programs/spl-token/Cargo.toml b/tests/custom-coder/programs/spl-token/Cargo.toml new file mode 100644 index 0000000000..e337de613a --- /dev/null +++ b/tests/custom-coder/programs/spl-token/Cargo.toml @@ -0,0 +1,19 @@ +[package] +name = "spl-token" +version = "0.1.0" +description = "Created with Anchor" +edition = "2018" + +[lib] +crate-type = ["cdylib", "lib"] +name = "spl_token" + +[features] +no-entrypoint = [] +no-idl = [] +no-log-ix-name = [] +cpi = ["no-entrypoint"] +default = [] + +[dependencies] +anchor-lang = "0.20.0" diff --git a/tests/custom-coder/programs/spl-token/Xargo.toml b/tests/custom-coder/programs/spl-token/Xargo.toml new file mode 100644 index 0000000000..475fb71ed1 --- /dev/null +++ b/tests/custom-coder/programs/spl-token/Xargo.toml @@ -0,0 +1,2 @@ +[target.bpfel-unknown-unknown.dependencies.std] +features = [] diff --git a/tests/custom-coder/programs/spl-token/src/lib.rs b/tests/custom-coder/programs/spl-token/src/lib.rs new file mode 100644 index 0000000000..3df5adebdc --- /dev/null +++ b/tests/custom-coder/programs/spl-token/src/lib.rs @@ -0,0 +1,268 @@ +use anchor_lang::prelude::*; + +declare_id!("FmpfPa1LHEYRbueNMnwNVd2JvyQ89GXGWdyZEXNNKV8w"); + +// This program is simply used to generate the IDL for the token program. +// +// Note that we manually add the COption type to the IDL after +// compiling. +#[program] +pub mod spl_token { + use super::*; + + pub fn initialize_mint( + ctx: Context, + decimals: u8, + mint_authority: Pubkey, + // freeze_authority: COption, + ) -> ProgramResult { + Ok(()) + } + + pub fn initialize_account(ctx: Context) -> ProgramResult { + Ok(()) + } + + pub fn initialize_multisig(ctx: Context, m: u8) -> ProgramResult { + Ok(()) + } + + pub fn transfer(ctx: Context, amount: u64) -> ProgramResult { + Ok(()) + } + + pub fn approve(ctx: Context) -> ProgramResult { + Ok(()) + } + + pub fn revoke(ctx: Context) -> ProgramResult { + Ok(()) + } + + pub fn set_authority(ctx: Context) -> ProgramResult { + Ok(()) + } + + pub fn mint_to(ctx: Context) -> ProgramResult { + Ok(()) + } + + pub fn burn(ctx: Context) -> ProgramResult { + Ok(()) + } + + pub fn close_account(ctx: Context) -> ProgramResult { + Ok(()) + } + + pub fn freeze_account(ctx: Context) -> ProgramResult { + Ok(()) + } + + pub fn thaw_account(ctx: Context) -> ProgramResult { + Ok(()) + } + + pub fn transfer_checked(ctx: Context) -> ProgramResult { + Ok(()) + } + + pub fn approve_checked(ctx: Context) -> ProgramResult { + Ok(()) + } + + pub fn mint_to_checked(ctx: Context) -> ProgramResult { + Ok(()) + } + + pub fn burn_checked(ctx: Context) -> ProgramResult { + Ok(()) + } + + pub fn initialize_account_2(ctx: Context) -> ProgramResult { + Ok(()) + } + + pub fn sync_native(ctx: Context) -> ProgramResult { + Ok(()) + } + + pub fn initialize_account3(ctx: Context) -> ProgramResult { + Ok(()) + } + + pub fn initialize_multisig_2(ctx: Context) -> ProgramResult { + Ok(()) + } + + pub fn initialize_mint_2(ctx: Context) -> ProgramResult { + Ok(()) + } +} + +#[derive(Accounts)] +pub struct InitializeMint<'info> { + #[account(mut)] + mint: AccountInfo<'info>, + rent: AccountInfo<'info>, +} + +#[derive(Accounts)] +pub struct InitializeAccount<'info> { + #[account(mut)] + account: AccountInfo<'info>, + mint: AccountInfo<'info>, + authority: AccountInfo<'info>, + rent: AccountInfo<'info>, +} + +#[derive(Accounts)] +pub struct InitializeMultisig<'info> { + #[account(mut)] + account: AccountInfo<'info>, + rent: AccountInfo<'info>, +} + +#[derive(Accounts)] +pub struct Transfer<'info> { + #[account(mut)] + source: AccountInfo<'info>, + #[account(mut)] + destination: AccountInfo<'info>, + authority: Signer<'info>, +} + +#[derive(Accounts)] +pub struct Approve<'info> { + #[account(mut)] + source: AccountInfo<'info>, + delegate: AccountInfo<'info>, + authority: Signer<'info>, +} + +#[derive(Accounts)] +pub struct Revoke<'info> { + #[account(mut)] + source: AccountInfo<'info>, + authority: Signer<'info>, +} + +#[derive(Accounts)] +pub struct SetAuthority<'info> { + #[account(mut)] + pub mint: AccountInfo<'info>, + pub authority: Signer<'info>, +} + +#[derive(Accounts)] +pub struct MintTo<'info> { + #[account(mut)] + pub mint: AccountInfo<'info>, + #[account(mut)] + pub to: AccountInfo<'info>, + pub authority: Signer<'info>, +} + +#[derive(Accounts)] +pub struct Burn<'info> { + #[account(mut)] + source: AccountInfo<'info>, + #[account(mut)] + mint: AccountInfo<'info>, + authority: Signer<'info>, +} + +#[derive(Accounts)] +pub struct CloseAccount<'info> { + #[account(mut)] + account: AccountInfo<'info>, + #[account(mut)] + destination: AccountInfo<'info>, + authority: AccountInfo<'info>, +} + +#[derive(Accounts)] +pub struct FreezeAccount<'info> { + #[account(mut)] + account: AccountInfo<'info>, + mint: AccountInfo<'info>, + authority: Signer<'info>, +} + +#[derive(Accounts)] +pub struct ThawAccount<'info> { + #[account(mut)] + account: AccountInfo<'info>, + mint: AccountInfo<'info>, + authority: Signer<'info>, +} + +#[derive(Accounts)] +pub struct TransferChecked<'info> { + #[account(mut)] + source: AccountInfo<'info>, + mint: AccountInfo<'info>, + #[account(mut)] + destination: AccountInfo<'info>, + authority: Signer<'info>, +} + +#[derive(Accounts)] +pub struct ApproveChecked<'info> { + #[account(mut)] + source: AccountInfo<'info>, + mint: AccountInfo<'info>, + delegate: AccountInfo<'info>, + authority: Signer<'info>, +} + +#[derive(Accounts)] +pub struct MintToChecked<'info> { + #[account(mut)] + mint: AccountInfo<'info>, + #[account(mut)] + to: AccountInfo<'info>, + authority: AccountInfo<'info>, +} + +#[derive(Accounts)] +pub struct BurnChecked<'info> { + #[account(mut)] + source: AccountInfo<'info>, + #[account(mut)] + mint: AccountInfo<'info>, + authority: Signer<'info>, +} + +#[derive(Accounts)] +pub struct InitializeAccount2<'info> { + #[account(mut)] + account: AccountInfo<'info>, + mint: AccountInfo<'info>, + rent: AccountInfo<'info>, +} + +#[derive(Accounts)] +pub struct SyncNative<'info> { + #[account(mut)] + account: AccountInfo<'info>, +} + +#[derive(Accounts)] +pub struct InitializeAccount3<'info> { + #[account(mut)] + account: AccountInfo<'info>, + mint: AccountInfo<'info>, +} + +#[derive(Accounts)] +pub struct InitializeMultisig2<'info> { + #[account(mut)] + account: AccountInfo<'info>, +} + +#[derive(Accounts)] +pub struct InitializeMint2<'info> { + #[account(mut)] + mint: AccountInfo<'info>, +} diff --git a/tests/custom-coder/tests/custom-coder.ts b/tests/custom-coder/tests/custom-coder.ts new file mode 100644 index 0000000000..716cf25cf7 --- /dev/null +++ b/tests/custom-coder/tests/custom-coder.ts @@ -0,0 +1,15 @@ +//import * as anchor from '@project-serum/anchor'; +//import { Program } from '@project-serum/anchor'; +import * as anchor from '../../../ts'; +import { Spl } from '../../../ts'; + +describe('custom-coder', () => { + + // Configure the client to use the local cluster. + anchor.setProvider(anchor.Provider.env()); + + it('Is initialized!', async () => { + const program = Spl.token(); + console.log(program); + }); +}); diff --git a/tests/custom-coder/tsconfig.json b/tests/custom-coder/tsconfig.json new file mode 100644 index 0000000000..cd5d2e3d06 --- /dev/null +++ b/tests/custom-coder/tsconfig.json @@ -0,0 +1,10 @@ +{ + "compilerOptions": { + "types": ["mocha", "chai"], + "typeRoots": ["./node_modules/@types"], + "lib": ["es2015"], + "module": "commonjs", + "target": "es6", + "esModuleInterop": true + } +} diff --git a/tests/custom-coder/yarn.lock b/tests/custom-coder/yarn.lock new file mode 100644 index 0000000000..fc1e5181f9 --- /dev/null +++ b/tests/custom-coder/yarn.lock @@ -0,0 +1,1197 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@babel/runtime@^7.11.2", "@babel/runtime@^7.12.5": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.16.7.tgz#03ff99f64106588c9c403c6ecb8c3bafbbdff1fa" + integrity sha512-9E9FJowqAsytyOY6LG+1KuueckRL+aQW+mKvXRXnuFGyRAyepJPmEo9vgMfXUA6O9u3IeEdv9MAkppFcaQwogQ== + dependencies: + regenerator-runtime "^0.13.4" + +"@ethersproject/bytes@^5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.5.0.tgz#cb11c526de657e7b45d2e0f0246fb3b9d29a601c" + integrity sha512-ABvc7BHWhZU9PNM/tANm/Qx4ostPGadAuQzWTr3doklZOhDlmcBqclrQe/ZXUIj3K8wC28oYeuRa+A37tX9kog== + dependencies: + "@ethersproject/logger" "^5.5.0" + +"@ethersproject/logger@^5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.5.0.tgz#0c2caebeff98e10aefa5aef27d7441c7fd18cf5d" + integrity sha512-rIY/6WPm7T8n3qS2vuHTUBPdXHl+rGxWxW5okDfo9J4Z0+gRRZT0msvUdIJkE4/HS29GUMziwGaaKO2bWONBrg== + +"@ethersproject/sha2@^5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@ethersproject/sha2/-/sha2-5.5.0.tgz#a40a054c61f98fd9eee99af2c3cc6ff57ec24db7" + integrity sha512-B5UBoglbCiHamRVPLA110J+2uqsifpZaTmid2/7W5rbtYVz6gus6/hSDieIU/6gaKIDcOj12WnOdiymEUHIAOA== + dependencies: + "@ethersproject/bytes" "^5.5.0" + "@ethersproject/logger" "^5.5.0" + hash.js "1.1.7" + +"@project-serum/anchor@^0.20.0": + version "0.20.0" + resolved "https://registry.yarnpkg.com/@project-serum/anchor/-/anchor-0.20.0.tgz#547f5c0ff7e66809fa7118b2e3abd8087b5ec519" + integrity sha512-p1KOiqGBIbNsopMrSVoPwgxR1iPffsdjMNCOysahTPL9whX2CLX9HQCdopHjYaGl7+SdHRuXml6Wahk/wUmC8g== + dependencies: + "@project-serum/borsh" "^0.2.2" + "@solana/web3.js" "^1.17.0" + base64-js "^1.5.1" + bn.js "^5.1.2" + bs58 "^4.0.1" + buffer-layout "^1.2.2" + camelcase "^5.3.1" + crypto-hash "^1.3.0" + eventemitter3 "^4.0.7" + find "^0.3.0" + js-sha256 "^0.9.0" + pako "^2.0.3" + snake-case "^3.0.4" + toml "^3.0.0" + +"@project-serum/borsh@^0.2.2": + version "0.2.3" + resolved "https://registry.yarnpkg.com/@project-serum/borsh/-/borsh-0.2.3.tgz#1d705c5887484cb6a127dd5feff58e90cbfcb558" + integrity sha512-lH9zEYADZE3cxrgiFym8+jbUE3NM/LH+WOKYcUjs65CT10Q64Hv45bcAAa/phwYk4Tpz0uQ1x+ergFaAoGt67Q== + dependencies: + bn.js "^5.1.2" + buffer-layout "^1.2.0" + +"@solana/buffer-layout@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@solana/buffer-layout/-/buffer-layout-3.0.0.tgz#b9353caeb9a1589cb77a1b145bcb1a9a93114326" + integrity sha512-MVdgAKKL39tEs0l8je0hKaXLQFb7Rdfb0Xg2LjFZd8Lfdazkg6xiS98uAZrEKvaoF3i4M95ei9RydkGIDMeo3w== + dependencies: + buffer "~6.0.3" + +"@solana/web3.js@^1.17.0": + version "1.31.0" + resolved "https://registry.yarnpkg.com/@solana/web3.js/-/web3.js-1.31.0.tgz#7a313d4c1a90b77f27ddbfe845a10d6883e06452" + integrity sha512-7nHHx1JNFnrt15e9y8m38I/EJCbaB+bFC3KZVM1+QhybCikFxGMtGA5r7PDC3GEL1R2RZA8yKoLkDKo3vzzqnw== + dependencies: + "@babel/runtime" "^7.12.5" + "@ethersproject/sha2" "^5.5.0" + "@solana/buffer-layout" "^3.0.0" + bn.js "^5.0.0" + borsh "^0.4.0" + bs58 "^4.0.1" + buffer "6.0.1" + cross-fetch "^3.1.4" + jayson "^3.4.4" + js-sha3 "^0.8.0" + rpc-websockets "^7.4.2" + secp256k1 "^4.0.2" + superstruct "^0.14.2" + tweetnacl "^1.0.0" + +"@types/bn.js@^4.11.5": + version "4.11.6" + resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-4.11.6.tgz#c306c70d9358aaea33cd4eda092a742b9505967c" + integrity sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg== + dependencies: + "@types/node" "*" + +"@types/connect@^3.4.33": + version "3.4.35" + resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.35.tgz#5fcf6ae445e4021d1fc2219a4873cc73a3bb2ad1" + integrity sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ== + dependencies: + "@types/node" "*" + +"@types/express-serve-static-core@^4.17.9": + version "4.17.27" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.27.tgz#7a776191e47295d2a05962ecbb3a4ce97e38b401" + integrity sha512-e/sVallzUTPdyOTiqi8O8pMdBBphscvI6E4JYaKlja4Lm+zh7UFSSdW5VMkRbhDtmrONqOUHOXRguPsDckzxNA== + dependencies: + "@types/node" "*" + "@types/qs" "*" + "@types/range-parser" "*" + +"@types/json5@^0.0.29": + version "0.0.29" + resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" + integrity sha1-7ihweulOEdK4J7y+UnC86n8+ce4= + +"@types/lodash@^4.14.159": + version "4.14.178" + resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.178.tgz#341f6d2247db528d4a13ddbb374bcdc80406f4f8" + integrity sha512-0d5Wd09ItQWH1qFbEyQ7oTQ3GZrMfth5JkbN3EvTKLXcHLRDSXeLnlvlOn0wvxVIwK5o2M8JzP/OWz7T3NRsbw== + +"@types/mocha@^9.0.0": + version "9.0.0" + resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-9.0.0.tgz#3205bcd15ada9bc681ac20bef64e9e6df88fd297" + integrity sha512-scN0hAWyLVAvLR9AyW7HoFF5sJZglyBsbPuHO4fv7JRvfmPBMfp1ozWqOf/e4wwPNxezBZXRfWzMb6iFLgEVRA== + +"@types/node@*": + version "17.0.8" + resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.8.tgz#50d680c8a8a78fe30abe6906453b21ad8ab0ad7b" + integrity sha512-YofkM6fGv4gDJq78g4j0mMuGMkZVxZDgtU0JRdx6FgiJDG+0fY0GKVolOV8WqVmEhLCXkQRjwDdKyPxJp/uucg== + +"@types/node@^12.12.54": + version "12.20.41" + resolved "https://registry.yarnpkg.com/@types/node/-/node-12.20.41.tgz#81d7734c5257da9f04354bd9084a6ebbdd5198a5" + integrity sha512-f6xOqucbDirG7LOzedpvzjP3UTmHttRou3Mosx3vL9wr9AIQGhcPgVnqa8ihpZYnxyM1rxeNCvTyukPKZtq10Q== + +"@types/qs@*": + version "6.9.7" + resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.7.tgz#63bb7d067db107cc1e457c303bc25d511febf6cb" + integrity sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw== + +"@types/range-parser@*": + version "1.2.4" + resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.4.tgz#cd667bcfdd025213aafb7ca5915a932590acdcdc" + integrity sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw== + +"@types/ws@^7.4.4": + version "7.4.7" + resolved "https://registry.yarnpkg.com/@types/ws/-/ws-7.4.7.tgz#f7c390a36f7a0679aa69de2d501319f4f8d9b702" + integrity sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww== + dependencies: + "@types/node" "*" + +"@ungap/promise-all-settled@1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz#aa58042711d6e3275dd37dc597e5d31e8c290a44" + integrity sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q== + +JSONStream@^1.3.5: + version "1.3.5" + resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.5.tgz#3208c1f08d3a4d99261ab64f92302bc15e111ca0" + integrity sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ== + dependencies: + jsonparse "^1.2.0" + through ">=2.2.7 <3" + +ansi-colors@4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" + integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +anymatch@~3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" + integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + +arrify@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" + integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0= + +assertion-error@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" + integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +base-x@^3.0.2: + version "3.0.9" + resolved "https://registry.yarnpkg.com/base-x/-/base-x-3.0.9.tgz#6349aaabb58526332de9f60995e548a53fe21320" + integrity sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ== + dependencies: + safe-buffer "^5.0.1" + +base64-js@^1.3.1, base64-js@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + +binary-extensions@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" + integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== + +bn.js@^4.11.9: + version "4.12.0" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" + integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== + +bn.js@^5.0.0, bn.js@^5.1.2: + version "5.2.0" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.0.tgz#358860674396c6997771a9d051fcc1b57d4ae002" + integrity sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw== + +borsh@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/borsh/-/borsh-0.4.0.tgz#9dd6defe741627f1315eac2a73df61421f6ddb9f" + integrity sha512-aX6qtLya3K0AkT66CmYWCCDr77qsE9arV05OmdFpmat9qu8Pg9J5tBUPDztAW5fNh/d/MyVG/OYziP52Ndzx1g== + dependencies: + "@types/bn.js" "^4.11.5" + bn.js "^5.0.0" + bs58 "^4.0.0" + text-encoding-utf-8 "^1.0.2" + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +brorand@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" + integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= + +browser-stdout@1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" + integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== + +bs58@^4.0.0, bs58@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/bs58/-/bs58-4.0.1.tgz#be161e76c354f6f788ae4071f63f34e8c4f0a42a" + integrity sha1-vhYedsNU9veIrkBx9j806MTwpCo= + dependencies: + base-x "^3.0.2" + +buffer-from@^1.0.0, buffer-from@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== + +buffer-layout@^1.2.0, buffer-layout@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/buffer-layout/-/buffer-layout-1.2.2.tgz#b9814e7c7235783085f9ca4966a0cfff112259d5" + integrity sha512-kWSuLN694+KTk8SrYvCqwP2WcgQjoRCiF5b4QDvkkz8EmgD+aWAIceGFKMIAdmF/pH+vpgNV3d3kAKorcdAmWA== + +buffer@6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.1.tgz#3cbea8c1463e5a0779e30b66d4c88c6ffa182ac2" + integrity sha512-rVAXBwEcEoYtxnHSO5iWyhzV/O1WMtkUYWlfdLS7FjU4PnSJJHEfHXi/uHPI5EwltmOA794gN3bm3/pzuctWjQ== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.2.1" + +buffer@~6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" + integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.2.1" + +bufferutil@^4.0.1: + version "4.0.6" + resolved "https://registry.yarnpkg.com/bufferutil/-/bufferutil-4.0.6.tgz#ebd6c67c7922a0e902f053e5d8be5ec850e48433" + integrity sha512-jduaYOYtnio4aIAyc6UbvPCVcgq7nYpVnucyxr6eCYg/Woad9Hf/oxxBRDnGGjPfjUm6j5O/uBWhIu4iLebFaw== + dependencies: + node-gyp-build "^4.3.0" + +camelcase@^5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" + integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== + +camelcase@^6.0.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" + integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== + +chai@^4.3.4: + version "4.3.4" + resolved "https://registry.yarnpkg.com/chai/-/chai-4.3.4.tgz#b55e655b31e1eac7099be4c08c21964fce2e6c49" + integrity sha512-yS5H68VYOCtN1cjfwumDSuzn/9c+yza4f3reKXlE5rUg7SFcCEy90gJvydNgOYtblyf4Zi6jIWRnXOgErta0KA== + dependencies: + assertion-error "^1.1.0" + check-error "^1.0.2" + deep-eql "^3.0.1" + get-func-name "^2.0.0" + pathval "^1.1.1" + type-detect "^4.0.5" + +chalk@^4.1.0: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +check-error@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82" + integrity sha1-V00xLt2Iu13YkS6Sht1sCu1KrII= + +chokidar@3.5.2: + version "3.5.2" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.2.tgz#dba3976fcadb016f66fd365021d91600d01c1e75" + integrity sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + +circular-json@^0.5.9: + version "0.5.9" + resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.5.9.tgz#932763ae88f4f7dead7a0d09c8a51a4743a53b1d" + integrity sha512-4ivwqHpIFJZBuhN3g/pEcdbnGUywkBblloGbkglyloVjjR3uT6tieI89MVOfbP2tHX5sgb01FuLgAOzebNlJNQ== + +cliui@^7.0.2: + version "7.0.4" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" + integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^7.0.0" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +commander@^2.20.3: + version "2.20.3" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= + +cross-fetch@^3.1.4: + version "3.1.4" + resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.4.tgz#9723f3a3a247bf8b89039f3a380a9244e8fa2f39" + integrity sha512-1eAtFWdIubi6T4XPy6ei9iUFoKpUkIF971QLN8lIvvvwueI65+Nw5haMNKUwfJxabqlIIDODJKGrQ66gxC0PbQ== + dependencies: + node-fetch "2.6.1" + +crypto-hash@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/crypto-hash/-/crypto-hash-1.3.0.tgz#b402cb08f4529e9f4f09346c3e275942f845e247" + integrity sha512-lyAZ0EMyjDkVvz8WOeVnuCPvKVBXcMv1l5SVqO1yC7PzTwrD/pPje/BIRbWhMoPe436U+Y2nD7f5bFx0kt+Sbg== + +debug@4.3.2: + version "4.3.2" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.2.tgz#f0a49c18ac8779e31d4a0c6029dfb76873c7428b" + integrity sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw== + dependencies: + ms "2.1.2" + +decamelize@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837" + integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== + +deep-eql@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-3.0.1.tgz#dfc9404400ad1c8fe023e7da1df1c147c4b444df" + integrity sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw== + dependencies: + type-detect "^4.0.0" + +delay@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/delay/-/delay-5.0.0.tgz#137045ef1b96e5071060dd5be60bf9334436bd1d" + integrity sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw== + +diff@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-5.0.0.tgz#7ed6ad76d859d030787ec35855f5b1daf31d852b" + integrity sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w== + +diff@^3.1.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" + integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA== + +dot-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/dot-case/-/dot-case-3.0.4.tgz#9b2b670d00a431667a8a75ba29cd1b98809ce751" + integrity sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w== + dependencies: + no-case "^3.0.4" + tslib "^2.0.3" + +elliptic@^6.5.2: + version "6.5.4" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" + integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== + dependencies: + bn.js "^4.11.9" + brorand "^1.1.0" + hash.js "^1.0.0" + hmac-drbg "^1.0.1" + inherits "^2.0.4" + minimalistic-assert "^1.0.1" + minimalistic-crypto-utils "^1.0.1" + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +es6-promise@^4.0.3: + version "4.2.8" + resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a" + integrity sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w== + +es6-promisify@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-5.0.0.tgz#5109d62f3e56ea967c4b63505aef08291c8a5203" + integrity sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM= + dependencies: + es6-promise "^4.0.3" + +escalade@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" + integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== + +escape-string-regexp@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +eventemitter3@^4.0.7: + version "4.0.7" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" + integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== + +eyes@^0.1.8: + version "0.1.8" + resolved "https://registry.yarnpkg.com/eyes/-/eyes-0.1.8.tgz#62cf120234c683785d902348a800ef3e0cc20bc0" + integrity sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A= + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +find-up@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + +find@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/find/-/find-0.3.0.tgz#4082e8fc8d8320f1a382b5e4f521b9bc50775cb8" + integrity sha512-iSd+O4OEYV/I36Zl8MdYJO0xD82wH528SaCieTVHhclgiYNe9y+yPKSwK+A7/WsmHL1EZ+pYUJBXWTL5qofksw== + dependencies: + traverse-chain "~0.1.0" + +flat@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" + integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= + +fsevents@~2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" + integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== + +get-caller-file@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +get-func-name@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41" + integrity sha1-6td0q+5y4gQJQzoGY2YCPdaIekE= + +glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob@7.1.7: + version "7.1.7" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90" + integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +growl@1.10.5: + version "1.10.5" + resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" + integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA== + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +hash.js@1.1.7, hash.js@^1.0.0, hash.js@^1.0.3: + version "1.1.7" + resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" + integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== + dependencies: + inherits "^2.0.3" + minimalistic-assert "^1.0.1" + +he@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" + integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== + +hmac-drbg@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" + integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE= + dependencies: + hash.js "^1.0.3" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.1" + +ieee754@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@^2.0.3, inherits@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-glob@^4.0.1, is-glob@~4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-plain-obj@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" + integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== + +is-unicode-supported@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" + integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= + +isomorphic-ws@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz#55fd4cd6c5e6491e76dc125938dd863f5cd4f2dc" + integrity sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w== + +jayson@^3.4.4: + version "3.6.6" + resolved "https://registry.yarnpkg.com/jayson/-/jayson-3.6.6.tgz#189984f624e398f831bd2be8e8c80eb3abf764a1" + integrity sha512-f71uvrAWTtrwoww6MKcl9phQTC+56AopLyEenWvKVAIMz+q0oVGj6tenLZ7Z6UiPBkJtKLj4kt0tACllFQruGQ== + dependencies: + "@types/connect" "^3.4.33" + "@types/express-serve-static-core" "^4.17.9" + "@types/lodash" "^4.14.159" + "@types/node" "^12.12.54" + "@types/ws" "^7.4.4" + JSONStream "^1.3.5" + commander "^2.20.3" + delay "^5.0.0" + es6-promisify "^5.0.0" + eyes "^0.1.8" + isomorphic-ws "^4.0.1" + json-stringify-safe "^5.0.1" + lodash "^4.17.20" + uuid "^8.3.2" + ws "^7.4.5" + +js-sha256@^0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/js-sha256/-/js-sha256-0.9.0.tgz#0b89ac166583e91ef9123644bd3c5334ce9d0966" + integrity sha512-sga3MHh9sgQN2+pJ9VYZ+1LPwXOxuBJBA5nrR5/ofPfuiJBE2hnjsaN8se8JznOmGLN2p49Pe5U/ttafcs/apA== + +js-sha3@^0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.8.0.tgz#b9b7a5da73afad7dedd0f8c463954cbde6818840" + integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q== + +js-yaml@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + +json-stringify-safe@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= + +json5@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" + integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== + dependencies: + minimist "^1.2.0" + +jsonparse@^1.2.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" + integrity sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA= + +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + +lodash@^4.17.20: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +log-symbols@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" + integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== + dependencies: + chalk "^4.1.0" + is-unicode-supported "^0.1.0" + +lower-case@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-2.0.2.tgz#6fa237c63dbdc4a82ca0fd882e4722dc5e634e28" + integrity sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg== + dependencies: + tslib "^2.0.3" + +make-error@^1.1.1: + version "1.3.6" + resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" + integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== + +minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" + integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== + +minimalistic-crypto-utils@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" + integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= + +minimatch@3.0.4, minimatch@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== + dependencies: + brace-expansion "^1.1.7" + +minimist@^1.2.0, minimist@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" + integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== + +mkdirp@^0.5.1: + version "0.5.5" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" + integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== + dependencies: + minimist "^1.2.5" + +mocha@^9.0.3: + version "9.1.3" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-9.1.3.tgz#8a623be6b323810493d8c8f6f7667440fa469fdb" + integrity sha512-Xcpl9FqXOAYqI3j79pEtHBBnQgVXIhpULjGQa7DVb0Po+VzmSIK9kanAiWLHoRR/dbZ2qpdPshuXr8l1VaHCzw== + dependencies: + "@ungap/promise-all-settled" "1.1.2" + ansi-colors "4.1.1" + browser-stdout "1.3.1" + chokidar "3.5.2" + debug "4.3.2" + diff "5.0.0" + escape-string-regexp "4.0.0" + find-up "5.0.0" + glob "7.1.7" + growl "1.10.5" + he "1.2.0" + js-yaml "4.1.0" + log-symbols "4.1.0" + minimatch "3.0.4" + ms "2.1.3" + nanoid "3.1.25" + serialize-javascript "6.0.0" + strip-json-comments "3.1.1" + supports-color "8.1.1" + which "2.0.2" + workerpool "6.1.5" + yargs "16.2.0" + yargs-parser "20.2.4" + yargs-unparser "2.0.0" + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +ms@2.1.3: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +nanoid@3.1.25: + version "3.1.25" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.25.tgz#09ca32747c0e543f0e1814b7d3793477f9c8e152" + integrity sha512-rdwtIXaXCLFAQbnfqDRnI6jaRHp9fTcYBjtFKE8eezcZ7LuLjhUaQGNeMXf1HmRoCH32CLz6XwX0TtxEOS/A3Q== + +no-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/no-case/-/no-case-3.0.4.tgz#d361fd5c9800f558551a8369fc0dcd4662b6124d" + integrity sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg== + dependencies: + lower-case "^2.0.2" + tslib "^2.0.3" + +node-addon-api@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-2.0.2.tgz#432cfa82962ce494b132e9d72a15b29f71ff5d32" + integrity sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA== + +node-fetch@2.6.1: + version "2.6.1" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052" + integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw== + +node-gyp-build@^4.2.0, node-gyp-build@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.3.0.tgz#9f256b03e5826150be39c764bf51e993946d71a3" + integrity sha512-iWjXZvmboq0ja1pUGULQBexmxq8CV4xBhX7VDOTbL7ZR4FOowwY/VOtRxBN/yKxmdGoIp4j5ysNT4u3S2pDQ3Q== + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +once@^1.3.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= + dependencies: + wrappy "1" + +p-limit@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + +pako@^2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/pako/-/pako-2.0.4.tgz#6cebc4bbb0b6c73b0d5b8d7e8476e2b2fbea576d" + integrity sha512-v8tweI900AUkZN6heMU/4Uy4cXRc2AYNRggVmTR+dEncawDJgCdLMximOVA2p4qO57WMynangsfGRb5WD6L1Bg== + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= + +pathval@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.1.tgz#8534e77a77ce7ac5a2512ea21e0fdb8fcf6c3d8d" + integrity sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ== + +picomatch@^2.0.4, picomatch@^2.2.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +randombytes@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + dependencies: + picomatch "^2.2.1" + +regenerator-runtime@^0.13.4: + version "0.13.9" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52" + integrity sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA== + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= + +rpc-websockets@^7.4.2: + version "7.4.16" + resolved "https://registry.yarnpkg.com/rpc-websockets/-/rpc-websockets-7.4.16.tgz#eb701cdef577d4357ba5f526d50e25f370396fac" + integrity sha512-0b7OVhutzwRIaYAtJo5tqtaQTWKfwAsKnaThOSOy+VkhVdleNUgb8eZnWSdWITRZZEigV5uPEIDr5KZe4DBrdQ== + dependencies: + "@babel/runtime" "^7.11.2" + circular-json "^0.5.9" + eventemitter3 "^4.0.7" + uuid "^8.3.0" + ws "^7.4.5" + optionalDependencies: + bufferutil "^4.0.1" + utf-8-validate "^5.0.2" + +safe-buffer@^5.0.1, safe-buffer@^5.1.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +secp256k1@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/secp256k1/-/secp256k1-4.0.2.tgz#15dd57d0f0b9fdb54ac1fa1694f40e5e9a54f4a1" + integrity sha512-UDar4sKvWAksIlfX3xIaQReADn+WFnHvbVujpcbr+9Sf/69odMwy2MUsz5CKLQgX9nsIyrjuxL2imVyoNHa3fg== + dependencies: + elliptic "^6.5.2" + node-addon-api "^2.0.0" + node-gyp-build "^4.2.0" + +serialize-javascript@6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8" + integrity sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag== + dependencies: + randombytes "^2.1.0" + +snake-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/snake-case/-/snake-case-3.0.4.tgz#4f2bbd568e9935abdfd593f34c691dadb49c452c" + integrity sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg== + dependencies: + dot-case "^3.0.4" + tslib "^2.0.3" + +source-map-support@^0.5.6: + version "0.5.21" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" + integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map@^0.6.0: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +string-width@^4.1.0, string-width@^4.2.0: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= + +strip-json-comments@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + +superstruct@^0.14.2: + version "0.14.2" + resolved "https://registry.yarnpkg.com/superstruct/-/superstruct-0.14.2.tgz#0dbcdf3d83676588828f1cf5ed35cda02f59025b" + integrity sha512-nPewA6m9mR3d6k7WkZ8N8zpTWfenFH3q9pA2PkuiZxINr9DKB2+40wEQf0ixn8VaGuJ78AB6iWOtStI+/4FKZQ== + +supports-color@8.1.1: + version "8.1.1" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +text-encoding-utf-8@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/text-encoding-utf-8/-/text-encoding-utf-8-1.0.2.tgz#585b62197b0ae437e3c7b5d0af27ac1021e10d13" + integrity sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg== + +"through@>=2.2.7 <3": + version "2.3.8" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +toml@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/toml/-/toml-3.0.0.tgz#342160f1af1904ec9d204d03a5d61222d762c5ee" + integrity sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w== + +traverse-chain@~0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/traverse-chain/-/traverse-chain-0.1.0.tgz#61dbc2d53b69ff6091a12a168fd7d433107e40f1" + integrity sha1-YdvC1Ttp/2CRoSoWj9fUMxB+QPE= + +ts-mocha@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/ts-mocha/-/ts-mocha-8.0.0.tgz#962d0fa12eeb6468aa1a6b594bb3bbc818da3ef0" + integrity sha512-Kou1yxTlubLnD5C3unlCVO7nh0HERTezjoVhVw/M5S1SqoUec0WgllQvPk3vzPMc6by8m6xD1uR1yRf8lnVUbA== + dependencies: + ts-node "7.0.1" + optionalDependencies: + tsconfig-paths "^3.5.0" + +ts-node@7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-7.0.1.tgz#9562dc2d1e6d248d24bc55f773e3f614337d9baf" + integrity sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw== + dependencies: + arrify "^1.0.0" + buffer-from "^1.1.0" + diff "^3.1.0" + make-error "^1.1.1" + minimist "^1.2.0" + mkdirp "^0.5.1" + source-map-support "^0.5.6" + yn "^2.0.0" + +tsconfig-paths@^3.5.0: + version "3.12.0" + resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.12.0.tgz#19769aca6ee8f6a1a341e38c8fa45dd9fb18899b" + integrity sha512-e5adrnOYT6zqVnWqZu7i/BQ3BnhzvGbjEjejFXO20lKIKpwTaupkCPgEfv4GZK1IBciJUEhYs3J3p75FdaTFVg== + dependencies: + "@types/json5" "^0.0.29" + json5 "^1.0.1" + minimist "^1.2.0" + strip-bom "^3.0.0" + +tslib@^2.0.3: + version "2.3.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.1.tgz#e8a335add5ceae51aa261d32a490158ef042ef01" + integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw== + +tweetnacl@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-1.0.3.tgz#ac0af71680458d8a6378d0d0d050ab1407d35596" + integrity sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw== + +type-detect@^4.0.0, type-detect@^4.0.5: + version "4.0.8" + resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" + integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== + +typescript@^4.3.5: + version "4.5.4" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.5.4.tgz#a17d3a0263bf5c8723b9c52f43c5084edf13c2e8" + integrity sha512-VgYs2A2QIRuGphtzFV7aQJduJ2gyfTljngLzjpfW9FoYZF6xuw1W0vW9ghCKLfcWrCFxK81CSGRAvS1pn4fIUg== + +utf-8-validate@^5.0.2: + version "5.0.8" + resolved "https://registry.yarnpkg.com/utf-8-validate/-/utf-8-validate-5.0.8.tgz#4a735a61661dbb1c59a0868c397d2fe263f14e58" + integrity sha512-k4dW/Qja1BYDl2qD4tOMB9PFVha/UJtxTc1cXYOe3WwA/2m0Yn4qB7wLMpJyLJ/7DR0XnTut3HsCSzDT4ZvKgA== + dependencies: + node-gyp-build "^4.3.0" + +uuid@^8.3.0, uuid@^8.3.2: + version "8.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" + integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== + +which@2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +workerpool@6.1.5: + version "6.1.5" + resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.1.5.tgz#0f7cf076b6215fd7e1da903ff6f22ddd1886b581" + integrity sha512-XdKkCK0Zqc6w3iTxLckiuJ81tiD/o5rBE/m+nXpRCB+/Sq4DqkfXZ/x0jW02DG1tGsfUGXbTJyZDP+eu67haSw== + +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= + +ws@^7.4.5: + version "7.5.6" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.6.tgz#e59fc509fb15ddfb65487ee9765c5a51dec5fe7b" + integrity sha512-6GLgCqo2cy2A2rjCNFlxQS6ZljG/coZfZXclldI8FB/1G3CCI36Zd8xy2HrFVACi8tfk5XrgLQEk+P0Tnz9UcA== + +y18n@^5.0.5: + version "5.0.8" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== + +yargs-parser@20.2.4: + version "20.2.4" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54" + integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA== + +yargs-parser@^20.2.2: + version "20.2.9" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" + integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== + +yargs-unparser@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz#f131f9226911ae5d9ad38c432fe809366c2325eb" + integrity sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA== + dependencies: + camelcase "^6.0.0" + decamelize "^4.0.0" + flat "^5.0.2" + is-plain-obj "^2.1.0" + +yargs@16.2.0: + version "16.2.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" + integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== + dependencies: + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.0" + y18n "^5.0.5" + yargs-parser "^20.2.2" + +yn@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/yn/-/yn-2.0.0.tgz#e5adabc8acf408f6385fc76495684c88e6af689a" + integrity sha1-5a2ryKz0CPY4X8dklWhMiOavaJo= + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== diff --git a/tests/package.json b/tests/package.json index 9fe956c95b..4ffd507c37 100644 --- a/tests/package.json +++ b/tests/package.json @@ -10,6 +10,7 @@ "cfo", "chat", "composite", + "custom-coder", "errors", "escrow", "events", diff --git a/ts/package.json b/ts/package.json index bd3e05ab01..5146aa6e5d 100644 --- a/ts/package.json +++ b/ts/package.json @@ -78,5 +78,8 @@ "tslib": "^2.3.1", "typedoc": "^0.22.10", "typescript": "^4.5.2" + }, + "optionalDependencies": { + "@solana/spl-token": "^0.1.8" } } diff --git a/ts/src/coder/spl-token/index.ts b/ts/src/coder/spl-token/index.ts index c49a4d6ee5..34c2ff42c1 100644 --- a/ts/src/coder/spl-token/index.ts +++ b/ts/src/coder/spl-token/index.ts @@ -17,5 +17,6 @@ export class SplTokenCoder { this.instruction = new SplTokenInstructionCoder(idl); this.accounts = new SplTokenAccountsCoder(idl); this.events = new SplTokenEventsCoder(idl); + this.state = new SplTokenStateCoder(idl); } } diff --git a/ts/src/coder/spl-token/instruction.ts b/ts/src/coder/spl-token/instruction.ts index 5c12417f2b..f6981a2aa0 100644 --- a/ts/src/coder/spl-token/instruction.ts +++ b/ts/src/coder/spl-token/instruction.ts @@ -1,17 +1,282 @@ +import * as BufferLayout from "buffer-layout"; +import camelCase from "camelcase"; +import { PublicKey } from "@solana/web3.js"; import { InstructionCoder } from "../index.js"; import { Idl } from "../../idl.js"; export class SplTokenInstructionCoder implements InstructionCoder { - constructor(idl: Idl) { - // todo - } + constructor(private idl: Idl) {} encode(ixName: string, ix: any): Buffer { - // todo - return Buffer.from([]); + switch (camelCase(ixName)) { + case "initializeMint": { + return encodeInitializeMint(ix); + } + case "initializeAccount": { + return encodeInitializeAccount(ix); + } + case "initializeMultisig": { + return encodeInitializeMultisig(ix); + } + case "transfer": { + return encodeTransfer(ix); + } + case "approve": { + return encodeApprove(ix); + } + case "revoke": { + return encodeRevoke(ix); + } + case "setAuthority": { + return encodeSetAuthority(ix); + } + case "mintTo": { + return encodeMintTo(ix); + } + case "burn": { + return encodeBurn(ix); + } + case "closeAccount": { + return encodeCloseAccount(ix); + } + case "freezeAccount": { + return encodeFreezeAccount(ix); + } + case "thawAccount": { + return encodeThawAccount(ix); + } + case "transferChecked": { + return encodeTransferChecked(ix); + } + case "approvedChecked": { + return encodeApproveChecked(ix); + } + case "mintToChecked": { + return encodeMintToChecked(ix); + } + case "burnChecked": { + return encodeBurnChecked(ix); + } + case "intializeAccount2": { + return encodeInitializeAccount2(ix); + } + case "syncNative": { + return encodeSyncNative(ix); + } + case "initializeAccount3": { + return encodeInitializeAccount3(ix); + } + case "initializeMultisig2": { + return encodeInitializeMultisig2(ix); + } + case "initializeMint2": { + return encodeInitializeMint2(ix); + } + default: { + throw new Error(`Invalid instruction: ${ixName}`); + } + } } encodeState(_ixName: string, _ix: any): Buffer { throw new Error("SPL token does not have state"); } } + +function encodeInitializeMint({ + decimals, + mintAuthority, + freezeAuthority, +}: any): Buffer { + return encodeData({ + initializeMint: { + decimals, + mintAuthority: mintAuthority.toBuffer(), + freezeAuthorityOption: !!freezeAuthority, + freezeAuthority: (freezeAuthority || PublicKey.default).toBuffer(), + }, + }); +} + +function encodeInitializeAccount(_ix: any): Buffer { + return encodeData({ + initializeAccount: {}, + }); +} + +function encodeInitializeMultisig({ m }: any): Buffer { + return encodeData({ + initializeMultisig: { + m, + }, + }); +} + +function encodeTransfer({ amount }: any): Buffer { + return encodeData({ + transfer: { amount }, + }); +} + +function encodeApprove({ amount }: any): Buffer { + return encodeData({ + approve: { amount }, + }); +} + +function encodeRevoke(_ix: any): Buffer { + return encodeData({ + revoke: {}, + }); +} + +function encodeSetAuthority({ authorityType, newAuthority }: any): Buffer { + return encodeData({ + setAuthority: { authorityType, newAuthority }, + }); +} + +function encodeMintTo({ amount }: any): Buffer { + return encodeData({ + mintTo: { amount }, + }); +} + +function encodeBurn({ amount }: any): Buffer { + return encodeData({ + burn: { amount }, + }); +} + +function encodeCloseAccount(_: any): Buffer { + return encodeData({ + closeAccount: {}, + }); +} + +function encodeFreezeAccount(_: any): Buffer { + return encodeData({ + freezeAccount: {}, + }); +} + +function encodeThawAccount(_: any): Buffer { + return encodeData({ + thawAccount: {}, + }); +} + +function encodeTransferChecked({ amount, decimals }: any): Buffer { + return encodeData({ + transferChecked: { amount, decimals }, + }); +} + +function encodeApproveChecked({ amount, decimals }: any): Buffer { + return encodeData({ + approveChecked: { amount, decimals }, + }); +} + +function encodeMintToChecked({ amount, decimals }: any): Buffer { + return encodeData({ + mintToChecked: { amount, decimals }, + }); +} + +function encodeBurnChecked({ amount, decimals }: any): Buffer { + return encodeData({ + burnChecked: { amount, decimals }, + }); +} + +function encodeInitializeAccount2({ authority }: any): Buffer { + return encodeData({ + initilaizeAccount2: { authority }, + }); +} + +function encodeSyncNative(_: any): Buffer { + return encodeData({ + syncNative: {}, + }); +} + +function encodeInitializeAccount3({ authority }: any): Buffer { + return encodeData({ + initializeAccount3: { authority }, + }); +} + +function encodeInitializeMultisig2({ m }: any): Buffer { + return encodeData({ + initializeMultisig2: { m }, + }); +} + +function encodeInitializeMint2({ + decimals, + mintAuthority, + freezeAuthority, +}: any): Buffer { + return encodeData({ + encodeInitializeMint2: { decimals, mintAuthority, freezeAuthority }, + }); +} + +export const TOKEN_PROGRAM_ID = new PublicKey( + "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" +); + +const LAYOUT = BufferLayout.union(BufferLayout.u8("instruction")); +LAYOUT.addVariant( + 0, + BufferLayout.struct([ + BufferLayout.u8("decimals"), + BufferLayout.blob(32, "mintAuthority"), + BufferLayout.u8("freezeAuthorityOption"), + BufferLayout.blob(32, "freezeAuthority"), + ]), + "initializeMint" +); +LAYOUT.addVariant(1, BufferLayout.struct([]), "initializeAccount"); +LAYOUT.addVariant( + 2, + BufferLayout.struct([BufferLayout.u8("m")]), + "initializeMultisig" +); +LAYOUT.addVariant( + 3, + BufferLayout.struct([BufferLayout.nu64("amount")]), + "transfer" +); +LAYOUT.addVariant( + 7, + BufferLayout.struct([BufferLayout.nu64("amount")]), + "mintTo" +); +LAYOUT.addVariant( + 8, + BufferLayout.struct([BufferLayout.nu64("amount")]), + "burn" +); +LAYOUT.addVariant(9, BufferLayout.struct([]), "closeAccount"); +LAYOUT.addVariant( + 12, + BufferLayout.struct([ + BufferLayout.nu64("amount"), + BufferLayout.u8("decimals"), + ]), + "transferChecked" +); + +function encodeData(instruction: any) { + let b = Buffer.alloc(instructionMaxSpan); + let span = LAYOUT.encode(instruction, b); + return b.slice(0, span); +} + +const instructionMaxSpan = Math.max( + // @ts-ignore + ...Object.values(LAYOUT.registry).map((r) => r.span) +); diff --git a/ts/src/coder/spl-token/state.ts b/ts/src/coder/spl-token/state.ts index f8ac3c3f04..baff6a8a91 100644 --- a/ts/src/coder/spl-token/state.ts +++ b/ts/src/coder/spl-token/state.ts @@ -1,6 +1,9 @@ import { StateCoder } from "../index.js"; +import { Idl } from "../../idl"; export class SplTokenStateCoder implements StateCoder { + constructor(_idl: Idl) {} + encode(_name: string, _account: T): Promise { throw new Error("SPL token does not have state"); } diff --git a/ts/src/idl.ts b/ts/src/idl.ts index bb1831bf79..7bc65fc634 100644 --- a/ts/src/idl.ts +++ b/ts/src/idl.ts @@ -99,6 +99,7 @@ export type IdlType = | "publicKey" | IdlTypeDefined | IdlTypeOption + | IdlTypeCOption | IdlTypeVec | IdlTypeArray; @@ -111,6 +112,10 @@ export type IdlTypeOption = { option: IdlType; }; +export type IdlTypeCOption = { + coption: IdlType; +}; + export type IdlTypeVec = { vec: IdlType; }; diff --git a/ts/src/index.ts b/ts/src/index.ts index f296869f1d..f359ef86f6 100644 --- a/ts/src/index.ts +++ b/ts/src/index.ts @@ -9,6 +9,7 @@ export { Idl } from "./idl.js"; export * from "./coder/index.js"; export * as utils from "./utils/index.js"; export * from "./program/index.js"; +export * from "./spl/index.js"; export declare const workspace: any; export declare const Wallet: import("./nodewallet").default; diff --git a/ts/src/program/index.ts b/ts/src/program/index.ts index e4917cbf9c..6e6f06bc65 100644 --- a/ts/src/program/index.ts +++ b/ts/src/program/index.ts @@ -249,7 +249,12 @@ export class Program { * @param provider The network and wallet context to use. If not provided * then uses [[getProvider]]. */ - public constructor(idl: IDL, programId: Address, provider?: Provider) { + public constructor( + idl: IDL, + programId: Address, + provider?: Provider, + coder?: Coder + ) { programId = translateAddress(programId); if (!provider) { @@ -260,7 +265,7 @@ export class Program { this._idl = idl; this._provider = provider; this._programId = programId; - this._coder = new BorshCoder(idl); + this._coder = coder ?? new BorshCoder(idl); this._events = new EventManager(this._programId, provider, this._coder); // Dynamic namespaces. diff --git a/ts/src/spl/index.ts b/ts/src/spl/index.ts new file mode 100644 index 0000000000..7ab707bb51 --- /dev/null +++ b/ts/src/spl/index.ts @@ -0,0 +1,10 @@ +import { Program } from "../index.js"; +import { program as tokenProgram, SplToken } from "./token.js"; + +export { SplToken } from "./token.js"; + +export class Spl { + public static token(): Program { + return tokenProgram(); + } +} diff --git a/ts/src/spl/token.ts b/ts/src/spl/token.ts new file mode 100644 index 0000000000..798aad1ff4 --- /dev/null +++ b/ts/src/spl/token.ts @@ -0,0 +1,872 @@ +import { TOKEN_PROGRAM_ID } from "@solana/spl-token"; +import { Program } from "../program/index.js"; +import Provider from "../provider.js"; +import { SplTokenCoder } from "../coder/spl-token/index.js"; + +export function program(provider?: Provider): Program { + return new Program( + IDL, + TOKEN_PROGRAM_ID, + provider, + new SplTokenCoder(IDL) + ); +} + +/** + * SplToken IDL. + */ +export type SplToken = { + version: "0.1.0"; + name: "custom_coder"; + instructions: [ + { + name: "initializeMint"; + accounts: [ + { + name: "mint"; + isMut: true; + isSigner: false; + }, + { + name: "rent"; + isMut: false; + isSigner: false; + } + ]; + args: [ + { + name: "decimals"; + type: "u8"; + }, + { + name: "mintAuthority"; + type: "publicKey"; + }, + { + name: "freezeAuthority"; + type: { + coption: "publicKey"; + }; + } + ]; + }, + { + name: "initializeMultisig"; + accounts: [ + { + name: "account"; + isMut: true; + isSigner: false; + }, + { + name: "rent"; + isMut: false; + isSigner: false; + } + ]; + args: []; + }, + { + name: "initializeAccount"; + accounts: [ + { + name: "account"; + isMut: true; + isSigner: false; + }, + { + name: "mint"; + isMut: false; + isSigner: false; + }, + { + name: "authority"; + isMut: false; + isSigner: false; + }, + { + name: "rent"; + isMut: false; + isSigner: false; + } + ]; + args: []; + }, + { + name: "transfer"; + accounts: [ + { + name: "source"; + isMut: true; + isSigner: false; + }, + { + name: "destination"; + isMut: true; + isSigner: false; + }, + { + name: "authority"; + isMut: false; + isSigner: true; + } + ]; + args: [ + { + name: "amount"; + type: "u64"; + } + ]; + }, + { + name: "approve"; + accounts: [ + { + name: "source"; + isMut: true; + isSigner: false; + }, + { + name: "delegate"; + isMut: false; + isSigner: false; + }, + { + name: "authority"; + isMut: false; + isSigner: true; + } + ]; + args: []; + }, + { + name: "revoke"; + accounts: [ + { + name: "source"; + isMut: true; + isSigner: false; + }, + { + name: "authority"; + isMut: false; + isSigner: true; + } + ]; + args: []; + }, + { + name: "setAuthority"; + accounts: [ + { + name: "mint"; + isMut: true; + isSigner: false; + }, + { + name: "authority"; + isMut: false; + isSigner: true; + } + ]; + args: []; + }, + { + name: "mintTo"; + accounts: [ + { + name: "mint"; + isMut: true; + isSigner: false; + }, + { + name: "to"; + isMut: true; + isSigner: false; + }, + { + name: "authority"; + isMut: false; + isSigner: true; + } + ]; + args: []; + }, + { + name: "burn"; + accounts: [ + { + name: "source"; + isMut: true; + isSigner: false; + }, + { + name: "mint"; + isMut: true; + isSigner: false; + }, + { + name: "authority"; + isMut: false; + isSigner: true; + } + ]; + args: []; + }, + { + name: "closeAccount"; + accounts: [ + { + name: "account"; + isMut: true; + isSigner: false; + }, + { + name: "destination"; + isMut: true; + isSigner: false; + }, + { + name: "authority"; + isMut: false; + isSigner: false; + } + ]; + args: []; + }, + { + name: "freezeAccount"; + accounts: [ + { + name: "account"; + isMut: true; + isSigner: false; + }, + { + name: "mint"; + isMut: false; + isSigner: false; + }, + { + name: "authority"; + isMut: false; + isSigner: true; + } + ]; + args: []; + }, + { + name: "thawAccount"; + accounts: [ + { + name: "account"; + isMut: true; + isSigner: false; + }, + { + name: "mint"; + isMut: false; + isSigner: false; + }, + { + name: "authority"; + isMut: false; + isSigner: true; + } + ]; + args: []; + }, + { + name: "transferChecked"; + accounts: [ + { + name: "source"; + isMut: true; + isSigner: false; + }, + { + name: "mint"; + isMut: false; + isSigner: false; + }, + { + name: "destination"; + isMut: true; + isSigner: false; + }, + { + name: "authority"; + isMut: false; + isSigner: true; + } + ]; + args: []; + }, + { + name: "approveChecked"; + accounts: [ + { + name: "source"; + isMut: true; + isSigner: false; + }, + { + name: "mint"; + isMut: false; + isSigner: false; + }, + { + name: "delegate"; + isMut: false; + isSigner: false; + }, + { + name: "authority"; + isMut: false; + isSigner: true; + } + ]; + args: []; + }, + { + name: "mintToChecked"; + accounts: [ + { + name: "mint"; + isMut: true; + isSigner: false; + }, + { + name: "to"; + isMut: true; + isSigner: false; + }, + { + name: "authority"; + isMut: false; + isSigner: false; + } + ]; + args: []; + }, + { + name: "burnChecked"; + accounts: [ + { + name: "source"; + isMut: true; + isSigner: false; + }, + { + name: "mint"; + isMut: true; + isSigner: false; + }, + { + name: "authority"; + isMut: false; + isSigner: true; + } + ]; + args: []; + }, + { + name: "initializeAccount2"; + accounts: [ + { + name: "account"; + isMut: true; + isSigner: false; + }, + { + name: "mint"; + isMut: false; + isSigner: false; + }, + { + name: "rent"; + isMut: false; + isSigner: false; + } + ]; + args: []; + }, + { + name: "syncNative"; + accounts: [ + { + name: "account"; + isMut: true; + isSigner: false; + } + ]; + args: []; + }, + { + name: "initializeAccount3"; + accounts: [ + { + name: "account"; + isMut: true; + isSigner: false; + }, + { + name: "mint"; + isMut: false; + isSigner: false; + } + ]; + args: []; + }, + { + name: "initializeMultisig2"; + accounts: [ + { + name: "account"; + isMut: true; + isSigner: false; + } + ]; + args: []; + }, + { + name: "initializeMint2"; + accounts: [ + { + name: "mint"; + isMut: true; + isSigner: false; + } + ]; + args: []; + } + ]; +}; + +export const IDL: SplToken = { + version: "0.1.0", + name: "custom_coder", + instructions: [ + { + name: "initializeMint", + accounts: [ + { + name: "mint", + isMut: true, + isSigner: false, + }, + { + name: "rent", + isMut: false, + isSigner: false, + }, + ], + args: [ + { + name: "decimals", + type: "u8", + }, + { + name: "mintAuthority", + type: "publicKey", + }, + { + name: "freezeAuthority", + type: { + coption: "publicKey", + }, + }, + ], + }, + { + name: "initializeMultisig", + accounts: [ + { + name: "account", + isMut: true, + isSigner: false, + }, + { + name: "rent", + isMut: false, + isSigner: false, + }, + ], + args: [], + }, + { + name: "initializeAccount", + accounts: [ + { + name: "account", + isMut: true, + isSigner: false, + }, + { + name: "mint", + isMut: false, + isSigner: false, + }, + { + name: "authority", + isMut: false, + isSigner: false, + }, + { + name: "rent", + isMut: false, + isSigner: false, + }, + ], + args: [], + }, + { + name: "transfer", + accounts: [ + { + name: "source", + isMut: true, + isSigner: false, + }, + { + name: "destination", + isMut: true, + isSigner: false, + }, + { + name: "authority", + isMut: false, + isSigner: true, + }, + ], + args: [ + { + name: "amount", + type: "u64", + }, + ], + }, + { + name: "approve", + accounts: [ + { + name: "source", + isMut: true, + isSigner: false, + }, + { + name: "delegate", + isMut: false, + isSigner: false, + }, + { + name: "authority", + isMut: false, + isSigner: true, + }, + ], + args: [], + }, + { + name: "revoke", + accounts: [ + { + name: "source", + isMut: true, + isSigner: false, + }, + { + name: "authority", + isMut: false, + isSigner: true, + }, + ], + args: [], + }, + { + name: "setAuthority", + accounts: [ + { + name: "mint", + isMut: true, + isSigner: false, + }, + { + name: "authority", + isMut: false, + isSigner: true, + }, + ], + args: [], + }, + { + name: "mintTo", + accounts: [ + { + name: "mint", + isMut: true, + isSigner: false, + }, + { + name: "to", + isMut: true, + isSigner: false, + }, + { + name: "authority", + isMut: false, + isSigner: true, + }, + ], + args: [], + }, + { + name: "burn", + accounts: [ + { + name: "source", + isMut: true, + isSigner: false, + }, + { + name: "mint", + isMut: true, + isSigner: false, + }, + { + name: "authority", + isMut: false, + isSigner: true, + }, + ], + args: [], + }, + { + name: "closeAccount", + accounts: [ + { + name: "account", + isMut: true, + isSigner: false, + }, + { + name: "destination", + isMut: true, + isSigner: false, + }, + { + name: "authority", + isMut: false, + isSigner: false, + }, + ], + args: [], + }, + { + name: "freezeAccount", + accounts: [ + { + name: "account", + isMut: true, + isSigner: false, + }, + { + name: "mint", + isMut: false, + isSigner: false, + }, + { + name: "authority", + isMut: false, + isSigner: true, + }, + ], + args: [], + }, + { + name: "thawAccount", + accounts: [ + { + name: "account", + isMut: true, + isSigner: false, + }, + { + name: "mint", + isMut: false, + isSigner: false, + }, + { + name: "authority", + isMut: false, + isSigner: true, + }, + ], + args: [], + }, + { + name: "transferChecked", + accounts: [ + { + name: "source", + isMut: true, + isSigner: false, + }, + { + name: "mint", + isMut: false, + isSigner: false, + }, + { + name: "destination", + isMut: true, + isSigner: false, + }, + { + name: "authority", + isMut: false, + isSigner: true, + }, + ], + args: [], + }, + { + name: "approveChecked", + accounts: [ + { + name: "source", + isMut: true, + isSigner: false, + }, + { + name: "mint", + isMut: false, + isSigner: false, + }, + { + name: "delegate", + isMut: false, + isSigner: false, + }, + { + name: "authority", + isMut: false, + isSigner: true, + }, + ], + args: [], + }, + { + name: "mintToChecked", + accounts: [ + { + name: "mint", + isMut: true, + isSigner: false, + }, + { + name: "to", + isMut: true, + isSigner: false, + }, + { + name: "authority", + isMut: false, + isSigner: false, + }, + ], + args: [], + }, + { + name: "burnChecked", + accounts: [ + { + name: "source", + isMut: true, + isSigner: false, + }, + { + name: "mint", + isMut: true, + isSigner: false, + }, + { + name: "authority", + isMut: false, + isSigner: true, + }, + ], + args: [], + }, + { + name: "initializeAccount2", + accounts: [ + { + name: "account", + isMut: true, + isSigner: false, + }, + { + name: "mint", + isMut: false, + isSigner: false, + }, + { + name: "rent", + isMut: false, + isSigner: false, + }, + ], + args: [], + }, + { + name: "syncNative", + accounts: [ + { + name: "account", + isMut: true, + isSigner: false, + }, + ], + args: [], + }, + { + name: "initializeAccount3", + accounts: [ + { + name: "account", + isMut: true, + isSigner: false, + }, + { + name: "mint", + isMut: false, + isSigner: false, + }, + ], + args: [], + }, + { + name: "initializeMultisig2", + accounts: [ + { + name: "account", + isMut: true, + isSigner: false, + }, + ], + args: [], + }, + { + name: "initializeMint2", + accounts: [ + { + name: "mint", + isMut: true, + isSigner: false, + }, + ], + args: [], + }, + ], +}; diff --git a/ts/yarn.lock b/ts/yarn.lock index b4ed0e315a..0eb2258f69 100644 --- a/ts/yarn.lock +++ b/ts/yarn.lock @@ -420,6 +420,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" +"@babel/runtime@^7.10.5": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.16.7.tgz#03ff99f64106588c9c403c6ecb8c3bafbbdff1fa" + integrity sha512-9E9FJowqAsytyOY6LG+1KuueckRL+aQW+mKvXRXnuFGyRAyepJPmEo9vgMfXUA6O9u3IeEdv9MAkppFcaQwogQ== + dependencies: + regenerator-runtime "^0.13.4" + "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.5": version "7.14.0" resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.14.0.tgz" @@ -649,6 +656,27 @@ minimatch "^3.0.4" strip-json-comments "^3.1.1" +"@ethersproject/bytes@^5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.5.0.tgz#cb11c526de657e7b45d2e0f0246fb3b9d29a601c" + integrity sha512-ABvc7BHWhZU9PNM/tANm/Qx4ostPGadAuQzWTr3doklZOhDlmcBqclrQe/ZXUIj3K8wC28oYeuRa+A37tX9kog== + dependencies: + "@ethersproject/logger" "^5.5.0" + +"@ethersproject/logger@^5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.5.0.tgz#0c2caebeff98e10aefa5aef27d7441c7fd18cf5d" + integrity sha512-rIY/6WPm7T8n3qS2vuHTUBPdXHl+rGxWxW5okDfo9J4Z0+gRRZT0msvUdIJkE4/HS29GUMziwGaaKO2bWONBrg== + +"@ethersproject/sha2@^5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@ethersproject/sha2/-/sha2-5.5.0.tgz#a40a054c61f98fd9eee99af2c3cc6ff57ec24db7" + integrity sha512-B5UBoglbCiHamRVPLA110J+2uqsifpZaTmid2/7W5rbtYVz6gus6/hSDieIU/6gaKIDcOj12WnOdiymEUHIAOA== + dependencies: + "@ethersproject/bytes" "^5.5.0" + "@ethersproject/logger" "^5.5.0" + hash.js "1.1.7" + "@istanbuljs/load-nyc-config@^1.0.0": version "1.1.0" resolved "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz" @@ -927,6 +955,25 @@ dependencies: "@sinonjs/commons" "^1.7.0" +"@solana/buffer-layout@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@solana/buffer-layout/-/buffer-layout-3.0.0.tgz#b9353caeb9a1589cb77a1b145bcb1a9a93114326" + integrity sha512-MVdgAKKL39tEs0l8je0hKaXLQFb7Rdfb0Xg2LjFZd8Lfdazkg6xiS98uAZrEKvaoF3i4M95ei9RydkGIDMeo3w== + dependencies: + buffer "~6.0.3" + +"@solana/spl-token@^0.1.8": + version "0.1.8" + resolved "https://registry.yarnpkg.com/@solana/spl-token/-/spl-token-0.1.8.tgz#f06e746341ef8d04165e21fc7f555492a2a0faa6" + integrity sha512-LZmYCKcPQDtJgecvWOgT/cnoIQPWjdH+QVyzPcFvyDUiT0DiRjZaam4aqNUyvchLFhzgunv3d9xOoyE34ofdoQ== + dependencies: + "@babel/runtime" "^7.10.5" + "@solana/web3.js" "^1.21.0" + bn.js "^5.1.0" + buffer "6.0.3" + buffer-layout "^1.2.0" + dotenv "10.0.0" + "@solana/web3.js@^1.17.0": version "1.17.0" resolved "https://registry.npmjs.org/@solana/web3.js/-/web3.js-1.17.0.tgz" @@ -947,6 +994,26 @@ superstruct "^0.14.2" tweetnacl "^1.0.0" +"@solana/web3.js@^1.21.0": + version "1.31.0" + resolved "https://registry.yarnpkg.com/@solana/web3.js/-/web3.js-1.31.0.tgz#7a313d4c1a90b77f27ddbfe845a10d6883e06452" + integrity sha512-7nHHx1JNFnrt15e9y8m38I/EJCbaB+bFC3KZVM1+QhybCikFxGMtGA5r7PDC3GEL1R2RZA8yKoLkDKo3vzzqnw== + dependencies: + "@babel/runtime" "^7.12.5" + "@ethersproject/sha2" "^5.5.0" + "@solana/buffer-layout" "^3.0.0" + bn.js "^5.0.0" + borsh "^0.4.0" + bs58 "^4.0.1" + buffer "6.0.1" + cross-fetch "^3.1.4" + jayson "^3.4.4" + js-sha3 "^0.8.0" + rpc-websockets "^7.4.2" + secp256k1 "^4.0.2" + superstruct "^0.14.2" + tweetnacl "^1.0.0" + "@tootallnate/once@1": version "1.1.2" resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82" @@ -1478,6 +1545,11 @@ bn.js@^5.0.0, bn.js@^5.1.2: resolved "https://registry.npmjs.org/bn.js/-/bn.js-5.1.3.tgz" integrity sha512-GkTiFpjFtUzU9CbMeJ5iazkCzGL3jrhzerzZIuqLABjbwRaFt33I9tUdSNryIptM+RxDet6OKm2WnLXzW51KsQ== +bn.js@^5.1.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.0.tgz#358860674396c6997771a9d051fcc1b57d4ae002" + integrity sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw== + borsh@^0.4.0: version "0.4.0" resolved "https://registry.npmjs.org/borsh/-/borsh-0.4.0.tgz" @@ -1568,6 +1640,14 @@ buffer@6.0.1: base64-js "^1.3.1" ieee754 "^1.2.1" +buffer@6.0.3, buffer@~6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" + integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.2.1" + bufferutil@^4.0.1: version "4.0.3" resolved "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.3.tgz" @@ -1836,6 +1916,13 @@ create-require@^1.1.0: resolved "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz" integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== +cross-fetch@^3.1.4: + version "3.1.4" + resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.4.tgz#9723f3a3a247bf8b89039f3a380a9244e8fa2f39" + integrity sha512-1eAtFWdIubi6T4XPy6ei9iUFoKpUkIF971QLN8lIvvvwueI65+Nw5haMNKUwfJxabqlIIDODJKGrQ66gxC0PbQ== + dependencies: + node-fetch "2.6.1" + cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3: version "7.0.3" resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz" @@ -1998,6 +2085,11 @@ dot-prop@^5.1.0: dependencies: is-obj "^2.0.0" +dotenv@10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-10.0.0.tgz#3d4227b8fb95f81096cdd2b66653fb2c7085ba81" + integrity sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q== + electron-to-chromium@^1.3.896: version "1.4.4" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.4.tgz#57311918524c1a26878c330537f967804d43788a" @@ -2562,7 +2654,7 @@ has@^1.0.3: dependencies: function-bind "^1.1.1" -hash.js@^1.0.0, hash.js@^1.0.3: +hash.js@1.1.7, hash.js@^1.0.0, hash.js@^1.0.3: version "1.1.7" resolved "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz" integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== @@ -3744,7 +3836,7 @@ node-addon-api@^2.0.0: resolved "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz" integrity sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA== -node-fetch@^2.6.1: +node-fetch@2.6.1, node-fetch@^2.6.1: version "2.6.1" resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz" integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw== From 3b8ed4a4dc85193804f2b8f0d518e3f96fdb4bff Mon Sep 17 00:00:00 2001 From: Armani Ferrante Date: Sat, 8 Jan 2022 15:37:02 -0500 Subject: [PATCH 06/16] finish ix coder --- .../programs/spl-token/src/lib.rs | 49 ++- ts/src/coder/spl-token/instruction.ts | 91 +++++- ts/src/spl/token.ts | 282 +++++++++++++++--- 3 files changed, 348 insertions(+), 74 deletions(-) diff --git a/tests/custom-coder/programs/spl-token/src/lib.rs b/tests/custom-coder/programs/spl-token/src/lib.rs index 3df5adebdc..4c12b95015 100644 --- a/tests/custom-coder/programs/spl-token/src/lib.rs +++ b/tests/custom-coder/programs/spl-token/src/lib.rs @@ -31,7 +31,7 @@ pub mod spl_token { Ok(()) } - pub fn approve(ctx: Context) -> ProgramResult { + pub fn approve(ctx: Context, amount: u64) -> ProgramResult { Ok(()) } @@ -39,7 +39,11 @@ pub mod spl_token { Ok(()) } - pub fn set_authority(ctx: Context) -> ProgramResult { + pub fn set_authority( + ctx: Context, + authority_type: u8, + // new_authority: COption, + ) -> ProgramResult { Ok(()) } @@ -47,7 +51,7 @@ pub mod spl_token { Ok(()) } - pub fn burn(ctx: Context) -> ProgramResult { + pub fn burn(ctx: Context, amount: u64) -> ProgramResult { Ok(()) } @@ -63,23 +67,38 @@ pub mod spl_token { Ok(()) } - pub fn transfer_checked(ctx: Context) -> ProgramResult { + pub fn transfer_checked( + ctx: Context, + amount: u64, + decimals: u8, + ) -> ProgramResult { Ok(()) } - pub fn approve_checked(ctx: Context) -> ProgramResult { + pub fn approve_checked( + ctx: Context, + amount: u64, + decimals: u8, + ) -> ProgramResult { Ok(()) } - pub fn mint_to_checked(ctx: Context) -> ProgramResult { + pub fn mint_to_checked( + ctx: Context, + amount: u64, + decimals: u8, + ) -> ProgramResult { Ok(()) } - pub fn burn_checked(ctx: Context) -> ProgramResult { + pub fn burn_checked(ctx: Context, amount: u64, decimals: u8) -> ProgramResult { Ok(()) } - pub fn initialize_account_2(ctx: Context) -> ProgramResult { + pub fn initialize_account_2( + ctx: Context, + authority: Pubkey, + ) -> ProgramResult { Ok(()) } @@ -87,15 +106,23 @@ pub mod spl_token { Ok(()) } - pub fn initialize_account3(ctx: Context) -> ProgramResult { + pub fn initialize_account3( + ctx: Context, + authority: Pubkey, + ) -> ProgramResult { Ok(()) } - pub fn initialize_multisig_2(ctx: Context) -> ProgramResult { + pub fn initialize_multisig_2(ctx: Context, m: u8) -> ProgramResult { Ok(()) } - pub fn initialize_mint_2(ctx: Context) -> ProgramResult { + pub fn initialize_mint_2( + ctx: Context, + decimals: u8, + mint_authority: Pubkey, + // freeze_authority: COption, + ) -> ProgramResult { Ok(()) } } diff --git a/ts/src/coder/spl-token/instruction.ts b/ts/src/coder/spl-token/instruction.ts index f6981a2aa0..790ab6f2a1 100644 --- a/ts/src/coder/spl-token/instruction.ts +++ b/ts/src/coder/spl-token/instruction.ts @@ -224,8 +224,15 @@ function encodeInitializeMint2({ }); } -export const TOKEN_PROGRAM_ID = new PublicKey( - "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" +function encodeData(instruction: any) { + let b = Buffer.alloc(instructionMaxSpan); + let span = LAYOUT.encode(instruction, b); + return b.slice(0, span); +} + +const instructionMaxSpan = Math.max( + // @ts-ignore + ...Object.values(LAYOUT.registry).map((r) => r.span) ); const LAYOUT = BufferLayout.union(BufferLayout.u8("instruction")); @@ -235,7 +242,7 @@ LAYOUT.addVariant( BufferLayout.u8("decimals"), BufferLayout.blob(32, "mintAuthority"), BufferLayout.u8("freezeAuthorityOption"), - BufferLayout.blob(32, "freezeAuthority"), + publicKey("freezeAuthority"), ]), "initializeMint" ); @@ -251,16 +258,29 @@ LAYOUT.addVariant( "transfer" ); LAYOUT.addVariant( - 7, + 4, BufferLayout.struct([BufferLayout.nu64("amount")]), - "mintTo" + "approve" ); +LAYOUT.addVariant(5, BufferLayout.struct([]), "revoke"); +LAYOUT.addVariant( + 6, + BufferLayout.struct([ + BufferLayout.u8("authorityType"), + BufferLayout.u8("newAuthorityOption"), + publicKey("newAuthority"), + ]), + "setAuthority" +); +LAYOUT.addVariant(7, BufferLayout.struct([]), "mintTo"); LAYOUT.addVariant( 8, BufferLayout.struct([BufferLayout.nu64("amount")]), "burn" ); LAYOUT.addVariant(9, BufferLayout.struct([]), "closeAccount"); +LAYOUT.addVariant(10, BufferLayout.struct([]), "freezeAccount"); +LAYOUT.addVariant(11, BufferLayout.struct([]), "thawAccount"); LAYOUT.addVariant( 12, BufferLayout.struct([ @@ -269,14 +289,57 @@ LAYOUT.addVariant( ]), "transferChecked" ); +LAYOUT.addVariant( + 13, + BufferLayout.struct([ + BufferLayout.nu64("amount"), + BufferLayout.u8("decimals"), + ]), + "approvedChecked" +); +LAYOUT.addVariant( + 14, + BufferLayout.struct([ + BufferLayout.nu64("amount"), + BufferLayout.u8("decimals"), + ]), + "mintToChecked" +); +LAYOUT.addVariant( + 15, + BufferLayout.struct([ + BufferLayout.nu64("amount"), + BufferLayout.u8("decimals"), + ]), + "burnedChecked" +); +LAYOUT.addVariant( + 16, + BufferLayout.struct([publicKey("authority")]), + "InitializeAccount2" +); +LAYOUT.addVariant(17, BufferLayout.struct([]), "syncNative"); +LAYOUT.addVariant( + 18, + BufferLayout.struct([publicKey("authority")]), + "initializeAccount3" +); +LAYOUT.addVariant( + 19, + BufferLayout.struct([BufferLayout.u8("m")]), + "initializeMultisig2" +); +LAYOUT.addVariant( + 20, + BufferLayout.struct([ + BufferLayout.u8("decimals"), + publicKey("mintAuthority"), + BufferLayout.u8("freezeAuthorityOption"), + publicKey("freezeAuthority"), + ]), + "initializeMint2" +); -function encodeData(instruction: any) { - let b = Buffer.alloc(instructionMaxSpan); - let span = LAYOUT.encode(instruction, b); - return b.slice(0, span); +function publicKey(property: string): any { + return BufferLayout.blob(32, property); } - -const instructionMaxSpan = Math.max( - // @ts-ignore - ...Object.values(LAYOUT.registry).map((r) => r.span) -); diff --git a/ts/src/spl/token.ts b/ts/src/spl/token.ts index 798aad1ff4..fab7a1d385 100644 --- a/ts/src/spl/token.ts +++ b/ts/src/spl/token.ts @@ -17,7 +17,7 @@ export function program(provider?: Provider): Program { */ export type SplToken = { version: "0.1.0"; - name: "custom_coder"; + name: "spl_token"; instructions: [ { name: "initializeMint"; @@ -51,13 +51,23 @@ export type SplToken = { ]; }, { - name: "initializeMultisig"; + name: "initializeAccount"; accounts: [ { name: "account"; isMut: true; isSigner: false; }, + { + name: "mint"; + isMut: false; + isSigner: false; + }, + { + name: "authority"; + isMut: false; + isSigner: false; + }, { name: "rent"; isMut: false; @@ -67,30 +77,25 @@ export type SplToken = { args: []; }, { - name: "initializeAccount"; + name: "initializeMultisig"; accounts: [ { name: "account"; isMut: true; isSigner: false; }, - { - name: "mint"; - isMut: false; - isSigner: false; - }, - { - name: "authority"; - isMut: false; - isSigner: false; - }, { name: "rent"; isMut: false; isSigner: false; } ]; - args: []; + args: [ + { + name: "m"; + type: "u8"; + } + ]; }, { name: "transfer"; @@ -137,7 +142,12 @@ export type SplToken = { isSigner: true; } ]; - args: []; + args: [ + { + name: "amount"; + type: "u64"; + } + ]; }, { name: "revoke"; @@ -169,7 +179,18 @@ export type SplToken = { isSigner: true; } ]; - args: []; + args: [ + { + name: "authorityType"; + type: "u8"; + }, + { + name: "newAuthority"; + type: { + coption: "publicKey"; + }; + } + ]; }, { name: "mintTo"; @@ -211,7 +232,12 @@ export type SplToken = { isSigner: true; } ]; - args: []; + args: [ + { + name: "amount"; + type: "u64"; + } + ]; }, { name: "closeAccount"; @@ -300,7 +326,16 @@ export type SplToken = { isSigner: true; } ]; - args: []; + args: [ + { + name: "amount"; + type: "u64"; + }, + { + name: "decimals"; + type: "u8"; + } + ]; }, { name: "approveChecked"; @@ -326,7 +361,16 @@ export type SplToken = { isSigner: true; } ]; - args: []; + args: [ + { + name: "amount"; + type: "u64"; + }, + { + name: "decimals"; + type: "u8"; + } + ]; }, { name: "mintToChecked"; @@ -347,7 +391,16 @@ export type SplToken = { isSigner: false; } ]; - args: []; + args: [ + { + name: "amount"; + type: "u64"; + }, + { + name: "decimals"; + type: "u8"; + } + ]; }, { name: "burnChecked"; @@ -368,7 +421,16 @@ export type SplToken = { isSigner: true; } ]; - args: []; + args: [ + { + name: "amount"; + type: "u64"; + }, + { + name: "decimals"; + type: "u8"; + } + ]; }, { name: "initializeAccount2"; @@ -389,7 +451,12 @@ export type SplToken = { isSigner: false; } ]; - args: []; + args: [ + { + name: "authority"; + type: "publicKey"; + } + ]; }, { name: "syncNative"; @@ -416,7 +483,12 @@ export type SplToken = { isSigner: false; } ]; - args: []; + args: [ + { + name: "authority"; + type: "publicKey"; + } + ]; }, { name: "initializeMultisig2"; @@ -427,7 +499,12 @@ export type SplToken = { isSigner: false; } ]; - args: []; + args: [ + { + name: "m"; + type: "u8"; + } + ]; }, { name: "initializeMint2"; @@ -438,14 +515,29 @@ export type SplToken = { isSigner: false; } ]; - args: []; + args: [ + { + name: "decimals"; + type: "u8"; + }, + { + name: "mintAuthority"; + type: "publicKey"; + }, + { + name: "freezeAuthority"; + type: { + coption: "publicKey"; + }; + } + ]; } ]; }; export const IDL: SplToken = { version: "0.1.0", - name: "custom_coder", + name: "spl_token", instructions: [ { name: "initializeMint", @@ -479,13 +571,23 @@ export const IDL: SplToken = { ], }, { - name: "initializeMultisig", + name: "initializeAccount", accounts: [ { name: "account", isMut: true, isSigner: false, }, + { + name: "mint", + isMut: false, + isSigner: false, + }, + { + name: "authority", + isMut: false, + isSigner: false, + }, { name: "rent", isMut: false, @@ -495,7 +597,7 @@ export const IDL: SplToken = { args: [], }, { - name: "initializeAccount", + name: "initializeMultisig", accounts: [ { name: "account", @@ -503,22 +605,17 @@ export const IDL: SplToken = { isSigner: false, }, { - name: "mint", - isMut: false, - isSigner: false, - }, - { - name: "authority", + name: "rent", isMut: false, isSigner: false, }, + ], + args: [ { - name: "rent", - isMut: false, - isSigner: false, + name: "m", + type: "u8", }, ], - args: [], }, { name: "transfer", @@ -565,7 +662,12 @@ export const IDL: SplToken = { isSigner: true, }, ], - args: [], + args: [ + { + name: "amount", + type: "u64", + }, + ], }, { name: "revoke", @@ -597,7 +699,18 @@ export const IDL: SplToken = { isSigner: true, }, ], - args: [], + args: [ + { + name: "authorityType", + type: "u8", + }, + { + name: "newAuthority", + type: { + coption: "publicKey", + }, + }, + ], }, { name: "mintTo", @@ -639,7 +752,12 @@ export const IDL: SplToken = { isSigner: true, }, ], - args: [], + args: [ + { + name: "amount", + type: "u64", + }, + ], }, { name: "closeAccount", @@ -728,7 +846,16 @@ export const IDL: SplToken = { isSigner: true, }, ], - args: [], + args: [ + { + name: "amount", + type: "u64", + }, + { + name: "decimals", + type: "u8", + }, + ], }, { name: "approveChecked", @@ -754,7 +881,16 @@ export const IDL: SplToken = { isSigner: true, }, ], - args: [], + args: [ + { + name: "amount", + type: "u64", + }, + { + name: "decimals", + type: "u8", + }, + ], }, { name: "mintToChecked", @@ -775,7 +911,16 @@ export const IDL: SplToken = { isSigner: false, }, ], - args: [], + args: [ + { + name: "amount", + type: "u64", + }, + { + name: "decimals", + type: "u8", + }, + ], }, { name: "burnChecked", @@ -796,7 +941,16 @@ export const IDL: SplToken = { isSigner: true, }, ], - args: [], + args: [ + { + name: "amount", + type: "u64", + }, + { + name: "decimals", + type: "u8", + }, + ], }, { name: "initializeAccount2", @@ -817,7 +971,12 @@ export const IDL: SplToken = { isSigner: false, }, ], - args: [], + args: [ + { + name: "authority", + type: "publicKey", + }, + ], }, { name: "syncNative", @@ -844,7 +1003,12 @@ export const IDL: SplToken = { isSigner: false, }, ], - args: [], + args: [ + { + name: "authority", + type: "publicKey", + }, + ], }, { name: "initializeMultisig2", @@ -855,7 +1019,12 @@ export const IDL: SplToken = { isSigner: false, }, ], - args: [], + args: [ + { + name: "m", + type: "u8", + }, + ], }, { name: "initializeMint2", @@ -866,7 +1035,22 @@ export const IDL: SplToken = { isSigner: false, }, ], - args: [], + args: [ + { + name: "decimals", + type: "u8", + }, + { + name: "mintAuthority", + type: "publicKey", + }, + { + name: "freezeAuthority", + type: { + coption: "publicKey", + }, + }, + ], }, ], }; From 17b82af6513577ec19fe3c897568f3b3736c0b68 Mon Sep 17 00:00:00 2001 From: Armani Ferrante Date: Sat, 8 Jan 2022 23:21:05 -0500 Subject: [PATCH 07/16] basic client working --- .../programs/spl-token/src/lib.rs | 1 + tests/custom-coder/tests/custom-coder.ts | 77 +++++++- ts/package.json | 3 - ts/src/coder/borsh/common.ts | 3 + ts/src/coder/spl-token/accounts.ts | 140 +++++++++++++-- ts/src/coder/spl-token/instruction.ts | 24 +-- ts/src/spl/token.ts | 166 +++++++++++++++++- ts/yarn.lock | 96 +--------- 8 files changed, 375 insertions(+), 135 deletions(-) diff --git a/tests/custom-coder/programs/spl-token/src/lib.rs b/tests/custom-coder/programs/spl-token/src/lib.rs index 4c12b95015..7c1ba7053e 100644 --- a/tests/custom-coder/programs/spl-token/src/lib.rs +++ b/tests/custom-coder/programs/spl-token/src/lib.rs @@ -6,6 +6,7 @@ declare_id!("FmpfPa1LHEYRbueNMnwNVd2JvyQ89GXGWdyZEXNNKV8w"); // // Note that we manually add the COption type to the IDL after // compiling. +// #[program] pub mod spl_token { use super::*; diff --git a/tests/custom-coder/tests/custom-coder.ts b/tests/custom-coder/tests/custom-coder.ts index 716cf25cf7..bd7e881802 100644 --- a/tests/custom-coder/tests/custom-coder.ts +++ b/tests/custom-coder/tests/custom-coder.ts @@ -1,15 +1,78 @@ //import * as anchor from '@project-serum/anchor'; //import { Program } from '@project-serum/anchor'; -import * as anchor from '../../../ts'; -import { Spl } from '../../../ts'; - -describe('custom-coder', () => { +import * as assert from "assert"; +import { SystemProgram, Keypair, SYSVAR_RENT_PUBKEY } from "@solana/web3.js"; +import { TOKEN_PROGRAM_ID } from "@solana/spl-token"; +import * as anchor from "../../../ts"; +import { Spl } from "../../../ts"; +describe("custom-coder", () => { // Configure the client to use the local cluster. anchor.setProvider(anchor.Provider.env()); - it('Is initialized!', async () => { - const program = Spl.token(); - console.log(program); + // Client. + const program = Spl.token(); + + // Constants. + const mintKeypair = Keypair.generate(); + const tokenKeypair = Keypair.generate(); + const rent = SYSVAR_RENT_PUBKEY; + + it("Creates a mint", async () => { + await program.rpc.initializeMint( + 6, + program.provider.wallet.publicKey, + null, + { + accounts: { + mint: mintKeypair.publicKey, + rent, + }, + signers: [mintKeypair], + preInstructions: [ + SystemProgram.createAccount({ + fromPubkey: program.provider.wallet.publicKey, + newAccountPubkey: mintKeypair.publicKey, + lamports: await program.provider.connection.getMinimumBalanceForRentExemption( + 82 + ), + space: 82, + programId: TOKEN_PROGRAM_ID, + }), + ], + } + ); + const mintAccount = await program.account.mint.fetch(mintKeypair.publicKey); + assert.ok( + mintAccount.mintAuthority.equals(program.provider.wallet.publicKey) + ); + console.log(mintAccount); + }); + + it("Creates a token account", async () => { + await program.rpc.initializeAccount({ + accounts: { + account: tokenKeypair.publicKey, + mint: mintKeypair.publicKey, + authority: program.provider.wallet.publicKey, + rent, + }, + signers: [tokenKeypair], + preInstructions: [ + SystemProgram.createAccount({ + fromPubkey: program.provider.wallet.publicKey, + newAccountPubkey: tokenKeypair.publicKey, + lamports: await program.provider.connection.getMinimumBalanceForRentExemption( + 165 + ), + space: 165, + programId: TOKEN_PROGRAM_ID, + }), + ], + }); + const token = await program.account.token.fetch(tokenKeypair.publicKey); + assert.ok(token.authority.equals(program.provider.wallet.publicKey)); + assert.ok(token.mint.equals(mintKeypair.publicKey)); + console.log("token", token); }); }); diff --git a/ts/package.json b/ts/package.json index 5146aa6e5d..bd3e05ab01 100644 --- a/ts/package.json +++ b/ts/package.json @@ -78,8 +78,5 @@ "tslib": "^2.3.1", "typedoc": "^0.22.10", "typescript": "^4.5.2" - }, - "optionalDependencies": { - "@solana/spl-token": "^0.1.8" } } diff --git a/ts/src/coder/borsh/common.ts b/ts/src/coder/borsh/common.ts index 38e4e3f24e..674999f147 100644 --- a/ts/src/coder/borsh/common.ts +++ b/ts/src/coder/borsh/common.ts @@ -76,6 +76,9 @@ function typeSize(idl: Idl, ty: IdlType): number { if ("option" in ty) { return 1 + typeSize(idl, ty.option); } + if ("coption" in ty) { + return 1 + typeSize(idl, ty.coption); + } if ("defined" in ty) { const filtered = idl.types?.filter((t) => t.name === ty.defined) ?? []; if (filtered.length !== 1) { diff --git a/ts/src/coder/spl-token/accounts.ts b/ts/src/coder/spl-token/accounts.ts index a974f7282d..46d65f4c0e 100644 --- a/ts/src/coder/spl-token/accounts.ts +++ b/ts/src/coder/spl-token/accounts.ts @@ -1,32 +1,136 @@ +import * as BufferLayout from "buffer-layout"; +import { PublicKey } from "@solana/web3.js"; import { AccountsCoder } from "../index.js"; import { Idl } from "../../idl.js"; export class SplTokenAccountsCoder implements AccountsCoder { - constructor(idl: Idl) { - // todo - } + constructor(_: Idl) {} - encode(accountName: A, account: T): Promise { - // todo - // @ts-ignore - return Buffer.from([]); + public async encode(accountName: A, account: T): Promise { + const buffer = Buffer.alloc(1000); // TODO: use a tighter buffer. + switch (accountName) { + case "Token": { + const len = TOKEN_ACCOUNT_LAYOUT.encode(account, buffer); + return buffer.slice(0, len); + } + case "Mint": { + const len = MINT_ACCOUNT_LAYOUT.encode(account, buffer); + return buffer.slice(0, len); + } + default: { + throw new Error(`Invalid account name: ${accountName}`); + } + } } - decode(accountName: A, ix: Buffer): T { - // todo - // @ts-ignore - return null; + public decode(accountName: A, ix: Buffer): T { + return this.decodeUnchecked(accountName, ix); } - decodeUnchecked(accountName: A, ix: Buffer): T { - // todo - // @ts-ignore - return null; + public decodeUnchecked(accountName: A, ix: Buffer): T { + switch (accountName) { + case "Token": { + return decodeTokenAccount(ix); + } + case "Mint": { + return decodeMintAccount(ix); + } + default: { + throw new Error(`Invalid account name: ${accountName}`); + } + } } - memcmp(accountName: A, appendData?: Buffer): any { - // todo - return null; + // TODO: this won't use the appendData. + public memcmp(accountName: A, _appendData?: Buffer): any { + switch (accountName) { + case "Token": { + return { + dataSize: 165, + }; + } + case "Mint": { + return { + dataSize: 82, + }; + } + default: { + throw new Error(`Invalid account name: ${accountName}`); + } + } } } + +// TODO: can probably clean this up by using a proper COption and PublicKey +// struct layout decoder/subclass. +function decodeTokenAccount(ix: Buffer): T { + const account = TOKEN_ACCOUNT_LAYOUT.decode(ix) as T; + // @ts-ignore + account.authority = new PublicKey(account.authority); + // @ts-ignore + account.mint = new PublicKey(account.mint); + // @ts-ignore + account.delegate = + // @ts-ignore + account.delegateOption === 1 ? new PublicKey(account.delegate) : null; + // @ts-ignore + account.closeAuthority = + // @ts-ignore + account.closeAuthorityOption === 1 + ? // @ts-ignore + new PublicKey(account.closeAuthority) + : null; + return account; +} + +function decodeMintAccount(ix: Buffer): T { + const account = MINT_ACCOUNT_LAYOUT.decode(ix) as T; + // @ts-ignore + account.mintAuthority = + // @ts-ignore + account.mintAuthorityOption === 1 + ? // @ts-ignore + new PublicKey(account.mintAuthority) + : null; + // @ts-ignore + account.freezeAuthority = + // @ts-ignore + account.freezeAuthorityOption === 1 + ? // @ts-ignore + new PublicKey(account.freezeAuthorityAuthority) + : null; + return account; +} + +const TOKEN_ACCOUNT_LAYOUT = BufferLayout.struct([ + publicKey("mint"), + publicKey("authority"), + uint64("amount"), + BufferLayout.u32("delegateOption"), + publicKey("delegate"), + BufferLayout.u8("state"), + BufferLayout.u32("isNativeOption"), + uint64("isNative"), + uint64("delegatedAmount"), + BufferLayout.u32("closeAuthorityOption"), + publicKey("closeAuthority"), +]); + +const MINT_ACCOUNT_LAYOUT = BufferLayout.struct([ + BufferLayout.u32("mintAuthorityOption"), + publicKey("mintAuthority"), + uint64("supply"), + BufferLayout.u8("decimals"), + BufferLayout.u8("isInitialized"), + BufferLayout.u32("freezeAuthorityOption"), + publicKey("freezeAuthority"), +]); + +function publicKey(property: string): any { + return BufferLayout.blob(32, property); +} + +function uint64(property: string): any { + return BufferLayout.blob(8, property); +} diff --git a/ts/src/coder/spl-token/instruction.ts b/ts/src/coder/spl-token/instruction.ts index 790ab6f2a1..0bd8ec15a5 100644 --- a/ts/src/coder/spl-token/instruction.ts +++ b/ts/src/coder/spl-token/instruction.ts @@ -5,7 +5,7 @@ import { InstructionCoder } from "../index.js"; import { Idl } from "../../idl.js"; export class SplTokenInstructionCoder implements InstructionCoder { - constructor(private idl: Idl) {} + constructor(_: Idl) {} encode(ixName: string, ix: any): Buffer { switch (camelCase(ixName)) { @@ -224,17 +224,6 @@ function encodeInitializeMint2({ }); } -function encodeData(instruction: any) { - let b = Buffer.alloc(instructionMaxSpan); - let span = LAYOUT.encode(instruction, b); - return b.slice(0, span); -} - -const instructionMaxSpan = Math.max( - // @ts-ignore - ...Object.values(LAYOUT.registry).map((r) => r.span) -); - const LAYOUT = BufferLayout.union(BufferLayout.u8("instruction")); LAYOUT.addVariant( 0, @@ -343,3 +332,14 @@ LAYOUT.addVariant( function publicKey(property: string): any { return BufferLayout.blob(32, property); } + +function encodeData(instruction: any): Buffer { + let b = Buffer.alloc(instructionMaxSpan); + let span = LAYOUT.encode(instruction, b); + return b.slice(0, span); +} + +const instructionMaxSpan = Math.max( + // @ts-ignore + ...Object.values(LAYOUT.registry).map((r) => r.span) +); diff --git a/ts/src/spl/token.ts b/ts/src/spl/token.ts index fab7a1d385..f4a5d30582 100644 --- a/ts/src/spl/token.ts +++ b/ts/src/spl/token.ts @@ -1,8 +1,12 @@ -import { TOKEN_PROGRAM_ID } from "@solana/spl-token"; +import { PublicKey } from "@solana/web3.js"; import { Program } from "../program/index.js"; import Provider from "../provider.js"; import { SplTokenCoder } from "../coder/spl-token/index.js"; +const TOKEN_PROGRAM_ID = new PublicKey( + "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" +); + export function program(provider?: Provider): Program { return new Program( IDL, @@ -533,6 +537,86 @@ export type SplToken = { ]; } ]; + accounts: [ + { + name: "Mint"; + type: { + kind: "struct"; + fields: [ + { + name: "mintAuthority"; + type: { + coption: "publicKey"; + }; + }, + { + name: "supply"; + type: "u64"; + }, + { + name: "decimals"; + type: "u8"; + }, + { + name: "isInitialized"; + type: "bool"; + }, + { + name: "freezeAuthority"; + type: { + coption: "publicKey"; + }; + } + ]; + }; + }, + { + name: "Token"; + type: { + kind: "struct"; + fields: [ + { + name: "mint"; + type: "publicKey"; + }, + { + name: "authority"; + type: "publicKey"; + }, + { + name: "amount"; + type: "u64"; + }, + { + name: "delegate"; + type: { + coption: "publicKey"; + }; + }, + { + name: "state"; + type: "u8"; + }, + { + name: "isNative"; + type: { + coption: "u64"; + }; + }, + { + name: "delegatedAmount"; + type: "u64"; + }, + { + name: "closeAuthority"; + type: { + coption: "publicKey"; + }; + } + ]; + }; + } + ]; }; export const IDL: SplToken = { @@ -1053,4 +1137,84 @@ export const IDL: SplToken = { ], }, ], + accounts: [ + { + name: "Mint", + type: { + kind: "struct", + fields: [ + { + name: "mintAuthority", + type: { + coption: "publicKey", + }, + }, + { + name: "supply", + type: "u64", + }, + { + name: "decimals", + type: "u8", + }, + { + name: "isInitialized", + type: "bool", + }, + { + name: "freezeAuthority", + type: { + coption: "publicKey", + }, + }, + ], + }, + }, + { + name: "Token", + type: { + kind: "struct", + fields: [ + { + name: "mint", + type: "publicKey", + }, + { + name: "authority", + type: "publicKey", + }, + { + name: "amount", + type: "u64", + }, + { + name: "delegate", + type: { + coption: "publicKey", + }, + }, + { + name: "state", + type: "u8", + }, + { + name: "isNative", + type: { + coption: "u64", + }, + }, + { + name: "delegatedAmount", + type: "u64", + }, + { + name: "closeAuthority", + type: { + coption: "publicKey", + }, + }, + ], + }, + }, + ], }; diff --git a/ts/yarn.lock b/ts/yarn.lock index 0eb2258f69..b4ed0e315a 100644 --- a/ts/yarn.lock +++ b/ts/yarn.lock @@ -420,13 +420,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/runtime@^7.10.5": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.16.7.tgz#03ff99f64106588c9c403c6ecb8c3bafbbdff1fa" - integrity sha512-9E9FJowqAsytyOY6LG+1KuueckRL+aQW+mKvXRXnuFGyRAyepJPmEo9vgMfXUA6O9u3IeEdv9MAkppFcaQwogQ== - dependencies: - regenerator-runtime "^0.13.4" - "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.5": version "7.14.0" resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.14.0.tgz" @@ -656,27 +649,6 @@ minimatch "^3.0.4" strip-json-comments "^3.1.1" -"@ethersproject/bytes@^5.5.0": - version "5.5.0" - resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.5.0.tgz#cb11c526de657e7b45d2e0f0246fb3b9d29a601c" - integrity sha512-ABvc7BHWhZU9PNM/tANm/Qx4ostPGadAuQzWTr3doklZOhDlmcBqclrQe/ZXUIj3K8wC28oYeuRa+A37tX9kog== - dependencies: - "@ethersproject/logger" "^5.5.0" - -"@ethersproject/logger@^5.5.0": - version "5.5.0" - resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.5.0.tgz#0c2caebeff98e10aefa5aef27d7441c7fd18cf5d" - integrity sha512-rIY/6WPm7T8n3qS2vuHTUBPdXHl+rGxWxW5okDfo9J4Z0+gRRZT0msvUdIJkE4/HS29GUMziwGaaKO2bWONBrg== - -"@ethersproject/sha2@^5.5.0": - version "5.5.0" - resolved "https://registry.yarnpkg.com/@ethersproject/sha2/-/sha2-5.5.0.tgz#a40a054c61f98fd9eee99af2c3cc6ff57ec24db7" - integrity sha512-B5UBoglbCiHamRVPLA110J+2uqsifpZaTmid2/7W5rbtYVz6gus6/hSDieIU/6gaKIDcOj12WnOdiymEUHIAOA== - dependencies: - "@ethersproject/bytes" "^5.5.0" - "@ethersproject/logger" "^5.5.0" - hash.js "1.1.7" - "@istanbuljs/load-nyc-config@^1.0.0": version "1.1.0" resolved "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz" @@ -955,25 +927,6 @@ dependencies: "@sinonjs/commons" "^1.7.0" -"@solana/buffer-layout@^3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@solana/buffer-layout/-/buffer-layout-3.0.0.tgz#b9353caeb9a1589cb77a1b145bcb1a9a93114326" - integrity sha512-MVdgAKKL39tEs0l8je0hKaXLQFb7Rdfb0Xg2LjFZd8Lfdazkg6xiS98uAZrEKvaoF3i4M95ei9RydkGIDMeo3w== - dependencies: - buffer "~6.0.3" - -"@solana/spl-token@^0.1.8": - version "0.1.8" - resolved "https://registry.yarnpkg.com/@solana/spl-token/-/spl-token-0.1.8.tgz#f06e746341ef8d04165e21fc7f555492a2a0faa6" - integrity sha512-LZmYCKcPQDtJgecvWOgT/cnoIQPWjdH+QVyzPcFvyDUiT0DiRjZaam4aqNUyvchLFhzgunv3d9xOoyE34ofdoQ== - dependencies: - "@babel/runtime" "^7.10.5" - "@solana/web3.js" "^1.21.0" - bn.js "^5.1.0" - buffer "6.0.3" - buffer-layout "^1.2.0" - dotenv "10.0.0" - "@solana/web3.js@^1.17.0": version "1.17.0" resolved "https://registry.npmjs.org/@solana/web3.js/-/web3.js-1.17.0.tgz" @@ -994,26 +947,6 @@ superstruct "^0.14.2" tweetnacl "^1.0.0" -"@solana/web3.js@^1.21.0": - version "1.31.0" - resolved "https://registry.yarnpkg.com/@solana/web3.js/-/web3.js-1.31.0.tgz#7a313d4c1a90b77f27ddbfe845a10d6883e06452" - integrity sha512-7nHHx1JNFnrt15e9y8m38I/EJCbaB+bFC3KZVM1+QhybCikFxGMtGA5r7PDC3GEL1R2RZA8yKoLkDKo3vzzqnw== - dependencies: - "@babel/runtime" "^7.12.5" - "@ethersproject/sha2" "^5.5.0" - "@solana/buffer-layout" "^3.0.0" - bn.js "^5.0.0" - borsh "^0.4.0" - bs58 "^4.0.1" - buffer "6.0.1" - cross-fetch "^3.1.4" - jayson "^3.4.4" - js-sha3 "^0.8.0" - rpc-websockets "^7.4.2" - secp256k1 "^4.0.2" - superstruct "^0.14.2" - tweetnacl "^1.0.0" - "@tootallnate/once@1": version "1.1.2" resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82" @@ -1545,11 +1478,6 @@ bn.js@^5.0.0, bn.js@^5.1.2: resolved "https://registry.npmjs.org/bn.js/-/bn.js-5.1.3.tgz" integrity sha512-GkTiFpjFtUzU9CbMeJ5iazkCzGL3jrhzerzZIuqLABjbwRaFt33I9tUdSNryIptM+RxDet6OKm2WnLXzW51KsQ== -bn.js@^5.1.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.0.tgz#358860674396c6997771a9d051fcc1b57d4ae002" - integrity sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw== - borsh@^0.4.0: version "0.4.0" resolved "https://registry.npmjs.org/borsh/-/borsh-0.4.0.tgz" @@ -1640,14 +1568,6 @@ buffer@6.0.1: base64-js "^1.3.1" ieee754 "^1.2.1" -buffer@6.0.3, buffer@~6.0.3: - version "6.0.3" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" - integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== - dependencies: - base64-js "^1.3.1" - ieee754 "^1.2.1" - bufferutil@^4.0.1: version "4.0.3" resolved "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.3.tgz" @@ -1916,13 +1836,6 @@ create-require@^1.1.0: resolved "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz" integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== -cross-fetch@^3.1.4: - version "3.1.4" - resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.4.tgz#9723f3a3a247bf8b89039f3a380a9244e8fa2f39" - integrity sha512-1eAtFWdIubi6T4XPy6ei9iUFoKpUkIF971QLN8lIvvvwueI65+Nw5haMNKUwfJxabqlIIDODJKGrQ66gxC0PbQ== - dependencies: - node-fetch "2.6.1" - cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3: version "7.0.3" resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz" @@ -2085,11 +1998,6 @@ dot-prop@^5.1.0: dependencies: is-obj "^2.0.0" -dotenv@10.0.0: - version "10.0.0" - resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-10.0.0.tgz#3d4227b8fb95f81096cdd2b66653fb2c7085ba81" - integrity sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q== - electron-to-chromium@^1.3.896: version "1.4.4" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.4.tgz#57311918524c1a26878c330537f967804d43788a" @@ -2654,7 +2562,7 @@ has@^1.0.3: dependencies: function-bind "^1.1.1" -hash.js@1.1.7, hash.js@^1.0.0, hash.js@^1.0.3: +hash.js@^1.0.0, hash.js@^1.0.3: version "1.1.7" resolved "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz" integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== @@ -3836,7 +3744,7 @@ node-addon-api@^2.0.0: resolved "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz" integrity sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA== -node-fetch@2.6.1, node-fetch@^2.6.1: +node-fetch@^2.6.1: version "2.6.1" resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz" integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw== From fa68c09823def64d696d132d0b2422ab8364711e Mon Sep 17 00:00:00 2001 From: Armani Ferrante Date: Sat, 8 Jan 2022 23:23:41 -0500 Subject: [PATCH 08/16] remove yarn lock --- tests/custom-coder/yarn.lock | 1197 ---------------------------------- tests/yarn.lock | 8 +- 2 files changed, 4 insertions(+), 1201 deletions(-) delete mode 100644 tests/custom-coder/yarn.lock diff --git a/tests/custom-coder/yarn.lock b/tests/custom-coder/yarn.lock deleted file mode 100644 index fc1e5181f9..0000000000 --- a/tests/custom-coder/yarn.lock +++ /dev/null @@ -1,1197 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@babel/runtime@^7.11.2", "@babel/runtime@^7.12.5": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.16.7.tgz#03ff99f64106588c9c403c6ecb8c3bafbbdff1fa" - integrity sha512-9E9FJowqAsytyOY6LG+1KuueckRL+aQW+mKvXRXnuFGyRAyepJPmEo9vgMfXUA6O9u3IeEdv9MAkppFcaQwogQ== - dependencies: - regenerator-runtime "^0.13.4" - -"@ethersproject/bytes@^5.5.0": - version "5.5.0" - resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.5.0.tgz#cb11c526de657e7b45d2e0f0246fb3b9d29a601c" - integrity sha512-ABvc7BHWhZU9PNM/tANm/Qx4ostPGadAuQzWTr3doklZOhDlmcBqclrQe/ZXUIj3K8wC28oYeuRa+A37tX9kog== - dependencies: - "@ethersproject/logger" "^5.5.0" - -"@ethersproject/logger@^5.5.0": - version "5.5.0" - resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.5.0.tgz#0c2caebeff98e10aefa5aef27d7441c7fd18cf5d" - integrity sha512-rIY/6WPm7T8n3qS2vuHTUBPdXHl+rGxWxW5okDfo9J4Z0+gRRZT0msvUdIJkE4/HS29GUMziwGaaKO2bWONBrg== - -"@ethersproject/sha2@^5.5.0": - version "5.5.0" - resolved "https://registry.yarnpkg.com/@ethersproject/sha2/-/sha2-5.5.0.tgz#a40a054c61f98fd9eee99af2c3cc6ff57ec24db7" - integrity sha512-B5UBoglbCiHamRVPLA110J+2uqsifpZaTmid2/7W5rbtYVz6gus6/hSDieIU/6gaKIDcOj12WnOdiymEUHIAOA== - dependencies: - "@ethersproject/bytes" "^5.5.0" - "@ethersproject/logger" "^5.5.0" - hash.js "1.1.7" - -"@project-serum/anchor@^0.20.0": - version "0.20.0" - resolved "https://registry.yarnpkg.com/@project-serum/anchor/-/anchor-0.20.0.tgz#547f5c0ff7e66809fa7118b2e3abd8087b5ec519" - integrity sha512-p1KOiqGBIbNsopMrSVoPwgxR1iPffsdjMNCOysahTPL9whX2CLX9HQCdopHjYaGl7+SdHRuXml6Wahk/wUmC8g== - dependencies: - "@project-serum/borsh" "^0.2.2" - "@solana/web3.js" "^1.17.0" - base64-js "^1.5.1" - bn.js "^5.1.2" - bs58 "^4.0.1" - buffer-layout "^1.2.2" - camelcase "^5.3.1" - crypto-hash "^1.3.0" - eventemitter3 "^4.0.7" - find "^0.3.0" - js-sha256 "^0.9.0" - pako "^2.0.3" - snake-case "^3.0.4" - toml "^3.0.0" - -"@project-serum/borsh@^0.2.2": - version "0.2.3" - resolved "https://registry.yarnpkg.com/@project-serum/borsh/-/borsh-0.2.3.tgz#1d705c5887484cb6a127dd5feff58e90cbfcb558" - integrity sha512-lH9zEYADZE3cxrgiFym8+jbUE3NM/LH+WOKYcUjs65CT10Q64Hv45bcAAa/phwYk4Tpz0uQ1x+ergFaAoGt67Q== - dependencies: - bn.js "^5.1.2" - buffer-layout "^1.2.0" - -"@solana/buffer-layout@^3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@solana/buffer-layout/-/buffer-layout-3.0.0.tgz#b9353caeb9a1589cb77a1b145bcb1a9a93114326" - integrity sha512-MVdgAKKL39tEs0l8je0hKaXLQFb7Rdfb0Xg2LjFZd8Lfdazkg6xiS98uAZrEKvaoF3i4M95ei9RydkGIDMeo3w== - dependencies: - buffer "~6.0.3" - -"@solana/web3.js@^1.17.0": - version "1.31.0" - resolved "https://registry.yarnpkg.com/@solana/web3.js/-/web3.js-1.31.0.tgz#7a313d4c1a90b77f27ddbfe845a10d6883e06452" - integrity sha512-7nHHx1JNFnrt15e9y8m38I/EJCbaB+bFC3KZVM1+QhybCikFxGMtGA5r7PDC3GEL1R2RZA8yKoLkDKo3vzzqnw== - dependencies: - "@babel/runtime" "^7.12.5" - "@ethersproject/sha2" "^5.5.0" - "@solana/buffer-layout" "^3.0.0" - bn.js "^5.0.0" - borsh "^0.4.0" - bs58 "^4.0.1" - buffer "6.0.1" - cross-fetch "^3.1.4" - jayson "^3.4.4" - js-sha3 "^0.8.0" - rpc-websockets "^7.4.2" - secp256k1 "^4.0.2" - superstruct "^0.14.2" - tweetnacl "^1.0.0" - -"@types/bn.js@^4.11.5": - version "4.11.6" - resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-4.11.6.tgz#c306c70d9358aaea33cd4eda092a742b9505967c" - integrity sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg== - dependencies: - "@types/node" "*" - -"@types/connect@^3.4.33": - version "3.4.35" - resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.35.tgz#5fcf6ae445e4021d1fc2219a4873cc73a3bb2ad1" - integrity sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ== - dependencies: - "@types/node" "*" - -"@types/express-serve-static-core@^4.17.9": - version "4.17.27" - resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.27.tgz#7a776191e47295d2a05962ecbb3a4ce97e38b401" - integrity sha512-e/sVallzUTPdyOTiqi8O8pMdBBphscvI6E4JYaKlja4Lm+zh7UFSSdW5VMkRbhDtmrONqOUHOXRguPsDckzxNA== - dependencies: - "@types/node" "*" - "@types/qs" "*" - "@types/range-parser" "*" - -"@types/json5@^0.0.29": - version "0.0.29" - resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" - integrity sha1-7ihweulOEdK4J7y+UnC86n8+ce4= - -"@types/lodash@^4.14.159": - version "4.14.178" - resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.178.tgz#341f6d2247db528d4a13ddbb374bcdc80406f4f8" - integrity sha512-0d5Wd09ItQWH1qFbEyQ7oTQ3GZrMfth5JkbN3EvTKLXcHLRDSXeLnlvlOn0wvxVIwK5o2M8JzP/OWz7T3NRsbw== - -"@types/mocha@^9.0.0": - version "9.0.0" - resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-9.0.0.tgz#3205bcd15ada9bc681ac20bef64e9e6df88fd297" - integrity sha512-scN0hAWyLVAvLR9AyW7HoFF5sJZglyBsbPuHO4fv7JRvfmPBMfp1ozWqOf/e4wwPNxezBZXRfWzMb6iFLgEVRA== - -"@types/node@*": - version "17.0.8" - resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.8.tgz#50d680c8a8a78fe30abe6906453b21ad8ab0ad7b" - integrity sha512-YofkM6fGv4gDJq78g4j0mMuGMkZVxZDgtU0JRdx6FgiJDG+0fY0GKVolOV8WqVmEhLCXkQRjwDdKyPxJp/uucg== - -"@types/node@^12.12.54": - version "12.20.41" - resolved "https://registry.yarnpkg.com/@types/node/-/node-12.20.41.tgz#81d7734c5257da9f04354bd9084a6ebbdd5198a5" - integrity sha512-f6xOqucbDirG7LOzedpvzjP3UTmHttRou3Mosx3vL9wr9AIQGhcPgVnqa8ihpZYnxyM1rxeNCvTyukPKZtq10Q== - -"@types/qs@*": - version "6.9.7" - resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.7.tgz#63bb7d067db107cc1e457c303bc25d511febf6cb" - integrity sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw== - -"@types/range-parser@*": - version "1.2.4" - resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.4.tgz#cd667bcfdd025213aafb7ca5915a932590acdcdc" - integrity sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw== - -"@types/ws@^7.4.4": - version "7.4.7" - resolved "https://registry.yarnpkg.com/@types/ws/-/ws-7.4.7.tgz#f7c390a36f7a0679aa69de2d501319f4f8d9b702" - integrity sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww== - dependencies: - "@types/node" "*" - -"@ungap/promise-all-settled@1.1.2": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz#aa58042711d6e3275dd37dc597e5d31e8c290a44" - integrity sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q== - -JSONStream@^1.3.5: - version "1.3.5" - resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.5.tgz#3208c1f08d3a4d99261ab64f92302bc15e111ca0" - integrity sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ== - dependencies: - jsonparse "^1.2.0" - through ">=2.2.7 <3" - -ansi-colors@4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" - integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== - -ansi-regex@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" - integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== - -ansi-styles@^4.0.0, ansi-styles@^4.1.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" - integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== - dependencies: - color-convert "^2.0.1" - -anymatch@~3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" - integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== - dependencies: - normalize-path "^3.0.0" - picomatch "^2.0.4" - -argparse@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" - integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== - -arrify@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" - integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0= - -assertion-error@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" - integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== - -balanced-match@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" - integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== - -base-x@^3.0.2: - version "3.0.9" - resolved "https://registry.yarnpkg.com/base-x/-/base-x-3.0.9.tgz#6349aaabb58526332de9f60995e548a53fe21320" - integrity sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ== - dependencies: - safe-buffer "^5.0.1" - -base64-js@^1.3.1, base64-js@^1.5.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" - integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== - -binary-extensions@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" - integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== - -bn.js@^4.11.9: - version "4.12.0" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" - integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== - -bn.js@^5.0.0, bn.js@^5.1.2: - version "5.2.0" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.0.tgz#358860674396c6997771a9d051fcc1b57d4ae002" - integrity sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw== - -borsh@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/borsh/-/borsh-0.4.0.tgz#9dd6defe741627f1315eac2a73df61421f6ddb9f" - integrity sha512-aX6qtLya3K0AkT66CmYWCCDr77qsE9arV05OmdFpmat9qu8Pg9J5tBUPDztAW5fNh/d/MyVG/OYziP52Ndzx1g== - dependencies: - "@types/bn.js" "^4.11.5" - bn.js "^5.0.0" - bs58 "^4.0.0" - text-encoding-utf-8 "^1.0.2" - -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -braces@~3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" - integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== - dependencies: - fill-range "^7.0.1" - -brorand@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" - integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= - -browser-stdout@1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" - integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== - -bs58@^4.0.0, bs58@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/bs58/-/bs58-4.0.1.tgz#be161e76c354f6f788ae4071f63f34e8c4f0a42a" - integrity sha1-vhYedsNU9veIrkBx9j806MTwpCo= - dependencies: - base-x "^3.0.2" - -buffer-from@^1.0.0, buffer-from@^1.1.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" - integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== - -buffer-layout@^1.2.0, buffer-layout@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/buffer-layout/-/buffer-layout-1.2.2.tgz#b9814e7c7235783085f9ca4966a0cfff112259d5" - integrity sha512-kWSuLN694+KTk8SrYvCqwP2WcgQjoRCiF5b4QDvkkz8EmgD+aWAIceGFKMIAdmF/pH+vpgNV3d3kAKorcdAmWA== - -buffer@6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.1.tgz#3cbea8c1463e5a0779e30b66d4c88c6ffa182ac2" - integrity sha512-rVAXBwEcEoYtxnHSO5iWyhzV/O1WMtkUYWlfdLS7FjU4PnSJJHEfHXi/uHPI5EwltmOA794gN3bm3/pzuctWjQ== - dependencies: - base64-js "^1.3.1" - ieee754 "^1.2.1" - -buffer@~6.0.3: - version "6.0.3" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" - integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== - dependencies: - base64-js "^1.3.1" - ieee754 "^1.2.1" - -bufferutil@^4.0.1: - version "4.0.6" - resolved "https://registry.yarnpkg.com/bufferutil/-/bufferutil-4.0.6.tgz#ebd6c67c7922a0e902f053e5d8be5ec850e48433" - integrity sha512-jduaYOYtnio4aIAyc6UbvPCVcgq7nYpVnucyxr6eCYg/Woad9Hf/oxxBRDnGGjPfjUm6j5O/uBWhIu4iLebFaw== - dependencies: - node-gyp-build "^4.3.0" - -camelcase@^5.3.1: - version "5.3.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" - integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== - -camelcase@^6.0.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" - integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== - -chai@^4.3.4: - version "4.3.4" - resolved "https://registry.yarnpkg.com/chai/-/chai-4.3.4.tgz#b55e655b31e1eac7099be4c08c21964fce2e6c49" - integrity sha512-yS5H68VYOCtN1cjfwumDSuzn/9c+yza4f3reKXlE5rUg7SFcCEy90gJvydNgOYtblyf4Zi6jIWRnXOgErta0KA== - dependencies: - assertion-error "^1.1.0" - check-error "^1.0.2" - deep-eql "^3.0.1" - get-func-name "^2.0.0" - pathval "^1.1.1" - type-detect "^4.0.5" - -chalk@^4.1.0: - version "4.1.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -check-error@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82" - integrity sha1-V00xLt2Iu13YkS6Sht1sCu1KrII= - -chokidar@3.5.2: - version "3.5.2" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.2.tgz#dba3976fcadb016f66fd365021d91600d01c1e75" - integrity sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ== - dependencies: - anymatch "~3.1.2" - braces "~3.0.2" - glob-parent "~5.1.2" - is-binary-path "~2.1.0" - is-glob "~4.0.1" - normalize-path "~3.0.0" - readdirp "~3.6.0" - optionalDependencies: - fsevents "~2.3.2" - -circular-json@^0.5.9: - version "0.5.9" - resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.5.9.tgz#932763ae88f4f7dead7a0d09c8a51a4743a53b1d" - integrity sha512-4ivwqHpIFJZBuhN3g/pEcdbnGUywkBblloGbkglyloVjjR3uT6tieI89MVOfbP2tHX5sgb01FuLgAOzebNlJNQ== - -cliui@^7.0.2: - version "7.0.4" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" - integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== - dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.0" - wrap-ansi "^7.0.0" - -color-convert@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" - integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== - dependencies: - color-name "~1.1.4" - -color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - -commander@^2.20.3: - version "2.20.3" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" - integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= - -cross-fetch@^3.1.4: - version "3.1.4" - resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.4.tgz#9723f3a3a247bf8b89039f3a380a9244e8fa2f39" - integrity sha512-1eAtFWdIubi6T4XPy6ei9iUFoKpUkIF971QLN8lIvvvwueI65+Nw5haMNKUwfJxabqlIIDODJKGrQ66gxC0PbQ== - dependencies: - node-fetch "2.6.1" - -crypto-hash@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/crypto-hash/-/crypto-hash-1.3.0.tgz#b402cb08f4529e9f4f09346c3e275942f845e247" - integrity sha512-lyAZ0EMyjDkVvz8WOeVnuCPvKVBXcMv1l5SVqO1yC7PzTwrD/pPje/BIRbWhMoPe436U+Y2nD7f5bFx0kt+Sbg== - -debug@4.3.2: - version "4.3.2" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.2.tgz#f0a49c18ac8779e31d4a0c6029dfb76873c7428b" - integrity sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw== - dependencies: - ms "2.1.2" - -decamelize@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837" - integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== - -deep-eql@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-3.0.1.tgz#dfc9404400ad1c8fe023e7da1df1c147c4b444df" - integrity sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw== - dependencies: - type-detect "^4.0.0" - -delay@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/delay/-/delay-5.0.0.tgz#137045ef1b96e5071060dd5be60bf9334436bd1d" - integrity sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw== - -diff@5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/diff/-/diff-5.0.0.tgz#7ed6ad76d859d030787ec35855f5b1daf31d852b" - integrity sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w== - -diff@^3.1.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" - integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA== - -dot-case@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/dot-case/-/dot-case-3.0.4.tgz#9b2b670d00a431667a8a75ba29cd1b98809ce751" - integrity sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w== - dependencies: - no-case "^3.0.4" - tslib "^2.0.3" - -elliptic@^6.5.2: - version "6.5.4" - resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" - integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== - dependencies: - bn.js "^4.11.9" - brorand "^1.1.0" - hash.js "^1.0.0" - hmac-drbg "^1.0.1" - inherits "^2.0.4" - minimalistic-assert "^1.0.1" - minimalistic-crypto-utils "^1.0.1" - -emoji-regex@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" - integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== - -es6-promise@^4.0.3: - version "4.2.8" - resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a" - integrity sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w== - -es6-promisify@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-5.0.0.tgz#5109d62f3e56ea967c4b63505aef08291c8a5203" - integrity sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM= - dependencies: - es6-promise "^4.0.3" - -escalade@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" - integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== - -escape-string-regexp@4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" - integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== - -eventemitter3@^4.0.7: - version "4.0.7" - resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" - integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== - -eyes@^0.1.8: - version "0.1.8" - resolved "https://registry.yarnpkg.com/eyes/-/eyes-0.1.8.tgz#62cf120234c683785d902348a800ef3e0cc20bc0" - integrity sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A= - -fill-range@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" - integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== - dependencies: - to-regex-range "^5.0.1" - -find-up@5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" - integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== - dependencies: - locate-path "^6.0.0" - path-exists "^4.0.0" - -find@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/find/-/find-0.3.0.tgz#4082e8fc8d8320f1a382b5e4f521b9bc50775cb8" - integrity sha512-iSd+O4OEYV/I36Zl8MdYJO0xD82wH528SaCieTVHhclgiYNe9y+yPKSwK+A7/WsmHL1EZ+pYUJBXWTL5qofksw== - dependencies: - traverse-chain "~0.1.0" - -flat@^5.0.2: - version "5.0.2" - resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" - integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= - -fsevents@~2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" - integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== - -get-caller-file@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" - integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== - -get-func-name@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41" - integrity sha1-6td0q+5y4gQJQzoGY2YCPdaIekE= - -glob-parent@~5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" - integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== - dependencies: - is-glob "^4.0.1" - -glob@7.1.7: - version "7.1.7" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90" - integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - -growl@1.10.5: - version "1.10.5" - resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" - integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA== - -has-flag@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" - integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== - -hash.js@1.1.7, hash.js@^1.0.0, hash.js@^1.0.3: - version "1.1.7" - resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" - integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== - dependencies: - inherits "^2.0.3" - minimalistic-assert "^1.0.1" - -he@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" - integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== - -hmac-drbg@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" - integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE= - dependencies: - hash.js "^1.0.3" - minimalistic-assert "^1.0.0" - minimalistic-crypto-utils "^1.0.1" - -ieee754@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" - integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2, inherits@^2.0.3, inherits@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -is-binary-path@~2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" - integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== - dependencies: - binary-extensions "^2.0.0" - -is-extglob@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" - integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= - -is-fullwidth-code-point@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" - integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== - -is-glob@^4.0.1, is-glob@~4.0.1: - version "4.0.3" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" - integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== - dependencies: - is-extglob "^2.1.1" - -is-number@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" - integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== - -is-plain-obj@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" - integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== - -is-unicode-supported@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" - integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= - -isomorphic-ws@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz#55fd4cd6c5e6491e76dc125938dd863f5cd4f2dc" - integrity sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w== - -jayson@^3.4.4: - version "3.6.6" - resolved "https://registry.yarnpkg.com/jayson/-/jayson-3.6.6.tgz#189984f624e398f831bd2be8e8c80eb3abf764a1" - integrity sha512-f71uvrAWTtrwoww6MKcl9phQTC+56AopLyEenWvKVAIMz+q0oVGj6tenLZ7Z6UiPBkJtKLj4kt0tACllFQruGQ== - dependencies: - "@types/connect" "^3.4.33" - "@types/express-serve-static-core" "^4.17.9" - "@types/lodash" "^4.14.159" - "@types/node" "^12.12.54" - "@types/ws" "^7.4.4" - JSONStream "^1.3.5" - commander "^2.20.3" - delay "^5.0.0" - es6-promisify "^5.0.0" - eyes "^0.1.8" - isomorphic-ws "^4.0.1" - json-stringify-safe "^5.0.1" - lodash "^4.17.20" - uuid "^8.3.2" - ws "^7.4.5" - -js-sha256@^0.9.0: - version "0.9.0" - resolved "https://registry.yarnpkg.com/js-sha256/-/js-sha256-0.9.0.tgz#0b89ac166583e91ef9123644bd3c5334ce9d0966" - integrity sha512-sga3MHh9sgQN2+pJ9VYZ+1LPwXOxuBJBA5nrR5/ofPfuiJBE2hnjsaN8se8JznOmGLN2p49Pe5U/ttafcs/apA== - -js-sha3@^0.8.0: - version "0.8.0" - resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.8.0.tgz#b9b7a5da73afad7dedd0f8c463954cbde6818840" - integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q== - -js-yaml@4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" - integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== - dependencies: - argparse "^2.0.1" - -json-stringify-safe@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" - integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= - -json5@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" - integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== - dependencies: - minimist "^1.2.0" - -jsonparse@^1.2.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" - integrity sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA= - -locate-path@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" - integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== - dependencies: - p-locate "^5.0.0" - -lodash@^4.17.20: - version "4.17.21" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" - integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== - -log-symbols@4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" - integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== - dependencies: - chalk "^4.1.0" - is-unicode-supported "^0.1.0" - -lower-case@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-2.0.2.tgz#6fa237c63dbdc4a82ca0fd882e4722dc5e634e28" - integrity sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg== - dependencies: - tslib "^2.0.3" - -make-error@^1.1.1: - version "1.3.6" - resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" - integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== - -minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" - integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== - -minimalistic-crypto-utils@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" - integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= - -minimatch@3.0.4, minimatch@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" - integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== - dependencies: - brace-expansion "^1.1.7" - -minimist@^1.2.0, minimist@^1.2.5: - version "1.2.5" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" - integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== - -mkdirp@^0.5.1: - version "0.5.5" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" - integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== - dependencies: - minimist "^1.2.5" - -mocha@^9.0.3: - version "9.1.3" - resolved "https://registry.yarnpkg.com/mocha/-/mocha-9.1.3.tgz#8a623be6b323810493d8c8f6f7667440fa469fdb" - integrity sha512-Xcpl9FqXOAYqI3j79pEtHBBnQgVXIhpULjGQa7DVb0Po+VzmSIK9kanAiWLHoRR/dbZ2qpdPshuXr8l1VaHCzw== - dependencies: - "@ungap/promise-all-settled" "1.1.2" - ansi-colors "4.1.1" - browser-stdout "1.3.1" - chokidar "3.5.2" - debug "4.3.2" - diff "5.0.0" - escape-string-regexp "4.0.0" - find-up "5.0.0" - glob "7.1.7" - growl "1.10.5" - he "1.2.0" - js-yaml "4.1.0" - log-symbols "4.1.0" - minimatch "3.0.4" - ms "2.1.3" - nanoid "3.1.25" - serialize-javascript "6.0.0" - strip-json-comments "3.1.1" - supports-color "8.1.1" - which "2.0.2" - workerpool "6.1.5" - yargs "16.2.0" - yargs-parser "20.2.4" - yargs-unparser "2.0.0" - -ms@2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - -ms@2.1.3: - version "2.1.3" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" - integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== - -nanoid@3.1.25: - version "3.1.25" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.25.tgz#09ca32747c0e543f0e1814b7d3793477f9c8e152" - integrity sha512-rdwtIXaXCLFAQbnfqDRnI6jaRHp9fTcYBjtFKE8eezcZ7LuLjhUaQGNeMXf1HmRoCH32CLz6XwX0TtxEOS/A3Q== - -no-case@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/no-case/-/no-case-3.0.4.tgz#d361fd5c9800f558551a8369fc0dcd4662b6124d" - integrity sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg== - dependencies: - lower-case "^2.0.2" - tslib "^2.0.3" - -node-addon-api@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-2.0.2.tgz#432cfa82962ce494b132e9d72a15b29f71ff5d32" - integrity sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA== - -node-fetch@2.6.1: - version "2.6.1" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052" - integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw== - -node-gyp-build@^4.2.0, node-gyp-build@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.3.0.tgz#9f256b03e5826150be39c764bf51e993946d71a3" - integrity sha512-iWjXZvmboq0ja1pUGULQBexmxq8CV4xBhX7VDOTbL7ZR4FOowwY/VOtRxBN/yKxmdGoIp4j5ysNT4u3S2pDQ3Q== - -normalize-path@^3.0.0, normalize-path@~3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" - integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== - -once@^1.3.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= - dependencies: - wrappy "1" - -p-limit@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" - integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== - dependencies: - yocto-queue "^0.1.0" - -p-locate@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" - integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== - dependencies: - p-limit "^3.0.2" - -pako@^2.0.3: - version "2.0.4" - resolved "https://registry.yarnpkg.com/pako/-/pako-2.0.4.tgz#6cebc4bbb0b6c73b0d5b8d7e8476e2b2fbea576d" - integrity sha512-v8tweI900AUkZN6heMU/4Uy4cXRc2AYNRggVmTR+dEncawDJgCdLMximOVA2p4qO57WMynangsfGRb5WD6L1Bg== - -path-exists@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" - integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== - -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= - -pathval@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.1.tgz#8534e77a77ce7ac5a2512ea21e0fdb8fcf6c3d8d" - integrity sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ== - -picomatch@^2.0.4, picomatch@^2.2.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" - integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== - -randombytes@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" - integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== - dependencies: - safe-buffer "^5.1.0" - -readdirp@~3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" - integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== - dependencies: - picomatch "^2.2.1" - -regenerator-runtime@^0.13.4: - version "0.13.9" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52" - integrity sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA== - -require-directory@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= - -rpc-websockets@^7.4.2: - version "7.4.16" - resolved "https://registry.yarnpkg.com/rpc-websockets/-/rpc-websockets-7.4.16.tgz#eb701cdef577d4357ba5f526d50e25f370396fac" - integrity sha512-0b7OVhutzwRIaYAtJo5tqtaQTWKfwAsKnaThOSOy+VkhVdleNUgb8eZnWSdWITRZZEigV5uPEIDr5KZe4DBrdQ== - dependencies: - "@babel/runtime" "^7.11.2" - circular-json "^0.5.9" - eventemitter3 "^4.0.7" - uuid "^8.3.0" - ws "^7.4.5" - optionalDependencies: - bufferutil "^4.0.1" - utf-8-validate "^5.0.2" - -safe-buffer@^5.0.1, safe-buffer@^5.1.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" - integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== - -secp256k1@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/secp256k1/-/secp256k1-4.0.2.tgz#15dd57d0f0b9fdb54ac1fa1694f40e5e9a54f4a1" - integrity sha512-UDar4sKvWAksIlfX3xIaQReADn+WFnHvbVujpcbr+9Sf/69odMwy2MUsz5CKLQgX9nsIyrjuxL2imVyoNHa3fg== - dependencies: - elliptic "^6.5.2" - node-addon-api "^2.0.0" - node-gyp-build "^4.2.0" - -serialize-javascript@6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8" - integrity sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag== - dependencies: - randombytes "^2.1.0" - -snake-case@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/snake-case/-/snake-case-3.0.4.tgz#4f2bbd568e9935abdfd593f34c691dadb49c452c" - integrity sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg== - dependencies: - dot-case "^3.0.4" - tslib "^2.0.3" - -source-map-support@^0.5.6: - version "0.5.21" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" - integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - -source-map@^0.6.0: - version "0.6.1" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" - integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== - -string-width@^4.1.0, string-width@^4.2.0: - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -strip-ansi@^6.0.0, strip-ansi@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -strip-bom@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" - integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= - -strip-json-comments@3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" - integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== - -superstruct@^0.14.2: - version "0.14.2" - resolved "https://registry.yarnpkg.com/superstruct/-/superstruct-0.14.2.tgz#0dbcdf3d83676588828f1cf5ed35cda02f59025b" - integrity sha512-nPewA6m9mR3d6k7WkZ8N8zpTWfenFH3q9pA2PkuiZxINr9DKB2+40wEQf0ixn8VaGuJ78AB6iWOtStI+/4FKZQ== - -supports-color@8.1.1: - version "8.1.1" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" - integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== - dependencies: - has-flag "^4.0.0" - -supports-color@^7.1.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" - integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== - dependencies: - has-flag "^4.0.0" - -text-encoding-utf-8@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/text-encoding-utf-8/-/text-encoding-utf-8-1.0.2.tgz#585b62197b0ae437e3c7b5d0af27ac1021e10d13" - integrity sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg== - -"through@>=2.2.7 <3": - version "2.3.8" - resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" - integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= - -to-regex-range@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" - integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== - dependencies: - is-number "^7.0.0" - -toml@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/toml/-/toml-3.0.0.tgz#342160f1af1904ec9d204d03a5d61222d762c5ee" - integrity sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w== - -traverse-chain@~0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/traverse-chain/-/traverse-chain-0.1.0.tgz#61dbc2d53b69ff6091a12a168fd7d433107e40f1" - integrity sha1-YdvC1Ttp/2CRoSoWj9fUMxB+QPE= - -ts-mocha@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/ts-mocha/-/ts-mocha-8.0.0.tgz#962d0fa12eeb6468aa1a6b594bb3bbc818da3ef0" - integrity sha512-Kou1yxTlubLnD5C3unlCVO7nh0HERTezjoVhVw/M5S1SqoUec0WgllQvPk3vzPMc6by8m6xD1uR1yRf8lnVUbA== - dependencies: - ts-node "7.0.1" - optionalDependencies: - tsconfig-paths "^3.5.0" - -ts-node@7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-7.0.1.tgz#9562dc2d1e6d248d24bc55f773e3f614337d9baf" - integrity sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw== - dependencies: - arrify "^1.0.0" - buffer-from "^1.1.0" - diff "^3.1.0" - make-error "^1.1.1" - minimist "^1.2.0" - mkdirp "^0.5.1" - source-map-support "^0.5.6" - yn "^2.0.0" - -tsconfig-paths@^3.5.0: - version "3.12.0" - resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.12.0.tgz#19769aca6ee8f6a1a341e38c8fa45dd9fb18899b" - integrity sha512-e5adrnOYT6zqVnWqZu7i/BQ3BnhzvGbjEjejFXO20lKIKpwTaupkCPgEfv4GZK1IBciJUEhYs3J3p75FdaTFVg== - dependencies: - "@types/json5" "^0.0.29" - json5 "^1.0.1" - minimist "^1.2.0" - strip-bom "^3.0.0" - -tslib@^2.0.3: - version "2.3.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.1.tgz#e8a335add5ceae51aa261d32a490158ef042ef01" - integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw== - -tweetnacl@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-1.0.3.tgz#ac0af71680458d8a6378d0d0d050ab1407d35596" - integrity sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw== - -type-detect@^4.0.0, type-detect@^4.0.5: - version "4.0.8" - resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" - integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== - -typescript@^4.3.5: - version "4.5.4" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.5.4.tgz#a17d3a0263bf5c8723b9c52f43c5084edf13c2e8" - integrity sha512-VgYs2A2QIRuGphtzFV7aQJduJ2gyfTljngLzjpfW9FoYZF6xuw1W0vW9ghCKLfcWrCFxK81CSGRAvS1pn4fIUg== - -utf-8-validate@^5.0.2: - version "5.0.8" - resolved "https://registry.yarnpkg.com/utf-8-validate/-/utf-8-validate-5.0.8.tgz#4a735a61661dbb1c59a0868c397d2fe263f14e58" - integrity sha512-k4dW/Qja1BYDl2qD4tOMB9PFVha/UJtxTc1cXYOe3WwA/2m0Yn4qB7wLMpJyLJ/7DR0XnTut3HsCSzDT4ZvKgA== - dependencies: - node-gyp-build "^4.3.0" - -uuid@^8.3.0, uuid@^8.3.2: - version "8.3.2" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" - integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== - -which@2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" - integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== - dependencies: - isexe "^2.0.0" - -workerpool@6.1.5: - version "6.1.5" - resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.1.5.tgz#0f7cf076b6215fd7e1da903ff6f22ddd1886b581" - integrity sha512-XdKkCK0Zqc6w3iTxLckiuJ81tiD/o5rBE/m+nXpRCB+/Sq4DqkfXZ/x0jW02DG1tGsfUGXbTJyZDP+eu67haSw== - -wrap-ansi@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -wrappy@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= - -ws@^7.4.5: - version "7.5.6" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.6.tgz#e59fc509fb15ddfb65487ee9765c5a51dec5fe7b" - integrity sha512-6GLgCqo2cy2A2rjCNFlxQS6ZljG/coZfZXclldI8FB/1G3CCI36Zd8xy2HrFVACi8tfk5XrgLQEk+P0Tnz9UcA== - -y18n@^5.0.5: - version "5.0.8" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" - integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== - -yargs-parser@20.2.4: - version "20.2.4" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54" - integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA== - -yargs-parser@^20.2.2: - version "20.2.9" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" - integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== - -yargs-unparser@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz#f131f9226911ae5d9ad38c432fe809366c2325eb" - integrity sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA== - dependencies: - camelcase "^6.0.0" - decamelize "^4.0.0" - flat "^5.0.2" - is-plain-obj "^2.1.0" - -yargs@16.2.0: - version "16.2.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" - integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== - dependencies: - cliui "^7.0.2" - escalade "^3.1.1" - get-caller-file "^2.0.5" - require-directory "^2.1.1" - string-width "^4.2.0" - y18n "^5.0.5" - yargs-parser "^20.2.2" - -yn@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/yn/-/yn-2.0.0.tgz#e5adabc8acf408f6385fc76495684c88e6af689a" - integrity sha1-5a2ryKz0CPY4X8dklWhMiOavaJo= - -yocto-queue@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" - integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== diff --git a/tests/yarn.lock b/tests/yarn.lock index 06b70a7019..69ce24aeb5 100644 --- a/tests/yarn.lock +++ b/tests/yarn.lock @@ -50,10 +50,10 @@ snake-case "^3.0.4" toml "^3.0.0" -"@project-serum/anchor@^0.19.0": - version "0.19.0" - resolved "https://registry.yarnpkg.com/@project-serum/anchor/-/anchor-0.19.0.tgz#79f1fbe7c3134860ccbfe458a0e09daf79644885" - integrity sha512-cs0LBmJOrL9eJ8MRNqitnzbpCT5QEzVdJmiIjfNV5YaGn1K9vISR7DtISj3Bdl3KBdLqii4CTw1mpHdi8iXUCg== +"@project-serum/anchor@^0.20.0": + version "0.20.0" + resolved "https://registry.yarnpkg.com/@project-serum/anchor/-/anchor-0.20.0.tgz#547f5c0ff7e66809fa7118b2e3abd8087b5ec519" + integrity sha512-p1KOiqGBIbNsopMrSVoPwgxR1iPffsdjMNCOysahTPL9whX2CLX9HQCdopHjYaGl7+SdHRuXml6Wahk/wUmC8g== dependencies: "@project-serum/borsh" "^0.2.2" "@solana/web3.js" "^1.17.0" From d27830aeb1e000a5b2987b62ff82580d4495f9a2 Mon Sep 17 00:00:00 2001 From: Armani Ferrante Date: Sat, 8 Jan 2022 23:25:29 -0500 Subject: [PATCH 09/16] specify coder iface --- ts/src/coder/spl-token/index.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ts/src/coder/spl-token/index.ts b/ts/src/coder/spl-token/index.ts index 34c2ff42c1..188b32b287 100644 --- a/ts/src/coder/spl-token/index.ts +++ b/ts/src/coder/spl-token/index.ts @@ -1,4 +1,5 @@ import { Idl } from "../../idl.js"; +import { Coder } from "../index.js"; import { SplTokenInstructionCoder } from "./instruction.js"; import { SplTokenStateCoder } from "./state.js"; import { SplTokenAccountsCoder } from "./accounts.js"; @@ -7,7 +8,7 @@ import { SplTokenEventsCoder } from "./events.js"; /** * Coder for the SPL token program. */ -export class SplTokenCoder { +export class SplTokenCoder implements Coder { readonly instruction: SplTokenInstructionCoder; readonly accounts: SplTokenAccountsCoder; readonly state: SplTokenStateCoder; From 395f7e4b2feca0a20e9815df045a23d5954847de Mon Sep 17 00:00:00 2001 From: Armani Ferrante Date: Sun, 9 Jan 2022 13:36:11 -0500 Subject: [PATCH 10/16] Properly encode/decode coption and u64s --- tests/custom-coder/tests/custom-coder.ts | 24 +++- ts/src/coder/borsh/accounts.ts | 18 ++- ts/src/coder/borsh/common.ts | 2 +- ts/src/coder/borsh/index.ts | 1 - ts/src/coder/index.ts | 3 +- ts/src/coder/spl-token/accounts.ts | 90 ++++---------- ts/src/coder/spl-token/buffer-layout.ts | 151 +++++++++++++++++++++++ ts/src/program/namespace/account.ts | 10 +- 8 files changed, 214 insertions(+), 85 deletions(-) create mode 100644 ts/src/coder/spl-token/buffer-layout.ts diff --git a/tests/custom-coder/tests/custom-coder.ts b/tests/custom-coder/tests/custom-coder.ts index bd7e881802..9dad49acdb 100644 --- a/tests/custom-coder/tests/custom-coder.ts +++ b/tests/custom-coder/tests/custom-coder.ts @@ -34,9 +34,9 @@ describe("custom-coder", () => { fromPubkey: program.provider.wallet.publicKey, newAccountPubkey: mintKeypair.publicKey, lamports: await program.provider.connection.getMinimumBalanceForRentExemption( - 82 + program.account.mint.size, ), - space: 82, + space: program.account.mint.size, programId: TOKEN_PROGRAM_ID, }), ], @@ -46,7 +46,12 @@ describe("custom-coder", () => { assert.ok( mintAccount.mintAuthority.equals(program.provider.wallet.publicKey) ); - console.log(mintAccount); + assert.ok( + mintAccount.freezeAuthority === null + ); + assert.ok(mintAccount.decimals === 6); + assert.ok(mintAccount.isInitialized); + assert.ok(mintAccount.supply.toNumber() === 0); }); it("Creates a token account", async () => { @@ -63,9 +68,9 @@ describe("custom-coder", () => { fromPubkey: program.provider.wallet.publicKey, newAccountPubkey: tokenKeypair.publicKey, lamports: await program.provider.connection.getMinimumBalanceForRentExemption( - 165 + program.account.token.size ), - space: 165, + space: program.account.token.size, programId: TOKEN_PROGRAM_ID, }), ], @@ -73,6 +78,13 @@ describe("custom-coder", () => { const token = await program.account.token.fetch(tokenKeypair.publicKey); assert.ok(token.authority.equals(program.provider.wallet.publicKey)); assert.ok(token.mint.equals(mintKeypair.publicKey)); - console.log("token", token); + assert.ok(token.amount.toNumber() === 0); + assert.ok(token.delegate === null); + assert.ok(token.state === 0); + assert.ok(token.isNative === null); + assert.ok(token.delegatedAmount.toNumber() === 0); + assert.ok(token.closeAuthority === null); }); + + }); diff --git a/ts/src/coder/borsh/accounts.ts b/ts/src/coder/borsh/accounts.ts index b236351295..c542624955 100644 --- a/ts/src/coder/borsh/accounts.ts +++ b/ts/src/coder/borsh/accounts.ts @@ -1,11 +1,12 @@ import bs58 from "bs58"; import { Buffer } from "buffer"; import { Layout } from "buffer-layout"; -import { Idl } from "../../idl.js"; -import { IdlCoder } from "./idl.js"; -import { sha256 } from "js-sha256"; import camelcase from "camelcase"; +import { sha256 } from "js-sha256"; +import { Idl, IdlTypeDef } from "../../idl.js"; +import { IdlCoder } from "./idl.js"; import { AccountsCoder } from "../index.js"; +import { accountSize } from "./common.js"; /** * Number of bytes of the account discriminator. @@ -22,6 +23,11 @@ export class BorshAccountsCoder */ private accountLayouts: Map; + /** + * IDL whose acconts will be coded. + */ + private idl: Idl; + public constructor(idl: Idl) { if (idl.accounts === undefined) { this.accountLayouts = new Map(); @@ -75,6 +81,12 @@ export class BorshAccountsCoder }; } + public size(idlAccount: IdlTypeDef): number { + return ( + ACCOUNT_DISCRIMINATOR_SIZE + (accountSize(this.idl, idlAccount) ?? 0) + ); + } + /** * Calculates and returns a unique 8 byte discriminator prepended to all anchor accounts. * diff --git a/ts/src/coder/borsh/common.ts b/ts/src/coder/borsh/common.ts index 674999f147..80fa3d6787 100644 --- a/ts/src/coder/borsh/common.ts +++ b/ts/src/coder/borsh/common.ts @@ -77,7 +77,7 @@ function typeSize(idl: Idl, ty: IdlType): number { return 1 + typeSize(idl, ty.option); } if ("coption" in ty) { - return 1 + typeSize(idl, ty.coption); + return 4 + typeSize(idl, ty.coption); } if ("defined" in ty) { const filtered = idl.types?.filter((t) => t.name === ty.defined) ?? []; diff --git a/ts/src/coder/borsh/index.ts b/ts/src/coder/borsh/index.ts index 79bcbe51af..bbfdaa2498 100644 --- a/ts/src/coder/borsh/index.ts +++ b/ts/src/coder/borsh/index.ts @@ -6,7 +6,6 @@ import { BorshStateCoder } from "./state.js"; import { sighash } from "./common.js"; import { Coder } from "../index.js"; -export { accountSize } from "./common.js"; export { BorshInstructionCoder } from "./instruction.js"; export { BorshAccountsCoder, ACCOUNT_DISCRIMINATOR_SIZE } from "./accounts.js"; export { BorshEventCoder, eventDiscriminator } from "./event.js"; diff --git a/ts/src/coder/index.ts b/ts/src/coder/index.ts index 2e132a076d..6256103a03 100644 --- a/ts/src/coder/index.ts +++ b/ts/src/coder/index.ts @@ -1,4 +1,4 @@ -import { IdlEvent } from "../idl.js"; +import { IdlEvent, IdlTypeDef } from "../idl.js"; import { Event } from "../program/event.js"; export * from "./borsh/index.js"; @@ -39,6 +39,7 @@ export interface AccountsCoder { decode(accountName: A, ix: Buffer): T; decodeUnchecked(accountName: A, ix: Buffer): T; memcmp(accountName: A, appendData?: Buffer): any; + size(idlAccount: IdlTypeDef): number; } export interface InstructionCoder { diff --git a/ts/src/coder/spl-token/accounts.ts b/ts/src/coder/spl-token/accounts.ts index 46d65f4c0e..67802acd3d 100644 --- a/ts/src/coder/spl-token/accounts.ts +++ b/ts/src/coder/spl-token/accounts.ts @@ -1,20 +1,22 @@ import * as BufferLayout from "buffer-layout"; -import { PublicKey } from "@solana/web3.js"; +import { publicKey, uint64, coption, bool } from "./buffer-layout.js"; import { AccountsCoder } from "../index.js"; -import { Idl } from "../../idl.js"; +import { Idl, IdlTypeDef } from "../../idl.js"; +import { accountSize } from "../borsh/common"; export class SplTokenAccountsCoder implements AccountsCoder { - constructor(_: Idl) {} + constructor(private idl: Idl) {} public async encode(accountName: A, account: T): Promise { - const buffer = Buffer.alloc(1000); // TODO: use a tighter buffer. switch (accountName) { case "Token": { + const buffer = Buffer.alloc(165); const len = TOKEN_ACCOUNT_LAYOUT.encode(account, buffer); return buffer.slice(0, len); } case "Mint": { + const buffer = Buffer.alloc(82); const len = MINT_ACCOUNT_LAYOUT.encode(account, buffer); return buffer.slice(0, len); } @@ -60,77 +62,35 @@ export class SplTokenAccountsCoder } } } -} -// TODO: can probably clean this up by using a proper COption and PublicKey -// struct layout decoder/subclass. -function decodeTokenAccount(ix: Buffer): T { - const account = TOKEN_ACCOUNT_LAYOUT.decode(ix) as T; - // @ts-ignore - account.authority = new PublicKey(account.authority); - // @ts-ignore - account.mint = new PublicKey(account.mint); - // @ts-ignore - account.delegate = - // @ts-ignore - account.delegateOption === 1 ? new PublicKey(account.delegate) : null; - // @ts-ignore - account.closeAuthority = - // @ts-ignore - account.closeAuthorityOption === 1 - ? // @ts-ignore - new PublicKey(account.closeAuthority) - : null; - return account; + public size(idlAccount: IdlTypeDef): number { + return accountSize(this.idl, idlAccount) ?? 0; + } } function decodeMintAccount(ix: Buffer): T { - const account = MINT_ACCOUNT_LAYOUT.decode(ix) as T; - // @ts-ignore - account.mintAuthority = - // @ts-ignore - account.mintAuthorityOption === 1 - ? // @ts-ignore - new PublicKey(account.mintAuthority) - : null; - // @ts-ignore - account.freezeAuthority = - // @ts-ignore - account.freezeAuthorityOption === 1 - ? // @ts-ignore - new PublicKey(account.freezeAuthorityAuthority) - : null; - return account; + return MINT_ACCOUNT_LAYOUT.decode(ix) as T; +} + +function decodeTokenAccount(ix: Buffer): T { + return TOKEN_ACCOUNT_LAYOUT.decode(ix) as T; } +const MINT_ACCOUNT_LAYOUT = BufferLayout.struct([ + coption(publicKey(), "mintAuthority"), + uint64("supply"), + BufferLayout.u8("decimals"), + bool("isInitialized"), + coption(publicKey(), "freezeAuthority"), +]); + const TOKEN_ACCOUNT_LAYOUT = BufferLayout.struct([ publicKey("mint"), publicKey("authority"), uint64("amount"), - BufferLayout.u32("delegateOption"), - publicKey("delegate"), + coption(publicKey(), "delegate"), BufferLayout.u8("state"), - BufferLayout.u32("isNativeOption"), - uint64("isNative"), + coption(uint64(), "isNative"), uint64("delegatedAmount"), - BufferLayout.u32("closeAuthorityOption"), - publicKey("closeAuthority"), -]); - -const MINT_ACCOUNT_LAYOUT = BufferLayout.struct([ - BufferLayout.u32("mintAuthorityOption"), - publicKey("mintAuthority"), - uint64("supply"), - BufferLayout.u8("decimals"), - BufferLayout.u8("isInitialized"), - BufferLayout.u32("freezeAuthorityOption"), - publicKey("freezeAuthority"), + coption(publicKey(), "closeAuthority"), ]); - -function publicKey(property: string): any { - return BufferLayout.blob(32, property); -} - -function uint64(property: string): any { - return BufferLayout.blob(8, property); -} diff --git a/ts/src/coder/spl-token/buffer-layout.ts b/ts/src/coder/spl-token/buffer-layout.ts new file mode 100644 index 0000000000..1abfb20370 --- /dev/null +++ b/ts/src/coder/spl-token/buffer-layout.ts @@ -0,0 +1,151 @@ +import BN from "bn.js"; +import * as BufferLayout from "buffer-layout"; +import { Layout } from "buffer-layout"; +import { PublicKey } from "@solana/web3.js"; + +export function uint64(property?: string): Layout { + return new WrappedLayout( + BufferLayout.blob(8), + (b: Buffer) => u64.fromBuffer(b), + (n: u64) => n.toBuffer(), + property + ); +} + +export function bool(property?: string): Layout { + return new WrappedLayout(BufferLayout.u8(), decodeBool, encodeBool, property); +} + +export function publicKey(property?: string): Layout { + return new WrappedLayout( + BufferLayout.blob(32), + (b: Buffer) => new PublicKey(b), + (key: PublicKey) => key.toBuffer(), + property + ); +} + +export function coption( + layout: Layout, + property?: string +): Layout { + return new COptionLayout(layout, property); +} + +class WrappedLayout extends Layout { + layout: Layout; + decoder: (data: T) => U; + encoder: (src: U) => T; + + constructor( + layout: Layout, + decoder: (data: T) => U, + encoder: (src: U) => T, + property?: string + ) { + super(layout.span, property); + this.layout = layout; + this.decoder = decoder; + this.encoder = encoder; + } + + decode(b: Buffer, offset?: number): U { + return this.decoder(this.layout.decode(b, offset)); + } + + encode(src: U, b: Buffer, offset?: number): number { + return this.layout.encode(this.encoder(src), b, offset); + } + + getSpan(b: Buffer, offset?: number): number { + return this.layout.getSpan(b, offset); + } +} + +export class COptionLayout extends Layout { + layout: Layout; + discriminator: Layout; + + constructor(layout: Layout, property?: string) { + super(-1, property); + this.layout = layout; + this.discriminator = BufferLayout.u32(); + } + + encode(src: T | null, b: Buffer, offset = 0): number { + if (src === null || src === undefined) { + return this.discriminator.encode(0, b, offset); + } + this.discriminator.encode(1, b, offset); + return this.layout.encode(src, b, offset + 4) + 4; + } + + decode(b: Buffer, offset = 0): T | null { + const discriminator = b[offset]; + if (discriminator === 0) { + return null; + } else if (discriminator === 1) { + return this.layout.decode(b, offset + 4); + } + throw new Error("Invalid option " + this.property); + } + + getSpan(b: Buffer, offset = 0): number { + const discriminator = b[offset]; + if (discriminator === 0) { + return 1; + } else if (discriminator === 1) { + return this.layout.getSpan(b, offset + 4) + 4; + } + throw new Error("Invalid option " + this.property); + } +} + +function decodeBool(value: number): boolean { + if (value === 0) { + return false; + } else if (value === 1) { + return true; + } + throw new Error("Invalid bool: " + value); +} + +function encodeBool(value: boolean): number { + return value ? 1 : 0; +} + +export class u64 extends BN { + /** + * Convert to Buffer representation + */ + toBuffer(): Buffer { + const a = super.toArray().reverse(); + const b = Buffer.from(a); + if (b.length === 8) { + return b; + } + if (b.length >= 8) { + throw new Error("u64 too large"); + } + + const zeroPad = Buffer.alloc(8); + b.copy(zeroPad); + return zeroPad; + } + + /** + * Construct a u64 from Buffer representation + */ + static fromBuffer(buffer: Buffer): u64 { + if (buffer.length !== 8) { + throw new Error(`Invalid buffer length: ${buffer.length}`); + } + return new u64( + [...buffer] + .reverse() + .map((i) => `00${i.toString(16)}`.slice(-2)) + .join(""), + 16 + ); + } +} diff --git a/ts/src/program/namespace/account.ts b/ts/src/program/namespace/account.ts index a2d12a35fc..69341c58f7 100644 --- a/ts/src/program/namespace/account.ts +++ b/ts/src/program/namespace/account.ts @@ -11,12 +11,7 @@ import { } from "@solana/web3.js"; import Provider, { getProvider } from "../../provider.js"; import { Idl, IdlTypeDef } from "../../idl.js"; -import { - ACCOUNT_DISCRIMINATOR_SIZE, - accountSize, - Coder, - BorshCoder, -} from "../../coder/index.js"; +import { Coder, BorshCoder } from "../../coder/index.js"; import { Subscription, Address, translateAddress } from "../common.js"; import { AllAccountsMap, IdlTypes, TypeDef } from "./types.js"; import * as pubkeyUtil from "../../utils/pubkey.js"; @@ -126,8 +121,7 @@ export class AccountClient< this._programId = programId; this._provider = provider ?? getProvider(); this._coder = coder ?? new BorshCoder(idl); - this._size = - ACCOUNT_DISCRIMINATOR_SIZE + (accountSize(idl, idlAccount) ?? 0); + this._size = this._coder.accounts.size(idlAccount); } /** From 62f3e0811e7cb45b047108d1320615be1387a992 Mon Sep 17 00:00:00 2001 From: Armani Ferrante Date: Sun, 9 Jan 2022 14:12:30 -0500 Subject: [PATCH 11/16] Token test working as desired --- .../programs/spl-token/src/lib.rs | 4 +- tests/custom-coder/tests/custom-coder.ts | 123 ++++++++++++------ ts/src/coder/borsh/accounts.ts | 2 +- ts/src/coder/borsh/index.ts | 5 - ts/src/coder/borsh/instruction.ts | 11 +- ts/src/coder/{borsh => }/common.ts | 21 +-- ts/src/coder/spl-token/accounts.ts | 2 +- ts/src/coder/spl-token/instruction.ts | 6 +- ts/src/spl/token.ts | 18 ++- 9 files changed, 121 insertions(+), 71 deletions(-) rename ts/src/coder/{borsh => }/common.ts (80%) diff --git a/tests/custom-coder/programs/spl-token/src/lib.rs b/tests/custom-coder/programs/spl-token/src/lib.rs index 7c1ba7053e..fdd834c3c0 100644 --- a/tests/custom-coder/programs/spl-token/src/lib.rs +++ b/tests/custom-coder/programs/spl-token/src/lib.rs @@ -48,7 +48,7 @@ pub mod spl_token { Ok(()) } - pub fn mint_to(ctx: Context) -> ProgramResult { + pub fn mint_to(ctx: Context, amount: u64) -> ProgramResult { Ok(()) } @@ -250,7 +250,7 @@ pub struct MintToChecked<'info> { mint: AccountInfo<'info>, #[account(mut)] to: AccountInfo<'info>, - authority: AccountInfo<'info>, + authority: Signer<'info>, } #[derive(Accounts)] diff --git a/tests/custom-coder/tests/custom-coder.ts b/tests/custom-coder/tests/custom-coder.ts index 9dad49acdb..1a2d3561a2 100644 --- a/tests/custom-coder/tests/custom-coder.ts +++ b/tests/custom-coder/tests/custom-coder.ts @@ -1,8 +1,8 @@ //import * as anchor from '@project-serum/anchor'; //import { Program } from '@project-serum/anchor'; import * as assert from "assert"; -import { SystemProgram, Keypair, SYSVAR_RENT_PUBKEY } from "@solana/web3.js"; -import { TOKEN_PROGRAM_ID } from "@solana/spl-token"; +import BN from "bn.js"; +import { Keypair, SYSVAR_RENT_PUBKEY } from "@solana/web3.js"; import * as anchor from "../../../ts"; import { Spl } from "../../../ts"; @@ -15,7 +15,8 @@ describe("custom-coder", () => { // Constants. const mintKeypair = Keypair.generate(); - const tokenKeypair = Keypair.generate(); + const aliceTokenKeypair = Keypair.generate(); + const bobTokenKeypair = Keypair.generate(); const rent = SYSVAR_RENT_PUBKEY; it("Creates a mint", async () => { @@ -30,15 +31,7 @@ describe("custom-coder", () => { }, signers: [mintKeypair], preInstructions: [ - SystemProgram.createAccount({ - fromPubkey: program.provider.wallet.publicKey, - newAccountPubkey: mintKeypair.publicKey, - lamports: await program.provider.connection.getMinimumBalanceForRentExemption( - program.account.mint.size, - ), - space: program.account.mint.size, - programId: TOKEN_PROGRAM_ID, - }), + await program.account.mint.createInstruction(mintKeypair), ], } ); @@ -46,45 +39,101 @@ describe("custom-coder", () => { assert.ok( mintAccount.mintAuthority.equals(program.provider.wallet.publicKey) ); - assert.ok( - mintAccount.freezeAuthority === null - ); - assert.ok(mintAccount.decimals === 6); - assert.ok(mintAccount.isInitialized); - assert.ok(mintAccount.supply.toNumber() === 0); + assert.ok(mintAccount.freezeAuthority === null); + assert.ok(mintAccount.decimals === 6); + assert.ok(mintAccount.isInitialized); + assert.ok(mintAccount.supply.toNumber() === 0); }); - it("Creates a token account", async () => { + it("Creates a token account for alice", async () => { await program.rpc.initializeAccount({ accounts: { - account: tokenKeypair.publicKey, + account: aliceTokenKeypair.publicKey, mint: mintKeypair.publicKey, authority: program.provider.wallet.publicKey, rent, }, - signers: [tokenKeypair], + signers: [aliceTokenKeypair], preInstructions: [ - SystemProgram.createAccount({ - fromPubkey: program.provider.wallet.publicKey, - newAccountPubkey: tokenKeypair.publicKey, - lamports: await program.provider.connection.getMinimumBalanceForRentExemption( - program.account.token.size - ), - space: program.account.token.size, - programId: TOKEN_PROGRAM_ID, - }), + await program.account.token.createInstruction(aliceTokenKeypair), ], }); - const token = await program.account.token.fetch(tokenKeypair.publicKey); + const token = await program.account.token.fetch( + aliceTokenKeypair.publicKey + ); assert.ok(token.authority.equals(program.provider.wallet.publicKey)); assert.ok(token.mint.equals(mintKeypair.publicKey)); - assert.ok(token.amount.toNumber() === 0); - assert.ok(token.delegate === null); - assert.ok(token.state === 0); - assert.ok(token.isNative === null); - assert.ok(token.delegatedAmount.toNumber() === 0); - assert.ok(token.closeAuthority === null); + assert.ok(token.amount.toNumber() === 0); + assert.ok(token.delegate === null); + assert.ok(token.state === 0); + assert.ok(token.isNative === null); + assert.ok(token.delegatedAmount.toNumber() === 0); + assert.ok(token.closeAuthority === null); }); + it("Mints a token to alice", async () => { + await program.rpc.mintTo(new BN(2), { + accounts: { + mint: mintKeypair.publicKey, + to: aliceTokenKeypair.publicKey, + authority: program.provider.wallet.publicKey, + }, + }); + + const token = await program.account.token.fetch( + aliceTokenKeypair.publicKey + ); + const mint = await program.account.mint.fetch(mintKeypair.publicKey); + assert.ok(token.amount.toNumber() === 2); + assert.ok(mint.supply.toNumber() === 2); + }); + it("Creates a token for bob", async () => { + await program.rpc.initializeAccount({ + accounts: { + account: bobTokenKeypair.publicKey, + mint: mintKeypair.publicKey, + authority: program.provider.wallet.publicKey, + rent, + }, + signers: [bobTokenKeypair], + preInstructions: [ + await program.account.token.createInstruction(bobTokenKeypair), + ], + }); + }); + + it("Transfer a token from alice to bob", async () => { + await program.rpc.transfer(new BN(1), { + accounts: { + source: aliceTokenKeypair.publicKey, + destination: bobTokenKeypair.publicKey, + authority: program.provider.wallet.publicKey, + }, + }); + const aliceToken = await program.account.token.fetch( + aliceTokenKeypair.publicKey + ); + const bobToken = await program.account.token.fetch( + bobTokenKeypair.publicKey + ); + assert.ok(aliceToken.amount.toNumber() === 1); + assert.ok(bobToken.amount.toNumber() === 1); + }); + + it("Alice burns a token", async () => { + await program.rpc.burn(new BN(1), { + accounts: { + source: aliceTokenKeypair.publicKey, + mint: mintKeypair.publicKey, + authority: program.provider.wallet.publicKey, + }, + }); + const aliceToken = await program.account.token.fetch( + aliceTokenKeypair.publicKey + ); + const mint = await program.account.mint.fetch(mintKeypair.publicKey); + assert.ok(aliceToken.amount.toNumber() === 0); + assert.ok(mint.supply.toNumber() === 1); + }); }); diff --git a/ts/src/coder/borsh/accounts.ts b/ts/src/coder/borsh/accounts.ts index c542624955..210f9b5e17 100644 --- a/ts/src/coder/borsh/accounts.ts +++ b/ts/src/coder/borsh/accounts.ts @@ -6,7 +6,7 @@ import { sha256 } from "js-sha256"; import { Idl, IdlTypeDef } from "../../idl.js"; import { IdlCoder } from "./idl.js"; import { AccountsCoder } from "../index.js"; -import { accountSize } from "./common.js"; +import { accountSize } from "../common.js"; /** * Number of bytes of the account discriminator. diff --git a/ts/src/coder/borsh/index.ts b/ts/src/coder/borsh/index.ts index bbfdaa2498..4b84fd2ede 100644 --- a/ts/src/coder/borsh/index.ts +++ b/ts/src/coder/borsh/index.ts @@ -3,7 +3,6 @@ import { BorshInstructionCoder } from "./instruction.js"; import { BorshAccountsCoder } from "./accounts.js"; import { BorshEventCoder } from "./event.js"; import { BorshStateCoder } from "./state.js"; -import { sighash } from "./common.js"; import { Coder } from "../index.js"; export { BorshInstructionCoder } from "./instruction.js"; @@ -44,8 +43,4 @@ export class BorshCoder implements Coder { this.state = new BorshStateCoder(idl); } } - - public sighash(nameSpace: string, ixName: string): Buffer { - return sighash(nameSpace, ixName); - } } diff --git a/ts/src/coder/borsh/instruction.ts b/ts/src/coder/borsh/instruction.ts index 7f09c06906..224ef1937e 100644 --- a/ts/src/coder/borsh/instruction.ts +++ b/ts/src/coder/borsh/instruction.ts @@ -2,6 +2,8 @@ import bs58 from "bs58"; import { Buffer } from "buffer"; import { Layout } from "buffer-layout"; import camelCase from "camelcase"; +import { snakeCase } from "snake-case"; +import { sha256 } from "js-sha256"; import * as borsh from "@project-serum/borsh"; import { AccountMeta, PublicKey } from "@solana/web3.js"; import { @@ -19,7 +21,6 @@ import { IdlAccounts, } from "../../idl.js"; import { IdlCoder } from "./idl.js"; -import { sighash } from "./common.js"; import { InstructionCoder } from "../index.js"; /** @@ -380,3 +381,11 @@ function sentenceCase(field: string): string { const result = field.replace(/([A-Z])/g, " $1"); return result.charAt(0).toUpperCase() + result.slice(1); } + +// Not technically sighash, since we don't include the arguments, as Rust +// doesn't allow function overloading. +function sighash(nameSpace: string, ixName: string): Buffer { + let name = snakeCase(ixName); + let preimage = `${nameSpace}:${name}`; + return Buffer.from(sha256.digest(preimage)).slice(0, 8); +} diff --git a/ts/src/coder/borsh/common.ts b/ts/src/coder/common.ts similarity index 80% rename from ts/src/coder/borsh/common.ts rename to ts/src/coder/common.ts index 80fa3d6787..8b6e26f989 100644 --- a/ts/src/coder/borsh/common.ts +++ b/ts/src/coder/common.ts @@ -1,14 +1,5 @@ -import { Buffer } from "buffer"; -import { snakeCase } from "snake-case"; -import { sha256 } from "js-sha256"; -import { - Idl, - IdlField, - IdlTypeDef, - IdlEnumVariant, - IdlType, -} from "../../idl.js"; -import { IdlError } from "../../error.js"; +import { Idl, IdlField, IdlTypeDef, IdlEnumVariant, IdlType } from "../idl.js"; +import { IdlError } from "../error.js"; export function accountSize(idl: Idl, idlAccount: IdlTypeDef): number { if (idlAccount.type.kind === "enum") { @@ -96,11 +87,3 @@ function typeSize(idl: Idl, ty: IdlType): number { throw new Error(`Invalid type ${JSON.stringify(ty)}`); } } - -// Not technically sighash, since we don't include the arguments, as Rust -// doesn't allow function overloading. -export function sighash(nameSpace: string, ixName: string): Buffer { - let name = snakeCase(ixName); - let preimage = `${nameSpace}:${name}`; - return Buffer.from(sha256.digest(preimage)).slice(0, 8); -} diff --git a/ts/src/coder/spl-token/accounts.ts b/ts/src/coder/spl-token/accounts.ts index 67802acd3d..a73311f255 100644 --- a/ts/src/coder/spl-token/accounts.ts +++ b/ts/src/coder/spl-token/accounts.ts @@ -2,7 +2,7 @@ import * as BufferLayout from "buffer-layout"; import { publicKey, uint64, coption, bool } from "./buffer-layout.js"; import { AccountsCoder } from "../index.js"; import { Idl, IdlTypeDef } from "../../idl.js"; -import { accountSize } from "../borsh/common"; +import { accountSize } from "../common"; export class SplTokenAccountsCoder implements AccountsCoder { diff --git a/ts/src/coder/spl-token/instruction.ts b/ts/src/coder/spl-token/instruction.ts index 0bd8ec15a5..06dfe017f2 100644 --- a/ts/src/coder/spl-token/instruction.ts +++ b/ts/src/coder/spl-token/instruction.ts @@ -261,7 +261,11 @@ LAYOUT.addVariant( ]), "setAuthority" ); -LAYOUT.addVariant(7, BufferLayout.struct([]), "mintTo"); +LAYOUT.addVariant( + 7, + BufferLayout.struct([BufferLayout.nu64("amount")]), + "mintTo" +); LAYOUT.addVariant( 8, BufferLayout.struct([BufferLayout.nu64("amount")]), diff --git a/ts/src/spl/token.ts b/ts/src/spl/token.ts index f4a5d30582..eefc83670e 100644 --- a/ts/src/spl/token.ts +++ b/ts/src/spl/token.ts @@ -215,7 +215,12 @@ export type SplToken = { isSigner: true; } ]; - args: []; + args: [ + { + name: "amount"; + type: "u64"; + } + ]; }, { name: "burn"; @@ -392,7 +397,7 @@ export type SplToken = { { name: "authority"; isMut: false; - isSigner: false; + isSigner: true; } ]; args: [ @@ -815,7 +820,12 @@ export const IDL: SplToken = { isSigner: true, }, ], - args: [], + args: [ + { + name: "amount", + type: "u64", + }, + ], }, { name: "burn", @@ -992,7 +1002,7 @@ export const IDL: SplToken = { { name: "authority", isMut: false, - isSigner: false, + isSigner: true, }, ], args: [ From d446c8a9968d42caacea6ceafaaf61a5f818725e Mon Sep 17 00:00:00 2001 From: Armani Ferrante Date: Sun, 9 Jan 2022 14:17:16 -0500 Subject: [PATCH 12/16] lint --- tests/custom-coder/migrations/deploy.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/custom-coder/migrations/deploy.ts b/tests/custom-coder/migrations/deploy.ts index 325cf3d0ec..5e3df0dc30 100644 --- a/tests/custom-coder/migrations/deploy.ts +++ b/tests/custom-coder/migrations/deploy.ts @@ -9,4 +9,4 @@ module.exports = async function (provider) { anchor.setProvider(provider); // Add your deploy script here. -} +}; From 055915802a998c1570416909d8810da4cbce63ed Mon Sep 17 00:00:00 2001 From: Armani Ferrante Date: Sun, 9 Jan 2022 14:54:25 -0500 Subject: [PATCH 13/16] update --- tests/custom-coder/tests/custom-coder.ts | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/tests/custom-coder/tests/custom-coder.ts b/tests/custom-coder/tests/custom-coder.ts index 1a2d3561a2..addfd2185c 100644 --- a/tests/custom-coder/tests/custom-coder.ts +++ b/tests/custom-coder/tests/custom-coder.ts @@ -1,10 +1,8 @@ -//import * as anchor from '@project-serum/anchor'; -//import { Program } from '@project-serum/anchor'; +import * as anchor from "@project-serum/anchor"; +import { Spl } from "@project-serum/anchor"; import * as assert from "assert"; import BN from "bn.js"; import { Keypair, SYSVAR_RENT_PUBKEY } from "@solana/web3.js"; -import * as anchor from "../../../ts"; -import { Spl } from "../../../ts"; describe("custom-coder", () => { // Configure the client to use the local cluster. From 632f05be893a9f31aca72e419b438368b6b1601d Mon Sep 17 00:00:00 2001 From: Armani Ferrante Date: Sun, 9 Jan 2022 15:06:54 -0500 Subject: [PATCH 14/16] set idl var --- ts/src/coder/borsh/accounts.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/ts/src/coder/borsh/accounts.ts b/ts/src/coder/borsh/accounts.ts index 210f9b5e17..b12a13ddce 100644 --- a/ts/src/coder/borsh/accounts.ts +++ b/ts/src/coder/borsh/accounts.ts @@ -38,6 +38,7 @@ export class BorshAccountsCoder }); this.accountLayouts = new Map(layouts); + this.idl = idl; } public async encode(accountName: A, account: T): Promise { From e9f18ef04b17d5103a9117ab1d24af26feb66e84 Mon Sep 17 00:00:00 2001 From: Armani Ferrante Date: Sun, 9 Jan 2022 20:46:35 -0500 Subject: [PATCH 15/16] Delete .gitignore --- tests/custom-coder/.gitignore | 6 ------ 1 file changed, 6 deletions(-) delete mode 100644 tests/custom-coder/.gitignore diff --git a/tests/custom-coder/.gitignore b/tests/custom-coder/.gitignore deleted file mode 100644 index 51448d4dab..0000000000 --- a/tests/custom-coder/.gitignore +++ /dev/null @@ -1,6 +0,0 @@ - -.anchor -.DS_Store -target -**/*.rs.bk -node_modules From a81075de11c7465bc634373dc3b7f78f65cba885 Mon Sep 17 00:00:00 2001 From: Armani Ferrante Date: Sun, 9 Jan 2022 21:09:22 -0500 Subject: [PATCH 16/16] Changelog --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index d5a599e76b..dbb8fc3e2b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -21,6 +21,10 @@ incremented for features. * lang: Allow repr overrides for zero copy accounts ([#1273](https://github.com/project-serum/anchor/pull/1273)). +### Breaking + +* ts: `Coder` is now an interface and the existing class has been renamed to `BorshCoder`. This change allows the generation of Anchor clients for non anchor programs ([#1259](https://github.com/project-serum/anchor/pull/1259/files)). + ## [0.20.0] - 2022-01-06 ### Fixes