コード例 #1
0
ファイル: ExtCalls.cs プロジェクト: pau121/PhantasmaChain
        private static ExecutionState Runtime_MintToken(RuntimeVM vm)
        {
            vm.ExpectStackSize(4);

            var source      = vm.PopAddress();
            var destination = vm.PopAddress();

            var symbol = vm.PopString("symbol");

            var rom = vm.PopBytes("rom");
            var ram = vm.PopBytes("ram");

            BigInteger seriesID;

            if (vm.ProtocolVersion >= 4)
            {
                seriesID = vm.PopNumber("series");
            }
            else
            {
                seriesID = 0;
            }

            var tokenID = vm.MintToken(symbol, source, destination, rom, ram, seriesID);

            var result = new VMObject();

            result.SetValue(tokenID);
            vm.Stack.Push(result);

            return(ExecutionState.Running);
        }
コード例 #2
0
ファイル: ExtCalls.cs プロジェクト: pau121/PhantasmaChain
        private static ExecutionState Organization_AddMember(RuntimeVM vm)
        {
            vm.ExpectStackSize(3);

            var source = vm.PopAddress();
            var name   = vm.PopString("name");
            var target = vm.PopAddress();

            vm.AddMember(name, source, target);

            return(ExecutionState.Running);
        }
コード例 #3
0
ファイル: ExtCalls.cs プロジェクト: pau121/PhantasmaChain
        private static ExecutionState Runtime_TransferTokens(RuntimeVM vm)
        {
            vm.ExpectStackSize(4);

            var source      = vm.PopAddress();
            var destination = vm.PopAddress();

            var symbol = vm.PopString("symbol");
            var amount = vm.PopNumber("amount");

            vm.TransferTokens(symbol, source, destination, amount);

            return(ExecutionState.Running);
        }
コード例 #4
0
ファイル: ExtCalls.cs プロジェクト: pau121/PhantasmaChain
        private static ExecutionState Runtime_IsMinter(RuntimeVM vm)
        {
            try
            {
                var tx = vm.Transaction;
                Throw.IfNull(tx, nameof(tx));

                vm.ExpectStackSize(1);

                var address = vm.PopAddress();
                var symbol  = vm.PopString("symbol");

                bool success = vm.IsMintingAddress(address, symbol);

                var result = new VMObject();
                result.SetValue(success);
                vm.Stack.Push(result);
            }
            catch (Exception e)
            {
                throw new VMException(vm, e.Message);
            }

            return(ExecutionState.Running);
        }
コード例 #5
0
ファイル: ExtCalls.cs プロジェクト: pau121/PhantasmaChain
        private static ExecutionState Nexus_CreateToken(RuntimeVM vm)
        {
            vm.ExpectStackSize(7);

            var owner = vm.PopAddress();

            var symbol    = vm.PopString("symbol");
            var name      = vm.PopString("name");
            var maxSupply = vm.PopNumber("maxSupply");
            var decimals  = (int)vm.PopNumber("decimals");
            var flags     = vm.PopEnum <TokenFlags>("flags");
            var script    = vm.PopBytes("script");

            ContractInterface abi;

            if (vm.ProtocolVersion >= 4)
            {
                var abiBytes = vm.PopBytes("abi bytes");
                abi = ContractInterface.FromBytes(abiBytes);
            }
            else
            {
                abi = new ContractInterface();
            }

            vm.CreateToken(owner, symbol, name, maxSupply, decimals, flags, script, abi);

            return(ExecutionState.Running);
        }
コード例 #6
0
ファイル: ExtCalls.cs プロジェクト: pau121/PhantasmaChain
        private static ExecutionState Runtime_IsWitness(RuntimeVM vm)
        {
            try
            {
                var tx = vm.Transaction;
                Throw.IfNull(tx, nameof(tx));

                vm.ExpectStackSize(1);

                var address = vm.PopAddress();
                //var success = tx.IsSignedBy(address);
                // TODO check if this was just a bug or there was a real reason
                var success = vm.IsWitness(address);

                var result = new VMObject();
                result.SetValue(success);
                vm.Stack.Push(result);
            }
            catch (Exception e)
            {
                throw new VMException(vm, e.Message);
            }

            return(ExecutionState.Running);
        }
