Skip to content

Commit

Permalink
define protobuf files
Browse files Browse the repository at this point in the history
  • Loading branch information
loning committed Apr 6, 2020
1 parent 904c3df commit afd5862
Show file tree
Hide file tree
Showing 5 changed files with 217 additions and 0 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -18,4 +18,10 @@
<Link>Protobuf/Proto/centre_asset_management.proto</Link>
</ContractCode>
</ItemGroup>

<ItemGroup>
<ContractReference Include="..\..\protobuf\token_contract.proto">
<Link>Protobuf\Proto\reference\token_contract.proto</Link>
</ContractReference>
</ItemGroup>
</Project>
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
using AElf.Contracts.MultiToken;
using AElf.Sdk.CSharp;
using AElf.Types;
using Google.Protobuf.WellKnownTypes;

namespace AElf.Contracts.CentreAssetManagement
Expand All @@ -19,5 +22,94 @@ public override HelloReturn Hello(Empty input)
{
return new HelloReturn {Value = "Hello World!"};
}

public override HolderCreateReturnDto CreateHolder(HolderCreateDto input)
{
var result = new HolderCreateReturnDto();

HolderInfo holderInfo = new HolderInfo();

var holderId = Context.TransactionId.Xor(Hash.FromString(input.Name));

Assert(State.HashToHolderInfoMap[holderId].MainAddress.Value.IsEmpty, "already have a holder");

holderInfo.MainAddress = GetMainAddress(holderId);
foreach (var managementAddress in input.ManagementAddresses)
{
holderInfo.ManagementAddresses[managementAddress.Address.Value.ToBase64()] = managementAddress;
}

holderInfo.OwnerAddress = input.OwnerAddress;

holderInfo.Name = input.Name;

holderInfo.MainAddress = GetMainAddress(holderId);

State.HashToHolderInfoMap[holderId] = holderInfo;

return result;
}

public override Empty Initialize(InitializeDto input)
{
Assert(!State.Initialized.Value, "already initialized.");

foreach (var contractCallWhiteLists in input.CategoryToContactCallWhiteListsMap)
{
State.CategoryToContractCallWhiteListsMap.Set(Hash.FromString(contractCallWhiteLists.Key),
contractCallWhiteLists.Value);
}

State.CentreAssetManagementInfo.Value.Owner = Context.Sender; // TODO: set the owner to something else.

return new Empty();
}

public override AssetMoveReturnDto MoveAssetToMainAddress(AssetMoveDto input)
{
AssetMoveReturnDto result = new AssetMoveReturnDto();
var mainAddress = GetMainAddress(input.HolderId);

var virtualUserAddress = GetVirtualUserAddress(input);

var tokenInput = new TransferInput()
{
To = mainAddress,
Amount = input.Amount,
Symbol = input.Symbol
};

State.TokenContract.Transfer.Send(tokenInput);

result.Success = true;

return result;
}

[View]
public override Address GetVirtualAddress(AssetMoveDto input)
{
return Context.ConvertVirtualAddressToContractAddress(GetVirtualUserAddress(input));
}

private Hash GetVirtualUserAddress(AssetMoveDto input)
{
var virtualUserAddress = Hash.FromString(input.UserToken);

if (!input.AddressCategoryHash.Value.IsNullOrEmpty())
{
var map = State.CategoryToContractCallWhiteListsMap[input.AddressCategoryHash];
Assert(map.List.Count > 0, "this category have no contract call list, maybe not initialized.");

virtualUserAddress = virtualUserAddress.Xor(input.AddressCategoryHash);
}

return virtualUserAddress;
}

private Address GetMainAddress(Hash holderId)
{
return Context.ConvertVirtualAddressToContractAddress(holderId);
}
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
using AElf.Contracts.MultiToken;
using AElf.Sdk.CSharp.State;
using AElf.Types;

