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],
      }
    );

Last updated