@robertprp/intents-sdk
Version:
Shogun Network Intent-based cross-chain swaps SDK
570 lines (543 loc) • 22.1 kB
text/typescript
/**
* This code was AUTOGENERATED using the codama library.
* Please DO NOT EDIT THIS FILE, instead use visitors
* to add features, then rerun codama to update it.
*
* @see https://github.com/codama-idl/codama
*/
import { getAddressDecoder, getAddressEncoder, getProgramDerivedAddress, type Address } from '@solana/kit';
import {
combineCodec,
fixDecoderSize,
fixEncoderSize,
getBytesDecoder,
getBytesEncoder,
getStructDecoder,
getStructEncoder,
transformEncoder,
type Codec,
type Decoder,
type Encoder,
type ReadonlyUint8Array,
} from '@solana/kit';
import {
type IAccountMeta,
type IInstruction,
type IInstructionWithAccounts,
type IInstructionWithData,
type ReadonlyAccount,
type WritableAccount,
type WritableSignerAccount,
} from '@solana/kit';
import { type IAccountSignerMeta, type TransactionSigner } from '@solana/kit';
import { SOURCE_CHAIN_GUARD_PROGRAM_ADDRESS } from '../programs/index.js';
import { expectAddress, getAccountMetaFactory, type ResolvedAccount } from '../shared/index.js';
export const CREATE_GUARD_DISCRIMINATOR = new Uint8Array([251, 254, 17, 198, 219, 218, 154, 99]);
export function getCreateGuardDiscriminatorBytes() {
return fixEncoderSize(getBytesEncoder(), 8).encode(CREATE_GUARD_DISCRIMINATOR);
}
export type CreateGuardInstruction<
TProgram extends string = typeof SOURCE_CHAIN_GUARD_PROGRAM_ADDRESS,
TAccountAdmin extends string | IAccountMeta<string> = string,
TAccountGuard extends string | IAccountMeta<string> = string,
TAccountAdminSingleton extends string | IAccountMeta<string> = string,
TAccountSystemProgram extends string | IAccountMeta<string> = '11111111111111111111111111111111',
TAccountAssociatedTokenProgram extends string | IAccountMeta<string> = 'ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL',
TAccountCollateralTokenMint extends string | IAccountMeta<string> = string,
TAccountCollateralTokenAccount extends string | IAccountMeta<string> = string,
TAccountCollateralTokenProgram extends string | IAccountMeta<string> = string,
TAccountStablecoinTokenMint extends string | IAccountMeta<string> = string,
TAccountStablecoinTokenAccount extends string | IAccountMeta<string> = string,
TAccountStablecoinTokenProgram extends string | IAccountMeta<string> = string,
TRemainingAccounts extends readonly IAccountMeta<string>[] = [],
> = IInstruction<TProgram> &
IInstructionWithData<Uint8Array> &
IInstructionWithAccounts<
[
TAccountAdmin extends string
? WritableSignerAccount<TAccountAdmin> & IAccountSignerMeta<TAccountAdmin>
: TAccountAdmin,
TAccountGuard extends string ? WritableAccount<TAccountGuard> : TAccountGuard,
TAccountAdminSingleton extends string ? ReadonlyAccount<TAccountAdminSingleton> : TAccountAdminSingleton,
TAccountSystemProgram extends string ? ReadonlyAccount<TAccountSystemProgram> : TAccountSystemProgram,
TAccountAssociatedTokenProgram extends string
? ReadonlyAccount<TAccountAssociatedTokenProgram>
: TAccountAssociatedTokenProgram,
TAccountCollateralTokenMint extends string
? ReadonlyAccount<TAccountCollateralTokenMint>
: TAccountCollateralTokenMint,
TAccountCollateralTokenAccount extends string
? WritableAccount<TAccountCollateralTokenAccount>
: TAccountCollateralTokenAccount,
TAccountCollateralTokenProgram extends string
? ReadonlyAccount<TAccountCollateralTokenProgram>
: TAccountCollateralTokenProgram,
TAccountStablecoinTokenMint extends string
? ReadonlyAccount<TAccountStablecoinTokenMint>
: TAccountStablecoinTokenMint,
TAccountStablecoinTokenAccount extends string
? WritableAccount<TAccountStablecoinTokenAccount>
: TAccountStablecoinTokenAccount,
TAccountStablecoinTokenProgram extends string
? ReadonlyAccount<TAccountStablecoinTokenProgram>
: TAccountStablecoinTokenProgram,
...TRemainingAccounts,
]
>;
export type CreateGuardInstructionData = {
discriminator: ReadonlyUint8Array;
auctioneerPubKey: Address;
};
export type CreateGuardInstructionDataArgs = { auctioneerPubKey: Address };
export function getCreateGuardInstructionDataEncoder(): Encoder<CreateGuardInstructionDataArgs> {
return transformEncoder(
getStructEncoder([
['discriminator', fixEncoderSize(getBytesEncoder(), 8)],
['auctioneerPubKey', getAddressEncoder()],
]),
(value) => ({ ...value, discriminator: CREATE_GUARD_DISCRIMINATOR }),
);
}
export function getCreateGuardInstructionDataDecoder(): Decoder<CreateGuardInstructionData> {
return getStructDecoder([
['discriminator', fixDecoderSize(getBytesDecoder(), 8)],
['auctioneerPubKey', getAddressDecoder()],
]);
}
export function getCreateGuardInstructionDataCodec(): Codec<
CreateGuardInstructionDataArgs,
CreateGuardInstructionData
> {
return combineCodec(getCreateGuardInstructionDataEncoder(), getCreateGuardInstructionDataDecoder());
}
export type CreateGuardAsyncInput<
TAccountAdmin extends string = string,
TAccountGuard extends string = string,
TAccountAdminSingleton extends string = string,
TAccountSystemProgram extends string = string,
TAccountAssociatedTokenProgram extends string = string,
TAccountCollateralTokenMint extends string = string,
TAccountCollateralTokenAccount extends string = string,
TAccountCollateralTokenProgram extends string = string,
TAccountStablecoinTokenMint extends string = string,
TAccountStablecoinTokenAccount extends string = string,
TAccountStablecoinTokenProgram extends string = string,
> = {
/** Admin, creating Guard */
admin: TransactionSigner<TAccountAdmin>;
/** Account that will store guard data */
guard?: Address<TAccountGuard>;
/** Admin singleton account that allows Guard creation */
adminSingleton?: Address<TAccountAdminSingleton>;
/** Solana System program */
systemProgram?: Address<TAccountSystemProgram>;
/** Associated Token account program */
associatedTokenProgram?: Address<TAccountAssociatedTokenProgram>;
/** Token that will be used as collateral and fees */
collateralTokenMint: Address<TAccountCollateralTokenMint>;
/** Token account where fees will be collected and collateral will be locked */
collateralTokenAccount?: Address<TAccountCollateralTokenAccount>;
/** Solana token program */
collateralTokenProgram: Address<TAccountCollateralTokenProgram>;
/** Token that will be used as token OUT when swapping Token IN during order execution start */
stablecoinTokenMint: Address<TAccountStablecoinTokenMint>;
/**
* Token account where fees will be collected
* Using `init_if_needed` fot the case with same stablecoin and collateral token
*/
stablecoinTokenAccount?: Address<TAccountStablecoinTokenAccount>;
/** Solana token program */
stablecoinTokenProgram: Address<TAccountStablecoinTokenProgram>;
auctioneerPubKey: CreateGuardInstructionDataArgs['auctioneerPubKey'];
};
export async function getCreateGuardInstructionAsync<
TAccountAdmin extends string,
TAccountGuard extends string,
TAccountAdminSingleton extends string,
TAccountSystemProgram extends string,
TAccountAssociatedTokenProgram extends string,
TAccountCollateralTokenMint extends string,
TAccountCollateralTokenAccount extends string,
TAccountCollateralTokenProgram extends string,
TAccountStablecoinTokenMint extends string,
TAccountStablecoinTokenAccount extends string,
TAccountStablecoinTokenProgram extends string,
TProgramAddress extends Address = typeof SOURCE_CHAIN_GUARD_PROGRAM_ADDRESS,
>(
input: CreateGuardAsyncInput<
TAccountAdmin,
TAccountGuard,
TAccountAdminSingleton,
TAccountSystemProgram,
TAccountAssociatedTokenProgram,
TAccountCollateralTokenMint,
TAccountCollateralTokenAccount,
TAccountCollateralTokenProgram,
TAccountStablecoinTokenMint,
TAccountStablecoinTokenAccount,
TAccountStablecoinTokenProgram
>,
config?: { programAddress?: TProgramAddress },
): Promise<
CreateGuardInstruction<
TProgramAddress,
TAccountAdmin,
TAccountGuard,
TAccountAdminSingleton,
TAccountSystemProgram,
TAccountAssociatedTokenProgram,
TAccountCollateralTokenMint,
TAccountCollateralTokenAccount,
TAccountCollateralTokenProgram,
TAccountStablecoinTokenMint,
TAccountStablecoinTokenAccount,
TAccountStablecoinTokenProgram
>
> {
// Program address.
const programAddress = config?.programAddress ?? SOURCE_CHAIN_GUARD_PROGRAM_ADDRESS;
// Original accounts.
const originalAccounts = {
admin: { value: input.admin ?? null, isWritable: true },
guard: { value: input.guard ?? null, isWritable: true },
adminSingleton: { value: input.adminSingleton ?? null, isWritable: false },
systemProgram: { value: input.systemProgram ?? null, isWritable: false },
associatedTokenProgram: {
value: input.associatedTokenProgram ?? null,
isWritable: false,
},
collateralTokenMint: {
value: input.collateralTokenMint ?? null,
isWritable: false,
},
collateralTokenAccount: {
value: input.collateralTokenAccount ?? null,
isWritable: true,
},
collateralTokenProgram: {
value: input.collateralTokenProgram ?? null,
isWritable: false,
},
stablecoinTokenMint: {
value: input.stablecoinTokenMint ?? null,
isWritable: false,
},
stablecoinTokenAccount: {
value: input.stablecoinTokenAccount ?? null,
isWritable: true,
},
stablecoinTokenProgram: {
value: input.stablecoinTokenProgram ?? null,
isWritable: false,
},
};
const accounts = originalAccounts as Record<keyof typeof originalAccounts, ResolvedAccount>;
// Original args.
const args = { ...input };
// Resolve default values.
if (!accounts.guard.value) {
accounts.guard.value = await getProgramDerivedAddress({
programAddress,
seeds: [
getBytesEncoder().encode(new Uint8Array([103, 117, 97, 114, 100])),
getAddressEncoder().encode(expectAddress(accounts.collateralTokenMint.value)),
getAddressEncoder().encode(expectAddress(accounts.stablecoinTokenMint.value)),
],
});
}
if (!accounts.adminSingleton.value) {
accounts.adminSingleton.value = await getProgramDerivedAddress({
programAddress,
seeds: [getBytesEncoder().encode(new Uint8Array([97, 100, 109, 105, 110]))],
});
}
if (!accounts.systemProgram.value) {
accounts.systemProgram.value = '11111111111111111111111111111111' as Address<'11111111111111111111111111111111'>;
}
if (!accounts.associatedTokenProgram.value) {
accounts.associatedTokenProgram.value =
'ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL' as Address<'ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL'>;
}
if (!accounts.collateralTokenAccount.value) {
accounts.collateralTokenAccount.value = await getProgramDerivedAddress({
programAddress:
'ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL' as Address<'ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL'>,
seeds: [
getAddressEncoder().encode(expectAddress(accounts.guard.value)),
getAddressEncoder().encode(expectAddress(accounts.collateralTokenProgram.value)),
getAddressEncoder().encode(expectAddress(accounts.collateralTokenMint.value)),
],
});
}
if (!accounts.stablecoinTokenAccount.value) {
accounts.stablecoinTokenAccount.value = await getProgramDerivedAddress({
programAddress:
'ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL' as Address<'ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL'>,
seeds: [
getAddressEncoder().encode(expectAddress(accounts.guard.value)),
getAddressEncoder().encode(expectAddress(accounts.stablecoinTokenProgram.value)),
getAddressEncoder().encode(expectAddress(accounts.stablecoinTokenMint.value)),
],
});
}
const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');
const instruction = {
accounts: [
getAccountMeta(accounts.admin),
getAccountMeta(accounts.guard),
getAccountMeta(accounts.adminSingleton),
getAccountMeta(accounts.systemProgram),
getAccountMeta(accounts.associatedTokenProgram),
getAccountMeta(accounts.collateralTokenMint),
getAccountMeta(accounts.collateralTokenAccount),
getAccountMeta(accounts.collateralTokenProgram),
getAccountMeta(accounts.stablecoinTokenMint),
getAccountMeta(accounts.stablecoinTokenAccount),
getAccountMeta(accounts.stablecoinTokenProgram),
],
programAddress,
data: getCreateGuardInstructionDataEncoder().encode(args as CreateGuardInstructionDataArgs),
} as CreateGuardInstruction<
TProgramAddress,
TAccountAdmin,
TAccountGuard,
TAccountAdminSingleton,
TAccountSystemProgram,
TAccountAssociatedTokenProgram,
TAccountCollateralTokenMint,
TAccountCollateralTokenAccount,
TAccountCollateralTokenProgram,
TAccountStablecoinTokenMint,
TAccountStablecoinTokenAccount,
TAccountStablecoinTokenProgram
>;
return instruction;
}
export type CreateGuardInput<
TAccountAdmin extends string = string,
TAccountGuard extends string = string,
TAccountAdminSingleton extends string = string,
TAccountSystemProgram extends string = string,
TAccountAssociatedTokenProgram extends string = string,
TAccountCollateralTokenMint extends string = string,
TAccountCollateralTokenAccount extends string = string,
TAccountCollateralTokenProgram extends string = string,
TAccountStablecoinTokenMint extends string = string,
TAccountStablecoinTokenAccount extends string = string,
TAccountStablecoinTokenProgram extends string = string,
> = {
/** Admin, creating Guard */
admin: TransactionSigner<TAccountAdmin>;
/** Account that will store guard data */
guard: Address<TAccountGuard>;
/** Admin singleton account that allows Guard creation */
adminSingleton: Address<TAccountAdminSingleton>;
/** Solana System program */
systemProgram?: Address<TAccountSystemProgram>;
/** Associated Token account program */
associatedTokenProgram?: Address<TAccountAssociatedTokenProgram>;
/** Token that will be used as collateral and fees */
collateralTokenMint: Address<TAccountCollateralTokenMint>;
/** Token account where fees will be collected and collateral will be locked */
collateralTokenAccount: Address<TAccountCollateralTokenAccount>;
/** Solana token program */
collateralTokenProgram: Address<TAccountCollateralTokenProgram>;
/** Token that will be used as token OUT when swapping Token IN during order execution start */
stablecoinTokenMint: Address<TAccountStablecoinTokenMint>;
/**
* Token account where fees will be collected
* Using `init_if_needed` fot the case with same stablecoin and collateral token
*/
stablecoinTokenAccount: Address<TAccountStablecoinTokenAccount>;
/** Solana token program */
stablecoinTokenProgram: Address<TAccountStablecoinTokenProgram>;
auctioneerPubKey: CreateGuardInstructionDataArgs['auctioneerPubKey'];
};
export function getCreateGuardInstruction<
TAccountAdmin extends string,
TAccountGuard extends string,
TAccountAdminSingleton extends string,
TAccountSystemProgram extends string,
TAccountAssociatedTokenProgram extends string,
TAccountCollateralTokenMint extends string,
TAccountCollateralTokenAccount extends string,
TAccountCollateralTokenProgram extends string,
TAccountStablecoinTokenMint extends string,
TAccountStablecoinTokenAccount extends string,
TAccountStablecoinTokenProgram extends string,
TProgramAddress extends Address = typeof SOURCE_CHAIN_GUARD_PROGRAM_ADDRESS,
>(
input: CreateGuardInput<
TAccountAdmin,
TAccountGuard,
TAccountAdminSingleton,
TAccountSystemProgram,
TAccountAssociatedTokenProgram,
TAccountCollateralTokenMint,
TAccountCollateralTokenAccount,
TAccountCollateralTokenProgram,
TAccountStablecoinTokenMint,
TAccountStablecoinTokenAccount,
TAccountStablecoinTokenProgram
>,
config?: { programAddress?: TProgramAddress },
): CreateGuardInstruction<
TProgramAddress,
TAccountAdmin,
TAccountGuard,
TAccountAdminSingleton,
TAccountSystemProgram,
TAccountAssociatedTokenProgram,
TAccountCollateralTokenMint,
TAccountCollateralTokenAccount,
TAccountCollateralTokenProgram,
TAccountStablecoinTokenMint,
TAccountStablecoinTokenAccount,
TAccountStablecoinTokenProgram
> {
// Program address.
const programAddress = config?.programAddress ?? SOURCE_CHAIN_GUARD_PROGRAM_ADDRESS;
// Original accounts.
const originalAccounts = {
admin: { value: input.admin ?? null, isWritable: true },
guard: { value: input.guard ?? null, isWritable: true },
adminSingleton: { value: input.adminSingleton ?? null, isWritable: false },
systemProgram: { value: input.systemProgram ?? null, isWritable: false },
associatedTokenProgram: {
value: input.associatedTokenProgram ?? null,
isWritable: false,
},
collateralTokenMint: {
value: input.collateralTokenMint ?? null,
isWritable: false,
},
collateralTokenAccount: {
value: input.collateralTokenAccount ?? null,
isWritable: true,
},
collateralTokenProgram: {
value: input.collateralTokenProgram ?? null,
isWritable: false,
},
stablecoinTokenMint: {
value: input.stablecoinTokenMint ?? null,
isWritable: false,
},
stablecoinTokenAccount: {
value: input.stablecoinTokenAccount ?? null,
isWritable: true,
},
stablecoinTokenProgram: {
value: input.stablecoinTokenProgram ?? null,
isWritable: false,
},
};
const accounts = originalAccounts as Record<keyof typeof originalAccounts, ResolvedAccount>;
// Original args.
const args = { ...input };
// Resolve default values.
if (!accounts.systemProgram.value) {
accounts.systemProgram.value = '11111111111111111111111111111111' as Address<'11111111111111111111111111111111'>;
}
if (!accounts.associatedTokenProgram.value) {
accounts.associatedTokenProgram.value =
'ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL' as Address<'ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL'>;
}
const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');
const instruction = {
accounts: [
getAccountMeta(accounts.admin),
getAccountMeta(accounts.guard),
getAccountMeta(accounts.adminSingleton),
getAccountMeta(accounts.systemProgram),
getAccountMeta(accounts.associatedTokenProgram),
getAccountMeta(accounts.collateralTokenMint),
getAccountMeta(accounts.collateralTokenAccount),
getAccountMeta(accounts.collateralTokenProgram),
getAccountMeta(accounts.stablecoinTokenMint),
getAccountMeta(accounts.stablecoinTokenAccount),
getAccountMeta(accounts.stablecoinTokenProgram),
],
programAddress,
data: getCreateGuardInstructionDataEncoder().encode(args as CreateGuardInstructionDataArgs),
} as CreateGuardInstruction<
TProgramAddress,
TAccountAdmin,
TAccountGuard,
TAccountAdminSingleton,
TAccountSystemProgram,
TAccountAssociatedTokenProgram,
TAccountCollateralTokenMint,
TAccountCollateralTokenAccount,
TAccountCollateralTokenProgram,
TAccountStablecoinTokenMint,
TAccountStablecoinTokenAccount,
TAccountStablecoinTokenProgram
>;
return instruction;
}
export type ParsedCreateGuardInstruction<
TProgram extends string = typeof SOURCE_CHAIN_GUARD_PROGRAM_ADDRESS,
TAccountMetas extends readonly IAccountMeta[] = readonly IAccountMeta[],
> = {
programAddress: Address<TProgram>;
accounts: {
/** Admin, creating Guard */
admin: TAccountMetas[0];
/** Account that will store guard data */
guard: TAccountMetas[1];
/** Admin singleton account that allows Guard creation */
adminSingleton: TAccountMetas[2];
/** Solana System program */
systemProgram: TAccountMetas[3];
/** Associated Token account program */
associatedTokenProgram: TAccountMetas[4];
/** Token that will be used as collateral and fees */
collateralTokenMint: TAccountMetas[5];
/** Token account where fees will be collected and collateral will be locked */
collateralTokenAccount: TAccountMetas[6];
/** Solana token program */
collateralTokenProgram: TAccountMetas[7];
/** Token that will be used as token OUT when swapping Token IN during order execution start */
stablecoinTokenMint: TAccountMetas[8];
/**
* Token account where fees will be collected
* Using `init_if_needed` fot the case with same stablecoin and collateral token
*/
stablecoinTokenAccount: TAccountMetas[9];
/** Solana token program */
stablecoinTokenProgram: TAccountMetas[10];
};
data: CreateGuardInstructionData;
};
export function parseCreateGuardInstruction<TProgram extends string, TAccountMetas extends readonly IAccountMeta[]>(
instruction: IInstruction<TProgram> & IInstructionWithAccounts<TAccountMetas> & IInstructionWithData<Uint8Array>,
): ParsedCreateGuardInstruction<TProgram, TAccountMetas> {
if (instruction.accounts.length < 11) {
// TODO: Coded error.
throw new Error('Not enough accounts');
}
let accountIndex = 0;
const getNextAccount = () => {
const accountMeta = instruction.accounts![accountIndex]!;
accountIndex += 1;
return accountMeta;
};
return {
programAddress: instruction.programAddress,
accounts: {
admin: getNextAccount(),
guard: getNextAccount(),
adminSingleton: getNextAccount(),
systemProgram: getNextAccount(),
associatedTokenProgram: getNextAccount(),
collateralTokenMint: getNextAccount(),
collateralTokenAccount: getNextAccount(),
collateralTokenProgram: getNextAccount(),
stablecoinTokenMint: getNextAccount(),
stablecoinTokenAccount: getNextAccount(),
stablecoinTokenProgram: getNextAccount(),
},
data: getCreateGuardInstructionDataDecoder().decode(instruction.data),
};
}