Are you an LLM? Read llms.txt for a summary of the docs, or llms-full.txt for the full context.
Skip to content

시스템 모듈 사용

Stable은 고정 주소의 사전 컴파일된 계약을 통해 프로토콜 수준 결제 로직을 노출합니다. 사전 컴파일을 통해 EVM 코드는 Stable SDK 모듈(스테이킹, 보상 분배, STABLE 토큰 작업)을 다시 구현하지 않고도 호출할 수 있습니다. 프로토콜 수준에서 실행되므로 동등한 Solidity 구현보다 훨씬 더 가스 효율적입니다.

이 가이드에서는 Solidity 및 ethers.js에서 사전 컴파일을 호출하는 방법과 일반 계약 대신 사전 컴파일을 사용해야 하는 경우를 보여줍니다.

노출되는 내용

모듈사전 컴파일 주소용도
Bank0x0000000000000000000000000000000000001003STABLE 토큰 전송 및 잔액 작업
Distribution0x0000000000000000000000000000000000000801스테이킹 보상 청구, 보상 쿼리, 수수료 관리
Staking0x0000000000000000000000000000000000000800위임, 위임 해제, 재위임, 검증자 쿼리
Gov0x0000000000000000000000000000000000000805제안, 집계 결과 및 온체인 투표 기록
Slashing0x0000000000000000000000000000000000000806검증자 서명 정보 및 가동 시간
StableSystem0x0000000000000000000000000000000000009999시스템 트랜잭션(언본딩 완료)을 위한 EVM 이벤트 방출

이들 모두는 모든 EVM 계약 또는 오프체인 클라이언트에서 호출할 수 있습니다. 주소는 메인넷과 테스트넷에서 안정적이며 동일합니다.

사전 컴파일과 일반 계약을 호출하는 경우

  • 작업이 Stable SDK 모듈(스테이킹, 보상 분배, STABLE 토큰 작업)에 매핑되는 경우 사전 컴파일을 사용합니다. 사전 컴파일을 호출하는 것이 더 저렴하고 프로토콜 수준 동작을 트리거하는 유일한 방법입니다.
  • 작업이 애플리케이션 로직(에스크로, 가격 책정, 액세스 제어)인 경우 일반 계약을 사용합니다. 사용자 지정 권한 부여 또는 유효성 검사가 필요한 경우 사전 컴파일 호출을 사용자 지정 계약에 래핑하십시오.

사전 컴파일은 애플리케이션 계약을 대체하는 것이 아닙니다. 기본 프로토콜에 대한 안정적인 인터페이스입니다.

Solidity에서 호출

필요한 메서드에 대한 인터페이스를 선언한 다음, 마치 배포된 계약처럼 사전 컴파일을 호출합니다.

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.24;
 
interface IStaking {
    function delegate(
        address delegatorAddress,
        string calldata validatorAddress,
        uint256 amount
    ) external returns (bool success);
 
    function delegation(
        address delegatorAddress,
        string calldata validatorAddress
    ) external view returns (uint256 shares, uint256 balance);
}
 
contract StakingHelper {
    address constant STAKING_PRECOMPILE =
        0x0000000000000000000000000000000000000800;
 
    /// @notice 이 계약에서 검증자에게 STABLE 토큰을 위임합니다.
    function delegateToValidator(
        string calldata validatorAddress,
        uint256 amount
    ) external returns (bool) {
        return IStaking(STAKING_PRECOMPILE).delegate(
            address(this),
            validatorAddress,
            amount
        );
    }
 
    /// @notice 이 계약의 검증자에 대한 현재 위임을 읽습니다.
    function myDelegation(string calldata validatorAddress)
        external
        view
        returns (uint256 shares, uint256 balance)
    {
        return IStaking(STAKING_PRECOMPILE).delegation(
            address(this),
            validatorAddress
        );
    }
}

Foundry 또는 Hardhat으로 컴파일 및 배포합니다. 사전 컴파일 주소는 상수 슬롯에서 계약에 번인되므로 배포 후 연결할 것이 없습니다.

// SAFE: 사전 컴파일 주소는 Stable에 고정되어 있으며 변경되지 않습니다.

ethers.js에서 호출

오프체인 클라이언트의 경우, 최소한의 ABI와 동일한 인터페이스를 선언하고 사전 컴파일 주소를 가리키는 계약을 인스턴스화합니다.

// queryDelegation.ts
import { ethers } from "ethers";
import "dotenv/config";
 
const provider = new ethers.JsonRpcProvider("https://rpc.testnet.stable.xyz");
 
const STAKING_PRECOMPILE = "0x0000000000000000000000000000000000000800";
 
const staking = new ethers.Contract(
  STAKING_PRECOMPILE,
  [
    "function delegation(address delegator, string validator) view returns (uint256 shares, uint256 balance)",
  ],
  provider
);
 
const delegator = "0xDelegatorAddress";
const validator = "stablevaloper1..."; // bech32 검증자 운영자 주소
 
const [shares, balance] = await staking.delegation(delegator, validator);
console.log("Delegation shares: ", shares.toString());
console.log("Delegation balance:", ethers.formatUnits(balance, 18), "STABLE");
npx tsx queryDelegation.ts
Delegation shares:  1000000000000000000000
Delegation balance: 1000.0 STABLE

시스템 트랜잭션 이벤트 구독

일부 Stable SDK 작업(예: 언본딩 완료)은 자연적으로 EVM 이벤트를 방출하지 않습니다. Stable은 다음 블록에서 표준 EVM 이벤트를 방출하기 위해 StableSystem 사전 컴파일을 호출하는 검증자 생성 트랜잭션인 시스템 트랜잭션으로 이러한 격차를 해소합니다.

UnbondingCompleted를 보려면 모든 ERC-20 Transfer 리스너처럼 사전 컴파일 주소에서 구독하십시오.

// watchUnbonding.ts
import { ethers } from "ethers";
 
const provider = new ethers.JsonRpcProvider("https://rpc.testnet.stable.xyz");
 
const STABLE_SYSTEM = "0x0000000000000000000000000000000000009999";
 
const stableSystem = new ethers.Contract(
  STABLE_SYSTEM,
  [
    "event UnbondingCompleted(address indexed delegator, address indexed validator, uint256 amount)",
  ],
  provider
);
 
stableSystem.on("UnbondingCompleted", (delegator, validator, amount, event) => {
  console.log("Unbonding completed for:", delegator);
  console.log("Amount:", ethers.formatEther(amount), "STABLE");
  console.log("Tx:", event.log.transactionHash);
});
 
console.log("Listening for UnbondingCompleted events...");
npx tsx watchUnbonding.ts
Listening for UnbondingCompleted events...
Unbonding completed for: 0xabcd...
Amount: 100.0 STABLE
Tx: 0x12ab...

전체 시스템 트랜잭션 메커니즘 및 사용자 필터링/기록 쿼리 패턴에 대한 자세한 내용은 언본딩 완료 추적을 참조하십시오.

모듈별 참조

각 사전 컴파일의 전체 메서드 목록, 이벤트 및 권한 부여 규칙은 해당 참조 페이지에 있습니다.

다음 권장 사항

  • 언본딩 완료 추적: StableSystem 사전 컴파일을 통해 방출된 UnbondingCompleted 이벤트를 구독합니다.
  • 시스템 모듈 참조: 모듈별 ABI, 메서드 시그니처 및 이벤트 스키마로 이동합니다.
  • 시스템 모듈 개념: Stable이 사전 컴파일을 통해 SDK 모듈을 노출하는 이유를 이해합니다.