저는 지난 2년간 글로벌 AI API 게이트웨이 생태계를 비교 분석하면서, 결제 프로토콜의 다양성과 비용 효율성 사이에서 많은 개발팀들이 갈등하는 모습을 지켜봐 왔습니다. 이번 튜토리얼에서는 x402AP2 Agent 결제 프로토콜을 기존의 공식 API에서 HolySheep AI로 마이그레이션하는 전 과정을 상세히 다룹니다. USDC 기반 마이크로페이먼드를 활용한 실제 구현 코드부터, 마이그레이션 리스크 관리, 그리고 롤백 전략까지 완벽 가이드를 제공합니다.

x402과 AP2 Agent 결제 프로토콜이란

x402은 HTTP 헤더 기반의 결제 인증 프로토콜로, 요청 헤더에 서명된 결제 증명을 포함하여 API 호출의 정당성을 검증합니다. AP2 Agent는 자율 AI 에이전트를 위한 결제 레이어로, 에이전트가 직접 토큰을 전송하고 결제를 완료하는 마이크로페이먼드 모델을 지원합니다. 두 프로토콜 모두 스마트 컨트랙트와 블록체인 기반 결제를 기존 REST API와 seamlessly 통합할 수 있다는 것이 핵심 강점입니다.

왜 HolySheep AI로 마이그레이션하는가

HolySheep AI는 x402과 AP2 Agent 프로토콜을 네이티브로 지원하면서, 동시에 기존 개발자에게 익숙한 OpenAI 호환 API 인터페이스를 제공합니다. 저는 여러 프로젝트에서 이 마이그레이션을 진행하면서 다음과 같은 실질적 이점을 확인했습니다:

마이그레이션 전 준비사항

필수 환경 체크리스트

# Python 환경 요구사항
python >= 3.10
web3 >= 6.0
httpx >= 0.25.0
py-multiformats >= 0.3.0

Node.js 환경 요구사항 (TypeScript SDK 사용 시)

node >= 18.0.0 ethers >= 6.0.0

설치 명령어

pip install web3 httpx py-multiformats eth_account
# HolySheep AI SDK 설치 (권장)
pip install holysheep-ai-sdk

또는 커맨드라인 도구 설치

npm install -g @holysheep/cli

설치 확인

holysheep --version

출력: holysheep-cli v1.2.4

HolySheep AI vs 공식 API vs 다른 게이트웨이 비교

항목HolySheep AI공식 OpenAI공식 Anthropic기타 게이트웨이
x402/AP2 지원네이티브 지원미지원미지원제한적
USDC 마이크로페이지원미지원미지원일부 지원
단일 API 키모든 모델 통합단일 모델단일 모델제한적
DeepSeek V3.2$0.42/MTok미지원미지원$0.50~0.60/MTok
Gemini 2.5 Flash$2.50/MTok미지원미지원$3.00/MTok
Claude Sonnet 4$15/MTok미지원$18/MTok$16~17/MTok
로컬 결제지원해외 카드 필수해외 카드 필수혼합
한국어 지원완벽제한적제한적제한적
비교 항목HolySheep AICloudflare Workers AIAWS BedrockAzure OpenAI
마이그레이션 난이도하 (OpenAI 호환)
결제 프로토콜x402, AP2, 전통적전통적전통적전통적
월 최소 비용무료 크레딧 포함과금 모델 상이$0계약 필요
API 일관성단일 엔드포인트플랫폼별 상이플랫폼별 상이플랫폼별 상이
한국 서버아시아 최적화제한적서울 리전서울 리전

이런 팀에 적합 / 비적합

✅ HolySheep AI가 적합한 팀

❌ HolySheep AI가 비적합한 팀

가격과 ROI

HolySheep AI 가격 정책

모델입력 ($/MTok)출력 ($/MTok)특징
DeepSeek V3.2$0.28$0.42최고 가성비
Gemini 2.5 Flash$1.25$2.50빠른 응답
GPT-4.1$4.00$8.00최고 성능
Claude Sonnet 4$7.50$15.00긴 컨텍스트

ROI 추정 시나리오

시나리오: 월 100만 토큰 처리 팀 (입력 70%, 출력 30%)

