コード例 #1
0
        /// <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]
            });
        }
コード例 #2
0
        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;
        }
コード例 #3
0
        /// <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());
        }
コード例 #4
0
        /// <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());
        }
コード例 #5
0
        /// <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());
        }
コード例 #6
0
        /// <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());
        }