public (IList <object>, IList <object>) Execute(RecipientState state, AbstractTrigger message) { var messagesResult = new List <object>(); BigInteger amount = message.Amount; int count = state.Recipients.Count; if (count == 0) { throw new Exception(); } double weightsSum = 0; foreach (TokenPairKey <double> recipient in state.Recipients) { weightsSum += recipient.GetTag(); } BigInteger portion = amount / (int)weightsSum; // We are going to lose tokens because we are using integer foreach (TokenPairKey <double> recipient in state.Recipients) { //msg.To.ChangeAgentId(state.SelfId) var command = new TransferTokenMessage(portion, new SingleAngentTokenKey(state.SelfId), recipient); amount -= portion; messagesResult.Add(command); } return(messagesResult, null); }
public (IList <object>, IList <object>) Execute(RecipientState state, AbstractTrigger message) { var messagesResult = new List <object>(); if (message is TokensTransferedNotification msg && msg.To.GetAgentId().Equals(state.SelfId)) { BigInteger amount = message.Amount; int count = state.Recipients.Count; if (count == 0) { throw new Exception(); } BigInteger portion = amount / count; // We are going to lose tokens because we are using integer foreach (IAgentTokenKey recipient in state.Recipients) { //msg.To.ChangeAgentId(state.SelfId) var command = new TransferTokenMessage(portion, new SingleAngentTokenKey(state.SelfId), recipient); amount -= portion; messagesResult.Add(command); } } return(messagesResult, null); }
public Task <AgentContext <TokenBurnerState> > Run(object state, AgentCapability self, object message) { var agentState = state as TokenBurnerState ?? new TokenBurnerState(); var context = new AgentContext <TokenBurnerState>(agentState, self); if (message is AbstractTrigger msg) { var pair = new AgentTriggerPair(msg.Sender, message.GetType()); if (context.State.TriggerToAction.ContainsKey(pair)) { (IList <object>, IList <object>)result = RecipientState.TriggerCheck(context.State, pair, msg); foreach (BurnTokenMessage action in result.Item1) { context.SendMessage(context.State.TokenManagerAgent, action, null); } foreach (var publication in result.Item2) { context.MakePublication(publication); } return(Task.FromResult(context)); } } switch (message) { case TokenActionAgentInitMessage initMessage: context.State.TokenManagerAgent = initMessage.TokenManagerAgentCapability; context.State.TriggerToAction = initMessage.TriggererToAction ?? new Dictionary <AgentTriggerPair, ITriggeredAction>(); context.State.SelfId = self.Issuer; var distributeCapabilityMessage = new DistributeCapabilitiesMessage { Id = self.Issuer, AgentCapabilities = new Dictionary <string, AgentCapability>() { { "GetTokensMessage", context.IssueCapability(new[] { typeof(GetTokensMessage) }) }, { "AddTriggerToActionMessage", context.IssueCapability(new[] { typeof(AddTriggerToActionMessage) }) }, } }; if (initMessage.Subscription != null) { foreach (var agent in initMessage.Subscription) { context.AddSubscription(agent); } } context.SendMessage(initMessage.CreatorAgentCapability, distributeCapabilityMessage, null); break; //Tokens are minted on burner's addres so that he can burn them, //but they are actually for the user TokensMintedTriggerer.To //He is added as recipient and he can take ownership of the tokens with GetTokensMessage //This is done so that the system can work automaticly case TokensMintedTriggerer transferedMessage: if (context.State.AddRecipient(transferedMessage.To)) { context.State.MintedMessages.Add(transferedMessage); context.MakePublication(new RecipientAddedPublication(transferedMessage.To)); } break; case GetTokensMessage getTokensMessage: IAgentTokenKey agentSender; if (context.State.GetTokens(getTokensMessage.Recipient, getTokensMessage.Amount, out agentSender)) { var transfer = new TransferTokenMessage(getTokensMessage.Amount, agentSender, getTokensMessage.Recipient); context.SendMessage(null, transfer, null); } break; case AddTriggerToActionMessage addTriggerMessage: context.State.TriggerToAction.Add(addTriggerMessage.Trigger, addTriggerMessage.Action); break; } return(Task.FromResult(context)); }