Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save ivanmolto/93c5dcc6e309e7d7a83e5738af8b8d98 to your computer and use it in GitHub Desktop.
Save ivanmolto/93c5dcc6e309e7d7a83e5738af8b8d98 to your computer and use it in GitHub Desktop.

Revisions

  1. @cgcardona cgcardona created this gist May 5, 2021.
    104 changes: 104 additions & 0 deletions BaseTx-Transfer-SNEK.ts
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,104 @@
    import {
    Avalanche,
    BinTools,
    BN,
    Buffer
    } from "../../src";
    import {
    AVMAPI,
    KeyChain as AVMKeyChain,
    SECPTransferOutput,
    SECPTransferInput,
    TransferableOutput,
    TransferableInput,
    UTXOSet,
    UTXO,
    AmountOutput,
    UnsignedTx,
    Tx,
    BaseTx
    } from "../../src/apis/avm"
    import { Defaults } from "../../src/utils"

    const ip: string = "localhost"
    const port: number = 9650
    const protocol: string = "http"
    const networkID: number = 12345
    const avalanche: Avalanche = new Avalanche(ip, port, protocol, networkID)
    const xchain: AVMAPI = avalanche.XChain()
    const bintools: BinTools = BinTools.getInstance()
    const xKeychain: AVMKeyChain = xchain.keyChain()
    const privKey: string = "PrivateKey-ewoqjP7PxY4yr3iLTpLisriqt94hdyDFNgchSxGGztUrTXtNN"
    xKeychain.importKey(privKey)
    const xAddresses: Buffer[] = xchain.keyChain().getAddresses()
    const xAddressStrings: string[] = xchain.keyChain().getAddressStrings()
    const blockchainid: string = Defaults.network['12345'].X.blockchainID
    const outputs: TransferableOutput[] = []
    const inputs: TransferableInput[] = []
    const fee: BN = xchain.getDefaultTxFee()
    const threshold: number = 1
    const locktime: BN = new BN(0)
    const memo: Buffer = Buffer.from("AVM manual BaseTx to send AVAX and ANT")
    // Uncomment for codecID 00 01
    // const codecID: number = 1

    const main = async (): Promise<any> => {
    const avaxAssetID: Buffer = await xchain.getAVAXAssetID()
    const avmUTXOResponse: any = await xchain.getUTXOs(xAddressStrings)
    const utxoSet: UTXOSet = avmUTXOResponse.utxos
    const utxos: UTXO[] = utxoSet.getAllUTXOs()
    utxos.forEach((utxo: UTXO) => {
    if(utxo.getOutput().getTypeID() != 6) {
    const amountOutput: AmountOutput = utxo.getOutput() as AmountOutput
    const amt: BN = amountOutput.getAmount().clone()
    const txid: Buffer = utxo.getTxID()
    const outputidx: Buffer = utxo.getOutputIdx()
    const assetID: Buffer = utxo.getAssetID();

    if(assetID.toString('hex') === avaxAssetID.toString('hex')) {
    const secpTransferOutput: SECPTransferOutput = new SECPTransferOutput(amt.sub(fee), xAddresses, locktime, threshold)
    // Uncomment for codecID 00 01
    // secpTransferOutput.setCodecID(codecID)
    const transferableOutput: TransferableOutput = new TransferableOutput(avaxAssetID, secpTransferOutput)
    outputs.push(transferableOutput)

    const secpTransferInput: SECPTransferInput = new SECPTransferInput(amt)
    // Uncomment for codecID 00 01
    // secpTransferInput.setCodecID(codecID)
    secpTransferInput.addSignatureIdx(0, xAddresses[0])
    const input: TransferableInput = new TransferableInput(txid, outputidx, avaxAssetID, secpTransferInput)
    inputs.push(input)
    } else {
    const secpTransferOutput: SECPTransferOutput = new SECPTransferOutput(amt, xAddresses, locktime, threshold)
    // Uncomment for codecID 00 01
    // secpTransferOutput.setCodecID(codecID)
    const transferableOutput: TransferableOutput = new TransferableOutput(assetID, secpTransferOutput)
    outputs.push(transferableOutput)

    const secpTransferInput: SECPTransferInput = new SECPTransferInput(amt)
    // Uncomment for codecID 00 01
    // secpTransferInput.setCodecID(codecID)
    secpTransferInput.addSignatureIdx(0, xAddresses[0])
    const input: TransferableInput = new TransferableInput(txid, outputidx, assetID, secpTransferInput)
    inputs.push(input)
    }
    }
    })

    const baseTx: BaseTx = new BaseTx (
    networkID,
    bintools.cb58Decode(blockchainid),
    outputs,
    inputs,
    memo
    )
    // Uncomment for codecID 00 01
    // baseTx.setCodecID(codecID)
    const unsignedTx: UnsignedTx = new UnsignedTx(baseTx)
    const tx: Tx = unsignedTx.sign(xKeychain)
    const txid: string = await xchain.issueTx(tx)
    console.log(`Success! TXID: ${txid}`)
    }

    main()