보장된 트랜잭션 전송
@stablechain/enterprise를 사용하여 예약된 엔터프라이즈 레인 블록스페이스를 통해 트랜잭션을 라우팅합니다. guaranteedBlock 모듈은 GuaranteedTx(유형 0x3F CustomTx)를 Enterprise RPC 게이트웨이를 통해 릴레이하여 엔터프라이즈 워크로드용으로 예약된 용량에 도착하도록 합니다. 가스 면제와 달리 서명자는 자체 가스를 지불하므로 자금이 있어야 합니다.
이를 가스 면제와 결합하여 보장된 릴레이 트랜잭션을 얻을 수 있습니다. 즉, 가스 면제 트랜잭션이 여전히 엔터프라이즈 레인에 도착합니다.
전제 조건
- Node.js 20 이상,
@stablechain/enterprise및viem이 설치되어 있어야 합니다. Enterprise SDK 참조를 참조하십시오. - Enterprise RPC 게이트웨이 API 키. Enterprise SDK는 Stable Mainnet 및 Stable Testnet에서 실행되며 액세스가 제한됩니다. 게이트웨이 엔드포인트를 얻으려면 Stable에 문의하십시오.
- GuaranteedTx는 자체 가스를 지불하므로 자금이 있는 서명자가 필요합니다.
1. 보장된 블록스페이스 모듈로 클라이언트 생성
guaranteedBlock 및 enterpriseRpcEndpoints를 createStableEnterprise에 전달합니다. 게이트웨이는 0x3F GuaranteedTx를 허용하는 유일한 엔드포인트이며, API 키를 보유합니다. 잘못된 laneId는 즉시 거부됩니다.
import { createStableEnterprise, stable } from "@stablechain/enterprise";
import { privateKeyToAccount } from "viem/accounts";
const enterprise = createStableEnterprise({
chain: stable,
enterpriseRpcEndpoints: [process.env.ENTERPRISE_RPC_URL], // Stable에서 제공하는 게이트웨이 URL
guaranteedBlock: {
account: privateKeyToAccount(process.env.SIGNER_PRIVATE_KEY as `0x${string}`), // 자금이 있어야 함
laneId: 0n, // 엔터프라이즈 레인
},
});
const gb = enterprise.guaranteedBlock;StableEnterpriseClient { gasWaiver: undefined, guaranteedBlock, guaranteedWaiver: undefined }2. 단일 트랜잭션 전송
서명자와 다양한 필드를 사용하여 send를 호출합니다. 서명자가 가스를 지불하므로 1559 수수료 필드가 필요합니다. chainId, Enterprise nonceKey, 그리고 2D 논스(게이트웨이에서 발견)는 자동으로 처리됩니다.
import { createPublicClient, http } from "viem";
const publicClient = createPublicClient({ chain: stable, transport: http() });
const gasPrice = await publicClient.getGasPrice();
const { txHash } = await gb.send(signer, {
to: recipient,
gas: 21_000n,
gasFeeCap: gasPrice * 2n,
gasTipCap: gasPrice,
});
console.log("Guaranteed tx:", txHash);Guaranteed tx: 0xabcd...7890gasFeeCap은 가스당 최대 총 수수료(EIP-1559 maxFeePerGas)이고 gasTipCap은 가스당 최대 우선 순위 수수료(maxPriorityFeePerGas)입니다. 위와 같이 gasTipCap을 현재 가스 가격으로 설정하고 gasFeeCap을 두 배로 설정하는 것이 안전한 기본값입니다.
서명자가 가스를 지불하므로 릴레이하기 전에 잔액이 있는지 확인하십시오. 잔액이 0인 계정에서 보증된 트랜잭션은 실패합니다.
3. 배치 전송
sendBatch를 호출하여 여러 트랜잭션을 보냅니다. 논스는 발견된 기반에서 자동 순서 지정되며, 입력 순서대로 입력당 하나의 결과를 얻습니다. 실패는 후속 항목을 좌초시킵니다.
const results = await gb.sendBatch(signer, [
{ to: a, gas: 21_000n, gasFeeCap: gasPrice * 2n, gasTipCap: gasPrice },
{ to: b, gas: 21_000n, gasFeeCap: gasPrice * 2n, gasTipCap: gasPrice },
]);
for (const r of results) {
console.log(r.success ? `[${r.index}] ✔ ${r.txHash}` : `[${r.index}] ✖ ${r.error?.code}`);
}[0] ✔ 0xabcd...7890
[1] ✔ 0x1f2e...66a14. 사전 서명된 트랜잭션 전송
비수탁 흐름의 경우, buildGuaranteedTx를 사용하여 다른 곳에서 GuaranteedTx를 빌드하고 서명한 다음, 서명된 헥스만 운영자에게 전달합니다. Enterprise 논스 키는 nonceKeyForLane에서 가져옵니다.
import { buildGuaranteedTx, nonceKeyForLane, toSigner } from "@stablechain/enterprise";
const signed = await buildGuaranteedTx(toSigner(signer), stable.id, {
to: recipient,
gas: 21_000n,
gasFeeCap,
gasTipCap,
nonce, // 계정의 현재 2D-레인 논스
nonceKey: nonceKeyForLane(0n), // 엔터프라이즈 레인 0
});
const { txHash } = await gb.relay(signed);
console.log("Guaranteed tx:", txHash);Guaranteed tx: 0xabcd...7890여러 사전 서명된 트랜잭션의 경우 relayBatch를 사용합니다.
가스 면제와 결합
사용자의 가스를 면제하고 엔터프라이즈 레인에 도달하려면 guaranteedWaiver 모듈로 두 레일을 모두 구성하십시오. 사용자는 잔액이나 수수료 필드가 필요 없으며, 트랜잭션은 동일한 게이트웨이를 통해 라우팅됩니다. 보장된 릴레이 트랜잭션을 참조하십시오.
거부 처리
send 및 relay는 거부 시 StableEnterpriseRelayError를 발생시킵니다. 게이트웨이별 코드에는 GATEWAY_UNAUTHORIZED(누락되었거나 유효하지 않은 API 키) 및 QUOTA_EXCEEDED(게이트웨이 가스 할당량 초과)가 포함됩니다.
import { StableEnterpriseRelayError } from "@stablechain/enterprise";
try {
await gb.send(signer, { to: recipient, gas: 21_000n, gasFeeCap, gasTipCap });
} catch (err) {
if (err instanceof StableEnterpriseRelayError && err.code === "GATEWAY_UNAUTHORIZED") {
// Enterprise RPC 게이트웨이가 API 키를 거부했습니다.
}
throw err;
}StableEnterpriseRelayError: relay failed [GATEWAY_UNAUTHORIZED]: invalid api key다음 단계
- 보장된 릴레이 트랜잭션: 한 번의 호출로 사용자의 가스를 면제하고 엔터프라이즈 레인에 도달합니다.
- 가스 면제로 릴레이: 사용자의 가스를 후원하여 USDT0를 보유하지 않고도 트랜잭션을 처리합니다.
- Enterprise SDK 참조: 모든 메서드, 구성 옵션 및 오류 클래스에 대한 전체 설명입니다.

