@btc-vision/transaction
Version:
OPNet transaction library allows you to create and sign transactions for the OPNet network.
129 lines (128 loc) • 5.31 kB
JavaScript
import shajs from 'sha.js';
import { BinaryReader } from '../buffer/BinaryReader.js';
import { BufferHelper } from '../utils/BufferHelper.js';
export var ABIDataTypes;
(function (ABIDataTypes) {
ABIDataTypes["UINT8"] = "UINT8";
ABIDataTypes["UINT16"] = "UINT16";
ABIDataTypes["UINT32"] = "UINT32";
ABIDataTypes["UINT64"] = "UINT64";
ABIDataTypes["UINT128"] = "UINT128";
ABIDataTypes["UINT256"] = "UINT256";
ABIDataTypes["INT128"] = "INT128";
ABIDataTypes["BOOL"] = "BOOL";
ABIDataTypes["ADDRESS"] = "ADDRESS";
ABIDataTypes["STRING"] = "STRING";
ABIDataTypes["BYTES4"] = "BYTES4";
ABIDataTypes["BYTES32"] = "BYTES32";
ABIDataTypes["BYTES"] = "BYTES";
ABIDataTypes["ADDRESS_UINT256_TUPLE"] = "ADDRESS_UINT256_TUPLE";
ABIDataTypes["ARRAY_OF_ADDRESSES"] = "ARRAY_OF_ADDRESSES";
ABIDataTypes["ARRAY_OF_UINT256"] = "ARRAY_OF_UINT256";
ABIDataTypes["ARRAY_OF_UINT128"] = "ARRAY_OF_UINT128";
ABIDataTypes["ARRAY_OF_UINT64"] = "ARRAY_OF_UINT64";
ABIDataTypes["ARRAY_OF_UINT32"] = "ARRAY_OF_UINT32";
ABIDataTypes["ARRAY_OF_UINT16"] = "ARRAY_OF_UINT16";
ABIDataTypes["ARRAY_OF_UINT8"] = "ARRAY_OF_UINT8";
ABIDataTypes["ARRAY_OF_STRING"] = "ARRAY_OF_STRING";
ABIDataTypes["ARRAY_OF_BYTES"] = "ARRAY_OF_BYTES";
})(ABIDataTypes || (ABIDataTypes = {}));
export class ABICoder {
decodeData(data, types) {
const byteReader = new BinaryReader(data);
const result = [];
for (let i = 0; i < types.length; i++) {
const type = types[i];
switch (type) {
case ABIDataTypes.UINT8:
result.push(byteReader.readU8());
break;
case ABIDataTypes.UINT16:
result.push(byteReader.readU16());
break;
case ABIDataTypes.UINT32:
result.push(byteReader.readU32());
break;
case ABIDataTypes.BYTES4:
result.push(byteReader.readBytes(4));
break;
case ABIDataTypes.BYTES32:
result.push(byteReader.readBytes(32));
break;
case ABIDataTypes.BOOL:
result.push(byteReader.readBoolean());
break;
case ABIDataTypes.ADDRESS:
result.push(byteReader.readAddress());
break;
case ABIDataTypes.STRING:
result.push(byteReader.readStringWithLength());
break;
case ABIDataTypes.UINT128:
result.push(byteReader.readU128());
break;
case ABIDataTypes.UINT256:
result.push(byteReader.readU256());
break;
case ABIDataTypes.INT128:
result.push(byteReader.readI128());
break;
case ABIDataTypes.ADDRESS_UINT256_TUPLE:
result.push(byteReader.readAddressValueTuple());
break;
case ABIDataTypes.BYTES:
result.push(byteReader.readBytesWithLength());
break;
case ABIDataTypes.UINT64:
result.push(byteReader.readU64());
break;
case ABIDataTypes.ARRAY_OF_ADDRESSES:
result.push(byteReader.readAddressArray());
break;
case ABIDataTypes.ARRAY_OF_UINT256:
result.push(byteReader.readU256Array());
break;
case ABIDataTypes.ARRAY_OF_UINT128:
result.push(byteReader.readU128Array());
break;
case ABIDataTypes.ARRAY_OF_UINT64:
result.push(byteReader.readU64Array());
break;
case ABIDataTypes.ARRAY_OF_UINT32:
result.push(byteReader.readU32Array());
break;
case ABIDataTypes.ARRAY_OF_UINT16:
result.push(byteReader.readU16Array());
break;
case ABIDataTypes.ARRAY_OF_UINT8:
result.push(byteReader.readU8Array());
break;
case ABIDataTypes.ARRAY_OF_STRING:
result.push(byteReader.readStringArray());
break;
case ABIDataTypes.ARRAY_OF_BYTES:
result.push(byteReader.readBytesArray());
}
}
return result;
}
encodeSelector(selectorIdentifier) {
const hash = this.sha256(selectorIdentifier);
const selector = hash.subarray(0, 4);
return selector.toString('hex');
}
numericSelectorToHex(selector) {
return selector.toString(16);
}
bigIntToUint8Array(bigIntValue, length) {
const byteArray = new Uint8Array(length);
const buf = BufferHelper.valueToUint8Array(bigIntValue);
for (let i = 0; i < length; i++) {
byteArray[i] = buf[i] || 0;
}
return byteArray;
}
sha256(buffer) {
return new shajs.sha256().update(buffer).digest();
}
}