/// <summary> /// Query the locked balance of a user. /// </summary> /// <param name="input"></param> /// <returns></returns> public override SInt64Value GetUserLockedBalance(UserResourceId input) { var urk = new UserResourceKey(input.Address, ParseResourceType(input.Type.ToString())); return(new SInt64Value() { Value = State.LockedUserResources[urk] }); }
private void Transfer(Address from, Address to, long amount, ResourceType rt) { var fromKey = new UserResourceKey(from, rt); var toKey = new UserResourceKey(to, rt); var fromBal = State.UserBalances[fromKey]; var toBal = State.UserBalances[toKey]; fromBal = fromBal.Sub(amount); toBal = toBal.Add(amount); State.UserBalances[fromKey] = fromBal; State.UserBalances[toKey] = toBal; }
/// <summary> /// Lock resource for chain creation. /// </summary> /// <param name="input"></param> /// <returns></returns> public override Empty LockResource(ResourceAmount input) { var resourceType = input.Type.ToString(); var amount = input.Amount; // Transfer from user to resource controller var rt = ParseResourceType(resourceType); Transfer(Context.Sender, State.ResourceControllerAddress.Value, amount, rt); // Increase locked amount var key = new UserResourceKey(Context.Sender, rt); State.LockedUserResources[key] = State.LockedUserResources[key].Add(amount); return(new Empty()); }
/// <summary> /// Sell resource to the Bancor Converter. /// </summary> /// <param name="input"></param> /// <returns></returns> public override Empty SellResource(ResourceAmount input) { var resourceType = input.Type.ToString(); var resToSell = input.Amount; var bal = GetUserBalance(new UserResourceId() { Address = Context.Sender, Type = input.Type }).Value; Assert(bal >= resToSell, $"Insufficient {resourceType.ToUpper()} balance."); AssertCorrectResourceType(resourceType); var elfToReceive = this.SellResourceToExchange(resourceType, resToSell); var fees = (long)(elfToReceive * FeeRate); var urk = new UserResourceKey(Context.Sender, ParseResourceType(resourceType)); State.UserBalances[urk] = State.UserBalances[urk].Sub(resToSell); var amount = elfToReceive.Sub(fees); if (amount > 0) { State.TokenContract.Transfer.Send(new TransferInput { To = Context.Sender, Amount = amount, Symbol = Context.Variables.NativeSymbol, Memo = $"Selling {resToSell} {resourceType.ToUpper()}s" }); } if (fees > 0) { State.TokenContract.Transfer.Send(new TransferInput { To = State.FeeAddress.Value, Symbol = Context.Variables.NativeSymbol, Amount = fees, Memo = $"Charged {fees} fees for selling {resourceType.ToUpper()}s" }); } return(new Empty()); }
/// <summary> /// Unlock resource for a user. This action is restricted to resource controller only. /// </summary> /// <param name="input"></param> /// <returns></returns> public override Empty UnlockResource(UserResourceAmount input) { var resourceType = input.Type.ToString(); var userAddress = input.User; var amount = input.Amount; var rca = State.ResourceControllerAddress.Value; Assert(Context.Sender == rca, "Only the resource controller can perform this action."); // Transfer from resource controller to user var rt = ParseResourceType(resourceType); Transfer(rca, userAddress, amount, rt); // Reduce locked amount var key = new UserResourceKey(userAddress, rt); State.LockedUserResources[key] = State.LockedUserResources[key].Sub(amount); return(new Empty()); }
/// <summary> /// Buy resource from the Bancor Converter. /// </summary> /// <param name="input"></param> /// <returns></returns> public override Empty BuyResource(ResourceAmount input) { var resourceType = input.Type.ToString(); var paidElf = input.Amount; AssertCorrectResourceType(resourceType); var fees = (long)(paidElf * FeeRate); var elfForRes = paidElf.Sub(fees); var payout = this.BuyResourceFromExchange(resourceType, elfForRes); var urk = new UserResourceKey(Context.Sender, ParseResourceType(resourceType)); State.UserBalances[urk] = State.UserBalances[urk].Add(payout); if (elfForRes > 0) { State.TokenContract.TransferFrom.Send(new TransferFromInput { From = Context.Sender, To = Context.Self, Amount = elfForRes, Symbol = Context.Variables.NativeSymbol, Memo = $"Buying {resourceType.ToUpper()} with {paidElf} elf tokens." }); } if (fees > 0) { State.TokenContract.TransferFrom.Send(new TransferFromInput { From = Context.Sender, To = State.FeeAddress.Value, Amount = fees, Symbol = Context.Variables.NativeSymbol, Memo = $"Charged {fees} fees for buying {resourceType.ToUpper()}" }); } return(new Empty()); }