Cashmere
Search
⌃K

Create Transaction

Example code to programmatically create a transaction (proposed instruction) for an existing Cashmere multisig
// find the PDA of the multisig (multisigSigner)
const [multisigSigner, nonce] =
await anchor.web3.PublicKey.findProgramAddress(
[multisig.publicKey.toBuffer()],
multisigProgram.programId
);
​
// instruction being proposed to the multisig for approval
// this instruction transfers SOL
const proposedIx = web3.SystemProgram.transfer({
/** Account that will transfer lamports */
fromPubkey: multisigSigner,
/** Account that will receive transferred lamports */
toPubkey: receiverAddress.publicKey,
/** Amount of lamports to transfer */
lamports: new anchor.BN(100),
});
​
// accounts that will be operated on by the proposed instruction
const proposedIxAccounts = [
{
pubkey: multisigSigner,
isWritable: false,
isSigner: true,
},
{
pubkey: receiverAddress.publicKey,
isWritable: true,
isSigner: false,
},
];
​
// keypair for the account that will hold the
// proposed transaction instruction
const txAccountKeypair = anchor.web3.Keypair.generate();
const txAccountPublicKey = txAccountKeypair.publicKey;
const txSize = 1000; // arbitrarily big enough
await multisigProgram.rpc.createTransaction(
proposedIx.programId,
proposedIxAccounts,
proposedIx.data,
{
accounts: {
multisig: multisigPublicKey,
transaction: txAccountPublicKey,
proposer: provider.wallet.publicKey,
},
instructions: [
// first create the account that will hold the
// proposed transaction instruction and maintain
// approved signers list
await multisigProgram.account.transaction.createInstruction(
txAccountKeypair,
txSize
),
],
signers: [txAccountKeypair],
}
);