cln: adds new RPC method to issue assets

This commit introduce a new RPC method for issuing new
assets.

Signed-off-by: Vincenzo Palazzo <vincenzopalazzodev@gmail.com>
This commit is contained in:
Vincenzo Palazzo 2024-03-18 20:25:59 +01:00
parent 6809025d3b
commit 2d71bebf67
5 changed files with 65 additions and 10 deletions

View File

@ -79,6 +79,7 @@ pub fn build_plugin() -> anyhow::Result<Plugin<State>> {
methods: [ methods: [
rgb_balance, rgb_balance,
rgb_fundchannel, rgb_fundchannel,
rgb_issue_asset,
], ],
hooks: [], hooks: [],
}; };
@ -99,6 +100,11 @@ fn rgb_fundchannel(plugin: &mut Plugin<State>, request: Value) -> Result<Value,
walletrpc::fund_rgb_channel(plugin, request) walletrpc::fund_rgb_channel(plugin, request)
} }
#[rpc_method(rpc_name = "issueasset", description = "Issue a new RGB asset")]
fn rgb_issue_asset(plugin: &mut Plugin<State>, request: Value) -> Result<Value, PluginError> {
walletrpc::rgb_issue_new_assert(plugin, request)
}
fn read_secret(file: fs::File, network: &str) -> anyhow::Result<ExtendedPrivKey> { fn read_secret(file: fs::File, network: &str) -> anyhow::Result<ExtendedPrivKey> {
let buffer = io::BufReader::new(file); let buffer = io::BufReader::new(file);
let network = vlsbtc::Network::from_str(network)?; let network = vlsbtc::Network::from_str(network)?;

View File

@ -164,3 +164,29 @@ pub fn fund_rgb_channel(plugin: &mut Plugin<State>, request: Value) -> Result<Va
"rgb_info": info, "rgb_info": info,
})) }))
} }
#[derive(Deserialize, Debug)]
pub struct NewAssetRequest {
amounts: Vec<u64>,
ticker: String,
name: String,
precision: u8,
}
pub fn rgb_issue_new_assert(
plugin: &mut Plugin<State>,
request: Value,
) -> Result<Value, PluginError> {
log::info!("calling rgb issue asset with request body: `{request}`");
let request: NewAssetRequest = json::from_value(request)?;
let rgb = plugin.state.manager();
let assert = rgb
.issue_asset_nia(
request.ticker,
request.name,
request.precision,
request.amounts,
)
.map_err(|err| error!("{err}"))?;
Ok(json::to_value(assert)?)
}

View File

@ -108,7 +108,7 @@ impl Wallet {
}; };
let assert = self.wallet.lock().unwrap().issue_asset_nia( let assert = self.wallet.lock().unwrap().issue_asset_nia(
online.clone(), online.clone(),
ticker, ticker,
name, name,
precision, precision,
amounts, amounts,

View File

@ -4,6 +4,7 @@ use std::sync::Arc;
use bitcoin::bip32::ExtendedPrivKey; use bitcoin::bip32::ExtendedPrivKey;
use bitcoin::Network; use bitcoin::Network;
use rgb_lib::wallet::AssetNIA;
use rgb_lib::wallet::Balance; use rgb_lib::wallet::Balance;
use rgb_lib::wallet::Recipient; use rgb_lib::wallet::Recipient;
use rgb_lib::wallet::RecipientData; use rgb_lib::wallet::RecipientData;
@ -61,6 +62,18 @@ impl RGBManager {
self.consignment_proxy.clone() self.consignment_proxy.clone()
} }
#[cfg(debug_assertions)]
pub fn issue_asset_nia(
&self,
ticker: String,
name: String,
precision: u8,
amounts: Vec<u64>,
) -> anyhow::Result<AssetNIA> {
self.wallet
.issue_asset_nia(ticker, name, precision, amounts)
}
pub fn assert_balance(&self, asset_id: String) -> anyhow::Result<Balance> { pub fn assert_balance(&self, asset_id: String) -> anyhow::Result<Balance> {
let balance = self let balance = self
.wallet .wallet

View File

@ -93,6 +93,21 @@ macro_rules! wait_sync {
}}; }};
} }
pub fn make_new_asset_id(node: &cln::Node, ticker: String, name: String) -> anyhow::Result<String> {
let asset: serde_json::Value = node.rpc().call(
"issueasset",
json!({
"name": name,
"ticker": ticker,
"amounts": [10000],
"precision": 0,
}),
)?;
log::info!("new asset generated is `{asset}`");
let asset_id = asset.get("asset_id").unwrap();
Ok(asset_id.to_string())
}
/// Open a channel from node_a -> node_b /// Open a channel from node_a -> node_b
pub fn open_rgb_channel( pub fn open_rgb_channel(
node_a: &cln::Node, node_a: &cln::Node,
@ -105,23 +120,18 @@ pub fn open_rgb_channel(
wait_sync!(node_a); wait_sync!(node_a);
if dual_open {
let addr = node_b.rpc().newaddr(None)?.address.unwrap();
fund_wallet(node_b.btc(), &addr, 6)?;
}
let getinfo2 = node_b.rpc().getinfo()?; let getinfo2 = node_b.rpc().getinfo()?;
node_a node_a
.rpc() .rpc()
.connect(&getinfo2.id, Some(&format!("127.0.0.1:{}", node_b.port)))?; .connect(&getinfo2.id, Some(&format!("127.0.0.1:{}", node_b.port)))?;
let listfunds = node_a.rpc().listfunds()?; // TODO generate a new channel
log::debug!("list funds {:?}", listfunds); let asset_id = make_new_asset_id(node_a, "USTD".to_string(), "Tether".to_string())?;
node_a.rpc().call( node_a.rpc().call(
"fundrgbchannel", "fundrgbchannel",
serde_json::json!({ serde_json::json!({
"peer_id": getinfo2.id, "peer_id": getinfo2.id,
"amount_msat": "all", "amount_msat": "all",
"asset_id": "Tether/USTD", "asset_id": asset_id,
}), }),
)?; )?;
wait!( wait!(