Skip to content

fix: coalesce concurrent secret reference folder loads - #8011

Merged
maidul98 merged 1 commit into
mainfrom
fix/secret-reference-inflight-fetch
Sep 5, 2026
Merged

maidul98 merged 1 commit into
mainfrom
fix/secret-reference-inflight-fetch

Conversation

@maidul98

@maidul98 maidul98 commented Sep 5, 2026 •

Copy link
Copy Markdown
Collaborator

Context

When Redis has no cached response, several secret references can try to load the same folder at once. Previously, each could start its own database read before the in-memory cache was ready.

This change lets those references wait for one shared folder load, then reuse its result. This reduces duplicate database reads and memory used while resolving references within the same expander. Redis caching stays the same.

Steps to verify the change

I added a test that resolves 50 references to the same folder and checks that it is read only once. It fails on the old code and passes with this fix. Lint passes for the changed files.

Type

  • Fix
  • Feature
  • Improvement
  • Breaking
  • Docs
  • Chore

@infisical-review-police

Copy link
Copy Markdown

💬 Discussion in Slack: #pr-review-infisical-8011-fix-coalesce-concurrent-secret-reference-folder-loads

Posted by Review Police — reviews, comments, new commits, and CI failures will stream into this channel.

@maidul98
maidul98 force-pushed the fix/secret-reference-inflight-fetch branch from d2a00a3 to 88bd99c Compare September 5, 2026 14:51
@maidul98
maidul98 marked this pull request as ready for review September 5, 2026 14:57
@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Sep 5, 2026 •

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ✅ Completed 2026-09-05T15:02:01.154027Z 88bd99c Draft marked ready
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@greptile-apps

greptile-apps Bot commented Sep 5, 2026

Copy link
Copy Markdown
Contributor

Greptile Summary

This PR coalesces concurrent same-project secret-folder cache misses within one reference expander.

  • Tracks each in-flight folder load by the existing environment-and-path cache key.
  • Makes concurrent references await and reuse the same load.
  • Adds a focused Vitest regression test verifying that 50 concurrent references trigger only one folder and secret read.

Confidence Score: 5/5

The PR appears safe to merge, with no actionable correctness, security, or repository-rule violations identified.

The pending-load map is scoped to each factory instance, uses the same key as the folder cache, is cleaned up after settlement, and preserves existing fallback behavior; the new test exercises the targeted concurrent miss.

Important Files Changed

Filename Overview
backend/src/services/secret-v2-bridge/secret-reference-fns.ts Adds per-expander in-flight folder-load coalescing while preserving existing missing-secret and error behavior.
backend/src/services/secret-v2-bridge/secret-reference-fns.test.ts Adds a valid concurrent regression test asserting one database read for 50 same-folder references.

Reviews (1): Last reviewed commit: "fix: coalesce concurrent secret referenc..." | Re-trigger Greptile

@maidul98
maidul98 merged commit efd604e into main Sep 5, 2026
29 of 32 checks passed
@datukwandenny

Copy link
Copy Markdown