コード例 #7
0
ファイル: ExtCalls.cs プロジェクト: pau121/PhantasmaChain
        public static ExecutionState Constructor_AddressV2(RuntimeVM vm)
        {
            var addr = vm.PopAddress();
            var temp = new VMObject();

            temp.SetValue(addr);
            vm.Stack.Push(temp);
            return(ExecutionState.Running);
        }
コード例 #8
0
ファイル: ExtCalls.cs プロジェクト: pau121/PhantasmaChain
        private static ExecutionState Nexus_CreatePlatform(RuntimeVM vm)
        {
            vm.ExpectStackSize(5);

            var source          = vm.PopAddress();
            var name            = vm.PopString("name");
            var externalAddress = vm.PopString("external address");
            var interopAddress  = vm.PopAddress();
            var symbol          = vm.PopString("symbol");

            var target = vm.CreatePlatform(source, name, externalAddress, interopAddress, symbol);

            var result = new VMObject();

            result.SetValue(target);
            vm.Stack.Push(result);

            return(ExecutionState.Running);
        }
コード例 #9
0
ファイル: ExtCalls.cs プロジェクト: pau121/PhantasmaChain
        private static ExecutionState Runtime_TransferToken(RuntimeVM vm)
        {
            vm.ExpectStackSize(4);

            VMObject temp;

            var source      = vm.PopAddress();
            var destination = vm.PopAddress();

            temp = vm.Stack.Pop();
            vm.Expect(temp.Type == VMType.String, "expected string for symbol");
            var symbol = temp.AsString();

            var tokenID = vm.PopNumber("token ID");

            vm.TransferToken(symbol, source, destination, tokenID);

            return(ExecutionState.Running);
        }
コード例 #10
0
ファイル: ExtCalls.cs プロジェクト: pau121/PhantasmaChain
        private static ExecutionState Runtime_TransferBalance(RuntimeVM vm)
        {
            vm.ExpectStackSize(3);

            var source      = vm.PopAddress();
            var destination = vm.PopAddress();

            var symbol = vm.PopString("symbol");

            var token = vm.GetToken(symbol);

            vm.Expect(token.IsFungible(), "must be fungible");

            var amount = vm.GetBalance(symbol, source);

            vm.TransferTokens(symbol, source, destination, amount);

            return(ExecutionState.Running);
        }
コード例 #11
0
ファイル: ExtCalls.cs プロジェクト: pau121/PhantasmaChain
        private static ExecutionState Runtime_MintTokens(RuntimeVM vm)
        {
            vm.ExpectStackSize(4);

            var source      = vm.PopAddress();
            var destination = vm.PopAddress();

            var symbol = vm.PopString("symbol");
            var amount = vm.PopNumber("amount");

            if (vm.Nexus.HasGenesis)
            {
                var isMinter = vm.IsMintingAddress(source, symbol);
                vm.Expect(isMinter, $"{source} is not a valid minting address for {symbol}");
            }

            vm.MintTokens(symbol, source, destination, amount);

            return(ExecutionState.Running);
        }
コード例 #12
0
ファイル: ExtCalls.cs プロジェクト: pau121/PhantasmaChain
        private static ExecutionState Runtime_BurnTokens(RuntimeVM vm)
        {
            vm.ExpectStackSize(3);

            var target = vm.PopAddress();
            var symbol = vm.PopString("symbol");
            var amount = vm.PopNumber("amount");

            vm.BurnTokens(symbol, target, amount);

            return(ExecutionState.Running);
        }
コード例 #13
0
ファイル: ExtCalls.cs プロジェクト: pau121/PhantasmaChain
        private static ExecutionState Nexus_Init(RuntimeVM vm)
        {
            vm.Expect(vm.Chain == null || vm.Chain.Height == 0, "nexus already initialized");

            vm.ExpectStackSize(1);

            var owner = vm.PopAddress();

            vm.Nexus.Initialize(owner);

            return(ExecutionState.Running);
        }
