import "nftGuardProto.scrypt";import "../utils/txProof.scrypt";import "../utils/sigHashUtils.scrypt";import "../utils/stateUtils.scrypt";import "../utils/txUtil.scrypt"; contract NftTransferGuard { public function transfer(bytes[5] curTxoStateHashes, bytes[5] ownerAddrOrScriptList, int[5] localIdList, bool[5] nftOutputMaskList, bytes[5] outputSatoshisList, bytes nftSatoshis, NftGuardConstState preState, XrayedTxIdPreimg3 preTx, SHPreimage shPreimage, PrevoutsCtx prevoutsCtx, bytes[6] spentScripts) { require(checkSig(SigHashUtils.checkSHPreimage(shPreimage), SigHashUtils.Gx)); SigHashUtils.checkPrevoutsCtx(prevoutsCtx, shPreimage.hashPrevouts, shPreimage.inputIndex); SigHashUtils.checkSpentScriptsCtx(spentScripts, shPreimage.hashSpentScripts); StateUtils.verifyGuardStateHash(preTx, prevoutsCtx.spentTxhash, NftGuardProto.stateHash(preState)); int[5] localIdArray = repeat(-1, 5); int localIdArrayIndex = 0; loop (6) : i { bytes script = spentScripts[i]; if(script == preState.collectionScript) { localIdArray[(localIdArrayIndex)] = preState.localIdArray[i]; localIdArrayIndex += 1; } } bytes stateHashString = b''; bytes outputs = b''; int outputLocalIdArrayIndex = 0; bytes nftOutput = TxUtil.buildOutput(preState.collectionScript, nftSatoshis); loop (5) : i { bytes addrOrScript = ownerAddrOrScriptList[i]; if(nftOutputMaskList[i]) { int localId = localIdArray[(outputLocalIdArrayIndex)]; outputs = outputs + nftOutput; Ripemd160 nftStateHash = hash160(hash160(addrOrScript + pack(localId))); require(hash160(curTxoStateHashes[i]) == nftStateHash); require(localId >= 0); require(localIdList[i] == localId); stateHashString += nftStateHash; outputLocalIdArrayIndex += 1; } else { require(addrOrScript != preState.collectionScript); stateHashString += hash160(curTxoStateHashes[i]); if(len(addrOrScript) > 0) { outputs += TxUtil.buildOutput(addrOrScript, outputSatoshisList[i]); } } } require(localIdArrayIndex == outputLocalIdArrayIndex); bytes stateOutput = TxUtil.buildOpReturnRoot(TxUtil.getStateScript(hash160(stateHashString))); Sha256 hashOutputs = sha256(stateOutput + outputs); require(hashOutputs == shPreimage.hashOutputs); } }