Skip to content

Commit

Permalink
[Add] Get Accounts and Balances for GasToken (#3614)
Browse files Browse the repository at this point in the history
* [Add] Get Accounts and Balances for GasToken

* Removed `BalanceOf` extension

* Added null check

* Changed `Seek` to `Find` for `DataCache`

---------

Co-authored-by: Jimmy <[email protected]>
  • Loading branch information
cschuchardt88 and Jim8y authored Dec 13, 2024
1 parent e0328e3 commit c531917
Show file tree
Hide file tree
Showing 3 changed files with 96 additions and 1 deletion.
42 changes: 42 additions & 0 deletions src/Neo/Extensions/SmartContract/GasTokenExtensions.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
// Copyright (C) 2015-2024 The Neo Project.
//
// GasTokenExtensions.cs file belongs to the neo project and is free
// software distributed under the MIT software license, see the
// accompanying file LICENSE in the main directory of the
// repository or http://www.opensource.org/licenses/mit-license.php
// for more details.
//
// Redistribution and use in source and binary forms with or without
// modifications are permitted.

using Neo.Persistence;
using Neo.SmartContract;
using Neo.SmartContract.Native;
using System;
using System.Collections.Generic;
using System.Numerics;

namespace Neo.Extensions
{
public static class GasTokenExtensions
{
public static IEnumerable<(UInt160 Address, BigInteger Balance)> GetAccounts(this GasToken gasToken, DataCache snapshot)
{
if (gasToken is null)
throw new ArgumentNullException(nameof(gasToken));

if (snapshot is null)
throw new ArgumentNullException(nameof(snapshot));

var kb = new KeyBuilder(gasToken.Id, GasToken.Prefix_Account);
var prefixKey = kb.ToArray();

foreach (var (key, value) in snapshot.Find(prefixKey, SeekDirection.Forward))
{
var keyBytes = key.ToArray();
var addressHash = new UInt160(keyBytes.AsSpan(prefixKey.Length));
yield return new(addressHash, value.GetInteroperable<AccountState>().Balance);
}
}
}
}
2 changes: 1 addition & 1 deletion src/Neo/SmartContract/Native/FungibleToken.cs
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ public abstract class FungibleToken<TState> : NativeContract
/// <summary>
/// The prefix for storing account states.
/// </summary>
protected const byte Prefix_Account = 20;
protected internal const byte Prefix_Account = 20;

/// <summary>
/// Initializes a new instance of the <see cref="FungibleToken{TState}"/> class.
Expand Down
53 changes: 53 additions & 0 deletions tests/Neo.UnitTests/Extensions/UT_GasTokenExtensions.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
// Copyright (C) 2015-2024 The Neo Project.
//
// UT_GasTokenExtensions.cs file belongs to the neo project and is free
// software distributed under the MIT software license, see the
// accompanying file LICENSE in the main directory of the
// repository or http://www.opensource.org/licenses/mit-license.php
// for more details.
//
// Redistribution and use in source and binary forms with or without
// modifications are permitted.

using Microsoft.VisualStudio.TestTools.UnitTesting;
using Neo.Extensions;
using Neo.SmartContract.Native;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Numerics;
using System.Text;
using System.Threading.Tasks;

namespace Neo.UnitTests.Extensions
{
[TestClass]
public class UT_GasTokenExtensions
{
private NeoSystem system;

[TestInitialize]
public void Initialize()
{
system = TestBlockchain.TheNeoSystem;
}

[TestCleanup]
public void Clean()
{
TestBlockchain.ResetStore();
}

[TestMethod]
public void TestGetAccounts()
{
UInt160 expected = "0x9f8f056a53e39585c7bb52886418c7bed83d126b";

var accounts = NativeContract.GAS.GetAccounts(system.StoreView);
var actual = accounts.FirstOrDefault();

Assert.AreEqual(expected, actual.Address);
Assert.AreEqual(5200000000000000, actual.Balance);
}
}
}

0 comments on commit c531917

Please sign in to comment.