namespace AElf.Contracts.CentreAssetManagement
{
Expand All @@ -8,5 +10,19 @@ namespace AElf.Contracts.CentreAssetManagement
public class CentreAssetManagementState : ContractState
{
// state definitions go here.

internal TokenContractContainer.TokenContractReferenceState TokenContract { get; set; }


public SingletonState<CentreAssetManagementInfo> CentreAssetManagementInfo { get; set; }

//Store what method can be called in one category
public MappedState<Hash,ContractCallWhiteLists> CategoryToContractCallWhiteListsMap { get; set; }

public SingletonState<bool> Initialized { get; set; }


public MappedState<Hash,HolderInfo> HashToHolderInfoMap { get; set; }

}
}
92 changes: 92 additions & 0 deletions chain/protobuf/centre_asset_management.proto
Original file line number Diff line number Diff line change
Expand Up @@ -33,9 +33,101 @@ service CentreAssetManagement {
// this action take a google.protobuf.Empty (placeholder for void) as input
// and returns a custom defined type: HelloReturn.
rpc Hello (google.protobuf.Empty) returns (HelloReturn) { }

rpc CreateHolder(HolderCreateDto) returns (HolderCreateReturnDto) { }

rpc MoveAssetToMainAddress(AssetMoveDto) returns (AssetMoveReturnDto) { }

rpc MoveAssetFromMainAddress(AssetMoveDto) returns (AssetMoveReturnDto) { }

rpc GetCategoryContractCallAllowance(CategoryDto) returns (CategoryContractCallAllowanceDto) { }

rpc Initialize(InitializeDto) returns (google.protobuf.Empty) { }

rpc GetVirtualAddress(AssetMoveDto) returns(aelf.Address){
option (aelf.is_view) = true;
}
}


message ContractCallWhiteList{
aelf.Address address = 1;
repeated string method_names = 2;
}

message ContractCallWhiteLists{
repeated ContractCallWhiteList list = 1;
}

message CentreAssetManagementInfo{
//for example, {"vote","address_of_vote_contract_1,address_of_vote_contract_2"}
//address_of_vote_contract can be ELF_xxx_YYY
//or address_of_vote_contract can be a system contract name
//map<string,string> category_contract_white_lists = 1;


aelf.Address owner = 1;
}

message ManagementAddress{
aelf.Address address = 1;
int64 amount = 2; //how much asset the address can management

int32 management_addresses_in_total = 3; // how many management keys do we need

//if we have key:(a,1000),(b,2000),(c,5000).
//when management_addresses_limit_amount = 2000, only b and c can be used.
int64 management_addresses_limit_amount = 4;
}

message HolderInfo{
string name = 1;
aelf.Address owner_address = 2; // the owner can change the settings
map<string,ManagementAddress> management_addresses = 3; // management address can manage asset
aelf.Address main_address = 4;
}

// a custom message, used as the return type of the Hello action
message HelloReturn {
string Value = 1;
}

message CategoryDto{
string category = 1;
}

message CategoryContractCallAllowanceDto{
string category = 1;
repeated ContractCallWhiteList list = 2;
}


message HolderCreateDto{
string name = 1;
aelf.Address owner_address = 2; // the owner can change the settings
repeated ManagementAddress management_addresses = 3; // management address can manage asset
}

message HolderCreateReturnDto{
aelf.Hash id = 1;
HolderInfo info = 2;
}

message AssetMoveDto{
string symbol = 1;
int64 amount = 2;
string user_token = 3;
aelf.Hash address_category_hash = 4;
aelf.Hash holder_id = 5;
}

message AssetMoveReturnDto{
bool success = 1;
}

message InitializeDto{

//key is category
//(vote, {})
map<string,ContractCallWhiteLists> category_to_contact_call_white_lists_map = 1;
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,5 +18,16 @@ public async Task HelloCall_ReturnsCentreAssetManagementMessage()
text.MergeFrom(txResult.TransactionResult.ReturnValue);
text.Value.ShouldBe("Hello World!");
}

[Fact]
public async Task MainTest()
{
AssetMoveDto assetMoveDto=new AssetMoveDto()
{
Amount = 1,
Symbol = "ELF",
UserToken = "UserToken1",
};
}
}
}

0 comments on commit afd5862

Please sign in to comment.