private static byte[] serializeTxArgs(TxArgs txArgs) { byte[] result = new byte[] { }; result = WriteVarBytes(txArgs.toAddress, result); result = WriteUint64(txArgs.amount, result); return(result); }
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); }
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); }
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); }