Portfolio¶
Calls¶
accept_portfolio_custody¶
Attributes¶
| Name | Type |
|---|---|
| auth_id | u64 |
Python¶
call = substrate.compose_call(
'Portfolio', 'accept_portfolio_custody', {'auth_id': 'u64'}
)
allow_identity_to_create_portfolios¶
Adds an identity that will be allowed to create and take custody of a portfolio under the caller's identity.
# Arguments
* trusted_identity - the [IdentityId] that will be allowed to call create_custody_portfolio.
Attributes¶
| Name | Type |
|---|---|
| trusted_identity | IdentityId |
Python¶
call = substrate.compose_call(
'Portfolio', 'allow_identity_to_create_portfolios', {'trusted_identity': '[u8; 32]'}
)
create_custody_portfolio¶
Creates a portfolio under the portfolio_owner_id identity and transfers its custody to the caller's identity.
# Arguments
* portfolio_owner_id - the [IdentityId] that will own the new portfolio.
* portfolio_name - the [PortfolioName] of the new portfolio.
Attributes¶
| Name | Type |
|---|---|
| portfolio_owner_id | IdentityId |
| portfolio_name | PortfolioName |
Python¶
call = substrate.compose_call(
'Portfolio', 'create_custody_portfolio', {
'portfolio_name': 'Bytes',
'portfolio_owner_id': '[u8; 32]',
}
)
create_portfolio¶
Creates a portfolio with the given name.
Attributes¶
| Name | Type |
|---|---|
| name | PortfolioName |
Python¶
call = substrate.compose_call(
'Portfolio', 'create_portfolio', {'name': 'Bytes'}
)
delete_portfolio¶
Deletes a user portfolio. A portfolio can be deleted only if it has no funds.
# Errors
* PortfolioDoesNotExist if num doesn't reference a valid portfolio.
* PortfolioNotEmpty if the portfolio still holds any asset
# Permissions * Portfolio
Attributes¶
| Name | Type |
|---|---|
| num | PortfolioNumber |
Python¶
call = substrate.compose_call(
'Portfolio', 'delete_portfolio', {'num': 'u64'}
)
move_portfolio_funds¶
Moves fungigle an non-fungible tokens from one portfolio of an identity to another portfolio of the same identity. Must be called by the custodian of the sender. Funds from deleted portfolios can also be recovered via this method.
A short memo can be added to to each token amount moved.
# Errors
* PortfolioDoesNotExist if one or both of the portfolios reference an invalid portfolio.
* destination_is_same_portfolio if both sender and receiver portfolio are the same
* DifferentIdentityPortfolios if the sender and receiver portfolios belong to different identities
* UnauthorizedCustodian if the caller is not the custodian of the from portfolio
* InsufficientPortfolioBalance if the sender does not have enough free balance
* NoDuplicateAssetsAllowed the same ticker can't be repeated in the items vector.
* InvalidTransferNFTNotOwned if the caller is trying to move an NFT he doesn't own.
* InvalidTransferNFTIsLocked if the caller is trying to move a locked NFT.
# Permissions * Portfolio
Attributes¶
| Name | Type |
|---|---|
| from | PortfolioId |
| to | PortfolioId |
| funds | Vec<Fund> |
Python¶
call = substrate.compose_call(
'Portfolio', 'move_portfolio_funds', {
'from': {
'did': '[u8; 32]',
'kind': {
'Default': None,
'User': 'u64',
},
},
'funds': [
{
'description': {
'Fungible': {
'amount': 'u128',
'ticker': '[u8; 12]',
},
'NonFungible': {
'ids': ['u64'],
'ticker': '[u8; 12]',
},
},
'memo': (None, '[u8; 32]'),
},
],
'to': {
'did': '[u8; 32]',
'kind': {
'Default': None,
'User': 'u64',
},
},
}
)
pre_approve_portfolio¶
Pre-approves the receivement of an asset to a portfolio.
# Arguments
* origin - the secondary key of the sender.
* ticker - the [Ticker] that will be exempt from affirmation.
* portfolio_id - the [PortfolioId] that can receive ticker without affirmation.
# Permissions * Portfolio
Attributes¶
| Name | Type |
|---|---|
| ticker | Ticker |
| portfolio_id | PortfolioId |
Python¶
call = substrate.compose_call(
'Portfolio', 'pre_approve_portfolio', {
'portfolio_id': {
'did': '[u8; 32]',
'kind': {
'Default': None,
'User': 'u64',
},
},
'ticker': '[u8; 12]',
}
)
quit_portfolio_custody¶
When called by the custodian of portfolio_id,
allows returning the custody of the portfolio to the portfolio owner unilaterally.
# Errors
* UnauthorizedCustodian if the caller is not the current custodian of portfolio_id.
# Permissions * Portfolio
Attributes¶
| Name | Type |
|---|---|
| pid | PortfolioId |
Python¶
call = substrate.compose_call(
'Portfolio', 'quit_portfolio_custody', {
'pid': {
'did': '[u8; 32]',
'kind': {
'Default': None,
'User': 'u64',
},
},
}
)
remove_portfolio_pre_approval¶
Removes the pre approval of an asset to a portfolio.
# Arguments
* origin - the secondary key of the sender.
* ticker - the [Ticker] that will be exempt from affirmation.
* portfolio_id - the [PortfolioId] that can receive ticker without affirmation.
# Permissions * Portfolio
Attributes¶
| Name | Type |
|---|---|
| ticker | Ticker |
| portfolio_id | PortfolioId |
Python¶
call = substrate.compose_call(
'Portfolio', 'remove_portfolio_pre_approval', {
'portfolio_id': {
'did': '[u8; 32]',
'kind': {
'Default': None,
'User': 'u64',
},
},
'ticker': '[u8; 12]',
}
)
rename_portfolio¶
Renames a non-default portfolio.
# Errors
* PortfolioDoesNotExist if num doesn't reference a valid portfolio.
# Permissions * Portfolio
Attributes¶
| Name | Type |
|---|---|
| num | PortfolioNumber |
| to_name | PortfolioName |
Python¶
call = substrate.compose_call(
'Portfolio', 'rename_portfolio', {'num': 'u64', 'to_name': 'Bytes'}
)
revoke_create_portfolios_permission¶
Removes permission of an identity to create and take custody of a portfolio under the caller's identity.
# Arguments
* identity - the [IdentityId] that will have the permissions to call create_custody_portfolio revoked.
Attributes¶
| Name | Type |
|---|---|
| identity | IdentityId |
Python¶
call = substrate.compose_call(
'Portfolio', 'revoke_create_portfolios_permission', {'identity': '[u8; 32]'}
)
Events¶
FundsMovedBetweenPortfolios¶
Funds have moved between portfolios
# Parameters * Origin DID. * Source portfolio. * Destination portfolio. * The type of fund that was moved. * Optional memo for the move.
Attributes¶
| Name | Type | Composition |
|---|---|---|
| None | IdentityId |
[u8; 32] |
| None | PortfolioId |
{'did': '[u8; 32]', 'kind': {'Default': None, 'User': 'u64'}} |
| None | PortfolioId |
{'did': '[u8; 32]', 'kind': {'Default': None, 'User': 'u64'}} |
| None | FundDescription |
{'Fungible': {'ticker': '[u8; 12]', 'amount': 'u128'}, 'NonFungible': {'ticker': '[u8; 12]', 'ids': ['u64']}} |
| None | Option<Memo> |
(None, '[u8; 32]') |
PortfolioCreated¶
The portfolio has been successfully created.
# Parameters * origin DID * portfolio number * portfolio name
Attributes¶
| Name | Type | Composition |
|---|---|---|
| None | IdentityId |
[u8; 32] |
| None | PortfolioNumber |
u64 |
| None | PortfolioName |
Bytes |
PortfolioCustodianChanged¶
Custody of a portfolio has been given to a different identity
# Parameters * origin DID * portfolio id * portfolio custodian did
Attributes¶
| Name | Type | Composition |
|---|---|---|
| None | IdentityId |
[u8; 32] |
| None | PortfolioId |
{'did': '[u8; 32]', 'kind': {'Default': None, 'User': 'u64'}} |
| None | IdentityId |
[u8; 32] |
PortfolioDeleted¶
The portfolio has been successfully removed.
# Parameters * origin DID * portfolio number
Attributes¶
| Name | Type | Composition |
|---|---|---|
| None | IdentityId |
[u8; 32] |
| None | PortfolioNumber |
u64 |
PortfolioRenamed¶
The portfolio identified with num has been renamed to name.
# Parameters * origin DID * portfolio number * portfolio name
Attributes¶
| Name | Type | Composition |
|---|---|---|
| None | IdentityId |
[u8; 32] |
| None | PortfolioNumber |
u64 |
| None | PortfolioName |
Bytes |
PreApprovedPortfolio¶
A portfolio has pre approved the receivement of an asset.
# Parameters
* [IdentityId] of the caller.
* [PortfolioId] that will receive assets without explicit affirmation.
* [Ticker] of the asset that has been exempt from explicit affirmation.
Attributes¶
| Name | Type | Composition |
|---|---|---|
| None | IdentityId |
[u8; 32] |
| None | PortfolioId |
{'did': '[u8; 32]', 'kind': {'Default': None, 'User': 'u64'}} |
| None | Ticker |
[u8; 12] |
RevokePreApprovedPortfolio¶
A portfolio has removed the approval of an asset.
# Parameters
* [IdentityId] of the caller.
* [PortfolioId] that had its pre approval revoked.
* [Ticker] of the asset that had its pre approval revoked.
Attributes¶
| Name | Type | Composition |
|---|---|---|
| None | IdentityId |
[u8; 32] |
| None | PortfolioId |
{'did': '[u8; 32]', 'kind': {'Default': None, 'User': 'u64'}} |
| None | Ticker |
[u8; 12] |
UserPortfolios¶
All non-default portfolio numbers and names of a DID.
# Parameters * origin DID * vector of number-name pairs
Attributes¶
| Name | Type | Composition |
|---|---|---|
| None | IdentityId |
[u8; 32] |
| None | Vec<(PortfolioNumber, PortfolioName)> |
[('u64', 'Bytes')] |
Storage functions¶
AllowedCustodians¶
Custodians allowed to create and take custody of portfolios on an id's behalf.
Python¶
result = substrate.query(
'Portfolio', 'AllowedCustodians', ['[u8; 32]', '[u8; 32]']
)
Return value¶
'bool'
NameToNumber¶
Inverse map of Portfolios used to ensure bijectivitiy,
and uniqueness of names in Portfolios.
Python¶
result = substrate.query(
'Portfolio', 'NameToNumber', ['[u8; 32]', 'Bytes']
)
Return value¶
'u64'
NextPortfolioNumber¶
The next portfolio sequence number of an identity.
Python¶
result = substrate.query(
'Portfolio', 'NextPortfolioNumber', ['[u8; 32]']
)
Return value¶
'u64'
PortfolioAssetBalances¶
The asset balances of portfolios.
Python¶
result = substrate.query(
'Portfolio', 'PortfolioAssetBalances', [
{
'did': '[u8; 32]',
'kind': {
'Default': None,
'User': 'u64',
},
},
'[u8; 12]',
]
)
Return value¶
'u128'
PortfolioAssetCount¶
How many assets with non-zero balance this portfolio contains.
Python¶
result = substrate.query(
'Portfolio', 'PortfolioAssetCount', [
{
'did': '[u8; 32]',
'kind': {
'Default': None,
'User': 'u64',
},
},
]
)
Return value¶
'u64'
PortfolioCustodian¶
The custodian of a particular portfolio. None implies that the identity owner is the custodian.
Python¶
result = substrate.query(
'Portfolio', 'PortfolioCustodian', [
{
'did': '[u8; 32]',
'kind': {
'Default': None,
'User': 'u64',
},
},
]
)
Return value¶
'[u8; 32]'
PortfolioLockedAssets¶
Amount of assets locked in a portfolio. These assets show up in portfolio balance but can not be transferred away.
Python¶
result = substrate.query(
'Portfolio', 'PortfolioLockedAssets', [
{
'did': '[u8; 32]',
'kind': {
'Default': None,
'User': 'u64',
},
},
'[u8; 12]',
]
)
Return value¶
'u128'
PortfolioLockedNFT¶
All locked nft for a given portfolio.
Python¶
result = substrate.query(
'Portfolio', 'PortfolioLockedNFT', [
{
'did': '[u8; 32]',
'kind': {
'Default': None,
'User': 'u64',
},
},
('[u8; 12]', 'u64'),
]
)
Return value¶
'bool'
PortfolioNFT¶
The nft associated to the portfolio.
Python¶
result = substrate.query(
'Portfolio', 'PortfolioNFT', [
{
'did': '[u8; 32]',
'kind': {
'Default': None,
'User': 'u64',
},
},
('[u8; 12]', 'u64'),
]
)
Return value¶
'bool'
Portfolios¶
The set of existing portfolios with their names. If a certain pair of a DID and
portfolio number maps to None then such a portfolio doesn't exist. Conversely, if a
pair maps to Some(name) then such a portfolio exists and is called name.
Python¶
result = substrate.query(
'Portfolio', 'Portfolios', ['[u8; 32]', 'u64']
)
Return value¶
'Bytes'
PortfoliosInCustody¶
Tracks all the portfolios in custody of a particular identity. Only used by the UIs.
When true is stored as the value for a given (did, pid), it means that pid is in custody of did.
false values are never explicitly stored in the map, and are instead inferred by the absence of a key.
Python¶
result = substrate.query(
'Portfolio', 'PortfoliosInCustody', [
'[u8; 32]',
{
'did': '[u8; 32]',
'kind': {
'Default': None,
'User': 'u64',
},
},
]
)
Return value¶
'bool'
PreApprovedPortfolios¶
All portfolios that don't need to affirm the receivement of a given ticker.
Python¶
result = substrate.query(
'Portfolio', 'PreApprovedPortfolios', [
{
'did': '[u8; 32]',
'kind': {
'Default': None,
'User': 'u64',
},
},
'[u8; 12]',
]
)
Return value¶
'bool'
StorageVersion¶
Storage version.
Python¶
result = substrate.query(
'Portfolio', 'StorageVersion', []
)
Return value¶
'u8'
Errors¶
DestinationIsSamePortfolio¶
The source and destination portfolios should be different.
DifferentIdentityPortfolios¶
The portfolios belong to different identities
EmptyTransfer¶
Trying to move an amount of zero assets.
InsufficientPortfolioBalance¶
Insufficient balance for a transaction.
InsufficientTokensLocked¶
Can not unlock more tokens than what are locked
InvalidTransferNFTIsLocked¶
Locked NFTs can not be moved between portfolios.
InvalidTransferNFTNotOwned¶
Only owned NFTs can be moved between portfolios.
InvalidTransferSenderIdMatchesReceiverId¶
The sender identity can't be the same as the receiver identity.
MissingOwnersPermission¶
The caller doesn't have permission to create portfolios on the owner's behalf.
NFTAlreadyLocked¶
The NFT is already locked.
NFTNotFoundInPortfolio¶
The NFT does not exist in the portfolio.
NFTNotLocked¶
The NFT has never been locked.
NoDuplicateAssetsAllowed¶
Duplicate asset among the items.
PortfolioDoesNotExist¶
The portfolio doesn't exist.
PortfolioNameAlreadyInUse¶
The portfolio couldn't be renamed because the chosen name is already in use.
PortfolioNotEmpty¶
The portfolio still has some asset balance left
SecondaryKeyNotAuthorizedForPortfolio¶
The secondary key is not authorized to access the portfolio(s).
UnauthorizedCustodian¶
The porfolio's custody is with someone other than the caller.