PHP WebShell
Текущая директория: /opt/BitGoJS/node_modules/avalanche/src/apis/evm
Просмотр файла: exporttx.ts
/**
* @packageDocumentation
* @module API-EVM-ExportTx
*/
import { Buffer } from "buffer/"
import BinTools from "../../utils/bintools"
import { EVMConstants } from "./constants"
import { KeyChain, KeyPair } from "./keychain"
import { EVMBaseTx } from "./basetx"
import { SelectCredentialClass } from "./credentials"
import { Signature, SigIdx, Credential } from "../../common/credentials"
import { EVMInput } from "./inputs"
import { Serialization, SerializedEncoding } from "../../utils/serialization"
import { TransferableOutput } from "./outputs"
import {
ChainIdError,
EVMInputError,
TransferableOutputError
} from "../../utils/errors"
/**
* @ignore
*/
const bintools: BinTools = BinTools.getInstance()
const serializer: Serialization = Serialization.getInstance()
export class ExportTx extends EVMBaseTx {
protected _typeName = "ExportTx"
protected _typeID = EVMConstants.EXPORTTX
serialize(encoding: SerializedEncoding = "hex"): object {
let fields: object = super.serialize(encoding)
return {
...fields,
destinationChain: serializer.encoder(
this.destinationChain,
encoding,
"Buffer",
"cb58"
),
exportedOutputs: this.exportedOutputs.map((i) => i.serialize(encoding))
}
}
deserialize(fields: object, encoding: SerializedEncoding = "hex") {
super.deserialize(fields, encoding)
this.destinationChain = serializer.decoder(
fields["destinationChain"],
encoding,
"cb58",
"Buffer",
32
)
this.exportedOutputs = fields["exportedOutputs"].map((i: object) => {
let eo: TransferableOutput = new TransferableOutput()
eo.deserialize(i, encoding)
return eo
})
this.numExportedOutputs = Buffer.alloc(4)
this.numExportedOutputs.writeUInt32BE(this.exportedOutputs.length, 0)
}
protected destinationChain: Buffer = Buffer.alloc(32)
protected numInputs: Buffer = Buffer.alloc(4)
protected inputs: EVMInput[] = []
protected numExportedOutputs: Buffer = Buffer.alloc(4)
protected exportedOutputs: TransferableOutput[] = []
/**
* Returns the destinationChain as a {@link https://github.com/feross/buffer|Buffer}
*/
getDestinationChain(): Buffer {
return this.destinationChain
}
/**
* Returns the inputs as an array of [[EVMInputs]]
*/
getInputs(): EVMInput[] {
return this.inputs
}
/**
* Returns the outs as an array of [[EVMOutputs]]
*/
getExportedOutputs(): TransferableOutput[] {
return this.exportedOutputs
}
/**
* Returns a {@link https://github.com/feross/buffer|Buffer} representation of the [[ExportTx]].
*/
toBuffer(): Buffer {
if (typeof this.destinationChain === "undefined") {
throw new ChainIdError(
"ExportTx.toBuffer -- this.destinationChain is undefined"
)
}
this.numInputs.writeUInt32BE(this.inputs.length, 0)
this.numExportedOutputs.writeUInt32BE(this.exportedOutputs.length, 0)
let barr: Buffer[] = [
super.toBuffer(),
this.destinationChain,
this.numInputs
]
let bsize: number =
super.toBuffer().length +
this.destinationChain.length +
this.numInputs.length
this.inputs.forEach((importIn: EVMInput) => {
bsize += importIn.toBuffer().length
barr.push(importIn.toBuffer())
})
bsize += this.numExportedOutputs.length
barr.push(this.numExportedOutputs)
this.exportedOutputs.forEach((out: TransferableOutput) => {
bsize += out.toBuffer().length
barr.push(out.toBuffer())
})
return Buffer.concat(barr, bsize)
}
/**
* Decodes the [[ExportTx]] as a {@link https://github.com/feross/buffer|Buffer} and returns the size.
*/
fromBuffer(bytes: Buffer, offset: number = 0): number {
offset = super.fromBuffer(bytes, offset)
this.destinationChain = bintools.copyFrom(bytes, offset, offset + 32)
offset += 32
this.numInputs = bintools.copyFrom(bytes, offset, offset + 4)
offset += 4
const numInputs: number = this.numInputs.readUInt32BE(0)
for (let i: number = 0; i < numInputs; i++) {
const anIn: EVMInput = new EVMInput()
offset = anIn.fromBuffer(bytes, offset)
this.inputs.push(anIn)
}
this.numExportedOutputs = bintools.copyFrom(bytes, offset, offset + 4)
offset += 4
const numExportedOutputs: number = this.numExportedOutputs.readUInt32BE(0)
for (let i: number = 0; i < numExportedOutputs; i++) {
const anOut: TransferableOutput = new TransferableOutput()
offset = anOut.fromBuffer(bytes, offset)
this.exportedOutputs.push(anOut)
}
return offset
}
/**
* Returns a base-58 representation of the [[ExportTx]].
*/
toString(): string {
return bintools.bufferToB58(this.toBuffer())
}
/**
* Takes the bytes of an [[UnsignedTx]] and returns an array of [[Credential]]s
*
* @param msg A Buffer for the [[UnsignedTx]]
* @param kc An [[KeyChain]] used in signing
*
* @returns An array of [[Credential]]s
*/
sign(msg: Buffer, kc: KeyChain): Credential[] {
const creds: Credential[] = super.sign(msg, kc)
this.inputs.forEach((input: EVMInput) => {
const cred: Credential = SelectCredentialClass(input.getCredentialID())
const sigidxs: SigIdx[] = input.getSigIdxs()
sigidxs.forEach((sigidx: SigIdx) => {
const keypair: KeyPair = kc.getKey(sigidx.getSource())
const signval: Buffer = keypair.sign(msg)
const sig: Signature = new Signature()
sig.fromBuffer(signval)
cred.addSignature(sig)
})
creds.push(cred)
})
return creds
}
/**
* Class representing a ExportTx.
*
* @param networkID Optional networkID
* @param blockchainID Optional blockchainID, default Buffer.alloc(32, 16)
* @param destinationChain Optional destinationChain, default Buffer.alloc(32, 16)
* @param inputs Optional array of the [[EVMInputs]]s
* @param exportedOutputs Optional array of the [[EVMOutputs]]s
*/
constructor(
networkID: number = undefined,
blockchainID: Buffer = Buffer.alloc(32, 16),
destinationChain: Buffer = Buffer.alloc(32, 16),
inputs: EVMInput[] = undefined,
exportedOutputs: TransferableOutput[] = undefined
) {
super(networkID, blockchainID)
this.destinationChain = destinationChain
if (typeof inputs !== "undefined" && Array.isArray(inputs)) {
inputs.forEach((input: EVMInput) => {
if (!(input instanceof EVMInput)) {
throw new EVMInputError(
"Error - ExportTx.constructor: invalid EVMInput in array parameter 'inputs'"
)
}
})
if (inputs.length > 1) {
inputs = inputs.sort(EVMInput.comparator())
}
this.inputs = inputs
}
if (
typeof exportedOutputs !== "undefined" &&
Array.isArray(exportedOutputs)
) {
exportedOutputs.forEach((exportedOutput: TransferableOutput) => {
if (!(exportedOutput instanceof TransferableOutput)) {
throw new TransferableOutputError(
"Error - ExportTx.constructor: TransferableOutput EVMInput in array parameter 'exportedOutputs'"
)
}
})
this.exportedOutputs = exportedOutputs
}
}
}
Выполнить команду
Для локальной разработки. Не используйте в интернете!