public static bool Refund(byte[] fromAddress, BigInteger amount, byte[] assetId) { //提现检查 if (!Runtime.CheckWitness(fromAddress)) { return(false); } BigInteger currentHeight = Blockchain.GetHeight(); if (!checkIfStart(currentHeight)) { return(false); } byte[] key = assetId.Concat(fromAddress); var result = Storage.Get(key); if (result.Length == 0) { return(false); } StakingReocrd stakingRecord = (StakingReocrd)result.Deserialize(); //Nep5转账 object[] Params = new object[] { ExecutionEngine.ExecutingScriptHash, fromAddress, amount }; DyncCall nep5Contract = (DyncCall)assetId.ToDelegate(); if (!(bool)nep5Contract("transfer", Params)) { return(false); //throw exception when release } if (stakingRecord.amount < amount || !(stakingRecord.fromAddress.Equals(fromAddress)) || !(stakingRecord.assetId.Equals(assetId))) { return(false); } else { BigInteger remainAmount = (stakingRecord.amount - amount); UpdateStackRecord(assetId); //收益结算 BigInteger currentProfit = SettleProfit(stakingRecord.height, stakingRecord.amount, assetId) + stakingRecord.Profit; SaveUserStaking(fromAddress, remainAmount, assetId, currentHeight, currentProfit, key); } return(true); }
private static bool ExecuteCrossChainTx(ToMerkleValue value) { if (value.TxParam.toContract.Length == 20) { DyncCall TargetContract = (DyncCall)value.TxParam.toContract.ToDelegate(); object[] parameter = new object[] { value.TxParam.args, value.TxParam.fromContract, value.fromChainID }; if (TargetContract(value.TxParam.method.AsString(), parameter) is null) { return(false); } else { Storage.Put(transactionPrefix.Concat(value.txHash), 1); return(true); } } else { Runtime.Notify("Contract length is not correct"); return(false); } }