diff --git a/src/lib/components/button/copy.svelte b/src/lib/components/button/copy.svelte index baf88f23..2ea17b5a 100644 --- a/src/lib/components/button/copy.svelte +++ b/src/lib/components/button/copy.svelte @@ -22,7 +22,7 @@ async function copyToClipboard() { try { await navigator.clipboard.writeText(props.data); - if (context.settings.data.debugMode) console.log(props.data, 'copied to clipboard'); + if (context.settings.data.debugMode) console.info(props.data, 'copied to clipboard'); hint = true; setTimeout(() => (hint = false), 300); } catch (err) { diff --git a/src/lib/state/client/account.svelte.ts b/src/lib/state/client/account.svelte.ts index 6f5609d0..3b7782fe 100644 --- a/src/lib/state/client/account.svelte.ts +++ b/src/lib/state/client/account.svelte.ts @@ -23,7 +23,11 @@ import type { } from '$lib/types/account'; import { calculateValue, isSameToken } from '$lib/utils'; -import { defaultAccountDataSources, defaultVoteInfo } from '$lib/state/defaults/account'; +import { + defaultAccountDataSources, + defaultVoteInfo, + nullContractHash +} from '$lib/state/defaults/account'; import * as SystemContract from '$lib/wharf/contracts/system'; export class AccountState { @@ -35,9 +39,7 @@ export class AccountState { public name: Name = $state(Name.from('')); public last_update: Date = $state(new Date()); - public contract: boolean = $derived( - Number(new Date(`${this.sources?.get_account?.last_code_update}z`)) > 0 - ); + public contract: boolean = $derived(!this.sources.contract_hash.equals(nullContractHash)); public loaded: boolean = $state(false); public balance = $derived.by(() => @@ -105,6 +107,7 @@ export class AccountState { this.last_update = new Date(); this.sources = { get_account: data.get_account, + contract_hash: Checksum256.from(data.contract_hash), balance: data.balance, giftedram: data.giftedram, light_api: data.light_api, diff --git a/src/lib/state/defaults/account.ts b/src/lib/state/defaults/account.ts index d0a845cd..e9546195 100644 --- a/src/lib/state/defaults/account.ts +++ b/src/lib/state/defaults/account.ts @@ -1,4 +1,4 @@ -import { API, Asset, Float64, Int64, Name } from '@wharfkit/antelope'; +import { API, Asset, Checksum256, Float64, Int64, Name } from '@wharfkit/antelope'; import { gifted_ram, type AccountDataSources, type VoterInfo } from '$lib/types/account'; @@ -75,8 +75,13 @@ export const defaultRexFund = SystemContract.Types.rex_fund.from({ balance: '0 ' }); +export const nullContractHash = Checksum256.from( + '0000000000000000000000000000000000000000000000000000000000000000' +); + export const defaultAccountDataSources: AccountDataSources = { get_account: defaultGetAccount, + contract_hash: nullContractHash, balance: defaultAsset, light_api: [], delegated: [], diff --git a/src/lib/state/defaults/network.ts b/src/lib/state/defaults/network.ts index cb53f945..8b782eda 100644 --- a/src/lib/state/defaults/network.ts +++ b/src/lib/state/defaults/network.ts @@ -1,6 +1,6 @@ import { API, Asset } from '@wharfkit/antelope'; -import { gifted_ram, type AccountDataSources } from '$lib/types/account'; +import { gifted_ram } from '$lib/types/account'; import * as SystemContract from '$lib/wharf/contracts/system'; @@ -75,17 +75,5 @@ export const defaultRexFund = SystemContract.Types.rex_fund.from({ balance: '0 ' }); -export const defaultAccountDataSources: AccountDataSources = { - get_account: defaultGetAccount, - balance: defaultAsset, - light_api: [], - delegated: [], - giftedram: defaultGiftedRam, - proposals: [], - refund_request: defaultRefundRequest, - rexbal: defaultRexBalance, - rexfund: defaultRexFund -}; - export const defaultPriceSymbol = Asset.Symbol.from('4,USD'); export const defaultPrice = Asset.fromUnits(0, defaultPriceSymbol); diff --git a/src/lib/types/account.ts b/src/lib/types/account.ts index e13b9f98..abe70b4a 100644 --- a/src/lib/types/account.ts +++ b/src/lib/types/account.ts @@ -1,4 +1,13 @@ -import { Struct, API, Int64, Name, Asset, Float64 } from '@wharfkit/antelope'; +import { + Struct, + API, + Int64, + Name, + Asset, + Float64, + type Checksum256Type, + Checksum256 +} from '@wharfkit/antelope'; import { Types as MsigTypes } from '$lib/wharf/contracts/msig'; import { Types as SystemTypes } from '$lib/wharf/contracts/system'; @@ -29,6 +38,8 @@ export interface VoterInfo { export interface AccountDataSources { // Native get_account endpoint (deprecated?) get_account: API.v1.AccountObject; + // Hash of the contract on the account + contract_hash: Checksum256; // Light API balances call light_api: LightAPIBalanceRow[]; // Table rows from eosio.token::accounts diff --git a/src/routes/[network]/api/account/[name]/+server.ts b/src/routes/[network]/api/account/[name]/+server.ts index 8bac3634..7491fd9d 100644 --- a/src/routes/[network]/api/account/[name]/+server.ts +++ b/src/routes/[network]/api/account/[name]/+server.ts @@ -9,6 +9,7 @@ import type { LightAPIBalanceResponse, LightAPIBalanceRow } from '$lib/types/lig import type { RequestEvent, RequestHandler } from './$types'; import { Types as SystemTypes } from '$lib/wharf/contracts/system'; +import { nullContractHash } from '$lib/state/defaults/account'; export const GET: RequestHandler = async ({ locals: { network }, params }: RequestEvent) => { const headers = getCacheHeaders(5); @@ -58,10 +59,11 @@ async function loadBalances( async function getAccount(network: NetworkState, account: NameType): Promise { const { system: systemContract, msig: msigContract } = network.contracts; - const [get_account, delegated, proposals] = await Promise.all([ + const [get_account, delegated, proposals, hash] = await Promise.all([ network.client.v1.chain.get_account(account), systemContract.table('delband').all({ scope: account }), - msigContract.table('proposal', account).all() + msigContract.table('proposal', account).all(), + systemContract.table('abihash').get(account) ]); let rex; @@ -108,8 +110,11 @@ async function getAccount(network: NetworkState, account: NameType): Promise