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

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions clients/js/src/generated/instructions/execute.ts
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ import {
type ResolvedInstructionAccount,
type ResolvedInstructionAccountMeta,
} from '@solana/kit/program-client-core';
import { resolveMessageAccounts } from '../../hooked';
import { resolveExecutionMessageAccounts } from '../../hooked';
import { MESSAGE_EXECUTOR_PROGRAM_ADDRESS } from '../programs';

export const EXECUTE_DISCRIMINATOR = 0;
Expand Down Expand Up @@ -147,7 +147,7 @@ export function getExecuteInstruction<
}

// Remaining accounts.
const remainingAccounts: AccountMeta[] = resolveMessageAccounts(resolverScope);
const remainingAccounts: AccountMeta[] = resolveExecutionMessageAccounts(resolverScope);

return Object.freeze({
accounts: [
Expand Down
4 changes: 2 additions & 2 deletions clients/js/src/generated/instructions/submit.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ import {
type InstructionWithData,
type ReadonlyUint8Array,
} from '@solana/kit';
import { resolveSubmitMessageAccounts } from '../../hooked';
import { resolveAuthorizationMessageAccounts } from '../../hooked';
import { ED25519_SIGNER_PROGRAM_ADDRESS } from '../programs';

export const SUBMIT_DISCRIMINATOR = 0;
Expand Down Expand Up @@ -93,7 +93,7 @@ export function getSubmitInstruction<TProgramAddress extends Address = typeof ED
const resolverScope = { programAddress, args };

// Remaining accounts.
const remainingAccounts: AccountMeta[] = resolveSubmitMessageAccounts(resolverScope);
const remainingAccounts: AccountMeta[] = resolveAuthorizationMessageAccounts(resolverScope);

return Object.freeze({
accounts: remainingAccounts,
Expand Down
18 changes: 9 additions & 9 deletions clients/js/src/hooked/resolvers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,30 +19,30 @@ type V1CompiledTransactionMessage = Extract<CompiledTransactionMessage, { versio
const compiledMessageDecoder = createDecoderThatConsumesEntireByteArray(getCompiledTransactionMessageDecoder());

/**
* Resolves the remaining `Execute` accounts from the wrapped message's static account list.
* Resolves the remaining `Execute` accounts from the execution message's static account list.
* Accounts keep the order and permissions they would have in a normal Solana transaction.
* Throws for a message that is not v1, which the executor rejects.
*
* Mirrors `executor/client/src/instruction.rs`.
*/
export const resolveMessageAccounts = (scope: MessageAccountsResolverScope): AccountMeta[] => {
const message = decodeV1Message(scope.args.message, 'The message executor only supports v1 inner messages');
export const resolveExecutionMessageAccounts = (scope: MessageAccountsResolverScope): AccountMeta[] => {
const message = decodeV1Message(scope.args.message, 'The message executor only supports v1 execution messages');
return getStaticAccountMetas(message);
};

/**
* Resolves the remaining `Submit` accounts from the wrapped message's static account list.
* Account order and writable privileges match the wrapped message, while signer privileges are
* removed because the wrapped signers are not signers of the outer transaction.
* Resolves the remaining `Submit` accounts from the authorization message's static account list.
* Account order and writable privileges match the authorization message, while signer privileges
* are removed because the authorization message's signers do not sign the relay transaction.
* Throws for a message that is not v1, which the signer program rejects.
*
* Mirrors `signer/client/src/instruction.rs`.
*/
export const resolveSubmitMessageAccounts = (scope: MessageAccountsResolverScope): AccountMeta[] => {
const message = decodeV1Message(scope.args.message, 'The signer program only supports v1 wrapped messages');
export const resolveAuthorizationMessageAccounts = (scope: MessageAccountsResolverScope): AccountMeta[] => {
const message = decodeV1Message(scope.args.message, 'The signer program only supports v1 authorization messages');
return getStaticAccountMetas(message).map(account => ({
...account,
// Wrapped signatures authorize the wrapped message, not the outer transaction that submits it.
// Authority signatures cover the authorization message, not the relay transaction that submits it.
role: downgradeRoleToNonSigner(account.role),
}));
};
Expand Down
16 changes: 8 additions & 8 deletions clients/js/test/resolvers.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -146,7 +146,7 @@ const expectedSubmitAccounts = [
];

describe('remaining account resolvers', () => {
it('resolves account order and permissions for a v1 message', () => {
it('resolves account order and permissions for a v1 execution message', () => {
expect(getExecuteAccounts(getTestMessage(1))).toEqual([
{ address: NONCE_AUTHORITY.address, role: AccountRole.READONLY_SIGNER, signer: NONCE_AUTHORITY },
{ address: NONCE_ACCOUNT, role: AccountRole.WRITABLE },
Expand All @@ -155,19 +155,19 @@ describe('remaining account resolvers', () => {
]);
});

it('removes signer privileges from a submitted v1 message', () => {
it('removes signer privileges from a v1 authorization message', () => {
expect(getSubmitAccounts(getTestMessage(1))).toEqual(expectedSubmitAccounts);
});

it.each(UNSUPPORTED_MESSAGE_VERSIONS)('rejects a %s inner message', (version, label) => {
it.each(UNSUPPORTED_MESSAGE_VERSIONS)('rejects a %s execution message', (version, label) => {
expect(() => getExecuteAccounts(getTestMessage(version))).toThrow(
`The message executor only supports v1 inner messages, got a ${label} message`,
`The message executor only supports v1 execution messages, got a ${label} message`,
);
});

it.each(UNSUPPORTED_MESSAGE_VERSIONS)('rejects a submitted %s message', (version, label) => {
it.each(UNSUPPORTED_MESSAGE_VERSIONS)('rejects a %s authorization message', (version, label) => {
expect(() => getSubmitAccounts(getTestMessage(version))).toThrow(
`The signer program only supports v1 wrapped messages, got a ${label} message`,
`The signer program only supports v1 authorization messages, got a ${label} message`,
);
});

Expand Down Expand Up @@ -211,7 +211,7 @@ describe('remaining account resolvers', () => {
});
});

it('rejects trailing bytes after a compiled message', () => {
it('rejects trailing bytes after an execution message', () => {
const message = encodeMessage(getTestMessage(1));

expect(() =>
Expand All @@ -228,7 +228,7 @@ describe('remaining account resolvers', () => {
);
});

it('rejects trailing bytes after a submitted message', () => {
it('rejects trailing bytes after an authorization message', () => {
const message = encodeMessage(getTestMessage(1));

expect(() =>
Expand Down
4 changes: 2 additions & 2 deletions codama.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import {
} from 'codama';

const executeRemainingAccounts = instructionRemainingAccountsNode(
resolverValueNode('resolveMessageAccounts', {
resolverValueNode('resolveExecutionMessageAccounts', {
dependsOn: [argumentValueNode('message')],
docs: "Preserves each execution message account's signer and writable role.",
}),
Expand All @@ -20,7 +20,7 @@ const executeRemainingAccounts = instructionRemainingAccountsNode(
);

const submitRemainingAccounts = instructionRemainingAccountsNode(
resolverValueNode('resolveSubmitMessageAccounts', {
resolverValueNode('resolveAuthorizationMessageAccounts', {
dependsOn: [argumentValueNode('message')],
docs: "Preserves each authorization message account's writable role without marking it as a relay transaction signer.",
}),
Expand Down
4 changes: 2 additions & 2 deletions idl.json
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,7 @@
],
"value": {
"kind": "resolverValueNode",
"name": "resolveSubmitMessageAccounts",
"name": "resolveAuthorizationMessageAccounts",
"docs": [
"Preserves each authorization message account's writable role without marking it as a relay transaction signer."
],
Expand Down Expand Up @@ -297,7 +297,7 @@
],
"value": {
"kind": "resolverValueNode",
"name": "resolveMessageAccounts",
"name": "resolveExecutionMessageAccounts",
"docs": [
"Preserves each execution message account's signer and writable role."
],
Expand Down
Loading