//Transfer Global Asset public static Transaction CreateGlobalTransfer(SignDelegate sign) { //交易输入是 1 GAS var inputs = new List <CoinReference> { //coin reference A new CoinReference() { PrevHash = new UInt256("0x21b64eb35881e7261c72c70f38bd6d5eb6aa18f232e08ba3022220b46c13d9a2".Remove(0, 2).HexToBytes().Reverse().ToArray()), PrevIndex = 0 } }.ToArray(); //交易输出是 0.999 GAS,找回到原地址 var outputs = new List <TransactionOutput> { new TransactionOutput() { AssetId = Blockchain.UtilityToken.Hash, //Asset Id, this is GAS ScriptHash = "Ad1HKAATNmFT5buNgSxspbW68f4XVSssSw".ToScriptHash(), //Receiver Value = new Fixed8((long)(0.999 * (long)Math.Pow(10, 8))) //Value (satoshi unit) } }.ToArray(); //则手续费是 0.001 GAS var tx = new ContractTransaction() { Outputs = outputs, Inputs = inputs, Attributes = new TransactionAttribute[0], Witnesses = new Witness[0], }; return(sign.Invoke(tx)); }
public static Transaction Claim(Wallet wallet, SignDelegate sign) { CoinReference[] claims = wallet.GetUnclaimedCoins().Select(p => p.Reference).ToArray(); if (claims.Length == 0) { return(null); } using (Snapshot snapshot = Blockchain.Singleton.GetSnapshot()) { ClaimTransaction tx = new ClaimTransaction { Claims = claims, Attributes = new TransactionAttribute[0], Inputs = new CoinReference[0], Outputs = new[] { new TransactionOutput { AssetId = Blockchain.UtilityToken.Hash, Value = snapshot.CalculateBonus(claims), ScriptHash = wallet.GetChangeAddress() } } }; return(sign.Invoke(tx)); } }
public static Transaction CreateGlobalTransfer(SignDelegate sign) { string preTxId = "0x7866a1aae60e7e6a2da87a681edf8c265db200ba68f4a96b447f85bb60c3594b"; UInt256 hash = UInt256.Parse(preTxId); Transaction tx1 = Blockchain.Singleton.GetTransaction(hash); Fixed8 preOutVal = tx1.Outputs[100].Value; Fixed8 currentOutVal = new Fixed8(1 * (long)Math.Pow(10, 8)); if (preOutVal < currentOutVal) { Console.WriteLine("insufficient fund"); return(null); } var inputs = new List <CoinReference> { new CoinReference() { PrevHash = new UInt256(preTxId.Remove(0, 2).HexToBytes().Reverse().ToArray()), PrevIndex = 100 } }.ToArray(); var outputs = new List <TransactionOutput>(); var output1 = new TransactionOutput() { AssetId = UInt256.Parse(assetid), ScriptHash = "AYuApoS1MQvJMQF7J9GiMcCA9du7s6YBwo".ToScriptHash(), Value = currentOutVal }; outputs.Add(output1); if (preOutVal > currentOutVal) { var output2 = new TransactionOutput() { AssetId = UInt256.Parse(assetid), ScriptHash = "AZi4EzuSSp4kiWCUvLZcWo8daymKf53ez6".ToScriptHash(), Value = preOutVal - currentOutVal }; outputs.Add(output2); } var tx = new ContractTransaction() { Outputs = outputs.ToArray(), Inputs = inputs, Attributes = new TransactionAttribute[0], Witnesses = new Witness[0] }; return(sign.Invoke(tx)); }
//CGAS MintTokens public static void MintTokens() { var inputs = new List <CoinReference> { new CoinReference() { PrevHash = new UInt256("0xf5088ce508d86197c991ff0ef7651ddf01f3e555f257039c972082250e899210".Remove(0, 2).HexToBytes().Reverse().ToArray()), PrevIndex = 0 } }.ToArray(); var outputs = new List <TransactionOutput> { new TransactionOutput() { AssetId = Blockchain.UtilityToken.Hash, //Asset Id, this is GAS ScriptHash = ScriptHash, //CGAS 地址 Value = new Fixed8((long)(1 * (long)Math.Pow(10, 8))) } }.ToArray(); Transaction tx = null; using (ScriptBuilder sb = new ScriptBuilder()) { sb.EmitAppCall(ScriptHash, "mintTokens"); sb.Emit(OpCode.THROWIFNOT); byte[] nonce = new byte[8]; Random rand = new Random(); rand.NextBytes(nonce); sb.Emit(OpCode.RET, nonce); tx = new InvocationTransaction { Version = 1, Script = sb.ToArray(), Outputs = outputs, Inputs = inputs, Attributes = new TransactionAttribute[0], Witnesses = new Witness[0] }; } var sign = new SignDelegate(SignWithWallet); sign.Invoke(tx, "1.json", "11111111"); Verify(tx); }
//Transfer NEP-5 Asset public static Transaction CreateNep5Transfer(SignDelegate sign) { var from = "AS8UDW7aLhrywLVHFL3ny5tSBaVhWTeZjT".ToScriptHash(); var assetId = new UInt160("ceab719b8baa2310f232ee0d277c061704541cfb".HexToBytes().Reverse().ToArray()); var to = "AS8UDW7aLhrywLVHFL3ny5tSBaVhWTeZjT".ToScriptHash(); var value = 100; //交易输入是 1 GAS var inputs = new List <CoinReference> { //coin reference A new CoinReference() { PrevHash = new UInt256("0x51ac4f7f1662d8c9379ccce3fa7cd2085b9a865edfa53ad892352a41768dd1de".Remove(0, 2).HexToBytes().Reverse().ToArray()), PrevIndex = 0 } }.ToArray(); //交易输出是 0.999 GAS,找回到原地址 var outputs = new List <TransactionOutput> { new TransactionOutput() { AssetId = Blockchain.UtilityToken.Hash, //Asset Id, this is NEO ScriptHash = "AJd31a8rYPEBkY1QSxpsGy8mdU4vTYTD4U".ToScriptHash(), //Receiver Value = new Fixed8((long)(0.999 * (long)Math.Pow(10, 8))) //Value (satoshi unit) } }.ToArray(); //则手续费是 0.001 GAS //Query Balances using (ScriptBuilder sb2 = new ScriptBuilder()) { byte[] script; sb2.EmitAppCall(assetId, "balanceOf", from); sb2.Emit(OpCode.DEPTH, OpCode.PACK); script = sb2.ToArray(); ApplicationEngine engine = ApplicationEngine.Run(script); if (engine.State.HasFlag(VMState.FAULT)) { return(null); } var balances = ((VMArray)engine.ResultStack.Pop())[0]; BigInteger sum = balances.GetBigInteger(); if (sum < value) { Console.WriteLine("Insufficient balance"); return(null); } } //Transfer using (ScriptBuilder sb = new ScriptBuilder()) { sb.EmitAppCall(assetId, "transfer", from, to, value); sb.Emit(OpCode.THROWIFNOT); byte[] nonce = new byte[8]; Random rand = new Random(); rand.NextBytes(nonce); sb.Emit(OpCode.RET, nonce); var tx = new InvocationTransaction { Version = 1, Script = sb.ToArray(), Outputs = outputs, Inputs = inputs, Attributes = new TransactionAttribute[0], Witnesses = new Witness[0] }; return(sign.Invoke(tx)); } }