示例#1
0
        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);
        }
示例#2
0
 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);
     }
 }