feat: publishing infernet-container-starter v0.2.0
This commit is contained in:
14
projects/prompt-to-nft/contracts/.gitignore
vendored
Normal file
14
projects/prompt-to-nft/contracts/.gitignore
vendored
Normal file
@ -0,0 +1,14 @@
|
||||
# Compiler files
|
||||
cache/
|
||||
out/
|
||||
|
||||
# Ignores development broadcast logs
|
||||
!/broadcast
|
||||
/broadcast/*/31337/
|
||||
/broadcast/**/dry-run/
|
||||
|
||||
# Docs
|
||||
docs/
|
||||
|
||||
# Dotenv file
|
||||
.env
|
14
projects/prompt-to-nft/contracts/Makefile
Normal file
14
projects/prompt-to-nft/contracts/Makefile
Normal file
@ -0,0 +1,14 @@
|
||||
# phony targets are targets that don't actually create a file
|
||||
.phony: deploy
|
||||
|
||||
# anvil's third default address
|
||||
sender := 0x5de4111afa1a4b94908f83103eb1f1706367c2e68ca870fc3fb9a804cdab365a
|
||||
RPC_URL := http://localhost:8545
|
||||
|
||||
# deploying the contract
|
||||
deploy:
|
||||
@PRIVATE_KEY=$(sender) forge script script/Deploy.s.sol:Deploy --broadcast --rpc-url $(RPC_URL)
|
||||
|
||||
# calling sayGM()
|
||||
call-contract:
|
||||
@PRIVATE_KEY=$(sender) forge script script/CallContract.s.sol:CallContract --broadcast --rpc-url $(RPC_URL)
|
7
projects/prompt-to-nft/contracts/foundry.toml
Normal file
7
projects/prompt-to-nft/contracts/foundry.toml
Normal file
@ -0,0 +1,7 @@
|
||||
[profile.default]
|
||||
src = "src"
|
||||
out = "out"
|
||||
libs = ["lib"]
|
||||
via_ir = true
|
||||
|
||||
# See more config options https://github.com/foundry-rs/foundry/blob/master/crates/config/README.md#all-options
|
3
projects/prompt-to-nft/contracts/remappings.txt
Normal file
3
projects/prompt-to-nft/contracts/remappings.txt
Normal file
@ -0,0 +1,3 @@
|
||||
forge-std/=lib/forge-std/src
|
||||
infernet-sdk/=lib/infernet-sdk/src
|
||||
solmate/=lib/solmate/src
|
22
projects/prompt-to-nft/contracts/script/CallContract.s.sol
Normal file
22
projects/prompt-to-nft/contracts/script/CallContract.s.sol
Normal file
@ -0,0 +1,22 @@
|
||||
// SPDX-License-Identifier: BSD-3-Clause-Clear
|
||||
pragma solidity ^0.8.0;
|
||||
|
||||
import {Script, console2} from "forge-std/Script.sol";
|
||||
import {DiffusionNFT} from "../src/DiffusionNFT.sol";
|
||||
|
||||
contract CallContract is Script {
|
||||
string defaultPrompt = "A picture of a shrimp dunking a basketball";
|
||||
function run() public {
|
||||
// Setup wallet
|
||||
uint256 deployerPrivateKey = vm.envUint("PRIVATE_KEY");
|
||||
address mintTo = vm.envOr("mint_to", msg.sender);
|
||||
string memory prompt = vm.envOr("prompt", defaultPrompt);
|
||||
vm.startBroadcast(deployerPrivateKey);
|
||||
|
||||
DiffusionNFT nft = DiffusionNFT(0x663F3ad617193148711d28f5334eE4Ed07016602);
|
||||
|
||||
nft.mint(prompt, mintTo);
|
||||
|
||||
vm.stopBroadcast();
|
||||
}
|
||||
}
|
26
projects/prompt-to-nft/contracts/script/Deploy.s.sol
Normal file
26
projects/prompt-to-nft/contracts/script/Deploy.s.sol
Normal file
@ -0,0 +1,26 @@
|
||||
// SPDX-License-Identifier: BSD-3-Clause-Clear
|
||||
pragma solidity ^0.8.13;
|
||||
|
||||
import {Script, console2} from "forge-std/Script.sol";
|
||||
import {DiffusionNFT} from "../src/DiffusionNFT.sol";
|
||||
|
||||
contract Deploy is Script {
|
||||
function run() public {
|
||||
// Setup wallet
|
||||
uint256 deployerPrivateKey = vm.envUint("PRIVATE_KEY");
|
||||
vm.startBroadcast(deployerPrivateKey);
|
||||
|
||||
// Log address
|
||||
address deployerAddress = vm.addr(deployerPrivateKey);
|
||||
console2.log("Loaded deployer: ", deployerAddress);
|
||||
|
||||
address coordinator = 0x5FbDB2315678afecb367f032d93F642f64180aa3;
|
||||
// Create consumer
|
||||
DiffusionNFT nft = new DiffusionNFT(coordinator);
|
||||
console2.log("Deployed IrisClassifier: ", address(nft));
|
||||
|
||||
// Execute
|
||||
vm.stopBroadcast();
|
||||
vm.broadcast();
|
||||
}
|
||||
}
|
63
projects/prompt-to-nft/contracts/src/DiffusionNFT.sol
Normal file
63
projects/prompt-to-nft/contracts/src/DiffusionNFT.sol
Normal file
@ -0,0 +1,63 @@
|
||||
// SPDX-License-Identifier: BSD-3-Clause-Clear
|
||||
pragma solidity ^0.8.13;
|
||||
|
||||
import {console2} from "forge-std/console2.sol";
|
||||
import {CallbackConsumer} from "infernet-sdk/consumer/Callback.sol";
|
||||
import {ERC721} from "solmate/tokens/ERC721.sol";
|
||||
|
||||
contract DiffusionNFT is CallbackConsumer, ERC721 {
|
||||
string private EXTREMELY_COOL_BANNER = "\n\n" "_____ _____ _______ _ _ _\n"
|
||||
"| __ \\|_ _|__ __| | | | /\\ | |\n" "| |__) | | | | | | | | | / \\ | |\n"
|
||||
"| _ / | | | | | | | |/ /\\ \\ | |\n" "| | \\ \\ _| |_ | | | |__| / ____ \\| |____\n"
|
||||
"|_| \\_\\_____| |_| \\____/_/ \\_\\______|\n\n";
|
||||
|
||||
constructor(address coordinator) CallbackConsumer(coordinator) ERC721("DiffusionNFT", "DN") {}
|
||||
|
||||
function mint(string memory prompt, address to) public {
|
||||
_requestCompute("prompt-to-nft", abi.encode(prompt, to), 20 gwei, 1_000_000, 1);
|
||||
}
|
||||
|
||||
uint256 public counter = 0;
|
||||
|
||||
mapping(uint256 => string) public arweaveHashes;
|
||||
|
||||
function tokenURI(uint256 tokenId) public view override returns (string memory) {
|
||||
return string.concat("https://arweave.net/", arweaveHashes[tokenId]);
|
||||
}
|
||||
|
||||
function nftCollection() public view returns (uint256[] memory) {
|
||||
uint256 balance = balanceOf(msg.sender);
|
||||
uint256[] memory collection = new uint256[](balance);
|
||||
uint256 j = 0;
|
||||
for (uint256 i = 0; i < counter; i++) {
|
||||
if (ownerOf(i) == msg.sender) {
|
||||
collection[j] = i;
|
||||
j++;
|
||||
}
|
||||
}
|
||||
return collection;
|
||||
}
|
||||
|
||||
|
||||
function _receiveCompute(
|
||||
uint32 subscriptionId,
|
||||
uint32 interval,
|
||||
uint16 redundancy,
|
||||
address node,
|
||||
bytes calldata input,
|
||||
bytes calldata output,
|
||||
bytes calldata proof
|
||||
) internal override {
|
||||
console2.log(EXTREMELY_COOL_BANNER);
|
||||
(bytes memory raw_output, bytes memory processed_output) = abi.decode(output, (bytes, bytes));
|
||||
(string memory arweaveHash) = abi.decode(raw_output, (string));
|
||||
(bytes memory raw_input, bytes memory processed_input) = abi.decode(input, (bytes, bytes));
|
||||
(string memory prompt, address to) = abi.decode(raw_input, (string, address));
|
||||
counter += 1;
|
||||
arweaveHashes[counter] = arweaveHash;
|
||||
console2.log("nft minted!", string.concat("https://arweave.net/", arweaveHashes[counter]));
|
||||
console2.log("nft id", counter);
|
||||
console2.log("nft owner", to);
|
||||
_mint(to, counter);
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user