spacebudz / lucid

Lucid is a library, which allows you to create Cardano transactions and off-chain code for your Plutus contracts in JavaScript, Deno and Node.js.
https://lucid.spacebudz.io
MIT License
336 stars 133 forks source link

How to build transaction whose input is from zero address and output is also zero address? #221

Closed golddydev closed 10 months ago

golddydev commented 10 months ago

I am now build dApp. And I want to verify users by letting them signData using their wallets. But the problem is that Ledger type wallet (not seed-phrase account) doesn't support signData method yet. So I was trying to use signTx method instead. But how can we build tx which is not related to users' address, so they see that nothing will happen after they sign the Transaction.

golddydev commented 10 months ago

Hi, I solved this issue. We can do this using lucid-cardano.

The cardano zero address is here

addr1vyqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqkdl5mw
const inputs = C.TransactionInputs.new();
inputs.add(
  C.TransactionInput.new(
    C.TransactionHash.from_hex(
      '706f481e44126b9de1c394e1ade248b15c435216fba3ecfb40d21c5c291be75d',
    ),
    C.BigNum.zero(),
  ),
);
const outputs = C.TransactionOutputs.new();
outputs.add(
  C.TransactionOutput.new(
    C.Address.from_bech32(
      'addr1qx2vnfzpeuvdcym8y7v5qnz2mc289ue6tfr0xynyaqnm0rhuanngtqdu53qy0c0zxxed8hdnmkl66l0uvw68q8elp4nsxyap30',
    ),
    C.Value.new(C.BigNum.from_str('1000000')),
  ),
);
const fee = C.BigNum.from_str('500000');
const witnessSet = C.TransactionWitnessSet.new();
const auxData = C.AuxiliaryData.new();
const metadata = C.GeneralTransactionMetadata.new();
const metadataMap = C.MetadataMap.new();
const metadataList = C.MetadataList.new();
metadataList.add(C.TransactionMetadatum.new_text('Hello World'));
metadataMap.insert(
  C.TransactionMetadatum.new_text('msg'),
  C.TransactionMetadatum.new_list(metadataList),
);
const metadataum = C.TransactionMetadatum.new_map(metadataMap);
metadata.insert(C.BigNum.from_str('674'), metadataum);
auxData.set_metadata(metadata);
const transaction = C.Transaction.new(
  C.TransactionBody.new(inputs, outputs, fee),
  witnessSet,
  auxData,
);
golddydev commented 10 months ago

Here is easier way for this.

const lucid = await Lucid.new(blockfrostProvider, 'Mainnet');
const utxos = await lucid.utxosAt(zeroAddress);
lucid.selectWalletFrom({
  address: zeroAddress,
  utxos,
});
const tx = await lucid
  .newTx()
  .payToAddress(bech32Address, {
    lovelace: 2000000n,
  })
  .addSigner(bech32Address)
  .validTo(Date.now() + 1000 * 120)
  .attachMetadata(674, {
    msg: [
      'Only for verification',
    ],
  })
  .complete();