@unspent/phi
Version:
a collection of anyone can spend contracts
135 lines • 5.18 kB
JavaScript
import { binToHex, hexToBin, lockingBytecodeToCashAddress } from "@bitauth/libauth";
import { Network } from "cashscript";
import { nameMap, contractMap } from "../contract/constant.js";
import { decodeNullDataScript } from "./util.js";
import { BaseUtxPhiContract } from "./contract.js";
import { PsiNetworkProvider } from "@unspent/psi";
export function parseOpReturn(serialized, network = 'mainnet') {
if (typeof serialized === "string") {
serialized = hexToBin(serialized);
}
const data = BaseUtxPhiContract.parseOpReturn(serialized, network);
return {
name: nameMap[data.code],
opReturn: serialized,
...data,
};
}
export function parseOutputs(serialized) {
if (typeof serialized === "string")
serialized = hexToBin(serialized);
return BaseUtxPhiContract.parseOutputs(serialized);
}
export function opReturnToInstance(serialized, network) {
if (typeof serialized === "string") {
serialized = hexToBin(serialized);
}
const serializedBinChunks = decodeNullDataScript(serialized);
const contractCode = binToHex(serializedBinChunks[1]);
const code = String.fromCharCode(parseInt(contractCode, 16));
const instance = contractMap[code].fromOpReturn(serialized, network);
if (instance.isSpecial())
throw ("Too Special: " + serialized);
return instance;
}
export function opReturnToExecutorAllowance(serialized, network) {
if (typeof serialized === "string") {
serialized = hexToBin(serialized);
}
const serializedBinChunks = decodeNullDataScript(serialized);
const contractCode = binToHex(serializedBinChunks[1]);
const code = String.fromCharCode(parseInt(contractCode, 16));
const exAllowance = contractMap[code].getExecutorAllowance(serialized, network);
return exAllowance;
}
export async function opReturnToSpendableBalance(serialized, network = Network.MAINNET, networkProvider, blockHeight) {
if (typeof serialized === "string") {
serialized = hexToBin(serialized);
}
const serializedBinChunks = decodeNullDataScript(serialized);
const contractCode = binToHex(serializedBinChunks[1]);
const code = String.fromCharCode(parseInt(contractCode, 16));
if (!networkProvider)
networkProvider = new PsiNetworkProvider(network);
if (!blockHeight)
blockHeight = await networkProvider.getBlockHeight();
try {
const spendableBalance = await contractMap[code].getSpendableBalance(serialized, network, networkProvider, blockHeight);
return spendableBalance;
}
catch (e) {
console.log(`error getting balance for ${binToHex(serialized)}`);
return 0n;
}
}
export async function opReturnToBalance(serialized, network = Network.MAINNET, networkProvider, blockHeight) {
if (typeof serialized === "string") {
serialized = hexToBin(serialized);
}
const serializedBinChunks = decodeNullDataScript(serialized);
const address = lockingBytecodeToCashAddress({ bytecode: serializedBinChunks.pop(), prefix: "bitcoincash" });
if (typeof address !== "string")
throw Error("couldn't decode cashaddr");
if (!networkProvider)
networkProvider = new PsiNetworkProvider(network);
if (!blockHeight)
blockHeight = await networkProvider.getBlockHeight();
const balance = await BaseUtxPhiContract.getBalance(address, networkProvider);
return balance;
}
export function opReturnToSerializedString(serialized, network) {
const instance = opReturnToInstance(serialized, network);
if (instance) {
return instance.toString();
}
else {
return;
}
}
export function stringToInstance(serialized, network) {
const code = serialized[0];
try {
const instance = contractMap[code].fromString(serialized, network);
return instance;
}
catch (e) {
console.warn(`Couldn't parse serialized contract, ${e}`);
return;
}
}
export function castConstructorParametersFromArtifact(parameters, artifact) {
const result = [];
const inputs = artifact.constructorInputs;
parameters.forEach(function (value, i) {
const abiInput = inputs[i];
let parsedVal = undefined;
if (abiInput.type.startsWith("bytes")) {
if (typeof value === "string") {
if (value.includes(",")) {
parsedVal = Uint8Array.from(value.split(",").map((vStr) => parseInt(vStr)));
}
else {
parsedVal = hexToBin(value);
}
}
else {
throw Error(`Couldn't parse ${value} from string to bytes`);
}
}
else if (abiInput.type === "int") {
parsedVal = parseInt(value);
}
else if (abiInput.type === "boolean") {
parsedVal = Boolean(value);
}
else {
throw Error(`Couldn't parse type ${abiInput.type}`);
}
result.push({
name: abiInput.name,
cashScriptType: abiInput.type,
value: parsedVal,
});
});
}
//# sourceMappingURL=map.js.map