Adding support for Beam Confidential Asset
TLDR;
- In version 6.0 Beam supports Confidential Assets
- Each asset has an
asset_id, 0 is for Beam and 1,2,3... for new Assets. - A complete list of existing assets is here
- To enable assets add the following line to the
wallet-apiconfig fileenable_assets=true - The following API calls have been updated to support assets:
wallet_statustx_sendtx_split
- New API methods have been added
tx_asset_issuetx_asset_consumetx_asset_infoget_asset_infocalc_change
Confidential Assets
Confidential Assets (CA) are tokens mint on the Beam blockchain. Beam supports Confidential Assets since hard fork 2, but this feature had limited ability to be used in real life applications. Starting from the version 6.0 Beam Wallet adds ability to create smart contracts which make CA more usable and very important feature in Beam infrastructure. We already have API to work with CA, but it was disabled by default. If you wish to accept and create transactions with CA you should enable this feature in the wallet API and update your codebase to handle CA correctly.
Enable CA support
- run new binary with
--enable_assets. With this flag your wallet starts to accept transactions with Confidential Assets./wallet-api --enable_assets -n <node address>
or specify it in config fileenable_assets=true - to retrieve info about assets use
wallet_statusmethod, it will return an array of the info about assets in the wallet, including BEAM-->{ "jsonrpc":"2.0", "id": 6, "method":"wallet_status" }<--{ "id": 1236, "jsonrpc": "2.0", "result": { "current_height": 112, "current_state_hash": "b9e8b868de60f28e553a1499a569f481991e4cff9fe2191d09d71a03c7708296", "difficulty": 378.36236572265625, "prev_state_hash": "3f84da0b0390deaca908603b6061867def987575a1af9311248ffb01503a0f02", "available": 303000000000, "receiving": 123, "sending": 0, "maturing": 8000000000, "locked": 30, "totals": [ { "asset_id": 0, "available": 303000000000, "available_str": "303000000000", "maturing": 8000000000, "maturing_str": "8000000000", "receiving": 123, "receiving_str": "123", "sending": 0, "sending_str": "0" }, { "asset_id": 1, // <--------------- this could be used to send/split CA or to retrieve extended info "available": 2000000000, "available_str": "2000000000", "maturing": 0, "maturing_str": "0", "receiving": 0, "receiving_str": "0", "sending": 0, "sending_str": "0" } ] } } - if you want to send or split CA you should specify
"asset_id"in parameters-->{ "jsonrpc":"2.0", "id": 2, "method":"tx_send", "params": { "value": 12342342, "fee": 2, "from": "472e17b0419055ffee3b3813b98ae671579b0ac0dcd6f1a23b11a75ab148cc67", "address": "472e17b0419055ffee3b3813b98ae671579b0ac0dcd6f1a23b11a75ab148cc67", "comment": "thank you!", "asset_id": 1 <------------------ NEW } } - if you want to get info about CA use
-->{ "jsonrpc":"2.0", "id": 2, "method": "tx_asset_info", "params": { "asset_id": 1 } }<--{ "jsonrpc":"2.0", "id": 2, "result": { "txId" : "10c4b760c842433cb58339a0fafef3db" } } - after this transaction become completed, you can read CA info from the local database
-->{ "jsonrpc":"2.0", "id": 6, "method": "get_asset_info", "params" : { "asset_id": 1 } }asset_idasset id to retrieve info about. Can be used for any asset even if you don't own it.
<--{ "id": 1236, "jsonrpc": "2.0", "result": { "asset_id": 1, "emission": 2000000000, "emission_str": "2000000000", "isOwned": 1, "lockHeight": 39, "metadata": "STD:N=NAME;SN=SNM;UN=UNIT;NTHUN=NTHUNIT", "ownerId": "0ae08a49e018e98177774294107dc033790b87538e54a20e99c6b98f1dbd39ce", "refreshHeight": 927 } }
Returns full asset info or error code.asset_idasset idmetadataasset metadataemission&emission_strtotal asset emission. Maximum asset emission is 2128-1. To ensure compatibility with JavaScript raw number returned only if it is less than or equal toNumber.MAX_SAFE_INTEGER(253-1). If asset emission is greater thanNumber.MAX_SAFE_INTEGERonly corresponding string representation is returned.isOwnedis 1 if you own this assetlockHeightlast block when asset emission turned to/from 0.refreshHeightblock at which asset information has been received. Please note, that all returned fields are valid only for this and previous blocks. In next blocks emission might change, asset become unregistered &c. Use tx_asset_info to retrieve the most recent info.
- For minting new asset coins use
tx_asset_issue. You must own the asset and info about the asset should be in a local database.tx_asset_infoto retrieve the latest asset info if necessary. Asset minting is free. You need to pay only regular transaction fee.-->{ "jsonrpc": "2.0", "id": 2, "method": "tx_asset_issue", "params": { "value": 6, "asset_id": 1 } }valuehow much asset to mint, in asset groth.feetransaction fee in BEAM groth. Omit to use default fee.asset_idasset id of the asset to mint.txIdoptional, provide your own transaction ID.
<--{ "jsonrpc": "2.0", "id": 2, "result": { "txId" : "10c4b760c842433cb58339a0fafef3db" } }
Returns transaction id or error code. - to burn existing asset coins use
tx_asset_consume. You must own the asset itself as well as asset coins to burn them. You cannot burn asset coins that belong to another wallet. Info about the asset should be in a local database.-->{ "jsonrpc":"2.0", "id": 2, "method":"tx_asset_consume", "params": { "value": 6, "asset_id": 1 } }valuehow much asset to burn, in asset groth.feetransaction fee in BEAM groth, omit for a default fee.asset_idid of the asset to consume.txIdoptional, provide your own transaction ID
<--{ "jsonrpc":"2.0", "id": 2, "result": { "txId" : "10c4b760c842433cb58339a0fafef3db" } }Returns transaction id or [error code](#Errors). - if yoiu want to calculate the change amount for transaction use
calc_change, it calculates the change value for givenamountin for givenasset_id-->{ "jsonrpc":"2.0", "id": 4, "method":"calc_change", "params": { "amount" : 1234, "asset_id": 2, "fee": 10000, "is_push_transaction": true } }<--{ "jsonrpc":"2.0", "id": 4, "result": { "asset_change": 12, "asset_change_str": "12", "change": 12, "change_str": "12", "explicit_fee": 1100000, "explicit_fee_str": "1100000" } }
whereamountis a requested amount we are going to sendasset_idasset id of the requested amountfeeexplicit fee in GROTHs chosen by the userasset_changechange amount for requestedasset_idchangechange in for BEAM.asset_changeandchangeare equal ifasset_id == 0, i.e. BEAMexplicit_feethe fee which should be usedis_push_transactiontrueif we are going to push transaction output into the shielded pool.