コード例 #14
0
ファイル: ExtCalls.cs プロジェクト: pau121/PhantasmaChain
        private static ExecutionState Runtime_BurnToken(RuntimeVM vm)
        {
            vm.ExpectStackSize(3);

            var source  = vm.PopAddress();
            var symbol  = vm.PopString("symbol");
            var tokenID = vm.PopNumber("token ID");

            vm.BurnToken(symbol, source, tokenID);

            return(ExecutionState.Running);
        }
コード例 #15
0
ファイル: ExtCalls.cs プロジェクト: pau121/PhantasmaChain
        private static ExecutionState Runtime_Notify(RuntimeVM vm)
        {
            vm.Expect(vm.CurrentContext.Name != VirtualMachine.EntryContextName, "cannot notify in current context");

            var kind    = vm.Stack.Pop().AsEnum <EventKind>();
            var address = vm.PopAddress();
            var obj     = vm.Stack.Pop();

            var bytes = obj.Serialize();

            vm.Notify(kind, address, bytes);
            return(ExecutionState.Running);
        }
コード例 #16
0
ファイル: ExtCalls.cs プロジェクト: pau121/PhantasmaChain
        private static ExecutionState Nexus_CreateChain(RuntimeVM vm)
        {
            vm.ExpectStackSize(4);

            var source     = vm.PopAddress();
            var org        = vm.PopString("organization");
            var name       = vm.PopString("name");
            var parentName = vm.PopString("parent");

            vm.CreateChain(source, org, name, parentName);

            return(ExecutionState.Running);
        }
コード例 #17
0
ファイル: ExtCalls.cs プロジェクト: pau121/PhantasmaChain
        private static ExecutionState Nexus_CreateOrganization(RuntimeVM vm)
        {
            vm.ExpectStackSize(4);

            var source = vm.PopAddress();
            var ID     = vm.PopString("id");
            var name   = vm.PopString("name");
            var script = vm.PopBytes("script");

            vm.CreateOrganization(source, ID, name, script);

            return(ExecutionState.Running);
        }
コード例 #18
0
ファイル: ExtCalls.cs プロジェクト: pau121/PhantasmaChain
        private static ExecutionState Runtime_SwapTokens(RuntimeVM vm)
        {
            vm.ExpectStackSize(5);

            VMObject temp;

            temp = vm.Stack.Pop();
            vm.Expect(temp.Type == VMType.String, "expected string for target chain");
            var targetChain = temp.AsString();

            var source      = vm.PopAddress();
            var destination = vm.PopAddress();

            temp = vm.Stack.Pop();
            vm.Expect(temp.Type == VMType.String, "expected string for symbol");
            var symbol = temp.AsString();

            var value = vm.PopNumber("amount");

            vm.SwapTokens(vm.Chain.Name, source, targetChain, destination, symbol, value);

            return(ExecutionState.Running);
        }
コード例 #19
0
ファイル: ExtCalls.cs プロジェクト: pau121/PhantasmaChain
        private static ExecutionState Runtime_InfuseToken(RuntimeVM vm)
        {
            vm.ExpectStackSize(5);

            var source       = vm.PopAddress();
            var targetSymbol = vm.PopString("target symbol");
            var tokenID      = vm.PopNumber("token ID");
            var infuseSymbol = vm.PopString("infuse symbol");
            var value        = vm.PopNumber("value");

            vm.InfuseToken(targetSymbol, source, tokenID, infuseSymbol, value);

            return(ExecutionState.Running);
        }
コード例 #20
0
ファイル: ExtCalls.cs プロジェクト: pau121/PhantasmaChain
        private static ExecutionState Runtime_GetBalance(RuntimeVM vm)
        {
            vm.ExpectStackSize(2);

            var source = vm.PopAddress();
            var symbol = vm.PopString("symbol");

            var balance = vm.GetBalance(symbol, source);

            var result = new VMObject();

            result.SetValue(balance);
            vm.Stack.Push(result);

            return(ExecutionState.Running);
        }
