Contract API
Terms
CAHolder: AA address, each user corresponds to one CAHolder (the same user's different accounts, for example, his "Apple" and "Google" will correspond to 2 CAHolders).
Guardian: The method through which users authenticate, including credentials like email or Apple ID, and a specific verifier.
Manager: An externally owned account (EOA) address used by a wallet to initiate transactions (often referring to a device). A single CAHolder can correspond to multiple Managers.
Strategy: An authentication strategy that considers conditions (e.g., the number of guardians) to determine if the authentication is successful.
Protobuf: You can click here to learn more about protobuf.
Version currently in use: proto3
API documentation
Initialize contract
- API definition
rpc Initialize(InitializeInput) returns (google.protobuf.Empty){}
message InitializeInput{
aelf.Address contract_admin = 1;
}
API function
- Initialize the AA contract
Time to call
- When a contract is deployed on aelf blockchain
Conditions that need to be met
- contract_admin should be zero contract address
- The contract is initialized for the first time
Create CAHolder
- API definition
rpc CreateCAHolder (CreateCAHolderInput) returns (google.protobuf.Empty) {}
message CreateCAHolderInput {
GuardianInfo guardian_approved = 1;
ManagerInfo manager_info = 2;
StrategyNode judgement_strategy = 3;
}
message GuardianInfo {
GuardianType type = 1;
aelf.Hash identifier_hash = 2;
VerificationInfo verification_info = 3;
}
message ManagerInfo {
aelf.Address address = 1;
string extra_data = 2;
}
message StrategyNode {
StrategyName name = 1;
repeated StrategyValueType type = 2;
repeated bytes value = 3;
}
API function
- Create user's AA wallet
Time to call
- When user registers
Conditions that need to be met
- The caller needs the address's controllers
- The number of guardians meet the StrategyNode
- Verifier address is legal
- Manager info is legal
Add Guardian
- API definition
rpc CreateCAHolder (CreateCAHolderInput) returns (google.protobuf.Empty) {}
message AddGuardianInput {
aelf.Hash ca_hash = 1;
GuardianInfo guardian_to_add = 2;
repeated GuardianInfo guardians_approved = 3;
}
API function
- Add Guardian to the designated wallet address
Time to call
- Omitted
Conditions that need to be met
- The Guardian to be added does not exist in CAHolder
- Verifier address is legal
- The caller is one of the Managers configured in the CAHolder
- The number of guardians_approved should meet what's set in the CAHolder strategy
Delete Guardian
- API definition
rpc RemoveGuardian (RemoveGuardianInput) returns (google.protobuf.Empty) {}
message RemoveGuardianInput {
aelf.Hash ca_hash = 1;
GuardianInfo guardian_to_remove = 2;
repeated GuardianInfo guardians_approved = 3;
}
API function
- Guardian Delete Guardian
Time to call
- Omitted
Conditions that need to be met
- The caller is one of the Managers configured in the CAHolder
- The Guardian to be deleted should not exist in Approved Guardian
- The Guardian to be deleted should meet what's set in the CAHolder strategy
- The Guardian to be deleted must not be a login Guardian
Update Guardian
- API definition
rpc UpdateGuardian (UpdateGuardianInput) returns (google.protobuf.Empty) {}
message UpdateGuardianInput{
aelf.Hash ca_hash = 1;
GuardianInfo guardian_to_update_pre = 2;
GuardianInfo guardian_to_update_new = 3;
repeated GuardianInfo guardians_approved = 4;
}
API function
- Update Guardian
Time to call
- Omitted
Conditions that need to be met
- The caller is one of the Managers configured in the CAHolder
- Verifier is legal
- The Guardian to be updated should not exist in Approved Guardian
- The Guardians not updated in this CAHolder should meet what's set in the CAHolder strategy
Set login Guardian
- API definition
rpc SetGuardianForLogin (SetGuardianForLoginInput) returns (google.protobuf.Empty) {}
message SetGuardianForLoginInput {
aelf.Hash ca_hash = 1;
Guardian guardian = 2;
}
API function
- Set the Guardian for login
Time to call
- Before the user logs in
Conditions that need to be met
- Guardian (email/Apple ID)+verifier ID has not been used before
- The caller is one of the Managers configured in the CAHolder
Unset login Guardian
- API definition
rpc UnsetGuardianForLogin (UnsetGuardianForLoginInput) returns (google.protobuf.Empty) {}
message UnsetGuardianForLoginInput {
aelf.Hash ca_hash = 1;
Guardian guardian = 2;
}
API function
- Unset the Guardian for login
Conditions that need to be met
- The caller is one of the Managers configured in the CAHolder
- The Guardian was set by calling SetGuardianForLogin
Manager excecutes the AA contract
- API definition
rpc ManagerForwardCall (ManagerForwardCallInput) returns (google.protobuf.Empty) {}
message ManagerForwardCallInput {
aelf.Hash ca_hash = 1;
aelf.Address contract_address = 2;
string method_name = 3;
bytes args = 4;
}
API function
- Execute AA contract method and send an inline transaction to the contract address
Conditions that need to be met
- The caller is one of the Managers configured in the CAHolder
Execute Transfer/TransferFrom
- API definition
// Manager send transfer transaction.
rpc ManagerTransfer (ManagerTransferInput) returns (google.protobuf.Empty){}
// Manager send transfer from transaction.
rpc ManagerTransferFrom (ManagerTransferFromInput) returns (google.protobuf.Empty){}
message ManagerTransferInput{
aelf.Hash ca_hash = 1;
// The receiver of the token.
aelf.Address to = 2;
// The token symbol to transfer.
string symbol = 3;
// The amount to to transfer.
int64 amount = 4;
// The memo.
string memo = 5;
}
message ManagerTransferFromInput{
aelf.Hash ca_hash = 1;
// The source address of the token.
aelf.Address from = 2;
// The destination address of the token.
aelf.Address to = 3;
// The symbol of the token to transfer.
string symbol = 4;
// The amount to transfer.
int64 amount = 5;
// The memo.
string memo = 6;
}
API function
- Equivalent to Transfer and TransferFrom
Conditions that need to be met
- The caller is one of the Managers configured in the CAHolder
Social recovery
- API definition
rpc SocialRecovery (SocialRecoveryInput) returns (google.protobuf.Empty) {}
message SocialRecoveryInput {
aelf.Hash login_guardian_identifier_hash = 1;
repeated GuardianInfo guardians_approved = 2;
ManagerInfo manager_info = 3;
}
// Trigger LogEvent upon calling:
message ManagerInfoSocialRecovered {
option (aelf.is_event) = true;
aelf.Hash ca_hash = 1 [(aelf.is_indexed) = true];
aelf.Address ca_address = 2 [(aelf.is_indexed) = true];
aelf.Address manager = 3 [(aelf.is_indexed) = true];
string extra_data = 4;
}
API function
- When users log in on new devices
Conditions that need to be met
- The number of guardian approval should meet what's set in the strategy
- Manager is a new Manager
- The number of Managers doesn't exceed limit
Add Manager
- API definition
rpc AddManagerInfo (AddManagerInfoInput) returns (google.protobuf.Empty) {}
message AddManagerInfoInput {
aelf.Hash ca_hash = 1;
ManagerInfo manager_info = 2;
}
API function
- Add Manager
Time to call
- When users log in on new devices by scaning code and a new Manager needs to be generated on the device
Conditions that need to be met
- The caller is one of the Managers configured in the CAHolder
Remove Manager
- API definition
rpc RemoveManagerInfo (RemoveManagerInfoInput) returns (google.protobuf.Empty) {}
message RemoveManagerInfoInput {
aelf.Hash ca_hash = 1;
}
API function
- approve Remove the current Manager, not approval from Guardians needed
Conditions that need to be met
- The caller is one of the Managers configured in the CAHolder
Remove other Manager
- API definition
rpc RemoveOtherManagerInfo (RemoveOtherManagerInfoInput) returns (google.protobuf.Empty) {}
message RemoveOtherManagerInfoInput {
aelf.Hash ca_hash = 1;
ManagerInfo manager_info = 2;
repeated GuardianInfo guardians_approved = 3;
}
API function
- Remove other Manager, approval from Guardians needed
Conditions that need to be met
- The caller is one of the Managers configured in the CAHolder
- Cannot remove the current Manager
Update Manager
- API definition
rpc UpdateManagerInfos (UpdateManagerInfosInput) returns (google.protobuf.Empty) {}
message UpdateManagerInfosInput {
aelf.Hash ca_hash = 1;
repeated ManagerInfo manager_infos = 2;
}
API function
- Update Manager
Conditions that need to be met
- The caller is one of the Managers configured in the CAHolder
- The Manager's extra_data is not empty
Add verifier node
- API definition
rpc AddVerifierServerEndPoints (AddVerifierServerEndPointsInput) returns (google.protobuf.Empty) {}
message AddVerifierServerEndPointsInput {
// If not exists, add; If does, insert
string name = 1;
string image_url = 2;
// Add all, ignore if has duplicates
repeated string end_points = 3;
repeated aelf.Address verifier_address_list = 4;
}
API function
- Add verifier node
Conditions that need to be met
- The caller is the node admin
- The number of EndPoints is greater than 0
- The image URL is not empty
Remove verifier node
- API definition
rpc RemoveVerifierServerEndPoints (RemoveVerifierServerEndPointsInput) returns (google.protobuf.Empty) {}
message RemoveVerifierServerEndPointsInput {
// If not exists, ignore
aelf.Hash id = 1;
// Remove all, ignore if do not exist
repeated string end_points = 2;
}
API function
- Remove verifier
Conditions that need to be met
- The caller is the node admin
- The number of EndPoints is greater than 0
Add CA Server
- API definition
rpc AddCAServer (AddCAServerInput) returns (google.protobuf.Empty){}
message AddCAServerInput{
string name = 1;
string end_points = 2;
}
API function
- Add CA server
Conditions that need to be met
- The caller is the contract admin
- The Name is not empty
- The end_points is not empty
Delete CA Server
- API definition
rpc RemoveCAServer (RemoveCAServerInput) returns (google.protobuf.Empty){}
message RemoveCAServerInput {
string name = 1;
}
API function
- CA Delete CA
Conditions that need to be met
- The caller is the contract admin
- The Name is not empty
Obtain account info
- API definition
rpc GetHolderInfo(GetHolderInfoInput) returns (GetHolderInfoOutput) {option (aelf.is_view) = true;}
message GetHolderInfoInput {
aelf.Hash ca_hash = 1;
aelf.Hash login_guardian_identifier_hash = 2;
}
message GetHolderInfoOutput{
aelf.Hash ca_hash = 1;
aelf.Address ca_address = 2;
GuardianList guardian_list = 3;
repeated ManagerInfo manager_infos = 4;
}
API function
- Obtain account info
Conditions that need to be met
- The login_guardian_identifier_hash is not empty
- The Guardian corresponding to loginGuardianIdentifierHash should exist
- The account should exist
Obtain verifier
- API definition
rpc GetVerifierServers (google.protobuf.Empty) returns (GetVerifierServersOutput) {option (aelf.is_view) = true;}
message GetCAServersOutput {
repeated CAServer ca_servers = 1;
}
API function
- Servers Obtain verifier servers
Conditions that need to be met
- None
Obtain CA server
- API definition
rpc GetCAServers (google.protobuf.Empty) returns (GetCAServersOutput) {option (aelf.is_view) = true;}
message GetCAServersOutput {
repeated CAServer ca_servers = 1;
}
API function
- Obtain CA server
Conditions that need to be met
- None
Validate account info
- API definition
rpc ValidateCAHolderInfoWithManagerInfosExists (ValidateCAHolderInfoWithManagerInfosExistsInput) returns (google.protobuf.Empty) {}
message ValidateCAHolderInfoWithManagerInfosExistsInput {
aelf.Hash ca_hash = 1;
repeated ManagerInfo manager_infos = 2;
repeated aelf.Hash login_guardians = 3;
repeated aelf.Hash not_login_guardians = 4;
}
API function
- Validate if the account has the login_guardians and not_login_guardians provided in the parameter
Conditions that need to be met
- The number of login_guardians and manager_infos provided in the parameter equals the existing number in the account
Validate strategy
- API definition
rpc ValidateStrategy (ValidateStrategyInput) returns (ValidateStrategyOutput) {option (aelf.is_view) = true;}
message ValidateStrategyInput {
StrategyNode strategy_node = 1;
map<string, int64> variables = 2;
}
message ValidateStrategyOutput {
bool bool_result = 1;
int64 int64_result = 2;
StrategyNode strategy_output = 3;
}
message StrategyNode {
StrategyName name = 1;
repeated StrategyValueType type = 2;
repeated bytes value = 3;
}
API function
- Call the Validate method in the contract to check if the strategy is legal
Conditions that need to be met
- None
Set contract delegation fee
- API definition
rpc SetContractDelegationFee (SetContractDelegationFeeInput) returns (google.protobuf.Empty) {}
message SetContractDelegationFeeInput {
ContractDelegationFee delegation_fee = 1;
}
message ContractDelegationFee {
int64 amount = 1;
}
API function
- Set contract delegation fee
Conditions that need to be met
- The caller is the contract admin
- The management fee should be greater than 0
Get contract delegation fee
- API definition
rpc GetContractDelegationFee (google.protobuf.Empty) returns (GetContractDelegationFeeOutput) {}
message GetContractDelegationFeeOutput {
ContractDelegationFee delegation_fee = 1;
}
message ContractDelegationFee {
int64 amount = 1;
}
API function
- Get contract delegation fee
Conditions that need to be met
- None
Add controller (controller can be used to create CAHolder)
- API definition
rpc AddCreatorController (ControllerInput) returns (google.protobuf.Empty) {}
message ControllerInput{
aelf.Address address = 1;
}
API function
- Add controller
Conditions that need to be met
- The caller is the contract admin
Remove controller
- API definition
rpc RemoveCreatorController (ControllerInput) returns (google.protobuf.Empty) {}
message ControllerInput{
aelf.Address address = 1;
}
API function
- Remove controller
Conditions that need to be met
- The caller is the contract admin
Get controller
- API definition
rpc GetCreatorControllers (google.protobuf.Empty) returns (ControllerOutput) {option (aelf.is_view) = true;}
message ControllerOutput{
repeated aelf.Address addresses = 1;
}
API function
- Get controller
Conditions that need to be met
- None
Change admin
- API definition
rpc ChangeAdmin (AdminInput) returns (google.protobuf.Empty) {}
message AdminInput{
aelf.Address address = 1;
}
API function
- Change node admin
Conditions that need to be met
- The caller is the contract admin
Get admin
- API definition
rpc GetAdmin (google.protobuf.Empty) returns (AdminOutput) {option (aelf.is_view) = true;}
message AdminOutput{
aelf.Address address = 1;
}
API function
- Get admin
Conditions that need to be met
- The caller is the contract admin
Change the switch of
- API definition
rpc ChangeOperationTypeInSignatureEnabled (OperationTypeInSignatureEnabledInput) returns (google.protobuf.Empty) {}
message OperationTypeInSignatureEnabledInput {
bool operation_type_in_signature_enabled = 1;
}
API function
- If enabled, when interacting with a guardian, it will validate whether that guardian supports the specific operation. The known operation enumerations are as follows:
enum OperationType {
Unknown = 0;
CreateCAHolder = 1;
SocialRecovery = 2;
AddGuardian = 3;
RemoveGuardian = 4;
UpdateGuardian = 5;
RemoveOtherManagerInfo = 6;
}
Conditions that need to be met
- The caller is the contract admin
- The current status should not be the same as the updated status
Set AA contract addresses
- API definition
rpc SetCAContractAddresses (SetCAContractAddressesInput) returns (google.protobuf.Empty) {}
message SetCAContractAddressesInput {
repeated CAContractAddress ca_contract_addresses = 1;
}
message CAContractAddress {
aelf.Address address = 1;
int32 chain_id = 2;
}
API function
- Change the AA contract address of the corresponding chain
Conditions that need to be met
- The caller is the contract admin