Skip to content

Commit 26d5f38

Browse files
committed
Smart contracts refactor
1 parent c8c50cc commit 26d5f38

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

49 files changed

+1944
-2003
lines changed

Phantasma.API/NexusAPI.cs

+1-2
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
using Phantasma.Cryptography;
88
using Phantasma.Numerics;
99
using Phantasma.Core;
10-
using Phantasma.Contracts.Native;
1110
using Phantasma.Blockchain.Contracts;
1211
using Phantasma.VM;
1312
using Phantasma.Storage;
@@ -1604,7 +1603,7 @@ public IAPIResult GetABI([APIParameter("Chain address or name where the market i
16041603
return new ErrorResult { error = "Contract not found" };
16051604
}
16061605

1607-
var contract = this.Nexus.GetContractByName(Nexus.RootStorage, contractName);
1606+
var contract = this.Nexus.GetContractByName(contractName);
16081607
return FillABI(contractName, contract.ABI);
16091608
}
16101609

Phantasma.Blockchain/Chain.cs

+15-19
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,6 @@
1616
using Phantasma.Domain;
1717
using Phantasma.Core.Utils;
1818
using Phantasma.Core.Performance;
19-
using Phantasma.Contracts;
20-
using Phantasma.Contracts.Native;
2119

2220
namespace Phantasma.Blockchain
2321
{
@@ -64,7 +62,7 @@ public IContract[] GetContracts(StorageContext storage)
6462
{
6563
var contractList = new StorageList(GetContractListKey(), storage);
6664
var addresses = contractList.All<Address>();
67-
return addresses.Select(x => Nexus.GetContractByAddress(Nexus.RootStorage, x)).ToArray();
65+
return addresses.Select(x => Nexus.GetContractByAddress(x)).ToArray();
6866
}
6967

7068
public override string ToString()
@@ -424,14 +422,13 @@ internal ExecutionContext GetContractContext(StorageContext storage, SmartContra
424422
throw new ChainException($"contract {contract.Name} not deployed on {Name} chain");
425423
}
426424

427-
// TODO this needs to suport non-native contexts too..
428-
var context = new NativeExecutionContext(contract);
425+
var context = contract.CreateContext();
429426
return context;
430427
}
431428

432429
public VMObject InvokeContract(StorageContext storage, string contractName, string methodName, Timestamp time, params object[] args)
433430
{
434-
var contract = Nexus.GetContractByName(storage, contractName);
431+
var contract = Nexus.GetContractByName(contractName);
435432
Throw.IfNull(contract, nameof(contract));
436433

437434
var script = ScriptUtils.BeginScript().CallContract(contractName, methodName, args).EndScript();
@@ -574,7 +571,7 @@ public bool IsContractDeployed(StorageContext storage, Address contractAddress)
574571
return storage.Has(key);
575572
}
576573

577-
private bool DeployContractScript(StorageContext storage, Address contractAddress, byte[] script)
574+
public bool DeployContractScript(StorageContext storage, Address contractAddress, byte[] script)
578575
{
579576
var key = GetContractDeploymentKey(contractAddress);
580577
if (storage.Has(key))
@@ -590,23 +587,22 @@ private bool DeployContractScript(StorageContext storage, Address contractAddres
590587
return true;
591588
}
592589

593-
public bool DeployNativeContract(StorageContext storage, Address contractAddress)
590+
public SmartContract GetContractByName(StorageContext storage, string name)
594591
{
595-
var contract = Nexus.GetContractByAddress(storage, contractAddress);
596-
if (contract == null)
592+
if (Nexus.IsNativeContract(name))
597593
{
598-
return false;
594+
return Nexus.GetContractByName(name);
599595
}
600596

601-
DeployContractScript(storage, contractAddress, new byte[] { (byte)Opcode.RET });
602-
return true;
603-
}
597+
var address = SmartContract.GetAddressForName(name);
598+
var key = GetContractDeploymentKey(address);
599+
if (!storage.Has(key))
600+
{
601+
return null;
602+
}
604603

605-
public bool DeployContract(StorageContext storage, byte[] script)
606-
{
607-
var contractAddress = Address.FromHash(script);
608-
DeployContractScript(storage, contractAddress, script);
609-
return true;
604+
var script = storage.Get(key);
605+
return new CustomContract(name, script);
610606
}
611607
#endregion
612608

Phantasma.Contracts/Native/AccountContract.cs Phantasma.Blockchain/Contracts/AccountContract.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
using Phantasma.Numerics;
44
using Phantasma.Storage.Context;
55

6-
namespace Phantasma.Contracts.Native
6+
namespace Phantasma.Blockchain.Contracts
77
{
88
public sealed class AccountContract : NativeContract
99
{

Phantasma.Contracts/Native/BlockContract.cs Phantasma.Blockchain/Contracts/BlockContract.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
using Phantasma.Storage;
55
using Phantasma.Storage.Context;
66

7-
namespace Phantasma.Contracts.Native
7+
namespace Phantasma.Blockchain.Contracts
88
{
99
public sealed class BlockContract: NativeContract
1010
{

Phantasma.Contracts/Native/ConsensusContract.cs Phantasma.Blockchain/Contracts/ConsensusContract.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
using Phantasma.Storage;
77
using Phantasma.Storage.Context;
88

9-
namespace Phantasma.Contracts.Native
9+
namespace Phantasma.Blockchain.Contracts
1010
{
1111
public enum ConsensusMode
1212
{

Phantasma.Contracts/Native/ExchangeContract.cs Phantasma.Blockchain/Contracts/ExchangeContract.cs

+3-3
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,12 @@
55
using Phantasma.Numerics;
66
using Phantasma.Storage.Context;
77
using System;
8-
using static Phantasma.Contracts.Native.ExchangeOrderSide;
9-
using static Phantasma.Contracts.Native.ExchangeOrderType;
8+
using static Phantasma.Blockchain.Contracts.ExchangeOrderSide;
9+
using static Phantasma.Blockchain.Contracts.ExchangeOrderType;
1010
using Phantasma.Domain;
1111
using System.Linq;
1212

13-
namespace Phantasma.Contracts.Native
13+
namespace Phantasma.Blockchain.Contracts
1414
{
1515
public enum ExchangeOrderSide
1616
{

Phantasma.Contracts/Native/FriendContract.cs Phantasma.Blockchain/Contracts/FriendContract.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
using Phantasma.Domain;
33
using Phantasma.Storage.Context;
44

5-
namespace Phantasma.Contracts.Native
5+
namespace Phantasma.Blockchain.Contracts
66
{
77
public sealed class FriendsContract : NativeContract
88
{

Phantasma.Contracts/Native/GasContract.cs Phantasma.Blockchain/Contracts/GasContract.cs

+6-8
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
using Phantasma.Storage.Context;
66
using Phantasma.Core.Performance;
77

8-
namespace Phantasma.Contracts.Native
8+
namespace Phantasma.Blockchain.Contracts
99
{
1010
public struct GasLoanEntry
1111
{
@@ -29,20 +29,18 @@ public sealed class GasContract : NativeContract
2929
internal StorageMap _allowanceMap; //<Address, BigInteger>
3030
internal StorageMap _allowanceTargets; //<Address, Address>
3131

32-
public void Initialize(Address from)
33-
{
34-
Runtime.Expect(from == Runtime.GenesisAddress, "must be genesis address");
35-
Runtime.Expect(Runtime.IsWitness(from), "invalid witness");
36-
_lastInflation = Runtime.Time;
37-
}
38-
3932
public void AllowGas(Address from, Address target, BigInteger price, BigInteger limit)
4033
{
4134
if (Runtime.IsReadOnlyMode())
4235
{
4336
return;
4437
}
4538

39+
if (_lastInflation == 0)
40+
{
41+
_lastInflation = Runtime.Time;
42+
}
43+
4644
Runtime.Expect(from.IsUser, "must be a user address");
4745
Runtime.Expect(Runtime.IsWitness(from), "invalid witness");
4846
Runtime.Expect(target.IsSystem, "destination must be system address");

Phantasma.Contracts/Native/GovernanceContract.cs Phantasma.Blockchain/Contracts/GovernanceContract.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
using Phantasma.Storage;
44
using Phantasma.Storage.Context;
55

6-
namespace Phantasma.Contracts.Native
6+
namespace Phantasma.Blockchain.Contracts
77
{
88
public enum ConstraintKind
99
{

Phantasma.Contracts/Native/InteropContract.cs Phantasma.Blockchain/Contracts/InteropContract.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
using Phantasma.Storage.Context;
66
using System.Linq;
77

8-
namespace Phantasma.Contracts.Native
8+
namespace Phantasma.Blockchain.Contracts
99
{
1010
public enum InteropTransferStatus
1111
{

Phantasma.Contracts/Native/MailContract.cs Phantasma.Blockchain/Contracts/MailContract.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
using Phantasma.Domain;
44
using Phantasma.Storage.Context;
55

6-
namespace Phantasma.Contracts.Extra
6+
namespace Phantasma.Blockchain.Contracts
77
{
88
public struct Mail
99
{

Phantasma.Contracts/Native/MarketContract.cs Phantasma.Blockchain/Contracts/MarketContract.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
using Phantasma.Storage.Context;
66
using System;
77

8-
namespace Phantasma.Contracts.Native
8+
namespace Phantasma.Blockchain.Contracts
99
{
1010
public struct MarketEventData
1111
{

Phantasma.Contracts/Native/PrivacyContract.cs Phantasma.Blockchain/Contracts/PrivacyContract.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
using Phantasma.Numerics;
66
using Phantasma.Storage.Context;
77

8-
namespace Phantasma.Contracts.Native
8+
namespace Phantasma.Blockchain.Contracts
99
{
1010
internal struct PrivacyQueue
1111
{

Phantasma.Contracts/Native/RankingContract.cs Phantasma.Blockchain/Contracts/RankingContract.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
using Phantasma.Numerics;
44
using Phantasma.Storage.Context;
55

6-
namespace Phantasma.Contracts.Native
6+
namespace Phantasma.Blockchain.Contracts
77
{
88
public sealed class RankingContract : NativeContract
99
{

Phantasma.Contracts/Native/RelayContract.cs Phantasma.Blockchain/Contracts/RelayContract.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
using Phantasma.Storage.Context;
1313
using Phantasma.Storage.Utils;
1414

15-
namespace Phantasma.Contracts.Native
15+
namespace Phantasma.Blockchain.Contracts
1616
{
1717
public struct RelayMessage : ISerializable
1818
{

Phantasma.Contracts/Native/SaleContract.cs Phantasma.Blockchain/Contracts/SaleContract.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
using Phantasma.Domain;
22

3-
namespace Phantasma.Contracts.Native
3+
namespace Phantasma.Blockchain.Contracts
44
{
55
public sealed class SaleContract : NativeContract
66
{

Phantasma.Contracts/Native/StakeContract.cs Phantasma.Blockchain/Contracts/StakeContract.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
using System.Linq;
77
using Phantasma.Domain;
88

9-
namespace Phantasma.Contracts.Native
9+
namespace Phantasma.Blockchain.Contracts
1010
{
1111
public struct EnergyStake
1212
{

0 commit comments

Comments
 (0)