ERC721 입출금 가이드
높은 수준의 작업흐름
ERC721 입금하기 -
- ERC721Predicate 컨트랙트를 승인 하여 입금해야 하는 토큰을 사용합니다.
- RootChainManager에서 depositFor를 호출합니다.
ERC721 출금하기 -
- 폴리곤 체인에서 토큰을 소각합니다.
- 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
})