Skip to content
Permalink
Fetching contributors…
Cannot retrieve contributors at this time
144 lines (110 sloc) 3.7 KB
using Stratis.SmartContracts;
using Stratis.SmartContracts.Standards;
/// <summary>
/// Implementation of a standard token contract for the Stratis Platform.
/// DISCLAIMER: For demonstration purposes only.
/// </summary>
public class StandardToken : SmartContract, IStandardToken
{
/// <summary>
/// Constructor used to create a new instance of the token. Assigns the total token supply to the creator of the contract.
/// </summary>
/// <param name="smartContractState">The execution state for the contract.</param>
/// <param name="totalSupply">The total token supply.</param>
public StandardToken(ISmartContractState smartContractState, ulong totalSupply)
: base(smartContractState)
{
this.TotalSupply = totalSupply;
this.SetBalance(Message.Sender, totalSupply);
}
/// <inheritdoc />
public ulong TotalSupply
{
get => PersistentState.GetUInt64(nameof(this.TotalSupply));
private set => PersistentState.SetUInt64(nameof(this.TotalSupply), value);
}
/// <inheritdoc />
public ulong GetBalance(Address address)
{
return PersistentState.GetUInt64($"Balance:{address}");
}
private void SetBalance(Address address, ulong value)
{
PersistentState.SetUInt64($"Balance:{address}", value);
}
/// <inheritdoc />
public bool TransferTo(Address to, ulong amount)
{
if (amount == 0)
{
Log(new TransferLog { From = Message.Sender, To = to, Amount = 0 });
return true;
}
ulong senderBalance = GetBalance(Message.Sender);
if (senderBalance < amount)
{
return false;
}
SetBalance(Message.Sender, senderBalance - amount);
SetBalance(to, checked(GetBalance(to) + amount));
Log(new TransferLog { From = Message.Sender, To = to, Amount = amount });
return true;
}
/// <inheritdoc />
public bool TransferFrom(Address from, Address to, ulong amount)
{
if (amount == 0)
{
Log(new TransferLog { From = from, To = to, Amount = 0 });
return true;
}
ulong senderAllowance = Allowance(from, Message.Sender);
ulong fromBalance = GetBalance(from);
if (senderAllowance < amount || fromBalance < amount)
{
return false;
}
SetApproval(from, Message.Sender, senderAllowance - amount);
SetBalance(from, fromBalance - amount);
SetBalance(to, checked(GetBalance(to) + amount));
Log(new TransferLog { From = from, To = to, Amount = amount });
return true;
}
/// <inheritdoc />
public bool Approve(Address spender, ulong currentAmount, ulong amount)
{
if (Allowance(Message.Sender, spender) != currentAmount)
{
return false;
}
SetApproval(Message.Sender, spender, amount);
Log(new ApprovalLog { Owner = Message.Sender, Spender = spender, Amount = amount, OldAmount = currentAmount });
return true;
}
private void SetApproval(Address owner, Address spender, ulong value)
{
PersistentState.SetUInt64($"Allowance:{owner}:{spender}", value);
}
/// <inheritdoc />
public ulong Allowance(Address owner, Address spender)
{
return PersistentState.GetUInt64($"Allowance:{owner}:{spender}");
}
public struct TransferLog
{
[Index]
public Address From;
[Index]
public Address To;
public ulong Amount;
}
public struct ApprovalLog
{
[Index]
public Address Owner;
[Index]
public Address Spender;
public ulong OldAmount;
public ulong Amount;
}
}
You can’t perform that action at this time.