본문으로 건너뛰기

Module sui::accumulator_settlement

use std::ascii;
use std::bcs;
use std::option;
use std::string;
use std::vector;
use sui::accumulator;
use sui::accumulator_metadata;
use sui::address;
use sui::bag;
use sui::dynamic_field;
use sui::hex;
use sui::object;
use sui::party;
use sui::transfer;
use sui::tx_context;
use sui::vec_map;

Constants

const ENotSystemAddress: u64 = 0;
const EInvalidSplitAmount: u64 = 1;

Function settlement_prologue

settlement transaction이 고유한 digest를 갖도록 보장하기 위해 settlement transaction에서 호출된다.

fun settlement_prologue(_epoch: u64, _checkpoint_height: u64, _idx: u64, input_sui: u64, output_sui: u64, ctx: &sui::tx_context::TxContext)
Click to open
Implementation
fun settlement_prologue(
    _epoch: u64,
    _checkpoint_height: u64,
    _idx: u64,
    // 사용자 transaction에서 수신한 총 입력 sui
    input_sui: u64,
    // 사용자 transaction에서 인출한 총 출력 sui
    output_sui: u64,
    ctx: &TxContext,
) {
    assert!(ctx.sender() == @0x0, ENotSystemAddress);
    record_settlement_sui_conservation(input_sui, output_sui);
}

Function settle_u128

fun settle_u128<T>(accumulator_root: &mut sui::accumulator::AccumulatorRoot, owner: address, merge: u128, split: u128, ctx: &mut sui::tx_context::TxContext)
Click to open
Implementation
fun settle_u128<T>(
    accumulator_root: &mut AccumulatorRoot,
    owner: address,
    merge: u128,
    split: u128,
    ctx: &mut TxContext,
) {
    assert!(ctx.sender() == @0x0, ENotSystemAddress);
    // 이 함수를 호출하기 전에 merge와 split은 상계되어 있어야 한다.
    assert!((merge == 0 ) != (split == 0), EInvalidSplitAmount);
    let name = accumulator_key<T>(owner);
    if (accumulator_root.has_accumulator<T, U128>(name)) {
        let is_zero = {
            let value: &mut U128 = accumulator_root.borrow_accumulator_mut(name);
            value.update(merge, split);
            value.is_zero()
        };
        if (is_zero) {
            let value = accumulator_root.remove_accumulator<T, U128>(name);
            destroy_u128(value);
            accumulator_root.remove_metadata<T>(owner);
        }
    } else {
        // 필드가 아직 존재하지 않으면 split할 수 없다.
        assert!(split == 0, EInvalidSplitAmount);
        let value = create_u128(merge);
        accumulator_root.add_accumulator(name, value);
        accumulator_root.create_metadata<T>(owner, ctx);
    };
}

Function record_settlement_sui_conservation

SUI 보존을 추적하기 위해 settlement transaction에서 호출된다.

fun record_settlement_sui_conservation(input_sui: u64, output_sui: u64)
Click to open
Implementation
native fun record_settlement_sui_conservation(input_sui: u64, output_sui: u64);