zcash-primitives-js/src/jsoutput.js

96 lines
2.0 KiB
JavaScript

'use strict'
var bufferutils = require('./bufferutils')
var prf = require('./prf')
var typeforce = require('typeforce')
var types = require('./types')
var zaddr = require('./address')
var zconst = require('./const')
var Note = require('./note')
function JSOutput (addr, value, memo) {
typeforce(types.tuple(
types.PaymentAddress,
types.Zatoshi,
types.maybe(types.Buffer)
), arguments)
if (!memo) {
memo = Buffer.alloc(zconst.ZC_MEMO_SIZE)
memo.fill(0)
memo[0] = 0xF6 // 0xF6 is invalid UTF8 as per spec
}
this.addr = addr
this.value = value
this.memo = memo
}
JSOutput.dummy = function () {
var aSk = zaddr.SpendingKey.random()
return new JSOutput(aSk.address(), 0)
}
JSOutput.fromBuffer = function (buffer) {
var offset = 0
function readSlice (n) {
offset += n
return buffer.slice(offset - n, offset)
}
function readUInt64 () {
var i = bufferutils.readUInt64LE(buffer, offset)
offset += 8
return i
}
function readPaymentAddress () {
var addr = zaddr.PaymentAddress.fromBuffer(buffer.slice(offset), true)
offset += addr.byteLength()
return addr
}
var addr = readPaymentAddress()
var value = readUInt64()
var memo = readSlice(zconst.ZC_MEMO_SIZE)
var output = new JSOutput(addr, value, memo)
return output
}
JSOutput.prototype.toBuffer = function () {
var buffer = Buffer.alloc(this.byteLength())
var offset = 0
function writeSlice (slice) {
slice.copy(buffer, offset)
offset += slice.length
}
function writeUInt64 (i) {
bufferutils.writeUInt64LE(buffer, i, offset)
offset += 8
}
writeSlice(this.addr.toBuffer())
writeUInt64(this.value)
writeSlice(this.memo)
return buffer
}
JSOutput.prototype.note = function (phi, r, i, hSig) {
typeforce(types.tuple(
types.Buffer252bit,
types.Buffer256bit,
types.Number,
types.Buffer256bit
), arguments)
var rho = prf.PRF_rho(phi, i, hSig)
return new Note(this.addr.a_pk, this.value, rho, r)
}
module.exports = JSOutput