Skip to content

Commit

Permalink
feat: listing
Browse files Browse the repository at this point in the history
  • Loading branch information
X committed Nov 25, 2023
1 parent dd7a805 commit 4a44b8a
Show file tree
Hide file tree
Showing 13 changed files with 961 additions and 38 deletions.
141 changes: 139 additions & 2 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 4 additions & 0 deletions src/backend/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,12 @@ crate-type = ["cdylib"]
[dependencies]
base64 = "0.21.5"
candid = { version = "0.9.11", features = ["parser"] }
crc32fast = "1.3.2"
data-encoding = "2.5.0"
hex = "0.4.3"
ic-cdk = "0.11.3"
ic-cdk-macros = "0.8.1"
ic-cdk-timers = "0.5.1"
ic-certified-map = "0.4.0"
ic-ledger-types = "0.8.0"
serde = { version = "1.0.192", features = ["derive"] }
Expand Down
82 changes: 82 additions & 0 deletions src/backend/icp.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
use candid::Principal;
use ic_cdk::api::id;
use ic_ledger_types::{
AccountBalanceArgs, AccountIdentifier, BlockIndex, Memo, Subaccount, Tokens, TransferArgs,
TransferResult, DEFAULT_FEE, DEFAULT_SUBACCOUNT, MAINNET_LEDGER_CANISTER_ID,
};

use crate::read;

pub fn revenue_account() -> AccountIdentifier {
AccountIdentifier::new(
&read(|state| state.revenue_account).expect("no revenue subaccount set"),
&DEFAULT_SUBACCOUNT,
)
}
pub fn user_account(principal: Principal) -> AccountIdentifier {
AccountIdentifier::new(&id(), &principal_to_subaccount(&principal))
}

pub fn main_account() -> AccountIdentifier {
AccountIdentifier::new(&id(), &DEFAULT_SUBACCOUNT)
}

pub async fn transfer(
to: AccountIdentifier,
amount: Tokens,
memo: Memo,
sub_account: Option<Subaccount>,
) -> Result<BlockIndex, String> {
if amount < DEFAULT_FEE {
return Err("can't transfer amounts smaller than the fee".into());
}
let (result,): (TransferResult,) = ic_cdk::call(
MAINNET_LEDGER_CANISTER_ID,
"transfer",
(TransferArgs {
created_at_time: None,
memo,
amount: amount - DEFAULT_FEE,
fee: DEFAULT_FEE,
to,
from_subaccount: sub_account,
},),
)
.await
.map_err(|err| format!("call to ledger failed: {:?}", err))?;
result.map_err(|err| {
format!(
"transfer of `{}` ICP from `{}` failed: {:?}",
amount,
AccountIdentifier::new(&id(), &sub_account.unwrap_or(DEFAULT_SUBACCOUNT)),
err
)
})
}

pub async fn account_balance_of_principal(principal: Principal) -> Tokens {
account_balance(AccountIdentifier::new(
&id(),
&principal_to_subaccount(&principal),
))
.await
}

async fn account_balance(account: AccountIdentifier) -> Tokens {
let (balance,): (Tokens,) = ic_cdk::call(
MAINNET_LEDGER_CANISTER_ID,
"account_balance",
(AccountBalanceArgs { account },),
)
.await
.expect("couldn't check balance");
balance
}

pub fn principal_to_subaccount(principal_id: &Principal) -> Subaccount {
let mut subaccount = [0; std::mem::size_of::<Subaccount>()];
let principal_id = principal_id.as_slice();
subaccount[0] = principal_id.len() as u8;
subaccount[1..1 + principal_id.len()].copy_from_slice(principal_id);
Subaccount(subaccount)
}
Loading

0 comments on commit 4a44b8a

Please sign in to comment.