모델공식 API 비용HolySheep 비용월 절감액절감률
DeepSeek V3.2$62.50$47.60$14.9023.8%
Claude Sonnet 4$1,800$1,500$30016.7%
Gemini 2.5 Flash$312.50$250$62.5020%

저는 실제 마이그레이션 프로젝트에서 월 $2,000 이상의 비용을 절감한 사례를 직접 확인했습니다. 특히 다중 모델을 사용하는 팀일수록 HolySheep의 통합 관리와 가격 경쟁력이 극대화됩니다.

마이그레이션 단계별 실행

1단계: API 키 발급 및 환경 설정

# HolySheep AI Dashboard에서 API 키 발급

https://dashboard.holysheep.ai/api-keys

환경 변수 설정

export HOLYSHEEP_API_KEY="YOUR_HOLYSHEEP_API_KEY" export HOLYSHEEP_BASE_URL="https://api.holysheep.ai/v1"

또는 .env 파일 생성

cat > .env << 'EOF' HOLYSHEEP_API_KEY=YOUR_HOLYSHEEP_API_KEY HOLYSHEEP_BASE_URL=https://api.holysheep.ai/v1 X402_WALLET_ADDRESS=your_wallet_address AP2_AGENT_ID=your_agent_id EOF

2단계: x402 결제 헤더 구현

import os
import httpx
from eth_account import Account
from eth_account.messages import encode_defunct
import structlog

logger = structlog.get_logger()

class HolySheepX402Client:
    """x402 프로토콜을 지원하는 HolySheep AI 클라이언트"""
    
    def __init__(self, api_key: str, base_url: str = "https://api.holysheep.ai/v1"):
        self.api_key = api_key
        self.base_url = base_url
        self.wallet = Account.from_key(os.getenv("PRIVATE_KEY"))
        
    def create_x402_header(self, amount_usdc: float, destination: str) -> dict:
        """x402 결제 헤더 생성
        
        Args:
            amount_usdc: 결제할 USDC 금액 (소수점 6자리)
            destination: 토큰 전송 대상 주소
        Returns:
            x402 호환 HTTP 헤더 딕셔너리
        """
        import time
        import json
        
        payload = {
            "scheme": "usdc",
            "network": "mainnet",
            "currency": "USDC",
            "amount": str(amount_usdc),
            "destination": destination,
            "deadline": int(time.time()) + 300,  # 5분 유효
            "payer": self.wallet.address
        }
        
        # 서명 생성
        message = encode_defunct(text=json.dumps(payload, separators=(',', ':')))
        signed = self.wallet.sign_message(message)
        
        return {
            "X-Pay-Scheme": "usdc",
            "X-Pay-Network": "mainnet",
            "X-Pay-Amount": payload["amount"],
            "X-Pay-Destination": destination,
            "X-Pay-Deadline": str(payload["deadline"]),
            "X-Pay-Signature": signed.signature.hex(),
            "X-Pay-Payer": self.wallet.address,
            "Authorization": f"Bearer {self.api_key}"
        }
    
    async def chat_completions(self, messages: list, model: str = "deepseek-v3.2",
                                max_tokens: int = 1000, use_x402: bool = False,
                                usdc_amount: float = 0.001):
        """채팅 완성 API 호출 (x402 옵션)
        
        Args:
            messages: OpenAI 호환 메시지 포맷
            model: 사용할 모델 (deepseek-v3.2, gpt-4.1, claude-sonnet-4, gemini-2.5-flash)
            max_tokens: 최대 출력 토큰 수
            use_x402: x402 결제 사용 여부
            usdc_amount: USDC 결제 금액
        """
        headers = {
            "Content-Type": "application/json",
            "Authorization": f"Bearer {self.api_key}"
        }
        
        if use_x402:
            x402_headers = self.create_x402_header(
                amount_usdc=usdc_amount,
                destination=os.getenv("HOLYSHEEP_PAYMENT_ADDRESS")
            )
            headers.update(x402_headers)
        
        payload = {
            "model": model,
            "messages": messages,
            "max_tokens": max_tokens,
            "stream": False
        }
        
        async with httpx.AsyncClient(timeout=60.0) as client:
            response = await client.post(
                f"{self.base_url}/chat/completions",
                headers=headers,
                json=payload
            )
            
            if response.status_code != 200:
                logger.error("api_call_failed", 
                           status=response.status_code, 
                           error=response.text)
                response.raise_for_status()
            
            return response.json()