{
"kind": "rootNode",
"program": {
"kind": "programNode",
"pdas": [],
"accounts": [
{
"kind": "accountNode",
"data": {
"kind": "structTypeNode",
"fields": [
{
"kind": "structFieldTypeNode",
"name": "mintAuthority",
"type": {
"kind": "optionTypeNode",
"item": { "kind": "publicKeyTypeNode" },
"prefix": {
"kind": "numberTypeNode",
"format": "u32",
"endian": "le"
},
"fixed": true
},
"docs": [
"Optional authority used to mint new tokens. The mint authority may only",
"be provided during mint creation. If no mint authority is present",
"then the mint has a fixed supply and no further tokens may be minted."
]
},
{
"kind": "structFieldTypeNode",
"name": "supply",
"type": {
"kind": "numberTypeNode",
"format": "u64",
"endian": "le"
},
"docs": ["Total supply of tokens."]
},
{
"kind": "structFieldTypeNode",
"name": "decimals",
"type": {
"kind": "numberTypeNode",
"format": "u8",
"endian": "le"
},
"docs": [
"Number of base 10 digits to the right of the decimal place."
]
},
{
"kind": "structFieldTypeNode",
"name": "isInitialized",
"type": {
"kind": "booleanTypeNode",
"size": {
"kind": "numberTypeNode",
"format": "u8",
"endian": "le"
}
},
"docs": ["Is true if this structure has been initialized."]
},
{
"kind": "structFieldTypeNode",
"name": "freezeAuthority",
"type": {
"kind": "optionTypeNode",
"item": { "kind": "publicKeyTypeNode" },
"prefix": {
"kind": "numberTypeNode",
"format": "u32",
"endian": "le"
},
"fixed": true
},
"docs": ["Optional authority to freeze token accounts."]
}
]
},
"discriminators": [
{
"kind": "sizeDiscriminatorNode",
"size": 82
}
],
"name": "mint",
"docs": [],
"size": 82
},
{
"kind": "accountNode",
"data": {
"kind": "structTypeNode",
"fields": [
{
"kind": "structFieldTypeNode",
"name": "mint",
"type": { "kind": "publicKeyTypeNode" },
"docs": ["The mint associated with this account."]
},
{
"kind": "structFieldTypeNode",
"name": "owner",
"type": { "kind": "publicKeyTypeNode" },
"docs": ["The owner of this account."]
},
{
"kind": "structFieldTypeNode",
"name": "amount",
"type": {
"kind": "numberTypeNode",
"format": "u64",
"endian": "le"
},
"docs": ["The amount of tokens this account holds."]
},
{
"kind": "structFieldTypeNode",
"name": "delegate",
"type": {
"kind": "optionTypeNode",
"item": { "kind": "publicKeyTypeNode" },
"prefix": {
"kind": "numberTypeNode",
"format": "u32",
"endian": "le"
},
"fixed": true
},
"docs": [
"If delegate is Some then delegated_amount represents",
"the amount authorized by the delegate."
]
},
{
"kind": "structFieldTypeNode",
"name": "state",
"type": { "kind": "definedTypeLinkNode", "name": "accountState" },
"docs": ["The account's state."]
},
{
"kind": "structFieldTypeNode",
"name": "isNative",
"type": {
"kind": "optionTypeNode",
"item": {
"kind": "numberTypeNode",
"format": "u64",
"endian": "le"
},
"prefix": {
"kind": "numberTypeNode",
"format": "u32",
"endian": "le"
},
"fixed": true
},
"docs": [
"If is_native.is_some, this is a native token, and the value logs the",
"rent-exempt reserve. An Account is required to be rent-exempt, so",
"the value is used by the Processor to ensure that wrapped SOL",
"accounts do not drop below this threshold."
]
},
{
"kind": "structFieldTypeNode",
"name": "delegatedAmount",
"type": {
"kind": "numberTypeNode",
"format": "u64",
"endian": "le"
},
"docs": ["The amount delegated."]
},
{
"kind": "structFieldTypeNode",
"name": "closeAuthority",
"type": {
"kind": "optionTypeNode",
"item": { "kind": "publicKeyTypeNode" },
"prefix": {
"kind": "numberTypeNode",
"format": "u32",
"endian": "le"
},
"fixed": true
},
"docs": ["Optional authority to close the account."]
}
]
},
"discriminators": [
{
"kind": "sizeDiscriminatorNode",
"size": 165
}
],
"name": "token",
"docs": [],
"size": 165
},
{
"kind": "accountNode",
"data": {
"kind": "structTypeNode",
"fields": [
{
"kind": "structFieldTypeNode",
"name": "m",
"type": {
"kind": "numberTypeNode",
"format": "u8",
"endian": "le"
},
"docs": ["Number of signers required."]
},
{
"kind": "structFieldTypeNode",
"name": "n",
"type": {
"kind": "numberTypeNode",
"format": "u8",
"endian": "le"
},
"docs": ["Number of valid signers."]
},
{
"kind": "structFieldTypeNode",
"name": "isInitialized",
"type": {
"kind": "booleanTypeNode",
"size": {
"kind": "numberTypeNode",
"format": "u8",
"endian": "le"
}
},
"docs": ["Is true if this structure has been initialized."]
},
{
"kind": "structFieldTypeNode",
"name": "signers",
"type": {
"kind": "arrayTypeNode",
"item": { "kind": "publicKeyTypeNode" },
"count": { "kind": "fixedCountNode", "value": 11 }
},
"docs": ["Signer public keys."]
}
]
},
"discriminators": [
{
"kind": "sizeDiscriminatorNode",
"size": 355
}
],
"name": "multisig",
"docs": [],
"size": 355
}
],
"instructions": [
{
"kind": "instructionNode",
"display": {
"kind": "instructionDisplayNode",
"intent": "Initialize mint",
"interpolatedIntent": "Initialize mint ${accounts.mint} with ${data.decimals} decimals"
},
"accounts": [
{
"kind": "instructionAccountNode",
"name": "mint",
"isWritable": true,
"isSigner": false,
"isOptional": false,
"docs": ["Token mint account."]
},
{
"kind": "instructionAccountNode",
"display": {
"kind": "instructionAccountDisplayNode",
"skip": "always"
},
"name": "rent",
"isWritable": false,
"isSigner": false,
"isOptional": false,
"docs": ["Rent sysvar."],
"defaultValue": {
"kind": "publicKeyValueNode",
"publicKey": "SysvarRent111111111111111111111111111111111"
}
}
],
"arguments": [
{
"kind": "instructionArgumentNode",
"display": {
"kind": "structFieldDisplayNode",
"skip": "always"
},
"name": "discriminator",
"type": {
"kind": "numberTypeNode",
"format": "u8",
"endian": "le"
},
"docs": [],
"defaultValue": { "kind": "numberValueNode", "number": 0 },
"defaultValueStrategy": "omitted"
},
{
"kind": "instructionArgumentNode",
"name": "decimals",
"type": {
"kind": "numberTypeNode",
"format": "u8",
"endian": "le"
},
"docs": ["Number of decimals in token account amounts."]
},
{
"kind": "instructionArgumentNode",
"name": "mintAuthority",
"type": { "kind": "publicKeyTypeNode" },
"docs": ["Minting authority."]
},
{
"kind": "instructionArgumentNode",
"name": "freezeAuthority",
"type": {
"kind": "optionTypeNode",
"item": { "kind": "publicKeyTypeNode" },
"prefix": {
"kind": "numberTypeNode",
"format": "u8",
"endian": "le"
},
"fixed": false
},
"defaultValue": {
"kind": "noneValueNode"
},
"docs": ["Optional authority that can freeze token accounts."]
}
],
"discriminators": [
{
"kind": "fieldDiscriminatorNode",
"name": "discriminator",
"offset": 0
}
],
"name": "initializeMint",
"docs": [
"Initializes a new mint and optionally deposits all the newly minted",
"tokens in an account.",
"",
"The InitializeMint instruction requires no signers and MUST be",
"included within the same Transaction as the system program's",
"CreateAccount instruction that creates the account being initialized.",
"Otherwise another party can acquire ownership of the uninitialized account."
],
"optionalAccountStrategy": "programId"
},
{
"kind": "instructionNode",
"display": {
"kind": "instructionDisplayNode",
"intent": "Initialize token account",
"interpolatedIntent": "Initialize token account ${accounts.account} for mint ${accounts.mint}"
},
"accounts": [
{
"kind": "instructionAccountNode",
"display": {
"kind": "instructionAccountDisplayNode",
"label": "Token Account"
},
"name": "account",
"isWritable": true,
"isSigner": false,
"isOptional": false,
"docs": ["The account to initialize."]
},
{
"kind": "instructionAccountNode",
"name": "mint",
"isWritable": false,
"isSigner": false,
"isOptional": false,
"docs": ["The mint this account will be associated with."]
},
{
"kind": "instructionAccountNode",
"name": "owner",
"isWritable": false,
"isSigner": false,
"isOptional": false,
"docs": ["The new account's owner/multisignature."]
},
{
"kind": "instructionAccountNode",
"display": {
"kind": "instructionAccountDisplayNode",
"skip": "always"
},
"name": "rent",
"isWritable": false,
"isSigner": false,
"isOptional": false,
"docs": ["Rent sysvar."],
"defaultValue": {
"kind": "publicKeyValueNode",
"publicKey": "SysvarRent111111111111111111111111111111111"
}
}
],
"arguments": [
{
"kind": "instructionArgumentNode",
"display": {
"kind": "structFieldDisplayNode",
"skip": "always"
},
"name": "discriminator",
"type": {
"kind": "numberTypeNode",
"format": "u8",
"endian": "le"
},
"docs": [],
"defaultValue": { "kind": "numberValueNode", "number": 1 },
"defaultValueStrategy": "omitted"
}
],
"discriminators": [
{
"kind": "fieldDiscriminatorNode",
"name": "discriminator",
"offset": 0
}
],
"name": "initializeAccount",
"docs": [
"Initializes a new account to hold tokens. If this account is associated",
"with the native mint then the token balance of the initialized account",
"will be equal to the amount of SOL in the account. If this account is",
"associated with another mint, that mint must be initialized before this",
"command can succeed.",
"",
"The InitializeAccount instruction requires no signers and MUST be",
"included within the same Transaction as the system program's",
"CreateAccount instruction that creates the account being initialized.",
"Otherwise another party can acquire ownership of the uninitialized account."
],
"optionalAccountStrategy": "programId"
},
{
"kind": "instructionNode",
"display": {
"kind": "instructionDisplayNode",
"intent": "Initialize multisig",
"interpolatedIntent": "Initialize multisig ${accounts.multisig} requiring ${data.m} signatures"
},
"accounts": [
{
"kind": "instructionAccountNode",
"name": "multisig",
"isWritable": true,
"isSigner": false,
"isOptional": false,
"docs": ["The multisignature account to initialize."]
},
{
"kind": "instructionAccountNode",
"display": {
"kind": "instructionAccountDisplayNode",
"skip": "always"
},
"name": "rent",
"isWritable": false,
"isSigner": false,
"isOptional": false,
"docs": ["Rent sysvar."],
"defaultValue": {
"kind": "publicKeyValueNode",
"publicKey": "SysvarRent111111111111111111111111111111111"
}
}
],
"arguments": [
{
"kind": "instructionArgumentNode",
"display": {
"kind": "structFieldDisplayNode",
"skip": "always"
},
"name": "discriminator",
"type": {
"kind": "numberTypeNode",
"format": "u8",
"endian": "le"
},
"docs": [],
"defaultValue": { "kind": "numberValueNode", "number": 2 },
"defaultValueStrategy": "omitted"
},
{
"kind": "instructionArgumentNode",
"display": {
"kind": "structFieldDisplayNode",
"label": "Required Signatures"
},
"name": "m",
"type": {
"kind": "numberTypeNode",
"format": "u8",
"endian": "le"
},
"docs": [
"The number of signers (M) required to validate this multisignature account."
]
}
],
"discriminators": [
{
"kind": "fieldDiscriminatorNode",
"name": "discriminator",
"offset": 0
}
],
"remainingAccounts": [
{
"kind": "instructionRemainingAccountsNode",
"display": {
"kind": "instructionAccountDisplayNode",
"label": "Signers"
},
"value": {
"kind": "argumentValueNode",
"name": "signers"
}
}
],
"name": "initializeMultisig",
"docs": [
"Initializes a multisignature account with N provided signers.",
"",
"Multisignature accounts can used in place of any single owner/delegate",
"accounts in any token instruction that require an owner/delegate to be",
"present. The variant field represents the number of signers (M)",
"required to validate this multisignature account.",
"",
"The InitializeMultisig instruction requires no signers and MUST be",
"included within the same Transaction as the system program's",
"CreateAccount instruction that creates the account being initialized.",
"Otherwise another party can acquire ownership of the uninitialized account."
],
"optionalAccountStrategy": "programId"
},
{
"kind": "instructionNode",
"display": {
"kind": "instructionDisplayNode",
"intent": "Transfer tokens",
"interpolatedIntent": "Transfer ${data.amount} from ${accounts.source} to ${accounts.destination}"
},
"accounts": [
{
"kind": "instructionAccountNode",
"display": {
"kind": "instructionAccountDisplayNode",
"label": "From"
},
"name": "source",
"isWritable": true,
"isSigner": false,
"isOptional": false,
"docs": ["The source account."]
},
{
"kind": "instructionAccountNode",
"display": {
"kind": "instructionAccountDisplayNode",
"label": "To"
},
"name": "destination",
"isWritable": true,
"isSigner": false,
"isOptional": false,
"docs": ["The destination account."]
},
{
"kind": "instructionAccountNode",
"name": "authority",
"isWritable": false,
"isSigner": "either",
"isOptional": false,
"docs": [
"The source account's owner/delegate or its multisignature account."
],
"defaultValue": { "kind": "identityValueNode" }
}
],
"arguments": [
{
"kind": "instructionArgumentNode",
"display": {
"kind": "structFieldDisplayNode",
"skip": "always"
},
"name": "discriminator",
"type": {
"kind": "numberTypeNode",
"format": "u8",
"endian": "le"
},
"docs": [],
"defaultValue": { "kind": "numberValueNode", "number": 3 },
"defaultValueStrategy": "omitted"
},
{
"kind": "instructionArgumentNode",
"name": "amount",
"type": {
"kind": "numberTypeNode",
"display": {
"kind": "amountNumberDisplayNode",
"unit": {
"kind": "stringValueNode",
"string": "base units"
}
},
"format": "u64",
"endian": "le"
},
"docs": ["The amount of tokens to transfer."]
}
],
"discriminators": [
{
"kind": "fieldDiscriminatorNode",
"name": "discriminator",
"offset": 0
}
],
"remainingAccounts": [
{
"kind": "instructionRemainingAccountsNode",
"value": {
"kind": "argumentValueNode",
"name": "multiSigners"
},
"isOptional": true,
"isSigner": true
}
],
"name": "transfer",
"docs": [
"Transfers tokens from one account to another either directly or via a delegate.",
"If this account is associated with the native mint then equal amounts",
"of SOL and Tokens will be transferred to the destination account."
],
"optionalAccountStrategy": "programId"
},
{
"kind": "instructionNode",
"display": {
"kind": "instructionDisplayNode",
"intent": "Approve delegate",
"interpolatedIntent": "Approve ${accounts.delegate} to spend ${data.amount} from ${accounts.source}"
},
"accounts": [
{
"kind": "instructionAccountNode",
"display": {
"kind": "instructionAccountDisplayNode",
"label": "Token Account"
},
"name": "source",
"isWritable": true,
"isSigner": false,
"isOptional": false,
"docs": ["The source account."]
},
{
"kind": "instructionAccountNode",
"name": "delegate",
"isWritable": false,
"isSigner": false,
"isOptional": false,
"docs": ["The delegate."]
},
{
"kind": "instructionAccountNode",
"name": "owner",
"isWritable": false,
"isSigner": "either",
"isOptional": false,
"docs": ["The source account owner or its multisignature account."]
}
],
"arguments": [
{
"kind": "instructionArgumentNode",
"display": {
"kind": "structFieldDisplayNode",
"skip": "always"
},
"name": "discriminator",
"type": {
"kind": "numberTypeNode",
"format": "u8",
"endian": "le"
},
"docs": [],
"defaultValue": { "kind": "numberValueNode", "number": 4 },
"defaultValueStrategy": "omitted"
},
{
"kind": "instructionArgumentNode",
"name": "amount",
"type": {
"kind": "numberTypeNode",
"display": {
"kind": "amountNumberDisplayNode",
"unit": {
"kind": "stringValueNode",
"string": "base units"
}
},
"format": "u64",
"endian": "le"
},
"docs": ["The amount of tokens the delegate is approved for."]
}
],
"discriminators": [
{
"kind": "fieldDiscriminatorNode",
"name": "discriminator",
"offset": 0
}
],
"remainingAccounts": [
{
"kind": "instructionRemainingAccountsNode",
"value": {
"kind": "argumentValueNode",
"name": "multiSigners"
},
"isOptional": true,
"isSigner": true
}
],
"name": "approve",
"docs": [
"Approves a delegate. A delegate is given the authority over tokens on",
"behalf of the source account's owner."
],
"optionalAccountStrategy": "programId"
},
{
"kind": "instructionNode",
"display": {
"kind": "instructionDisplayNode",
"intent": "Revoke delegate",
"interpolatedIntent": "Revoke the delegate of ${accounts.source}"
},
"accounts": [
{
"kind": "instructionAccountNode",
"display": {
"kind": "instructionAccountDisplayNode",
"label": "Token Account"
},
"name": "source",
"isWritable": true,
"isSigner": false,
"isOptional": false,
"docs": ["The source account."]
},
{
"kind": "instructionAccountNode",
"name": "owner",
"isWritable": false,
"isSigner": "either",
"isOptional": false,
"docs": ["The source account owner or its multisignature."]
}
],
"arguments": [
{
"kind": "instructionArgumentNode",
"display": {
"kind": "structFieldDisplayNode",
"skip": "always"
},
"name": "discriminator",
"type": {
"kind": "numberTypeNode",
"format": "u8",
"endian": "le"
},
"docs": [],
"defaultValue": { "kind": "numberValueNode", "number": 5 },
"defaultValueStrategy": "omitted"
}
],
"discriminators": [
{
"kind": "fieldDiscriminatorNode",
"name": "discriminator",
"offset": 0
}
],
"remainingAccounts": [
{
"kind": "instructionRemainingAccountsNode",
"value": {
"kind": "argumentValueNode",
"name": "multiSigners"
},
"isOptional": true,
"isSigner": true
}
],
"name": "revoke",
"docs": ["Revokes the delegate's authority."],
"optionalAccountStrategy": "programId"
},
{
"kind": "instructionNode",
"display": {
"kind": "instructionDisplayNode",
"intent": "Set authority",
"interpolatedIntent": "Change an authority of ${accounts.owned}"
},
"accounts": [
{
"kind": "instructionAccountNode",
"display": {
"kind": "instructionAccountDisplayNode",
"label": "Account"
},
"name": "owned",
"isWritable": true,
"isSigner": false,
"isOptional": false,
"docs": ["The mint or account to change the authority of."]
},
{
"kind": "instructionAccountNode",
"name": "owner",
"isWritable": false,
"isSigner": "either",
"isOptional": false,
"docs": [
"The current authority or the multisignature account of the mint or account to update."
]
}
],
"arguments": [
{
"kind": "instructionArgumentNode",
"display": {
"kind": "structFieldDisplayNode",
"skip": "always"
},
"name": "discriminator",
"type": {
"kind": "numberTypeNode",
"format": "u8",
"endian": "le"
},
"docs": [],
"defaultValue": { "kind": "numberValueNode", "number": 6 },
"defaultValueStrategy": "omitted"
},
{
"kind": "instructionArgumentNode",
"name": "authorityType",
"type": { "kind": "definedTypeLinkNode", "name": "authorityType" },
"docs": ["The type of authority to update."]
},
{
"kind": "instructionArgumentNode",
"name": "newAuthority",
"type": {
"kind": "optionTypeNode",
"item": { "kind": "publicKeyTypeNode" },
"prefix": {
"kind": "numberTypeNode",
"format": "u8",
"endian": "le"
},
"fixed": false
},
"docs": ["The new authority"]
}
],
"discriminators": [
{
"kind": "fieldDiscriminatorNode",
"name": "discriminator",
"offset": 0
}
],
"remainingAccounts": [
{
"kind": "instructionRemainingAccountsNode",
"value": {
"kind": "argumentValueNode",
"name": "multiSigners"
},
"isOptional": true,
"isSigner": true
}
],
"name": "setAuthority",
"docs": ["Sets a new authority of a mint or account."],
"optionalAccountStrategy": "programId"
},
{
"kind": "instructionNode",
"display": {
"kind": "instructionDisplayNode",
"intent": "Mint tokens",
"interpolatedIntent": "Mint ${data.amount} ${accounts.mint} to ${accounts.token}"
},
"provides": [
{
"kind": "providedNode",
"name": "decimals",
"node": {
"account": "mint",
"kind": "accountFieldValueNode",
"path": "decimals"
}
}
],
"accounts": [
{
"kind": "instructionAccountNode",
"accountLink": {
"kind": "accountLinkNode",
"name": "mint"
},
"name": "mint",
"isWritable": true,
"isSigner": false,
"isOptional": false,
"docs": ["The mint account."]
},
{
"kind": "instructionAccountNode",
"display": {
"kind": "instructionAccountDisplayNode",
"label": "To"
},
"name": "token",
"isWritable": true,
"isSigner": false,
"isOptional": false,
"docs": ["The account to mint tokens to."]
},
{
"kind": "instructionAccountNode",
"name": "mintAuthority",
"isWritable": false,
"isSigner": "either",
"isOptional": false,
"docs": [
"The mint's minting authority or its multisignature account."
]
}
],
"arguments": [
{
"kind": "instructionArgumentNode",
"display": {
"kind": "structFieldDisplayNode",
"skip": "always"
},
"name": "discriminator",
"type": {
"kind": "numberTypeNode",
"format": "u8",
"endian": "le"
},
"docs": [],
"defaultValue": { "kind": "numberValueNode", "number": 7 },
"defaultValueStrategy": "omitted"
},
{
"kind": "instructionArgumentNode",
"name": "amount",
"type": {
"kind": "numberTypeNode",
"display": {
"decimals": {
"kind": "injectedValueNode",
"key": "decimals"
},
"kind": "amountNumberDisplayNode"
},
"format": "u64",
"endian": "le"
},
"docs": ["The amount of new tokens to mint."]
}
],
"discriminators": [
{
"kind": "fieldDiscriminatorNode",
"name": "discriminator",
"offset": 0
}
],
"remainingAccounts": [
{
"kind": "instructionRemainingAccountsNode",
"value": {
"kind": "argumentValueNode",
"name": "multiSigners"
},
"isOptional": true,
"isSigner": true
}
],
"name": "mintTo",
"docs": [
"Mints new tokens to an account. The native mint does not support minting."
],
"optionalAccountStrategy": "programId"
},
{
"kind": "instructionNode",
"display": {
"kind": "instructionDisplayNode",
"intent": "Burn tokens",
"interpolatedIntent": "Burn ${data.amount} ${accounts.mint} from ${accounts.account}"
},
"provides": [
{
"kind": "providedNode",
"name": "decimals",
"node": {
"account": "mint",
"kind": "accountFieldValueNode",
"path": "decimals"
}
}
],
"accounts": [
{
"kind": "instructionAccountNode",
"display": {
"kind": "instructionAccountDisplayNode",
"label": "Token Account"
},
"name": "account",
"isWritable": true,
"isSigner": false,
"isOptional": false,
"docs": ["The account to burn from."]
},
{
"kind": "instructionAccountNode",
"accountLink": {
"kind": "accountLinkNode",
"name": "mint"
},
"name": "mint",
"isWritable": true,
"isSigner": false,
"isOptional": false,
"docs": ["The token mint."]
},
{
"kind": "instructionAccountNode",
"name": "authority",
"isWritable": false,
"isSigner": "either",
"isOptional": false,
"docs": [
"The account's owner/delegate or its multisignature account."
],
"defaultValue": { "kind": "identityValueNode" }
}
],
"arguments": [
{
"kind": "instructionArgumentNode",
"display": {
"kind": "structFieldDisplayNode",
"skip": "always"
},
"name": "discriminator",
"type": {
"kind": "numberTypeNode",
"format": "u8",
"endian": "le"
},
"docs": ["The amount of tokens to burn."],
"defaultValue": { "kind": "numberValueNode", "number": 8 },
"defaultValueStrategy": "omitted"
},
{
"kind": "instructionArgumentNode",
"name": "amount",
"type": {
"kind": "numberTypeNode",
"display": {
"decimals": {
"kind": "injectedValueNode",
"key": "decimals"
},
"kind": "amountNumberDisplayNode"
},
"format": "u64",
"endian": "le"
},
"docs": []
}
],
"discriminators": [
{
"kind": "fieldDiscriminatorNode",
"name": "discriminator",
"offset": 0
}
],
"remainingAccounts": [
{
"kind": "instructionRemainingAccountsNode",
"value": {
"kind": "argumentValueNode",
"name": "multiSigners"
},
"isOptional": true,
"isSigner": true
}
],
"name": "burn",
"docs": [
"Burns tokens by removing them from an account. Burn does not support",
"accounts associated with the native mint, use CloseAccount instead."
],
"optionalAccountStrategy": "programId"
},
{
"kind": "instructionNode",
"display": {
"kind": "instructionDisplayNode",
"intent": "Close token account",
"interpolatedIntent": "Close ${accounts.account} and send its balance to ${accounts.destination}"
},
"accounts": [
{
"kind": "instructionAccountNode",
"display": {
"kind": "instructionAccountDisplayNode",
"label": "Token Account"
},
"name": "account",
"isWritable": true,
"isSigner": false,
"isOptional": false,
"docs": ["The account to close."]
},
{
"kind": "instructionAccountNode",
"display": {
"kind": "instructionAccountDisplayNode",
"label": "Recipient"
},
"name": "destination",
"isWritable": true,
"isSigner": false,
"isOptional": false,
"docs": ["The destination account."]
},
{
"kind": "instructionAccountNode",
"name": "owner",
"isWritable": false,
"isSigner": "either",
"isOptional": false,
"docs": ["The account's owner or its multisignature account."]
}
],
"arguments": [
{
"kind": "instructionArgumentNode",
"display": {
"kind": "structFieldDisplayNode",
"skip": "always"
},
"name": "discriminator",
"type": {
"kind": "numberTypeNode",
"format": "u8",
"endian": "le"
},
"docs": [],
"defaultValue": { "kind": "numberValueNode", "number": 9 },
"defaultValueStrategy": "omitted"
}
],
"discriminators": [
{
"kind": "fieldDiscriminatorNode",
"name": "discriminator",
"offset": 0
}
],
"remainingAccounts": [
{
"kind": "instructionRemainingAccountsNode",
"value": {
"kind": "argumentValueNode",
"name": "multiSigners"
},
"isOptional": true,
"isSigner": true
}
],
"name": "closeAccount",
"docs": [
"Close an account by transferring all its SOL to the destination account.",
"Non-native accounts may only be closed if its token amount is zero."
],
"optionalAccountStrategy": "programId"
},
{
"kind": "instructionNode",
"display": {
"kind": "instructionDisplayNode",
"intent": "Freeze token account",
"interpolatedIntent": "Freeze ${accounts.account}"
},
"accounts": [
{
"kind": "instructionAccountNode",
"display": {
"kind": "instructionAccountDisplayNode",
"label": "Token Account"
},
"name": "account",
"isWritable": true,
"isSigner": false,
"isOptional": false,
"docs": ["The account to freeze."]
},
{
"kind": "instructionAccountNode",
"name": "mint",
"isWritable": false,
"isSigner": false,
"isOptional": false,
"docs": ["The token mint."]
},
{
"kind": "instructionAccountNode",
"name": "owner",
"isWritable": false,
"isSigner": "either",
"isOptional": false,
"docs": ["The mint freeze authority or its multisignature account."]
}
],
"arguments": [
{
"kind": "instructionArgumentNode",
"display": {
"kind": "structFieldDisplayNode",
"skip": "always"
},
"name": "discriminator",
"type": {
"kind": "numberTypeNode",
"format": "u8",
"endian": "le"
},
"docs": [],
"defaultValue": { "kind": "numberValueNode", "number": 10 },
"defaultValueStrategy": "omitted"
}
],
"discriminators": [
{
"kind": "fieldDiscriminatorNode",
"name": "discriminator",
"offset": 0
}
],
"remainingAccounts": [
{
"kind": "instructionRemainingAccountsNode",
"value": {
"kind": "argumentValueNode",
"name": "multiSigners"
},
"isOptional": true,
"isSigner": true
}
],
"name": "freezeAccount",
"docs": [
"Freeze an Initialized account using the Mint's freeze_authority (if set)."
],
"optionalAccountStrategy": "programId"
},
{
"kind": "instructionNode",
"display": {
"kind": "instructionDisplayNode",
"intent": "Thaw token account",
"interpolatedIntent": "Thaw ${accounts.account}"
},
"accounts": [
{
"kind": "instructionAccountNode",
"display": {
"kind": "instructionAccountDisplayNode",
"label": "Token Account"
},
"name": "account",
"isWritable": true,
"isSigner": false,
"isOptional": false,
"docs": ["The account to thaw."]
},
{
"kind": "instructionAccountNode",
"name": "mint",
"isWritable": false,
"isSigner": false,
"isOptional": false,
"docs": ["The token mint."]
},
{
"kind": "instructionAccountNode",
"name": "owner",
"isWritable": false,
"isSigner": "either",
"isOptional": false,
"docs": ["The mint freeze authority or its multisignature account."]
}
],
"arguments": [
{
"kind": "instructionArgumentNode",
"display": {
"kind": "structFieldDisplayNode",
"skip": "always"
},
"name": "discriminator",
"type": {
"kind": "numberTypeNode",
"format": "u8",
"endian": "le"
},
"docs": [],
"defaultValue": { "kind": "numberValueNode", "number": 11 },
"defaultValueStrategy": "omitted"
}
],
"discriminators": [
{
"kind": "fieldDiscriminatorNode",
"name": "discriminator",
"offset": 0
}
],
"remainingAccounts": [
{
"kind": "instructionRemainingAccountsNode",
"value": {
"kind": "argumentValueNode",
"name": "multiSigners"
},
"isOptional": true,
"isSigner": true
}
],
"name": "thawAccount",
"docs": [
"Thaw a Frozen account using the Mint's freeze_authority (if set)."
],
"optionalAccountStrategy": "programId"
},
{
"kind": "instructionNode",
"display": {
"kind": "instructionDisplayNode",
"intent": "Transfer tokens",
"interpolatedIntent": "Transfer ${data.amount} ${accounts.mint} from ${accounts.source} to ${accounts.destination}"
},
"provides": [
{
"kind": "providedNode",
"name": "decimals",
"node": {
"kind": "argumentValueNode",
"name": "decimals"
}
}
],
"accounts": [
{
"kind": "instructionAccountNode",
"display": {
"kind": "instructionAccountDisplayNode",
"label": "From"
},
"name": "source",
"isWritable": true,
"isSigner": false,
"isOptional": false,
"docs": ["The source account."]
},
{
"kind": "instructionAccountNode",
"name": "mint",
"isWritable": false,
"isSigner": false,
"isOptional": false,
"docs": ["The token mint."]
},
{
"kind": "instructionAccountNode",
"display": {
"kind": "instructionAccountDisplayNode",
"label": "To"
},
"name": "destination",
"isWritable": true,
"isSigner": false,
"isOptional": false,
"docs": ["The destination account."]
},
{
"kind": "instructionAccountNode",
"name": "authority",
"isWritable": false,
"isSigner": "either",
"isOptional": false,
"docs": [
"The source account's owner/delegate or its multisignature account."
],
"defaultValue": { "kind": "identityValueNode" }
}
],
"arguments": [
{
"kind": "instructionArgumentNode",
"display": {
"kind": "structFieldDisplayNode",
"skip": "always"
},
"name": "discriminator",
"type": {
"kind": "numberTypeNode",
"format": "u8",
"endian": "le"
},
"docs": [],
"defaultValue": { "kind": "numberValueNode", "number": 12 },
"defaultValueStrategy": "omitted"
},
{
"kind": "instructionArgumentNode",
"name": "amount",
"type": {
"kind": "numberTypeNode",
"display": {
"decimals": {
"kind": "injectedValueNode",
"key": "decimals"
},
"kind": "amountNumberDisplayNode"
},
"format": "u64",
"endian": "le"
},
"docs": ["The amount of tokens to transfer."]
},
{
"kind": "instructionArgumentNode",
"display": {
"kind": "structFieldDisplayNode",
"skip": "whenInjected"
},
"name": "decimals",
"type": {
"kind": "numberTypeNode",
"format": "u8",
"endian": "le"
},
"docs": [
"Expected number of base 10 digits to the right of the decimal place."
]
}
],
"discriminators": [
{
"kind": "fieldDiscriminatorNode",
"name": "discriminator",
"offset": 0
}
],
"remainingAccounts": [
{
"kind": "instructionRemainingAccountsNode",
"value": {
"kind": "argumentValueNode",
"name": "multiSigners"
},
"isOptional": true,
"isSigner": true
}
],
"name": "transferChecked",
"docs": [
"Transfers tokens from one account to another either directly or via a",
"delegate. If this account is associated with the native mint then equal",
"amounts of SOL and Tokens will be transferred to the destination account.",
"",
"This instruction differs from Transfer in that the token mint and",
"decimals value is checked by the caller. This may be useful when",
"creating transactions offline or within a hardware wallet."
],
"optionalAccountStrategy": "programId"
},
{
"kind": "instructionNode",
"display": {
"kind": "instructionDisplayNode",
"intent": "Approve delegate",
"interpolatedIntent": "Approve ${accounts.delegate} to spend ${data.amount} ${accounts.mint} from ${accounts.source}"
},
"provides": [
{
"kind": "providedNode",
"name": "decimals",
"node": {
"kind": "argumentValueNode",
"name": "decimals"
}
}
],
"accounts": [
{
"kind": "instructionAccountNode",
"display": {
"kind": "instructionAccountDisplayNode",
"label": "Token Account"
},
"name": "source",
"isWritable": true,
"isSigner": false,
"isOptional": false,
"docs": ["The source account."]
},
{
"kind": "instructionAccountNode",
"name": "mint",
"isWritable": false,
"isSigner": false,
"isOptional": false,
"docs": ["The token mint."]
},
{
"kind": "instructionAccountNode",
"name": "delegate",
"isWritable": false,
"isSigner": false,
"isOptional": false,
"docs": ["The delegate."]
},
{
"kind": "instructionAccountNode",
"name": "owner",
"isWritable": false,
"isSigner": "either",
"isOptional": false,
"docs": ["The source account owner or its multisignature account."]
}
],
"arguments": [
{
"kind": "instructionArgumentNode",
"display": {
"kind": "structFieldDisplayNode",
"skip": "always"
},
"name": "discriminator",
"type": {
"kind": "numberTypeNode",
"format": "u8",
"endian": "le"
},
"docs": [],
"defaultValue": { "kind": "numberValueNode", "number": 13 },
"defaultValueStrategy": "omitted"
},
{
"kind": "instructionArgumentNode",
"name": "amount",
"type": {
"kind": "numberTypeNode",
"display": {
"decimals": {
"kind": "injectedValueNode",
"key": "decimals"
},
"kind": "amountNumberDisplayNode"
},
"format": "u64",
"endian": "le"
},
"docs": ["The amount of tokens the delegate is approved for."]
},
{
"kind": "instructionArgumentNode",
"display": {
"kind": "structFieldDisplayNode",
"skip": "whenInjected"
},
"name": "decimals",
"type": {
"kind": "numberTypeNode",
"format": "u8",
"endian": "le"
},
"docs": [
"Expected number of base 10 digits to the right of the decimal place."
]
}
],
"discriminators": [
{
"kind": "fieldDiscriminatorNode",
"name": "discriminator",
"offset": 0
}
],
"remainingAccounts": [
{
"kind": "instructionRemainingAccountsNode",
"value": {
"kind": "argumentValueNode",
"name": "multiSigners"
},
"isOptional": true,
"isSigner": true
}
],
"name": "approveChecked",
"docs": [
"Approves a delegate. A delegate is given the authority over tokens on",
"behalf of the source account's owner.",
"",
"This instruction differs from Approve in that the token mint and",
"decimals value is checked by the caller. This may be useful when",
"creating transactions offline or within a hardware wallet."
],
"optionalAccountStrategy": "programId"
},
{
"kind": "instructionNode",
"display": {
"kind": "instructionDisplayNode",
"intent": "Mint tokens",
"interpolatedIntent": "Mint ${data.amount} ${accounts.mint} to ${accounts.token}"
},
"provides": [
{
"kind": "providedNode",
"name": "decimals",
"node": {
"kind": "argumentValueNode",
"name": "decimals"
}
}
],
"accounts": [
{
"kind": "instructionAccountNode",
"name": "mint",
"isWritable": true,
"isSigner": false,
"isOptional": false,
"docs": ["The mint."]
},
{
"kind": "instructionAccountNode",
"display": {
"kind": "instructionAccountDisplayNode",
"label": "To"
},
"name": "token",
"isWritable": true,
"isSigner": false,
"isOptional": false,
"docs": ["The account to mint tokens to."]
},
{
"kind": "instructionAccountNode",
"name": "mintAuthority",
"isWritable": false,
"isSigner": "either",
"isOptional": false,
"docs": [
"The mint's minting authority or its multisignature account."
]
}
],
"arguments": [
{
"kind": "instructionArgumentNode",
"display": {
"kind": "structFieldDisplayNode",
"skip": "always"
},
"name": "discriminator",
"type": {
"kind": "numberTypeNode",
"format": "u8",
"endian": "le"
},
"docs": [],
"defaultValue": { "kind": "numberValueNode", "number": 14 },
"defaultValueStrategy": "omitted"
},
{
"kind": "instructionArgumentNode",
"name": "amount",
"type": {
"kind": "numberTypeNode",
"display": {
"decimals": {
"kind": "injectedValueNode",
"key": "decimals"
},
"kind": "amountNumberDisplayNode"
},
"format": "u64",
"endian": "le"
},
"docs": ["The amount of new tokens to mint."]
},
{
"kind": "instructionArgumentNode",
"display": {
"kind": "structFieldDisplayNode",
"skip": "whenInjected"
},
"name": "decimals",
"type": {
"kind": "numberTypeNode",
"format": "u8",
"endian": "le"
},
"docs": [
"Expected number of base 10 digits to the right of the decimal place."
]
}
],
"discriminators": [
{
"kind": "fieldDiscriminatorNode",
"name": "discriminator",
"offset": 0
}
],
"remainingAccounts": [
{
"kind": "instructionRemainingAccountsNode",
"value": {
"kind": "argumentValueNode",
"name": "multiSigners"
},
"isOptional": true,
"isSigner": true
}
],
"name": "mintToChecked",
"docs": [
"Mints new tokens to an account. The native mint does not support minting.",
"",
"This instruction differs from MintTo in that the decimals value is",
"checked by the caller. This may be useful when creating transactions",
"offline or within a hardware wallet."
],
"optionalAccountStrategy": "programId"
},
{
"kind": "instructionNode",
"display": {
"kind": "instructionDisplayNode",
"intent": "Burn tokens",
"interpolatedIntent": "Burn ${data.amount} ${accounts.mint} from ${accounts.account}"
},
"provides": [
{
"kind": "providedNode",
"name": "decimals",
"node": {
"kind": "argumentValueNode",
"name": "decimals"
}
}
],
"accounts": [
{
"kind": "instructionAccountNode",
"display": {
"kind": "instructionAccountDisplayNode",
"label": "Token Account"
},
"name": "account",
"isWritable": true,
"isSigner": false,
"isOptional": false,
"docs": ["The account to burn from."]
},
{
"kind": "instructionAccountNode",
"name": "mint",
"isWritable": true,
"isSigner": false,
"isOptional": false,
"docs": ["The token mint."]
},
{
"kind": "instructionAccountNode",
"name": "authority",
"isWritable": false,
"isSigner": "either",
"isOptional": false,
"docs": [
"The account's owner/delegate or its multisignature account."
],
"defaultValue": { "kind": "identityValueNode" }
}
],
"arguments": [
{
"kind": "instructionArgumentNode",
"display": {
"kind": "structFieldDisplayNode",
"skip": "always"
},
"name": "discriminator",
"type": {
"kind": "numberTypeNode",
"format": "u8",
"endian": "le"
},
"docs": [],
"defaultValue": { "kind": "numberValueNode", "number": 15 },
"defaultValueStrategy": "omitted"
},
{
"kind": "instructionArgumentNode",
"name": "amount",
"type": {
"kind": "numberTypeNode",
"display": {
"decimals": {
"kind": "injectedValueNode",
"key": "decimals"
},
"kind": "amountNumberDisplayNode"
},
"format": "u64",
"endian": "le"
},
"docs": ["The amount of tokens to burn."]
},
{
"kind": "instructionArgumentNode",
"display": {
"kind": "structFieldDisplayNode",
"skip": "whenInjected"
},
"name": "decimals",
"type": {
"kind": "numberTypeNode",
"format": "u8",
"endian": "le"
},
"docs": [
"Expected number of base 10 digits to the right of the decimal place."
]
}
],
"discriminators": [
{
"kind": "fieldDiscriminatorNode",
"name": "discriminator",
"offset": 0
}
],
"remainingAccounts": [
{
"kind": "instructionRemainingAccountsNode",
"value": {
"kind": "argumentValueNode",
"name": "multiSigners"
},
"isOptional": true,
"isSigner": true
}
],
"name": "burnChecked",
"docs": [
"Burns tokens by removing them from an account. BurnChecked does not",
"support accounts associated with the native mint, use CloseAccount instead.",
"",
"This instruction differs from Burn in that the decimals value is checked",
"by the caller. This may be useful when creating transactions offline or",
"within a hardware wallet."
],
"optionalAccountStrategy": "programId"
},
{
"kind": "instructionNode",
"display": {
"kind": "instructionDisplayNode",
"intent": "Initialize token account",
"interpolatedIntent": "Initialize token account ${accounts.account} for mint ${accounts.mint}"
},
"accounts": [
{
"kind": "instructionAccountNode",
"display": {
"kind": "instructionAccountDisplayNode",
"label": "Token Account"
},
"name": "account",
"isWritable": true,
"isSigner": false,
"isOptional": false,
"docs": ["The account to initialize."]
},
{
"kind": "instructionAccountNode",
"name": "mint",
"isWritable": false,
"isSigner": false,
"isOptional": false,
"docs": ["The mint this account will be associated with."]
},
{
"kind": "instructionAccountNode",
"display": {
"kind": "instructionAccountDisplayNode",
"skip": "always"
},
"name": "rent",
"isWritable": false,
"isSigner": false,
"isOptional": false,
"docs": ["Rent sysvar."],
"defaultValue": {
"kind": "publicKeyValueNode",
"publicKey": "SysvarRent111111111111111111111111111111111"
}
}
],
"arguments": [
{
"kind": "instructionArgumentNode",
"display": {
"kind": "structFieldDisplayNode",
"skip": "always"
},
"name": "discriminator",
"type": {
"kind": "numberTypeNode",
"format": "u8",
"endian": "le"
},
"docs": [],
"defaultValue": { "kind": "numberValueNode", "number": 16 },
"defaultValueStrategy": "omitted"
},
{
"kind": "instructionArgumentNode",
"name": "owner",
"type": { "kind": "publicKeyTypeNode" },
"docs": ["The new account's owner/multisignature."]
}
],
"discriminators": [
{
"kind": "fieldDiscriminatorNode",
"name": "discriminator",
"offset": 0
}
],
"name": "initializeAccount2",
"docs": [
"Like InitializeAccount, but the owner pubkey is passed via instruction",
"data rather than the accounts list. This variant may be preferable",
"when using Cross Program Invocation from an instruction that does",
"not need the owner's AccountInfo otherwise."
],
"optionalAccountStrategy": "programId"
},
{
"kind": "instructionNode",
"display": {
"kind": "instructionDisplayNode",
"intent": "Sync wrapped SOL",
"interpolatedIntent": "Sync the wrapped SOL balance of ${accounts.account}"
},
"accounts": [
{
"kind": "instructionAccountNode",
"display": {
"kind": "instructionAccountDisplayNode",
"label": "Token Account"
},
"name": "account",
"isWritable": true,
"isSigner": false,
"isOptional": false,
"docs": [
"The native token account to sync with its underlying lamports."
]
},
{
"kind": "instructionAccountNode",
"display": {
"kind": "instructionAccountDisplayNode",
"skip": "always"
},
"name": "rent",
"isWritable": false,
"isSigner": false,
"isOptional": true,
"docs": ["Rent sysvar."],
"defaultValue": {
"kind": "publicKeyValueNode",
"publicKey": "SysvarRent111111111111111111111111111111111"
}
}
],
"arguments": [
{
"kind": "instructionArgumentNode",
"display": {
"kind": "structFieldDisplayNode",
"skip": "always"
},
"name": "discriminator",
"type": {
"kind": "numberTypeNode",
"format": "u8",
"endian": "le"
},
"docs": [],
"defaultValue": { "kind": "numberValueNode", "number": 17 },
"defaultValueStrategy": "omitted"
}
],
"discriminators": [
{
"kind": "fieldDiscriminatorNode",
"name": "discriminator",
"offset": 0
}
],
"name": "syncNative",
"docs": [
"Given a wrapped / native token account (a token account containing SOL)",
"updates its amount field based on the account's underlying lamports.",
"This is useful if a non-wrapped SOL account uses",
"system_instruction::transfer to move lamports to a wrapped token",
"account, and needs to have its token amount field updated."
],
"optionalAccountStrategy": "omitted"
},
{
"kind": "instructionNode",
"display": {
"kind": "instructionDisplayNode",
"intent": "Initialize token account",
"interpolatedIntent": "Initialize token account ${accounts.account} for mint ${accounts.mint}"
},
"accounts": [
{
"kind": "instructionAccountNode",
"display": {
"kind": "instructionAccountDisplayNode",
"label": "Token Account"
},
"name": "account",
"isWritable": true,
"isSigner": false,
"isOptional": false,
"docs": ["The account to initialize."]
},
{
"kind": "instructionAccountNode",
"name": "mint",
"isWritable": false,
"isSigner": false,
"isOptional": false,
"docs": ["The mint this account will be associated with."]
}
],
"arguments": [
{
"kind": "instructionArgumentNode",
"display": {
"kind": "structFieldDisplayNode",
"skip": "always"
},
"name": "discriminator",
"type": {
"kind": "numberTypeNode",
"format": "u8",
"endian": "le"
},
"docs": [],
"defaultValue": { "kind": "numberValueNode", "number": 18 },
"defaultValueStrategy": "omitted"
},
{
"kind": "instructionArgumentNode",
"name": "owner",
"type": { "kind": "publicKeyTypeNode" },
"docs": ["The new account's owner/multisignature."]
}
],
"discriminators": [
{
"kind": "fieldDiscriminatorNode",
"name": "discriminator",
"offset": 0
}
],
"name": "initializeAccount3",
"docs": [
"Like InitializeAccount2, but does not require the Rent sysvar to be provided."
],
"optionalAccountStrategy": "programId"
},
{
"kind": "instructionNode",
"display": {
"kind": "instructionDisplayNode",
"intent": "Initialize multisig",
"interpolatedIntent": "Initialize multisig ${accounts.multisig} requiring ${data.m} signatures"
},
"accounts": [
{
"kind": "instructionAccountNode",
"name": "multisig",
"isWritable": true,
"isSigner": false,
"isOptional": false,
"docs": ["The multisignature account to initialize."]
}
],
"arguments": [
{
"kind": "instructionArgumentNode",
"display": {
"kind": "structFieldDisplayNode",
"skip": "always"
},
"name": "discriminator",
"type": {
"kind": "numberTypeNode",
"format": "u8",
"endian": "le"
},
"docs": [],
"defaultValue": { "kind": "numberValueNode", "number": 19 },
"defaultValueStrategy": "omitted"
},
{
"kind": "instructionArgumentNode",
"display": {
"kind": "structFieldDisplayNode",
"label": "Required Signatures"
},
"name": "m",
"type": {
"kind": "numberTypeNode",
"format": "u8",
"endian": "le"
},
"docs": [
"The number of signers (M) required to validate this multisignature account."
]
}
],
"discriminators": [
{
"kind": "fieldDiscriminatorNode",
"name": "discriminator",
"offset": 0
}
],
"remainingAccounts": [
{
"kind": "instructionRemainingAccountsNode",
"display": {
"kind": "instructionAccountDisplayNode",
"label": "Signers"
},
"value": {
"kind": "argumentValueNode",
"name": "signers"
}
}
],
"name": "initializeMultisig2",
"docs": [
"Like InitializeMultisig, but does not require the Rent sysvar to be provided."
],
"optionalAccountStrategy": "programId"
},
{
"kind": "instructionNode",
"display": {
"kind": "instructionDisplayNode",
"intent": "Initialize mint",
"interpolatedIntent": "Initialize mint ${accounts.mint} with ${data.decimals} decimals"
},
"accounts": [
{
"kind": "instructionAccountNode",
"name": "mint",
"isWritable": true,
"isSigner": false,
"isOptional": false,
"docs": ["The mint to initialize."]
}
],
"arguments": [
{
"kind": "instructionArgumentNode",
"display": {
"kind": "structFieldDisplayNode",
"skip": "always"
},
"name": "discriminator",
"type": {
"kind": "numberTypeNode",
"format": "u8",
"endian": "le"
},
"docs": [],
"defaultValue": { "kind": "numberValueNode", "number": 20 },
"defaultValueStrategy": "omitted"
},
{
"kind": "instructionArgumentNode",
"name": "decimals",
"type": {
"kind": "numberTypeNode",
"format": "u8",
"endian": "le"
},
"docs": [
"Number of base 10 digits to the right of the decimal place."
]
},
{
"kind": "instructionArgumentNode",
"name": "mintAuthority",
"type": { "kind": "publicKeyTypeNode" },
"docs": ["The authority/multisignature to mint tokens."]
},
{
"kind": "instructionArgumentNode",
"name": "freezeAuthority",
"type": {
"kind": "optionTypeNode",
"item": { "kind": "publicKeyTypeNode" },
"prefix": {
"kind": "numberTypeNode",
"format": "u8",
"endian": "le"
},
"fixed": false
},
"defaultValue": {
"kind": "noneValueNode"
},
"docs": [
"The optional freeze authority/multisignature of the mint."
]
}
],
"discriminators": [
{
"kind": "fieldDiscriminatorNode",
"name": "discriminator",
"offset": 0
}
],
"name": "initializeMint2",
"docs": [
"Like [InitializeMint], but does not require the Rent sysvar to be provided."
],
"optionalAccountStrategy": "programId"
},
{
"kind": "instructionNode",
"display": {
"kind": "instructionDisplayNode",
"intent": "Get account data size",
"interpolatedIntent": "Get the account size for mint ${accounts.mint}"
},
"accounts": [
{
"kind": "instructionAccountNode",
"name": "mint",
"isWritable": false,
"isSigner": false,
"isOptional": false,
"docs": ["The mint to calculate for."]
}
],
"arguments": [
{
"kind": "instructionArgumentNode",
"display": {
"kind": "structFieldDisplayNode",
"skip": "always"
},
"name": "discriminator",
"type": {
"kind": "numberTypeNode",
"format": "u8",
"endian": "le"
},
"docs": [],
"defaultValue": { "kind": "numberValueNode", "number": 21 },
"defaultValueStrategy": "omitted"
}
],
"discriminators": [
{
"kind": "fieldDiscriminatorNode",
"name": "discriminator",
"offset": 0
}
],
"name": "getAccountDataSize",
"docs": [
"Gets the required size of an account for the given mint as a",
"little-endian u64.",
"",
"Return data can be fetched using sol_get_return_data and deserializing",
"the return data as a little-endian u64."
],
"optionalAccountStrategy": "programId"
},
{
"kind": "instructionNode",
"display": {
"kind": "instructionDisplayNode",
"intent": "Initialize immutable owner",
"interpolatedIntent": "Make the owner of ${accounts.account} immutable"
},
"accounts": [
{
"kind": "instructionAccountNode",
"display": {
"kind": "instructionAccountDisplayNode",
"label": "Token Account"
},
"name": "account",
"isWritable": true,
"isSigner": false,
"isOptional": false,
"docs": ["The account to initialize."]
}
],
"arguments": [
{
"kind": "instructionArgumentNode",
"display": {
"kind": "structFieldDisplayNode",
"skip": "always"
},
"name": "discriminator",
"type": {
"kind": "numberTypeNode",
"format": "u8",
"endian": "le"
},
"docs": [],
"defaultValue": { "kind": "numberValueNode", "number": 22 },
"defaultValueStrategy": "omitted"
}
],
"discriminators": [
{
"kind": "fieldDiscriminatorNode",
"name": "discriminator",
"offset": 0
}
],
"name": "initializeImmutableOwner",
"docs": [
"Initialize the Immutable Owner extension for the given token account",
"",
"Fails if the account has already been initialized, so must be called",
"before InitializeAccount.",
"",
"No-ops in this version of the program, but is included for compatibility",
"with the Associated Token Account program."
],
"optionalAccountStrategy": "programId"
},
{
"kind": "instructionNode",
"display": {
"kind": "instructionDisplayNode",
"intent": "Convert amount to UI amount"
},
"accounts": [
{
"kind": "instructionAccountNode",
"name": "mint",
"isWritable": false,
"isSigner": false,
"isOptional": false,
"docs": ["The mint to calculate for."]
}
],
"arguments": [
{
"kind": "instructionArgumentNode",
"display": {
"kind": "structFieldDisplayNode",
"skip": "always"
},
"name": "discriminator",
"type": {
"kind": "numberTypeNode",
"format": "u8",
"endian": "le"
},
"docs": [],
"defaultValue": { "kind": "numberValueNode", "number": 23 },
"defaultValueStrategy": "omitted"
},
{
"kind": "instructionArgumentNode",
"name": "amount",
"type": {
"kind": "numberTypeNode",
"display": {
"kind": "amountNumberDisplayNode",
"unit": {
"kind": "stringValueNode",
"string": "base units"
}
},
"format": "u64",
"endian": "le"
},
"docs": ["The amount of tokens to reformat."]
}
],
"discriminators": [
{
"kind": "fieldDiscriminatorNode",
"name": "discriminator",
"offset": 0
}
],
"name": "amountToUiAmount",
"docs": [
"Convert an Amount of tokens to a UiAmount string, using the given",
"mint. In this version of the program, the mint can only specify the",
"number of decimals.",
"",
"Fails on an invalid mint.",
"",
"Return data can be fetched using sol_get_return_data and deserialized",
"with String::from_utf8."
],
"optionalAccountStrategy": "programId"
},
{
"kind": "instructionNode",
"display": {
"kind": "instructionDisplayNode",
"intent": "Convert UI amount to amount"
},
"accounts": [
{
"kind": "instructionAccountNode",
"name": "mint",
"isWritable": false,
"isSigner": false,
"isOptional": false,
"docs": ["The mint to calculate for."]
}
],
"arguments": [
{
"kind": "instructionArgumentNode",
"display": {
"kind": "structFieldDisplayNode",
"skip": "always"
},
"name": "discriminator",
"type": {
"kind": "numberTypeNode",
"format": "u8",
"endian": "le"
},
"docs": [],
"defaultValue": { "kind": "numberValueNode", "number": 24 },
"defaultValueStrategy": "omitted"
},
{
"kind": "instructionArgumentNode",
"display": {
"kind": "structFieldDisplayNode",
"label": "UI Amount"
},
"name": "uiAmount",
"type": {
"kind": "stringTypeNode",
"encoding": "utf8"
},
"docs": ["The ui_amount of tokens to reformat."]
}
],
"discriminators": [
{
"kind": "fieldDiscriminatorNode",
"name": "discriminator",
"offset": 0
}
],
"name": "uiAmountToAmount",
"docs": [
"Convert a UiAmount of tokens to a little-endian u64 raw Amount, using",
"the given mint. In this version of the program, the mint can only",
"specify the number of decimals.",
"",
"Return data can be fetched using sol_get_return_data and deserializing",
"the return data as a little-endian u64."
],
"optionalAccountStrategy": "programId"
},
{
"kind": "instructionNode",
"display": {
"kind": "instructionDisplayNode",
"intent": "Withdraw excess SOL",
"interpolatedIntent": "Withdraw excess SOL from ${accounts.source} to ${accounts.destination}"
},
"accounts": [
{
"kind": "instructionAccountNode",
"display": {
"kind": "instructionAccountDisplayNode",
"label": "From"
},
"name": "source",
"isWritable": true,
"isSigner": false,
"isOptional": false,
"docs": ["The source account."]
},
{
"kind": "instructionAccountNode",
"display": {
"kind": "instructionAccountDisplayNode",
"label": "To"
},
"name": "destination",
"isWritable": true,
"isSigner": false,
"isOptional": false,
"docs": ["The destination account."]
},
{
"kind": "instructionAccountNode",
"name": "authority",
"isWritable": false,
"isSigner": "either",
"isOptional": false,
"docs": ["The source account owner or its multisignature account."]
}
],
"arguments": [
{
"kind": "instructionArgumentNode",
"display": {
"kind": "structFieldDisplayNode",
"skip": "always"
},
"name": "discriminator",
"type": {
"kind": "numberTypeNode",
"format": "u8",
"endian": "le"
},
"docs": [],
"defaultValue": { "kind": "numberValueNode", "number": 38 },
"defaultValueStrategy": "omitted"
}
],
"discriminators": [
{
"kind": "fieldDiscriminatorNode",
"name": "discriminator",
"offset": 0
}
],
"remainingAccounts": [
{
"kind": "instructionRemainingAccountsNode",
"value": {
"kind": "argumentValueNode",
"name": "multiSigners"
},
"isOptional": true,
"isSigner": true
}
],
"name": "withdrawExcessLamports",
"docs": [
"Rescue SOL sent to any TokenProgram-owned account",
"by sending them to any other account, leaving behind only",
"lamports for rent exemption."
],
"optionalAccountStrategy": "programId"
},
{
"kind": "instructionNode",
"display": {
"kind": "instructionDisplayNode",
"intent": "Unwrap SOL",
"interpolatedIntent": "Unwrap SOL from ${accounts.source} to ${accounts.destination}"
},
"accounts": [
{
"kind": "instructionAccountNode",
"display": {
"kind": "instructionAccountDisplayNode",
"label": "From"
},
"name": "source",
"isWritable": true,
"isSigner": false,
"isOptional": false,
"docs": ["The source account."]
},
{
"kind": "instructionAccountNode",
"display": {
"kind": "instructionAccountDisplayNode",
"label": "To"
},
"name": "destination",
"isWritable": true,
"isSigner": false,
"isOptional": false,
"docs": ["The destination account."]
},
{
"kind": "instructionAccountNode",
"name": "authority",
"isWritable": false,
"isSigner": "either",
"isOptional": false,
"docs": ["The source account owner or its multisignature account."]
}
],
"arguments": [
{
"kind": "instructionArgumentNode",
"display": {
"kind": "structFieldDisplayNode",
"skip": "always"
},
"name": "discriminator",
"type": {
"kind": "numberTypeNode",
"format": "u8",
"endian": "le"
},
"docs": [],
"defaultValue": { "kind": "numberValueNode", "number": 45 },
"defaultValueStrategy": "omitted"
},
{
"kind": "instructionArgumentNode",
"name": "amount",
"type": {
"kind": "optionTypeNode",
"item": {
"kind": "numberTypeNode",
"display": {
"decimals": {
"kind": "numberValueNode",
"number": 9
},
"kind": "amountNumberDisplayNode",
"unit": {
"kind": "stringValueNode",
"string": "SOL"
}
},
"format": "u64",
"endian": "le"
},
"prefix": {
"kind": "numberTypeNode",
"format": "u8",
"endian": "le"
},
"fixed": false
},
"defaultValue": {
"kind": "noneValueNode"
},
"docs": [
"Optional amount of lamports to transfer.",
"If not provided, the instruction will unwrap all lamports in excess of rent exemption."
]
}
],
"discriminators": [
{
"kind": "fieldDiscriminatorNode",
"name": "discriminator",
"offset": 0
}
],
"remainingAccounts": [
{
"kind": "instructionRemainingAccountsNode",
"value": {
"kind": "argumentValueNode",
"name": "multiSigners"
},
"isOptional": true,
"isSigner": true
}
],
"name": "unwrapLamports",
"docs": [
"Transfer lamports from a native SOL account to a destination account."
],
"optionalAccountStrategy": "programId"
},
{
"kind": "instructionNode",
"display": {
"kind": "instructionDisplayNode",
"intent": "Batch instructions"
},
"accounts": [],
"arguments": [
{
"kind": "instructionArgumentNode",
"display": {
"kind": "structFieldDisplayNode",
"skip": "always"
},
"name": "discriminator",
"type": {
"kind": "numberTypeNode",
"format": "u8",
"endian": "le"
},
"docs": [],
"defaultValue": { "kind": "numberValueNode", "number": 255 },
"defaultValueStrategy": "omitted"
},
{
"kind": "instructionArgumentNode",
"display": {
"kind": "structFieldDisplayNode",
"label": "Batched Instructions"
},
"name": "data",
"type": {
"kind": "arrayTypeNode",
"item": {
"kind": "structTypeNode",
"fields": [
{
"kind": "structFieldTypeNode",
"name": "numberOfAccounts",
"type": {
"kind": "numberTypeNode",
"format": "u8",
"endian": "le"
}
},
{
"kind": "structFieldTypeNode",
"name": "instructionData",
"type": {
"kind": "sizePrefixTypeNode",
"prefix": {
"kind": "numberTypeNode",
"format": "u8",
"endian": "le"
},
"type": { "kind": "bytesTypeNode" }
}
}
]
},
"count": { "kind": "remainderCountNode" }
},
"docs": ["Instruction data for batch instructions."]
}
],
"discriminators": [
{
"kind": "fieldDiscriminatorNode",
"name": "discriminator",
"offset": 0
}
],
"name": "batch",
"docs": [
"Executes a batch of instructions. The instructions to be executed are",
"specified in sequence on the instruction data."
],
"optionalAccountStrategy": "programId"
}
],
"definedTypes": [
{
"kind": "definedTypeNode",
"name": "accountState",
"type": {
"kind": "enumTypeNode",
"variants": [
{ "kind": "enumEmptyVariantTypeNode", "name": "uninitialized" },
{ "kind": "enumEmptyVariantTypeNode", "name": "initialized" },
{ "kind": "enumEmptyVariantTypeNode", "name": "frozen" }
],
"size": { "kind": "numberTypeNode", "format": "u8", "endian": "le" }
},
"docs": []
},
{
"kind": "definedTypeNode",
"name": "authorityType",
"type": {
"kind": "enumTypeNode",
"variants": [
{ "kind": "enumEmptyVariantTypeNode", "name": "mintTokens" },
{ "kind": "enumEmptyVariantTypeNode", "name": "freezeAccount" },
{ "kind": "enumEmptyVariantTypeNode", "name": "accountOwner" },
{ "kind": "enumEmptyVariantTypeNode", "name": "closeAccount" }
],
"size": { "kind": "numberTypeNode", "format": "u8", "endian": "le" }
},
"docs": []
}
],
"errors": [
{
"kind": "errorNode",
"name": "notRentExempt",
"code": 0,
"message": "Lamport balance below rent-exempt threshold",
"docs": ["NotRentExempt: Lamport balance below rent-exempt threshold"]
},
{
"kind": "errorNode",
"name": "insufficientFunds",
"code": 1,
"message": "Insufficient funds",
"docs": ["InsufficientFunds: Insufficient funds"]
},
{
"kind": "errorNode",
"name": "invalidMint",
"code": 2,
"message": "Invalid Mint",
"docs": ["InvalidMint: Invalid Mint"]
},
{
"kind": "errorNode",
"name": "mintMismatch",
"code": 3,
"message": "Account not associated with this Mint",
"docs": ["MintMismatch: Account not associated with this Mint"]
},
{
"kind": "errorNode",
"name": "ownerMismatch",
"code": 4,
"message": "Owner does not match",
"docs": ["OwnerMismatch: Owner does not match"]
},
{
"kind": "errorNode",
"name": "fixedSupply",
"code": 5,
"message": "Fixed supply",
"docs": ["FixedSupply: Fixed supply"]
},
{
"kind": "errorNode",
"name": "alreadyInUse",
"code": 6,
"message": "Already in use",
"docs": ["AlreadyInUse: Already in use"]
},
{
"kind": "errorNode",
"name": "invalidNumberOfProvidedSigners",
"code": 7,
"message": "Invalid number of provided signers",
"docs": [
"InvalidNumberOfProvidedSigners: Invalid number of provided signers"
]
},
{
"kind": "errorNode",
"name": "invalidNumberOfRequiredSigners",
"code": 8,
"message": "Invalid number of required signers",
"docs": [
"InvalidNumberOfRequiredSigners: Invalid number of required signers"
]
},
{
"kind": "errorNode",
"name": "uninitializedState",
"code": 9,
"message": "State is unititialized",
"docs": ["UninitializedState: State is unititialized"]
},
{
"kind": "errorNode",
"name": "nativeNotSupported",
"code": 10,
"message": "Instruction does not support native tokens",
"docs": [
"NativeNotSupported: Instruction does not support native tokens"
]
},
{
"kind": "errorNode",
"name": "nonNativeHasBalance",
"code": 11,
"message": "Non-native account can only be closed if its balance is zero",
"docs": [
"NonNativeHasBalance: Non-native account can only be closed if its balance is zero"
]
},
{
"kind": "errorNode",
"name": "invalidInstruction",
"code": 12,
"message": "Invalid instruction",
"docs": ["InvalidInstruction: Invalid instruction"]
},
{
"kind": "errorNode",
"name": "invalidState",
"code": 13,
"message": "State is invalid for requested operation",
"docs": ["InvalidState: State is invalid for requested operation"]
},
{
"kind": "errorNode",
"name": "overflow",
"code": 14,
"message": "Operation overflowed",
"docs": ["Overflow: Operation overflowed"]
},
{
"kind": "errorNode",
"name": "authorityTypeNotSupported",
"code": 15,
"message": "Account does not support specified authority type",
"docs": [
"AuthorityTypeNotSupported: Account does not support specified authority type"
]
},
{
"kind": "errorNode",
"name": "mintCannotFreeze",
"code": 16,
"message": "This token mint cannot freeze accounts",
"docs": ["MintCannotFreeze: This token mint cannot freeze accounts"]
},
{
"kind": "errorNode",
"name": "accountFrozen",
"code": 17,
"message": "Account is frozen",
"docs": ["AccountFrozen: Account is frozen"]
},
{
"kind": "errorNode",
"name": "mintDecimalsMismatch",
"code": 18,
"message": "The provided decimals value different from the Mint decimals",
"docs": [
"MintDecimalsMismatch: The provided decimals value different from the Mint decimals"
]
},
{
"kind": "errorNode",
"name": "nonNativeNotSupported",
"code": 19,
"message": "Instruction does not support non-native tokens",
"docs": [
"NonNativeNotSupported: Instruction does not support non-native tokens"
]
}
],
"name": "token",
"prefix": "",
"publicKey": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
"version": "3.3.0",
"origin": "shank"
},
"additionalPrograms": [
{
"kind": "programNode",
"pdas": [
{
"kind": "pdaNode",
"name": "associatedToken",
"seeds": [
{
"kind": "variablePdaSeedNode",
"name": "owner",
"docs": ["The wallet address of the associated token account."],
"type": {
"kind": "publicKeyTypeNode"
}
},
{
"kind": "variablePdaSeedNode",
"name": "tokenProgram",
"docs": ["The address of the token program to use."],
"type": {
"kind": "publicKeyTypeNode"
}
},
{
"kind": "variablePdaSeedNode",
"name": "mint",
"docs": ["The mint address of the associated token account."],
"type": {
"kind": "publicKeyTypeNode"
}
}
]
}
],
"accounts": [],
"instructions": [
{
"kind": "instructionNode",
"display": {
"kind": "instructionDisplayNode",
"intent": "Create associated token account",
"interpolatedIntent": "Create the associated token account of ${accounts.owner} for mint ${accounts.mint}"
},
"accounts": [
{
"kind": "instructionAccountNode",
"name": "payer",
"isWritable": true,
"isSigner": true,
"isOptional": false,
"docs": ["Funding account (must be a system account)."],
"defaultValue": { "kind": "payerValueNode" }
},
{
"kind": "instructionAccountNode",
"display": {
"kind": "instructionAccountDisplayNode",
"label": "Token Account"
},
"name": "ata",
"isWritable": true,
"isSigner": false,
"isOptional": false,
"docs": ["Associated token account address to be created."],
"defaultValue": {
"kind": "pdaValueNode",
"pda": {
"kind": "pdaLinkNode",
"name": "associatedToken"
},
"seeds": [
{
"kind": "pdaSeedValueNode",
"name": "owner",
"value": {
"kind": "accountValueNode",
"name": "owner"
}
},
{
"kind": "pdaSeedValueNode",
"name": "tokenProgram",
"value": {
"kind": "accountValueNode",
"name": "tokenProgram"
}
},
{
"kind": "pdaSeedValueNode",
"name": "mint",
"value": {
"kind": "accountValueNode",
"name": "mint"
}
}
]
}
},
{
"kind": "instructionAccountNode",
"name": "owner",
"isWritable": false,
"isSigner": false,
"isOptional": false,
"docs": ["Wallet address for the new associated token account."]
},
{
"kind": "instructionAccountNode",
"name": "mint",
"isWritable": false,
"isSigner": false,
"isOptional": false,
"docs": ["The token mint for the new associated token account."]
},
{
"kind": "instructionAccountNode",
"display": {
"kind": "instructionAccountDisplayNode",
"skip": "always"
},
"name": "systemProgram",
"isWritable": false,
"isSigner": false,
"isOptional": false,
"docs": ["System program."],
"defaultValue": {
"kind": "publicKeyValueNode",
"publicKey": "11111111111111111111111111111111"
}
},
{
"kind": "instructionAccountNode",
"name": "tokenProgram",
"isWritable": false,
"isSigner": false,
"isOptional": false,
"docs": ["SPL Token program."],
"defaultValue": {
"kind": "publicKeyValueNode",
"publicKey": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"
}
}
],
"arguments": [
{
"kind": "instructionArgumentNode",
"display": {
"kind": "structFieldDisplayNode",
"skip": "always"
},
"name": "discriminator",
"type": {
"kind": "numberTypeNode",
"format": "u8",
"endian": "le"
},
"docs": [],
"defaultValue": { "kind": "numberValueNode", "number": 0 },
"defaultValueStrategy": "omitted"
}
],
"discriminators": [
{
"kind": "fieldDiscriminatorNode",
"name": "discriminator",
"offset": 0
}
],
"name": "createAssociatedToken",
"docs": [
"Creates an associated token account for the given wallet address and",
"token mint Returns an error if the account exists."
],
"optionalAccountStrategy": "programId"
},
{
"kind": "instructionNode",
"display": {
"kind": "instructionDisplayNode",
"intent": "Create associated token account",
"interpolatedIntent": "Create the associated token account of ${accounts.owner} for mint ${accounts.mint}"
},
"accounts": [
{
"kind": "instructionAccountNode",
"name": "payer",
"isWritable": true,
"isSigner": true,
"isOptional": false,
"docs": ["Funding account (must be a system account)."],
"defaultValue": { "kind": "payerValueNode" }
},
{
"kind": "instructionAccountNode",
"display": {
"kind": "instructionAccountDisplayNode",
"label": "Token Account"
},
"name": "ata",
"isWritable": true,
"isSigner": false,
"isOptional": false,
"docs": ["Associated token account address to be created."],
"defaultValue": {
"kind": "pdaValueNode",
"pda": {
"kind": "pdaLinkNode",
"name": "associatedToken"
},
"seeds": [
{
"kind": "pdaSeedValueNode",
"name": "owner",
"value": {
"kind": "accountValueNode",
"name": "owner"
}
},
{
"kind": "pdaSeedValueNode",
"name": "tokenProgram",
"value": {
"kind": "accountValueNode",
"name": "tokenProgram"
}
},
{
"kind": "pdaSeedValueNode",
"name": "mint",
"value": {
"kind": "accountValueNode",
"name": "mint"
}
}
]
}
},
{
"kind": "instructionAccountNode",
"name": "owner",
"isWritable": false,
"isSigner": false,
"isOptional": false,
"docs": ["Wallet address for the new associated token account."]
},
{
"kind": "instructionAccountNode",
"name": "mint",
"isWritable": false,
"isSigner": false,
"isOptional": false,
"docs": ["The token mint for the new associated token account."]
},
{
"kind": "instructionAccountNode",
"display": {
"kind": "instructionAccountDisplayNode",
"skip": "always"
},
"name": "systemProgram",
"isWritable": false,
"isSigner": false,
"isOptional": false,
"docs": ["System program."],
"defaultValue": {
"kind": "publicKeyValueNode",
"publicKey": "11111111111111111111111111111111"
}
},
{
"kind": "instructionAccountNode",
"name": "tokenProgram",
"isWritable": false,
"isSigner": false,
"isOptional": false,
"docs": ["SPL Token program."],
"defaultValue": {
"kind": "publicKeyValueNode",
"publicKey": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"
}
}
],
"arguments": [
{
"kind": "instructionArgumentNode",
"display": {
"kind": "structFieldDisplayNode",
"skip": "always"
},
"name": "discriminator",
"type": {
"kind": "numberTypeNode",
"format": "u8",
"endian": "le"
},
"docs": [],
"defaultValue": { "kind": "numberValueNode", "number": 1 },
"defaultValueStrategy": "omitted"
}
],
"discriminators": [
{
"kind": "fieldDiscriminatorNode",
"name": "discriminator",
"offset": 0
}
],
"name": "createAssociatedTokenIdempotent",
"docs": [
"Creates an associated token account for the given wallet address and",
"token mint, if it doesn't already exist. Returns an error if the",
"account exists, but with a different owner."
],
"optionalAccountStrategy": "programId"
},
{
"kind": "instructionNode",
"display": {
"kind": "instructionDisplayNode",
"intent": "Recover nested token account",
"interpolatedIntent": "Recover nested token account ${accounts.nestedAssociatedAccountAddress} to ${accounts.destinationAssociatedAccountAddress}"
},
"accounts": [
{
"kind": "instructionAccountNode",
"display": {
"kind": "instructionAccountDisplayNode",
"label": "Nested Token Account"
},
"name": "nestedAssociatedAccountAddress",
"isWritable": true,
"isSigner": false,
"isOptional": false,
"docs": [
"Nested associated token account, must be owned by ownerAssociatedAccountAddress."
],
"defaultValue": {
"kind": "pdaValueNode",
"pda": {
"kind": "pdaLinkNode",
"name": "associatedToken"
},
"seeds": [
{
"kind": "pdaSeedValueNode",
"name": "owner",
"value": {
"kind": "accountValueNode",
"name": "ownerAssociatedAccountAddress"
}
},
{
"kind": "pdaSeedValueNode",
"name": "tokenProgram",
"value": {
"kind": "accountValueNode",
"name": "tokenProgram"
}
},
{
"kind": "pdaSeedValueNode",
"name": "mint",
"value": {
"kind": "accountValueNode",
"name": "nestedTokenMintAddress"
}
}
]
}
},
{
"kind": "instructionAccountNode",
"display": {
"kind": "instructionAccountDisplayNode",
"label": "Nested Mint"
},
"name": "nestedTokenMintAddress",
"isWritable": false,
"isSigner": false,
"isOptional": false,
"docs": ["Token mint for the nested associated token account."]
},
{
"kind": "instructionAccountNode",
"display": {
"kind": "instructionAccountDisplayNode",
"label": "Destination Token Account"
},
"name": "destinationAssociatedAccountAddress",
"isWritable": true,
"isSigner": false,
"isOptional": false,
"docs": ["Wallet's associated token account."],
"defaultValue": {
"kind": "pdaValueNode",
"pda": {
"kind": "pdaLinkNode",
"name": "associatedToken"
},
"seeds": [
{
"kind": "pdaSeedValueNode",
"name": "owner",
"value": {
"kind": "accountValueNode",
"name": "walletAddress"
}
},
{
"kind": "pdaSeedValueNode",
"name": "tokenProgram",
"value": {
"kind": "accountValueNode",
"name": "tokenProgram"
}
},
{
"kind": "pdaSeedValueNode",
"name": "mint",
"value": {
"kind": "accountValueNode",
"name": "nestedTokenMintAddress"
}
}
]
}
},
{
"kind": "instructionAccountNode",
"display": {
"kind": "instructionAccountDisplayNode",
"label": "Owner Token Account"
},
"name": "ownerAssociatedAccountAddress",
"isWritable": false,
"isSigner": false,
"isOptional": false,
"docs": [
"Owner associated token account address, must be owned by walletAddress."
],
"defaultValue": {
"kind": "pdaValueNode",
"pda": {
"kind": "pdaLinkNode",
"name": "associatedToken"
},
"seeds": [
{
"kind": "pdaSeedValueNode",
"name": "owner",
"value": {
"kind": "accountValueNode",
"name": "walletAddress"
}
},
{
"kind": "pdaSeedValueNode",
"name": "tokenProgram",
"value": {
"kind": "accountValueNode",
"name": "tokenProgram"
}
},
{
"kind": "pdaSeedValueNode",
"name": "mint",
"value": {
"kind": "accountValueNode",
"name": "ownerTokenMintAddress"
}
}
]
}
},
{
"kind": "instructionAccountNode",
"display": {
"kind": "instructionAccountDisplayNode",
"label": "Owner Mint"
},
"name": "ownerTokenMintAddress",
"isWritable": false,
"isSigner": false,
"isOptional": false,
"docs": ["Token mint for the owner associated token account."]
},
{
"kind": "instructionAccountNode",
"display": {
"kind": "instructionAccountDisplayNode",
"label": "Wallet"
},
"name": "walletAddress",
"isWritable": true,
"isSigner": true,
"isOptional": false,
"docs": ["Wallet address for the owner associated token account."]
},
{
"kind": "instructionAccountNode",
"name": "tokenProgram",
"isWritable": false,
"isSigner": false,
"isOptional": false,
"docs": ["SPL Token program."],
"defaultValue": {
"kind": "publicKeyValueNode",
"publicKey": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"
}
}
],
"arguments": [
{
"kind": "instructionArgumentNode",
"display": {
"kind": "structFieldDisplayNode",
"skip": "always"
},
"name": "discriminator",
"type": {
"kind": "numberTypeNode",
"format": "u8",
"endian": "le"
},
"docs": [],
"defaultValue": { "kind": "numberValueNode", "number": 2 },
"defaultValueStrategy": "omitted"
}
],
"discriminators": [
{
"kind": "fieldDiscriminatorNode",
"name": "discriminator",
"offset": 0
}
],
"name": "recoverNestedAssociatedToken",
"docs": [
"Transfers from and closes a nested associated token account: an",
"associated token account owned by an associated token account.",
"",
"The tokens are moved from the nested associated token account to the",
"wallet's associated token account, and the nested account lamports are",
"moved to the wallet.",
"",
"Note: Nested token accounts are an anti-pattern, and almost always",
"created unintentionally, so this instruction should only be used to",
"recover from errors."
],
"optionalAccountStrategy": "programId"
}
],
"definedTypes": [],
"errors": [
{
"kind": "errorNode",
"name": "invalidOwner",
"code": 0,
"message": "Associated token account owner does not match address derivation",
"docs": [
"InvalidOwner: Associated token account owner does not match address derivation"
]
}
],
"name": "associatedToken",
"prefix": "",
"publicKey": "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL",
"version": "1.1.1",
"origin": "shank"
}
],
"standard": "codama",
"version": "1.0.0"
}