コード例 #21
0
ファイル: ExtCalls.cs プロジェクト: pau121/PhantasmaChain
        private static ExecutionState Nexus_CreateTokenSeries(RuntimeVM vm)
        {
            vm.ExpectStackSize(5);

            var from      = vm.PopAddress();
            var symbol    = vm.PopString("symbol");
            var seriesID  = vm.PopNumber("series ID");
            var maxSupply = vm.PopNumber("max supply");
            var mode      = vm.PopEnum <TokenSeriesMode>("mode");
            var script    = vm.PopBytes("script");
            var abiBytes  = vm.PopBytes("abi bytes");

            var abi = ContractInterface.FromBytes(abiBytes);

            vm.CreateTokenSeries(symbol, from, seriesID, maxSupply, mode, script, abi);

            return(ExecutionState.Running);
        }
コード例 #22
0
ファイル: ExtCalls.cs プロジェクト: pau121/PhantasmaChain
        private static ExecutionState Task_Start(RuntimeVM vm)
        {
            vm.ExpectStackSize(1);

            var contractName = vm.PopString("contract");
            var methodBytes  = vm.PopBytes("method bytes");
            var from         = vm.PopAddress();
            var frequency    = (int)vm.PopNumber("frequency");
            var mode         = vm.PopEnum <TaskFrequencyMode>("mode");
            var gasLimit     = vm.PopNumber("gas limit");

            var method = ContractMethod.FromBytes(methodBytes);

            var task = vm.StartTask(from, contractName, method, frequency, mode, gasLimit);

            var result = new VMObject();

            result.SetValue(task.ID);
            vm.Stack.Push(result);

            return(ExecutionState.Running);
        }
コード例 #23
0
ファイル: ExtCalls.cs プロジェクト: pau121/PhantasmaChain
        private static ExecutionState Runtime_DeployContract(RuntimeVM vm)
        {
            var tx = vm.Transaction;

            Throw.IfNull(tx, nameof(tx));

            var pow = tx.Hash.GetDifficulty();

            vm.Expect(pow >= (int)ProofOfWork.Minimal, "expected proof of work");

            vm.ExpectStackSize(1);

            var from = vm.PopAddress();

            vm.Expect(from.IsUser, "address must be user");

            if (vm.Nexus.HasGenesis)
            {
                //Runtime.Expect(org != DomainSettings.ValidatorsOrganizationName, "cannot deploy contract via this organization");
                vm.Expect(vm.IsStakeMaster(from), "needs to be master");
            }

            vm.Expect(vm.IsWitness(from), "invalid witness");

            var contractName = vm.PopString("contractName");

            var contractAddress = SmartContract.GetAddressForName(contractName);
            var deployed        = vm.Chain.IsContractDeployed(vm.Storage, contractAddress);

            // TODO
            if (vm.ProtocolVersion >= 2)
            {
                vm.Expect(!deployed, $"{contractName} is already deployed");
            }
            else
            if (deployed)
            {
                return(ExecutionState.Running);
            }

            byte[]            script;
            ContractInterface abi;

            bool isNative = Nexus.IsNativeContract(contractName);

            if (isNative)
            {
                if (contractName == "validator" && vm.GenesisAddress == Address.Null)
                {
                    vm.Nexus.Initialize(from);
                }

                script = new byte[] { (byte)Opcode.RET };

                var contractInstance = vm.Nexus.GetNativeContractByAddress(contractAddress);
                abi = contractInstance.ABI;
            }
            else
            {
                if (ValidationUtils.IsValidTicker(contractName))
                {
                    throw new VMException(vm, "use createToken instead for this kind of contract");
                }
                else
                {
                    vm.Expect(ValidationUtils.IsValidIdentifier(contractName), "invalid contract name");
                }

                var isReserved = ValidationUtils.IsReservedIdentifier(contractName);

                if (isReserved && vm.IsWitness(vm.GenesisAddress))
                {
                    isReserved = false;
                }

                vm.Expect(!isReserved, $"name '{contractName}' reserved by system");

                script = vm.PopBytes("contractScript");

                var abiBytes = vm.PopBytes("contractABI");
                abi = ContractInterface.FromBytes(abiBytes);

                var fuelCost = vm.GetGovernanceValue(Nexus.FuelPerContractDeployTag);
                // governance value is in usd fiat, here convert from fiat to fuel amount
                fuelCost = vm.GetTokenQuote(DomainSettings.FiatTokenSymbol, DomainSettings.FuelTokenSymbol, fuelCost);

                // burn the "cost" tokens
                vm.BurnTokens(DomainSettings.FuelTokenSymbol, from, fuelCost);
            }

            // ABI validation
            ValidateABI(vm, contractName, abi, isNative);

            var success = vm.Chain.DeployContractScript(vm.Storage, from, contractName, contractAddress, script, abi);

            vm.Expect(success, $"deployment of {contractName} failed");

            var constructor = abi.FindMethod(SmartContract.ConstructorName);

            if (constructor != null)
            {
                vm.CallContext(contractName, constructor, from);
            }

            vm.Notify(EventKind.ContractDeploy, from, contractName);

            return(ExecutionState.Running);
        }
