Deposit NFT to Predicate and deposit Predicate on Plasma chain.
Challenge that we are facing now:
NFT IDs usually hold 256 byte (uint256), which is more than the current Plasma core’s
objectIds is 64 byte field, it include 32 byte
start and 32 byte
We can solve this by depositing Predicate that has a map with ETH NFT on Plasma chain. Advantage of this design is that you can simply add this code on the generalized Plasma spec.
NFT mapping predicate pseudo codes: contain mapping NFT id to 32 byte integer
tokens: mapping(uint32, uint256) # tokenId is within 0-2^32 tokenNonce: uint32 depositedNonce: uint256 def deposit(id: uint256): tokens[tokenNonce] = id self.approve(msg.sender, tokenNonce) self.tokenNonce += 1 def transferFrom(from: address, to: address, amount: uint256): assert amount == 1 // check approval // transfer tokens[depositedNonce] to `to` address self.depositedNonce += 1 // other methods are almost same as ownership predicate @public @payable def onExitGameFinalized( stateUpdate: StateUpdate ): assert stateUpdate.start == stateUpdate.end // tokens[stateUpdate.start] is your NFT id
Common codes to deposit NFT to plasma contract.
NFTMappingPredicate.deposit(nft_id) PlasmaChain.deposit(1, new StateObject("NFT mapping predicate address", "owner address"))