示例#1
0
        public async Task AddAsset(InboundTransaction transaction)
        {
            byte[] serializedMutation = await CreateTransaction(transaction);
            if (serializedMutation == null)
                return;

            await SignAndSubmit(serializedMutation);
        }
示例#2
0
        public async Task AddAsset(InboundTransaction transaction)
        {
            byte[] serializedMutation = await CreateTransaction(transaction);

            if (serializedMutation == null)
            {
                return;
            }

            await SignAndSubmit(serializedMutation);
        }
示例#3
0
        private async Task <byte[]> CreateTransaction(InboundTransaction transaction)
        {
            List <Record> records = new List <Record>();

            string issuanceAccount = $"/asset/{assetName}/in/{transaction.TransactionHash}/{transaction.OutputIndex}/";
            string asset           = $"/asset/{assetName}/";
            string toAddress       = transaction.Address;

            HttpClient          client           = new HttpClient();
            ByteString          issuanceKey      = Encode($"{issuanceAccount}:ACC:{asset}");
            HttpResponseMessage getValueResponse = await client.GetAsync(new Uri(openChainUri, $"record?key={issuanceKey.ToString()}"));

            string stringResponse = await getValueResponse.EnsureSuccessStatusCode().Content.ReadAsStringAsync();

            ByteString issuanceVersion = ByteString.Parse((string)JObject.Parse(stringResponse)["version"]);

            // The transaction has already been submitted
            if (issuanceVersion.Value.Count != 0)
            {
                return(null);
            }

            ByteString key = Encode($"{toAddress}:ACC:{asset}");

            getValueResponse = await client.GetAsync(new Uri(openChainUri, $"record?key={key.ToString()}"));

            JObject    toAccount        = JObject.Parse(await getValueResponse.EnsureSuccessStatusCode().Content.ReadAsStringAsync());
            ByteString version          = ByteString.Parse((string)toAccount["version"]);
            long       currentToBalance = ParseInt(ByteString.Parse((string)toAccount["value"]));

            records.Add(new Record(
                            key: issuanceKey,
                            value: new ByteString(BitConverter.GetBytes(-transaction.Amount).Reverse().ToArray()),
                            version: ByteString.Empty));

            records.Add(new Record(
                            key: key,
                            value: new ByteString(BitConverter.GetBytes(currentToBalance + transaction.Amount).Reverse().ToArray()),
                            version: version));

            Mutation mutation = new Mutation(
                Encode(this.openChainUri.ToString()),
                records,
                ByteString.Empty);

            return(MessageSerializer.SerializeMutation(mutation));
        }
示例#4
0
        public async Task <string> MoveToStorage(InboundTransaction transaction)
        {
            NBitcoin.Transaction tx = new TransactionBuilder()
                                      .AddKeys(ReceivingKey)
                                      .AddCoins(new Coin(
                                                    uint256.Parse(transaction.TransactionHash),
                                                    (uint)transaction.OutputIndex,
                                                    transaction.Amount,
                                                    ReceivingKey.ScriptPubKey))
                                      .Send(storageKey.ScriptPubKey, transaction.Amount - defaultFees)
                                      .SendFees(defaultFees)
                                      .BuildTransaction(true);

            string result = await SubmitTransaction(new ByteString(tx.ToBytes()));

            return(result);
        }
示例#5
0
        private async Task<byte[]> CreateTransaction(InboundTransaction transaction)
        {
            List<Record> records = new List<Record>();

            string issuanceAccount = $"/asset/{assetName}/in/{transaction.TransactionHash}/{transaction.OutputIndex}/";
            string asset = $"/asset/{assetName}/";
            string toAddress = transaction.Address;

            HttpClient client = new HttpClient();
            ByteString issuanceKey = Encode($"{issuanceAccount}:ACC:{asset}");
            HttpResponseMessage getValueResponse = await client.GetAsync(new Uri(openChainUri, $"record?key={issuanceKey.ToString()}"));
            string stringResponse = await getValueResponse.EnsureSuccessStatusCode().Content.ReadAsStringAsync();
            ByteString issuanceVersion = ByteString.Parse((string)JObject.Parse(stringResponse)["version"]);

            // The transaction has already been submitted
            if (issuanceVersion.Value.Count != 0)
                return null;

            ByteString key = Encode($"{toAddress}:ACC:{asset}");
            getValueResponse = await client.GetAsync(new Uri(openChainUri, $"record?key={key.ToString()}"));
            JObject toAccount = JObject.Parse(await getValueResponse.EnsureSuccessStatusCode().Content.ReadAsStringAsync());
            ByteString version = ByteString.Parse((string)toAccount["version"]);
            long currentToBalance = ParseInt(ByteString.Parse((string)toAccount["value"]));

            records.Add(new Record(
                key: issuanceKey,
                value: new ByteString(BitConverter.GetBytes(-transaction.Amount).Reverse().ToArray()),
                version: ByteString.Empty));

            records.Add(new Record(
                key: key,
                value: new ByteString(BitConverter.GetBytes(currentToBalance + transaction.Amount).Reverse().ToArray()),
                version: version));

            Mutation mutation = new Mutation(
                Encode(this.openChainUri.ToString()),
                records,
                ByteString.Empty);

            return MessageSerializer.SerializeMutation(mutation);
        }
示例#6
0
        public async Task<string> MoveToStorage(InboundTransaction transaction)
        {
            NBitcoin.Transaction tx = new TransactionBuilder()
                .AddKeys(ReceivingKey)
                .AddCoins(new Coin(
                    uint256.Parse(transaction.TransactionHash),
                    (uint)transaction.OutputIndex,
                    transaction.Amount,
                    ReceivingKey.ScriptPubKey))
                .Send(storageKey.ScriptPubKey, transaction.Amount - defaultFees)
                .SendFees(defaultFees)
                .BuildTransaction(true);

            string result = await SubmitTransaction(new ByteString(tx.ToBytes()));

            return result;
        }