사용 예시

client = HolySheepX402Client( api_key=os.getenv("HOLYSHEEP_API_KEY"), base_url="https://api.holysheep.ai/v1" )

일반 API 호출

result = await client.chat_completions( messages=[{"role": "user", "content": "안녕하세요"}], model="deepseek-v3.2" ) print(f"응답: {result['choices'][0]['message']['content']}")

3단계: AP2 Agent 마이크로페이 구현

import asyncio
from dataclasses import dataclass
from typing import Optional
from web3 import Web3
import httpx
import os

@dataclass
class AP2PaymentReceipt:
    """AP2 Agent 결제 영수증"""
    tx_hash: str
    agent_id: str
    amount: float
    block_number: int
    confirmed: bool

class AP2AgentClient:
    """AP2 Agent 프로토콜을 지원하는 HolySheep AI 마이크로페이 클라이언트"""
    
    def __init__(self, api_key: str, agent_id: str, payment_address: str):
        self.api_key = api_key
        self.agent_id = agent_id
        self.payment_address = payment_address
        self.base_url = "https://api.holysheep.ai/v1"
        
        # Web3 설정 (Polygon/MATIC 네트워크)
        self.w3 = Web3(Web3.HTTPProvider(
            os.getenv("POLYGON_RPC_URL", "https://polygon-rpc.com")
        ))
        
    async def execute_micro_payment(self, amount_usdc: float) -> Optional[AP2PaymentReceipt]:
        """USDC 마이크로페이먼드 실행
        
        이 메서드는 AP2 Agent 프로토콜을 통해 소액 결제를 자동执行합니다.
        에이전트가 작업을 완료한 후 자동으로 호출되어 결제를 완료합니다.
        
        Args:
            amount_usdc: 결제할 USDC 금액 (0.001 ~ 100 범위 권장)
        Returns:
            AP2PaymentReceipt: 결제 영수증 또는 None
        """
        from eth_account import Account
        
        # 개인 키에서 지갑 생성
        wallet = Account.from_key(os.getenv("AGENT_PRIVATE_KEY"))
        
        # USDC 컨트랙트 ABI (transfer 함수)
        usdc_abi = [
            {
                "inputs": [
                    {"name": "to", "type": "address"},
                    {"name": "amount", "type": "uint256"}
                ],
                "name": "transfer",
                "outputs": [{"type": "bool"}],
                "stateMutability": "nonpayable",
                "type": "function"
            }
        ]
        
        # USDC 컨트랙트 주소 (Polygon)
        usdc_address = "0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174"
        usdc_contract = self.w3.eth.contract(
            address=Web3.to_checksum_address(usdc_address),
            abi=usdc_abi
        )
        
        # USDC 금액을 wei 단위로 변환 (USDC는 6자리 소수점)
        amount_wei = int(amount_usdc * 10**6)
        
        # 트랜잭션 구성
        nonce = self.w3.eth.get_transaction_count(wallet.address)
        chain_id = self.w3.eth.chain_id
        
        transaction = usdc_contract.functions.transfer(
            Web3.to_checksum_address(self.payment_address),
            amount_wei
        ).build_transaction({
            'chainId': chain_id,
            'from': wallet.address,
            'nonce': nonce,
            'gas': 65000,
            'gasPrice': self.w3.eth.gas_price
        })
        
        # 트랜잭션 서명
        signed_txn = self.w3.eth.account.sign_transaction(
            transaction, 
            private_key=os.getenv("AGENT_PRIVATE_KEY")
        )
        
        # 트랜잭션 전송
        tx_hash = self.w3.eth.send_raw_transaction(signed_txn.rawTransaction)
        
        # 영수증 대기
        receipt = self.w3.eth.wait_for_transaction_receipt(tx_hash, timeout=120)
        
        return AP2PaymentReceipt(
            tx_hash=tx_hash.hex(),
            agent_id=self.agent_id,
            amount=amount_usdc,
            block_number=receipt.blockNumber,
            confirmed=receipt.status == 1
        )
    
    async def agent_task_with_payment(self, task_prompt: str, 
                                       payment_per_call: float = 0.01) -> dict:
        """AP2 Agent 태스크 실행 + 자동 결제
        
        HolySheep AI의 AI 모델을 호출하고, AP2 Agent 프로토콜을 통해
        자동으로 USDC 결제를 실행합니다.
        
        Args:
            task_prompt: 에이전트 작업 프롬프트
            payment_per_call: 호출당 결제 금액 (USDC)
        Returns:
            태스크 결과와 결제 영수증을 포함한 딕셔너리
        """
        async with httpx.AsyncClient(timeout=60.0) as client:
            # 1. AI 모델 호출
            ai_response = await client.post(
                f"{self.base_url}/chat/completions",
                headers={
                    "Authorization": f"Bearer {self.api_key}",
                    "Content-Type": "application/json",
                    "X-AP2-Agent-ID": self.agent_id
                },
                json={
                    "model": "deepseek-v3.2",
                    "messages": [
                        {"role": "system", "content": f"You are AP2 Agent {self.agent_id}"},
                        {"role": "user", "content": task_prompt}
                    ],
                    "max_tokens": 2000
                }
            )
            
            if ai_response.status_code != 200:
                raise Exception(f"AI API 호출 실패: {ai_response.text}")
            
            result = ai_response.json()
            
            # 2. 마이크로페이먼드 실행
            payment_receipt = await self.execute_micro_payment(payment_per_call)
            
            return {
                "ai_result": result,
                "payment": payment_receipt,
                "total_cost_usdc": payment_per_call
            }

