Esempio n. 1
0
 private static byte[] serializeTxArgs(TxArgs txArgs)
 {
     byte[] result = new byte[] { };
     result = WriteVarBytes(txArgs.toAddress, result);
     result = WriteUint64(txArgs.amount, result);
     return(result);
 }
Esempio n. 2
0
        public static bool LockAsset(byte[] fromAddress, byte[] toUserAddress, BigInteger amount, BigInteger toChainId)
        {
            bool success = false;

            byte[] txData       = new byte[] { };
            byte[] AssetHash    = GetAssetHash(toChainId);
            byte[] redeemScript = GetRedeemScript();
            TxArgs txArgs       = new TxArgs
            {
                toAddress = toUserAddress,
                amount    = amount
            };

            if (toChainId == 1)
            {
                if (amount < 2000)
                {
                    Runtime.Notify("btcx amount should be greater than 2000");
                    return(false);
                }
                else
                {
                    txData = serializeToBtcTxArgs(txArgs, redeemScript);
                }
            }
            else
            {
                txData = serializeTxArgs(txArgs);
            }
            //call transfer method
            success = Transfer(fromAddress, ExecutionEngine.ExecutingScriptHash, amount, new byte[] { });
            if (!success)
            {
                Runtime.Notify("failed to transfer");
                return(success);
            }
            //call CCMC cross chain method
            var param = new object[] { toChainId, AssetHash, "unlock", txData };
            var ccmc  = (DyncCall)CCMCScriptHash.ToDelegate();

            success = (bool)ccmc("CrossChain", param);
            if (!success)
            {
                Runtime.Notify("failed to call CCMC");
                Transfer(ExecutionEngine.ExecutingScriptHash, fromAddress, amount, ExecutionEngine.ExecutingScriptHash);
            }
            else
            {
                Lock(ExecutionEngine.ExecutingScriptHash, fromAddress, toChainId, redeemScript, toUserAddress, amount);
            }
            return(success);
        }
Esempio n. 3
0
        private static TxArgs deserializeTxArgs(byte[] source)
        {
            TxArgs txArgs = new TxArgs();
            int    offset = 0;
            var    Temp   = ReadVarBytes(source, offset);

            txArgs.toAddress = (byte[])Temp[0];
            offset           = (int)Temp[1];

            txArgs.amount = ReadUint64(source, offset);
            offset       += 8;
            return(txArgs);
        }
Esempio n. 4
0
        public static bool UnlockAsset(byte[] argsBytes, byte[] fromContractAddress, BigInteger fromChainId, byte[] caller)
        {
            bool success = false;

            if (!caller.Equals(CCMCScriptHash))
            {
                Runtime.Notify("Only allowed to be called by CCMC");
                return(false);
            }
            byte[] AssetHash = GetAssetHash(fromChainId);
            if (!fromContractAddress.Equals(AssetHash))
            {
                Runtime.Notify(AssetHash);
                Runtime.Notify(fromContractAddress);
                Runtime.Notify("fromContractAddress not correct");
                return(false);
            }
            TxArgs txArgs = new TxArgs();

            txArgs = deserializeTxArgs(argsBytes);
            if (txArgs.amount < 0)
            {
                Runtime.Notify("ToChain Amount SHOULD not be less than 0.");
                return(false);
            }
            //transfer asset to toAddress
            success = Transfer(ExecutionEngine.ExecutingScriptHash, txArgs.toAddress, txArgs.amount, ExecutionEngine.ExecutingScriptHash);
            if (!success)
            {
                Runtime.Notify("Failed to transfer NEP5 token to toAddress.");
            }
            else
            {
                Unlock(ExecutionEngine.ExecutingScriptHash, txArgs.toAddress, txArgs.amount);
            }
            return(success);
        }