Skip to content

Commit

Permalink
CoinprismColoredTransactionRepository
Browse files Browse the repository at this point in the history
  • Loading branch information
NicolasDorier committed Oct 5, 2014
1 parent 9a5e496 commit 7f3a9eb
Show file tree
Hide file tree
Showing 7 changed files with 178 additions and 10 deletions.
31 changes: 26 additions & 5 deletions NBitcoin.Tests/ColoredCoinsTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -115,12 +115,15 @@ public ScriptId Id
}

//[Fact]
//public void TestFun()
//{
// var repo = new NoSqlColoredTransactionRepository(new BlockrTransactionRepository());
// var colored = ColoredTransaction.FetchColors(new uint256("b4399a545c4ddd640920d63af75e7367fe4d94b2d7f7a3423105e25ac5f165a6"), repo);
public void TestFun()
{
var repo = new NoSqlColoredTransactionRepository(new BlockrTransactionRepository());
var colored = ColoredTransaction.FetchColors(new uint256("b4399a545c4ddd640920d63af75e7367fe4d94b2d7f7a3423105e25ac5f165a6"), repo);

var prismColored = new CoinprismColoredTransactionRepository().Get(new uint256("b4399a545c4ddd640920d63af75e7367fe4d94b2d7f7a3423105e25ac5f165a6"));

//}
Assert.True(colored.ToBytes().SequenceEqual(prismColored.ToBytes()));
}

[Fact]
[Trait("UnitTest", "UnitTest")]
Expand Down Expand Up @@ -235,6 +238,24 @@ private static Transaction CreateSpecTransaction(NoSqlColoredTransactionReposito
return testedTx;
}


[Fact]
[Trait("UnitTest", "UnitTest")]
public void CanFetchTransactionFromCoinprism()
{
CanFetchTransactionFromCoinprismCore("CanColorizeIssuanceTransaction");
CanFetchTransactionFromCoinprismCore("CanColorizeTransferTransaction");
Assert.Null(new CoinprismColoredTransactionRepository().Get(new uint256("b4399a545c4ddd640920d63af75e7367fe4d94b2d7f7a3423105e25ac5f165a5")));
}

private void CanFetchTransactionFromCoinprismCore(string test)
{
var tester = CreateTester(test);
var expected = ColoredTransaction.FetchColors(tester.TestedTxId, tester.Repository);
var actual = new CoinprismColoredTransactionRepository().Get(tester.TestedTxId);
Assert.True(actual.ToBytes().SequenceEqual(expected.ToBytes()));
}