사용 예시

async def main(): agent = AP2AgentClient( api_key=os.getenv("HOLYSHEEP_API_KEY"), agent_id="agent-holysheep-001", payment_address="0xHolySheepPaymentAddress..." ) # 에이전트 태스크 실행 result = await agent.agent_task_with_payment( task_prompt="한국의 AI 산업 동향에 대해 분석해줘", payment_per_call=0.01 # 0.01 USDC ) print(f"AI 응답: {result['ai_result']['choices'][0]['message']['content']}") print(f"결제 영수증: TX {result['payment'].tx_hash}") asyncio.run(main())

4단계: 마이그레이션 스크립트 작성

#!/usr/bin/env python3
"""
기존 API에서 HolySheep AI로의 마이그레이션 스크립트
OpenAI/Anthropic API 호출을 HolySheep AI로 자동 전환
"""

import os
import sys
from typing import Callable, Any, Optional
from functools import wraps
import structlog

logger = structlog.get_logger()

class HolySheepMigrationWrapper:
    """기존 API 클라이언트를 HolySheep AI로 마이그레이션하는 래퍼"""
    
    def __init__(self, holysheep_api_key: str):
        self.api_key = holysheep_api_key
        self.base_url = "https://api.holysheep.ai/v1"
        self.model_mapping = {
            # OpenAI 모델 매핑
            "gpt-4": "gpt-4.1",
            "gpt-4-turbo": "gpt-4.1",
            "gpt-3.5-turbo": "deepseek-v3.2",
            
            # Anthropic 모델 매핑
            "claude-3-sonnet-20240229": "claude-sonnet-4",
            "claude-3-opus-20240229": "gpt-4.1",
            "claude-3-haiku-20240307": "gemini-2.5-flash",
            
            # 기본값
            "default": "deepseek-v3.2"
        }
        
    def get_holysheep_model(self, original_model: str) -> str:
        """원본 모델명을 HolySheep 모델로 변환"""
        return self.model_mapping.get(original_model, self.model_mapping["default"])
    
    def migrate_chat_completion(self, original_func: Callable) -> Callable:
        """OpenAI chat.completions API를 HolySheep로 마이그레이션하는 데코레이터"""
        @wraps(original_func)
        async def wrapper(*args, **kwargs):
            import httpx
            
            # 원본 모델명 추출
            original_model = kwargs.get("model", args[0] if args else "default")
            holysheep_model = self.get_holysheep_model(original_model)
            
            # HolySheep API 호출
            async with httpx.AsyncClient(timeout=60.0) as client:
                response = await client.post(
                    f"{self.base_url}/chat/completions",
                    headers={
                        "Authorization": f"Bearer {self.api_key}",
                        "Content-Type": "application/json"
                    },
                    json={
                        "model": holysheep_model,
                        "messages": kwargs.get("messages", []),
                        "temperature": kwargs.get("temperature", 0.7),
                        "max_tokens": kwargs.get("max_tokens", 1000),
                        "stream": kwargs.get("stream", False)
                    }
                )
                
                if response.status_code != 200:
                    logger.error("migration_failed", 
                               original_model=original_model,
                               holysheep_model=holysheep_model,
                               error=response.text)
                    raise
                
                result = response.json()
                
                # 응답 포맷을 원본 API 형식으로 변환
                return {
                    "id": f"holysheep-{result.get('id', 'unknown')}",
                    "object": "chat.completion",
                    "created": result.get("created", 0),
                    "model": original_model,  # 원본 모델명 반환
                    "choices": result.get("choices", []),
                    "usage": result.get("usage", {})
                }
        
        return wrapper

