如何从NEAR交易中获取正确的存款、质押及提取金额?
NEAR交易金额读取与账户余额认定指南
一、无需解析日志的金额读取方式
合约视图方法调用
直接调用对应合约的内置视图接口获取准确数据,完全无需依赖日志:- Lockup合约:通过
near view <lockup_account_id> get_account_staked_balance '{"account_id": "<your_account>"}'查询质押金额;用get_locked_balance查看剩余锁定资金。 - 质押池合约:通过
near view <staking_pool_id> get_staked_balance '{"account_id": "<your_account>"}'获取账户在池内的质押额度;用get_available_withdraw_balance查询可提取金额。
- Lockup合约:通过
解析交易的
balance_changes字段
每笔交易的执行结果(Execution Outcome)都会包含balance_changes数组,记录所有涉及账户的余额变动(包括用户账户、合约账户)。不管交易的deposit是否为0,这里的数值是链上直接计算的资金流动额:- 质押场景:目标质押池账户的余额增加量,就是实际质押金额。
- 提取场景:用户主账户的余额增加量,就是实际到账的提取金额。
RPC状态查询
通过NEAR RPC的query方法直接拉取账户完整状态:near view <your_account> get_account_details返回结果会包含
locked、staked、available等细分余额字段,一站式获取所有权益数据。
二、不同场景下的金额与余额认定
场景1:调用Lockup合约的deposit_and_stake(交易deposit=0)
- 质押金额认定:此时是用Lockup合约中已锁定的资金质押,优先通过Lockup合约的
get_staked_balance查询账户在合约内的质押总额,或查看交易balance_changes中Lockup合约向质押池转移的资金量。日志数值仅作参考,以链上状态和balance_changes为准。 - 账户余额变化:用户主账户可用余额不变,Lockup合约内的锁定余额减少、质押余额增加,账户总权益(可用+锁定+质押)保持不变。
场景2:直接向质押池调用deposit_and_stake(deposit与日志金额有细微差异)
- 存款/质押金额认定:差异通常来自交易gas费(NEAR的gas从用户主账户单独扣除,不占用
deposit额度)或合约精度处理。准确金额以balance_changes中质押池账户的余额增加量为准,也可通过质押池的get_staked_balance查询最终质押额度。交易deposit是发起时转入质押池的金额,日志是合约格式化后的显示,都不如链上直接的余额变动准确。 - 账户余额变化:用户主账户可用余额减少(
deposit+ gas费),质押池内的用户质押余额增加(实际质押额),总权益扣除gas费部分。
场景3:调用withdraw_all(交易deposit=0)
- 提取金额认定:查看交易
balance_changes中质押池/Lockup合约向用户主账户转移的资金量,或对比交易前后用户主账户的可用余额差值。也可通过合约的get_withdrawn_amount接口查询已提取的总金额。 - 账户余额变化:用户主账户可用余额增加(实际提取额),质押池/Lockup合约内的用户质押余额清零,总权益扣除可能存在的提取手续费(若合约收取)。
三、账户总权益的正确计算
账户总权益 = 可用余额 + Lockup合约锁定余额 + 质押池质押余额
- 可用余额:直接查询账户的
account_balance - 锁定余额:调用Lockup合约的
get_locked_balance - 质押余额:调用对应质押池的
get_staked_balance
所有数据以NEAR链上状态为准,不要仅依赖交易的deposit字段或合约日志——deposit只是交易发起时的转账额度,日志是合约自定义的输出,都可能无法反映真实的资金变动。
内容的提问来源于stack exchange,提问作者Swornatoya
相关产品推荐
相关产品推荐

