Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
Ethereum
Skin Z
Commits
07e6f43a
Commit
07e6f43a
authored
Sep 09, 2021
by
Kegan
Browse files
added in payment requirement
parent
8948f807
Changes
3
Hide whitespace changes
Inline
Side-by-side
contracts/SkinZNFT.sol
View file @
07e6f43a
...
...
@@ -152,8 +152,14 @@ contract SkinZNFT is ERC721Enumerable, ReentrancyGuard, Ownable {
uint256
internal
max_token_id
;
uint256
internal
nft_cost
;
bool
internal
allow_claims
;
constructor
()
ERC721
(
"Skin-Z"
,
"SKZ"
)
Ownable
()
{
max_token_id
=
0
;
nft_cost
=
10000000000000000
;
// 0.01 ETH
allow_claims
=
false
;
//NOTE: if we move away from arbitrum, this needs removed!
/*address arbsys_addr = address(0x64);
...
...
@@ -177,7 +183,18 @@ contract SkinZNFT is ERC721Enumerable, ReentrancyGuard, Ownable {
max_token_id
+=
data
[
i
].
count
;
}
}
function
transferFunds
(
address
payable
reciever
,
uint256
amount
)
public
onlyOwner
nonReentrant
{
require
(
address
(
this
).
balance
>=
amount
,
"invalid transfer amount"
);
require
(
reciever
!=
address
(
0x0
),
"cannot burn payments"
);
reciever
.
transfer
(
amount
);
}
function
enableClaims
()
public
onlyOwner
{
allow_claims
=
true
;
}
function
disableClaims
()
public
onlyOwner
{
allow_claims
=
false
;
}
// NOTE: if moving from arbitrum to another blockchain, this source of randomness would need uodated!
// generate a random number (changes between arbitrum and ethereum mainnet!)
function
random
(
uint256
seed
)
internal
view
returns
(
uint256
)
...
...
@@ -222,18 +239,33 @@ contract SkinZNFT is ERC721Enumerable, ReentrancyGuard, Ownable {
string
memory
output
=
string
(
abi
.
encodePacked
(
'data:application/json;base64,'
,
json
));
return
output
;
}
function
claim
(
uint256
tokenId
)
public
nonReentrant
{
function
claim
(
uint256
tokenId
)
public
payable
nonReentrant
{
require
(
allow_claims
,
"claims are disabled"
);
require
(
!
_msgSender
().
isContract
(),
"smart contracts cannot mint"
);
require
(
_unmintedSkins
.
length
>
0
,
"no more skins to claim"
);
require
(
tokenId
<=
max_token_id
&&
tokenId
>
0
,
"Invalid Token ID"
);
//tokenIds start from 1!
require
(
!
_exists
(
tokenId
),
"token already claimed"
);
require
(
msg
.
value
>=
nft_cost
,
"deposit too small"
);
_nftData
[
tokenId
]
=
randomSkin
(
tokenId
);
assert
(
bytes
(
_nftData
[
tokenId
].
image
).
length
>
0
);
assert
(
bytes
(
_nftData
[
tokenId
].
name
).
length
>
0
);
_safeMint
(
_msgSender
(),
tokenId
);
if
(
msg
.
value
>
nft_cost
)
{
payable
(
_msgSender
()).
transfer
(
msg
.
value
-
nft_cost
);
}
}
// ETH can only be sent to this wallet during claims (otherwise we revert)
receive
()
external
payable
{
revert
();
}
fallback
()
external
payable
{
revert
();
}
}
\ No newline at end of file
notes/Skin-Z/1. projects/SkinZNFT.sol.md
View file @
07e6f43a
...
...
@@ -90,3 +90,12 @@ For example, say we had `SkinData[]` which contained all the NFTs to mint. If we
We'll likely mint all of the "rare" NFTs early, leaving only common ones to be minted by the end.
## TODO
1.
Deploy to arbitrum testnet w/ testing artwork
2.
~~Require 0.01 deposit to run claim method~~
3.
~~Refund any excess funds deposited above 0.01 cost~~
4.
~~allow owner to transfer ETH out of contract to target wallet~~
5.
~~Block claims until owner flips a bool ~~
6.
~~refund any deposits not made during a claim~~
7.
Depoy to arbitrum mainnet w/ real artwork
notes/Skin-Z/3. resources/EVM/Solidity.md
View file @
07e6f43a
# Solidity smart contract notes
Solidity is the prefered language to write smart contracts in. See [[Hardhat]] for a development environment.
Here is an awesome learning site: https://solidity-by-example.org/
## View vs Pure
the
`VIEW`
keyword is for functions that read, but do not modify the state of the blockchian.
the
`PURE`
keybword is for functions that neither read nor modify the blockchain.
## Depositing ETH to functions
to allow a function to accept ETH, it needs the
`payable`
keyword.
ETH value transfered can be found in the
`msg.value`
field.
## Payable addresses
there is the
`address`
type and the
`address payable`
type.
To convert an address to payable do
`payable(ADDRESS_HERE)`
Transfer funds with
`payableaddr.transfer(amount)`
; (2300 gas fee)
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment