Closed13

Solidity

yagi_engyagi_eng

こいつを使ってmintしてみる
-> mintするくらいならAPI使わなくてもできそうなので、フルスクラッチ開発でデプロイする

immutable X

basic

https://www.immutable.com/
https://blog.bybit.com/ja-JP/post/dapps-imx-l2-immutable-211111--blta58c6955f33ea46b/

develop

https://docs.x.immutable.com/docs

reference

OpenSeaとの連携

予定はあるが、まだ未実施らしい
https://gaiax-blockchain.com/immutablex

OpenSeaの対応は2021年11月現在まだ実現していませんが、Immutable Xの最新のウェブサイトにOpenSeaのロゴが掲載されていることから、今後OpenSeaがImmutable Xに対応する可能性はありそうです。

https://coinpost.jp/?p=233293

yagi_engyagi_eng

mint方法

目的

ユーザのmint前にこちらで画像を検証したい
以下を考慮して、こちらでmintする

ユーザがmint

  • pros
    • ユーザが気軽にmintしやすい
  • cons
    • イタズラで全く異なる画像をmintされる可能性がある
      • 手数料がかかるのでほぼないと思うが、余地はなくしておきたい

こちらでmint

  • pros
    • イタズラを防げる
  • cons
    • ユーザが気軽にmintできない
    • 先にmint時のgas feeを受け取るフローにすると、ユーザからすると持ち逃げのリスクがある

burnについて

https://ethereum.stackexchange.com/questions/94538/is-it-possible-to-unmint-an-nft-as-in-is-the-reversal-of-the-tokenisation-proc

  • NFTのsmart contractにoptionalでburnのfunctionを実装することはできるが、make senseしない
  • 運営側が勝手にNFTをburnできる余地があるのは良くない

雑多に

  • サーバ側でAPIキー的なの使って認証
  • Ownableの活用
  • 認証コードを画像に埋め込む?
  • gas feeが気になるなら、Layer2などを使う?
    • やっぱりETHが王道

理想フロー

  • [ユーザ]こちらのサイト上でmintする
  • [smart contract] mintNFT関数内で運営側に承認リクエストを飛ばす
  • [運営] リクエストの内容を確認して、承認or否認
  • [smart contract]
    • if 承認
      • mint処理を続行
    • if 否認
      • mint処理を中断
    • ユーザに結果を通知
yagi_engyagi_eng

rinkeby使ってみる

contractのdeployでつまる

上記チュートリアルのropstenをrinkebyに書き換えると、以下のエラー発生

% npx hardhat run scripts/deploy.js --network rinkeby
ProviderError: Must be authenticated!
    at HttpProvider.request (/PATH/node_modules/hardhat/src/internal/core/providers/http.ts:49:19)
    at LocalAccountsProvider.request (/PATH/node_modules/hardhat/src/internal/core/providers/accounts.ts:187:34)
    at GanacheGasMultiplierProvider._isGanache (/PATH/node_modules/hardhat/src/internal/core/providers/gas-providers.ts:315:30)
    at GanacheGasMultiplierProvider.request (/PATH/node_modules/hardhat/src/internal/core/providers/gas-providers.ts:304:23)
    at EthersProviderWrapper.send (/PATH/node_modules/@nomiclabs/hardhat-ethers/src/internal/ethers-provider-wrapper.ts:13:20)
    at getSigners (/PATH/node_modules/@nomiclabs/hardhat-ethers/src/internal/helpers.ts:23:20)
    at main (/PATH/scripts/deploy.js:2:22)

このページに基づき、hardhat.config.jsgasなどを設定すると、以下のエラーが発生

% npx hardhat run scripts/deploy.js --network rinkeby
Deploying contracts with the account: 0xXXXXXXXXXXXX
Error: could not detect network (event="noNetwork", code=NETWORK_ERROR, version=providers/5.5.1)
    at Logger.makeError (PATH/node_modules/@ethersproject/logger/src.ts/index.ts:225:28)
    at Logger.throwError (PATH/node_modules/@ethersproject/logger/src.ts/index.ts:237:20)
    at EthersProviderWrapper.<anonymous> (PATH/node_modules/@ethersproject/providers/src.ts/json-rpc-provider.ts:403:23)
    at step (PATH/node_modules/@ethersproject/providers/lib/json-rpc-provider.js:48:23)
    at Object.throw (PATH/node_modules/@ethersproject/providers/lib/json-rpc-provider.js:29:53)
    at rejected (PATH/node_modules/@ethersproject/providers/lib/json-rpc-provider.js:21:65)
    at processTicksAndRejections (node:internal/process/task_queues:96:5) {
  reason: 'could not detect network',
  code: 'NETWORK_ERROR',
  event: 'noNetwork'
}

