MantaPay¶
Calls¶
private_transfer¶
Transfers private assets encoded in post.
# Note
In this transaction, origin is just signing the post and is not necessarily related
to any of the participants in the transaction itself.
Attributes¶
| Name | Type |
|---|---|
| post | TransferPost |
Python¶
call = substrate.compose_call(
'MantaPay', 'private_transfer', {
'post': {
'asset_id': (None, '[u8; 32]'),
'authorization_signature': (
None,
{
'authorization_key': '[u8; 32]',
'signature': (
'[u8; 32]',
'[u8; 32]',
),
},
),
'proof': '[u8; 128]',
'receiver_posts': [
{
'full_incoming_note': {
'address_partition': 'u8',
'incoming_note': {
'ciphertext': '[[u8; 32]; 3]',
'ephemeral_public_key': '[u8; 32]',
'tag': '[u8; 32]',
},
'light_incoming_note': {
'ciphertext': '[[u8; 32]; 3]',
'ephemeral_public_key': '[u8; 32]',
},
},
'utxo': {
'commitment': '[u8; 32]',
'is_transparent': 'bool',
'public_asset': {
'id': '[u8; 32]',
'value': '[u8; 16]',
},
},
},
],
'sender_posts': [
{
'nullifier_commitment': '[u8; 32]',
'outgoing_note': {
'ciphertext': '[[u8; 32]; 2]',
'ephemeral_public_key': '[u8; 32]',
},
'utxo_accumulator_output': '[u8; 32]',
},
],
'sink_accounts': ['[u8; 32]'],
'sinks': ['[u8; 16]'],
'sources': ['[u8; 16]'],
},
}
)
public_transfer¶
Transfers public asset from origin to the sink account.
Attributes¶
| Name | Type |
|---|---|
| asset | Asset |
| sink | T::AccountId |
Python¶
call = substrate.compose_call(
'MantaPay', 'public_transfer', {
'asset': {
'id': '[u8; 32]',
'value': '[u8; 16]',
},
'sink': 'AccountId',
}
)
to_private¶
Transforms some public assets into private ones using post, withdrawing the public
assets from the origin account.
Attributes¶
| Name | Type |
|---|---|
| post | TransferPost |
Python¶
call = substrate.compose_call(
'MantaPay', 'to_private', {
'post': {
'asset_id': (None, '[u8; 32]'),
'authorization_signature': (
None,
{
'authorization_key': '[u8; 32]',
'signature': (
'[u8; 32]',
'[u8; 32]',
),
},
),
'proof': '[u8; 128]',
'receiver_posts': [
{
'full_incoming_note': {
'address_partition': 'u8',
'incoming_note': {
'ciphertext': '[[u8; 32]; 3]',
'ephemeral_public_key': '[u8; 32]',
'tag': '[u8; 32]',
},
'light_incoming_note': {
'ciphertext': '[[u8; 32]; 3]',
'ephemeral_public_key': '[u8; 32]',
},
},
'utxo': {
'commitment': '[u8; 32]',
'is_transparent': 'bool',
'public_asset': {
'id': '[u8; 32]',
'value': '[u8; 16]',
},
},
},
],
'sender_posts': [
{
'nullifier_commitment': '[u8; 32]',
'outgoing_note': {
'ciphertext': '[[u8; 32]; 2]',
'ephemeral_public_key': '[u8; 32]',
},
'utxo_accumulator_output': '[u8; 32]',
},
],
'sink_accounts': ['[u8; 32]'],
'sinks': ['[u8; 16]'],
'sources': ['[u8; 16]'],
},
}
)
to_public¶
Transforms some private assets into public ones using post, depositing the public
assets in the origin account.
Attributes¶
| Name | Type |
|---|---|
| post | TransferPost |
Python¶
call = substrate.compose_call(
'MantaPay', 'to_public', {
'post': {
'asset_id': (None, '[u8; 32]'),
'authorization_signature': (
None,
{
'authorization_key': '[u8; 32]',
'signature': (
'[u8; 32]',
'[u8; 32]',
),
},
),
'proof': '[u8; 128]',
'receiver_posts': [
{
'full_incoming_note': {
'address_partition': 'u8',
'incoming_note': {
'ciphertext': '[[u8; 32]; 3]',
'ephemeral_public_key': '[u8; 32]',
'tag': '[u8; 32]',
},
'light_incoming_note': {
'ciphertext': '[[u8; 32]; 3]',
'ephemeral_public_key': '[u8; 32]',
},
},
'utxo': {
'commitment': '[u8; 32]',
'is_transparent': 'bool',
'public_asset': {
'id': '[u8; 32]',
'value': '[u8; 16]',
},
},
},
],
'sender_posts': [
{
'nullifier_commitment': '[u8; 32]',
'outgoing_note': {
'ciphertext': '[[u8; 32]; 2]',
'ephemeral_public_key': '[u8; 32]',
},
'utxo_accumulator_output': '[u8; 32]',
},
],
'sink_accounts': ['[u8; 32]'],
'sinks': ['[u8; 16]'],
'sources': ['[u8; 16]'],
},
}
)
Events¶
PrivateTransfer¶
Private Transfer Event
Attributes¶
| Name | Type | Composition |
|---|---|---|
| origin | Option<T::AccountId> |
(None, 'AccountId') |
ToPrivate¶
To Private Event
Attributes¶
| Name | Type | Composition |
|---|---|---|
| asset | Asset |
{'id': '[u8; 32]', 'value': '[u8; 16]'} |
| source | T::AccountId |
AccountId |
ToPublic¶
To Public Event
Attributes¶
| Name | Type | Composition |
|---|---|---|
| asset | Asset |
{'id': '[u8; 32]', 'value': '[u8; 16]'} |
| sink | T::AccountId |
AccountId |
Transfer¶
Public Transfer Event
Attributes¶
| Name | Type | Composition |
|---|---|---|
| asset | Asset |
{'id': '[u8; 32]', 'value': '[u8; 16]'} |
| source | T::AccountId |
AccountId |
| sink | T::AccountId |
AccountId |
Storage functions¶
NullifierCommitmentSet¶
Nullifier Commitment Set
Python¶
result = substrate.query(
'MantaPay', 'NullifierCommitmentSet', ['[u8; 32]']
)
Return value¶
()
NullifierSetInsertionOrder¶
Nullifiers Ordered by Insertion
Python¶
result = substrate.query(
'MantaPay', 'NullifierSetInsertionOrder', ['u64']
)
Return value¶
(
'[u8; 32]',
{'ciphertext': '[[u8; 32]; 2]', 'ephemeral_public_key': '[u8; 32]'},
)
NullifierSetSize¶
Nullifier Set Size
Python¶
result = substrate.query(
'MantaPay', 'NullifierSetSize', []
)
Return value¶
'u64'
ShardTrees¶
Shard Merkle Tree Paths
Python¶
result = substrate.query(
'MantaPay', 'ShardTrees', ['u8']
)
Return value¶
{
'current_path': {
'inner_path': ['[u8; 32]'],
'leaf_index': 'u32',
'sibling_digest': '[u8; 32]',
},
'leaf_digest': (None, '[u8; 32]'),
}
Shards¶
UTXOs and Incoming Notes Grouped by Shard
Python¶
result = substrate.query(
'MantaPay', 'Shards', ['u8', 'u64']
)
Return value¶
(
{
'commitment': '[u8; 32]',
'is_transparent': 'bool',
'public_asset': {'id': '[u8; 32]', 'value': '[u8; 16]'},
},
{
'address_partition': 'u8',
'incoming_note': {
'ciphertext': '[[u8; 32]; 3]',
'ephemeral_public_key': '[u8; 32]',
'tag': '[u8; 32]',
},
'light_incoming_note': {
'ciphertext': '[[u8; 32]; 3]',
'ephemeral_public_key': '[u8; 32]',
},
},
)
UtxoAccumulatorOutputs¶
Outputs of Utxo Accumulator
Python¶
result = substrate.query(
'MantaPay', 'UtxoAccumulatorOutputs', ['[u8; 32]']
)
Return value¶
()
UtxoSet¶
UTXO Set
Python¶
result = substrate.query(
'MantaPay', 'UtxoSet', [
{
'commitment': '[u8; 32]',
'is_transparent': 'bool',
'public_asset': {
'id': '[u8; 32]',
'value': '[u8; 16]',
},
},
]
)
Return value¶
()
Errors¶
AssetRegistered¶
Asset Registered
An asset present in this transfer has already been registered to the ledger.
AssetSpent¶
Asset Spent
An asset present in this transfer has already been spent.
Blocked¶
Account cannot receive the assets.
DuplicateRegister¶
Duplicate Register
There were multiple register entries for the same underlying asset in this transfer.
DuplicateSpend¶
Duplicate Spend
There were multiple spend entries for the same underlying asset in this transfer.
FungibleLedgerEncodeError¶
Fungible Ledger Encode Error
InvalidAssetId¶
Invalid Asset Id
The asset id of the transfer could not be converted correctly to the standard format.
InvalidAuthorizationSignature¶
Invalid Authorization Signature
InvalidProof¶
Invalid Proof
The submitted proof did not pass validation, or errored during validation.
InvalidSerializedForm¶
Invalid Serialized Form
The transfer could not be interpreted because of an issue during deserialization.
InvalidShape¶
Invalid Shape
The transfer had an invalid shape.
InvalidSinkAccount¶
Invalid Sink Account
At least one of the sink accounts in invalid.
InvalidSourceAccount¶
Invalid Source Account
At least one of the source accounts is invalid.
InvalidUtxoAccumulatorOutput¶
Invalid UTXO Accumulator Output
The sender was constructed on an invalid version of the ledger state.
Marker¶
Marker Error, this error exists for PhantomData should never happen
PublicUpdateBelowMinimum¶
BelowMinimum from [FungibleLedgerError]
PublicUpdateCannotCreate¶
CannotCreate from [FungibleLedgerError]
PublicUpdateCannotWithdraw¶
CannotWithdraw from [FungibleLedgerError]
PublicUpdateInvalidAssetId¶
InvalidAssetId from [FungibleLedgerError]
PublicUpdateInvalidBurn¶
InvalidBurn from [FungibleLedgerError]
PublicUpdateInvalidMint¶
InvalidMint from [FungibleLedgerError]
PublicUpdateInvalidTransfer¶
InvalidTransfer from [FungibleLedgerError]
PublicUpdateOverflow¶
Overflow from [FungibleLedgerError]
PublicUpdateUnknownAsset¶
UnknownAsset from [FungibleLedgerError]
ReceiverLedgerChecksumError¶
Receiver Ledger Wrong Checksum Error
ReceiverLedgerFpDecodeError¶
Receiver Ledger Field Element Decoding Error
ReceiverLedgerFpEncodeError¶
Receiver Ledger Field Element Encoding Error
ReceiverLedgerFullNoteDecodeError¶
Receiver Ledger Full Incoming Note Decoding Error
ReceiverLedgerMTParametersDecodeError¶
Receiver Ledger Merkle Tree Parameters Decoding Error
ReceiverLedgerMerkleTreeCapacityError¶
Receiver Ledger Merkle Tree Out of Capacity Error
ReceiverLedgerPathDecodeError¶
Receiver Ledger Path Decoding Error
ReceiverLedgerUtxoAccumulatorItemHashDecodeError¶
Receiver Ledger Utxo Accumulator Item Hash Decoding Error
ReceiverLedgerUtxoDecodeFailed¶
Receiver Ledger Utxo decode failed
SenderLedgerFpEncodeError¶
Sender Ledger Fp Encoding failed.
SenderLedgerOutgoingNodeDecodeFailed¶
Sender Ledger [OutgoingNote] failed to decode
TransferLedgerChecksumError¶
Transfer Ledger Wrong Checksum Error
TransferLedgerFpEncodeError¶
Transer Ledger Field Element Encoding Error
TransferLedgerProofSystemFailed¶
Transfer Ledger Proof Error
TransferLedgerUnknownAsset¶
Transfer Ledger Unknown Asset
TransferLedgerVerifyingContextDecodeError¶
Transfer Ledger VerifyingContext cannont be decoded
UnrestrictedPublicAsset¶
UnrestrictedPublicAsset
The public asset of a receiver post utxo cannot be unrestricted, Otherwise it gives a potential attacker control over the nullifier value for no particular reason
ZeroTransfer¶
Zero Transfer
Transfers cannot include amounts equal to zero.