diff --git a/packages/dynamic-address-resolution/src/codegen/codama-type-to-ts.ts b/packages/dynamic-address-resolution/src/codegen/codama-type-to-ts.ts index a90298362..8728166a3 100644 --- a/packages/dynamic-address-resolution/src/codegen/codama-type-to-ts.ts +++ b/packages/dynamic-address-resolution/src/codegen/codama-type-to-ts.ts @@ -37,7 +37,7 @@ export function codamaTypeToTS(type: TypeNode | undefined, definedTypes: Defined if (!type.fields || type.fields.length === 0) return '{}'; const fields = type.fields .filter(f => f.defaultValueStrategy !== 'omitted') - .map(f => `${f.name}: ${codamaTypeToTS(f.type, definedTypes)}`); + .map(f => `${f.identifier}: ${codamaTypeToTS(f.type, definedTypes)}`); if (fields.length === 0) return '{}'; return `{ ${fields.join('; ')} }`; } @@ -45,21 +45,21 @@ export function codamaTypeToTS(type: TypeNode | undefined, definedTypes: Defined if (!type.variants || type.variants.length === 0) return 'unknown /** empty variants in enumTypeNode */'; const allEmpty = type.variants.every(v => v.kind === 'enumEmptyVariantTypeNode'); if (allEmpty) { - return type.variants.map(v => `'${v.name}'`).join(' | '); + return type.variants.map(v => `'${v.identifier}'`).join(' | '); } const variantTypes = type.variants.map(v => { if (v.kind === 'enumEmptyVariantTypeNode') { - return `{ __kind: '${v.name}' }`; + return `{ __kind: '${v.identifier}' }`; } if (v.kind === 'enumStructVariantTypeNode' && v.struct) { const inner = codamaTypeToTS(v.struct, definedTypes); - return `{ __kind: '${v.name}' } & ${inner}`; + return `{ __kind: '${v.identifier}' } & ${inner}`; } if (v.kind === 'enumTupleVariantTypeNode' && v.tuple) { const inner = codamaTypeToTS(v.tuple, definedTypes); - return `{ __kind: '${v.name}'; fields: ${inner} }`; + return `{ __kind: '${v.identifier}'; fields: ${inner} }`; } - return `{ __kind: '${v.name}' }`; + return `{ __kind: '${v.identifier}' }`; }); return variantTypes.join(' | '); } @@ -79,8 +79,8 @@ export function codamaTypeToTS(type: TypeNode | undefined, definedTypes: Defined return `Record`; } case 'definedTypeLinkNode': { - if (!type.name) return 'unknown /** name missing in definedTypeLinkNode */'; - const def = definedTypes.find(d => d.name === type.name); + if (!type.identifier) return 'unknown /** name missing in definedTypeLinkNode */'; + const def = definedTypes.find(d => d.identifier === type.identifier); if (!def) return 'unknown /** DefinedTypeNode not found for definedTypeLinkNode */'; return codamaTypeToTS(def.type, definedTypes); } diff --git a/packages/dynamic-address-resolution/src/codegen/collect-pda-nodes.ts b/packages/dynamic-address-resolution/src/codegen/collect-pda-nodes.ts index 24df5a940..47e845545 100644 --- a/packages/dynamic-address-resolution/src/codegen/collect-pda-nodes.ts +++ b/packages/dynamic-address-resolution/src/codegen/collect-pda-nodes.ts @@ -7,7 +7,7 @@ export function collectPdaNodesFromIdl(idl: RootNode): Map { const pdas = new Map(); for (const pda of idl.program.pdas ?? []) { - pdas.set(pda.name, pda); + pdas.set(pda.identifier, pda); } for (const ix of idl.program.instructions ?? []) { @@ -15,8 +15,8 @@ export function collectPdaNodesFromIdl(idl: RootNode): Map { if (!acc.defaultValue || acc.defaultValue.kind !== 'pdaValueNode') continue; const pdaDef = acc.defaultValue.pda; if (!pdaDef || pdaDef.kind !== 'pdaNode') continue; - if (!pdas.has(pdaDef.name)) { - pdas.set(pdaDef.name, pdaDef); + if (!pdas.has(pdaDef.identifier)) { + pdas.set(pdaDef.identifier, pdaDef); } } } diff --git a/packages/dynamic-address-resolution/src/codegen/generate-pda-types.ts b/packages/dynamic-address-resolution/src/codegen/generate-pda-types.ts index 01e598d24..6f3f66d50 100644 --- a/packages/dynamic-address-resolution/src/codegen/generate-pda-types.ts +++ b/packages/dynamic-address-resolution/src/codegen/generate-pda-types.ts @@ -9,7 +9,7 @@ import { collectPdaNodesFromIdl } from './collect-pda-nodes'; * Returns the type block with the aggregate map type name. `mapTypeName` is `null` when the program has no PDAs. */ export function generatePdaTypes(idl: RootNode): { mapTypeName: string | null; typeBlock: string } { - const programName = pascalCase(idl.program.name); + const programName = pascalCase(idl.program.identifier); const definedTypes = idl.program.definedTypes ?? []; const pdaMap = collectPdaNodesFromIdl(idl); @@ -28,7 +28,7 @@ export function generatePdaTypes(idl: RootNode): { mapTypeName: string | null; t const tsType = seed.type ? codamaTypeToTS(seed.type, definedTypes) : 'unknown/** missing type in variablePdaSeedNode */'; - output += ` ${seed.name}: ${tsType};\n`; + output += ` ${seed.identifier}: ${tsType};\n`; } output += '};\n\n'; } diff --git a/packages/dynamic-address-resolution/src/codegen/generate-resolution-input-types.ts b/packages/dynamic-address-resolution/src/codegen/generate-resolution-input-types.ts index 4579df2c8..2ae6bebeb 100644 --- a/packages/dynamic-address-resolution/src/codegen/generate-resolution-input-types.ts +++ b/packages/dynamic-address-resolution/src/codegen/generate-resolution-input-types.ts @@ -50,7 +50,7 @@ function generateTypeBlockForInstruction(ix: InstructionNode, definedTypes: Defi const tsType = codamaTypeToTS(arg.type, definedTypes); const isOptional = OPTIONAL_NODE_KINDS.includes(arg.type.kind); const sep = isOptional ? '?:' : ':'; - output += ` ${arg.name}${sep} ${tsType};\n`; + output += ` ${arg.identifier}${sep} ${tsType};\n`; } for (const ra of remainingAccountArgs) { const sep = ra.isOptional ? '?:' : ':'; @@ -64,7 +64,7 @@ function generateTypeBlockForInstruction(ix: InstructionNode, definedTypes: Defi for (const acc of ix.accounts ?? []) { const omittable = isAccountAutoResolvable(acc) ? '?' : ''; const type = acc.isOptional ? 'Address | null' : 'Address'; - output += ` ${acc.name}${omittable}: ${type};\n`; + output += ` ${acc.identifier}${omittable}: ${type};\n`; } output += '};\n\n'; output += `export type ${refs.accountsWithDataRef} = ${refs.accountsRef} & Record;\n\n`; diff --git a/packages/dynamic-address-resolution/src/codegen/generate-types-from-file.ts b/packages/dynamic-address-resolution/src/codegen/generate-types-from-file.ts index f897535cf..b6bdf20f2 100644 --- a/packages/dynamic-address-resolution/src/codegen/generate-types-from-file.ts +++ b/packages/dynamic-address-resolution/src/codegen/generate-types-from-file.ts @@ -50,7 +50,7 @@ export function generateTypesFromFile(opts: GenerateTypesFromFileOptions): void let types: string; try { - console.log(`Generating types for program: ${idl.program.name}`); + console.log(`Generating types for program: ${idl.program.identifier}`); types = generate(idl); } catch (err) { throw new Error(`Cannot generate types for IDL: ${idlPath}`, { diff --git a/packages/dynamic-address-resolution/src/codegen/get-resolution-refs.ts b/packages/dynamic-address-resolution/src/codegen/get-resolution-refs.ts index 3d2c21117..25aac1b0e 100644 --- a/packages/dynamic-address-resolution/src/codegen/get-resolution-refs.ts +++ b/packages/dynamic-address-resolution/src/codegen/get-resolution-refs.ts @@ -36,7 +36,7 @@ export type ResolutionRefs = { }; export function getResolutionRefs(ix: InstructionNode): ResolutionRefs { - const typeName = pascalCase(ix.name); + const typeName = pascalCase(ix.identifier); const args = (ix.arguments ?? []).filter(arg => arg.defaultValueStrategy !== 'omitted'); const remainingAccountArgs = (ix.remainingAccounts ?? []).filter(ra => ra.value.kind === 'argumentValueNode'); diff --git a/packages/dynamic-address-resolution/src/resolvers/resolve-account-address.ts b/packages/dynamic-address-resolution/src/resolvers/resolve-account-address.ts index 72629065a..779a5daa0 100644 --- a/packages/dynamic-address-resolution/src/resolvers/resolve-account-address.ts +++ b/packages/dynamic-address-resolution/src/resolvers/resolve-account-address.ts @@ -42,7 +42,7 @@ export async function resolveAccountAddress< resolutionPath, resolversInput, }: ResolveAccountAddressContext): Promise
{ - const accountAddressInput = accountsInput?.[ixAccountNode.name]; + const accountAddressInput = accountsInput?.[ixAccountNode.identifier]; // Optional accounts explicitly provided as null should be resolved based on optionalAccountStrategy if (accountAddressInput === null && ixAccountNode.isOptional) { return resolveOptionalAccountWithStrategy(root, ixNode, ixAccountNode); @@ -77,8 +77,8 @@ export async function resolveAccountAddress< } throw new CodamaError(CODAMA_ERROR__DYNAMIC_CLIENT__ACCOUNT_MISSING, { - accountName: ixAccountNode.name, - instructionName: ixNode.name, + accountName: ixAccountNode.identifier, + instructionName: ixNode.identifier, }); } @@ -94,7 +94,7 @@ function resolveOptionalAccountWithStrategy( ) { if (!ixAccountNode.isOptional) { throw new CodamaError(CODAMA_ERROR__DYNAMIC_CLIENT__INVARIANT_VIOLATION, { - message: `resolveOptionalAccountWithStrategy called for non-optional account: ${ixAccountNode.name}`, + message: `resolveOptionalAccountWithStrategy called for non-optional account: ${ixAccountNode.identifier}`, }); } switch (ixNode.optionalAccountStrategy) { @@ -104,8 +104,8 @@ function resolveOptionalAccountWithStrategy( return toAddress(root.program.publicKey); default: throw new CodamaError(CODAMA_ERROR__DYNAMIC_CLIENT__UNSUPPORTED_OPTIONAL_ACCOUNT_STRATEGY, { - accountName: ixAccountNode.name, - instructionName: ixNode.name, + accountName: ixAccountNode.identifier, + instructionName: ixNode.identifier, strategy: safeStringify(ixNode.optionalAccountStrategy), }); } diff --git a/packages/dynamic-address-resolution/src/resolvers/resolve-account-value-node-address.ts b/packages/dynamic-address-resolution/src/resolvers/resolve-account-value-node-address.ts index 0b5d10b5a..9edf2ebfb 100644 --- a/packages/dynamic-address-resolution/src/resolvers/resolve-account-value-node-address.ts +++ b/packages/dynamic-address-resolution/src/resolvers/resolve-account-value-node-address.ts @@ -27,29 +27,29 @@ export async function resolveAccountValueNodeAddress< const { accountsInput, ixNode, resolutionPath } = ctx; // Check if user provided the account address. - const providedAddress = accountsInput?.[node.name]; + const providedAddress = accountsInput?.[node.identifier]; if (providedAddress !== undefined && providedAddress !== null) { return toAddress(providedAddress); } // Find the referenced account in the instruction. - const referencedIxAccountNode = (ixNode.accounts ?? []).find(acc => acc.name === node.name); + const referencedIxAccountNode = (ixNode.accounts ?? []).find(acc => acc.identifier === node.identifier); if (!referencedIxAccountNode) { throw new CodamaError(CODAMA_ERROR__DYNAMIC_CLIENT__NODE_REFERENCE_NOT_FOUND, { - instructionName: ixNode.name, - referencedName: node.name, + instructionName: ixNode.identifier, + referencedName: node.identifier, }); } // Detect circular dependencies before recursing. - detectCircularDependency(node.name, resolutionPath); + detectCircularDependency(node.identifier, resolutionPath); return await resolveAccountAddress({ accountsInput: ctx.accountsInput, argumentsInput: ctx.argumentsInput, ixAccountNode: referencedIxAccountNode, ixNode, - resolutionPath: [...resolutionPath, node.name], + resolutionPath: [...resolutionPath, node.identifier], resolversInput: ctx.resolversInput, root: ctx.root, }); diff --git a/packages/dynamic-address-resolution/src/resolvers/resolve-conditional.ts b/packages/dynamic-address-resolution/src/resolvers/resolve-conditional.ts index 89d7888a4..5769c5329 100644 --- a/packages/dynamic-address-resolution/src/resolvers/resolve-conditional.ts +++ b/packages/dynamic-address-resolution/src/resolvers/resolve-conditional.ts @@ -50,7 +50,7 @@ export async function resolveConditionalValueNodeCondition< if (!expectedValueNode && !ifTrue && !ifFalse) { throw new CodamaError(CODAMA_ERROR__DYNAMIC_CLIENT__INVARIANT_VIOLATION, { - message: `Invalid conditionalValueNode: missing value and branches for account ${ixAccountNode.name} in ${ixNode.name}`, + message: `Invalid conditionalValueNode: missing value and branches for account ${ixAccountNode.identifier} in ${ixNode.identifier}`, }); } diff --git a/packages/dynamic-address-resolution/src/resolvers/resolve-instruction-account-address.ts b/packages/dynamic-address-resolution/src/resolvers/resolve-instruction-account-address.ts index 7a270528e..99b9bae85 100644 --- a/packages/dynamic-address-resolution/src/resolvers/resolve-instruction-account-address.ts +++ b/packages/dynamic-address-resolution/src/resolvers/resolve-instruction-account-address.ts @@ -31,7 +31,7 @@ export async function resolveInstructionAccountAddress< resolversInput, root, }: ResolveInstructionAccountAddressInput): Promise
{ - const accountAddressInput = accountsInput?.[ixAccountNode.name]; + const accountAddressInput = accountsInput?.[ixAccountNode.identifier]; const isAccountProvided = accountAddressInput !== undefined && accountAddressInput !== null; // Accounts values (with default or with optionalAccountStrategy) can be omitted, as they are auto-resolved. @@ -48,8 +48,8 @@ export async function resolveInstructionAccountAddress< if (!isAccountProvided && !canAutoResolve) { throw new CodamaError(CODAMA_ERROR__DYNAMIC_CLIENT__ACCOUNT_MISSING, { - accountName: ixAccountNode.name, - instructionName: ixNode.name, + accountName: ixAccountNode.identifier, + instructionName: ixNode.identifier, }); } diff --git a/packages/dynamic-address-resolution/src/resolvers/resolve-pda-address.ts b/packages/dynamic-address-resolution/src/resolvers/resolve-pda-address.ts index 30613a135..91777aaa0 100644 --- a/packages/dynamic-address-resolution/src/resolvers/resolve-pda-address.ts +++ b/packages/dynamic-address-resolution/src/resolvers/resolve-pda-address.ts @@ -70,12 +70,12 @@ export async function resolvePDAAddress< if (seedNode.kind === 'variablePdaSeedNode') { const variableSeedValueNodes = pdaValueNode.seeds ?? []; - const seedName = seedNode.name; - const variableSeedValueNode = variableSeedValueNodes.find(node => node.name === seedName); + const seedName = seedNode.identifier; + const variableSeedValueNode = variableSeedValueNodes.find(node => node.identifier === seedName); if (!variableSeedValueNode) { throw new CodamaError(CODAMA_ERROR__DYNAMIC_CLIENT__NODE_REFERENCE_NOT_FOUND, { - instructionName: ixNode.name, + instructionName: ixNode.identifier, referencedName: seedName, }); } @@ -107,12 +107,12 @@ export async function resolvePDAAddress< function resolvePdaNode(pdaDefaultValue: PdaValueNode, pdas: PdaNode[]): PdaNode { if (isNode(pdaDefaultValue.pda, 'pdaLinkNode')) { - const linkedPda = pdas.find(p => p.name === pdaDefaultValue.pda.name); + const linkedPda = pdas.find(p => p.identifier === pdaDefaultValue.pda.identifier); if (!linkedPda) { throw new CodamaError(CODAMA_ERROR__LINKED_NODE_NOT_FOUND, { kind: 'pdaLinkNode', linkNode: pdaDefaultValue.pda, - name: pdaDefaultValue.pda.name, + name: pdaDefaultValue.pda.identifier, path: [], }); } @@ -162,10 +162,10 @@ function resolveVariablePdaSeed< }); } - if (seedNode.name !== variableSeedValueNode.name) { + if (seedNode.identifier !== variableSeedValueNode.identifier) { // Sanity check: this should not happen. throw new CodamaError(CODAMA_ERROR__DYNAMIC_CLIENT__INVARIANT_VIOLATION, { - message: `Mismatched PDA seed names: expected [${seedNode.name}], got [${variableSeedValueNode.name}]`, + message: `Mismatched PDA seed names: expected [${seedNode.identifier}], got [${variableSeedValueNode.identifier}]`, }); } diff --git a/packages/dynamic-address-resolution/src/resolvers/resolve-standalone-pda.ts b/packages/dynamic-address-resolution/src/resolvers/resolve-standalone-pda.ts index 157af7848..fc7c9601c 100644 --- a/packages/dynamic-address-resolution/src/resolvers/resolve-standalone-pda.ts +++ b/packages/dynamic-address-resolution/src/resolvers/resolve-standalone-pda.ts @@ -64,7 +64,7 @@ function resolveStandaloneVariableSeed( seedNode: VariablePdaSeedNode, seedInputs: Record, ): Promise { - const input = seedInputs[seedNode.name]; + const input = seedInputs[seedNode.identifier]; const typeNode = seedNode.type; // remainderOptionTypeNode seeds are optional — null means zero bytes. @@ -73,7 +73,7 @@ function resolveStandaloneVariableSeed( return Promise.resolve(new Uint8Array(0)); } throw new CodamaError(CODAMA_ERROR__DYNAMIC_CLIENT__ARGUMENT_MISSING, { - argumentName: seedNode.name, + argumentName: seedNode.identifier, instructionName: camelCase('standaloneSeedNode'), }); } @@ -103,7 +103,7 @@ function createSyntheticArgNode(seedNode: VariablePdaSeedNode) { return { docs: [] as string[], kind: 'instructionArgumentNode' as const, - name: seedNode.name, + identifier: seedNode.identifier, type: seedNode.type, }; } diff --git a/packages/dynamic-address-resolution/src/visitors/account-default-value.ts b/packages/dynamic-address-resolution/src/visitors/account-default-value.ts index b4279c023..8b6f98527 100644 --- a/packages/dynamic-address-resolution/src/visitors/account-default-value.ts +++ b/packages/dynamic-address-resolution/src/visitors/account-default-value.ts @@ -70,7 +70,7 @@ export function createAccountDefaultValueVisitor< ctx: AccountDefaultValueVisitorContext, ): Visitor, AccountDefaultValueSupportedNodeKind> { const { root, ixNode, ixAccountNode, argumentsInput, accountsInput, resolversInput, resolutionPath } = ctx; - const accountAddressInput = accountsInput?.[ixAccountNode.name]; + const accountAddressInput = accountsInput?.[ixAccountNode.identifier]; return { visitAccountBumpValue: async (_node: AccountBumpValueNode) => { @@ -97,13 +97,13 @@ export function createAccountDefaultValueVisitor< if (argValue === undefined || argValue === null) { throw new CodamaError(CODAMA_ERROR__DYNAMIC_CLIENT__ARGUMENT_MISSING, { argumentName: node.name, - instructionName: ixNode.name, + instructionName: ixNode.identifier, }); } if (!isAddressConvertible(argValue)) { throw new CodamaError(CODAMA_ERROR__DYNAMIC_CLIENT__UNEXPECTED_ADDRESS_TYPE, { - accountName: ixAccountNode.name, + accountName: ixAccountNode.identifier, actualType: formatValueType(argValue), expectedType: 'Address | PublicKey', }); @@ -132,8 +132,8 @@ export function createAccountDefaultValueVisitor< return null; } throw new CodamaError(CODAMA_ERROR__DYNAMIC_CLIENT__ACCOUNT_MISSING, { - accountName: ixAccountNode.name, - instructionName: ixNode.name, + accountName: ixAccountNode.identifier, + instructionName: ixNode.identifier, }); } // Recursively resolve the chosen branch. @@ -151,8 +151,8 @@ export function createAccountDefaultValueVisitor< visitIdentityValue: async (_node: IdentityValueNode) => { if (accountAddressInput === undefined || accountAddressInput === null) { throw new CodamaError(CODAMA_ERROR__DYNAMIC_CLIENT__ACCOUNT_MISSING, { - accountName: ixAccountNode.name, - instructionName: ixNode.name, + accountName: ixAccountNode.identifier, + instructionName: ixNode.identifier, }); } return await Promise.resolve(toAddress(accountAddressInput)); @@ -161,8 +161,8 @@ export function createAccountDefaultValueVisitor< visitPayerValue: async (_node: PayerValueNode) => { if (accountAddressInput === undefined || accountAddressInput === null) { throw new CodamaError(CODAMA_ERROR__DYNAMIC_CLIENT__ACCOUNT_MISSING, { - accountName: ixAccountNode.name, - instructionName: ixNode.name, + accountName: ixAccountNode.identifier, + instructionName: ixNode.identifier, }); } return await Promise.resolve(toAddress(accountAddressInput)); @@ -180,7 +180,7 @@ export function createAccountDefaultValueVisitor< }); if (pda === null) { throw new CodamaError(CODAMA_ERROR__DYNAMIC_CLIENT__FAILED_TO_DERIVE_PDA, { - accountName: ixAccountNode.name, + accountName: ixAccountNode.identifier, }); } return pda[0]; @@ -198,7 +198,7 @@ export function createAccountDefaultValueVisitor< const resolverFn = resolversInput?.[node.name]; if (!resolverFn) { throw new CodamaError(CODAMA_ERROR__DYNAMIC_CLIENT__ACCOUNT_RESOLVER_MISSING, { - accountName: ixAccountNode.name, + accountName: ixAccountNode.identifier, resolverName: node.name, }); } @@ -210,13 +210,13 @@ export function createAccountDefaultValueVisitor< cause: error, resolverName: node.name, targetKind: 'instructionAccountNode', - targetName: ixAccountNode.name, + targetName: ixAccountNode.identifier, }); } if (!isAddressConvertible(result)) { throw new CodamaError(CODAMA_ERROR__DYNAMIC_CLIENT__INVALID_ACCOUNT_ADDRESS, { - accountName: ixAccountNode.name, + accountName: ixAccountNode.identifier, value: safeStringify(result), }); } diff --git a/packages/dynamic-address-resolution/src/visitors/codec-input-transformer.ts b/packages/dynamic-address-resolution/src/visitors/codec-input-transformer.ts index b66503630..109dc2050 100644 --- a/packages/dynamic-address-resolution/src/visitors/codec-input-transformer.ts +++ b/packages/dynamic-address-resolution/src/visitors/codec-input-transformer.ts @@ -113,12 +113,12 @@ export function createCodecInputTransformerVisitor( }, visitDefinedTypeLink(node) { - const definedType = (root.program.definedTypes ?? []).find(dt => dt.name === node.name); + const definedType = (root.program.definedTypes ?? []).find(dt => dt.identifier === node.identifier); if (!definedType) { throw new CodamaError(CODAMA_ERROR__LINKED_NODE_NOT_FOUND, { kind: 'definedTypeLinkNode', linkNode: node, - name: node.name, + name: node.identifier, path: [], }); } @@ -135,9 +135,9 @@ export function createCodecInputTransformerVisitor( const variantNode = typeof input === 'number' ? (node.variants ?? [])[input] - : (node.variants ?? []).find(v => pascalCase(v.name) === pascalCase(input)); + : (node.variants ?? []).find(v => pascalCase(v.identifier) === pascalCase(input)); if (variantNode && isNode(variantNode, 'enumEmptyVariantTypeNode')) { - return { __kind: pascalCase(variantNode.name) }; + return { __kind: pascalCase(variantNode.identifier) }; } return input; } @@ -153,10 +153,12 @@ export function createCodecInputTransformerVisitor( // eslint-disable-next-line @typescript-eslint/no-unused-vars const { __discriminator: _d, __kind, ...rest } = input as Record & { __kind: unknown }; const kindObj = { __kind: pascalCase(String(__kind)) }; - const variantNode = (node.variants ?? []).find(v => pascalCase(v.name) === pascalCase(String(__kind))); + const variantNode = (node.variants ?? []).find( + v => pascalCase(v.identifier) === pascalCase(String(__kind)), + ); if (!variantNode) { - const availableVariants = (node.variants ?? []).map(v => v.name).join(', '); + const availableVariants = (node.variants ?? []).map(v => v.identifier).join(', '); throw new CodamaError(CODAMA_ERROR__DYNAMIC_CLIENT__UNEXPECTED_ARGUMENT_TYPE, { actualType: `variant '${String(__kind)}'`, expectedType: `one of [${availableVariants}]`, @@ -299,7 +301,7 @@ export function createCodecInputTransformerVisitor( visitStructType(node) { const fieldTransformers = (node.fields ?? []).map(field => { const transform = visitOrElse(field, visitor, unexpectedNodeFallback); - return { name: field.name, transform }; + return { name: field.identifier, transform }; }); return (input: unknown) => { if (!isObjectRecord(input)) { diff --git a/packages/dynamic-address-resolution/src/visitors/condition-node-value.ts b/packages/dynamic-address-resolution/src/visitors/condition-node-value.ts index 1c419da0b..7c5979130 100644 --- a/packages/dynamic-address-resolution/src/visitors/condition-node-value.ts +++ b/packages/dynamic-address-resolution/src/visitors/condition-node-value.ts @@ -29,7 +29,7 @@ export function createConditionNodeValueVisitor< visitAccountValue: async (node: AccountValueNode) => { // If the user explicitly provides null for a conditional account, // return it for the conditionalValueNode ifFalse branch. - const accountAddressInput = accountsInput?.[node.name]; + const accountAddressInput = accountsInput?.[node.identifier]; if (accountAddressInput === null) { return null; } diff --git a/packages/dynamic-address-resolution/src/visitors/pda-seed-value.ts b/packages/dynamic-address-resolution/src/visitors/pda-seed-value.ts index 4f82523af..9d8210fb3 100644 --- a/packages/dynamic-address-resolution/src/visitors/pda-seed-value.ts +++ b/packages/dynamic-address-resolution/src/visitors/pda-seed-value.ts @@ -94,7 +94,7 @@ export function createPdaSeedValueVisitor( if (resolvedAddress === null) { throw new CodamaError(CODAMA_ERROR__DYNAMIC_CLIENT__FAILED_TO_DERIVE_PDA, { - accountName: node.name, + accountName: node.identifier, }); } @@ -102,10 +102,10 @@ export function createPdaSeedValueVisitor( }, visitArgumentValue: async (node: ArgumentValueNode) => { - const ixArgumentNode = (ixNode.arguments ?? []).find(arg => arg.name === node.name); + const ixArgumentNode = (ixNode.arguments ?? []).find(arg => arg.identifier === node.name); if (!ixArgumentNode) { throw new CodamaError(CODAMA_ERROR__DYNAMIC_CLIENT__NODE_REFERENCE_NOT_FOUND, { - instructionName: ixNode.name, + instructionName: ixNode.identifier, referencedName: node.name, }); } @@ -123,7 +123,7 @@ export function createPdaSeedValueVisitor( } throw new CodamaError(CODAMA_ERROR__DYNAMIC_CLIENT__ARGUMENT_MISSING, { argumentName: node.name, - instructionName: ixNode.name, + instructionName: ixNode.identifier, }); } const codec = getNodeCodec([root, root.program, ixNode, { ...ixArgumentNode, type: typeNode }]); diff --git a/packages/dynamic-address-resolution/src/visitors/value-node-value.ts b/packages/dynamic-address-resolution/src/visitors/value-node-value.ts index 74b955b12..7f5b56860 100644 --- a/packages/dynamic-address-resolution/src/visitors/value-node-value.ts +++ b/packages/dynamic-address-resolution/src/visitors/value-node-value.ts @@ -155,7 +155,7 @@ export function createValueNodeVisitor(): Visitor [ - field.name, + field.identifier, visitOrElse(field.value, visitor, n => { throw new CodamaError(CODAMA_ERROR__UNEXPECTED_NODE_KIND, { expectedKinds: [...VALUE_NODE_SUPPORTED_NODE_KINDS], diff --git a/packages/dynamic-client/src/cli/commands/generate-client-types/generate-client-types.ts b/packages/dynamic-client/src/cli/commands/generate-client-types/generate-client-types.ts index 94fa8fce6..e3d74f11b 100644 --- a/packages/dynamic-client/src/cli/commands/generate-client-types/generate-client-types.ts +++ b/packages/dynamic-client/src/cli/commands/generate-client-types/generate-client-types.ts @@ -10,7 +10,7 @@ import { pascalCase, type RootNode } from 'codama'; * Generate TypeScript type for program client. */ export function generateClientTypes(idl: RootNode): string { - const programName = pascalCase(idl.program.name); + const programName = pascalCase(idl.program.identifier); const { mapTypeName: pdasMapTypeName, typeBlock: pdaTypeBlock } = generatePdaTypes(idl); const hasPdas = pdasMapTypeName !== null; @@ -45,7 +45,7 @@ export type MethodBuilder { const pdas = new Map(); for (const pda of root.program.pdas ?? []) { - pdas.set(pda.name, pda); + pdas.set(pda.identifier, pda); } for (const ix of root.program.instructions ?? []) { @@ -19,8 +19,8 @@ export function collectPdaNodes(root: RootNode): Map { if (!acc.defaultValue || !isNode(acc.defaultValue, 'pdaValueNode')) continue; if (!isNode(acc.defaultValue.pda, 'pdaNode')) continue; const pdaNode = acc.defaultValue.pda; - if (!pdas.has(pdaNode.name)) { - pdas.set(pdaNode.name, pdaNode); + if (!pdas.has(pdaNode.identifier)) { + pdas.set(pdaNode.identifier, pdaNode); } } } diff --git a/packages/dynamic-client/src/program-client/create-program-client.ts b/packages/dynamic-client/src/program-client/create-program-client.ts index 7b95d679d..f371e75f9 100644 --- a/packages/dynamic-client/src/program-client/create-program-client.ts +++ b/packages/dynamic-client/src/program-client/create-program-client.ts @@ -64,7 +64,7 @@ export function createProgramClient( if (options.programId) { codama.update( updateProgramsVisitor({ - [codama.getRoot().program.name]: { + [codama.getRoot().program.identifier]: { publicKey: toAddress(options.programId), }, }), @@ -76,7 +76,7 @@ export function createProgramClient( const instructions = new Map(); for (const ix of root.program.instructions ?? []) { - instructions.set(ix.name, ix); + instructions.set(ix.identifier, ix); } const methods = new Proxy( diff --git a/packages/dynamic-codecs/src/codecs.ts b/packages/dynamic-codecs/src/codecs.ts index 42bd2326a..d6195acc5 100644 --- a/packages/dynamic-codecs/src/codecs.ts +++ b/packages/dynamic-codecs/src/codecs.ts @@ -178,7 +178,7 @@ export function getNodeCodecVisitor( return visit(node.struct, this); }, visitEnumTupleVariantType(node) { - const tupleAsStruct = structTypeNode([structFieldTypeNode({ name: 'fields', type: node.tuple })]); + const tupleAsStruct = structTypeNode([structFieldTypeNode({ identifier: 'fields', type: node.tuple })]); return visit(tupleAsStruct, this); }, visitEnumType(node) { @@ -190,7 +190,7 @@ export function getNodeCodecVisitor( const variants = node.variants ?? []; const discriminators = variants.map((variant, index) => variant.discriminator ?? index); const variantCodecs = variants.map((variant, index) => { - const kind = pascalCase(variant.name); + const kind = pascalCase(variant.identifier); const discriminator = discriminators[index]; const payload = getHiddenPrefixCodec(visit(variant, this) as Codec, [ getConstantCodec(size.encode(discriminator)), @@ -214,7 +214,7 @@ export function getNodeCodecVisitor( variantCodecs, value => { const kind = (value as { __kind?: unknown } | null)?.__kind; - return variants.findIndex(variant => pascalCase(variant.name) === kind); + return variants.findIndex(variant => pascalCase(variant.identifier) === kind); }, (bytes, offset) => { const [discriminator] = size.read(bytes, offset); @@ -355,7 +355,7 @@ export function getNodeCodecVisitor( return visit(node.type, this); }, visitStructType(node) { - const fields = (node.fields ?? []).map(field => [field.name, visit(field, this)] as const); + const fields = (node.fields ?? []).map(field => [field.identifier, visit(field, this)] as const); return getStructCodec(fields) as Codec; }, visitTupleType(node) { diff --git a/packages/dynamic-codecs/src/values.ts b/packages/dynamic-codecs/src/values.ts index beadc7149..c919968fa 100644 --- a/packages/dynamic-codecs/src/values.ts +++ b/packages/dynamic-codecs/src/values.ts @@ -43,11 +43,11 @@ export function getValueNodeVisitor( const enumType = linkables.getOrThrow([...stack.getPath(node.kind), node.enum]).type; assertIsNode(enumType, 'enumTypeNode'); const variants = enumType.variants ?? []; - const variantIndex = variants.findIndex(variant => variant.name === node.variant); + const variantIndex = variants.findIndex(variant => variant.identifier === node.variant); if (variantIndex < 0) { throw new CodamaError(CODAMA_ERROR__ENUM_VARIANT_NOT_FOUND, { enum: enumType, - enumName: node.enum.name, + enumName: node.enum.identifier, variant: node.variant, }); } @@ -105,7 +105,7 @@ export function getValueNodeVisitor( visitStructValue(node) { return Object.fromEntries( (node.fields ?? []).map(field => { - const name = field.name; + const name = field.identifier; const value = visit(field.value, this); return [name, value]; }), diff --git a/packages/dynamic-instructions/src/accounts/create-account-meta.ts b/packages/dynamic-instructions/src/accounts/create-account-meta.ts index 60bf5abc8..089c7e386 100644 --- a/packages/dynamic-instructions/src/accounts/create-account-meta.ts +++ b/packages/dynamic-instructions/src/accounts/create-account-meta.ts @@ -61,7 +61,7 @@ export async function createAccountMeta< // which cannot be writable on-chain — downgrade to readonly. // E.g. PMP's setData instruction `buffer` account. (isWritable, isOptional and "programId" strategy). // But when buffer is null it resolves to the program address which cannot be writable, hence must be downgraded to readonly. - const accountAddressInput = accountsInput?.[ixAccountNode.name]; + const accountAddressInput = accountsInput?.[ixAccountNode.identifier]; const isAccountProvided = accountAddressInput !== undefined && accountAddressInput !== null; const role = ixAccountNode.isOptional && @@ -104,7 +104,7 @@ export async function createAccountMeta< if (!remainingNode.isOptional) { throw new CodamaError(CODAMA_ERROR__DYNAMIC_CLIENT__ARGUMENT_MISSING, { argumentName: remainingNode.value.name, - instructionName: ixNode.name, + instructionName: ixNode.identifier, }); } // Optional remaining accounts can be safely omitted. @@ -167,7 +167,7 @@ function getReadonlyAccountRole(acc: InstructionAccountNode, signers: string[] | function isSignerAccount(acc: InstructionAccountNode, signers: string[]) { if (acc.isSigner === 'either') { - return signers.includes(acc.name); + return signers.includes(acc.identifier); } return acc.isSigner === true; } diff --git a/packages/dynamic-instructions/src/accounts/validate-accounts-input.ts b/packages/dynamic-instructions/src/accounts/validate-accounts-input.ts index ffd465245..e4dc2cdce 100644 --- a/packages/dynamic-instructions/src/accounts/validate-accounts-input.ts +++ b/packages/dynamic-instructions/src/accounts/validate-accounts-input.ts @@ -32,7 +32,7 @@ export function createAccountsInputValidator(ixNode: InstructionNode) { if (value == null) { throw new CodamaError(CODAMA_ERROR__DYNAMIC_CLIENT__ACCOUNT_MISSING, { accountName: camelCase(key), - instructionName: ixNode.name, + instructionName: ixNode.identifier, }); } else { throw new CodamaError(CODAMA_ERROR__DYNAMIC_CLIENT__INVALID_ACCOUNT_ADDRESS, { diff --git a/packages/dynamic-instructions/src/arguments/encode-instruction-arguments.ts b/packages/dynamic-instructions/src/arguments/encode-instruction-arguments.ts index 5d0f613e8..f33d5b724 100644 --- a/packages/dynamic-instructions/src/arguments/encode-instruction-arguments.ts +++ b/packages/dynamic-instructions/src/arguments/encode-instruction-arguments.ts @@ -32,7 +32,7 @@ export function encodeInstructionArguments { - const input = argumentsInput?.[ixArgumentNode.name]; + const input = argumentsInput?.[ixArgumentNode.identifier]; const nodeCodec = getNodeCodec([root, root.program, ix, ixArgumentNode]); if (isOmittedArgument(ixArgumentNode)) { return encodeOmittedArgument(ix, ixArgumentNode, nodeCodec); @@ -54,8 +54,8 @@ function encodeOmittedArgument( const defaultValue = ixArgumentNode.defaultValue; if (defaultValue === undefined) { throw new CodamaError(CODAMA_ERROR__DYNAMIC_CLIENT__DEFAULT_VALUE_MISSING, { - argumentName: ixArgumentNode.name, - instructionName: ix.name, + argumentName: ixArgumentNode.identifier, + instructionName: ix.identifier, }); } @@ -78,9 +78,9 @@ function encodeOptionalArgument( return nodeCodec.encode(null); } catch (error) { throw new CodamaError(CODAMA_ERROR__DYNAMIC_CLIENT__FAILED_TO_ENCODE_ARGUMENT, { - argumentName: ixArgumentNode.name, + argumentName: ixArgumentNode.identifier, cause: error, - instructionName: ix.name, + instructionName: ix.identifier, }); } } @@ -94,8 +94,8 @@ function encodeRequiredArgument( ): ReadonlyUint8Array { if (input === undefined) { throw new CodamaError(CODAMA_ERROR__DYNAMIC_CLIENT__ARGUMENT_MISSING, { - argumentName: ixArgumentNode.name, - instructionName: ix.name, + argumentName: ixArgumentNode.identifier, + instructionName: ix.identifier, }); } @@ -107,9 +107,9 @@ function encodeRequiredArgument( return nodeCodec.encode(transformedInput); } catch (error) { throw new CodamaError(CODAMA_ERROR__DYNAMIC_CLIENT__FAILED_TO_ENCODE_ARGUMENT, { - argumentName: ixArgumentNode.name, + argumentName: ixArgumentNode.identifier, cause: error, - instructionName: ix.name, + instructionName: ix.identifier, }); } } diff --git a/packages/dynamic-instructions/src/arguments/resolve-argument-from-custom-resolvers.ts b/packages/dynamic-instructions/src/arguments/resolve-argument-from-custom-resolvers.ts index f01732dde..d38ceec14 100644 --- a/packages/dynamic-instructions/src/arguments/resolve-argument-from-custom-resolvers.ts +++ b/packages/dynamic-instructions/src/arguments/resolve-argument-from-custom-resolvers.ts @@ -30,7 +30,7 @@ export async function resolveArgumentDefaultsFromCustomResolvers< const allArguments = [...(ixNode.arguments ?? []), ...(ixNode.extraArguments ?? [])]; for (const argumentNode of allArguments) { - if (resolvedArgumentsInput[argumentNode.name] !== undefined) continue; + if (resolvedArgumentsInput[argumentNode.identifier] !== undefined) continue; if (isOmittedArgument(argumentNode)) continue; if (!isNode(argumentNode.defaultValue, 'resolverValueNode')) continue; @@ -41,7 +41,7 @@ export async function resolveArgumentDefaultsFromCustomResolvers< if (!resolverFn) continue; try { - resolvedArgumentsInput[argumentNode.name] = await resolverFn( + resolvedArgumentsInput[argumentNode.identifier] = await resolverFn( resolvedArgumentsInput as TArgs, (accountsInput ?? {}) as TAccounts, ); @@ -50,7 +50,7 @@ export async function resolveArgumentDefaultsFromCustomResolvers< cause: error, resolverName: argumentNode.defaultValue.name, targetKind: 'instructionArgumentNode', - targetName: argumentNode.name, + targetName: argumentNode.identifier, }); } } diff --git a/packages/dynamic-instructions/src/arguments/validate-arguments-input.ts b/packages/dynamic-instructions/src/arguments/validate-arguments-input.ts index aa161701a..9d10003fa 100644 --- a/packages/dynamic-instructions/src/arguments/validate-arguments-input.ts +++ b/packages/dynamic-instructions/src/arguments/validate-arguments-input.ts @@ -18,7 +18,7 @@ import { isOmittedArgument } from './shared'; export function createArgumentsInputValidator(root: RootNode, ixNode: InstructionNode) { const requiredArguments = (ixNode.arguments ?? []).filter(arg => arg?.defaultValueStrategy !== 'omitted'); const validator = requiredArguments.length - ? createIxArgumentsValidator(ixNode.name, requiredArguments, root.program.definedTypes ?? []) + ? createIxArgumentsValidator(ixNode.identifier, requiredArguments, root.program.definedTypes ?? []) : null; return (argumentsInput: ArgumentsInput = {}) => { @@ -81,7 +81,7 @@ function formatFailureValue(value: unknown): string { */ function validateOmittedArguments(ixNode: InstructionNode, argumentsInput: ArgumentsInput = {}) { (ixNode.arguments ?? []).filter(isOmittedArgument).forEach(ixArgumentNode => { - if (Object.hasOwn(argumentsInput, ixArgumentNode.name)) { + if (Object.hasOwn(argumentsInput, ixArgumentNode.identifier)) { throw new CodamaError(CODAMA_ERROR__DYNAMIC_CLIENT__FAILED_TO_VALIDATE_INPUT, { message: 'Omitted argument must not be provided', }); diff --git a/packages/dynamic-instructions/src/codegen/collect-either-signer-names.ts b/packages/dynamic-instructions/src/codegen/collect-either-signer-names.ts index 3b76d0a6c..742f1f279 100644 --- a/packages/dynamic-instructions/src/codegen/collect-either-signer-names.ts +++ b/packages/dynamic-instructions/src/codegen/collect-either-signer-names.ts @@ -4,5 +4,5 @@ import type { InstructionNode } from 'codama'; * Collect the names of accounts on an instruction with `isSigner: 'either'`. */ export function collectEitherSignerNames(ix: InstructionNode): string[] { - return (ix.accounts ?? []).filter(acc => acc.isSigner === 'either').map(acc => acc.name); + return (ix.accounts ?? []).filter(acc => acc.isSigner === 'either').map(acc => acc.identifier); } diff --git a/packages/dynamic-instructions/src/codegen/generate-instruction-builder.ts b/packages/dynamic-instructions/src/codegen/generate-instruction-builder.ts index 7577466ce..b57879449 100644 --- a/packages/dynamic-instructions/src/codegen/generate-instruction-builder.ts +++ b/packages/dynamic-instructions/src/codegen/generate-instruction-builder.ts @@ -11,7 +11,7 @@ import { getInstructionSignerRef } from './generate-signer-types'; * Use `generateTypes` instead. */ export function generateInstructionBuildersMap(idl: RootNode): string { - const programName = pascalCase(idl.program.name); + const programName = pascalCase(idl.program.identifier); let output = `/** * Strongly-typed instruction builders for ${programName}. */ @@ -23,7 +23,7 @@ export type ${programName}InstructionBuilders = {\n`; const argsGeneric = refs.argsRef ?? 'Record'; const signersGeneric = signerRef.signersRef ?? 'string[]'; const resolversGeneric = refs.resolversRef ? `, ${refs.resolversRef}` : ''; - output += ` ${ix.name}: InstructionsBuilderFn<${argsGeneric}, ${refs.accountsRef}, ${signersGeneric}${resolversGeneric}>;\n`; + output += ` ${ix.identifier}: InstructionsBuilderFn<${argsGeneric}, ${refs.accountsRef}, ${signersGeneric}${resolversGeneric}>;\n`; } output += '};\n'; diff --git a/packages/dynamic-instructions/src/codegen/generate-signer-types.ts b/packages/dynamic-instructions/src/codegen/generate-signer-types.ts index a526632ce..0843b4711 100644 --- a/packages/dynamic-instructions/src/codegen/generate-signer-types.ts +++ b/packages/dynamic-instructions/src/codegen/generate-signer-types.ts @@ -26,7 +26,7 @@ export function getInstructionSignerRef(ix: InstructionNode): InstructionSignerR const hasEitherSigners = collectEitherSignerNames(ix).length > 0; return { hasEitherSigners, - signersRef: hasEitherSigners ? `${pascalCase(ix.name)}Signers` : null, + signersRef: hasEitherSigners ? `${pascalCase(ix.identifier)}Signers` : null, }; } @@ -34,5 +34,5 @@ function generateSignersTypeBlock(ix: InstructionNode): string { const names = collectEitherSignerNames(ix); if (names.length === 0) return ''; const quoted = names.map(name => `'${name}'`); - return `export type ${pascalCase(ix.name)}Signers = (${quoted.join(' | ')})[];\n\n`; + return `export type ${pascalCase(ix.identifier)}Signers = (${quoted.join(' | ')})[];\n\n`; } diff --git a/packages/dynamic-instructions/src/display/build-display-context.ts b/packages/dynamic-instructions/src/display/build-display-context.ts index 3a345fea8..eeb912c97 100644 --- a/packages/dynamic-instructions/src/display/build-display-context.ts +++ b/packages/dynamic-instructions/src/display/build-display-context.ts @@ -51,7 +51,7 @@ export function buildBaseDisplayContext( const instruction = getLastNodeFromPath(parsedInstruction.path); const provides = new Map( - (instruction.provides ?? []).map(provided => [provided.name, provided]), + (instruction.provides ?? []).map(provided => [provided.identifier, provided]), ); const linkables = new LinkableDictionary(); @@ -84,7 +84,7 @@ function createAccountDataResolver( const instruction = getLastNodeFromPath(parsedInstruction.path); return (accountName, bytes) => { const target = camelCase(accountName); - const instructionAccount = (instruction.accounts ?? []).find(account => account.name === target); + const instructionAccount = (instruction.accounts ?? []).find(account => account.identifier === target); if (!instructionAccount?.accountLink) return null; const linkPath = [...parsedInstruction.path, instructionAccount.accountLink] as NodePath; diff --git a/packages/dynamic-instructions/src/display/format-argument-value.ts b/packages/dynamic-instructions/src/display/format-argument-value.ts index acfed6d30..d01cd653f 100644 --- a/packages/dynamic-instructions/src/display/format-argument-value.ts +++ b/packages/dynamic-instructions/src/display/format-argument-value.ts @@ -118,13 +118,13 @@ function formatEnumValue(enumType: EnumTypeNode, value: unknown): string { if (decodedName === null) return rawValue(value); // Codecs disagree on name casing, so compare through a common PascalCase form. - const variant = variants.find(candidate => pascalCase(candidate.name) === pascalCase(decodedName)); + const variant = variants.find(candidate => pascalCase(candidate.identifier) === pascalCase(decodedName)); return variant ? variantLabel(variant) : rawValue(value); } /** The label shown for a variant: its display label, or its title-cased name. */ function variantLabel(variant: NonNullable[number]): string { - return variant.display?.label ?? titleCase(variant.name); + return variant.display?.label ?? titleCase(variant.identifier); } /** Extracts the variant name from a decoded enum value (scalar name string or data enum `__kind`). */ diff --git a/packages/dynamic-instructions/src/display/get-instruction-display.ts b/packages/dynamic-instructions/src/display/get-instruction-display.ts index c6d64621e..68db4bfdb 100644 --- a/packages/dynamic-instructions/src/display/get-instruction-display.ts +++ b/packages/dynamic-instructions/src/display/get-instruction-display.ts @@ -40,7 +40,7 @@ export async function getInstructionDisplayFromParsedInstruction( const displayContext = await buildDisplayContext(root, parsedInstruction, options); const instruction = getLastNodeFromPath(displayContext.parsedInstruction.path); - const intent = instruction.display?.intent ?? titleCase(instruction.name); + const intent = instruction.display?.intent ?? titleCase(instruction.identifier); const [interpolatedIntent, fields] = await Promise.all([ interpolateIntent(displayContext), listFallback(displayContext), diff --git a/packages/dynamic-instructions/src/display/interpolate-intent.ts b/packages/dynamic-instructions/src/display/interpolate-intent.ts index bbfc23c6a..6779fc0ad 100644 --- a/packages/dynamic-instructions/src/display/interpolate-intent.ts +++ b/packages/dynamic-instructions/src/display/interpolate-intent.ts @@ -46,7 +46,7 @@ async function resolvePlaceholder(root: string, name: string, displayContext: Di const { data, path } = displayContext.parsedInstruction; if (root === 'data') { const instruction = getLastNodeFromPath(path); - const argument = (instruction.arguments ?? []).find(arg => arg.name === name); + const argument = (instruction.arguments ?? []).find(arg => arg.identifier === name); const decodedData = data as Record; if (!argument || !(name in decodedData)) return null; const ownerPath = [...path, argument]; diff --git a/packages/dynamic-instructions/src/display/list-fallback.ts b/packages/dynamic-instructions/src/display/list-fallback.ts index 86c6593e0..4684dd7cc 100644 --- a/packages/dynamic-instructions/src/display/list-fallback.ts +++ b/packages/dynamic-instructions/src/display/list-fallback.ts @@ -38,9 +38,9 @@ async function argumentFields( argument: InstructionArgumentNode, displayContext: DisplayContext, ): Promise { - if (isSkipped(argument.display?.skip, argument.name, displayContext)) return []; + if (isSkipped(argument.display?.skip, argument.identifier, displayContext)) return []; - const value = (displayContext.parsedInstruction.data as Record)[argument.name]; + const value = (displayContext.parsedInstruction.data as Record)[argument.identifier]; const ownerPath: NodePath = [...displayContext.parsedInstruction.path, argument]; const resolved = resolveDisplayType(argument.type, ownerPath, displayContext); @@ -62,7 +62,7 @@ async function argumentFields( ); } - const label = argument.display?.label ?? titleCase(argument.name); + const label = argument.display?.label ?? titleCase(argument.identifier); return await memberFields(label, argument.type, ownerPath, value, displayContext); } @@ -75,12 +75,18 @@ async function flattenedFields( displayContext: DisplayContext, ): Promise { const visibleFields = (struct.fields ?? []).filter( - field => !isSkipped(field.display?.skip, field.name, displayContext), + field => !isSkipped(field.display?.skip, field.identifier, displayContext), ); const fieldGroups = await Promise.all( visibleFields.map(async field => { - const label = `${prefix ?? ''}${field.display?.label ?? titleCase(field.name)}`; - return await memberFields(label, field.type, [...structPath, field], value[field.name], displayContext); + const label = `${prefix ?? ''}${field.display?.label ?? titleCase(field.identifier)}`; + return await memberFields( + label, + field.type, + [...structPath, field], + value[field.identifier], + displayContext, + ); }), ); return fieldGroups.flat(); @@ -125,10 +131,10 @@ async function memberFields( function accountFields(displayContext: DisplayContext): DisplayField[] { const instruction = getLastNodeFromPath(displayContext.parsedInstruction.path); return (instruction.accounts ?? []).flatMap(account => { - if (isSkipped(account.display?.skip, account.name, displayContext)) return []; - const address = displayContext.parsedInstruction.accounts.find(a => a.name === account.name)?.address; + if (isSkipped(account.display?.skip, account.identifier, displayContext)) return []; + const address = displayContext.parsedInstruction.accounts.find(a => a.name === account.identifier)?.address; if (!address) return []; - const label = account.display?.label ?? titleCase(account.name); + const label = account.display?.label ?? titleCase(account.identifier); return [{ label, value: address }]; }); } diff --git a/packages/dynamic-instructions/src/display/resolve-consumed-members.ts b/packages/dynamic-instructions/src/display/resolve-consumed-members.ts index 13e76f293..8f9e7627e 100644 --- a/packages/dynamic-instructions/src/display/resolve-consumed-members.ts +++ b/packages/dynamic-instructions/src/display/resolve-consumed-members.ts @@ -59,7 +59,7 @@ export async function resolveConsumedMemberNames(displayContext: BaseDisplayCont /** Collects the member names a resolved value node references (an account, its field, or an argument). */ function collectReferencedMembers(node: Node, members: Set): void { - if (isNode(node, 'accountValueNode')) members.add(node.name); + if (isNode(node, 'accountValueNode')) members.add(node.identifier); else if (isNode(node, 'accountFieldValueNode')) members.add(node.account); else if (isNode(node, 'argumentValueNode')) members.add(node.name); } diff --git a/packages/dynamic-instructions/src/display/resolve-injected-value.ts b/packages/dynamic-instructions/src/display/resolve-injected-value.ts index 5430a2534..4ceacd11b 100644 --- a/packages/dynamic-instructions/src/display/resolve-injected-value.ts +++ b/packages/dynamic-instructions/src/display/resolve-injected-value.ts @@ -54,7 +54,7 @@ export async function resolveInjectedValue( } if (isNode(node, 'accountValueNode')) { - return findAccountAddress(context, node.name); + return findAccountAddress(context, node.identifier); } if (isNode(node, 'accountFieldValueNode')) { diff --git a/packages/dynamic-instructions/src/validators.ts b/packages/dynamic-instructions/src/validators.ts index 13c623914..6c2e2eacf 100644 --- a/packages/dynamic-instructions/src/validators.ts +++ b/packages/dynamic-instructions/src/validators.ts @@ -38,7 +38,8 @@ type StructUnknown = Struct; */ export function createIxAccountsValidator(ixAccountNodes: InstructionAccountNode[]): StructUnknown { const shape = ixAccountNodes.reduce>((acc, node) => { - acc[node.name] = node.isOptional || node.defaultValue ? OptionalSolanaAddressValidator : SolanaAddressValidator; + acc[node.identifier] = + node.isOptional || node.defaultValue ? OptionalSolanaAddressValidator : SolanaAddressValidator; return acc; }, {}); return object(shape) as StructUnknown; @@ -54,10 +55,10 @@ export function createIxArgumentsValidator( ): StructUnknown { const shape = ixArgumentNodes.reduce>((acc, argumentNode, index) => { if (!argumentNode.type) { - throw new Error(`Argument ${argumentNode.name} of instruction ${ixNodeName} does not have a type`); + throw new Error(`Argument ${argumentNode.identifier} of instruction ${ixNodeName} does not have a type`); } - acc[argumentNode.name] = createValidatorForTypeNode( - `${ixNodeName}_${argumentNode.name}_${index}`, + acc[argumentNode.identifier] = createValidatorForTypeNode( + `${ixNodeName}_${argumentNode.identifier}_${index}`, argumentNode.type, definedTypes, ); @@ -69,7 +70,7 @@ export function createIxArgumentsValidator( function createValidatorForTypeNode(nodeName: string, node: TypeNode, definedTypes: DefinedTypeNode[]): StructUnknown { if (!node) { throw new Error( - `Node ${nodeName} is not defined. ${definedTypes.length} defined types were provided: ${definedTypes.map(t => t.name).join(', ')}`, + `Node ${nodeName} is not defined. ${definedTypes.length} defined types were provided: ${definedTypes.map(t => t.identifier).join(', ')}`, ); } switch (node.kind) { @@ -120,9 +121,9 @@ function createValidatorForTypeNode(nodeName: string, node: TypeNode, definedTyp return createValidatorForTypeNode(`${nodeName}_date_time`, node.number, definedTypes); } case 'definedTypeLinkNode': { - const definedType = definedTypes.find(d => d.name === node.name); + const definedType = definedTypes.find(d => d.identifier === node.identifier); if (!definedType) { - throw new Error(`Undefined type: ${node.name} ${node.kind}`); + throw new Error(`Undefined type: ${node.identifier} ${node.kind}`); } return createValidatorForTypeNode(`${nodeName}_defined_type`, definedType.type, definedTypes); } @@ -146,8 +147,8 @@ function createValidatorForTypeNode(nodeName: string, node: TypeNode, definedTyp } case 'structTypeNode': { const structShape = (node.fields ?? []).reduce>((acc, field) => { - acc[field.name] = createValidatorForTypeNode( - `${nodeName}_struct_${field.name}`, + acc[field.identifier] = createValidatorForTypeNode( + `${nodeName}_struct_${field.identifier}`, field.type, definedTypes, ); @@ -217,7 +218,7 @@ function RemainderOptionTypeItemValidator( } if (itemNode.kind === 'definedTypeLinkNode') { - const definedType = definedTypes.find(d => d.name === itemNode.name); + const definedType = definedTypes.find(d => d.identifier === itemNode.identifier); if (definedType?.type.kind === 'fixedSizeTypeNode' && definedType.type.type.kind === 'stringTypeNode') { return StringValidatorForFixedSize(definedType.type.size); } @@ -251,21 +252,21 @@ function EnumVariantValidator( ): StructUnknown { // Keyed by PascalCase so both raw node names and the codec's decoded // `__kind` casing match the same variant. - const variantMap = new Map(variants.map(v => [pascalCase(v.name), v])); - const variantNames = variants.map(v => v.name); + const variantMap = new Map(variants.map(v => [pascalCase(v.identifier), v])); + const variantNames = variants.map(v => v.identifier); // Eagerly build per-variant payload validators for struct and tuple variants const variantValidators = new Map(); for (const variant of variants) { if (variant.kind === 'enumStructVariantTypeNode') { variantValidators.set( - pascalCase(variant.name), - createValidatorForTypeNode(`${nodeName}_${variant.name}`, variant.struct, definedTypes), + pascalCase(variant.identifier), + createValidatorForTypeNode(`${nodeName}_${variant.identifier}`, variant.struct, definedTypes), ); } else if (variant.kind === 'enumTupleVariantTypeNode') { variantValidators.set( - pascalCase(variant.name), - createValidatorForTypeNode(`${nodeName}_${variant.name}`, variant.tuple, definedTypes), + pascalCase(variant.identifier), + createValidatorForTypeNode(`${nodeName}_${variant.identifier}`, variant.tuple, definedTypes), ); } } diff --git a/packages/dynamic-parsers/src/discriminators.ts b/packages/dynamic-parsers/src/discriminators.ts index 3694e71e9..ad95eed10 100644 --- a/packages/dynamic-parsers/src/discriminators.ts +++ b/packages/dynamic-parsers/src/discriminators.ts @@ -69,7 +69,7 @@ function matchFieldDiscriminator( }); } const struct = typeNode as StructTypeNode; - const field = (struct.fields ?? []).find(field => field.name === discriminator.name); + const field = (struct.fields ?? []).find(field => field.identifier === discriminator.name); if (!field) { throw new CodamaError(CODAMA_ERROR__DISCRIMINATOR_FIELD_NOT_FOUND, { field: discriminator.name, diff --git a/packages/dynamic-parsers/src/parsers.ts b/packages/dynamic-parsers/src/parsers.ts index 0cce5ffab..c6553f7ef 100644 --- a/packages/dynamic-parsers/src/parsers.ts +++ b/packages/dynamic-parsers/src/parsers.ts @@ -98,7 +98,7 @@ export function parseInstruction( const accounts: ParsedInstructionAccounts = namedAccounts.flatMap((account, index) => { const accountMeta = instruction.accounts[index]; if (!accountMeta) return []; - return [{ ...accountMeta, name: account.name }]; + return [{ ...accountMeta, name: account.identifier }]; }); const remainingAccounts = instruction.accounts.slice(namedAccounts.length); return { ...parsedData, accounts, remainingAccounts }; diff --git a/packages/nodes-from-anchor/src/extractPdasVisitor.ts b/packages/nodes-from-anchor/src/extractPdasVisitor.ts index dcaa889af..954a85c10 100644 --- a/packages/nodes-from-anchor/src/extractPdasVisitor.ts +++ b/packages/nodes-from-anchor/src/extractPdasVisitor.ts @@ -18,7 +18,7 @@ import { bottomUpTransformerVisitor, getUniqueHashStringVisitor, visit, type Vis type Fingerprint = string; function pdaFingerprint(pda: PdaNode, hashVisitor: Visitor): Fingerprint { - return visit(pdaNode({ ...pda, name: '' }), hashVisitor); + return visit(pdaNode({ ...pda, identifier: '' }), hashVisitor); } function getUniquePdaName(name: CamelCaseString, usedNames: Set): CamelCaseString { @@ -47,7 +47,7 @@ export function extractPdasVisitor() { export function extractPdasFromProgram(program: ProgramNode): ProgramNode { const hashVisitor = getUniqueHashStringVisitor(); const pdaMap = new Map(); - const usedNames = new Set((program.pdas ?? []).map(p => p.name)); + const usedNames = new Set((program.pdas ?? []).map(p => p.identifier)); const nameToFingerprint = new Map(); const rewrittenInstructions = (program.instructions ?? []).map(instruction => { @@ -66,13 +66,13 @@ export function extractPdasFromProgram(program: ProgramNode): ProgramNode { const fingerprint = pdaFingerprint(pda, hashVisitor); if (!pdaMap.has(fingerprint)) { - let resolvedName = pda.name; + let resolvedName = pda.identifier; const existingFingerprint = nameToFingerprint.get(resolvedName); if (existingFingerprint !== undefined && existingFingerprint !== fingerprint) { - resolvedName = camelCase(`${instruction.name}_${pda.name}`); + resolvedName = camelCase(`${instruction.identifier}_${pda.identifier}`); logWarn( - `PDA name collision: "${pda.name}" has different seeds across instructions. ` + + `PDA name collision: "${pda.identifier}" has different seeds across instructions. ` + `Renaming to "${resolvedName}".`, ); } @@ -81,11 +81,11 @@ export function extractPdasFromProgram(program: ProgramNode): ProgramNode { usedNames.add(resolvedName); nameToFingerprint.set(resolvedName, fingerprint); - pdaMap.set(fingerprint, pdaNode({ ...pda, name: resolvedName })); + pdaMap.set(fingerprint, pdaNode({ ...pda, identifier: resolvedName })); } const extractedPda = pdaMap.get(fingerprint)!; - const defaultValue = { ...account.defaultValue, pda: pdaLinkNode(extractedPda.name) }; + const defaultValue = { ...account.defaultValue, pda: pdaLinkNode(extractedPda.identifier) }; return instructionAccountNode({ ...account, defaultValue }); }); diff --git a/packages/nodes-from-anchor/src/v00/AccountNode.ts b/packages/nodes-from-anchor/src/v00/AccountNode.ts index b81903c5f..6a37454a5 100644 --- a/packages/nodes-from-anchor/src/v00/AccountNode.ts +++ b/packages/nodes-from-anchor/src/v00/AccountNode.ts @@ -34,7 +34,7 @@ export function accountNodeFromAnchorV00( const discriminator = structFieldTypeNode({ defaultValue: getAnchorAccountDiscriminatorV00(idlName), defaultValueStrategy: 'omitted', - name: 'discriminator', + identifier: 'discriminator', type: fixedSizeTypeNode(bytesTypeNode(), 8), }); data = structTypeNode([discriminator, ...(data.fields ?? [])]); @@ -45,7 +45,7 @@ export function accountNodeFromAnchorV00( data, discriminators, docs: idl.docs ?? [], - name, + identifier: name, pda: hasSeeds ? pdaLinkNode(name) : undefined, size: idl.size, }); diff --git a/packages/nodes-from-anchor/src/v00/DefinedTypeNode.ts b/packages/nodes-from-anchor/src/v00/DefinedTypeNode.ts index b06259799..78d46729a 100644 --- a/packages/nodes-from-anchor/src/v00/DefinedTypeNode.ts +++ b/packages/nodes-from-anchor/src/v00/DefinedTypeNode.ts @@ -7,5 +7,5 @@ export function definedTypeNodeFromAnchorV00(idl: Partial): Defin const name = idl.name ?? ''; const idlType = idl.type ?? { fields: [], kind: 'struct' }; const type = typeNodeFromAnchorV00(idlType); - return definedTypeNode({ docs: idl.docs, name, type }); + return definedTypeNode({ docs: idl.docs, identifier: name, type }); } diff --git a/packages/nodes-from-anchor/src/v00/ErrorNode.ts b/packages/nodes-from-anchor/src/v00/ErrorNode.ts index d26ef57df..c8db1ea3f 100644 --- a/packages/nodes-from-anchor/src/v00/ErrorNode.ts +++ b/packages/nodes-from-anchor/src/v00/ErrorNode.ts @@ -9,6 +9,6 @@ export function errorNodeFromAnchorV00(idl: Partial): ErrorNode code: idl.code ?? -1, docs: idl.docs ?? [msg ? `${name}: ${msg}` : `${name}`], message: msg, - name, + identifier: name, }); } diff --git a/packages/nodes-from-anchor/src/v00/EventNode.ts b/packages/nodes-from-anchor/src/v00/EventNode.ts index 915f31afc..1dfb90387 100644 --- a/packages/nodes-from-anchor/src/v00/EventNode.ts +++ b/packages/nodes-from-anchor/src/v00/EventNode.ts @@ -23,6 +23,6 @@ export function eventNodeFromAnchorV00(idl: IdlV00Event): EventNode { return eventNode({ data: hiddenPrefixTypeNode(data, [discriminatorConstant]), discriminators: [constantDiscriminatorNode(discriminatorConstant)], - name, + identifier: name, }); } diff --git a/packages/nodes-from-anchor/src/v00/InstructionAccountNode.ts b/packages/nodes-from-anchor/src/v00/InstructionAccountNode.ts index c029ac682..72dbb9ae8 100644 --- a/packages/nodes-from-anchor/src/v00/InstructionAccountNode.ts +++ b/packages/nodes-from-anchor/src/v00/InstructionAccountNode.ts @@ -49,6 +49,6 @@ export function instructionAccountNodeFromAnchorV00(idl: IdlV00Account, prefix?: isOptional, isSigner: idl.isOptionalSigner ? 'either' : (idl.isSigner ?? false), isWritable: idl.isMut ?? false, - name: prefix ? `${prefix}_${idl.name ?? ''}` : (idl.name ?? ''), + identifier: prefix ? `${prefix}_${idl.name ?? ''}` : (idl.name ?? ''), }); } diff --git a/packages/nodes-from-anchor/src/v00/InstructionArgumentNode.ts b/packages/nodes-from-anchor/src/v00/InstructionArgumentNode.ts index cce47d921..0fcb2e093 100644 --- a/packages/nodes-from-anchor/src/v00/InstructionArgumentNode.ts +++ b/packages/nodes-from-anchor/src/v00/InstructionArgumentNode.ts @@ -6,7 +6,7 @@ import { typeNodeFromAnchorV00 } from './typeNodes'; export function instructionArgumentNodeFromAnchorV00(idl: IdlV00Field): InstructionArgumentNode { return instructionArgumentNode({ docs: idl.docs ?? [], - name: idl.name ?? '', + identifier: idl.name ?? '', type: typeNodeFromAnchorV00(idl.type), }); } diff --git a/packages/nodes-from-anchor/src/v00/InstructionNode.ts b/packages/nodes-from-anchor/src/v00/InstructionNode.ts index 1550e5e46..17309e2da 100644 --- a/packages/nodes-from-anchor/src/v00/InstructionNode.ts +++ b/packages/nodes-from-anchor/src/v00/InstructionNode.ts @@ -32,7 +32,7 @@ export function instructionNodeFromAnchorV00( const discriminatorField = instructionArgumentNode({ defaultValue: numberValueNode(idl.discriminant.value), defaultValueStrategy: 'omitted', - name: 'discriminator', + identifier: 'discriminator', type: typeNodeFromAnchorV00(idl.discriminant.type), }); dataArguments = [discriminatorField, ...dataArguments]; @@ -41,7 +41,7 @@ export function instructionNodeFromAnchorV00( const discriminatorField = instructionArgumentNode({ defaultValue: getAnchorInstructionDiscriminatorV00(idlName), defaultValueStrategy: 'omitted', - name: 'discriminator', + identifier: 'discriminator', type: fixedSizeTypeNode(bytesTypeNode(), 8), }); dataArguments = [discriminatorField, ...dataArguments]; @@ -50,7 +50,7 @@ export function instructionNodeFromAnchorV00( const discriminatorField = instructionArgumentNode({ defaultValue: bytesValueNode('base16', ixIndex.toString(16)), defaultValueStrategy: 'omitted', - name: 'discriminator', + identifier: 'discriminator', type: fixedSizeTypeNode(bytesTypeNode(), 1), }); dataArguments = [discriminatorField, ...dataArguments]; @@ -62,7 +62,7 @@ export function instructionNodeFromAnchorV00( arguments: dataArguments, discriminators, docs: idl.docs ?? [], - name, + identifier: name, optionalAccountStrategy: idl.legacyOptionalAccountsStrategy ? 'omitted' : 'programId', }); } diff --git a/packages/nodes-from-anchor/src/v00/PdaNode.ts b/packages/nodes-from-anchor/src/v00/PdaNode.ts index 03a05bd61..9afba44f3 100644 --- a/packages/nodes-from-anchor/src/v00/PdaNode.ts +++ b/packages/nodes-from-anchor/src/v00/PdaNode.ts @@ -37,7 +37,7 @@ export function pdaNodeFromAnchorV00(idl: IdlV00PdaDef): PdaNode { } return constantPdaSeedNodeFromProgramId(); }); - return pdaNode({ name, seeds }); + return pdaNode({ identifier: name, seeds }); } function pdaSeedTypeNodeFromAnchorV00(type: IdlV00Type): TypeNode { diff --git a/packages/nodes-from-anchor/src/v00/ProgramNode.ts b/packages/nodes-from-anchor/src/v00/ProgramNode.ts index 67d700cf3..d603922c3 100644 --- a/packages/nodes-from-anchor/src/v00/ProgramNode.ts +++ b/packages/nodes-from-anchor/src/v00/ProgramNode.ts @@ -24,7 +24,7 @@ export function programNodeFromAnchorV00(idl: IdlV00): ProgramNode { errors: (idl?.errors ?? []).map(errorNodeFromAnchorV00), events, instructions, - name: idl?.name ?? '', + identifier: idl?.name ?? '', origin, pdas, publicKey: (idl?.metadata as { address?: string })?.address ?? '', diff --git a/packages/nodes-from-anchor/src/v00/typeNodes/StructFieldTypeNode.ts b/packages/nodes-from-anchor/src/v00/typeNodes/StructFieldTypeNode.ts index e5546da5f..fa9be374a 100644 --- a/packages/nodes-from-anchor/src/v00/typeNodes/StructFieldTypeNode.ts +++ b/packages/nodes-from-anchor/src/v00/typeNodes/StructFieldTypeNode.ts @@ -6,7 +6,7 @@ import { typeNodeFromAnchorV00 } from './TypeNode'; export function structFieldTypeNodeFromAnchorV00(idl: IdlV00Field): StructFieldTypeNode { return structFieldTypeNode({ docs: idl.docs ?? [], - name: idl.name ?? '', + identifier: idl.name ?? '', type: typeNodeFromAnchorV00(idl.type), }); } diff --git a/packages/nodes-from-anchor/src/v01/AccountNode.ts b/packages/nodes-from-anchor/src/v01/AccountNode.ts index c4e70adea..00be37dcb 100644 --- a/packages/nodes-from-anchor/src/v01/AccountNode.ts +++ b/packages/nodes-from-anchor/src/v01/AccountNode.ts @@ -34,13 +34,13 @@ export function accountNodeFromAnchorV01( const discriminator = structFieldTypeNode({ defaultValue: getAnchorDiscriminatorV01(idl.discriminator), defaultValueStrategy: 'omitted', - name: 'discriminator', + identifier: 'discriminator', type: fixedSizeTypeNode(bytesTypeNode(), idl.discriminator.length), }); return accountNode({ data: structTypeNode([discriminator, ...(data.fields ?? [])]), discriminators: [fieldDiscriminatorNode('discriminator')], - name, + identifier: name, }); } diff --git a/packages/nodes-from-anchor/src/v01/DefinedTypeNode.ts b/packages/nodes-from-anchor/src/v01/DefinedTypeNode.ts index 516fb75db..fa4a67bd5 100644 --- a/packages/nodes-from-anchor/src/v01/DefinedTypeNode.ts +++ b/packages/nodes-from-anchor/src/v01/DefinedTypeNode.ts @@ -8,5 +8,5 @@ export function definedTypeNodeFromAnchorV01(idl: Partial, generi const name = idl.name ?? ''; const idlType = idl.type ?? { fields: [], kind: 'struct' }; const type = typeNodeFromAnchorV01(idlType, generics); - return definedTypeNode({ docs: idl.docs, name, type }); + return definedTypeNode({ docs: idl.docs, identifier: name, type }); } diff --git a/packages/nodes-from-anchor/src/v01/ErrorNode.ts b/packages/nodes-from-anchor/src/v01/ErrorNode.ts index cb9e1bba3..15040e656 100644 --- a/packages/nodes-from-anchor/src/v01/ErrorNode.ts +++ b/packages/nodes-from-anchor/src/v01/ErrorNode.ts @@ -9,6 +9,6 @@ export function errorNodeFromAnchorV01(idl: Partial): ErrorNode code: idl.code ?? -1, docs: `${name}: ${msg}`, message: msg, - name, + identifier: name, }); } diff --git a/packages/nodes-from-anchor/src/v01/EventNode.ts b/packages/nodes-from-anchor/src/v01/EventNode.ts index 8c8c1dc50..23c0d75ba 100644 --- a/packages/nodes-from-anchor/src/v01/EventNode.ts +++ b/packages/nodes-from-anchor/src/v01/EventNode.ts @@ -33,6 +33,6 @@ export function eventNodeFromAnchorV01(idl: IdlV01Event, types: IdlV01TypeDef[], return eventNode({ data: hiddenPrefixTypeNode(data, [discriminatorConstant]), discriminators: [constantDiscriminatorNode(discriminatorConstant)], - name, + identifier: name, }); } diff --git a/packages/nodes-from-anchor/src/v01/InstructionAccountNode.ts b/packages/nodes-from-anchor/src/v01/InstructionAccountNode.ts index 5de7a77d2..892512663 100644 --- a/packages/nodes-from-anchor/src/v01/InstructionAccountNode.ts +++ b/packages/nodes-from-anchor/src/v01/InstructionAccountNode.ts @@ -102,7 +102,7 @@ export function instructionAccountNodeFromAnchorV01( } defaultValue = pdaValueNode( - pdaNode({ name, programId, seeds: seedDefinitions }), + pdaNode({ identifier: name, programId, seeds: seedDefinitions }), seedValues, programIdValue, ); @@ -115,6 +115,6 @@ export function instructionAccountNodeFromAnchorV01( isOptional, isSigner, isWritable, - name, + identifier: name, }); } diff --git a/packages/nodes-from-anchor/src/v01/InstructionArgumentNode.ts b/packages/nodes-from-anchor/src/v01/InstructionArgumentNode.ts index 7142b9f0f..a4004f494 100644 --- a/packages/nodes-from-anchor/src/v01/InstructionArgumentNode.ts +++ b/packages/nodes-from-anchor/src/v01/InstructionArgumentNode.ts @@ -7,7 +7,7 @@ import type { GenericsV01 } from './unwrapGenerics'; export function instructionArgumentNodeFromAnchorV01(idl: IdlV01Field, generics: GenericsV01): InstructionArgumentNode { return instructionArgumentNode({ docs: idl.docs ?? [], - name: idl.name, + identifier: idl.name, type: typeNodeFromAnchorV01(idl.type, generics), }); } diff --git a/packages/nodes-from-anchor/src/v01/InstructionNode.ts b/packages/nodes-from-anchor/src/v01/InstructionNode.ts index ca7cdd5c1..b1ec2366b 100644 --- a/packages/nodes-from-anchor/src/v01/InstructionNode.ts +++ b/packages/nodes-from-anchor/src/v01/InstructionNode.ts @@ -21,7 +21,7 @@ export function instructionNodeFromAnchorV01(idl: IdlV01Instruction, generics: G const discriminatorField = instructionArgumentNode({ defaultValue: getAnchorDiscriminatorV01(idl.discriminator), defaultValueStrategy: 'omitted', - name: 'discriminator', + identifier: 'discriminator', type: fixedSizeTypeNode(bytesTypeNode(), idl.discriminator.length), }); dataArguments = [discriminatorField, ...dataArguments]; @@ -32,7 +32,7 @@ export function instructionNodeFromAnchorV01(idl: IdlV01Instruction, generics: G arguments: dataArguments, discriminators, docs: idl.docs ?? [], - name: camelCase(name), + identifier: camelCase(name), optionalAccountStrategy: 'programId', }); } diff --git a/packages/nodes-from-anchor/src/v01/PdaSeedNode.ts b/packages/nodes-from-anchor/src/v01/PdaSeedNode.ts index 621c2930c..93226675b 100644 --- a/packages/nodes-from-anchor/src/v01/PdaSeedNode.ts +++ b/packages/nodes-from-anchor/src/v01/PdaSeedNode.ts @@ -47,7 +47,7 @@ export function pdaSeedNodeFromAnchorV01( // Ignore nested paths. const [originalArgumentName] = seed.path.split('.'); const argumentName = camelCase(originalArgumentName); - const argumentNode = instructionArguments.find(({ name }) => name === argumentName); + const argumentNode = instructionArguments.find(({ identifier }) => identifier === argumentName); if (!argumentNode) { throw new CodamaError(CODAMA_ERROR__ANCHOR__ARGUMENT_TYPE_MISSING, { name: originalArgumentName }); } @@ -74,8 +74,8 @@ export function pdaSeedNodeFromAnchorV01( : argumentNode.type; return { - definition: variablePdaSeedNode(argumentNode.name, argumentType), - value: pdaSeedValueNode(argumentNode.name, argumentValueNode(argumentNode.name)), + definition: variablePdaSeedNode(argumentNode.identifier, argumentType), + value: pdaSeedValueNode(argumentNode.identifier, argumentValueNode(argumentNode.identifier)), }; } default: diff --git a/packages/nodes-from-anchor/src/v01/ProgramNode.ts b/packages/nodes-from-anchor/src/v01/ProgramNode.ts index abab4115e..cc0a090be 100644 --- a/packages/nodes-from-anchor/src/v01/ProgramNode.ts +++ b/packages/nodes-from-anchor/src/v01/ProgramNode.ts @@ -31,7 +31,7 @@ export function programNodeFromAnchorV01(idl: IdlV01): ProgramNode { errors: errors.map(errorNodeFromAnchorV01), events: events.map(event => eventNodeFromAnchorV01(event, types, generics)), instructions: instructions.map(instruction => instructionNodeFromAnchorV01(instruction, generics)), - name: idl.metadata.name, + identifier: idl.metadata.name, origin: 'anchor', publicKey: idl.address, version: idl.metadata.version as Version, diff --git a/packages/nodes-from-anchor/src/v01/typeNodes/StructFieldTypeNode.ts b/packages/nodes-from-anchor/src/v01/typeNodes/StructFieldTypeNode.ts index 7545a27d2..dc9e4f1bc 100644 --- a/packages/nodes-from-anchor/src/v01/typeNodes/StructFieldTypeNode.ts +++ b/packages/nodes-from-anchor/src/v01/typeNodes/StructFieldTypeNode.ts @@ -17,7 +17,7 @@ export function structFieldTypeNodeFromAnchorV01( return structFieldTypeNode({ docs: idl.docs ?? [], - name: idl.name, + identifier: idl.name, type: typeNodeFromAnchorV01(idl.type, generics), }); } diff --git a/packages/validators/src/getValidationItemsVisitor.ts b/packages/validators/src/getValidationItemsVisitor.ts index 125db46f6..e054295d3 100644 --- a/packages/validators/src/getValidationItemsVisitor.ts +++ b/packages/validators/src/getValidationItemsVisitor.ts @@ -27,7 +27,7 @@ export function getValidationItemsVisitor(): Visitor extendVisitor(v, { visitAccount(node, { next }) { const items = [] as ValidationItem[]; - if (!node.name) { + if (!node.identifier) { items.push(validationItem('error', 'Account has no name.', node, stack)); } return [...items, ...next(node)]; @@ -35,7 +35,7 @@ export function getValidationItemsVisitor(): Visitor visitDefinedType(node, { next }) { const items = [] as ValidationItem[]; - if (!node.name) { + if (!node.identifier) { items.push(validationItem('error', 'Defined type has no name.', node, stack)); } return [...items, ...next(node)]; @@ -43,13 +43,13 @@ export function getValidationItemsVisitor(): Visitor visitDefinedTypeLink(node, { next }) { const items = [] as ValidationItem[]; - if (!node.name) { + if (!node.identifier) { items.push(validationItem('error', 'Pointing to a defined type with no name.', node, stack)); } else if (!linkables.has(stack.getPath(node.kind))) { items.push( validationItem( 'error', - `Pointing to a missing defined type named "${node.name}"`, + `Pointing to a missing defined type named "${node.identifier}"`, node, stack, ), @@ -60,7 +60,7 @@ export function getValidationItemsVisitor(): Visitor visitEnumEmptyVariantType(node, { next }) { const items = [] as ValidationItem[]; - if (!node.name) { + if (!node.identifier) { items.push(validationItem('error', 'Enum variant has no name.', node, stack)); } return [...items, ...next(node)]; @@ -68,7 +68,7 @@ export function getValidationItemsVisitor(): Visitor visitEnumStructVariantType(node, { next }) { const items = [] as ValidationItem[]; - if (!node.name) { + if (!node.identifier) { items.push(validationItem('error', 'Enum variant has no name.', node, stack)); } return [...items, ...next(node)]; @@ -76,7 +76,7 @@ export function getValidationItemsVisitor(): Visitor visitEnumTupleVariantType(node, { next }) { const items = [] as ValidationItem[]; - if (!node.name) { + if (!node.identifier) { items.push(validationItem('error', 'Enum variant has no name.', node, stack)); } return [...items, ...next(node)]; @@ -89,7 +89,7 @@ export function getValidationItemsVisitor(): Visitor items.push(validationItem('warn', 'Enum has no variants.', node, stack)); } variants.forEach(variant => { - if (!variant.name) { + if (!variant.identifier) { items.push(validationItem('error', 'Enum variant has no name.', node, stack)); } }); @@ -98,7 +98,7 @@ export function getValidationItemsVisitor(): Visitor visitError(node, { next }) { const items = [] as ValidationItem[]; - if (!node.name) { + if (!node.identifier) { items.push(validationItem('error', 'Error has no name.', node, stack)); } if (typeof node.code !== 'number') { @@ -112,25 +112,25 @@ export function getValidationItemsVisitor(): Visitor visitInstruction(node, { next }) { const items = [] as ValidationItem[]; - if (!node.name) { + if (!node.identifier) { items.push(validationItem('error', 'Instruction has no name.', node, stack)); } // Check for duplicate account names. const accountNameHistogram = new Map(); (node.accounts ?? []).forEach(account => { - if (!account.name) { + if (!account.identifier) { items.push(validationItem('error', 'Instruction account has no name.', node, stack)); return; } - const count = (accountNameHistogram.get(account.name) ?? 0) + 1; - accountNameHistogram.set(account.name, count); + const count = (accountNameHistogram.get(account.identifier) ?? 0) + 1; + accountNameHistogram.set(account.identifier, count); // Only throw an error once per duplicated names. if (count === 2) { items.push( validationItem( 'error', - `Account name "${account.name}" is not unique in instruction "${node.name}".`, + `Account name "${account.identifier}" is not unique in instruction "${node.identifier}".`, node, stack, ), @@ -168,14 +168,14 @@ export function getValidationItemsVisitor(): Visitor const { defaultValue } = argument; if (isNode(defaultValue, 'accountBumpValueNode')) { const defaultAccount = (node.accounts ?? []).find( - account => account.name === defaultValue.name, + account => account.identifier === defaultValue.identifier, ); if (defaultAccount && defaultAccount.isSigner !== false) { items.push( validationItem( 'error', - `Argument ${argument.name} cannot default to the bump attribute of ` + - `the [${defaultValue.name}] account as it may be a Signer.`, + `Argument ${argument.identifier} cannot default to the bump attribute of ` + + `the [${defaultValue.identifier}] account as it may be a Signer.`, node, stack, ), @@ -189,7 +189,7 @@ export function getValidationItemsVisitor(): Visitor visitProgram(node, { next }) { const items = [] as ValidationItem[]; - if (!node.name) { + if (!node.identifier) { items.push(validationItem('error', 'Program has no name.', node, stack)); } if (!node.publicKey) { @@ -206,7 +206,7 @@ export function getValidationItemsVisitor(): Visitor visitStructFieldType(node, { next }) { const items = [] as ValidationItem[]; - if (!node.name) { + if (!node.identifier) { items.push(validationItem('error', 'Struct field has no name.', node, stack)); } return [...items, ...next(node)]; @@ -218,15 +218,15 @@ export function getValidationItemsVisitor(): Visitor // Check for duplicate field names. const fieldNameHistogram = new Map(); (node.fields ?? []).forEach(field => { - if (!field.name) return; // Handled by TypeStructField - const count = (fieldNameHistogram.get(field.name) ?? 0) + 1; - fieldNameHistogram.set(field.name, count); + if (!field.identifier) return; // Handled by TypeStructField + const count = (fieldNameHistogram.get(field.identifier) ?? 0) + 1; + fieldNameHistogram.set(field.identifier, count); // Only throw an error once per duplicated names. if (count === 2) { items.push( validationItem( 'error', - `Struct field name "${field.name}" is not unique.`, + `Struct field name "${field.identifier}" is not unique.`, field, stack, ), diff --git a/packages/visitors-core/README.md b/packages/visitors-core/README.md index 4654771fa..575e4601c 100644 --- a/packages/visitors-core/README.md +++ b/packages/visitors-core/README.md @@ -618,7 +618,7 @@ const visitor = bottomUpTransformerVisitor([ '[accountNode]', path => { const node = getLastNodeFromPath(path); - return 'name' in node && node.name.startsWith('m'); + return 'identifier' in node && node.identifier.startsWith('m'); }, ], transform: () => null, diff --git a/packages/visitors-core/src/LinkableDictionary.ts b/packages/visitors-core/src/LinkableDictionary.ts index d6ff8b1c9..b55ce47b8 100644 --- a/packages/visitors-core/src/LinkableDictionary.ts +++ b/packages/visitors-core/src/LinkableDictionary.ts @@ -74,15 +74,15 @@ export class LinkableDictionary { const instructionDictionary = this.getOrCreateInstructionDictionary(programDictionary, linkablePath); if (isNodePath(linkablePath, 'accountNode')) { - programDictionary.accounts.set(linkableNode.name, linkablePath); + programDictionary.accounts.set(linkableNode.identifier, linkablePath); } else if (isNodePath(linkablePath, 'definedTypeNode')) { - programDictionary.definedTypes.set(linkableNode.name, linkablePath); + programDictionary.definedTypes.set(linkableNode.identifier, linkablePath); } else if (isNodePath(linkablePath, 'pdaNode')) { - programDictionary.pdas.set(linkableNode.name, linkablePath); + programDictionary.pdas.set(linkableNode.identifier, linkablePath); } else if (instructionDictionary && isNodePath(linkablePath, 'instructionAccountNode')) { - instructionDictionary.accounts.set(linkableNode.name, linkablePath); + instructionDictionary.accounts.set(linkableNode.identifier, linkablePath); } else if (instructionDictionary && isNodePath(linkablePath, 'instructionArgumentNode')) { - instructionDictionary.arguments.set(linkableNode.name, linkablePath); + instructionDictionary.arguments.set(linkableNode.identifier, linkablePath); } return this; @@ -98,7 +98,7 @@ export class LinkableDictionary { throw new CodamaError(CODAMA_ERROR__LINKED_NODE_NOT_FOUND, { kind: linkNode.kind, linkNode, - name: linkNode.name, + name: linkNode.identifier, path: linkPath, }); } @@ -116,17 +116,17 @@ export class LinkableDictionary { type LinkablePath = NodePath> | undefined; if (isNode(linkNode, 'accountLinkNode')) { - return programDictionary.accounts.get(linkNode.name) as LinkablePath; + return programDictionary.accounts.get(linkNode.identifier) as LinkablePath; } else if (isNode(linkNode, 'definedTypeLinkNode')) { - return programDictionary.definedTypes.get(linkNode.name) as LinkablePath; + return programDictionary.definedTypes.get(linkNode.identifier) as LinkablePath; } else if (isNode(linkNode, 'instructionAccountLinkNode')) { - return instructionDictionary?.accounts.get(linkNode.name) as LinkablePath; + return instructionDictionary?.accounts.get(linkNode.identifier) as LinkablePath; } else if (isNode(linkNode, 'instructionArgumentLinkNode')) { return instructionDictionary?.arguments.get(linkNode.name) as LinkablePath; } else if (isNode(linkNode, 'instructionLinkNode')) { return instructionDictionary?.instruction as LinkablePath; } else if (isNode(linkNode, 'pdaLinkNode')) { - return programDictionary.pdas.get(linkNode.name) as LinkablePath; + return programDictionary.pdas.get(linkNode.identifier) as LinkablePath; } else if (isNode(linkNode, 'programLinkNode')) { return programDictionary.program as LinkablePath; } @@ -150,17 +150,17 @@ export class LinkableDictionary { const instructionDictionary = this.getInstructionDictionary(programDictionary, linkPath); if (isNode(linkNode, 'accountLinkNode')) { - return programDictionary.accounts.has(linkNode.name); + return programDictionary.accounts.has(linkNode.identifier); } else if (isNode(linkNode, 'definedTypeLinkNode')) { - return programDictionary.definedTypes.has(linkNode.name); + return programDictionary.definedTypes.has(linkNode.identifier); } else if (isNode(linkNode, 'instructionAccountLinkNode')) { - return !!instructionDictionary && instructionDictionary.accounts.has(linkNode.name); + return !!instructionDictionary && instructionDictionary.accounts.has(linkNode.identifier); } else if (isNode(linkNode, 'instructionArgumentLinkNode')) { return !!instructionDictionary && instructionDictionary.arguments.has(linkNode.name); } else if (isNode(linkNode, 'instructionLinkNode')) { - return programDictionary.instructions.has(linkNode.name); + return programDictionary.instructions.has(linkNode.identifier); } else if (isNode(linkNode, 'pdaLinkNode')) { - return programDictionary.pdas.has(linkNode.name); + return programDictionary.pdas.has(linkNode.identifier); } else if (isNode(linkNode, 'programLinkNode')) { return true; } @@ -173,7 +173,7 @@ export class LinkableDictionary { const programNode = isNode(linkableNode, 'programNode') ? linkableNode : findProgramNodeFromPath(linkablePath); if (!programNode) return undefined; - let programDictionary = this.programs.get(programNode.name); + let programDictionary = this.programs.get(programNode.identifier); if (!programDictionary) { programDictionary = { accounts: new Map(), @@ -182,7 +182,7 @@ export class LinkableDictionary { pdas: new Map(), program: getNodePathUntilLastNode(linkablePath, 'programNode')!, }; - this.programs.set(programNode.name, programDictionary); + this.programs.set(programNode.identifier, programDictionary); } return programDictionary; @@ -198,14 +198,14 @@ export class LinkableDictionary { : findInstructionNodeFromPath(linkablePath); if (!instructionNode) return undefined; - let instructionDictionary = programDictionary.instructions.get(instructionNode.name); + let instructionDictionary = programDictionary.instructions.get(instructionNode.identifier); if (!instructionDictionary) { instructionDictionary = { accounts: new Map(), arguments: new Map(), instruction: getNodePathUntilLastNode(linkablePath, 'instructionNode')!, }; - programDictionary.instructions.set(instructionNode.name, instructionDictionary); + programDictionary.instructions.set(instructionNode.identifier, instructionDictionary); } return instructionDictionary; @@ -215,13 +215,13 @@ export class LinkableDictionary { const linkNode = getLastNodeFromPath(linkPath); let programName: CamelCaseString | undefined = undefined; if (isNode(linkNode, 'programLinkNode')) { - programName = linkNode.name; + programName = linkNode.identifier; } else if ('program' in linkNode) { - programName = linkNode.program?.name; + programName = linkNode.program?.identifier; } else if ('instruction' in linkNode) { - programName = linkNode.instruction?.program?.name; + programName = linkNode.instruction?.program?.identifier; } - programName = programName ?? findProgramNodeFromPath(linkPath)?.name; + programName = programName ?? findProgramNodeFromPath(linkPath)?.identifier; return programName ? this.programs.get(programName) : undefined; } @@ -233,11 +233,11 @@ export class LinkableDictionary { const linkNode = getLastNodeFromPath(linkPath); let instructionName: CamelCaseString | undefined = undefined; if (isNode(linkNode, 'instructionLinkNode')) { - instructionName = linkNode.name; + instructionName = linkNode.identifier; } else if ('instruction' in linkNode) { - instructionName = linkNode.instruction?.name; + instructionName = linkNode.instruction?.identifier; } - instructionName = instructionName ?? findInstructionNodeFromPath(linkPath)?.name; + instructionName = instructionName ?? findInstructionNodeFromPath(linkPath)?.identifier; return instructionName ? programDictionary.instructions.get(instructionName) : undefined; } diff --git a/packages/visitors-core/src/NodePath.ts b/packages/visitors-core/src/NodePath.ts index a5f0bcc78..b301b9cdb 100644 --- a/packages/visitors-core/src/NodePath.ts +++ b/packages/visitors-core/src/NodePath.ts @@ -69,7 +69,7 @@ export function assertIsNodePath( export function nodePathToStringArray(path: NodePath): string[] { return path.map((node): string => { - return 'name' in node ? `[${node.kind}]${node.name}` : `[${node.kind}]`; + return 'identifier' in node ? `[${node.kind}]${node.identifier}` : `[${node.kind}]`; }); } diff --git a/packages/visitors-core/src/NodeSelector.ts b/packages/visitors-core/src/NodeSelector.ts index 9e6462586..acdec4db5 100644 --- a/packages/visitors-core/src/NodeSelector.ts +++ b/packages/visitors-core/src/NodeSelector.ts @@ -33,7 +33,11 @@ export const getNodeSelectorFunction = (selector: NodeSelector): NodeSelectorFun } // Check names. - if (name && (!('name' in node) || camelCase(name) !== node.name)) { + // NOTE: v2 identifiers are no longer camelCase-normalised, so comparing a + // camelCased selector against `node.identifier` is not quite right — the + // case-fold/underscore-strip comparison is a follow-up. Cast to `string` + // for now to keep the mechanical rename compiling without changing behaviour. + if (name && (!('identifier' in node) || camelCase(name) !== (node.identifier as string))) { return false; } diff --git a/packages/visitors-core/src/getByteSizeVisitor.ts b/packages/visitors-core/src/getByteSizeVisitor.ts index d66d73030..54febb9ce 100644 --- a/packages/visitors-core/src/getByteSizeVisitor.ts +++ b/packages/visitors-core/src/getByteSizeVisitor.ts @@ -77,13 +77,13 @@ export function getByteSizeVisitor( }, visitDefinedType(node, { self }) { - if (visitedDefinedTypes.has(node.name)) { - return visitedDefinedTypes.get(node.name)!; + if (visitedDefinedTypes.has(node.identifier)) { + return visitedDefinedTypes.get(node.identifier)!; } - definedTypeStack.push(node.name); + definedTypeStack.push(node.identifier); const child = visit(node.type, self); definedTypeStack.pop(); - visitedDefinedTypes.set(node.name, child); + visitedDefinedTypes.set(node.identifier, child); return child; }, @@ -94,7 +94,7 @@ export function getByteSizeVisitor( const linkedDefinedType = getLastNodeFromPath(linkedDefinedPath); // This prevents infinite recursion by assuming cyclic types don't have a fixed size. - if (definedTypeStack.includes(linkedDefinedType.name)) return null; + if (definedTypeStack.includes(linkedDefinedType.identifier)) return null; stack.pushPath(linkedDefinedPath); const result = visit(linkedDefinedType, self); diff --git a/packages/visitors-core/src/getDebugStringVisitor.ts b/packages/visitors-core/src/getDebugStringVisitor.ts index fe0bb8171..ac08c8d35 100644 --- a/packages/visitors-core/src/getDebugStringVisitor.ts +++ b/packages/visitors-core/src/getDebugStringVisitor.ts @@ -43,10 +43,10 @@ export function getDebugStringVisitor(options: { indent?: boolean; indentSeparat function getNodeDetails(node: Node): string[] { switch (node.kind) { case 'programNode': - return [node.name, node.publicKey]; + return [node.identifier, node.publicKey]; case 'instructionAccountNode': return [ - node.name, + node.identifier, ...(node.isWritable ? ['writable'] : []), ...(node.isSigner === true ? ['signer'] : []), ...(node.isSigner === 'either' ? ['optionalSigner'] : []), @@ -64,9 +64,9 @@ function getNodeDetails(node: Node): string[] { case 'instructionStatusNode': return [node.lifecycle, ...(node.message ? [node.message] : [])]; case 'errorNode': - return [node.code.toString(), node.name]; + return [node.code.toString(), node.identifier]; case 'constantNode': - return [node.name]; + return [node.identifier]; case 'accountLinkNode': case 'definedTypeLinkNode': case 'instructionAccountLinkNode': @@ -74,7 +74,7 @@ function getNodeDetails(node: Node): string[] { case 'instructionLinkNode': case 'pdaLinkNode': case 'programLinkNode': - return [node.name]; + return [node.identifier]; case 'numberTypeNode': return [node.format, ...(node.endian === 'be' ? ['bigEndian'] : [])]; case 'amountTypeNode': @@ -112,6 +112,6 @@ function getNodeDetails(node: Node): string[] { case 'postOffsetTypeNode': return [node.offset.toString(), node.strategy ?? 'relative']; default: - return 'name' in node ? [node.name] : []; + return 'identifier' in node ? [node.identifier] : []; } } diff --git a/packages/visitors-core/src/getMaxByteSizeVisitor.ts b/packages/visitors-core/src/getMaxByteSizeVisitor.ts index 0c3daca97..1d01c1369 100644 --- a/packages/visitors-core/src/getMaxByteSizeVisitor.ts +++ b/packages/visitors-core/src/getMaxByteSizeVisitor.ts @@ -69,13 +69,13 @@ export function getMaxByteSizeVisitor( }, visitDefinedType(node, { self }) { - if (visitedDefinedTypes.has(node.name)) { - return visitedDefinedTypes.get(node.name)!; + if (visitedDefinedTypes.has(node.identifier)) { + return visitedDefinedTypes.get(node.identifier)!; } - definedTypeStack.push(node.name); + definedTypeStack.push(node.identifier); const child = visit(node.type, self); definedTypeStack.pop(); - visitedDefinedTypes.set(node.name, child); + visitedDefinedTypes.set(node.identifier, child); return child; }, @@ -86,7 +86,7 @@ export function getMaxByteSizeVisitor( const linkedDefinedType = getLastNodeFromPath(linkedDefinedPath); // This prevents infinite recursion by assuming cyclic types don't have a fixed size. - if (definedTypeStack.includes(linkedDefinedType.name)) return null; + if (definedTypeStack.includes(linkedDefinedType.identifier)) return null; stack.pushPath(linkedDefinedPath); const result = visit(linkedDefinedType, self); diff --git a/packages/visitors-core/src/getResolvedInstructionInputsVisitor.ts b/packages/visitors-core/src/getResolvedInstructionInputsVisitor.ts index 846acd0a7..47b91f223 100644 --- a/packages/visitors-core/src/getResolvedInstructionInputsVisitor.ts +++ b/packages/visitors-core/src/getResolvedInstructionInputsVisitor.ts @@ -49,23 +49,23 @@ export function getResolvedInstructionInputsVisitor( function resolveInstructionInput(instruction: InstructionNode, input: InstructionInput): void { // Ensure we don't visit the same input twice. if ( - (isNode(input, 'instructionAccountNode') && visitedAccounts.has(input.name)) || - (isNode(input, 'instructionArgumentNode') && visitedArgs.has(input.name)) + (isNode(input, 'instructionAccountNode') && visitedAccounts.has(input.identifier)) || + (isNode(input, 'instructionArgumentNode') && visitedArgs.has(input.identifier)) ) { return; } // Ensure we don't have a circular dependency. - const isCircular = stack.some(({ kind, name }) => kind === input.kind && name === input.name); + const isCircular = stack.some(({ kind, identifier }) => kind === input.kind && identifier === input.identifier); if (isCircular) { const cycle = [...stack, input]; throw new CodamaError( CODAMA_ERROR__VISITORS__CYCLIC_DEPENDENCY_DETECTED_WHEN_RESOLVING_INSTRUCTION_DEFAULT_VALUES, { cycle, - formattedCycle: cycle.map(({ name }) => name).join(' -> '), + formattedCycle: cycle.map(({ identifier }) => identifier).join(' -> '), instruction, - instructionName: instruction.name, + instructionName: instruction.identifier, }, ); } @@ -81,9 +81,9 @@ export function getResolvedInstructionInputsVisitor( // Store the resolved input. resolved.push(localResolved); if (localResolved.kind === 'instructionAccountNode') { - visitedAccounts.set(input.name, localResolved); + visitedAccounts.set(input.identifier, localResolved); } else { - visitedArgs.set(input.name, localResolved); + visitedArgs.set(input.identifier, localResolved); } } @@ -101,7 +101,7 @@ export function getResolvedInstructionInputsVisitor( isPda: getAllInstructionArguments(instruction).some( argument => isNode(argument.defaultValue, 'accountBumpValueNode') && - argument.defaultValue.name === account.name, + argument.defaultValue.identifier === account.identifier, ), resolvedIsOptional: !!account.isOptional, resolvedIsSigner: account.isSigner, @@ -109,7 +109,7 @@ export function getResolvedInstructionInputsVisitor( switch (localResolved.defaultValue?.kind) { case 'accountValueNode': - const defaultAccount = visitedAccounts.get(localResolved.defaultValue.name)!; + const defaultAccount = visitedAccounts.get(localResolved.defaultValue.identifier)!; const resolvedIsPublicKey = account.isSigner === false && defaultAccount.isSigner === false; const resolvedIsSigner = account.isSigner === true && defaultAccount.isSigner === true; const resolvedIsOptionalSigner = !resolvedIsPublicKey && !resolvedIsSigner; @@ -128,17 +128,17 @@ export function getResolvedInstructionInputsVisitor( const { seeds } = localResolved.defaultValue; (seeds ?? []).forEach(seed => { if (!isNode(seed.value, 'accountValueNode')) return; - const dependency = visitedAccounts.get(seed.value.name)!; + const dependency = visitedAccounts.get(seed.value.identifier)!; if (dependency.resolvedIsOptional) { throw new CodamaError(CODAMA_ERROR__VISITORS__CANNOT_USE_OPTIONAL_ACCOUNT_AS_PDA_SEED_VALUE, { instruction: instruction, instructionAccount: account, - instructionAccountName: account.name, - instructionName: instruction.name, + instructionAccountName: account.identifier, + instructionName: instruction.identifier, // The guard above narrows `seed.value`, which TS does not propagate to `seed` itself. seed: seed as PdaSeedValueNode, - seedName: seed.name, - seedValueName: seed.value.name, + seedName: seed.identifier, + seedValueName: seed.value.identifier, }); } }); @@ -174,23 +174,25 @@ export function getResolvedInstructionInputsVisitor( dependencies.forEach(dependency => { let input: InstructionInput | null = null; if (isNode(dependency, 'accountValueNode')) { - const dependencyAccount = (instruction.accounts ?? []).find(a => a.name === dependency.name); + const dependencyAccount = (instruction.accounts ?? []).find( + a => a.identifier === dependency.identifier, + ); if (!dependencyAccount) { throw new CodamaError(CODAMA_ERROR__VISITORS__INVALID_INSTRUCTION_DEFAULT_VALUE_DEPENDENCY, { dependency, dependencyKind: dependency.kind, - dependencyName: dependency.name, + dependencyName: dependency.identifier, instruction, - instructionName: instruction.name, + instructionName: instruction.identifier, parent, parentKind: parent.kind, - parentName: parent.name, + parentName: parent.identifier, }); } input = { ...dependencyAccount }; } else if (isNode(dependency, 'argumentValueNode')) { const dependencyArgument = getAllInstructionArguments(instruction).find( - a => a.name === dependency.name, + a => a.identifier === dependency.name, ); if (!dependencyArgument) { throw new CodamaError(CODAMA_ERROR__VISITORS__INVALID_INSTRUCTION_DEFAULT_VALUE_DEPENDENCY, { @@ -198,10 +200,10 @@ export function getResolvedInstructionInputsVisitor( dependencyKind: dependency.kind, dependencyName: dependency.name, instruction, - instructionName: instruction.name, + instructionName: instruction.identifier, parent, parentKind: parent.kind, - parentName: parent.name, + parentName: parent.identifier, }); } input = { ...dependencyArgument }; @@ -242,7 +244,7 @@ export function deduplicateInstructionDependencies(dependencies: InstructionDepe const args = new Map(); dependencies.forEach(dependency => { if (isNode(dependency, 'accountValueNode')) { - accounts.set(dependency.name, dependency); + accounts.set(dependency.identifier, dependency); } else if (isNode(dependency, 'argumentValueNode')) { args.set(dependency.name, dependency); } @@ -267,7 +269,7 @@ export function getInstructionDependencies(input: InstructionInput | Instruction }; if (isNode(input.defaultValue, ['accountValueNode', 'accountBumpValueNode'])) { - return [accountValueNode(input.defaultValue.name)]; + return [accountValueNode(input.defaultValue.identifier)]; } if (isNode(input.defaultValue, ['argumentValueNode'])) { diff --git a/packages/visitors-core/src/identityVisitor.ts b/packages/visitors-core/src/identityVisitor.ts index 142f9c01d..008aad2a7 100644 --- a/packages/visitors-core/src/identityVisitor.ts +++ b/packages/visitors-core/src/identityVisitor.ts @@ -60,13 +60,13 @@ export function identityVisitor( overrides.visitEnumStructVariantType = function visitEnumStructVariantType(node, { self }) { const newStruct = visit(self)(node.struct); if (!newStruct) { - return enumEmptyVariantTypeNode(node.name); + return enumEmptyVariantTypeNode(node.identifier); } assertIsNode(newStruct, 'structTypeNode'); if ((newStruct.fields ?? []).length === 0) { - return enumEmptyVariantTypeNode(node.name); + return enumEmptyVariantTypeNode(node.identifier); } - return enumStructVariantTypeNode(node.name, newStruct, node.discriminator); + return enumStructVariantTypeNode(node.identifier, newStruct, node.discriminator); }; } @@ -74,13 +74,13 @@ export function identityVisitor( overrides.visitEnumTupleVariantType = function visitEnumTupleVariantType(node, { self }) { const newTuple = visit(self)(node.tuple); if (!newTuple) { - return enumEmptyVariantTypeNode(node.name); + return enumEmptyVariantTypeNode(node.identifier); } assertIsNode(newTuple, 'tupleTypeNode'); if ((newTuple.items ?? []).length === 0) { - return enumEmptyVariantTypeNode(node.name); + return enumEmptyVariantTypeNode(node.identifier); } - return enumTupleVariantTypeNode(node.name, newTuple, node.discriminator); + return enumTupleVariantTypeNode(node.identifier, newTuple, node.discriminator); }; } diff --git a/packages/visitors/src/addPdasVisitor.ts b/packages/visitors/src/addPdasVisitor.ts index 425845a62..3926d99fd 100644 --- a/packages/visitors/src/addPdasVisitor.ts +++ b/packages/visitors/src/addPdasVisitor.ts @@ -10,21 +10,21 @@ export function addPdasVisitor(pdas: Record { assertIsNode(node, 'programNode'); - const existingPdaNames = new Set((node.pdas ?? []).map(pda => pda.name)); - const newPdaNames = new Set(newPdas.map(pda => pda.name)); + const existingPdaNames = new Set((node.pdas ?? []).map(pda => pda.identifier)); + const newPdaNames = new Set(newPdas.map(pda => pda.identifier)); const overlappingPdaNames = new Set([...existingPdaNames].filter(name => newPdaNames.has(name))); if (overlappingPdaNames.size > 0) { throw new CodamaError(CODAMA_ERROR__VISITORS__CANNOT_ADD_DUPLICATED_PDA_NAMES, { duplicatedPdaNames: [...overlappingPdaNames], program: node, - programName: node.name, + programName: node.identifier, }); } return programNode({ ...node, pdas: [ ...(node.pdas ?? []), - ...newPdas.map(({ name, seeds, docs }) => pdaNode({ docs, name, seeds })), + ...newPdas.map(({ identifier, seeds, docs }) => pdaNode({ docs, identifier, seeds })), ], }); }, diff --git a/packages/visitors/src/createSubInstructionsFromEnumArgsVisitor.ts b/packages/visitors/src/createSubInstructionsFromEnumArgsVisitor.ts index cea550c01..5f376794e 100644 --- a/packages/visitors/src/createSubInstructionsFromEnumArgsVisitor.ts +++ b/packages/visitors/src/createSubInstructionsFromEnumArgsVisitor.ts @@ -31,13 +31,13 @@ export function createSubInstructionsFromEnumArgsVisitor(map: Record field.name === argName); + const argFieldIndex = argFields.findIndex(field => field.identifier === argName); const argField = argFieldIndex >= 0 ? argFields[argFieldIndex] : null; if (!argField) { throw new CodamaError(CODAMA_ERROR__VISITORS__INSTRUCTION_ENUM_ARGUMENT_NOT_FOUND, { argumentName: argName, instruction: node, - instructionName: node.name, + instructionName: node.identifier, }); } @@ -55,18 +55,18 @@ export function createSubInstructionsFromEnumArgsVisitor(map: Record { - const subName = camelCase(`${node.name} ${variant.name}`); + const subName = camelCase(`${node.identifier} ${variant.identifier}`); const subFields = argFields.slice(0, argFieldIndex); subFields.push( instructionArgumentNode({ defaultValue: numberValueNode(index), defaultValueStrategy: 'omitted', - name: `${subName}Discriminator`, + identifier: `${subName}Discriminator`, type: numberTypeNode('u8'), }), ); @@ -90,7 +90,7 @@ export function createSubInstructionsFromEnumArgsVisitor(map: Record { (program.definedTypes ?? []).forEach(type => { const typeWithProgram = { program, type }; - const list = typeMap.get(type.name) ?? []; - typeMap.set(type.name, [...list, typeWithProgram]); + const list = typeMap.get(type.identifier) ?? []; + typeMap.set(type.identifier, [...list, typeWithProgram]); }); }); @@ -53,7 +53,10 @@ export function deduplicateIdenticalDefinedTypesVisitor() { return sortedListTail; }) // Get selectors from the defined types and their programs. - .map(({ program, type }): NodeSelector => `[programNode]${program.name}.[definedTypeNode]${type.name}`); + .map( + ({ program, type }): NodeSelector => + `[programNode]${program.identifier}.[definedTypeNode]${type.identifier}`, + ); // Delete the identified nodes if any. if (deleteSelectors.length > 0) { diff --git a/packages/visitors/src/fillDefaultPdaSeedValuesVisitor.ts b/packages/visitors/src/fillDefaultPdaSeedValuesVisitor.ts index 511d6d183..64d38633e 100644 --- a/packages/visitors/src/fillDefaultPdaSeedValuesVisitor.ts +++ b/packages/visitors/src/fillDefaultPdaSeedValuesVisitor.ts @@ -55,9 +55,9 @@ export function fillDefaultPdaSeedValuesVisitor( if (strictMode && !allSeedsAreValid(instruction, foundPda, seeds)) { throw new CodamaError(CODAMA_ERROR__VISITORS__INVALID_PDA_SEED_VALUES, { instruction, - instructionName: instruction.name, + instructionName: instruction.identifier, pda: foundPda, - pdaName: foundPda.name, + pdaName: foundPda.identifier, }); } return pdaValueNode(visitedNode.pda, seeds); @@ -71,9 +71,9 @@ function addDefaultSeedValuesFromPdaWhenMissing( pda: PdaNode, existingSeeds: PdaSeedValueNode[], ): PdaSeedValueNode[] { - const existingSeedNames = new Set(existingSeeds.map(seed => seed.name)); + const existingSeedNames = new Set(existingSeeds.map(seed => seed.identifier)); const defaultSeeds = getDefaultSeedValuesFromPda(instruction, pda).filter( - seed => !existingSeedNames.has(seed.name), + seed => !existingSeedNames.has(seed.identifier), ); return [...existingSeeds, ...defaultSeeds]; } @@ -82,14 +82,14 @@ function getDefaultSeedValuesFromPda(instruction: InstructionNode, pda: PdaNode) return (pda.seeds ?? []).flatMap((seed): PdaSeedValueNode[] => { if (!isNode(seed, 'variablePdaSeedNode')) return []; - const hasMatchingAccount = (instruction.accounts ?? []).some(a => a.name === seed.name); + const hasMatchingAccount = (instruction.accounts ?? []).some(a => a.identifier === seed.identifier); if (isNode(seed.type, 'publicKeyTypeNode') && hasMatchingAccount) { - return [pdaSeedValueNode(seed.name, accountValueNode(seed.name))]; + return [pdaSeedValueNode(seed.identifier, accountValueNode(seed.identifier))]; } - const hasMatchingArgument = getAllInstructionArguments(instruction).some(a => a.name === seed.name); + const hasMatchingArgument = getAllInstructionArguments(instruction).some(a => a.identifier === seed.identifier); if (hasMatchingArgument) { - return [pdaSeedValueNode(seed.name, argumentValueNode(seed.name))]; + return [pdaSeedValueNode(seed.identifier, argumentValueNode(seed.identifier))]; } return []; @@ -99,11 +99,11 @@ function getDefaultSeedValuesFromPda(instruction: InstructionNode, pda: PdaNode) function allSeedsAreValid(instruction: InstructionNode, foundPda: PdaNode, seeds: PdaSeedValueNode[]) { const hasAllVariableSeeds = (foundPda.seeds ?? []).filter(isNodeFilter('variablePdaSeedNode')).length === seeds.length; - const allAccountsName = (instruction.accounts ?? []).map(a => a.name); - const allArgumentsName = getAllInstructionArguments(instruction).map(a => a.name); + const allAccountsName = (instruction.accounts ?? []).map(a => a.identifier); + const allArgumentsName = getAllInstructionArguments(instruction).map(a => a.identifier); const validSeeds = seeds.every(seed => { if (isNode(seed.value, 'accountValueNode')) { - return allAccountsName.includes(seed.value.name); + return allAccountsName.includes(seed.value.identifier); } if (isNode(seed.value, 'argumentValueNode')) { return allArgumentsName.includes(seed.value.name); diff --git a/packages/visitors/src/flattenInstructionDataArgumentsVisitor.ts b/packages/visitors/src/flattenInstructionDataArgumentsVisitor.ts index c1fd7614c..f3ab2f7de 100644 --- a/packages/visitors/src/flattenInstructionDataArgumentsVisitor.ts +++ b/packages/visitors/src/flattenInstructionDataArgumentsVisitor.ts @@ -32,7 +32,7 @@ export const flattenInstructionArguments = ( ): InstructionArgumentNode[] => { const camelCaseOptions = options === '*' ? options : options.map(camelCase); const shouldInline = (node: InstructionArgumentNode): boolean => - options === '*' || camelCaseOptions.includes(camelCase(node.name)); + options === '*' || camelCaseOptions.includes(camelCase(node.identifier)); const inlinedArguments = nodes.flatMap(node => { if (isNode(node.type, 'structTypeNode') && shouldInline(node)) { return (node.type.fields ?? []).map(field => instructionArgumentNode({ ...field })); @@ -40,7 +40,7 @@ export const flattenInstructionArguments = ( return node; }); - const inlinedFieldsNames = inlinedArguments.map(arg => arg.name); + const inlinedFieldsNames = inlinedArguments.map(arg => arg.identifier); const duplicates = inlinedFieldsNames.filter((e, i, a) => a.indexOf(e) !== i); const uniqueDuplicates = [...new Set(duplicates)]; const hasConflictingNames = uniqueDuplicates.length > 0; diff --git a/packages/visitors/src/flattenStructVisitor.ts b/packages/visitors/src/flattenStructVisitor.ts index 821eba78a..5b589c31f 100644 --- a/packages/visitors/src/flattenStructVisitor.ts +++ b/packages/visitors/src/flattenStructVisitor.ts @@ -25,7 +25,7 @@ export const flattenStruct = (node: Node, options: FlattenStructOptions = '*'): assertIsNode(node, 'structTypeNode'); const camelCaseOptions = options === '*' ? options : options.map(camelCase); const shouldInline = (field: StructFieldTypeNode): boolean => - options === '*' || camelCaseOptions.includes(camelCase(field.name)); + options === '*' || camelCaseOptions.includes(camelCase(field.identifier)); const inlinedFields = (node.fields ?? []).flatMap(field => { if (isNode(field.type, 'structTypeNode') && shouldInline(field)) { return field.type.fields ?? []; @@ -33,7 +33,7 @@ export const flattenStruct = (node: Node, options: FlattenStructOptions = '*'): return [field]; }); - const inlinedFieldsNames = inlinedFields.map(arg => arg.name); + const inlinedFieldsNames = inlinedFields.map(arg => arg.identifier); const duplicates = inlinedFieldsNames.filter((e, i, a) => a.indexOf(e) !== i); const uniqueDuplicates = [...new Set(duplicates)]; const hasConflictingNames = uniqueDuplicates.length > 0; diff --git a/packages/visitors/src/getDefinedTypeHistogramVisitor.ts b/packages/visitors/src/getDefinedTypeHistogramVisitor.ts index 4c97ddd21..207c57ad9 100644 --- a/packages/visitors/src/getDefinedTypeHistogramVisitor.ts +++ b/packages/visitors/src/getDefinedTypeHistogramVisitor.ts @@ -83,7 +83,7 @@ export function getDefinedTypeHistogramVisitor(): Visitor visitDefinedTypeLink(node) { const program = findProgramNodeFromPath(stack.getPath()); - const key = program ? `${program.name}.${node.name}` : node.name; + const key = program ? `${program.identifier}.${node.identifier}` : node.identifier; return { [key]: { directlyAsInstructionArgs: Number(mode === 'instruction' && stackLevel <= 1), diff --git a/packages/visitors/src/renameHelpers.ts b/packages/visitors/src/renameHelpers.ts index d04442295..783301a5b 100644 --- a/packages/visitors/src/renameHelpers.ts +++ b/packages/visitors/src/renameHelpers.ts @@ -14,7 +14,7 @@ import { export function renameStructNode(node: StructTypeNode, map: Record): StructTypeNode { return structTypeNode( (node.fields ?? []).map(field => - map[field.name] ? structFieldTypeNode({ ...field, name: map[field.name] }) : field, + map[field.identifier] ? structFieldTypeNode({ ...field, identifier: map[field.identifier] }) : field, ), ); } @@ -22,7 +22,7 @@ export function renameStructNode(node: StructTypeNode, map: Record): EnumTypeNode { return enumTypeNode( (node.variants ?? []).map(variant => - map[variant.name] ? renameEnumVariant(variant, map[variant.name]) : variant, + map[variant.identifier] ? renameEnumVariant(variant, map[variant.identifier]) : variant, ), { ...node }, ); diff --git a/packages/visitors/src/setAccountDiscriminatorFromFieldVisitor.ts b/packages/visitors/src/setAccountDiscriminatorFromFieldVisitor.ts index 449280a27..2509847a7 100644 --- a/packages/visitors/src/setAccountDiscriminatorFromFieldVisitor.ts +++ b/packages/visitors/src/setAccountDiscriminatorFromFieldVisitor.ts @@ -23,12 +23,12 @@ export function setAccountDiscriminatorFromFieldVisitor( const accountData = resolveNestedTypeNode(node.data); const accountFields = accountData.fields ?? []; - const fieldIndex = accountFields.findIndex(f => f.name === field); + const fieldIndex = accountFields.findIndex(f => f.identifier === field); if (fieldIndex < 0) { throw new CodamaError(CODAMA_ERROR__VISITORS__ACCOUNT_FIELD_NOT_FOUND, { account: node, missingField: camelCase(field), - name: node.name, + name: node.identifier, }); } diff --git a/packages/visitors/src/setInstructionAccountDefaultValuesVisitor.ts b/packages/visitors/src/setInstructionAccountDefaultValuesVisitor.ts index 7ae2626f0..302f41b88 100644 --- a/packages/visitors/src/setInstructionAccountDefaultValuesVisitor.ts +++ b/packages/visitors/src/setInstructionAccountDefaultValuesVisitor.ts @@ -153,12 +153,12 @@ export function setInstructionAccountDefaultValuesVisitor(rules: InstructionAcco account: InstructionAccountNode, ): InstructionAccountDefaultRule | undefined { return sortedRules.find(rule => { - if ('instruction' in rule && rule.instruction && camelCase(rule.instruction) !== instruction.name) { + if ('instruction' in rule && rule.instruction && camelCase(rule.instruction) !== instruction.identifier) { return false; } return typeof rule.account === 'string' - ? camelCase(rule.account) === account.name - : rule.account.test(account.name); + ? camelCase(rule.account) === account.identifier + : rule.account.test(account.identifier); }); } diff --git a/packages/visitors/src/setInstructionDiscriminatorsVisitor.ts b/packages/visitors/src/setInstructionDiscriminatorsVisitor.ts index 74a695e80..98eda168b 100644 --- a/packages/visitors/src/setInstructionDiscriminatorsVisitor.ts +++ b/packages/visitors/src/setInstructionDiscriminatorsVisitor.ts @@ -31,7 +31,7 @@ export function setInstructionDiscriminatorsVisitor(map: Record { assertIsNode(node, 'structTypeNode'); const fields = (node.fields ?? []).map((field): StructFieldTypeNode => { - const defaultValue = camelCasedDefaultValues[field.name]; + const defaultValue = camelCasedDefaultValues[field.identifier]; if (defaultValue === undefined) return field; if (defaultValue === null) { return structFieldTypeNode({ @@ -50,7 +50,7 @@ export function setStructDefaultValuesVisitor(map: StructDefaultValueMap) { transform: node => { assertIsNode(node, 'instructionNode'); const transformArguments = (arg: InstructionArgumentNode): InstructionArgumentNode => { - const defaultValue = camelCasedDefaultValues[arg.name]; + const defaultValue = camelCasedDefaultValues[arg.identifier]; if (defaultValue === undefined) return arg; if (defaultValue === null) { return instructionArgumentNode({ diff --git a/packages/visitors/src/transformDefinedTypesIntoAccountsVisitor.ts b/packages/visitors/src/transformDefinedTypesIntoAccountsVisitor.ts index e942f0e8d..1b31e081c 100644 --- a/packages/visitors/src/transformDefinedTypesIntoAccountsVisitor.ts +++ b/packages/visitors/src/transformDefinedTypesIntoAccountsVisitor.ts @@ -5,9 +5,13 @@ export function transformDefinedTypesIntoAccountsVisitor(definedTypes: string[]) return pipe(nonNullableIdentityVisitor({ keys: ['rootNode', 'programNode'] }), v => extendVisitor(v, { visitProgram(program) { - const typesToExtract = (program.definedTypes ?? []).filter(node => definedTypes.includes(node.name)); + const typesToExtract = (program.definedTypes ?? []).filter(node => + definedTypes.includes(node.identifier), + ); - const newDefinedTypes = (program.definedTypes ?? []).filter(node => !definedTypes.includes(node.name)); + const newDefinedTypes = (program.definedTypes ?? []).filter( + node => !definedTypes.includes(node.identifier), + ); const newAccounts = typesToExtract.map(node => { assertIsNode(node.type, 'structTypeNode'); diff --git a/packages/visitors/src/unwrapDefinedTypesVisitor.ts b/packages/visitors/src/unwrapDefinedTypesVisitor.ts index b1b6ce66d..9ad7dbcc2 100644 --- a/packages/visitors/src/unwrapDefinedTypesVisitor.ts +++ b/packages/visitors/src/unwrapDefinedTypesVisitor.ts @@ -32,8 +32,9 @@ export function unwrapDefinedTypesVisitor(typesToInline: string[] | '*' = '*') { v => extendVisitor(v, { visitDefinedTypeLink(linkType, { self }) { - const programName = linkType.program?.name ?? findProgramNodeFromPath(stack.getPath())?.name; - if (!shouldInline(linkType.name, programName)) { + const programName = + linkType.program?.identifier ?? findProgramNodeFromPath(stack.getPath())?.identifier; + if (!shouldInline(linkType.identifier, programName)) { return linkType; } const definedTypePath = linkables.getPathOrThrow(stack.getPath('definedTypeLinkNode')); @@ -52,7 +53,7 @@ export function unwrapDefinedTypesVisitor(typesToInline: string[] | '*' = '*') { .map(account => visit(account, self)) .filter(assertIsNodeFilter('accountNode')), definedTypes: (program.definedTypes ?? []) - .filter(definedType => !shouldInline(definedType.name, program.name)) + .filter(definedType => !shouldInline(definedType.identifier, program.identifier)) .map(type => visit(type, self)) .filter(assertIsNodeFilter('definedTypeNode')), instructions: (program.instructions ?? []) diff --git a/packages/visitors/src/unwrapTupleEnumWithSingleStructVisitor.ts b/packages/visitors/src/unwrapTupleEnumWithSingleStructVisitor.ts index 6faa9cb6d..81fe5e279 100644 --- a/packages/visitors/src/unwrapTupleEnumWithSingleStructVisitor.ts +++ b/packages/visitors/src/unwrapTupleEnumWithSingleStructVisitor.ts @@ -34,7 +34,7 @@ export function unwrapTupleEnumWithSingleStructVisitor(enumsOrVariantsToUnwrap: return rootNodeVisitor(root => { const typesToPotentiallyUnwrap: string[] = []; const definedTypes: Map = new Map( - getAllDefinedTypes(root).map(definedType => [definedType.name, definedType]), + getAllDefinedTypes(root).map(definedType => [definedType.identifier, definedType]), ); let newRoot = visit( @@ -50,15 +50,15 @@ export function unwrapTupleEnumWithSingleStructVisitor(enumsOrVariantsToUnwrap: if (tupleItems.length !== 1) return node; let item = tupleItems[0]; if (isNode(item, 'definedTypeLinkNode')) { - const definedType = definedTypes.get(item.name); + const definedType = definedTypes.get(item.identifier); if (!definedType) return node; if (!isNode(definedType.type, 'structTypeNode')) return node; - typesToPotentiallyUnwrap.push(item.name); + typesToPotentiallyUnwrap.push(item.identifier); item = definedType.type; } if (!isNode(item, 'structTypeNode')) return node; const nestedStruct = transformNestedTypeNode(node.tuple, () => item as StructTypeNode); - return enumStructVariantTypeNode(node.name, nestedStruct); + return enumStructVariantTypeNode(node.identifier, nestedStruct); }, }, ]), diff --git a/packages/visitors/src/updateAccountsVisitor.ts b/packages/visitors/src/updateAccountsVisitor.ts index 3cc96aee0..a5c96d2a7 100644 --- a/packages/visitors/src/updateAccountsVisitor.ts +++ b/packages/visitors/src/updateAccountsVisitor.ts @@ -31,7 +31,9 @@ export function updateAccountsVisitor(map: Record) { return bottomUpTransformerVisitor( Object.entries(map).flatMap(([selector, updates]) => { const newName = - typeof updates === 'object' && 'name' in updates && updates.name ? camelCase(updates.name) : undefined; + typeof updates === 'object' && 'identifier' in updates && updates.identifier + ? camelCase(updates.identifier) + : undefined; const pdasToUpsert = [] as { pda: PdaNode; program: CamelCaseString }[]; const transformers: BottomUpNodeTransformerWithSelector[] = [ @@ -47,21 +49,21 @@ export function updateAccountsVisitor(map: Record) { if (pda && seeds !== undefined) { newPda = pda; pdasToUpsert.push({ - pda: pdaNode({ name: pda.name, seeds }), - program: programNode.name, + pda: pdaNode({ identifier: pda.identifier, seeds }), + program: programNode.identifier, }); } else if (pda) { newPda = pda; } else if (seeds !== undefined && node.pda) { pdasToUpsert.push({ - pda: pdaNode({ name: node.pda.name, seeds }), - program: programNode.name, + pda: pdaNode({ identifier: node.pda.identifier, seeds }), + program: programNode.identifier, }); } else if (seeds !== undefined) { - newPda = pdaLinkNode(newName ?? node.name); + newPda = pdaLinkNode(newName ?? node.identifier); pdasToUpsert.push({ - pda: pdaNode({ name: newName ?? node.name, seeds }), - program: programNode.name, + pda: pdaNode({ identifier: newName ?? node.identifier, seeds }), + program: programNode.identifier, }); } @@ -80,15 +82,20 @@ export function updateAccountsVisitor(map: Record) { transform: node => { assertIsNode(node, 'programNode'); const pdasToUpsertForProgram = pdasToUpsert - .filter(p => p.program === node.name) + .filter(p => p.program === node.identifier) .map(p => p.pda); if (pdasToUpsertForProgram.length === 0) return node; - const existingPdaNames = new Set((node.pdas ?? []).map(pda => pda.name)); - const pdasToCreate = pdasToUpsertForProgram.filter(p => !existingPdaNames.has(p.name)); + const existingPdaNames = new Set((node.pdas ?? []).map(pda => pda.identifier)); + const pdasToCreate = pdasToUpsertForProgram.filter(p => !existingPdaNames.has(p.identifier)); const pdasToUpdate = new Map( - pdasToUpsertForProgram.filter(p => existingPdaNames.has(p.name)).map(p => [p.name, p]), + pdasToUpsertForProgram + .filter(p => existingPdaNames.has(p.identifier)) + .map(p => [p.identifier, p]), ); - const newPdas = [...(node.pdas ?? []).map(p => pdasToUpdate.get(p.name) ?? p), ...pdasToCreate]; + const newPdas = [ + ...(node.pdas ?? []).map(p => pdasToUpdate.get(p.identifier) ?? p), + ...pdasToCreate, + ]; return programNode({ ...node, pdas: newPdas }); }, }, @@ -107,7 +114,7 @@ export function updateAccountsVisitor(map: Record) { select: ['[pdaNode]', selector], transform: node => { assertIsNode(node, 'pdaNode'); - return pdaNode({ name: newName, seeds: node.seeds }); + return pdaNode({ identifier: newName, seeds: node.seeds }); }, }, { diff --git a/packages/visitors/src/updateDefinedTypesVisitor.ts b/packages/visitors/src/updateDefinedTypesVisitor.ts index adcfd2786..a0c592233 100644 --- a/packages/visitors/src/updateDefinedTypesVisitor.ts +++ b/packages/visitors/src/updateDefinedTypesVisitor.ts @@ -20,7 +20,9 @@ export function updateDefinedTypesVisitor(map: Record { const newName = - typeof updates === 'object' && 'name' in updates && updates.name ? camelCase(updates.name) : undefined; + typeof updates === 'object' && 'identifier' in updates && updates.identifier + ? camelCase(updates.identifier) + : undefined; const transformers: BottomUpNodeTransformerWithSelector[] = [ { @@ -40,7 +42,7 @@ export function updateDefinedTypesVisitor(map: Record(); const newArguments = (instruction.arguments ?? []).map(node => { - const argUpdate = argUpdates[node.name]; + const argUpdate = argUpdates[node.identifier]; if (!argUpdate) return node; - usedArguments.add(node.name); + usedArguments.add(node.identifier); return instructionArgumentNode({ ...node, defaultValue: argUpdate.defaultValue ?? node.defaultValue, defaultValueStrategy: argUpdate.defaultValueStrategy ?? node.defaultValueStrategy, docs: argUpdate.docs ?? node.docs, - name: argUpdate.name ?? node.name, + identifier: argUpdate.identifier ?? node.identifier, type: argUpdate.type ?? node.type, }); }); const updatedExtraArguments = (instruction.extraArguments ?? []).map(node => { - if (usedArguments.has(node.name)) return node; - const argUpdate = argUpdates[node.name]; + if (usedArguments.has(node.identifier)) return node; + const argUpdate = argUpdates[node.identifier]; if (!argUpdate) return node; - usedArguments.add(node.name); + usedArguments.add(node.identifier); return instructionArgumentNode({ ...node, defaultValue: argUpdate.defaultValue ?? node.defaultValue, defaultValueStrategy: argUpdate.defaultValueStrategy ?? node.defaultValueStrategy, docs: argUpdate.docs ?? node.docs, - name: argUpdate.name ?? node.name, + identifier: argUpdate.identifier ?? node.identifier, type: argUpdate.type ?? node.type, }); }); @@ -156,7 +156,7 @@ function handleInstructionArguments( defaultValue: argUpdate.defaultValue ?? undefined, defaultValueStrategy: argUpdate.defaultValueStrategy ?? undefined, docs: argUpdate.docs ?? [], - name: argUpdate.name ?? argName, + identifier: argUpdate.identifier ?? argName, type, }); }), diff --git a/packages/visitors/src/updateProgramsVisitor.ts b/packages/visitors/src/updateProgramsVisitor.ts index d9fb15a1d..c38770a40 100644 --- a/packages/visitors/src/updateProgramsVisitor.ts +++ b/packages/visitors/src/updateProgramsVisitor.ts @@ -9,7 +9,9 @@ export function updateProgramsVisitor(map: Record) { return bottomUpTransformerVisitor( Object.entries(map).flatMap(([name, updates]): BottomUpNodeTransformerWithSelector[] => { const newName = - typeof updates === 'object' && 'name' in updates && updates.name ? camelCase(updates.name) : undefined; + typeof updates === 'object' && 'identifier' in updates && updates.identifier + ? camelCase(updates.identifier) + : undefined; const transformers: BottomUpNodeTransformerWithSelector[] = [ {