마이그레이션 실행

def migrate_to_holysheep(): """마이그레이션 실행 함수""" # 1. 환경 변수 검증 required_vars = ["HOLYSHEEP_API_KEY"] missing = [v for v in required_vars if not os.getenv(v)] if missing: logger.error("missing_env_vars", vars=missing) raise EnvironmentError(f"필수 환경 변수 누락: {missing}") # 2. HolySheep API 연결 테스트 import httpx import asyncio async def test_connection(): async with httpx.AsyncClient(timeout=10.0) as client: response = await client.get( "https://api.holysheep.ai/v1/models", headers={"Authorization": f"Bearer {os.getenv('HOLYSHEEP_API_KEY')}"} ) return response.status_code == 200 if not asyncio.run(test_connection()): raise ConnectionError("HolySheep API 연결 실패") logger.info("migration_prepared", holysheep_url="https://api.holysheep.ai/v1") return HolySheepMigrationWrapper(os.getenv("HOLYSHEEP_API_KEY")) if __name__ == "__main__": migrator = migrate_to_holysheep() print("HolySheep AI 마이그레이션 준비 완료!")

롤백 계획

마이그레이션 중 발생할 수 있는 문제에 대비하여 명확한 롤백 계획을 수립해야 합니다. 저는 매번 마이그레이션 프로젝트에서 이 단계를 필수로 포함하며, 실제로 롤백이 필요한 상황도 여러 번 경험했습니다.

롤백 트리거 조건

# 롤백 스크립트 (복원 지점 생성)
#!/usr/bin/env python3
"""
HolySheep AI 마이그레이션 롤백 스크립트
환경 변수를 복원 지점으로 되돌립니다.
"""

import os
import json
import shutil
from datetime import datetime

class RollbackManager:
    """마이그레이션 롤백 관리자"""
    
    def __init__(self, backup_dir: str = "./.holysheep_backup"):
        self.backup_dir = backup_dir
        self.checkpoint_file = f"{backup_dir}/checkpoint.json"
        
    def create_checkpoint(self, env_vars: dict):
        """현재 환경 상태 저장
        
        Args:
            env_vars: 현재 환경 변수 딕셔너리
        """
        os.makedirs(self.backup_dir, exist_ok=True)
        
        checkpoint = {
            "timestamp": datetime.now().isoformat(),
            "env_vars": {
                # 원본 API 키 백업
                "ORIGINAL_API_KEY": os.getenv("OPENAI_API_KEY") or os.getenv("ANTHROPIC_API_KEY"),
                "ORIGINAL_BASE_URL": os.getenv("ORIGINAL_BASE_URL", ""),
                
                # HolySheep API 키 백업
                "HOLYSHEEP_API_KEY": os.getenv("HOLYSHEEP_API_KEY"),
                
                # 현재 활성 상태
                "ACTIVE_PROVIDER": os.getenv("ACTIVE_PROVIDER", "original")
            },
            "code_state": {
                "original_imports": self._find_api_imports(),
                "env_file": self._read_env_file()
            }
        }
        
        with open(self.checkpoint_file, 'w') as f:
            json.dump(checkpoint, f, indent=2)
            
        return checkpoint
    
    def rollback(self):
        """마이그레이션 롤백 실행"""
        
        if not os.path.exists(self.checkpoint_file):
            print("롤백 지점이 존재하지 않습니다.")
            return False
        
        with open(self.checkpoint_file, 'r') as f:
            checkpoint = json.load(f)
        
        # 환경 변수 복원
        if checkpoint["env_vars"]["ORIGINAL_API_KEY"]:
            os.environ["OPENAI_API_KEY"] = checkpoint["env_vars"]["ORIGINAL_API_KEY"]
        
        # HolySheep 비활성화
        if "HOLYSHEEP_API_KEY" in os.environ:
            del os.environ["HOLYSHEEP_API_KEY"]
        
        os.environ["ACTIVE_PROVIDER"] = "original"
        
        # 코드 파일 복원 (필요시)
        # self._restore_code_files(checkpoint["code_state"])
        
        print(f"롤백 완료: {checkpoint['timestamp']}")
        return True
    
    def _find_api_imports(self) -> list:
        """API 관련 import 문 탐색"""
        imports = []
        for root, _, files in os.walk("."):
            if ".git" in root or "node_modules" in root:
                continue
            for file in files:
                if file.endswith(".py"):
                    path = os.path.join(root, file)
                    with open(path, 'r') as f:
                        content = f.read()
                        if "openai" in content.lower() or "anthropic" in content.lower():
                            imports.append(path)
        return imports
    
    def _read_env_file(self) -> str:
        """현재 .env 파일 내용 읽기"""
        if os.path.exists(".env"):
            with open(".env", 'r') as f:
                return f.read()
        return ""