これと同じ技術スタックのはずなのに動かない。。
質問サイトを使ってみる、rinkebyネット側の問題かも?
https://stermi.medium.com/how-to-deploy-your-first-smart-contract-on-ethereum-with-solidity-and-hardhat-22f21d31096e

解決

output

contract
https://rinkeby.etherscan.io/address/0x0d7d4640891558f7de72e896ce648dbdcd2b1a46

token
https://rinkeby.etherscan.io/token/0x0d7d4640891558f7de72e896ce648dbdcd2b1a46?a=1

opensea
https://testnets.opensea.io/collection/heartrateart

yagi_engyagi_eng

ブラウザ上でmintする

reference

https://dev.to/rounakbanik/building-a-web3-frontend-with-react-340c

log

output

  • 27591174859c9d5f7129d665f7735f906f481a25
  • このコミット時点のフロントソースコートが一番プレーンな状態
  • 他にDApps作る時に使い回せるかも

contract
https://rinkeby.etherscan.io/address/0xB4213001e7F4614A7339Cd7FA7Be36e8344E08dC

opensea
https://testnets.opensea.io/collection/heartrateart-v2

yagi_engyagi_eng

Royalty

ref

https://www.ejworks.com/solution/detail.html?article_id=116

※ロイヤリティは販売後は一旦OpenSea側に引かれ、2~4週間後にアカウントのウォレットに着金します

ロイヤリティの支払いは毎月、一度におこなわれます。
その際、どの支払い周期においても60ドル以上の手数料が累積した場合のみ支払いがおこなわれることに注意が必要です。

https://zenn.dev/razokulover/scraps/862704ae73c285

https://blockchain-insight.ch/jp/2021/09/18/2262

これにロイヤリティ回収のための独自の実装をいれるか、普及の可能性を持ったERC2981 に準拠したNFTだけが売買に際してロイヤリティの回収ができる可能性がある。

可能性があると言ったのは、たとえ対応しているNFTであっても、Metamaskなどのウォレットを使って個人間で直接NFTのやりとりをした場合には、NFT自身が売買金額を知る方法はなく、ロイヤリティの回収はできない。

現段階ではERC2981に準拠しているNFTは少なく、かつ、ERC2981 はあくまで売買プラットフォームに対してロイヤリティ額や率を伝えるだけのインターフェース。それ自体がロイヤリティフィーの回収まで行う仕組みではないからだ

https://forum.openzeppelin.com/t/how-to-properly-add-royalties-to-erc-721-oz-contracts/13119

Our ERC721 contract can't be made to have payable transferFrom

https://github.com/OpenZeppelin/openzeppelin-contracts/issues/2610

A reason why we did not make them payable in our implementation is to avoid funds getting stuck since there is no mechanism to withdraw any fund that might be sent by mistake

https://eips.ethereum.org/EIPS/eip-721

function safeTransferFrom(address _from, address _to, uint256 _tokenId) external payable;

-> enable to set payable

https://blog.suishow.net/2021/08/25/opensea-market-contract解説/

AuthenticatedProxy
対象となるNFT ContractのsafeTransferFromを実行するのが主な役割です。

set royalty (not work)

what I did

function _royalty() private {
        uint256 rate = 10; // 10%
        payable(owner()).transfer(msg.value.div(rate));
    }

output

https://rinkeby.etherscan.io/address/0x90D32dc78Ba691409A8F2d6f31A3e814157715b0
https://testnets.opensea.io/collection/heartrateart-lvddgcjxvj

yagi_engyagi_eng

Manifold Studio

official

https://www.manifold.xyz/

summary

  • create NFT contract on GUI
  • can set royalty to the contract

output

https://rinkeby.etherscan.io/address/0x5e0d0eb968ed4e25132298893e1cf3682af822d7
https://testnets.opensea.io/collection/test-yagi

contract setting page

Sets default royalties for all tokens minted with this contract and can be updated at anytime. Royalty percentages are saved to the blockchain and can be split between as many accounts as you like. On OpenSea you must fill out the "Royalties" field in your Collection's setting to receive royalties from OpenSea sales! They do not respect on-chain royalties yet.

try

このスクラップは2022/02/26にクローズされました