Skip to content

Commit

Permalink
Fixed filtering balances
Browse files Browse the repository at this point in the history
  • Loading branch information
aaroncox committed Jan 28, 2025
1 parent c0283a4 commit ee4ed6d
Show file tree
Hide file tree
Showing 3 changed files with 48 additions and 16 deletions.
9 changes: 7 additions & 2 deletions contracts/api/include/api/api.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -64,16 +64,21 @@ class [[eosio::contract("api")]] api : public contract
[[eosio::action, eosio::read_only]] get_account_response getaccount(const name account);
using getaccount_action = action_wrapper<"getaccount"_n, &api::getaccount>;

[[eosio::action, eosio::read_only]] std::vector<asset> getbalances(const name account);
[[eosio::action, eosio::read_only]] std::vector<asset> getbalances(const name account,
const std::vector<token_definition> tokens);
using getbalances_action = action_wrapper<"getbalances"_n, &api::getbalances>;

[[eosio::action, eosio::read_only]] std::vector<token_definition> gettokens();
using gettokens_action = action_wrapper<"gettokens"_n, &api::gettokens>;

#ifdef DEBUG
[[eosio::action]] void wipe();
[[eosio::action]] void reset();
#endif

private:
void add_token(const token_definition token);
void add_token(const token_definition token);
std::vector<token_definition> get_token_definitions();

#ifdef DEBUG
template <typename T>
Expand Down
33 changes: 25 additions & 8 deletions contracts/api/src/api.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -68,21 +68,38 @@ namespace api {
.rexfund = rexfund};
}

[[eosio::action, eosio::read_only]] std::vector<asset> api::getbalances(const name account)
std::vector<token_definition> api::get_token_definitions()
{
std::vector<token_definition> result;
token_table _tokens(get_self(), get_self().value);
auto token_itr = _tokens.begin();
while (token_itr != _tokens.end()) {
result.push_back({.contract = token_itr->contract, .symbol = token_itr->symbol});
token_itr++;
}
return result;
}

[[eosio::action, eosio::read_only]] std::vector<token_definition> api::gettokens() { return get_token_definitions(); }

[[eosio::action, eosio::read_only]] std::vector<asset> api::getbalances(const name account,
const std::vector<token_definition> tokens)
{
token_table _tokens(get_self(), get_self().value);
auto token_itr = _tokens.begin();
std::vector<asset> balances;

while (token_itr != _tokens.end()) {
eosio::token::accounts _accounts(token_itr->contract, account.value);
auto balance_itr = _accounts.find(token_itr->symbol.code().raw());
std::vector<token_definition> token_definitions = tokens;
if (token_definitions.size() == 0) {
token_definitions = get_token_definitions();
}

for (const auto& token : token_definitions) {
eosio::token::accounts _accounts(token.contract, account.value);
auto balance_itr = _accounts.find(token.symbol.code().raw());
if (balance_itr != _accounts.end()) {
balances.push_back(balance_itr->balance);
} else {
balances.push_back(asset(0, token_itr->symbol));
balances.push_back(asset(0, token.symbol));
}
token_itr++;
}

return balances;
Expand Down
22 changes: 16 additions & 6 deletions test/api/api.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,12 @@ describe(apiContract, () => {
describe('action::addtoken', () => {
describe('success', () => {
test('add tokens', async () => {
await contracts.api.actions.addtoken(['eosio.token', '4,EOS']).send()
await contracts.api.actions.addtoken(['scrap', '0,SCRAP']).send()
await contracts.api.actions
.addtoken([{contract: 'eosio.token', symbol: '4,EOS'}])
.send()
await contracts.api.actions
.addtoken([{contract: 'scrap', symbol: '0,SCRAP'}])
.send()

const rows = await contracts.api.tables.tokens().getTableRows()
expect(rows).toHaveLength(2)
Expand All @@ -23,7 +27,7 @@ describe(apiContract, () => {
describe('error', () => {
test('require contract auth', async () => {
const action = contracts.api.actions
.addtoken(['eosio.token', '4,EOS'])
.addtoken([{contract: 'eosio.token', symbol: '4,EOS'}])
.send('alice')
expect(action).rejects.toThrow('missing required authority api')
})
Expand All @@ -33,8 +37,12 @@ describe(apiContract, () => {
describe('action::removetoken', () => {
describe('success', () => {
test('remove tokens', async () => {
await contracts.api.actions.addtoken(['eosio.token', '4,EOS']).send()
await contracts.api.actions.addtoken(['scrap', '0,SCRAP']).send()
await contracts.api.actions
.addtoken([{contract: 'eosio.token', symbol: '4,EOS'}])
.send()
await contracts.api.actions
.addtoken([{contract: 'scrap', symbol: '0,SCRAP'}])
.send()

const rows = await contracts.api.tables.tokens().getTableRows()
expect(rows).toHaveLength(2)
Expand All @@ -55,7 +63,9 @@ describe(apiContract, () => {
})
describe('error', () => {
test('require contract auth', async () => {
await contracts.api.actions.addtoken(['eosio.token', '4,EOS']).send()
await contracts.api.actions
.addtoken([{contract: 'eosio.token', symbol: '4,EOS'}])
.send()
const action = contracts.api.actions.removetoken([0]).send('alice')
expect(action).rejects.toThrow('missing required authority api')
})
Expand Down

0 comments on commit ee4ed6d

Please sign in to comment.