コード例 #24
0
ファイル: ExtCalls.cs プロジェクト: pau121/PhantasmaChain
        private static ExecutionState Runtime_UpgradeContract(RuntimeVM vm)
        {
            var tx = vm.Transaction;

            Throw.IfNull(tx, nameof(tx));

            var pow = tx.Hash.GetDifficulty();

            vm.Expect(pow >= (int)ProofOfWork.Minimal, "expected proof of work");

            vm.ExpectStackSize(1);

            var from = vm.PopAddress();

            vm.Expect(from.IsUser, "address must be user");

            vm.Expect(vm.IsStakeMaster(from), "needs to be master");

            vm.Expect(vm.IsWitness(from), "invalid witness");

            var contractName = vm.PopString("contractName");

            var contractAddress = SmartContract.GetAddressForName(contractName);
            var deployed        = vm.Chain.IsContractDeployed(vm.Storage, contractAddress);

            vm.Expect(deployed, $"{contractName} does not exist");

            byte[]            script;
            ContractInterface abi;

            bool isNative = Nexus.IsNativeContract(contractName);

            vm.Expect(!isNative, "cannot upgrade native contract");

            bool isToken = ValidationUtils.IsValidTicker(contractName);

            script = vm.PopBytes("contractScript");

            var abiBytes = vm.PopBytes("contractABI");

            abi = ContractInterface.FromBytes(abiBytes);

            var fuelCost = vm.GetGovernanceValue(Nexus.FuelPerContractDeployTag);

            // governance value is in usd fiat, here convert from fiat to fuel amount
            fuelCost = vm.GetTokenQuote(DomainSettings.FiatTokenSymbol, DomainSettings.FuelTokenSymbol, fuelCost);

            // burn the "cost" tokens
            vm.BurnTokens(DomainSettings.FuelTokenSymbol, from, fuelCost);

            // ABI validation
            ValidateABI(vm, contractName, abi, isNative);

            SmartContract oldContract;

            if (isToken)
            {
                oldContract = vm.Nexus.GetTokenContract(vm.Storage, contractName);
            }
            else
            {
                oldContract = vm.Chain.GetContractByName(vm.Storage, contractName);
            }

            vm.Expect(oldContract != null, "could not fetch previous contract");
            vm.Expect(abi.Implements(oldContract.ABI), "new abi does not implement all methods of previous abi");
            vm.Expect(vm.InvokeTrigger(false, script, contractName, abi, AccountTrigger.OnUpgrade.ToString(), from) == TriggerResult.Success, "OnUpgrade trigger failed");

            if (isToken)
            {
                vm.Nexus.UpgradeTokenContract(vm.RootStorage, contractName, script, abi);
            }
            else
            {
                vm.Chain.UpgradeContract(vm.Storage, contractName, script, abi);
            }

            vm.Notify(EventKind.ContractUpgrade, from, contractName);

            return(ExecutionState.Running);
        }