//https://www.coinprism.info/tx/b4399a545c4ddd640920d63af75e7367fe4d94b2d7f7a3423105e25ac5f165a6
//Asset Id : 3QzJDrSsi4Pm2DhcZFXR9MGJsXXtsYhUsq
//1BvvRfz4XnxSWJ524TusetYKrtZnAbgV3r to 18Jcv42cRknPmxrQPb2zSBuEVWq3egjCKq
Expand Down
4 changes: 2 additions & 2 deletions NBitcoin/BitcoinAddress.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,8 @@ namespace NBitcoin
public class BitcoinScriptAddress : BitcoinAddress
{

public BitcoinScriptAddress(string address, Network network)
: base(address, network)
public BitcoinScriptAddress(string address, Network expectedNetwork)
: base(address, expectedNetwork)
{
}

Expand Down
2 changes: 1 addition & 1 deletion NBitcoin/BlockrTransactionRepository.cs
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ public Transaction Get(uint256 txId)

public void Put(uint256 txId, Transaction tx)
{
throw new NotSupportedException();

}

#endregion
Expand Down
1 change: 1 addition & 0 deletions NBitcoin/NBitcoin.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,7 @@
<Compile Include="OpenAsset\Asset.cs" />
<Compile Include="BlockrTransactionRepository.cs" />
<Compile Include="OpenAsset\CachedColoredTransactionRepository.cs" />
<Compile Include="OpenAsset\CoinprismColoredTransactionRepository.cs" />
<Compile Include="OpenAsset\ColoredTransaction.cs" />
<Compile Include="OpenAsset\Extensions.cs" />
<Compile Include="OpenAsset\IColoredTransactionRepository.cs" />
Expand Down
141 changes: 141 additions & 0 deletions NBitcoin/OpenAsset/CoinprismColoredTransactionRepository.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,141 @@
using NBitcoin.DataEncoders;
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;

namespace NBitcoin.OpenAsset
{
[Serializable]
public class CoinprismException : Exception
{
public CoinprismException()
{
}
public CoinprismException(string message) : base(message)
{
}
public CoinprismException(string message, Exception inner) : base(message, inner)
{
}
protected CoinprismException(
System.Runtime.Serialization.SerializationInfo info,
System.Runtime.Serialization.StreamingContext context)
: base(info, context)
{
}
}
public class CoinprismColoredTransactionRepository : IColoredTransactionRepository
{
class CoinprismTransactionRepository : ITransactionRepository
{
#region ITransactionRepository Members

public Transaction Get(uint256 txId)
{
return null;
}

public void Put(uint256 txId, Transaction tx)
{

}

#endregion
}
#region IColoredTransactionRepository Members

public ITransactionRepository Transactions
{
get
{
return new CoinprismTransactionRepository();
}
}

public ColoredTransaction Get(uint256 txId)
{
try
{
ColoredTransaction result = new ColoredTransaction();
WebClient client = new WebClient();
var str = client.DownloadString("https://api.coinprism.com/v1/transactions/" + txId);
var json = JObject.Parse(str);
var inputs = json["inputs"] as JArray;
if(inputs != null)
{
for(int i = 0 ; i < inputs.Count ; i++)
{
if(inputs[i]["asset_address"].Value<string>() == null)
continue;
var entry = new ColoredEntry();
entry.Index = i;
entry.Asset = new Asset(
(ScriptId)new BitcoinScriptAddress(inputs[i]["asset_address"].ToString(), null).ID,
inputs[i]["asset_quantity"].Value<ulong>());

result.Inputs.Add(entry);
}
}

var outputs = json["outputs"] as JArray;
if(outputs != null)
{
bool issuance = true;
for(int i = 0 ; i < outputs.Count ; i++)
{
var marker = ColorMarker.TryParse(new Script(Encoders.Hex.DecodeData(outputs[i]["script"].ToString())));
if(marker != null)
{
issuance = false;
result.Marker = marker;
continue;
}
if(outputs[i]["asset_address"].Value<string>() == null)
continue;
ColoredEntry entry = new ColoredEntry();
entry.Index = i;
entry.Asset = new Asset(
(ScriptId)new BitcoinScriptAddress(outputs[i]["asset_address"].ToString(), null).ID,
outputs[i]["asset_quantity"].Value<ulong>()
);

if(issuance)
result.Issuances.Add(entry);
else
result.Transfers.Add(entry);
}
}
return result;
}
catch(WebException ex)
{
try
{
var error = JObject.Parse(new StreamReader(ex.Response.GetResponseStream()).ReadToEnd());
if(error["ErrorCode"].ToString() == "InvalidTransactionHash")
return null;
throw new CoinprismException(error["ErrorCode"].ToString());
}
catch(CoinprismException)
{
throw;
}
catch
{
}
throw;
}
}

public void Put(uint256 txId, ColoredTransaction tx)
{
}

#endregion
}
}
7 changes: 6 additions & 1 deletion NBitcoin/OpenAsset/ColorMarker.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using System;
using NBitcoin.DataEncoders;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
Expand All @@ -10,6 +11,10 @@ namespace NBitcoin.OpenAsset
public class ColorMarker : IBitcoinSerializable
{
const ushort Tag = 0x414f;
public static ColorMarker TryParse(string script)
{
return TryParse(new Script(script));
}
public static ColorMarker TryParse(Script script)
{
try
Expand Down
2 changes: 1 addition & 1 deletion NBitcoin/RPCTransactionRepository.cs
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ public Transaction Get(uint256 txId)

public void Put(uint256 txId, Transaction tx)
{
throw new NotSupportedException();

}

#endregion
Expand Down

0 comments on commit 7f3a9eb

Please sign in to comment.