meta-contract
Version:
Meta Contract SDK
143 lines (142 loc) • 5.91 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.TokenUnlockContractCheckFactory = exports.TokenUnlockContractCheck = exports.TOKEN_UNLOCK_TYPE = void 0;
const ContractAdapter_1 = require("../../common/ContractAdapter");
const scryptlib_1 = require("../../scryptlib");
const proto = require("../contract-proto/tokenUnlockContractCheck.proto");
const dummy_1 = require("../../common/dummy");
var TOKEN_UNLOCK_TYPE;
(function (TOKEN_UNLOCK_TYPE) {
TOKEN_UNLOCK_TYPE[TOKEN_UNLOCK_TYPE["IN_2_OUT_5"] = 1] = "IN_2_OUT_5";
TOKEN_UNLOCK_TYPE[TOKEN_UNLOCK_TYPE["IN_4_OUT_8"] = 2] = "IN_4_OUT_8";
TOKEN_UNLOCK_TYPE[TOKEN_UNLOCK_TYPE["IN_8_OUT_12"] = 3] = "IN_8_OUT_12";
TOKEN_UNLOCK_TYPE[TOKEN_UNLOCK_TYPE["IN_3_OUT_100"] = 4] = "IN_3_OUT_100";
TOKEN_UNLOCK_TYPE[TOKEN_UNLOCK_TYPE["IN_20_OUT_5"] = 5] = "IN_20_OUT_5";
TOKEN_UNLOCK_TYPE[TOKEN_UNLOCK_TYPE["UNSUPPORT"] = 6] = "UNSUPPORT";
})(TOKEN_UNLOCK_TYPE = exports.TOKEN_UNLOCK_TYPE || (exports.TOKEN_UNLOCK_TYPE = {}));
const _tokenUnlockTypeInfos = [
{
type: TOKEN_UNLOCK_TYPE.IN_2_OUT_5,
in: 2,
out: 5,
lockingScriptSize: 0,
},
{
type: TOKEN_UNLOCK_TYPE.IN_4_OUT_8,
in: 4,
out: 8,
lockingScriptSize: 0,
},
{
type: TOKEN_UNLOCK_TYPE.IN_3_OUT_100,
in: 3,
out: 100,
lockingScriptSize: 0,
},
{
type: TOKEN_UNLOCK_TYPE.IN_8_OUT_12,
in: 8,
out: 12,
lockingScriptSize: 0,
},
{
type: TOKEN_UNLOCK_TYPE.IN_20_OUT_5,
in: 20,
out: 5,
lockingScriptSize: 0,
},
];
class TokenUnlockContractCheck extends ContractAdapter_1.ContractAdapter {
constructor(constuctParams) {
let desc;
switch (constuctParams.unlockType) {
case TOKEN_UNLOCK_TYPE.IN_2_OUT_5:
desc = require('../contract-desc/tokenUnlockContractCheck_desc.json');
break;
case TOKEN_UNLOCK_TYPE.IN_4_OUT_8:
desc = require('../contract-desc/tokenUnlockContractCheck_4To8_desc.json');
break;
case TOKEN_UNLOCK_TYPE.IN_8_OUT_12:
desc = require('../contract-desc/tokenUnlockContractCheck_8To12_desc.json');
break;
case TOKEN_UNLOCK_TYPE.IN_3_OUT_100:
desc = require('../contract-desc/tokenUnlockContractCheck_3To100_desc.json');
break;
case TOKEN_UNLOCK_TYPE.IN_20_OUT_5:
desc = require('../contract-desc/tokenUnlockContractCheck_20To5_desc.json');
break;
default:
throw 'invalid unlockType';
}
let ClassObj = (0, scryptlib_1.buildContractClass)(desc);
let contract = new ClassObj();
super(contract);
this.constuctParams = constuctParams;
this._formatedDataPart = {};
}
clone() {
let contract = new TokenUnlockContractCheck(this.constuctParams);
contract.setFormatedDataPart(this.getFormatedDataPart());
return contract;
}
setFormatedDataPart(dataPart) {
this._formatedDataPart = Object.assign({}, this._formatedDataPart, dataPart);
super.setDataPart((0, scryptlib_1.toHex)(proto.newDataPart(this._formatedDataPart)));
}
getFormatedDataPart() {
return this._formatedDataPart;
}
unlock({ txPreimage, prevouts, tokenScript, tokenTxHeaderArray, tokenTxHashProofArray, tokenSatoshiBytesArray, inputTokenAddressArray, inputTokenAmountArray, nOutputs, tokenOutputIndexArray, tokenOutputSatoshis, otherOutputArray, }) {
return this._contract.unlock(txPreimage, prevouts, tokenScript, tokenTxHeaderArray, tokenTxHashProofArray, tokenSatoshiBytesArray, inputTokenAddressArray, inputTokenAmountArray, nOutputs, tokenOutputIndexArray, tokenOutputSatoshis, otherOutputArray);
}
}
exports.TokenUnlockContractCheck = TokenUnlockContractCheck;
class TokenUnlockContractCheckFactory {
static getOptimumType(inCount, outCount) {
if (inCount <= 2 && outCount <= 5) {
return TOKEN_UNLOCK_TYPE.IN_2_OUT_5;
}
else if (inCount <= 4 && outCount <= 8) {
return TOKEN_UNLOCK_TYPE.IN_4_OUT_8;
}
else if (inCount <= 8 && outCount <= 12) {
return TOKEN_UNLOCK_TYPE.IN_8_OUT_12;
}
else if (inCount <= 20 && outCount <= 5) {
return TOKEN_UNLOCK_TYPE.IN_20_OUT_5;
}
else if (inCount <= 3 && outCount <= 100) {
return TOKEN_UNLOCK_TYPE.IN_3_OUT_100;
}
else {
return TOKEN_UNLOCK_TYPE.UNSUPPORT;
}
}
static createContract(unlockType) {
return new TokenUnlockContractCheck({ unlockType });
}
static getLockingScriptSize(unlockType) {
return this.tokenUnlockTypeInfos.find((v) => v.type == unlockType).lockingScriptSize;
}
static calUnlockingScriptSize(checkType, mvcInputLen, tokenInputLen, tokenOutputLen, opreturnData) {
// todo finish this
return 1000;
}
static getDummyInstance(unlockType) {
let v = this.tokenUnlockTypeInfos.find((v) => v.type == unlockType);
let tokenInputArray = new Array(v.in).fill(0);
let contract = this.createContract(v.type);
contract.setFormatedDataPart({
inputTokenIndexArray: tokenInputArray,
tokenCodeHash: (0, scryptlib_1.toHex)(dummy_1.dummyCodehash),
tokenID: (0, scryptlib_1.toHex)(dummy_1.dummyCodehash),
receiverTokenAmountArray: [],
receiverArray: [],
nReceivers: 0,
nSender: tokenInputArray.length,
});
return contract;
}
}
exports.TokenUnlockContractCheckFactory = TokenUnlockContractCheckFactory;
TokenUnlockContractCheckFactory.tokenUnlockTypeInfos = _tokenUnlockTypeInfos;