본문으로 건너뛰기

ERC721 입출금 가이드

높은 수준의 작업흐름

ERC721 입금하기 -

  1. ERC721Predicate 컨트랙트를 승인 하여 입금해야 하는 토큰을 사용합니다.
  2. RootChainManager에서 depositFor를 호출합니다.

ERC721 출금하기 -

  1. 폴리곤 체인에서 토큰을 소각합니다.
  2. RootChainManager에서 exit 함수를 호출하여 소각 트랜잭션의 증명을 제출하십시오. 이 호출은 소각 트랜잭션이 포함된 블록에 대한 체크포인트가 제출된 후에 만들 수 있습니다.

단계 세부정보


컨트랙트 인스턴스화하기

const mainWeb3 = new Web3(mainProvider)
const maticWeb3 = new Web3(maticProvider)
const rootTokenContract = new mainWeb3.eth.Contract(rootTokenABI, rootTokenAddress)
const rootChainManagerContract = new mainWeb3.eth.Contract(rootChainManagerABI, rootChainManagerAddress)
const childTokenContract = new maticWeb3(childTokenABI, childTokenAddress)

승인하기

토큰 컨트랙트의 approve 함수를 호출하여 토큰을 사용하도록 ERC721Predicate를 승인합니다. 이 함수는 두 개의 인수 spender와 tokenID를 갖고 있습니다. spender는 사용자의 토큰을 사용하도록 승인되는 주소입니다. tokenId는 사용할 수 있는 토큰의 ID입니다. 여러 입금을 실행하려면 setApprovalForAll 함수를 호출할 수도 있습니다.

await rootTokenContract.methods
.approve(erc721Predicate, tokenId)
.send({ from: userAddress })

입금하기

이 호출을 하기 전에 토큰을 매핑해야 하고 tokenId가 입금을 위해 승인되어야 합니다.
RootChainManager 컨트랙트의 depositFor 함수를 호출합니다. 이 함수는 user, rootToken 및 depositData 3개의 인수를 취합니다. user 는 폴리곤 체인에 입금을 받을 사용자의 주소입니다. rootToken은 메인 체인의 토큰 주소입니다. depositData는 abi로 인코딩된 tokenId입니다.

const depositData = mainWeb3.eth.abi.encodeParameter('uint256', tokenId)
await rootChainManagerContract.methods
.depositFor(userAddress, rootToken, depositData)
.send({ from: userAddress })

소각하기

하위 토큰 컨트랙트에서 withdraw 함수를 호출하여 토큰을 매틱 체인에서 소각할 수 있습니다. 이 함수는 소각할 토큰을 나타내는 tokenId라는 단일 인수를 사용합니다. 이 소각에 대한 증명은 종료 단계에서 제출해야 합니다. 따라서 트랜잭션 해시를 저장합니다.

const burnTx = await childTokenContract.methods
.withdraw(tokenId)
.send({ from: userAddress })
const burnTxHash = burnTx.transactionHash

종료하기

주기를 완료한다는 것은 ERC721Predicate에서 토큰을 잠금 해제하고 다시 받는 RootChainManager 컨트랙트에서 exit 함수를 호출하는 것을 의미합니다. 이 함수는 withdraw 함수에서 단일 바이트 인수를 가져와 트랜잭션에 대한 소각에 대한 증명으로 사용합니다. 이 함수를 호출하기 전에 제출될 트랜잭션을 포함하는 체크포인트를 기다리는 것이 중요합니다. 다음 필드를 인코딩하는 RLP에 의해 소각에 대한 증명이 생성됩니다:

  • headerNumber - 소각 트랜잭션을 포함하는 체크포인트 헤더 블록 번호
  • blockProof – (하위체인의) 블록 헤더가 제출된 머클 루트의 잎이라는 증명
  • blockNumber - 하위 체인의 소각 트랜잭션을 포함하는 블록 번호
  • blockTime - 트랜잭션 블록 시간 소각하기
  • txRoot - 블록의 트랜잭션 루트
  • receiveRoot - 블록의 영수 루트
  • receipt - 소각 트랜잭션의 영수증
  • ReceiptProof - 소각 영수증의 머클 증명
  • branchMask - 머클 패트리샤 트리에서 수신 경로를 나타내는 32비트
  • receiveLogIndex - 영수증에서 읽을 로그 인덱스

이 모든 정보를 수동으로 생성하는 것은 역사적으로 까다롭다는 것이 입증되었으므로 matic.js SDK를 사용하는 것이 좋습니다. 트랜잭션을 수동으로 보내는 데 여전히 관심이 있는 경우 원 호출 데이터를 가져오려면 옵션 개체에서 encodeAbi를 true로 전달하십시오.

const exitCalldata = await maticPOSClient
.exitERC721(burnTxHash, { from, encodeAbi: true })

RootChainManager로 calldata를 보냅니다.

await mainWeb3.eth.sendTransaction({
from: userAddress,
to: rootChainManagerAddress,
data: exitCalldata.data
})