if __name__ == "__main__":
    import sys
    
    manager = RollbackManager()
    
    if len(sys.argv) > 1 and sys.argv[1] == "rollback":
        if manager.rollback():
            print("성공적으로 롤백되었습니다.")
        else:
            print("롤백에 실패했습니다.")
    else:
        # 체크포인트 생성
        checkpoint = manager.create_checkpoint(os.environ.copy())
        print(f"체크포인트 생성 완료: {checkpoint['timestamp']}")

마이그레이션 리스크 관리

리스크영향도발생확률완화策略
API 응답 형식 호환성낮음호환성 래퍼 사용, 테스트 배포
USDC 결제 실패폴백 전통 결제 옵션 준비
네트워크 지연 증가낮음Asia-Pacific 리전 우선 사용
Rate Limit 초과재시도 로직 +了指制限 모니터링
API 키 노출낮음환경 변수 관리, 순환 주기 적용

자주 발생하는 오류와 해결

오류 1: x402 헤더 검증 실패

# 오류 메시지

{"error": {"code": "X402_INVALID_SIGNATURE", "message": "Invalid payment signature"}}

해결 방법

1. 서명 생성 방식 확인 (encode_defunct vs encode_typed)

2. 메시지 포맷이 정확한지 확인 (JSON 직렬화 방식)

from eth_account.messages import encode_defunct import json

❌ 잘못된 방식

message = encode_defunct(text=str(payload))

✅ 올바른 방식

message = encode_defunct(text=json.dumps(payload, separators=(',', ':')))

3. deadline 시간 확인 (서버 시간과 동기화)

import time if payload["deadline"] < int(time.time()): raise ValueError("결제 deadline이 지났습니다")

오류 2: AP2 Agent ID 인증 실패

# 오류 메시지

{"error": {"code": "AP2_AGENT_NOT_FOUND", "message": "Agent ID not registered"}}

해결 방법

1. HolySheep Dashboard에서 AP2 Agent 등록 확인

https://dashboard.holysheep.ai/ap2-agents

2. Agent ID 포맷 확인

올바른 형식: agent-{provider}-{unique-id}

AGENT_ID = "agent-holysheep-001" # ✅

AGENT_ID = "my-agent" # ❌

3. API 호출 시 헤더 포함

headers = { "Authorization": f"Bearer {api_key}", "X-AP2-Agent-ID": agent_id, # 필수 "X-AP2-Agent-Signature": generate_agent_signature(agent_id, private_key) }

오류 3: USDC 잔액 부족

# 오류 메시지

{"error": {"code": "INSUFFICIENT_BALANCE", "message": "USDC balance too low"}}

해결 방법

1. USDC 잔액 확인

from web3 import Web3 def check_usdc_balance(wallet_address: str, rpc_url: str) -> float: w3 = Web3(Web3.HTTPProvider(rpc_url)) usdc_address = "0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174" # Polygon USDC usdc_abi = [{"inputs":[],"name":"balanceOf","outputs":[{"type":"uint256"}], "stateMutability":"view","type":"function"}] contract = w3