public bool GetTokens(IAgentTokenKey from, BigInteger amount, out IAgentTokenKey sender) { sender = default; TokensMintedTriggerer element = MintedMessages.FirstOrDefault(x => x.To.Equals(from) && x.Amount == amount); if (element == null) { return(false); } BigInteger current = element.Amount; if (current > amount) { //Not sure if we need this scenario var newTokensMsg = new TokensMintedTriggerer(element.Sender, element.Amount, element.To); sender = element.To; MintedMessages.Add(newTokensMsg); MintedMessages.Remove(element); return(true); } if (current == amount) { sender = element.To; MintedMessages.Remove(element); return(true); } return(false); }
public (IList <object>, IList <object>) Execute(RecipientState state, AbstractTrigger message) { if (message is MockMessageTrigger msg) { var command = new MintTokenMessage(msg.Amount, msg.To.ChangeAgentId(state.SelfId)); var publication = new TokensMintedTriggerer(state.SelfId, msg.Amount, msg.To); return(new List <object>() { command }, new List <object>() { publication }); } return(null, null); }
public (IList <object>, IList <object>) Execute(RecipientState state, AbstractTrigger message) { var messagesResult = new List <object>(); var publicationResult = new List <object>(); if (state is TokenBurnerState burnerState) { BigInteger amount = message.Amount; while (amount > 0) { IAgentTokenKey recipient = state.Recipients.First(); TokensMintedTriggerer element = burnerState.MintedMessages.FirstOrDefault(x => x.To.Equals(recipient)); BigInteger debt = element.Amount; IAgentTokenKey sender = element.To; BurnTokenMessage command; TokensBurnedTriggerer command2; if (debt <= amount) { state.Recipients.Remove(recipient); burnerState.MintedMessages.Remove(element); amount -= debt; command = new BurnTokenMessage(debt, sender); command2 = new TokensBurnedTriggerer(state.SelfId, debt, recipient); } else { element.Amount -= amount; command = new BurnTokenMessage(amount, sender); command2 = new TokensBurnedTriggerer(state.SelfId, amount, recipient); amount = 0; } messagesResult.Add(command); publicationResult.Add(command2); } } return(messagesResult, publicationResult); }