UNPKG

meta-contract

Version:

Meta Contract SDK

143 lines (142 loc) 5.91 kB
"use strict"; 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;