UNPKG

meta-contract-debug

Version:

Meta Contract SDK

223 lines (222 loc) 10.4 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.TokenTransferCheckFactory = exports.TokenTransferCheck = exports.TOKEN_TRANSFER_TYPE = void 0; const BN = require("../../bn.js"); const mvc = require("../../mvc"); const ContractAdapter_1 = require("../../common/ContractAdapter"); const dummy_1 = require("../../common/dummy"); const TokenUtil = require("../../common/tokenUtil"); const utils_1 = require("../../common/utils"); const scryptlib_1 = require("../../scryptlib"); const token_proto_1 = require("../contract-proto/token.proto"); const proto = require("../contract-proto/tokenTransferCheck.proto"); const token_1 = require("./token"); var TOKEN_TRANSFER_TYPE; (function (TOKEN_TRANSFER_TYPE) { TOKEN_TRANSFER_TYPE[TOKEN_TRANSFER_TYPE["IN_3_OUT_3"] = 1] = "IN_3_OUT_3"; TOKEN_TRANSFER_TYPE[TOKEN_TRANSFER_TYPE["IN_6_OUT_6"] = 2] = "IN_6_OUT_6"; TOKEN_TRANSFER_TYPE[TOKEN_TRANSFER_TYPE["IN_10_OUT_10"] = 3] = "IN_10_OUT_10"; TOKEN_TRANSFER_TYPE[TOKEN_TRANSFER_TYPE["IN_20_OUT_3"] = 4] = "IN_20_OUT_3"; TOKEN_TRANSFER_TYPE[TOKEN_TRANSFER_TYPE["IN_3_OUT_100"] = 5] = "IN_3_OUT_100"; TOKEN_TRANSFER_TYPE[TOKEN_TRANSFER_TYPE["UNSUPPORT"] = 6] = "UNSUPPORT"; })(TOKEN_TRANSFER_TYPE = exports.TOKEN_TRANSFER_TYPE || (exports.TOKEN_TRANSFER_TYPE = {})); let _tokenTransferTypeInfos = [ { type: TOKEN_TRANSFER_TYPE.IN_3_OUT_3, in: 3, out: 3, lockingScriptSize: 0, }, { type: TOKEN_TRANSFER_TYPE.IN_6_OUT_6, in: 6, out: 6, lockingScriptSize: 0, }, { type: TOKEN_TRANSFER_TYPE.IN_10_OUT_10, in: 10, out: 10, lockingScriptSize: 0, }, { type: TOKEN_TRANSFER_TYPE.IN_20_OUT_3, in: 20, out: 3, lockingScriptSize: 0, }, { type: TOKEN_TRANSFER_TYPE.IN_3_OUT_100, in: 3, out: 100, lockingScriptSize: 0, }, ]; class TokenTransferCheck extends ContractAdapter_1.ContractAdapter { constructor(constuctParams) { let desc; switch (constuctParams.checkType) { case TOKEN_TRANSFER_TYPE.IN_3_OUT_3: desc = require('../contract-desc/tokenTransferCheck_desc.json'); break; case TOKEN_TRANSFER_TYPE.IN_6_OUT_6: desc = require('../contract-desc/tokenTransferCheck_6To6_desc.json'); break; case TOKEN_TRANSFER_TYPE.IN_10_OUT_10: desc = require('../contract-desc/tokenTransferCheck_10To10_desc.json'); break; case TOKEN_TRANSFER_TYPE.IN_3_OUT_100: desc = require('../contract-desc/tokenTransferCheck_3To100_desc.json'); break; case TOKEN_TRANSFER_TYPE.IN_20_OUT_3: desc = require('../contract-desc/tokenTransferCheck_20To3_desc.json'); break; default: throw 'invalid checkType'; } let ClassObj = (0, scryptlib_1.buildContractClass)(desc); let contract = new ClassObj(); super(contract); this.constuctParams = constuctParams; this._formatedDataPart = {}; } clone() { let contract = new TokenTransferCheck(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, // receiverSatoshiArray, tokenOutputSatoshis, changeSatoshis, changeAddress, opReturnScript, }) { return this._contract.unlock(txPreimage, prevouts, tokenScript, // token tokenTxHeaderArray, tokenTxHashProofArray, tokenSatoshiBytesArray, inputTokenAddressArray, inputTokenAmountArray, // receiverSatoshiArray, tokenOutputSatoshis, // same changeSatoshis, changeAddress, opReturnScript); } } exports.TokenTransferCheck = TokenTransferCheck; class TokenTransferCheckFactory { static getLockingScriptSize(checkType) { return this.tokenTransferTypeInfos.find((v) => v.type == checkType).lockingScriptSize; } static getOptimumType(inCount, outCount) { let typeInfo = this.tokenTransferTypeInfos.find((v) => inCount <= v.in && outCount <= v.out); if (!typeInfo) { return TOKEN_TRANSFER_TYPE.UNSUPPORT; } return typeInfo.type; } static createContract(tokenTransferType) { return new TokenTransferCheck({ checkType: tokenTransferType }); } static getDummyInstance(checkType) { let v = this.tokenTransferTypeInfos.find((v) => v.type == checkType); let tokenInputArray = new Array(v.in).fill(0); let tokenOutputArray = new Array(v.out).fill({ address: dummy_1.dummyAddress, tokenAmount: BN.Zero, }); let contract = this.createContract(v.type); contract.setFormatedDataPart({ nSenders: tokenInputArray.length, receiverTokenAmountArray: tokenOutputArray.map((v) => v.tokenAmount), receiverArray: tokenOutputArray.map((v) => v.address), nReceivers: tokenOutputArray.length, tokenCodeHash: (0, scryptlib_1.toHex)(dummy_1.dummyCodehash), tokenID: (0, scryptlib_1.toHex)(dummy_1.dummyCodehash), }); return contract; } static calLockingScriptSize(checkType) { let contract = this.getDummyInstance(checkType); return contract.lockingScript.toBuffer().length; } static calUnlockingScriptSize(checkType, bsvInputLen, tokenInputLen, tokenOutputLen, opreturnData) { return 1000; // TODO:!!! let opreturnScriptHex = ''; if (opreturnData) { let script = mvc.Script.buildSafeDataOut(opreturnData); opreturnScriptHex = script.toHex(); } let contract = this.getDummyInstance(checkType); let tokenContractInstance = token_1.TokenFactory.getDummyInstance(); const preimage = (0, scryptlib_1.getPreimage)(dummy_1.dummyTx, contract.lockingScript.toASM(), 1); const sig = Buffer.from(utils_1.PLACE_HOLDER_SIG, 'hex'); const rabinMsg = dummy_1.dummyPayload; let checkRabinMsgArray = Buffer.alloc(0); let checkRabinSigArray = Buffer.alloc(0); let checkRabinPaddingArray = Buffer.alloc(0); let paddingCountBuf = Buffer.alloc(2, 0); paddingCountBuf.writeUInt16LE(dummy_1.dummyPadding.length / 2); const padding = Buffer.alloc(dummy_1.dummyPadding.length / 2, 0); padding.write(dummy_1.dummyPadding, 'hex'); const rabinPaddingArray = []; const rabinSigArray = []; const rabinPubKeyIndexArray = []; const rabinPubKeyArray = []; const sigBuf = TokenUtil.toBufferLE(dummy_1.dummySigBE, TokenUtil.RABIN_SIG_LEN); let inputTokenAddressArray = Buffer.alloc(0); let inputTokenAmountArray = Buffer.alloc(0); let tokenAmount = Buffer.alloc(8); tokenAmount.writeInt32BE(100000); for (let i = 0; i < tokenInputLen; i++) { inputTokenAddressArray = Buffer.concat([inputTokenAddressArray, dummy_1.dummyAddress.toBuffer()]); inputTokenAmountArray = Buffer.concat([inputTokenAmountArray, tokenAmount]); for (let j = 0; j < token_proto_1.SIGNER_VERIFY_NUM; j++) { if (j == 0) { checkRabinMsgArray = Buffer.concat([checkRabinMsgArray, Buffer.from(dummy_1.dummyPayload, 'hex')]); } checkRabinSigArray = Buffer.concat([checkRabinSigArray, sigBuf]); checkRabinPaddingArray = Buffer.concat([checkRabinPaddingArray, paddingCountBuf, padding]); } } for (let i = 0; i < token_proto_1.SIGNER_VERIFY_NUM; i++) { rabinPaddingArray.push(new scryptlib_1.Bytes(dummy_1.dummyPadding)); rabinSigArray.push(new scryptlib_1.Int(BN.fromString(dummy_1.dummySigBE, 16).toString(10))); rabinPubKeyIndexArray.push(i); rabinPubKeyArray.push(new scryptlib_1.Int(dummy_1.dummyRabinPubKey.toString(10))); } const tokenInputIndex = 0; let prevouts = Buffer.alloc(0); const indexBuf = TokenUtil.getUInt32Buf(0); const txidBuf = TokenUtil.getTxIdBuf(dummy_1.dummyTxId); for (let i = 0; i < tokenInputLen + bsvInputLen + 1; i++) { prevouts = Buffer.concat([prevouts, txidBuf, indexBuf]); } let receiverSatoshiArray = Buffer.alloc(0); for (let i = 0; i < tokenOutputLen; i++) { receiverSatoshiArray = Buffer.concat([receiverSatoshiArray, Buffer.alloc(8)]); } return 1000; // let unlockedContract = contract.unlock({ // txPreimage: new SigHashPreimage(toHex(preimage)), // tokenScript: new Bytes(tokenContractInstance.lockingScript.toHex()), // prevouts: new Bytes(toHex(prevouts)), // rabinMsgArray: new Bytes(toHex(checkRabinMsgArray)), // rabinPaddingArray: new Bytes(toHex(checkRabinPaddingArray)), // rabinSigArray: new Bytes(toHex(checkRabinSigArray)), // rabinPubKeyIndexArray, // rabinPubKeyVerifyArray: rabinPubKeyArray, // rabinPubKeyHashArray: new Bytes(toHex(dummyRabinPubKeyHashArray)), // inputTokenAddressArray: new Bytes(toHex(inputTokenAddressArray)), // inputTokenAmountArray: new Bytes(toHex(inputTokenAmountArray)), // receiverSatoshiArray: new Bytes(toHex(receiverSatoshiArray)), // changeSatoshis: new Int(1000), // changeAddress: new Ripemd160(toHex(dummyAddress.hashBuffer)), // opReturnScript: new Bytes(opreturnScriptHex), // }) // return (unlockedContract.toScript() as mvc.Script).toBuffer().length } } exports.TokenTransferCheckFactory = TokenTransferCheckFactory; TokenTransferCheckFactory.tokenTransferTypeInfos = _tokenTransferTypeInfos;