diff --git a/.changeset/five-socks-melt.md b/.changeset/five-socks-melt.md new file mode 100644 index 0000000..a9eeb72 --- /dev/null +++ b/.changeset/five-socks-melt.md @@ -0,0 +1,7 @@ +--- +"@solanafm/explorer-kit": patch +"@solanafm/explorer-kit-server": patch +"@solanafm/explorer-kit-idls": patch +--- + +feat: token extensions full supoprt till v1 diff --git a/packages/explorerkit-idls/src/idls/LocalIdlRepository.ts b/packages/explorerkit-idls/src/idls/LocalIdlRepository.ts index 641e249..96768c9 100644 --- a/packages/explorerkit-idls/src/idls/LocalIdlRepository.ts +++ b/packages/explorerkit-idls/src/idls/LocalIdlRepository.ts @@ -22,6 +22,7 @@ import { StakeIDL, StakePoolIDL, SystemIDL, + Token2022_235377525_IDL, Token2022IDL, TokenIDL, VoteIDL, @@ -63,7 +64,13 @@ export const IdlRepository = new Map | null>([ ], ["BPFLoaderUpgradeab1e11111111111111111111111", new Map([[0, BPFLoaderUpgradeableIDL]])], ["TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA", new Map([[0, TokenIDL]])], - ["TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb", new Map([[0, Token2022IDL]])], + [ + "TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb", + new Map([ + [220601744, Token2022IDL], + [235377525, Token2022_235377525_IDL], + ]), + ], ["namesLPneVptA9Z5rqUDD9tMTWEJwofgaYwp8cawRkX", new Map([[0, NameServiceIDL]])], ["SPoo1Ku8WFXoNDMHPsrGSTSG1Y47rzgn41SLUNakuHy", new Map([[0, StakePoolIDL]])], ["ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL", new Map([[0, AssociatedTokenIDL]])], diff --git a/packages/explorerkit-idls/src/idls/shank/index.ts b/packages/explorerkit-idls/src/idls/shank/index.ts index 038c365..4f089e8 100644 --- a/packages/explorerkit-idls/src/idls/shank/index.ts +++ b/packages/explorerkit-idls/src/idls/shank/index.ts @@ -15,7 +15,8 @@ export { AssociatedTokenIDL } from "./spl/associated-token-program"; export { NameServiceIDL } from "./spl/name-service"; export { StakePoolIDL } from "./spl/stake-pool"; export { TokenIDL } from "./spl/token"; -export { Token2022IDL } from "./spl/token-v2"; +export { Token2022IDL } from "./spl/token-extensions/token-v2"; +export { Token2022_235377525_IDL } from "./spl/token-extensions/token-v2-235377525"; export { ClockIDL } from "./sysvar/clock"; export { EpochScheduleIDL } from "./sysvar/epoch-schedule"; export { FeesIDL } from "./sysvar/fees"; diff --git a/packages/explorerkit-idls/src/idls/shank/spl/token-extensions/token-v2-235377525.ts b/packages/explorerkit-idls/src/idls/shank/spl/token-extensions/token-v2-235377525.ts new file mode 100644 index 0000000..eb4f7c6 --- /dev/null +++ b/packages/explorerkit-idls/src/idls/shank/spl/token-extensions/token-v2-235377525.ts @@ -0,0 +1,1826 @@ +import { Idl } from "@solanafm/kinobi-lite"; + +export const Token2022_235377525_IDL: Idl = { + version: "1.0.0", + name: "spl-token-2022", + 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", + prefix: "u8", + }, + }, + ], + discriminant: { + type: "u8", + value: 0, + }, + }, + { + name: "initializeAccount", + accounts: [ + { + name: "accountToInitialize", + isMut: true, + isSigner: false, + }, + { + name: "mint", + isMut: false, + isSigner: false, + }, + { + name: "owner", + isMut: false, + isSigner: false, + }, + { + name: "rent", + isMut: false, + isSigner: false, + }, + ], + args: [], + discriminant: { + type: "u8", + value: 1, + }, + }, + { + name: "initializeMultisig", + accounts: [ + { + name: "multisig", + isMut: true, + isSigner: false, + }, + { + name: "rent", + isMut: false, + isSigner: false, + }, + { + name: "signer1", + isMut: false, + isSigner: false, + }, + { + name: "signer2", + isMut: false, + isSigner: false, + }, + { + name: "signer3", + isMut: false, + isSigner: false, + }, + { + name: "signer4", + isMut: false, + isSigner: false, + }, + { + name: "signer5", + isMut: false, + isSigner: false, + }, + { + name: "signer6", + isMut: false, + isSigner: false, + }, + { + name: "signer7", + isMut: false, + isSigner: false, + }, + { + name: "signer8", + isMut: false, + isSigner: false, + }, + { + name: "signer9", + isMut: false, + isSigner: false, + }, + { + name: "signer10", + isMut: false, + isSigner: false, + }, + { + name: "signer11", + isMut: false, + isSigner: false, + }, + ], + args: [ + { + name: "noOfSignersRequired", + type: "u8", + }, + ], + discriminant: { + type: "u8", + value: 2, + }, + }, + { + name: "transfer", + accounts: [ + { + name: "source", + isMut: true, + isSigner: false, + }, + { + name: "destination", + isMut: true, + isSigner: false, + }, + { + name: "authority", + isMut: false, + isSigner: true, + }, + { + name: "signers", + isMut: false, + isSigner: true, + }, + ], + args: [ + { + name: "amount", + type: "u64", + }, + ], + discriminant: { + type: "u8", + value: 3, + }, + }, + { + name: "approve", + accounts: [ + { + name: "source", + isMut: true, + isSigner: false, + }, + { + name: "delegate", + isMut: false, + isSigner: false, + }, + { + name: "owner", + isMut: false, + isSigner: true, + }, + { + name: "signers", + isMut: false, + isSigner: true, + }, + ], + args: [ + { + name: "amount", + type: "u64", + }, + ], + discriminant: { + type: "u8", + value: 4, + }, + }, + { + name: "revoke", + accounts: [ + { + name: "source", + isMut: true, + isSigner: false, + }, + { + name: "owner", + isMut: false, + isSigner: true, + }, + { + name: "signers", + isMut: false, + isSigner: true, + }, + ], + args: [], + discriminant: { + type: "u8", + value: 5, + }, + }, + { + name: "setAuthority", + accounts: [ + { + name: "mint", + isMut: true, + isSigner: false, + }, + { + name: "currentAuthority", + isMut: false, + isSigner: true, + }, + { + name: "signers", + isMut: false, + isSigner: true, + }, + ], + args: [ + { + name: "authorityType", + type: { + defined: "AuthorityType", + }, + }, + { + name: "newAuthority", + type: { + coption: "publicKey", + prefix: "u8", + }, + }, + ], + discriminant: { + type: "u8", + value: 6, + }, + }, + { + name: "mintTo", + accounts: [ + { + name: "mint", + isMut: true, + isSigner: false, + }, + { + name: "mintTo", + isMut: true, + isSigner: false, + }, + { + name: "mintAuthority", + isMut: false, + isSigner: true, + }, + { + name: "signers", + isMut: false, + isSigner: true, + }, + ], + args: [ + { + name: "amount", + type: "u64", + }, + ], + discriminant: { + type: "u8", + value: 7, + }, + }, + { + name: "burn", + accounts: [ + { + name: "burnAccount", + isMut: true, + isSigner: false, + }, + { + name: "mint", + isMut: true, + isSigner: false, + }, + { + name: "owner", + isMut: false, + isSigner: true, + }, + { + name: "signers", + isMut: false, + isSigner: true, + }, + ], + args: [ + { + name: "amount", + type: "u64", + }, + ], + discriminant: { + type: "u8", + value: 8, + }, + }, + { + name: "closeAccount", + accounts: [ + { + name: "closeAccount", + isMut: true, + isSigner: false, + }, + { + name: "destination", + isMut: true, + isSigner: false, + }, + { + name: "owner", + isMut: false, + isSigner: true, + }, + { + name: "signers", + isMut: false, + isSigner: true, + }, + ], + args: [], + discriminant: { + type: "u8", + value: 9, + }, + }, + { + name: "freezeAccount", + accounts: [ + { + name: "freezeAccount", + isMut: true, + isSigner: false, + }, + { + name: "mint", + isMut: false, + isSigner: false, + }, + { + name: "owner", + isMut: false, + isSigner: true, + }, + { + name: "signers", + isMut: false, + isSigner: true, + }, + ], + args: [], + discriminant: { + type: "u8", + value: 10, + }, + }, + { + name: "thawAccount", + accounts: [ + { + name: "thawAccount", + isMut: true, + isSigner: false, + }, + { + name: "tokenMint", + isMut: false, + isSigner: false, + }, + { + name: "owner", + isMut: false, + isSigner: true, + }, + { + name: "signers", + isMut: false, + isSigner: true, + }, + ], + args: [], + discriminant: { + type: "u8", + value: 11, + }, + }, + { + name: "transferChecked", + accounts: [ + { + name: "source", + isMut: true, + isSigner: false, + }, + { + name: "tokenMint", + isMut: false, + isSigner: false, + }, + { + name: "destination", + isMut: true, + isSigner: false, + }, + { + name: "owner", + isMut: false, + isSigner: true, + }, + { + name: "signers", + isMut: false, + isSigner: true, + }, + ], + args: [ + { + name: "amount", + type: "u64", + }, + { + name: "decimals", + type: "u8", + }, + ], + discriminant: { + type: "u8", + value: 12, + }, + }, + { + name: "approveChecked", + accounts: [ + { + name: "source", + isMut: true, + isSigner: false, + }, + { + name: "tokenMint", + isMut: false, + isSigner: false, + }, + { + name: "delegate", + isMut: false, + isSigner: false, + }, + { + name: "owner", + isMut: false, + isSigner: true, + }, + { + name: "signers", + isMut: false, + isSigner: true, + }, + ], + args: [ + { + name: "amount", + type: "u64", + }, + { + name: "decimals", + type: "u8", + }, + ], + discriminant: { + type: "u8", + value: 13, + }, + }, + { + name: "mintToChecked", + accounts: [ + { + name: "tokenMint", + isMut: true, + isSigner: false, + }, + { + name: "mintTo", + isMut: true, + isSigner: false, + }, + { + name: "mintAuthority", + isMut: false, + isSigner: true, + }, + { + name: "signers", + isMut: false, + isSigner: true, + }, + ], + args: [ + { + name: "amount", + type: "u64", + }, + { + name: "decimals", + type: "u8", + }, + ], + discriminant: { + type: "u8", + value: 14, + }, + }, + { + name: "burnChecked", + accounts: [ + { + name: "burnAccount", + isMut: true, + isSigner: false, + }, + { + name: "tokenMint", + isMut: true, + isSigner: false, + }, + { + name: "owner", + isMut: false, + isSigner: true, + }, + { + name: "signers", + isMut: false, + isSigner: true, + }, + ], + args: [ + { + name: "amount", + type: "u64", + }, + { + name: "decimals", + type: "u8", + }, + ], + discriminant: { + type: "u8", + value: 15, + }, + }, + { + name: "initializeAccount2", + accounts: [ + { + name: "initializeAccount", + isMut: true, + isSigner: false, + }, + { + name: "associatedMint", + isMut: false, + isSigner: false, + }, + { + name: "rent", + isMut: false, + isSigner: false, + }, + ], + args: [ + { + name: "owner", + type: "publicKey", + }, + ], + discriminant: { + type: "u8", + value: 16, + }, + }, + { + name: "syncNative", + accounts: [ + { + name: "nativeTokenAccount", + isMut: true, + isSigner: false, + }, + ], + args: [], + discriminant: { + type: "u8", + value: 17, + }, + }, + { + name: "initializeAccount3", + accounts: [ + { + name: "initializeAccount", + isMut: true, + isSigner: false, + }, + { + name: "associatedMint", + isMut: false, + isSigner: false, + }, + ], + args: [ + { + name: "owner", + type: "publicKey", + }, + ], + discriminant: { + type: "u8", + value: 18, + }, + }, + { + name: "initializeMultisig2", + accounts: [ + { + name: "initializeAccount", + isMut: true, + isSigner: false, + }, + { + name: "signer1", + isMut: false, + isSigner: false, + }, + { + name: "signer2", + isMut: false, + isSigner: false, + }, + { + name: "signer3", + isMut: false, + isSigner: false, + }, + { + name: "signer4", + isMut: false, + isSigner: false, + }, + { + name: "signer5", + isMut: false, + isSigner: false, + }, + { + name: "signer6", + isMut: false, + isSigner: false, + }, + { + name: "signer7", + isMut: false, + isSigner: false, + }, + { + name: "signer8", + isMut: false, + isSigner: false, + }, + { + name: "signer9", + isMut: false, + isSigner: false, + }, + { + name: "signer10", + isMut: false, + isSigner: false, + }, + { + name: "signer11", + isMut: false, + isSigner: false, + }, + ], + args: [ + { + name: "noOfSignersRequired", + type: "u8", + }, + ], + discriminant: { + type: "u8", + value: 19, + }, + }, + { + name: "initializeMint2", + accounts: [ + { + name: "mint", + isMut: true, + isSigner: false, + }, + ], + args: [ + { + name: "decimals", + type: "u8", + }, + { + name: "mintAuthority", + type: "publicKey", + }, + { + name: "freezeAuthority", + type: { + coption: "publicKey", + prefix: "u8", + }, + }, + ], + discriminant: { + type: "u8", + value: 20, + }, + }, + { + name: "getAccountDataSize", + accounts: [ + { + name: "mint", + isMut: false, + isSigner: false, + }, + ], + args: [ + { + name: "extensionType", + type: { + defined: "ExtensionTypeArray", + }, + }, + ], + discriminant: { + type: "u8", + value: 21, + }, + }, + { + name: "initializeImmutableOwner", + accounts: [ + { + name: "initializeAccount", + isMut: true, + isSigner: false, + }, + ], + args: [], + discriminant: { + type: "u8", + value: 22, + }, + }, + { + name: "amountToUiAmount", + accounts: [ + { + name: "mint", + isMut: false, + isSigner: false, + }, + ], + args: [ + { + name: "amount", + type: "u64", + }, + ], + discriminant: { + type: "u8", + value: 23, + }, + }, + { + name: "uiAmountToAmount", + accounts: [ + { + name: "mint", + isMut: false, + isSigner: false, + }, + ], + args: [ + { + name: "uiAmount", + type: "string", + }, + ], + discriminant: { + type: "u8", + value: 24, + }, + }, + { + name: "initializeMintCloseAuthority", + accounts: [ + { + name: "mint", + isMut: true, + isSigner: false, + }, + ], + args: [ + { + name: "closeAuthority", + type: { + coption: "publicKey", + prefix: "u8", + }, + }, + ], + discriminant: { + type: "u8", + value: 25, + }, + }, + // This part onwards is new from token-2022 + { + name: "transferFeeExtension", + accounts: [], + args: [], + discriminant: { + type: "u8", + value: 26, + }, + }, + { + name: "confidentialTransferExtension", + accounts: [], + args: [], + discriminant: { + type: "u8", + value: 27, + }, + }, + { + name: "defaultAccountStateExtension", + accounts: [], + args: [], + discriminant: { + type: "u8", + value: 28, + }, + }, + { + name: "reallocate", + accounts: [ + { + name: "reallocatedAccount", + isMut: true, + isSigner: false, + }, + { + name: "payer", + isMut: true, + isSigner: true, + }, + { + name: "systemProgram", + isMut: false, + isSigner: false, + }, + { + name: "owner", + isMut: false, + isSigner: true, + }, + { + name: "signers", + isMut: false, + isSigner: true, + }, + ], + args: [ + { + name: "extensionType", + type: { + defined: "ExtensionTypeArray", + }, + }, + ], + discriminant: { + type: "u8", + value: 29, + }, + }, + { + name: "memoTransferExtension", + accounts: [], + args: [], + discriminant: { + type: "u8", + value: 30, + }, + }, + { + name: "createNativeMint", + accounts: [ + { + name: "fundingAccount", + isMut: true, + isSigner: true, + }, + { + name: "mint", + isMut: true, + isSigner: false, + }, + { + name: "fundingAccount", + isMut: false, + isSigner: false, + }, + ], + args: [], + discriminant: { + type: "u8", + value: 31, + }, + }, + { + name: "initializeNonTransferableMint", + accounts: [ + { + name: "mint", + isMut: true, + isSigner: false, + }, + ], + args: [], + discriminant: { + type: "u8", + value: 32, + }, + }, + { + name: "interestBearingMintExtension", + accounts: [], + args: [], + discriminant: { + type: "u8", + value: 33, + }, + }, + { + name: "cpiGuardExtension", + accounts: [], + args: [], + discriminant: { + type: "u8", + value: 34, + }, + }, + { + name: "initializePermanentDelegate", + accounts: [ + { + name: "mint", + isMut: true, + isSigner: false, + }, + ], + args: [ + { + name: "delegate", + type: "publicKey", + }, + ], + discriminant: { + type: "u8", + value: 35, + }, + }, + { + name: "transferHookExtension", + accounts: [], + args: [], + discriminant: { + type: "u8", + value: 36, + }, + }, + { + name: "confidentialTransferFeeExtension", + accounts: [], + args: [], + discriminant: { + type: "u8", + value: 37, + }, + }, + { + name: "withdrawExcessLamports", + accounts: [ + { + name: "source", + isMut: true, + isSigner: false, + }, + { + name: "destination", + isMut: true, + isSigner: false, + }, + { + name: "authority", + isMut: false, + isSigner: true, + }, + { + name: "signers", + isMut: false, + isSigner: true, + }, + ], + args: [], + discriminant: { + type: "u8", + value: 38, + }, + }, + { + name: "metadataPointerExtension", + accounts: [], + args: [], + discriminant: { + type: "u8", + value: 39, + }, + }, + { + name: "groupPointerExtension", + accounts: [], + args: [], + discriminant: { + type: "u8", + value: 40, + }, + }, + { + name: "groupMemberPointerExtension", + accounts: [], + args: [], + discriminant: { + type: "u8", + value: 41, + }, + }, + ], + accounts: [ + { + name: "MintAccount", + type: { + kind: "struct", + fields: [ + { + name: "mint_authority", + type: { + coption: "publicKey", + prefix: "u32", + }, + }, + { + name: "supply", + type: "u64", + }, + { + name: "decimals", + type: "u8", + }, + { + name: "is_initialized", + type: "bool", + }, + { + name: "freeze_authority", + type: { + coption: "publicKey", + prefix: "u32", + }, + }, + ], + }, + }, + { + name: "TokenAccount", + type: { + kind: "struct", + fields: [ + { + name: "mint", + type: "publicKey", + }, + { + name: "owner", + type: "publicKey", + }, + { + name: "amount", + type: "u64", + }, + { + name: "delegate", + type: { + coption: "publicKey", + prefix: "u32", + }, + }, + { + name: "state", + type: { + defined: "AccountState", + }, + }, + { + name: "is_native", + type: { + coption: "u64", + prefix: "u32", + }, + }, + { + name: "delegated_amount", + type: "u64", + }, + { + name: "close_authority", + type: { + coption: "publicKey", + prefix: "u32", + }, + }, + ], + }, + }, + { + name: "MultisigAccount", + type: { + kind: "struct", + fields: [ + { + name: "num_of_signers_required", + type: "u8", + }, + { + name: "num_of_valid_signers_required", + type: "u8", + }, + { + name: "is_initialized", + type: "bool", + }, + { + name: "signers", + type: { + array: ["publicKey", 11], + }, + }, + ], + }, + }, + ], + types: [ + { + name: "AccountState", + type: { + kind: "enum", + size: "u8", + variants: [ + { + name: "Uninitialized", + }, + { + name: "Initialized", + }, + { + name: "Frozen", + }, + ], + }, + }, + { + name: "AccountType", + type: { + kind: "enum", + size: "u8", + variants: [{ name: "Uninitialized" }, { name: "Mint" }, { name: "Account" }], + }, + }, + { + name: "AuthorityType", + type: { + kind: "enum", + size: "u8", + variants: [ + { name: "MintTokens" }, + { name: "FreezeAccount" }, + { name: "AccountOwner" }, + { name: "CloseAccount" }, + { name: "TransferFeeConfig" }, + { name: "WithheldWithdraw" }, + { name: "CloseMint" }, + { name: "InterestRate" }, + { name: "PermanentDelegate" }, + { name: "ConfidentialTransferMint" }, + { name: "TransferHookProgramId" }, + { name: "ConfidentialTransferFeeConfig" }, + { name: "MetadataPointer" }, + { name: "GroupPointer" }, + { name: "GroupMemberPointer" }, + ], + }, + }, + { + name: "ExtensionTypeArray", + type: { + kind: "struct", + fields: [ + { + name: "ExtensionType", + type: { + vec: { + defined: "ExtensionType", + }, + size: "remainder", + }, + }, + ], + }, + }, + { + name: "ExtensionTypeWithFields", + type: { + kind: "enum", + size: "u16", + variants: [ + { name: "Uninitialized" }, + { + name: "TransferFeeConfig", + fields: [ + { + name: "extensionLength", + type: "u16", + }, + { + name: "transferFeeConfigAuthority", + type: "publicKey", + }, + { + name: "withdrawWithheldAuthority", + type: "publicKey", + }, + { + name: "withheldAmount", + type: "u64", + }, + { + name: "olderTransferFee", + type: { + defined: "TransferFee", + }, + }, + { + name: "newerTransferFee", + type: { + defined: "TransferFee", + }, + }, + ], + }, + { + name: "TransferFeeAmount", + fields: [ + { + name: "extensionLength", + type: "u16", + }, + { + name: "withheldAmount", + type: "u64", + }, + ], + }, + { + name: "MintCloseAuthority", + fields: [ + { + name: "extensionLength", + type: "u16", + }, + { + name: "closeAuthority", + type: "publicKey", + }, + ], + }, + { + name: "ConfidentialTransferMint", + fields: [ + { + name: "extensionLength", + type: "u16", + }, + { + name: "authority", + type: "publicKey", + }, + { + name: "autoApproveNewAccounts", + type: "bool", + }, + { + name: "auditorElgamalPubkey", + type: "publicKey", + }, + ], + }, + { + name: "ConfidentialTransferAccount", + fields: [ + { + name: "extensionLength", + type: "u16", + }, + { + name: "approved", + type: "bool", + }, + { + name: "elgamal_pubkey", + type: "publicKey", + }, + { + name: "pending_balance_lo", + type: { + array: ["u8", 64], + }, + }, + { + name: "pending_balance_hi", + type: { + array: ["u8", 64], + }, + }, + { + name: "available_balance", + type: { + array: ["u8", 64], + }, + }, + { + name: "decryptable_available_balance", + type: { + array: ["u8", 36], + }, + }, + { + name: "allow_confidential_credits", + type: "bool", + }, + { + name: "allow_non_confidential_credits", + type: "bool", + }, + { + name: "pending_balance_credit_counter", + type: "u64", + }, + { + name: "maximum_pending_balance_credit_counter", + type: "u64", + }, + { + name: "expected_pending_balance_credit_counter", + type: "u64", + }, + { + name: "actual_pending_balance_credit_counter", + type: "u64", + }, + ], + }, + { + name: "DefaultAccountState", + fields: [ + { + name: "extensionLength", + type: "u16", + }, + { + name: "defaultAccountState", + type: { + defined: "AccountState", + }, + }, + ], + }, + { + name: "ImmutableOwner", + fields: [ + { + name: "extensionLength", + type: "u16", + }, + ], + }, + { + name: "MemoTransfer", + fields: [ + { + name: "extensionLength", + type: "u16", + }, + { + name: "requireIncomingTransferMemos", + type: "bool", + }, + ], + }, + { + name: "NonTransferable", + fields: [ + { + name: "extensionLength", + type: "u16", + }, + ], + }, + { + name: "InterestBearingConfig", + fields: [ + { + name: "extensionLength", + type: "u16", + }, + { + name: "rateAuthority", + type: "publicKey", + }, + { + name: "initializationTimestamp", + type: "i64", + }, + { + name: "preUpdateAverageRate", + type: "i16", + }, + { + name: "lastUpdateTimestamp", + type: "i64", + }, + { + name: "currentRate", + type: "i16", + }, + ], + }, + { + name: "CpiGuard", + fields: [ + { + name: "extensionLength", + type: "u16", + }, + { + name: "lockCpi", + type: "bool", + }, + ], + }, + { + name: "PermanentDelegate", + fields: [ + { + name: "extensionLength", + type: "u16", + }, + { + name: "delegate", + type: "publicKey", + }, + ], + }, + { + name: "NonTransferableAccount", + fields: [ + { + name: "extensionLength", + type: "u16", + }, + ], + }, + { + name: "TransferHook", + fields: [ + { + name: "extensionLength", + type: "u16", + }, + { + name: "authority", + type: "publicKey", + }, + { + name: "programId", + type: "publicKey", + }, + ], + }, + { + name: "TransferHookAccount", + fields: [ + { + name: "extensionLength", + type: "u16", + }, + { + name: "transferring", + type: "bool", + }, + ], + }, + { + name: "ConfidentialTransferFeeConfig", + fields: [ + { + name: "extensionLength", + type: "u16", + }, + { + name: "authority", + type: "publicKey", + }, + { + name: "withdrawWithheldAuthorityElgamalPubkey", + type: "publicKey", + }, + { + name: "withheldAmount", + type: { + array: ["u8", 64], + }, + }, + ], + }, + { + name: "ConfidentialTransferFeeAmount", + fields: [ + { + name: "extensionLength", + type: "u16", + }, + { + name: "withheldAmount", + type: { + array: ["u8", 64], + }, + }, + ], + }, + { + name: "MetadataPointer", + fields: [ + { + name: "extensionLength", + type: "u16", + }, + { + name: "authority", + type: "publicKey", + }, + { + name: "metadataAddress", + type: "publicKey", + }, + ], + }, + { + name: "TokenMetadata", + fields: [ + { + name: "extensionLength", + type: "u16", + }, + { + name: "updateAuthority", + type: "publicKey", + }, + { + name: "mint", + type: "publicKey", + }, + { + name: "name", + type: "string", + }, + { + name: "symbol", + type: "string", + }, + { + name: "uri", + type: "string", + }, + { + name: "additionalMetadata", + type: { + hashMap: ["string", "string"], + }, + }, + ], + }, + { + name: "GroupPointer", + fields: [ + { + name: "authority", + type: "publicKey", + }, + { + name: "groupAddress", + type: "publicKey", + }, + ], + }, + { + name: "TokenGroup", + fields: [ + { + name: "updateAuthority", + type: "publicKey", + }, + { + name: "mint", + type: "publicKey", + }, + { + name: "size", + type: "u32", + }, + { + name: "maxSize", + type: "u32", + }, + ], + }, + { + name: "GroupMemberPointer", + fields: [ + { + name: "authority", + type: "publicKey", + }, + { + name: "memberAddress", + type: "publicKey", + }, + ], + }, + { + name: "TokenGroupMember", + fields: [ + { + name: "mint", + type: "publicKey", + }, + { + name: "group", + type: "publicKey", + }, + { + name: "memberNumber", + type: "u32", + }, + ], + }, + ], + }, + }, + { + name: "ExtensionType", + type: { + kind: "enum", + size: "u16", + variants: [ + { name: "Uninitialized" }, + { name: "TransferFeeConfig" }, + { name: "TransferFeeAmount" }, + { name: "MintCloseAuthority" }, + { name: "ConfidentialTransferMint" }, + { name: "ConfidentialTransferAccount" }, + { name: "DefaultAccountState" }, + { name: "ImmutableOwner" }, + { name: "MemoTransfer" }, + { name: "NonTransferable" }, + { name: "InterestBearingConfig" }, + { name: "CpiGuard" }, + { name: "PermanentDelegate" }, + { name: "NonTransferableAccount" }, + { name: "TransferHook" }, + { name: "TransferHookAccount" }, + { name: "ConfidentialTransferFeeConfig" }, + { name: "ConfidentialTransferFeeAmount" }, + { name: "MetadataPointer" }, + { name: "TokenMetadata" }, + { name: "GroupPointer" }, + { name: "TokenGroup" }, + { name: "GroupMemberPointer" }, + { name: "TokenGroupMember" }, + ], + }, + }, + { + name: "TransferFee", + type: { + kind: "struct", + fields: [ + { + name: "epoch", + type: "u64", + }, + { + name: "maximumFee", + type: "u64", + }, + { + name: "transferFeeBasisPoints", + type: "u16", + }, + ], + }, + }, + { + name: "BasisPoints", + type: { + kind: "struct", + fields: [ + { + name: "BasisPoints", + type: { + array: ["u8", 2], + }, + }, + ], + }, + }, + ], + metadata: { + origin: "shank", + address: "TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb", + binaryVersion: "1.0.0", + libVersion: "1.0.0", + }, +}; diff --git a/packages/explorerkit-idls/src/idls/shank/spl/token-v2.ts b/packages/explorerkit-idls/src/idls/shank/spl/token-extensions/token-v2.ts similarity index 99% rename from packages/explorerkit-idls/src/idls/shank/spl/token-v2.ts rename to packages/explorerkit-idls/src/idls/shank/spl/token-extensions/token-v2.ts index 64ada74..0e8109f 100644 --- a/packages/explorerkit-idls/src/idls/shank/spl/token-v2.ts +++ b/packages/explorerkit-idls/src/idls/shank/spl/token-extensions/token-v2.ts @@ -1355,14 +1355,12 @@ export const Token2022IDL: Idl = { }, { name: "authority", - // Suppose to be a COption of PublicKey but unsure on whether it really has a COption type: "publicKey", }, { name: "autoApproveNewAccounts", type: "bool", }, - // Suppose to be a COption of PublicKey but unsure on whether it really has a COption { name: "auditorElgamalPubkey", type: "publicKey", diff --git a/packages/explorerkit-server/package.json b/packages/explorerkit-server/package.json index e999810..c79b765 100644 --- a/packages/explorerkit-server/package.json +++ b/packages/explorerkit-server/package.json @@ -17,8 +17,7 @@ }, "scripts": { "build": "tsup src/index.ts --format esm,cjs --dts", - "dev": "tsup src/index.ts --format esm,cjs --dts --watch", - "dev-serve": "concurrently \"pnpm dev\" \"node dist/index.js\"", + "dev": "concurrently \"tsup src/index.ts --format esm,cjs --dts --watch\" \"node dist/index.mjs\"", "serve": "nodemon dist/index.js", "test": "vitest run", "clean": "rimraf .turbo && rimraf node_modules && rimraf dist", diff --git a/packages/explorerkit-translator/package.json b/packages/explorerkit-translator/package.json index 853ad11..8848813 100644 --- a/packages/explorerkit-translator/package.json +++ b/packages/explorerkit-translator/package.json @@ -38,7 +38,9 @@ "@coral-xyz/anchor": "^0.28.1-beta.2", "@metaplex-foundation/umi": "^0.8.6", "@metaplex-foundation/umi-serializers": "^0.8.5", + "@solana/spl-type-length-value": "^0.1.0", "@solanafm/kinobi-lite": "^0.12.0", - "@solanafm/utils": "^0.3.0" + "@solanafm/utils": "^1.0.4", + "change-case": "^5.4.2" } } diff --git a/packages/explorerkit-translator/src/helpers/KinobiTreeGenerator.ts b/packages/explorerkit-translator/src/helpers/KinobiTreeGenerator.ts index 9834440..61c9946 100644 --- a/packages/explorerkit-translator/src/helpers/KinobiTreeGenerator.ts +++ b/packages/explorerkit-translator/src/helpers/KinobiTreeGenerator.ts @@ -28,8 +28,8 @@ import { u128, unit, } from "@metaplex-foundation/umi/serializers"; +import { splDiscriminate } from "@solana/spl-type-length-value"; import { - assertStringTypeNode, assertStructFieldTypeNode, bytesTypeNode, createFromIdls, @@ -50,6 +50,8 @@ import { TransformNodesVisitor, TypeNode, } from "@solanafm/kinobi-lite"; +import { encodeBase58 } from "@solanafm/utils"; +import { snakeCase } from "change-case"; import { FMShankSerializer, KinobiTreeGeneratorType, ShankSerializer } from "../types/KinobiTreeGenerator"; @@ -142,14 +144,24 @@ export class KinobiTreeGenerator { /** * Constructs a map with the discriminant as the key and the serializer as the value for a single shank-generated IDL + * @param treeGeneratorType - The type of tree generator to construct + * @param interfaceDiscriminantMode - Uses 8-bytes discriminant for the map key name if true, otherwise uses the discriminant value from the IDL + * @param interfacePrefixString - String to prefix the interface name with + * @returns A map with the discriminant as the key and the serializer as the value */ public constructLayout( - treeGeneratorType: KinobiTreeGeneratorType = KinobiTreeGeneratorType.INSTRUCTIONS + treeGeneratorType: KinobiTreeGeneratorType = KinobiTreeGeneratorType.INSTRUCTIONS, + interfaceDiscriminantMode: boolean = false, + interfacePrefixString?: string ): Map { - return this._constructLayout(treeGeneratorType); + return this._constructLayout(treeGeneratorType, interfaceDiscriminantMode, interfacePrefixString); } - private _constructLayout(treeGeneratorType: KinobiTreeGeneratorType): Map { + private _constructLayout( + treeGeneratorType: KinobiTreeGeneratorType, + interfaceDiscriminantMode: boolean, + interfacePrefixString?: string + ): Map { const typeNodes = getAllDefinedTypes(this.rootNode); switch (treeGeneratorType) { @@ -182,6 +194,7 @@ export class KinobiTreeGenerator { // If there's no discriminant, we will still want to try to create the layout if (!ixDiscriminant) { + // TODO: Would merge 8-bytes discriminants in the future when we fully merge A`nchor with ExplorerKit. const serializer = KinobiTreeGenerator.createSerializer( instructionNode.dataArgs.struct, typeNodes, @@ -193,7 +206,14 @@ export class KinobiTreeGenerator { instructionName: serializer[0], }; - instructionLayout.set(index, fmShankSerializer); + if (interfaceDiscriminantMode) { + // Will convert to snake case for now since all the discriminators are made from snake-cases + const ixName = snakeCase(instructionNode.name); + const discriminant = splDiscriminate(`${interfacePrefixString ?? ""}:${ixName}`); + instructionLayout.set(encodeBase58(discriminant), fmShankSerializer); + } else { + instructionLayout.set(index, fmShankSerializer); + } } // !For anchor in the future // if (metadataValue?.__kind === "list") { diff --git a/packages/explorerkit-translator/src/idls/token-22/extensions/confidential-transfer-fee.ts b/packages/explorerkit-translator/src/idls/token-22/extensions/confidential-transfer-fee.ts new file mode 100644 index 0000000..d79346c --- /dev/null +++ b/packages/explorerkit-translator/src/idls/token-22/extensions/confidential-transfer-fee.ts @@ -0,0 +1,251 @@ +import { Idl } from "@solanafm/kinobi-lite"; + +export const ConfidentialTransferFeeExtensionIDL: Idl = { + version: "0.1.0", + name: "ConfidentialTransferFee", + instructions: [ + { + name: "initializeConfidentialTransferFeeConfig", + accounts: [ + { + name: "tokenMint", + isMut: true, + isSigner: false, + }, + ], + args: [ + { + name: "initializeConfidentialTransferFeeConfigData", + type: { + defined: "InitializeConfidentialTransferFeeConfigData", + }, + }, + ], + discriminant: { + type: "u8", + value: 0, + }, + }, + { + name: "WithdrawWithheldTokensFromMint", + accounts: [ + { + name: "tokenMint", + isMut: true, + isSigner: false, + }, + { + name: "feeReceiver", + isMut: true, + isSigner: false, + }, + { + name: "instructionsSysvarOrContextStateAccount", + isMut: false, + isSigner: false, + }, + { + name: "withdrawWithheldAuthority", + isMut: false, + isSigner: true, + }, + ], + args: [ + { + name: "withdrawWithheldTokensFromMintData", + type: { + defined: "WithdrawWithheldTokensFromMintData", + }, + }, + ], + discriminant: { + type: "u8", + value: 1, + }, + }, + { + name: "WithdrawWithheldTokensFromAccounts", + accounts: [ + { + name: "tokenMint", + isMut: true, + isSigner: false, + }, + { + name: "feeReceiver", + isMut: true, + isSigner: false, + }, + { + name: "instructionsSysvarOrContextStateAccount", + isMut: false, + isSigner: false, + }, + { + name: "withdrawWithheldAuthority", + isMut: false, + isSigner: true, + }, + ], + args: [ + { + name: "withdrawWithheldTokensFromAccountsData", + type: { + defined: "WithdrawWithheldTokensFromAccountsData", + }, + }, + ], + discriminant: { + type: "u8", + value: 2, + }, + }, + { + name: "HarvestWithheldTokensToMint", + accounts: [ + { + name: "tokenMint", + isMut: true, + isSigner: false, + }, + { + name: "sourceAccount", + isMut: true, + isSigner: false, + }, + ], + args: [], + discriminant: { + type: "u8", + value: 3, + }, + }, + { + name: "EnableHarvestToMint", + accounts: [ + { + name: "tokenMint", + isMut: true, + isSigner: false, + }, + { + name: "sourceAccount", + isMut: true, + isSigner: false, + }, + ], + args: [], + discriminant: { + type: "u8", + value: 4, + }, + }, + { + name: "DisableHarvestToMint", + accounts: [ + { + name: "tokenMint", + isMut: true, + isSigner: false, + }, + { + name: "confidentialTransferFeeAuthority", + isMut: false, + isSigner: true, + }, + ], + args: [], + discriminant: { + type: "u8", + value: 5, + }, + }, + ], + accounts: [], + types: [ + { + name: "InitializeConfidentialTransferFeeConfigData", + type: { + kind: "struct", + fields: [ + { + name: "authority", + type: "publicKey", + }, + { + name: "withdraw_withheld_authority_elgamal_pubkey", + type: { + array: ["u8", 32], + }, + }, + ], + }, + }, + { + name: "WithdrawWithheldTokensFromMintData", + type: { + kind: "struct", + fields: [ + { + name: "proof_instruction_offset", + type: "i8", + }, + { + name: "new_decryptable_available_balance", + type: { + defined: "DecryptableBalance", + }, + }, + ], + }, + }, + { + name: "DecryptableBalance", + type: { + kind: "struct", + fields: [ + { + name: "nonce", + type: { + array: ["u8", 12], + }, + }, + { + name: "ciphertext", + type: { + array: ["u8", 24], + }, + }, + ], + }, + }, + { + name: "WithdrawWithheldTokensFromAccountsData", + type: { + kind: "struct", + fields: [ + { + name: "num_token_accounts", + type: "u8", + }, + { + name: "proof_instruction_offset", + type: "i8", + }, + { + name: "new_decryptable_available_balance", + type: { + defined: "DecryptableBalance", + }, + }, + ], + }, + }, + ], + metadata: { + origin: "shank", + address: "TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb", + binaryVersion: "0.1.0", + libVersion: "0.1.0", + }, +}; diff --git a/packages/explorerkit-translator/src/idls/token-22/extensions/confidential-transfer.ts b/packages/explorerkit-translator/src/idls/token-22/extensions/confidential-transfer.ts index f66a09b..baeac24 100644 --- a/packages/explorerkit-translator/src/idls/token-22/extensions/confidential-transfer.ts +++ b/packages/explorerkit-translator/src/idls/token-22/extensions/confidential-transfer.ts @@ -425,10 +425,7 @@ export const ConfidentialTransferExtensionIDL: Idl = { fields: [ { name: "authority", - type: { - coption: "publicKey", - prefix: "u8", - }, + type: "publicKey", }, { name: "auto_approve_new_accounts", diff --git a/packages/explorerkit-translator/src/idls/token-22/extensions/group-member-pointer.ts b/packages/explorerkit-translator/src/idls/token-22/extensions/group-member-pointer.ts new file mode 100644 index 0000000..b4d3b43 --- /dev/null +++ b/packages/explorerkit-translator/src/idls/token-22/extensions/group-member-pointer.ts @@ -0,0 +1,94 @@ +import { Idl } from "@solanafm/kinobi-lite"; + +export const GroupMemberPointerIDL: Idl = { + version: "0.0.0", + name: "group-member-pointer", + accounts: [], + instructions: [ + { + name: "initializeGroupMemberPointer", + accounts: [ + { + name: "mint", + isMut: true, + isSigner: false, + }, + ], + args: [ + { + name: "initializeGroupMemberPointerData", + type: { + defined: "InitializeGroupMemberPointerData", + }, + }, + ], + discriminant: { + type: "u8", + value: 0, + }, + }, + { + name: "UpdateGroupMemberPointer", + accounts: [ + { + name: "mint", + isMut: true, + isSigner: false, + }, + { + name: "groupPointerAuthority", + isMut: false, + isSigner: true, + }, + ], + args: [ + { + name: "updateGroupMemberPointerData", + type: { + defined: "UpdateGroupMemberPointerData", + }, + }, + ], + discriminant: { + type: "u8", + value: 1, + }, + }, + ], + types: [ + { + name: "InitializeGroupMemberPointerData", + type: { + kind: "struct", + fields: [ + { + name: "authority", + type: "publicKey", + }, + { + name: "member_address", + type: "publicKey", + }, + ], + }, + }, + { + name: "UpdateGroupMemberPointerData", + type: { + kind: "struct", + fields: [ + { + name: "member_address", + type: "publicKey", + }, + ], + }, + }, + ], + metadata: { + origin: "shank", + address: "TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb", + binaryVersion: "0.0.1", + libVersion: "0.0.1", + }, +}; diff --git a/packages/explorerkit-translator/src/idls/token-22/extensions/group-pointer.ts b/packages/explorerkit-translator/src/idls/token-22/extensions/group-pointer.ts new file mode 100644 index 0000000..071673f --- /dev/null +++ b/packages/explorerkit-translator/src/idls/token-22/extensions/group-pointer.ts @@ -0,0 +1,94 @@ +import { Idl } from "@solanafm/kinobi-lite"; + +export const GroupPointerIDL: Idl = { + version: "0.0.0", + name: "group-pointer", + accounts: [], + instructions: [ + { + name: "initializeGroupPointer", + accounts: [ + { + name: "mint", + isMut: true, + isSigner: false, + }, + ], + args: [ + { + name: "initializeGroupPointerData", + type: { + defined: "InitializeGroupPointerData", + }, + }, + ], + discriminant: { + type: "u8", + value: 0, + }, + }, + { + name: "UpdateGroupPointer", + accounts: [ + { + name: "mint", + isMut: true, + isSigner: false, + }, + { + name: "groupPointerAuthority", + isMut: false, + isSigner: true, + }, + ], + args: [ + { + name: "updateGroupPointerData", + type: { + defined: "UpdateGroupPointerData", + }, + }, + ], + discriminant: { + type: "u8", + value: 1, + }, + }, + ], + types: [ + { + name: "InitializeGroupPointerData", + type: { + kind: "struct", + fields: [ + { + name: "authority", + type: "publicKey", + }, + { + name: "group_address", + type: "publicKey", + }, + ], + }, + }, + { + name: "UpdateGroupPointerData", + type: { + kind: "struct", + fields: [ + { + name: "group_address", + type: "publicKey", + }, + ], + }, + }, + ], + metadata: { + origin: "shank", + address: "TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb", + binaryVersion: "0.0.1", + libVersion: "0.0.1", + }, +}; diff --git a/packages/explorerkit-translator/src/idls/token-22/extensions/index.ts b/packages/explorerkit-translator/src/idls/token-22/extensions/index.ts index e4055cc..a359c82 100644 --- a/packages/explorerkit-translator/src/idls/token-22/extensions/index.ts +++ b/packages/explorerkit-translator/src/idls/token-22/extensions/index.ts @@ -1,6 +1,13 @@ export { ConfidentialTransferExtensionIDL } from "./confidential-transfer"; +export { ConfidentialTransferFeeExtensionIDL } from "./confidential-transfer-fee"; export { CpiGuardExtensionIDL } from "./cpi-guard"; export { DefaultAccountStateExtensionIDL } from "./default-account-state"; +export { GroupMemberPointerIDL } from "./group-member-pointer"; +export { GroupPointerIDL } from "./group-pointer"; export { InterestBearingMintIDL } from "./interest-bearing-mint"; export { MemoTransferExtensionIDL } from "./memo-transfer"; +export { MetadataPointerExtensionIdl } from "./metadata-pointer"; +export { TokenGroupInterfaceExtensionIDL } from "./token-group"; +export { TokenMetadataInterfaceExtensionIDL } from "./token-metadata"; export { TransferFeeExtensionIDL } from "./transfer-fee"; +export { TransferHookExtensionIDL } from "./transfer-hook"; diff --git a/packages/explorerkit-translator/src/idls/token-22/extensions/metadata-pointer.ts b/packages/explorerkit-translator/src/idls/token-22/extensions/metadata-pointer.ts new file mode 100644 index 0000000..6912923 --- /dev/null +++ b/packages/explorerkit-translator/src/idls/token-22/extensions/metadata-pointer.ts @@ -0,0 +1,94 @@ +import { Idl } from "@solanafm/kinobi-lite"; + +export const MetadataPointerExtensionIdl: Idl = { + version: "0.1.0", + name: "MetadataPointerExtension", + instructions: [ + { + name: "initializeMetadataPointer", + accounts: [ + { + name: "tokenMint", + isMut: true, + isSigner: false, + }, + ], + args: [ + { + name: "initializeMetadataPointerData", + type: { + defined: "InitializeMetadataPointerData", + }, + }, + ], + discriminant: { + type: "u8", + value: 0, + }, + }, + { + name: "updateMetadataPointer", + accounts: [ + { + name: "tokenMint", + isMut: true, + isSigner: false, + }, + { + name: "metadataPointerAuthority", + isMut: false, + isSigner: true, + }, + ], + args: [ + { + name: "updateMetadataPointerData", + type: { + defined: "UpdateMetadataPointerData", + }, + }, + ], + discriminant: { + type: "u8", + value: 1, + }, + }, + ], + accounts: [], + types: [ + { + name: "InitializeMetadataPointerData", + type: { + kind: "struct", + fields: [ + { + name: "authority", + type: "publicKey", + }, + { + name: "metadata_address", + type: "publicKey", + }, + ], + }, + }, + { + name: "UpdateMetadataPointerData", + type: { + kind: "struct", + fields: [ + { + name: "metadata_address", + type: "publicKey", + }, + ], + }, + }, + ], + metadata: { + origin: "shank", + address: "TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb", + binaryVersion: "0.1.0", + libVersion: "0.1.0", + }, +}; diff --git a/packages/explorerkit-translator/src/idls/token-22/extensions/token-group.ts b/packages/explorerkit-translator/src/idls/token-22/extensions/token-group.ts new file mode 100644 index 0000000..bb3e7fc --- /dev/null +++ b/packages/explorerkit-translator/src/idls/token-22/extensions/token-group.ts @@ -0,0 +1,162 @@ +import { Idl } from "@solanafm/kinobi-lite"; + +export const TokenGroupInterfaceExtensionIDL: Idl = { + version: "0.1.0", + name: "TokenGroupInterfaceExtension", + instructions: [ + { + name: "initializeTokenGroup", + accounts: [ + { + name: "group", + isMut: true, + isSigner: false, + }, + { + name: "mint", + isMut: false, + isSigner: false, + }, + { + name: "mintAuthority", + isMut: false, + isSigner: true, + }, + ], + args: [ + { + name: "initializeGroupData", + type: { + defined: "InitializeGroupData", + }, + }, + ], + }, + { + name: "updateGroupMaxSize", + accounts: [ + { + name: "group", + isMut: true, + isSigner: false, + }, + { + name: "updateAuthority", + isMut: false, + isSigner: true, + }, + ], + args: [ + { + name: "updateGroupMaxSizeData", + type: { + defined: "UpdateGroupMaxSizeData", + }, + }, + ], + }, + { + name: "updateAuthority", + accounts: [ + { + name: "group", + isMut: true, + isSigner: false, + }, + { + name: "currentUpdateAuthority", + isMut: false, + isSigner: true, + }, + ], + args: [ + { + name: "updateGroupAuthorityData", + type: { + defined: "UpdateGroupAuthorityData", + }, + }, + ], + }, + { + name: "initializeMember", + accounts: [ + { + name: "member", + isMut: true, + isSigner: false, + }, + { + name: "memberMint", + isMut: false, + isSigner: false, + }, + { + name: "memberMintAuthority", + isMut: false, + isSigner: true, + }, + { + name: "group", + isMut: true, + isSigner: false, + }, + { + name: "groupUpdateAuthority", + isMut: false, + isSigner: true, + }, + ], + args: [], + }, + ], + accounts: [], + types: [ + { + name: "InitializeGroupData", + type: { + kind: "struct", + fields: [ + { + name: "update_authority", + type: "publicKey", + }, + { + name: "max_size", + type: "u32", + }, + ], + }, + }, + { + name: "UpdateGroupMaxSizeData", + type: { + kind: "struct", + fields: [ + { + name: "max_size", + type: "u32", + }, + ], + }, + }, + { + name: "UpdateGroupAuthorityData", + type: { + kind: "struct", + fields: [ + { + name: "new_authority", + type: "publicKey", + }, + ], + }, + }, + ], + metadata: { + origin: "shank", + address: "TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb", + binaryVersion: "0.1.0", + libVersion: "0.1.0", + }, +}; diff --git a/packages/explorerkit-translator/src/idls/token-22/extensions/token-metadata.ts b/packages/explorerkit-translator/src/idls/token-22/extensions/token-metadata.ts new file mode 100644 index 0000000..3373ba3 --- /dev/null +++ b/packages/explorerkit-translator/src/idls/token-22/extensions/token-metadata.ts @@ -0,0 +1,254 @@ +import { Idl } from "@solanafm/kinobi-lite"; + +// +export const TokenMetadataInterfaceExtensionIDL: Idl = { + version: "0.1.0", + name: "TokenMetadataInterfaceExtension", + instructions: [ + { + name: "initializeAccount", + accounts: [ + { + name: "metadata", + isMut: true, + isSigner: false, + }, + { + name: "updateAuthority", + isMut: false, + isSigner: false, + }, + { + name: "mint", + isMut: false, + isSigner: false, + }, + { + name: "mintAuthority", + isMut: false, + isSigner: true, + }, + ], + args: [ + { + name: "initializeAccountData", + type: { + defined: "InitializeAccountData", + }, + }, + ], + }, + { + name: "updatingField", + accounts: [ + { + name: "metadata", + isMut: true, + isSigner: false, + }, + { + name: "updateAuthority", + isMut: false, + isSigner: true, + }, + ], + args: [ + { + name: "updatingFieldData", + type: { + defined: "UpdatingFieldData", + }, + }, + ], + }, + { + name: "removeKeyIx", + accounts: [ + { + name: "metadata", + isMut: true, + isSigner: false, + }, + { + name: "updateAuthority", + isMut: false, + isSigner: true, + }, + ], + args: [ + { + name: "removeKeyData", + type: { + defined: "RemoveKeyData", + }, + }, + ], + }, + { + name: "updateTheAuthority", + accounts: [ + { + name: "metadata", + isMut: true, + isSigner: false, + }, + { + name: "updateAuthority", + isMut: false, + isSigner: true, + }, + ], + args: [ + { + name: "updateAuthorityData", + type: { + defined: "UpdateAuthorityData", + }, + }, + ], + }, + { + name: "emitter", + accounts: [ + { + name: "metadata", + isMut: false, + isSigner: false, + }, + ], + args: [ + { + name: "emitData", + type: { + defined: "EmitData", + }, + }, + ], + }, + ], + accounts: [], + types: [ + { + name: "InitializeAccountData", + type: { + kind: "struct", + fields: [ + { + name: "name", + type: "string", + }, + { + name: "symbol", + type: "string", + }, + { + name: "uri", + type: "string", + }, + ], + }, + }, + { + name: "UpdatingFieldData", + type: { + kind: "struct", + fields: [ + { + name: "field", + type: { + defined: "Field", + }, + }, + { + name: "value", + type: "string", + }, + ], + }, + }, + { + name: "Field", + type: { + kind: "enum", + size: "u8", + variants: [ + { + name: "Name", + fields: [], + }, + { + name: "Symbol", + fields: [], + }, + { + name: "Uri", + fields: [], + }, + { + name: "Key", + fields: [ + { + name: "userKeyField", + type: "string", + }, + ], + }, + ], + }, + }, + { + name: "RemoveKeyData", + type: { + kind: "struct", + fields: [ + { + name: "idempotent", + type: "bool", + }, + { + name: "key", + type: "string", + }, + ], + }, + }, + { + name: "UpdateAuthorityData", + type: { + kind: "struct", + fields: [ + { + name: "new_authority", + type: "publicKey", + }, + ], + }, + }, + { + name: "EmitData", + type: { + kind: "struct", + fields: [ + { + name: "start", + type: { + option: "u64", + }, + }, + { + name: "end", + type: { + option: "u64", + }, + }, + ], + }, + }, + ], + metadata: { + origin: "shank", + address: "TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb", + binaryVersion: "0.1.0", + libVersion: "0.1.0", + }, +}; diff --git a/packages/explorerkit-translator/src/idls/token-22/extensions/transfer-hook.ts b/packages/explorerkit-translator/src/idls/token-22/extensions/transfer-hook.ts new file mode 100644 index 0000000..36f549d --- /dev/null +++ b/packages/explorerkit-translator/src/idls/token-22/extensions/transfer-hook.ts @@ -0,0 +1,94 @@ +import { Idl } from "@solanafm/kinobi-lite"; + +export const TransferHookExtensionIDL: Idl = { + version: "0.1.0", + name: "TransferHookExtension", + instructions: [ + { + name: "initializeTransferHook", + accounts: [ + { + name: "tokenMint", + isMut: true, + isSigner: false, + }, + ], + args: [ + { + name: "initializeTransferHook", + type: { + defined: "initializeTransferHookData", + }, + }, + ], + discriminant: { + type: "u8", + value: 0, + }, + }, + { + name: "updateTransferHook", + accounts: [ + { + name: "tokenMint", + isMut: true, + isSigner: false, + }, + { + name: "transferHookAuthority", + isMut: false, + isSigner: true, + }, + ], + args: [ + { + name: "updateTransferHook", + type: { + defined: "updateTransferHookData", + }, + }, + ], + discriminant: { + type: "u8", + value: 1, + }, + }, + ], + accounts: [], + types: [ + { + name: "initializeTransferHookData", + type: { + kind: "struct", + fields: [ + { + name: "authority", + type: "publicKey", + }, + { + name: "program_id", + type: "publicKey", + }, + ], + }, + }, + { + name: "updateTransferHookData", + type: { + kind: "struct", + fields: [ + { + name: "program_id", + type: "publicKey", + }, + ], + }, + }, + ], + metadata: { + origin: "shank", + address: "TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb", + binaryVersion: "0.1.0", + libVersion: "0.1.0", + }, +}; diff --git a/packages/explorerkit-translator/src/parsers/v2/instruction/token-v2.ts b/packages/explorerkit-translator/src/parsers/v2/instruction/token-v2.ts index b22021b..2fcefac 100644 --- a/packages/explorerkit-translator/src/parsers/v2/instruction/token-v2.ts +++ b/packages/explorerkit-translator/src/parsers/v2/instruction/token-v2.ts @@ -1,20 +1,28 @@ import { base58 } from "@metaplex-foundation/umi-serializers"; import { Idl, Idl as ShankIdl } from "@solanafm/kinobi-lite"; -import { convertBNToNumberInObject } from "@solanafm/utils"; +import { convertBNToNumberInObject, encodeBase58 } from "@solanafm/utils"; import { mapDataTypeToName } from "../../../helpers/idl"; import { KinobiTreeGenerator } from "../../../helpers/KinobiTreeGenerator"; import { mapMultisigAccountKeysToName } from "../../../helpers/multisig-checker"; import { ConfidentialTransferExtensionIDL, + ConfidentialTransferFeeExtensionIDL, CpiGuardExtensionIDL, DefaultAccountStateExtensionIDL, + GroupMemberPointerIDL, + GroupPointerIDL, InterestBearingMintIDL, MemoTransferExtensionIDL, + MetadataPointerExtensionIdl, + TokenGroupInterfaceExtensionIDL, + TokenMetadataInterfaceExtensionIDL, TransferFeeExtensionIDL, + TransferHookExtensionIDL, } from "../../../idls/token-22/extensions"; import { InstructionParserInterface } from "../../../interfaces"; import { IdlItem } from "../../../types/IdlItem"; +import { FMShankSerializer, KinobiTreeGeneratorType } from "../../../types/KinobiTreeGenerator"; import { ParserOutput, ParserType } from "../../../types/Parsers"; import { serializeTransferFeeExt } from "./token-2022-extensions"; @@ -27,12 +35,28 @@ export const createTokenV2Ix: (idlItem: IdlItem) => InstructionParserInterface = const idl = idlItem.idl as ShankIdl; const instructionsLayout = new KinobiTreeGenerator(idl).constructLayout(); + // Interface layouts to create + const tokenMetadataInterfaceLayout = new KinobiTreeGenerator(TokenMetadataInterfaceExtensionIDL).constructLayout( + KinobiTreeGeneratorType.INSTRUCTIONS, + true, + "spl_token_metadata_interface" + ); + + const tokenGroupInterfaceLayout = new KinobiTreeGenerator(TokenGroupInterfaceExtensionIDL).constructLayout( + KinobiTreeGeneratorType.INSTRUCTIONS, + true, + "spl_token_group_interface" + ); + const parseInstructions = (instructionData: string, accountKeys?: string[], mapTypes?: boolean): ParserOutput => { try { const dataBuffer = base58.serialize(instructionData); const ixDiscriminant = Buffer.from(dataBuffer).readUint8(0); + const ixSerializer = instructionsLayout.get(ixDiscriminant); + // Token 2022 has interfaces which uses 8 bytes discriminants to identify the instruction, we will check for the default logic first before + // proceeding with interface discriminants if (ixSerializer && dataBuffer.byteLength > 0) { switch (ixDiscriminant) { // Transfer Fee Extension Enum @@ -136,6 +160,101 @@ export const createTokenV2Ix: (idlItem: IdlItem) => InstructionParserInterface = } break; + // Transfer Hook Extension Enum + case 36: + if (dataBuffer.byteLength < 2) { + return null; + } + + const transferHookData = serializeExtension(TransferHookExtensionIDL, dataBuffer, mapTypes, accountKeys); + + if (transferHookData) { + return { + name: ixSerializer.instructionName, + data: convertBNToNumberInObject(transferHookData), + type: ParserType.INSTRUCTION, + }; + } + break; + + // Confidential Transfer FEE Extension Enum + case 37: + if (dataBuffer.byteLength < 2) { + return null; + } + + const confidentialTransferFeeData = serializeExtension( + ConfidentialTransferFeeExtensionIDL, + dataBuffer, + mapTypes, + accountKeys + ); + + if (confidentialTransferFeeData) { + return { + name: ixSerializer.instructionName, + data: convertBNToNumberInObject(confidentialTransferFeeData), + type: ParserType.INSTRUCTION, + }; + } + break; + + // Metadata Pointer Extension Enum + case 39: + if (dataBuffer.byteLength < 2) { + return null; + } + + const metadataPointerData = serializeExtension( + MetadataPointerExtensionIdl, + dataBuffer, + mapTypes, + accountKeys + ); + + if (metadataPointerData) { + return { + name: ixSerializer.instructionName, + data: convertBNToNumberInObject(metadataPointerData), + type: ParserType.INSTRUCTION, + }; + } + break; + + // Group Pointer Extension Enum + case 40: + if (dataBuffer.byteLength < 2) { + return null; + } + + const groupMemberPointerData = serializeExtension(GroupMemberPointerIDL, dataBuffer, mapTypes, accountKeys); + + if (groupMemberPointerData) { + return { + name: ixSerializer.instructionName, + data: convertBNToNumberInObject(groupMemberPointerData), + type: ParserType.INSTRUCTION, + }; + } + break; + + // Group Member Pointer Extension Enum + case 41: + if (dataBuffer.byteLength < 2) { + return null; + } + + const groupPointerData = serializeExtension(GroupPointerIDL, dataBuffer, mapTypes, accountKeys); + + if (groupPointerData) { + return { + name: ixSerializer.instructionName, + data: convertBNToNumberInObject(groupPointerData), + type: ParserType.INSTRUCTION, + }; + } + break; + // If there's no nested extensions, it will use the default logic of deserializing the instruction // For Token 2022 Program, we will assume that those instructions with more than 1 account keys are usually Multisig Instructions default: @@ -174,6 +293,54 @@ export const createTokenV2Ix: (idlItem: IdlItem) => InstructionParserInterface = } break; } + } else { + // Slices the first 8 bytes of the instruction data to check for interface discriminants + const interfaceDiscriminant = Buffer.from(dataBuffer).subarray(0, 8); + const bs58Discriminant = encodeBase58(interfaceDiscriminant); + let interfaceSerializer: FMShankSerializer | undefined; + + // Iterate through the interface layouts and check if the discriminant matches + if (tokenMetadataInterfaceLayout.has(bs58Discriminant) && dataBuffer.byteLength > 8) { + interfaceSerializer = tokenMetadataInterfaceLayout.get(bs58Discriminant); + } else if (tokenGroupInterfaceLayout.has(bs58Discriminant) && dataBuffer.byteLength > 8) { + interfaceSerializer = tokenGroupInterfaceLayout.get(bs58Discriminant); + } + + if (interfaceSerializer) { + const decodedShankData = interfaceSerializer.serializer?.deserialize(dataBuffer.subarray(8)); + if (decodedShankData && decodedShankData[0]) { + // Will only work for numbered discriminant for now + // Means no anchor support + const filteredIdlInstruction = idl.instructions?.filter( + (instruction) => instruction.discriminant?.value === ixDiscriminant + ); + + if (mapTypes) { + decodedShankData[0] = mapDataTypeToName( + decodedShankData[0], + filteredIdlInstruction[0]?.args, + filteredIdlInstruction[0]?.discriminant + ); + } + + if (filteredIdlInstruction.length > 0) { + const instructionAccounts = filteredIdlInstruction[0]?.accounts; + const mappedAccountKeys = mapMultisigAccountKeysToName(accountKeys, instructionAccounts); + + return { + name: interfaceSerializer.instructionName, + data: { ...convertBNToNumberInObject(decodedShankData[0]), ...mappedAccountKeys }, + type: ParserType.INSTRUCTION, + }; + } + + return { + name: interfaceSerializer.instructionName, + data: convertBNToNumberInObject(decodedShankData[0]), + type: ParserType.INSTRUCTION, + }; + } + } } return null; diff --git a/packages/explorerkit-translator/tests/token/extensions.test.ts b/packages/explorerkit-translator/tests/token/extensions.test.ts index 9807102..3478ba7 100644 --- a/packages/explorerkit-translator/tests/token/extensions.test.ts +++ b/packages/explorerkit-translator/tests/token/extensions.test.ts @@ -678,3 +678,32 @@ describe("Parse Transfer Fee Extensions Instructions", () => { } }); }); + +describe("Parse Token Metadata Interface Instructions", () => { + it("should parse Initialize Token Metadata Instruction", () => { + if (token2022Parser) { + const accounts = [ + "Wy6KMLpjScEkh7TqvXiU9n56RU7YY5x9xnCPSnoMTUP", + "GY2JkeezT1j9B8Uh2YGPMXvFzgc4anNyEb9f2yR6xXeB", + "Wy6KMLpjScEkh7TqvXiU9n56RU7YY5x9xnCPSnoMTUP", + "GY2JkeezT1j9B8Uh2YGPMXvFzgc4anNyEb9f2yR6xXeB", + ]; + // 5FuE1VPjbPztLWeMbtNkcpgTEgmiuoLWYqJQK5UawUXLTFGM1ihtD79gnghdFVg6yr2BL5Ey88rLWMBZtRHRrtKT + const data = + "qzvJyWvsgjuZzV5s48dRpbdEPXzqG85j8rXTjEkXZXY5YT7YJyfs7oEp726uTT4nraxYxGZRX39NCBXRwzTRQPUokcgNt11Etf1N4J256cCaHkTZ66xz2MwvS6WneVj"; + + const decodedData = token2022Parser.parseInstructions(data, accounts, true); + expect(decodedData).not.toBeNull(); + expect(decodedData).not.toBeUndefined(); + expect(decodedData).toEqual({ + name: "initializeAccount", + data: { + name: "doodoo1", + symbol: "DOO", + uri: "https://prod-sujiko.s3.eu-north-1.amazonaws.com/assets/978.json", + }, + type: "instruction", + }); + } + }); +}); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8f61d33..c87003a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -34,19 +34,19 @@ importers: dependencies: '@typescript-eslint/eslint-plugin': specifier: ^6.9.0 - version: 6.9.0(@typescript-eslint/parser@6.9.0)(eslint@8.52.0)(typescript@5.2.2) + version: 6.9.0(@typescript-eslint/parser@6.9.0)(eslint@8.56.0)(typescript@5.3.3) '@typescript-eslint/parser': specifier: ^6.9.0 - version: 6.9.0(eslint@8.52.0)(typescript@5.2.2) + version: 6.9.0(eslint@8.56.0)(typescript@5.3.3) eslint-config-prettier: specifier: ^9.0.0 - version: 9.0.0(eslint@8.52.0) + version: 9.0.0(eslint@8.56.0) eslint-config-turbo: specifier: ^1.10.16 - version: 1.10.16(eslint@8.52.0) + version: 1.10.16(eslint@8.56.0) eslint-plugin-simple-import-sort: specifier: ^10.0.0 - version: 10.0.0(eslint@8.52.0) + version: 10.0.0(eslint@8.56.0) packages/explorerkit-idls: dependencies: @@ -142,12 +142,18 @@ importers: '@metaplex-foundation/umi-serializers': specifier: ^0.8.5 version: 0.8.5 + '@solana/spl-type-length-value': + specifier: ^0.1.0 + version: 0.1.0 '@solanafm/kinobi-lite': specifier: ^0.12.0 version: 0.12.0 '@solanafm/utils': - specifier: ^0.3.0 - version: 0.3.0 + specifier: ^1.0.4 + version: 1.0.4 + change-case: + specifier: ^5.4.2 + version: 5.4.2 devDependencies: '@solana/web3.js': specifier: ^1.87.2 @@ -677,16 +683,21 @@ packages: eslint-visitor-keys: 3.4.3 dev: true - /@eslint-community/eslint-utils@4.4.0(eslint@8.52.0): + /@eslint-community/eslint-utils@4.4.0(eslint@8.56.0): resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 dependencies: - eslint: 8.52.0 + eslint: 8.56.0 eslint-visitor-keys: 3.4.3 dev: false + /@eslint-community/regexpp@4.10.0: + resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + dev: false + /@eslint-community/regexpp@4.9.1: resolution: {integrity: sha512-Y27x+MBLjXa+0JWDhykM3+JE+il3kHKAEqabfEWq3SDhZjLYb6/BHL/JKFnH3fe207JaXkyDo685Oc2Glt6ifA==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} @@ -706,14 +717,32 @@ packages: strip-json-comments: 3.1.1 transitivePeerDependencies: - supports-color + dev: true + + /@eslint/eslintrc@2.1.4: + resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + ajv: 6.12.6 + debug: 4.3.4(supports-color@5.5.0) + espree: 9.6.1 + globals: 13.24.0 + ignore: 5.3.0 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + dev: false /@eslint/js@8.48.0: resolution: {integrity: sha512-ZSjtmelB7IJfWD2Fvb7+Z+ChTIKWq6kjda95fLcQKNS5aheVHn4IkfgRQE3sIIzTcSLwLcLZUD9UBt+V7+h+Pw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true - /@eslint/js@8.52.0: - resolution: {integrity: sha512-mjZVbpaeMZludF2fsWLD0Z9gCref1Tk4i9+wddjRvpUNqqcndPkBD09N/Mapey0b3jaXbLm2kICwFv2E64QinA==} + /@eslint/js@8.56.0: + resolution: {integrity: sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: false @@ -726,6 +755,18 @@ packages: minimatch: 3.1.2 transitivePeerDependencies: - supports-color + dev: true + + /@humanwhocodes/config-array@0.11.14: + resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} + engines: {node: '>=10.10.0'} + dependencies: + '@humanwhocodes/object-schema': 2.0.2 + debug: 4.3.4(supports-color@5.5.0) + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + dev: false /@humanwhocodes/module-importer@1.0.1: resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} @@ -733,6 +774,11 @@ packages: /@humanwhocodes/object-schema@2.0.1: resolution: {integrity: sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==} + dev: true + + /@humanwhocodes/object-schema@2.0.2: + resolution: {integrity: sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==} + dev: false /@isaacs/cliui@8.0.2: resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} @@ -896,6 +942,13 @@ packages: dependencies: buffer: 6.0.3 + /@solana/spl-type-length-value@0.1.0: + resolution: {integrity: sha512-JBMGB0oR4lPttOZ5XiUGyvylwLQjt1CPJa6qQ5oM+MBCndfjz2TKKkw0eATlLLcYmq1jBVsNlJ2cD6ns2GR7lA==} + engines: {node: '>=16'} + dependencies: + buffer: 6.0.3 + dev: false + /@solana/web3.js@1.87.2: resolution: {integrity: sha512-TZNhS+tvJbYjm0LAvIkUy/3Aqgt2l6/3X6XsVUpvj5MGOl2Q6Ch8hYSxcUUtMbAFNN3sUXmV8NhhMLNJEvI6TA==} dependencies: @@ -926,8 +979,8 @@ packages: chalk: 4.1.2 dev: false - /@solanafm/utils@0.3.0: - resolution: {integrity: sha512-SI0Q+PIH+t9gT4cPrLVKlPpjhByHFunyL01j/VfI2sBlBueuyCpO9PgpK/VQA2sZ8wdDqhq2g6gatzuNnlLJiQ==} + /@solanafm/utils@1.0.4: + resolution: {integrity: sha512-5+a0FLlxbgWRwmJYzYzdZnzSkc6aV2zBiqpdlr/dc7gqnFO8sdJ7KykyDf+LDaEHVIw07aSr/M/rpiZcEM7dnA==} dependencies: '@metaplex-foundation/umi-options': 0.8.9 bn.js: 5.2.1 @@ -1065,7 +1118,7 @@ packages: dependencies: '@types/node': 20.10.4 - /@typescript-eslint/eslint-plugin@6.9.0(@typescript-eslint/parser@6.9.0)(eslint@8.52.0)(typescript@5.2.2): + /@typescript-eslint/eslint-plugin@6.9.0(@typescript-eslint/parser@6.9.0)(eslint@8.56.0)(typescript@5.3.3): resolution: {integrity: sha512-lgX7F0azQwRPB7t7WAyeHWVfW1YJ9NIgd9mvGhfQpRY56X6AVf8mwM8Wol+0z4liE7XX3QOt8MN1rUKCfSjRIA==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: @@ -1077,24 +1130,24 @@ packages: optional: true dependencies: '@eslint-community/regexpp': 4.9.1 - '@typescript-eslint/parser': 6.9.0(eslint@8.52.0)(typescript@5.2.2) + '@typescript-eslint/parser': 6.9.0(eslint@8.56.0)(typescript@5.3.3) '@typescript-eslint/scope-manager': 6.9.0 - '@typescript-eslint/type-utils': 6.9.0(eslint@8.52.0)(typescript@5.2.2) - '@typescript-eslint/utils': 6.9.0(eslint@8.52.0)(typescript@5.2.2) + '@typescript-eslint/type-utils': 6.9.0(eslint@8.56.0)(typescript@5.3.3) + '@typescript-eslint/utils': 6.9.0(eslint@8.56.0)(typescript@5.3.3) '@typescript-eslint/visitor-keys': 6.9.0 debug: 4.3.4(supports-color@5.5.0) - eslint: 8.52.0 + eslint: 8.56.0 graphemer: 1.4.0 ignore: 5.2.4 natural-compare: 1.4.0 semver: 7.5.4 - ts-api-utils: 1.0.3(typescript@5.2.2) - typescript: 5.2.2 + ts-api-utils: 1.0.3(typescript@5.3.3) + typescript: 5.3.3 transitivePeerDependencies: - supports-color dev: false - /@typescript-eslint/parser@6.9.0(eslint@8.52.0)(typescript@5.2.2): + /@typescript-eslint/parser@6.9.0(eslint@8.56.0)(typescript@5.3.3): resolution: {integrity: sha512-GZmjMh4AJ/5gaH4XF2eXA8tMnHWP+Pm1mjQR2QN4Iz+j/zO04b9TOvJYOX2sCNIQHtRStKTxRY1FX7LhpJT4Gw==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: @@ -1106,11 +1159,11 @@ packages: dependencies: '@typescript-eslint/scope-manager': 6.9.0 '@typescript-eslint/types': 6.9.0 - '@typescript-eslint/typescript-estree': 6.9.0(typescript@5.2.2) + '@typescript-eslint/typescript-estree': 6.9.0(typescript@5.3.3) '@typescript-eslint/visitor-keys': 6.9.0 debug: 4.3.4(supports-color@5.5.0) - eslint: 8.52.0 - typescript: 5.2.2 + eslint: 8.56.0 + typescript: 5.3.3 transitivePeerDependencies: - supports-color dev: false @@ -1123,7 +1176,7 @@ packages: '@typescript-eslint/visitor-keys': 6.9.0 dev: false - /@typescript-eslint/type-utils@6.9.0(eslint@8.52.0)(typescript@5.2.2): + /@typescript-eslint/type-utils@6.9.0(eslint@8.56.0)(typescript@5.3.3): resolution: {integrity: sha512-XXeahmfbpuhVbhSOROIzJ+b13krFmgtc4GlEuu1WBT+RpyGPIA4Y/eGnXzjbDj5gZLzpAXO/sj+IF/x2GtTMjQ==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: @@ -1133,12 +1186,12 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/typescript-estree': 6.9.0(typescript@5.2.2) - '@typescript-eslint/utils': 6.9.0(eslint@8.52.0)(typescript@5.2.2) + '@typescript-eslint/typescript-estree': 6.9.0(typescript@5.3.3) + '@typescript-eslint/utils': 6.9.0(eslint@8.56.0)(typescript@5.3.3) debug: 4.3.4(supports-color@5.5.0) - eslint: 8.52.0 - ts-api-utils: 1.0.3(typescript@5.2.2) - typescript: 5.2.2 + eslint: 8.56.0 + ts-api-utils: 1.0.3(typescript@5.3.3) + typescript: 5.3.3 transitivePeerDependencies: - supports-color dev: false @@ -1148,7 +1201,7 @@ packages: engines: {node: ^16.0.0 || >=18.0.0} dev: false - /@typescript-eslint/typescript-estree@6.9.0(typescript@5.2.2): + /@typescript-eslint/typescript-estree@6.9.0(typescript@5.3.3): resolution: {integrity: sha512-NJM2BnJFZBEAbCfBP00zONKXvMqihZCrmwCaik0UhLr0vAgb6oguXxLX1k00oQyD+vZZ+CJn3kocvv2yxm4awQ==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: @@ -1163,25 +1216,25 @@ packages: globby: 11.1.0 is-glob: 4.0.3 semver: 7.5.4 - ts-api-utils: 1.0.3(typescript@5.2.2) - typescript: 5.2.2 + ts-api-utils: 1.0.3(typescript@5.3.3) + typescript: 5.3.3 transitivePeerDependencies: - supports-color dev: false - /@typescript-eslint/utils@6.9.0(eslint@8.52.0)(typescript@5.2.2): + /@typescript-eslint/utils@6.9.0(eslint@8.56.0)(typescript@5.3.3): resolution: {integrity: sha512-5Wf+Jsqya7WcCO8me504FBigeQKVLAMPmUzYgDbWchINNh1KJbxCgVya3EQ2MjvJMVeXl3pofRmprqX6mfQkjQ==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: eslint: ^7.0.0 || ^8.0.0 dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.52.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@8.56.0) '@types/json-schema': 7.0.14 '@types/semver': 7.5.4 '@typescript-eslint/scope-manager': 6.9.0 '@typescript-eslint/types': 6.9.0 - '@typescript-eslint/typescript-estree': 6.9.0(typescript@5.2.2) - eslint: 8.52.0 + '@typescript-eslint/typescript-estree': 6.9.0(typescript@5.3.3) + eslint: 8.56.0 semver: 7.5.4 transitivePeerDependencies: - supports-color @@ -1657,6 +1710,10 @@ packages: ansi-styles: 4.3.0 supports-color: 7.2.0 + /change-case@5.4.2: + resolution: {integrity: sha512-WB3UiTDpT+vrTilAWaJS4gaIH/jc1He4H9f6erQvraUYas90uWT0JOYFkG1imdNv710XJ6gJvqynrgOHc4ihDA==} + dev: false + /chardet@0.7.0: resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} dev: true @@ -2144,39 +2201,39 @@ packages: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} - /eslint-config-prettier@9.0.0(eslint@8.52.0): + /eslint-config-prettier@9.0.0(eslint@8.56.0): resolution: {integrity: sha512-IcJsTkJae2S35pRsRAwoCE+925rJJStOdkKnLVgtE+tEpqU0EVVM7OqrwxqgptKdX29NUwC82I5pXsGFIgSevw==} hasBin: true peerDependencies: eslint: '>=7.0.0' dependencies: - eslint: 8.52.0 + eslint: 8.56.0 dev: false - /eslint-config-turbo@1.10.16(eslint@8.52.0): + /eslint-config-turbo@1.10.16(eslint@8.56.0): resolution: {integrity: sha512-O3NQI72bQHV7FvSC6lWj66EGx8drJJjuT1kuInn6nbMLOHdMBhSUX/8uhTAlHRQdlxZk2j9HtgFCIzSc93w42g==} peerDependencies: eslint: '>6.6.0' dependencies: - eslint: 8.52.0 - eslint-plugin-turbo: 1.10.16(eslint@8.52.0) + eslint: 8.56.0 + eslint-plugin-turbo: 1.10.16(eslint@8.56.0) dev: false - /eslint-plugin-simple-import-sort@10.0.0(eslint@8.52.0): + /eslint-plugin-simple-import-sort@10.0.0(eslint@8.56.0): resolution: {integrity: sha512-AeTvO9UCMSNzIHRkg8S6c3RPy5YEwKWSQPx3DYghLedo2ZQxowPFLGDN1AZ2evfg6r6mjBSZSLxLFsWSu3acsw==} peerDependencies: eslint: '>=5.0.0' dependencies: - eslint: 8.52.0 + eslint: 8.56.0 dev: false - /eslint-plugin-turbo@1.10.16(eslint@8.52.0): + /eslint-plugin-turbo@1.10.16(eslint@8.56.0): resolution: {integrity: sha512-ZjrR88MTN64PNGufSEcM0tf+V1xFYVbeiMeuIqr0aiABGomxFLo4DBkQ7WI4WzkZtWQSIA2sP+yxqSboEfL9MQ==} peerDependencies: eslint: '>6.6.0' dependencies: dotenv: 16.0.3 - eslint: 8.52.0 + eslint: 8.56.0 dev: false /eslint-scope@7.2.2: @@ -2236,16 +2293,16 @@ packages: - supports-color dev: true - /eslint@8.52.0: - resolution: {integrity: sha512-zh/JHnaixqHZsolRB/w9/02akBk9EPrOs9JwcTP2ek7yL5bVvXuRariiaAjjoJ5DvuwQ1WAE/HsMz+w17YgBCg==} + /eslint@8.56.0: + resolution: {integrity: sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} hasBin: true dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.52.0) - '@eslint-community/regexpp': 4.9.1 - '@eslint/eslintrc': 2.1.2 - '@eslint/js': 8.52.0 - '@humanwhocodes/config-array': 0.11.13 + '@eslint-community/eslint-utils': 4.4.0(eslint@8.56.0) + '@eslint-community/regexpp': 4.10.0 + '@eslint/eslintrc': 2.1.4 + '@eslint/js': 8.56.0 + '@humanwhocodes/config-array': 0.11.14 '@humanwhocodes/module-importer': 1.0.1 '@nodelib/fs.walk': 1.2.8 '@ungap/structured-clone': 1.2.0 @@ -2264,9 +2321,9 @@ packages: file-entry-cache: 6.0.1 find-up: 5.0.0 glob-parent: 6.0.2 - globals: 13.23.0 + globals: 13.24.0 graphemer: 1.4.0 - ignore: 5.2.4 + ignore: 5.3.0 imurmurhash: 0.1.4 is-glob: 4.0.3 is-path-inside: 3.0.3 @@ -2666,6 +2723,14 @@ packages: engines: {node: '>=8'} dependencies: type-fest: 0.20.2 + dev: true + + /globals@13.24.0: + resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} + engines: {node: '>=8'} + dependencies: + type-fest: 0.20.2 + dev: false /globalthis@1.0.3: resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} @@ -2799,6 +2864,11 @@ packages: resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} engines: {node: '>= 4'} + /ignore@5.3.0: + resolution: {integrity: sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==} + engines: {node: '>= 4'} + dev: false + /import-fresh@3.3.0: resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} engines: {node: '>=6'} @@ -4437,13 +4507,13 @@ packages: engines: {node: '>=8'} dev: true - /ts-api-utils@1.0.3(typescript@5.2.2): + /ts-api-utils@1.0.3(typescript@5.3.3): resolution: {integrity: sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==} engines: {node: '>=16.13.0'} peerDependencies: typescript: '>=4.2.0' dependencies: - typescript: 5.2.2 + typescript: 5.3.3 dev: false /ts-interface-checker@0.1.13: @@ -4638,8 +4708,8 @@ packages: is-typed-array: 1.1.12 dev: true - /typescript@5.2.2: - resolution: {integrity: sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==} + /typescript@5.3.3: + resolution: {integrity: sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==} engines: {node: '>=14.17'} hasBin: true dev: false