Manually Creating a Transaction

In addition to uploading using the SDK functions irys.upload(), irys.uploadFile(), and irys.uploadFolder(), you can also manually create, sign, and upload a transaction in separate steps.

Workflow

  1. 1
    const tx = irys.createTransaction()Create the transaction object.
  2. 2
    await tx.sign()Sign the transaction. The ID is now accessible.
  3. 3
    await tx.upload()Upload the signed transaction.

After calling tx.sign(), you can access the transaction ID via tx.id, this facilitates use cases where you need access to the ID before uploading the full transaction.

Note
Note
You must call tx.sign() before using the value of tx.id.

Creating, Signing, Uploading

Note
Note
Use a token-specific version of getIrysUploader() to connect to an Irys Bundler before uploading.
const createSignUpload = async () => {
  // Get a reference to a pre-configured Irys object
  const irys = await getIrysUploader();

  // Create the transaction
  const tx = irys.createTransaction("Hirys World!", {
    tags: [{ name: "Content-Type", value: "text/plain" }],
  });

  // Sign the transaction
  await tx.sign(); // ID is now set
  console.log(`Tx created and signed, ID=${tx.id}`);

  // Upload the transaction
  const receipt = await tx.upload();
  console.log(`Tx uploaded. https://gateway.irys.xyz/${receipt.id}`);
};

Serializing a Transaction

Serialize a transaction and recreate it later.

const serializationUpload = async () => {
  // Get a reference to a pre-configured Irys object
  const irys = await getIrysUploader();

  // Create the transaction
  const tx1 = irys.createTransaction("Hirys World!", {
    tags: [{ name: "Content-Type", value: "text/plain" }],
  });
  // Note: You can sign before *or* after serializing
  await tx1.sign(); // ID is now set
  console.log(`Tx created and signed, ID=${tx1.id}`);

  // Serialize the transaction
  const txSerialized = tx1.getRaw();

  // Recreate the transaction from the serialized version
  const tx2 = irys.transaction.fromRaw(txSerialized);
  // ID is the same as before
  console.log(`Tx re-created from serialized, ID=${tx2.id}`);

  // Upload the tx
  const receipt = await tx2.upload();

  console.log(`Tx uploaded. https://gateway.irys.xyz/${receipt.id}`);
};

Deterministic ID

Use a deterministic ID in cases where you need access to a transaction ID before uploading, but can't or don't want to store a reference to the transaction object.

First, generate an anchor and use that to create a transaction with your data. Then, sign the transaction and you can access the ID. Finally, you can recreate the transaction using the same anchor and data and your ID will be the same.

const deterministicIDUpload = async () => {
  // Get a reference to a pre-configured Irys object
  const irys = await getIrysUploader();

  // Generate 32 bytes through Buffer.from(anchor)
  const anchor = randomBytes(16).toString("hex");
  const tx1 = irys.createTransaction("Hirys Irys!", {
    tags: [{ name: "content-type", value: "text/plain" }],
    anchor,
  });
  await tx1.sign();
  console.log(`Tx1 ID ${tx1.id}`); // ID is now set

  const tx2 = irys.createTransaction("Hirys Irys!", {
    tags: [{ name: "content-type", value: "text/plain" }],
    anchor,
  });
  await tx2.sign();
  console.log(`Tx2 ID ${tx2.id}`); // ID is the same
  const receipt = await tx2.upload();
  console.log(`Tx uploaded. https://gateway.irys.xyz/${receipt.id}`);
};