bigSmooth7867 pushed a commit to bigSmooth7867/swarm that referenced this pull request Sep 10, 2026
This PR contains the following updates:

| Package | Update | Change |
|---|---|---|
| [infisical/infisical](https://infisical.com) ([source](https://github.com/Infisical/infisical)) | minor | `v0.162.24` → `v0.165.9` |

---

### Release Notes

<details>
<summary>Infisical/infisical (infisical/infisical)</summary>

### [`v0.165.9`](https://github.com/Infisical/infisical/releases/tag/v0.165.9)

[Compare Source](Infisical/infisical@v0.165.8...v0.165.9)

#### What's Changed

- chore: add upgrade impact for v0.165.8 by [@&#8203;github-actions](https://github.com/github-actions)\[bot] in [#&#8203;8039](Infisical/infisical#8039)
- fix(dynamic-secrets): add missing provider logos by [@&#8203;andrewhuhh](https://github.com/andrewhuhh) in [#&#8203;8032](Infisical/infisical#8032)
- chore(deps): bump the bundled CLI to 0.43.129 by [@&#8203;Vligai](https://github.com/Vligai) in [#&#8203;8026](Infisical/infisical#8026)
- improvement(security): derive cookie signing key from KMS root key by [@&#8203;victorvhs017](https://github.com/victorvhs017) in [#&#8203;8029](Infisical/infisical#8029)
- feat(secret-sync): detect duplicate Daytona syncs by organization by [@&#8203;lobocv](https://github.com/lobocv) in [#&#8203;7994](Infisical/infisical#7994)
- improvement(frontend): upgrade framer-motion to motion by [@&#8203;claude](https://github.com/claude)\[bot] in [#&#8203;8033](Infisical/infisical#8033)
- improvement(ui): point onboarding CTA to community instead of Slack by [@&#8203;claude](https://github.com/claude)\[bot] in [#&#8203;8009](Infisical/infisical#8009)
- fix(github-org-sync): safely sync teams for large orgs by [@&#8203;scott-ray-wilson](https://github.com/scott-ray-wilson) in [#&#8203;7998](Infisical/infisical#7998)
- fix(secrets-access-requests): auto open review sheet when request ID present by [@&#8203;varonix0](https://github.com/varonix0) in [#&#8203;8041](Infisical/infisical#8041)
- feat(ui): add global command menu by [@&#8203;andrewhuhh](https://github.com/andrewhuhh) in [#&#8203;7877](Infisical/infisical#7877)
- docs(integrations): poc for app connections and integrations format revamp by [@&#8203;adkah](https://github.com/adkah) in [#&#8203;8028](Infisical/infisical#8028)
- improvement(frontend): flatten pki sidebar general section into top-level items by [@&#8203;claude](https://github.com/claude)\[bot] in [#&#8203;8049](Infisical/infisical#8049)
- improvement(frontend): render server console banners inside sidebar inset by [@&#8203;claude](https://github.com/claude)\[bot] in [#&#8203;8050](Infisical/infisical#8050)
- feat: add pki license gating by [@&#8203;sheensantoscapadngan](https://github.com/sheensantoscapadngan) in [#&#8203;7939](Infisical/infisical#7939)
- improvement(frontend): migrate add machine identity to project dialog to v3 by [@&#8203;claude](https://github.com/claude)\[bot] in [#&#8203;8047](Infisical/infisical#8047)
- improvement(frontend): lower bulk action bar and add shadow by [@&#8203;claude](https://github.com/claude)\[bot] in [#&#8203;8059](Infisical/infisical#8059)
- chore(project-cleanup): clarify concurrent worker deletion log message by [@&#8203;victorvhs017](https://github.com/victorvhs017) in [#&#8203;8053](Infisical/infisical#8053)
- feat: introduce INFISICAL\_RUN\_MODES by [@&#8203;mathnogueira](https://github.com/mathnogueira) in [#&#8203;8031](Infisical/infisical#8031)
- improvement(frontend): rename v3 switch component to toggle by [@&#8203;claude](https://github.com/claude)\[bot] in [#&#8203;8065](Infisical/infisical#8065)
- fix: allow read operations in cross project secret sharing by [@&#8203;mathnogueira](https://github.com/mathnogueira) in [#&#8203;7966](Infisical/infisical#7966)
- improvement(frontend): use Alert and Combobox in Doppler import modal by [@&#8203;andrewhuhh](https://github.com/andrewhuhh) in [#&#8203;8058](Infisical/infisical#8058)
- fix(pki): set intermediate CA parentCaId to null instead of cascading on parent delete by [@&#8203;carlosmonastyrski](https://github.com/carlosmonastyrski) in [#&#8203;8063](Infisical/infisical#8063)

**Full Changelog**: <Infisical/infisical@v0.165.8...v0.165.9>

### [`v0.165.8`](https://github.com/Infisical/infisical/releases/tag/v0.165.8)

[Compare Source](Infisical/infisical@v0.165.7...v0.165.8)

#### What's Changed

- chore: add upgrade impact for v0.165.7 by [@&#8203;github-actions](https://github.com/github-actions)\[bot] in [#&#8203;8027](Infisical/infisical#8027)
- fix(telemetry): bound HTTP metric cardinality and add core request counter by [@&#8203;victorvhs017](https://github.com/victorvhs017) in [#&#8203;7995](Infisical/infisical#7995)
- docs(pam): rework postgres discovery guide by [@&#8203;adkah](https://github.com/adkah) in [#&#8203;8034](Infisical/infisical#8034)
- fix(secret-rotation): accept iLO 7 "hpeiLO->" prompt in HP iLO rotation by [@&#8203;claude](https://github.com/claude)\[bot] in [#&#8203;7977](Infisical/infisical#7977)

**Full Changelog**: <Infisical/infisical@v0.165.7...v0.165.8>

### [`v0.165.7`](https://github.com/Infisical/infisical/releases/tag/v0.165.7)

[Compare Source](Infisical/infisical@v0.165.6...v0.165.7)

#### What's Changed

- fix: make many-to-one aws sm sync only target one secret by [@&#8203;mathnogueira](https://github.com/mathnogueira) in [#&#8203;7999](Infisical/infisical#7999)
- chore: add upgrade impact for v0.165.6 by [@&#8203;github-actions](https://github.com/github-actions)\[bot] in [#&#8203;8004](Infisical/infisical#8004)
- docs(platform): additional screenshot pass by [@&#8203;adkah](https://github.com/adkah) in [#&#8203;7997](Infisical/infisical#7997)
- improvement(frontend): reduce mobile padding on overview and dashboard pages by [@&#8203;claude](https://github.com/claude)\[bot] in [#&#8203;8005](Infisical/infisical#8005)
- feat: allow one LDAP connection to back many Linux and Windows syncs by [@&#8203;carlosmonastyrski](https://github.com/carlosmonastyrski) in [#&#8203;7867](Infisical/infisical#7867)
- fix: coalesce concurrent secret reference folder loads by [@&#8203;maidul98](https://github.com/maidul98) in [#&#8203;8011](Infisical/infisical#8011)
- fix: split query into 3 ones to reduce duplicate alloc by joins by [@&#8203;mathnogueira](https://github.com/mathnogueira) in [#&#8203;8012](Infisical/infisical#8012)
- improvement(audit-log): tag stale-claim drops with stream provider by [@&#8203;victorvhs017](https://github.com/victorvhs017) in [#&#8203;8001](Infisical/infisical#8001)
- fix(app-connections): standardize add sheet discard handling by [@&#8203;andrewhuhh](https://github.com/andrewhuhh) in [#&#8203;7942](Infisical/infisical#7942)
- improvement(approvals): add create-policy CTA to change requests empty state when no policies exist by [@&#8203;claude](https://github.com/claude)\[bot] in [#&#8203;8008](Infisical/infisical#8008)
- fix(frontend): match secret row hover actions to standard ghost icon buttons by [@&#8203;claude](https://github.com/claude)\[bot] in [#&#8203;8020](Infisical/infisical#8020)
- feat(pam): break-glass for access requests by [@&#8203;lb-vn](https://github.com/lb-vn) in [#&#8203;7930](Infisical/infisical#7930)

**Full Changelog**: <Infisical/infisical@v0.165.6...v0.165.7>

### [`v0.165.6`](https://github.com/Infisical/infisical/releases/tag/v0.165.6)

[Compare Source](Infisical/infisical@v0.165.5...v0.165.6)

##### Changed

- Auto-refresh scan runs and installations while a scan is running ([#&#8203;7964](Infisical/infisical#7964))

##### Fixed

- Fix Unix rotation prompt fragmentation ([#&#8203;7976](Infisical/infisical#7976))
- Prevent inheriting existing login browser organization when using CLI login ([#&#8203;7993](Infisical/infisical#7993))

### [`v0.165.5`](https://github.com/Infisical/infisical/releases/tag/v0.165.5)

[Compare Source](Infisical/infisical@v0.165.4...v0.165.5)

#### What's Changed

- feat: added support to send region to license server by [@&#8203;akhilmhdh](https://github.com/akhilmhdh) in [#&#8203;7975](Infisical/infisical#7975)
- docs(app-connections): recapture cloud provider and database connector screenshots by [@&#8203;adkah](https://github.com/adkah) in [#&#8203;7980](Infisical/infisical#7980)
- docs(app-connections): recapture source control and CI connector screenshots by [@&#8203;adkah](https://github.com/adkah) in [#&#8203;7981](Infisical/infisical#7981)
- docs(identities): recapture auth method screenshots and align button labels by [@&#8203;adkah](https://github.com/adkah) in [#&#8203;7984](Infisical/infisical#7984)
- docs(platform): recapture org control screenshots and rewrite SSO & Provisioning navigation by [@&#8203;adkah](https://github.com/adkah) in [#&#8203;7985](Infisical/infisical#7985)
- chore: add upgrade impact for v0.165.4 by [@&#8203;github-actions](https://github.com/github-actions)\[bot] in [#&#8203;7991](Infisical/infisical#7991)
- docs(pam): credential health by [@&#8203;bernie-g](https://github.com/bernie-g) in [#&#8203;7971](Infisical/infisical#7971)
- docs(app-connections): recapture token-based connector screenshots by [@&#8203;adkah](https://github.com/adkah) in [#&#8203;7983](Infisical/infisical#7983)
- fix: dont inherit exisitng login browser org when using cli login by [@&#8203;scott-ray-wilson](https://github.com/scott-ray-wilson) in [#&#8203;7993](Infisical/infisical#7993)

**Full Changelog**: <Infisical/infisical@v0.165.4...v0.165.5>

### [`v0.165.4`](https://github.com/Infisical/infisical/releases/tag/v0.165.4)

[Compare Source](Infisical/infisical@v0.165.3...v0.165.4)

#### What's Changed

- docs(security): remove e2e references by [@&#8203;adkah](https://github.com/adkah) in [#&#8203;7974](Infisical/infisical#7974)
- improvement(secret-syncs): rename disable secret deletion copy by [@&#8203;claude](https://github.com/claude)\[bot] in [#&#8203;7948](Infisical/infisical#7948)
- chore: add upgrade impact for v0.165.3 by [@&#8203;github-actions](https://github.com/github-actions)\[bot] in [#&#8203;7973](Infisical/infisical#7973)
- fix(frontend): use text-muted for v3 textarea and command placeholders by [@&#8203;claude](https://github.com/claude)\[bot] in [#&#8203;7962](Infisical/infisical#7962)
- fix: bound membership removal and role changes by the target's privileges for legacy system by [@&#8203;Thiago-AS](https://github.com/Thiago-AS) in [#&#8203;7916](Infisical/infisical#7916)
- improvement(ui): migrate project upgrade gate to v3 by [@&#8203;andrewhuhh](https://github.com/andrewhuhh) in [#&#8203;7954](Infisical/infisical#7954)
- docs(footer): update community link by [@&#8203;adkah](https://github.com/adkah) in [#&#8203;7988](Infisical/infisical#7988)
- chore(deps): base image and dependency updates from a customer contai… by [@&#8203;Vligai](https://github.com/Vligai) in [#&#8203;7957](Infisical/infisical#7957)
- docs(app-connections): recapture deploy platform connector screenshots by [@&#8203;adkah](https://github.com/adkah) in [#&#8203;7982](Infisical/infisical#7982)

**Full Changelog**: <Infisical/infisical@v0.165.3...v0.165.4>

### [`v0.165.3`](https://github.com/Infisical/infisical/releases/tag/v0.165.3)

[Compare Source](Infisical/infisical@v0.165.2...v0.165.3)

#### What's Changed

- improvement(dynamic-secrets): remove legacy provider forms by [@&#8203;andrewhuhh](https://github.com/andrewhuhh) in [#&#8203;7932](Infisical/infisical#7932)
- fix: always show cross-project secret sharing in prod settings by [@&#8203;mathnogueira](https://github.com/mathnogueira) in [#&#8203;7931](Infisical/infisical#7931)
- improvement(secrets): normalize honey token v3 interactions by [@&#8203;andrewhuhh](https://github.com/andrewhuhh) in [#&#8203;7735](Infisical/infisical#7735)
- docs: remove secret validation rule endpoints from API reference by [@&#8203;claude](https://github.com/claude)\[bot] in [#&#8203;7938](Infisical/infisical#7938)
- chore: add upgrade impact for v0.165.2 by [@&#8203;github-actions](https://github.com/github-actions)\[bot] in [#&#8203;7934](Infisical/infisical#7934)
- feat: resolved approval ui showing uuid in list by [@&#8203;akhilmhdh](https://github.com/akhilmhdh) in [#&#8203;7945](Infisical/infisical#7945)
- docs: refresh secret versioning and point-in-time recovery screenshots by [@&#8203;jakehulberg](https://github.com/jakehulberg) in [#&#8203;7946](Infisical/infisical#7946)
- docs(secrets-mgmt): improve ia by [@&#8203;adkah](https://github.com/adkah) in [#&#8203;7937](Infisical/infisical#7937)
- docs(screenshots): update highest impact screenshots and prose by [@&#8203;adkah](https://github.com/adkah) in [#&#8203;7949](Infisical/infisical#7949)
- chore(ui): establish component deprecation lifecycle by [@&#8203;andrewhuhh](https://github.com/andrewhuhh) in [#&#8203;7929](Infisical/infisical#7929)
- feat: removed plan check from the policy delete endpoint by [@&#8203;akhilmhdh](https://github.com/akhilmhdh) in [#&#8203;7950](Infisical/infisical#7950)
- feat: added better logging around the tunnel closing and changed the tunnel closing order by [@&#8203;akhilmhdh](https://github.com/akhilmhdh) in [#&#8203;7944](Infisical/infisical#7944)
- fix: cert dashboard and signer approval policy improvements by [@&#8203;carlosmonastyrski](https://github.com/carlosmonastyrski) in [#&#8203;7880](Infisical/infisical#7880)
- docs(secrets-mgmt): update most screenshots by [@&#8203;adkah](https://github.com/adkah) in [#&#8203;7955](Infisical/infisical#7955)
- chore(code-agents): license check guidelines by [@&#8203;varonix0](https://github.com/varonix0) in [#&#8203;7956](Infisical/infisical#7956)
- feat(pam): account password viewing with access requests by [@&#8203;lb-vn](https://github.com/lb-vn) in [#&#8203;7879](Infisical/infisical#7879)
- chore: add upgrade impact for v0.165.1 by [@&#8203;github-actions](https://github.com/github-actions)\[bot] in [#&#8203;7933](Infisical/infisical#7933)
- feat: add oidc auth template support for MIs by [@&#8203;scott-ray-wilson](https://github.com/scott-ray-wilson) in [#&#8203;7935](Infisical/infisical#7935)
- docs(style): fix contractions + ui buttons by [@&#8203;adkah](https://github.com/adkah) in [#&#8203;7910](Infisical/infisical#7910)
- feat(secret-sync): add Daytona app connection and secret sync by [@&#8203;lobocv](https://github.com/lobocv) in [#&#8203;7866](Infisical/infisical#7866)
- feat: sync member email and name from the identity provider when the IdP is authoritative by [@&#8203;Thiago-AS](https://github.com/Thiago-AS) in [#&#8203;7936](Infisical/infisical#7936)
- feat(pam): heartbeats by [@&#8203;bernie-g](https://github.com/bernie-g) in [#&#8203;7849](Infisical/infisical#7849)
- docs(platform): first pass screenshot audit by [@&#8203;adkah](https://github.com/adkah) in [#&#8203;7968](Infisical/infisical#7968)

**Full Changelog**: <Infisical/infisical@v0.165.2...v0.165.3>

### [`v0.165.2`](https://github.com/Infisical/infisical/releases/tag/v0.165.2)

[Compare Source](Infisical/infisical@v0.165.1...v0.165.2)

#### What's Changed

- improvement(admin-encryption): warn before forcing previous root key deactivation by [@&#8203;victorvhs017](https://github.com/victorvhs017) in [#&#8203;7912](Infisical/infisical#7912)

**Full Changelog**: <Infisical/infisical@v0.165.1...v0.165.2>

### [`v0.165.1`](https://github.com/Infisical/infisical/releases/tag/v0.165.1)

#### What's Changed

- feat(pki): windows/linux PKI Syns pre-fetch commands by [@&#8203;carlosmonastyrski](https://github.com/carlosmonastyrski) in [#&#8203;7694](Infisical/infisical#7694)
- fix: make approvals check for validation rules by [@&#8203;mathnogueira](https://github.com/mathnogueira) in [#&#8203;7837](Infisical/infisical#7837)
- feat(pki): expose the latest renewal of a certificate so agents can follow renewals by [@&#8203;carlosmonastyrski](https://github.com/carlosmonastyrski) in [#&#8203;7820](Infisical/infisical#7820)
- chore: add upgrade impact for v0.164.1 by [@&#8203;github-actions](https://github.com/github-actions)\[bot] in [#&#8203;7840](Infisical/infisical#7840)
- docs: fix grammar in dynamic secrets overview by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;7847](Infisical/infisical#7847)
- fix(ui): reset search input when user gets into folder by [@&#8203;adilsitos](https://github.com/adilsitos) in [#&#8203;7844](Infisical/infisical#7844)
- docs: linux and windows doc improvements by [@&#8203;sheensantoscapadngan](https://github.com/sheensantoscapadngan) in [#&#8203;7846](Infisical/infisical#7846)
- improvement: add port number to Splunk provider by [@&#8203;Thiago-AS](https://github.com/Thiago-AS) in [#&#8203;7843](Infisical/infisical#7843)
- fix: add blocks for ca incompatibility by [@&#8203;sheensantoscapadngan](https://github.com/sheensantoscapadngan) in [#&#8203;7848](Infisical/infisical#7848)
- docs: add AI agent identities to identity counting by [@&#8203;0xArshdeep](https://github.com/0xArshdeep) in [#&#8203;7845](Infisical/infisical#7845)
- feat(permissions): folder rbac by [@&#8203;adilsitos](https://github.com/adilsitos) in [#&#8203;7762](Infisical/infisical#7762)
- fix(kubernetes-auth): pin direct API requests with safeRequest by [@&#8203;victorvhs017](https://github.com/victorvhs017) in [#&#8203;7855](Infisical/infisical#7855)
- feat(pki-sync): add GCP Certificate Manager Sync by [@&#8203;carlosmonastyrski](https://github.com/carlosmonastyrski) in [#&#8203;7737](Infisical/infisical#7737)
- fix(docs): route vulnerability reports through the disclosure policy by [@&#8203;Vligai](https://github.com/Vligai) in [#&#8203;7856](Infisical/infisical#7856)
- fix(auth): pool https agents and fix gateway sni by [@&#8203;victorvhs017](https://github.com/victorvhs017) in [#&#8203;7857](Infisical/infisical#7857)
- feat(webhooks): approval and change request webhook events by [@&#8203;lobocv](https://github.com/lobocv) in [#&#8203;7780](Infisical/infisical#7780)
- docs(wip): top level ia 2 by [@&#8203;adkah](https://github.com/adkah) in [#&#8203;7830](Infisical/infisical#7830)
- docs(secret-rotation): fix typos by [@&#8203;adkah](https://github.com/adkah) in [#&#8203;7861](Infisical/infisical#7861)
- feat(pam): default ssh access to interactive shell by [@&#8203;lb-vn](https://github.com/lb-vn) in [#&#8203;7838](Infisical/infisical#7838)
- feat(pam): improve error code for deleting discovery cred acc by [@&#8203;lb-vn](https://github.com/lb-vn) in [#&#8203;7854](Infisical/infisical#7854)
- feat(docs): add folder rbac docs by [@&#8203;adilsitos](https://github.com/adilsitos) in [#&#8203;7862](Infisical/infisical#7862)
- docs(footer): fix forum link by [@&#8203;adkah](https://github.com/adkah) in [#&#8203;7865](Infisical/infisical#7865)
- fix(certificate): scope certificate private-key read permission to the certificate subject on v3 issuance by [@&#8203;Vligai](https://github.com/Vligai) in [#&#8203;7549](Infisical/infisical#7549)
- fix(cert-v3): route DigiCert requests through external issuance on approval by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;7870](Infisical/infisical#7870)
- improvement(approvals): migrate page shell to v3 by [@&#8203;andrewhuhh](https://github.com/andrewhuhh) in [#&#8203;7836](Infisical/infisical#7836)
- docs(folder-rbac): enhancements by [@&#8203;adilsitos](https://github.com/adilsitos) in [#&#8203;7874](Infisical/infisical#7874)
- feat(abac): add trim suffix  by [@&#8203;adilsitos](https://github.com/adilsitos) in [#&#8203;7817](Infisical/infisical#7817)
- improvement(secrets): migrate Vault import dialogs to v3 by [@&#8203;andrewhuhh](https://github.com/andrewhuhh) in [#&#8203;7794](Infisical/infisical#7794)
- feat: add kubernetes MI auth template support by [@&#8203;scott-ray-wilson](https://github.com/scott-ray-wilson) in [#&#8203;7713](Infisical/infisical#7713)
- fix: collapse signer approvals into a single setup card until a policy exists by [@&#8203;carlosmonastyrski](https://github.com/carlosmonastyrski) in [#&#8203;7875](Infisical/infisical#7875)
- feat(ui): select all for vault import secret path Combobox by [@&#8203;claude](https://github.com/claude)\[bot] in [#&#8203;7878](Infisical/infisical#7878)
- fix(pam): re-check session validity when privileged access is granted by [@&#8203;lb-vn](https://github.com/lb-vn) in [#&#8203;7852](Infisical/infisical#7852)
- feat(docs): add ansible folder operations  by [@&#8203;adilsitos](https://github.com/adilsitos) in [#&#8203;7871](Infisical/infisical#7871)
- docs(secrets-mgmt): clarify dual-phase rotation by [@&#8203;adkah](https://github.com/adkah) in [#&#8203;7864](Infisical/infisical#7864)
- docs(secrets-mgmt): refresh spacelift sync by [@&#8203;adkah](https://github.com/adkah) in [#&#8203;7896](Infisical/infisical#7896)
- feat(dynamic-secrets): cut over to shared provider registry by [@&#8203;andrewhuhh](https://github.com/andrewhuhh) in [#&#8203;7839](Infisical/infisical#7839)
- fix: pki ux patches by [@&#8203;sheensantoscapadngan](https://github.com/sheensantoscapadngan) in [#&#8203;7853](Infisical/infisical#7853)
- feat: set project retention limits by [@&#8203;varonix0](https://github.com/varonix0) in [#&#8203;7887](Infisical/infisical#7887)
- docs(style): add skill for applying docs style by [@&#8203;adkah](https://github.com/adkah) in [#&#8203;7907](Infisical/infisical#7907)
- feat(secret-manager): revamp replicate secrets workflow by [@&#8203;andrewhuhh](https://github.com/andrewhuhh) in [#&#8203;7793](Infisical/infisical#7793)
- fix(identity-ldap-auth): stop returning bind password on GET by [@&#8203;victorvhs017](https://github.com/victorvhs017) in [#&#8203;7873](Infisical/infisical#7873)
- fix(pki): clear NULL extended key usage elements on certificates by [@&#8203;claude](https://github.com/claude)\[bot] in [#&#8203;7900](Infisical/infisical#7900)
- chore(docker): refresh stale libssl pin and slim the runtime image by [@&#8203;Vligai](https://github.com/Vligai) in [#&#8203;7905](Infisical/infisical#7905)
- fix: resolved multi line yaml pasting issue by [@&#8203;akhilmhdh](https://github.com/akhilmhdh) in [#&#8203;7920](Infisical/infisical#7920)
- chore: storybook preview by [@&#8203;scott-ray-wilson](https://github.com/scott-ray-wilson) in [#&#8203;7914](Infisical/infisical#7914)
- feat: add helper text for digicert profiles during issuance by [@&#8203;sheensantoscapadngan](https://github.com/sheensantoscapadngan) in [#&#8203;7911](Infisical/infisical#7911)
- fix(webhook): render the test event for the webhook's type by [@&#8203;lobocv](https://github.com/lobocv) in [#&#8203;7893](Infisical/infisical#7893)
- improvement(integrations): move integrations page header and tabs to v3 by [@&#8203;claude](https://github.com/claude)\[bot] in [#&#8203;7909](Infisical/infisical#7909)
- feature(ui): add generic v3 loader component and migrate branded loader call sites by [@&#8203;claude](https://github.com/claude)\[bot] in [#&#8203;7895](Infisical/infisical#7895)
- improvement: refactor cert profile policy creation to be inline by [@&#8203;scott-ray-wilson](https://github.com/scott-ray-wilson) in [#&#8203;7908](Infisical/infisical#7908)
- chore: comment storybook preview links by [@&#8203;andrewhuhh](https://github.com/andrewhuhh) in [#&#8203;7925](Infisical/infisical#7925)
- chore(docker): drop the source tree and recommended packages from the image by [@&#8203;Vligai](https://github.com/Vligai) in [#&#8203;7917](Infisical/infisical#7917)
- fix(ui): read the real reduced-motion preference in v3 Loader by [@&#8203;claude](https://github.com/claude)\[bot] in [#&#8203;7927](Infisical/infisical#7927)

**Full Changelog**: <Infisical/infisical@v0.164.1...v0.165.1>

### [`v0.164.1`](https://github.com/Infisical/infisical/releases/tag/v0.164.1)

[Compare Source](Infisical/infisical@v0.164.0...v0.164.1)

#### What's Changed

- feat: add validation rules for LDAP, SQL and linux by [@&#8203;mathnogueira](https://github.com/mathnogueira) in [#&#8203;7568](Infisical/infisical#7568)
- docs(cli): add note about --recursive by [@&#8203;adkah](https://github.com/adkah) in [#&#8203;7832](Infisical/infisical#7832)
- chore: add upgrade impact for v0.164.0 by [@&#8203;github-actions](https://github.com/github-actions)\[bot] in [#&#8203;7829](Infisical/infisical#7829)
- feature(helm): require config.siteUrl in infisical-nkp chart by [@&#8203;0xArshdeep](https://github.com/0xArshdeep) in [#&#8203;7834](Infisical/infisical#7834)
- feat(pam): postgres account discovery by [@&#8203;x032205](https://github.com/x032205) in [#&#8203;7790](Infisical/infisical#7790)
- docs(style): add custom vale ci check by [@&#8203;adkah](https://github.com/adkah) in [#&#8203;7835](Infisical/infisical#7835)
- feat(gateway-pools): load balancing by [@&#8203;bernie-g](https://github.com/bernie-g) in [#&#8203;7703](Infisical/infisical#7703)
- fix: resolve provisioning identifiers through SSO user aliases by [@&#8203;Thiago-AS](https://github.com/Thiago-AS) in [#&#8203;7827](Infisical/infisical#7827)
- feat(dynamic-secrets): migrate identity and access provider forms by [@&#8203;andrewhuhh](https://github.com/andrewhuhh) in [#&#8203;7569](Infisical/infisical#7569)
- chore(secrets): remove deprecated IP allowlist frontend by [@&#8203;andrewhuhh](https://github.com/andrewhuhh) in [#&#8203;7799](Infisical/infisical#7799)
- feat(dynamic-secrets): migrate data-service and protocol provider forms by [@&#8203;andrewhuhh](https://github.com/andrewhuhh) in [#&#8203;7574](Infisical/infisical#7574)
- improvement(auth): harden signup and account recovery email dispatch by [@&#8203;victorvhs017](https://github.com/victorvhs017) in [#&#8203;7833](Infisical/infisical#7833)

**Full Changelog**: <Infisical/infisical@v0.164.0...v0.164.1>

### [`v0.164.0`](https://github.com/Infisical/infisical/releases/tag/v0.164.0)

[Compare Source](Infisical/infisical@v0.163.0...v0.164.0)

#### What's Changed

- fix(pam): show orphan sessions to product admins by [@&#8203;x032205](https://github.com/x032205) in [#&#8203;7811](Infisical/infisical#7811)
- feat: allow creation of cert profiles from inside applications by [@&#8203;sheensantoscapadngan](https://github.com/sheensantoscapadngan) in [#&#8203;7768](Infisical/infisical#7768)
- chore: add upgrade impact for v0.163.0 by [@&#8203;github-actions](https://github.com/github-actions)\[bot] in [#&#8203;7825](Infisical/infisical#7825)
- fix(pam): send cancellation signal to gateway when a session expires by [@&#8203;x032205](https://github.com/x032205) in [#&#8203;7813](Infisical/infisical#7813)
- improvement(ui): migrate email service setup modal to v3 Dialog by [@&#8203;claude](https://github.com/claude)\[bot] in [#&#8203;7807](Infisical/infisical#7807)
- improvement(settings): gate cross-project sharing actions by [@&#8203;andrewhuhh](https://github.com/andrewhuhh) in [#&#8203;7746](Infisical/infisical#7746)
- feat(encryption): implement root encryption key rotation by [@&#8203;victorvhs017](https://github.com/victorvhs017) in [#&#8203;7744](Infisical/infisical#7744)
- fix(ui): restore wheel scrolling in select menus rendered inside dialogs by [@&#8203;claude](https://github.com/claude)\[bot] in [#&#8203;7819](Infisical/infisical#7819)

**Full Changelog**: <Infisical/infisical@v0.163.0...v0.164.0>

### [`v0.163.0`](https://github.com/Infisical/infisical/releases/tag/v0.163.0)

[Compare Source](Infisical/infisical@v0.162.24...v0.163.0)

#### What's Changed

- feat: allow to edit cert details on manual renewals by [@&#8203;carlosmonastyrski](https://github.com/carlosmonastyrski) in [#&#8203;7592](Infisical/infisical#7592)
- feat(ui): migrate project roles access control to v3 by [@&#8203;andrewhuhh](https://github.com/andrewhuhh) in [#&#8203;7663](Infisical/infisical#7663)
- chore: add upgrade impact for v0.162.23 by [@&#8203;github-actions](https://github.com/github-actions)\[bot] in [#&#8203;7757](Infisical/infisical#7757)
- fix: remove redundant toast notifcations when erroring on creating an identity by [@&#8203;scott-ray-wilson](https://github.com/scott-ray-wilson) in [#&#8203;7760](Infisical/infisical#7760)
- feat(pam): iam auth for postgres by [@&#8203;x032205](https://github.com/x032205) in [#&#8203;7676](Infisical/infisical#7676)
- chore: add upgrade impact for v0.162.24 by [@&#8203;github-actions](https://github.com/github-actions)\[bot] in [#&#8203;7763](Infisical/infisical#7763)
- docs(secrets-mgmt): add more guide links by [@&#8203;adkah](https://github.com/adkah) in [#&#8203;7767](Infisical/infisical#7767)
- feat: first improvement in gc for secrets by [@&#8203;akhilmhdh](https://github.com/akhilmhdh) in [#&#8203;7756](Infisical/infisical#7756)
- fix(insights): revive dates to be Date so they are not string by [@&#8203;adilsitos](https://github.com/adilsitos) in [#&#8203;7773](Infisical/infisical#7773)
- feat: allow change policy to apply to machine identities by [@&#8203;mathnogueira](https://github.com/mathnogueira) in [#&#8203;7540](Infisical/infisical#7540)
- improvement: add clock skew handling for gw and relay by [@&#8203;sheensantoscapadngan](https://github.com/sheensantoscapadngan) in [#&#8203;7575](Infisical/infisical#7575)
- docs(self-hosting): add copy button for env vars by [@&#8203;adkah](https://github.com/adkah) in [#&#8203;7779](https://github.com/Infisical/infisical/pull/7779)
- feat(kms): add delete protection for KMS keys by [@&#8203;carlosmonastyrski](https://github.com/carlosmonastyrski) in [#&#8203;7771](https://github.com/Infisical/infisical/pull/7771)
- docs(vale): fix config and errors by [@&#8203;adkah](https://github.com/adkah) in [#&#8203;7781](https://github.com/Infisical/infisical/pull/7781)
- chore: enforce checking at least one type in a pr description by [@&#8203;scott-ray-wilson](https://github.com/scott-ray-wilson) in [#&#8203;7764](https://github.com/Infisical/infisical/pull/7764)
- docs(secrets-mgmt): fix browser by [@&#8203;adkah](https://github.com/adkah) in [#&#8203;7782](https://github.com/Infisical/infisical/pull/7782)
- fix(gateway-helm): pass positional gateway name for default CLI by [@&#8203;victorvhs017](https://github.com/victorvhs017) in [#&#8203;7775](https://github.com/Infisical/infisical/pull/7775)
- fix(frontend): allow data: URIs in CSP font-src by [@&#8203;claude](https://github.com/claude)\[bot] in [#&#8203;7681](https://github.com/Infisical/infisical/pull/7681)
- feat(dynamic-secrets): migrate relational and warehouse provider forms by [@&#8203;andrewhuhh](https://github.com/andrewhuhh) in [#&#8203;7572](https://github.com/Infisical/infisical/pull/7572)
- docs(secrets-mgmt): revert browser fix by [@&#8203;adkah](https://github.com/adkah) in [#&#8203;7786](https://github.com/Infisical/infisical/pull/7786)
- fix(identity-lockout): replace Redis SCAN with sorted-set index for list reads by [@&#8203;victorvhs017](https://github.com/victorvhs017) in [#&#8203;7777](https://github.com/Infisical/infisical/pull/7777)
- fix: honor machine identity auth on org membership endpoints by [@&#8203;Thiago-AS](https://github.com/Thiago-AS) in [#&#8203;7788](https://github.com/Infisical/infisical/pull/7788)
- fix(auth): clear stale MFA attempts warning on successful verification by [@&#8203;claude](https://github.com/claude)\[bot] in [#&#8203;7791](https://github.com/Infisical/infisical/pull/7791)
- feat(frontend): identify new accounts in PostHog at signup completion by [@&#8203;claude](https://github.com/claude)\[bot] in [#&#8203;7787](https://github.com/Infisical/infisical/pull/7787)
- feat(pam): dedicated folder views by [@&#8203;x032205](https://github.com/x032205) in [#&#8203;7769](https://github.com/Infisical/infisical/pull/7769)
- fix(project-cleanup): batch-delete secret tree and index FK columns by [@&#8203;victorvhs017](https://github.com/victorvhs017) in [#&#8203;7796](https://github.com/Infisical/infisical/pull/7796)
- feat(telemetry): make team invite a queryable signup source by [@&#8203;claude](https://github.com/claude)\[bot] in [#&#8203;7789](https://github.com/Infisical/infisical/pull/7789)
- improvement(secrets): migrate create secret flow to v3 by [@&#8203;andrewhuhh](https://github.com/andrewhuhh) in [#&#8203;7730](https://github.com/Infisical/infisical/pull/7730)
- docs(certificate-mgmt): revamp microsoft intune guide by [@&#8203;adkah](https://github.com/adkah) in [#&#8203;7766](https://github.com/Infisical/infisical/pull/7766)
- docs(style): fix padding at bottom of pages by [@&#8203;adkah](https://github.com/adkah) in [#&#8203;7806](https://github.com/Infisical/infisical/pull/7806)
- feat(settings): add project tag editing by [@&#8203;andrewhuhh](https://github.com/andrewhuhh) in [#&#8203;7750](https://github.com/Infisical/infisical/pull/7750)
- feat: brought back the cleanup for license server by [@&#8203;akhilmhdh](https://github.com/akhilmhdh) in [#&#8203;7761](https://github.com/Infisical/infisical/pull/7761)
- docs(secrets-mgmt): add local dev guide by [@&#8203;adkah](https://github.com/adkah) in [#&#8203;7802](https://github.com/Infisical/infisical/pull/7802)
- feat: show renewed certificates as Renewed by [@&#8203;carlosmonastyrski](https://github.com/carlosmonastyrski) in [#&#8203;7784](https://github.com/Infisical/infisical/pull/7784)
- fix: resolved dev server reloading by [@&#8203;akhilmhdh](https://github.com/akhilmhdh) in [#&#8203;7772](https://github.com/Infisical/infisical/pull/7772)
- improvement(secrets): unify overview navigation and query state by [@&#8203;andrewhuhh](https://github.com/andrewhuhh) in [#&#8203;7738](https://github.com/Infisical/infisical/pull/7738)
- feat: add RFC 8693 token exchange grant by [@&#8203;Thiago-AS](https://github.com/Thiago-AS) in [#&#8203;7759](https://github.com/Infisical/infisical/pull/7759)
- feat(dynamic-secrets): migrate managed-store provider forms by [@&#8203;andrewhuhh](https://github.com/andrewhuhh) in [#&#8203;7573](https://github.com/Infisical/infisical/pull/7573)
- fix: add multi arch images on dev env by [@&#8203;Thiago-AS](https://github.com/Thiago-AS) in [#&#8203;7816](https://github.com/Infisical/infisical/pull/7816)
- fix(auth): hide initial signup progress by [@&#8203;andrewhuhh](https://github.com/andrewhuhh) in [#&#8203;7783](https://github.com/Infisical/infisical/pull/7783)
- fix(api): allow machine identities on approval policy routes by [@&#8203;saifsmailbox98](https://github.com/saifsmailbox98) in [#&#8203;7755](https://github.com/Infisical/infisical/pull/7755)
- fix(cert-manager): evaluate application permissions consistently across actor types by [@&#8203;carlosmonastyrski](https://github.com/carlosmonastyrski) in [#&#8203;7778](https://github.com/Infisical/infisical/pull/7778)
- fix(ui): prevent concurrent environment mutations by [@&#8203;andrewhuhh](https://github.com/andrewhuhh) in [#&#8203;7751](https://github.com/Infisical/infisical/pull/7751)
- improvement(admin): remove unused SAML/OIDC trust-email toggles and wire LDAP trust by [@&#8203;victorvhs017](https://github.com/victorvhs017) in [#&#8203;7792](https://github.com/Infisical/infisical/pull/7792)

**Full Changelog**: <Infisical/infisical@v0.162.24...v0.163.0>

</details>

---

### Configuration

📅 **Schedule**: (UTC)

- Branch creation
  - At any time (no schedule defined)
- Automerge
  - At any time (no schedule defined)

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Mend Renovate CLI](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0NC42MS42IiwidXBkYXRlZEluVmVyIjoiNDQuNjEuNiIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsibWlub3IiLCJyZW5vdmF0ZSJdfQ==-->

Reviewed-on: https://gitea.vcasaserver.com/omar/swarm/pulls/821
Co-authored-by: Renovate Bot <renovate-bot@vcasaserver.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants