diff --git a/README.MD b/README.MD index 03d6c5a..e6d720c 100644 --- a/README.MD +++ b/README.MD @@ -364,6 +364,7 @@ forge script script/MockSetup.s.sol --fork-url http://127.0.0.1:8545 --broadcast ```shell cd app eval $(echo export $(grep MNEMONIC .env)) +eval $(echo export $(grep CONTRACT_ADDRESS .env)) uv run python3 ``` @@ -384,9 +385,9 @@ a = Wallet.create() w3_uri = "http://127.0.0.1:8545" w3 = Web3(Web3.HTTPProvider(w3_uri)) -# replace the address with your own token contract address -token_address = "0x7A2E477883Bd134637a2eD18f84babD71B9bb4e1" -token = Contract(w3, "AccountingToken", token_address) +# replace contract addresses with your own +product = Contract(w3, "CropProduct", "0xdA0b2cf6B65a98d06Cd77212509537dD166A19cE") +token = Contract(w3, "AccountingToken", "0xB58192974A93B9143Ef5F91Ab8b0545092b65803") token.transfer(a, 100, {'from':w}) token.balanceOf(a) diff --git a/app/locations.csv b/app/locations.csv deleted file mode 100644 index 2e0b7ee..0000000 --- a/app/locations.csv +++ /dev/null @@ -1,136 +0,0 @@ -nanoId,country,region,province,department,village -jxmbyupsh1rv,BF,Centre Nord,Sanmatenga,KAYA,Basberike -DY4nWRvFhejq,BF,Centre Nord,Sanmatenga,KAYA,Bissiga -thq-rpJANaBw,BF,Centre Nord,Sanmatenga,KAYA,Tangasgo -9HMBI-OmVmIB,BF,Plateau Central,Ganzourgou,ZORGHO,Souka -jZGa2a8jve1q,BF,Plateau Central,Ganzourgou,ZORGHO,Bougré -rdHnV6gWoylr,BF,Plateau Central,Ganzourgou,ZORGHO,Tintog-Nabitenga -vOEauVq4Jwjf,BF,Plateau Central,Ganzourgou,ZORGHO,Bangbily -7A0UOIVZZNAf,BF,Plateau Central,Ganzourgou,ZORGHO,Waguésse -54vWZV7PHuun,BF,Plateau Central,Ganzourgou,ZORGHO,Zeguedega -1nM1cPOFT-vp,BF,Plateau Central,Ganzourgou,ZORGHO,Tamasgo de Bougré -91dD3WPcCBzN,BF,Plateau Central,Ganzourgou,ZORGHO,Douré -0nrdAnnLHhLW,BF,Plateau Central,Ganzourgou,ZORGHO,Tuiré -ex496Gk4LLcJ,BF,Plateau Central,Ganzourgou,ZORGHO,Tuiré-Peulh -8LMm0zrKVwh_,BF,Plateau Central,Ganzourgou,ZORGHO,Tuiré-peulh -JUTWzPLNCi4K,BF,Plateau Central,Ganzourgou,ZORGHO,Bissiga -s4G43fWTyAL3,BF,Plateau Central,Ganzourgou,ZORGHO,Signonghin -kchozKmVyRSV,BF,Plateau Central,Ganzourgou,ZORGHO,Godin -0IWAueKH968O,BF,Plateau Central,Ganzourgou,ZORGHO,Bissaga -SQLR5Cc5r6NR,BF,Plateau Central,Ganzourgou,ZORGHO,Nabmassa -3f4cBlLYxv7C,BF,Plateau Central,Ganzourgou,ZORGHO,Songdin -X35oO-Fi387m,BF,Plateau Central,Ganzourgou,ZORGHO,Nabinkins -6j2mUs-SDgOF,BF,Plateau Central,Ganzourgou,ZORGHO,Kolongkom -4J-zdNyMH1iG,BF,Plateau Central,Ganzourgou,ZORGHO,Gondin -Yi2r0MtrD1G6,BF,Plateau Central,Ganzourgou,ZORGHO,Digré -BcY_aniic3Pw,BF,Plateau Central,Ganzourgou,ZORGHO,Gonkin -gFa8Yt_zja9N,BF,Plateau Central,Ganzourgou,ZORGHO,Tintogo -EJi7BNqZ7w2s,BF,Plateau Central,Ganzourgou,ZORGHO,Zinado -bmuFSasYLnUi,BF,Plateau Central,Ganzourgou,ZORGHO,Zempassogo -byI-ShP44Lxb,BF,Plateau Central,Ganzourgou,ZORGHO,Yougoulmandé -UCos06EMcK4g,BF,Plateau Central,Ganzourgou,ZORGHO,Kourgou -VutDjDuqaGPx,BF,Plateau Central,Ganzourgou,ZORGHO,Soubdougou -TgTdfkFauSQr,BF,Plateau Central,Ganzourgou,ZORGHO,Tampelcé -qECbKVPBGazn,BF,Plateau Central,Ganzourgou,ZORGHO,Bokin koudgo -WVjS7cKCD4sU,BF,Plateau Central,Ganzourgou,ZORGHO,Torodo -N7pvKr3jjVOl,BF,Plateau Central,Ganzourgou,ZORGHO,Tourgoum-Tenga -zL33E-MwOPkr,BF,Plateau Central,Ganzourgou,ZORGHO,Tamasgo de torodo -dW6U4MnkYuhS,BF,Plateau Central,Ganzourgou,ZORGHO,Zainga -F_fZdJ2UBOg7,BF,Plateau Central,Ganzourgou,ZORGHO,Daguintoéga -oTjj_6hxHZwj,BF,Plateau Central,Ganzourgou,ZORGHO,Kologuessom -WdeMgLsYCVU9,BF,Plateau Central,Ganzourgou,ZORGHO,Koulgmasga -HDL_0fTLifB1,BF,Plateau Central,Ganzourgou,ZORGHO,Kidiba -BIAhed_VguT0,BF,Plateau Central,Ganzourgou,ZORGHO,Nabitenga -vkeBpGQsm0If,BF,Plateau Central,Ganzourgou,ZORGHO,Dabèga -Wah1hfg43z3i,BF,Plateau Central,Ganzourgou,ZORGHO,Taga -2ppc-ZAEYPMU,BF,Plateau Central,Ganzourgou,ZORGHO,Koubéogo -gDT-av2RBiNf,BF,Plateau Central,Ganzourgou,ZORGHO,Imiga -Fi7DotZnjkL7,BF,Plateau Central,Ganzourgou,ZORGHO,Boangtenga -2UKjCUrA9Mu3,BF,Plateau Central,Ganzourgou,ZORGHO,Tamidou -ApqW95yGiAOl,BF,EST,Gnagna,THION,Nawèga -gfx_oFWzvSWd,BF,EST,Gnagna,THION,Harga -_OaMHqp38xmu,BF,EST,Gnagna,THION,Laranga -2dgiXlw4H_fu,BF,EST,Gnagna,THION,Dimkoura -LIqBoa0k0qA7,BF,EST,Gnagna,THION,Doyana -ANFJ08IYRjYd,BF,EST,Gnagna,THION,Sekoussi -CLeJro_8Nxko,BF,EST,Gnagna,THION,Banogo -AIwjgmbj5vqA,BF,EST,Gnagna,THION,Diapalga -YQE9GSoHB7Ns,BF,EST,Gnagna,THION,Siéssin -cWaMVZfOco_f,BF,EST,Gnagna,THION,Diaka -honF7vYdauVv,BF,EST,Gnagna,THION,Bangaye -QRjNOPeBC9bY,BF,EST,Gnagna,THION,Tambiri -P9duZ8OYJ74X,BF,EST,Gnagna,THION,Tipolga -s2YC5GAYbnXG,BF,EST,Gnagna,THION,Obdaga -EtRT2bu0oLfR,BF,EST,Gnagna,THION,Kamissi -xuB5zhQihDUz,BF,EST,Gnagna,THION,Bangayeni -nLmNDzBAfQAh,BF,EST,Gnagna,THION,Lelcom -AoSRMkx_eioO,BF,EST,Gnagna,THION,Balamba --wWAXWnLb-br,BF,EST,Gnagna,THION,Dioro -NawDFzPdhj8N,BF,EST,Gnagna,THION,Yargoun -HZEuhnBq8nxB,BF,EST,Gnagna,THION,Dioro-Folgou -thdP3LO2djA8,BF,Est,Gnagna,THION,Bogmissi -Qllv6IsC3HTr,BF,EST,Gnagna,THION,3 -Qvyw1BHGv3ED,BF,EST,Gnagna,THION,Bogmissi -VQq7gI6hNhPu,BF,Centre Nord,Sanmatenga,BOUSSOUMA,GOARAGUI -2HfYgPcXQK6R,BF,Centre Nord,Sanmatenga,BOUSSOUMA,GUILLA -WZTpY6o5jLP2,BF,Centre Nord,Sanmatenga,BOUSSOUMA,TANHOKO -KvyDOSDR2XIc,BF,Plateau Central,Oubritenga,ZITENGA,Tizilinziogo -2vdBQ1Sh4gHU,BF,Plateau Central,Oubritenga,ZITENGA,Lélexé -3BYonM5IuQTy,BF,Plateau Central,Oubritenga,ZITENGA,Bissiga Yarcé -HWJQ4SVJPNx1,BF,Plateau Central,Oubritenga,ZITENGA,Nioniopalogo -byfkAvTMbg4K,BF,Plateau Central,Oubritenga,ZITENGA,Kogmasgo -1v0iZX1GAmUr,BF,Plateau Central,Oubritenga,ZITENGA,Zakin -D8wAMNI23msz,BF,Plateau Central,Oubritenga,ZITENGA,Banguissom -o2h5lyRH6IcI,BF,Plateau Central,Oubritenga,ZITENGA,Komnongo -3vmRLPRYoKIP,BF,Plateau Central,Oubritenga,ZITENGA,Dayagretenga -YKEVQ0XoVXDb,BF,Plateau Central,Oubritenga,ZITENGA,Zegdegin -BkwyI9alkpqH,BF,Plateau Central,Oubritenga,ZITENGA,Zeguedgin -66wqtjMBmjZP,BF,Plateau Central,Oubritenga,ZITENGA,Barkoundba Mossi -BFBZwoDxB-IP,BF,Plateau Central,Oubritenga,ZITENGA,Nionk Mossi --Shklu3eBFM8,BF,Plateau Central,Oubritenga,ZITENGA,Nionk Peulh -0eXEK5OtaTBs,BF,Plateau Central,Oubritenga,ZITENGA,Pendemtenga -81k85UN6Vzr0,BF,Plateau Central,Oubritenga,ZITENGA,Lemnongo -6VZQf2YHu4ds,BF,Plateau Central,Oubritenga,ZITENGA,Bissiga Irané -Gmslz92WN1Gp,BF,Plateau Central,Oubritenga,ZITENGA,Bissiga Mossi -dYLBuW3aOYPF,BF,Plateau Central,Oubritenga,ZITENGA,Tampanga -FrxCnde2DCdG,BF,Plateau Central,Oubritenga,ZITENGA,Lékexé -O7GG8ux1okGw,BF,Nord,Yatenga,RAMBO,RAMBO -WCWv-0pi3kfb,BF,Nord,Yatenga,RAMBO,NIOUSSI-TANGAYE -mVhLjLdqpj5i,BF,Nord,Yatenga,KOSSOUKA,Kossouka -b-3TPftwbwK4,BF,Nord,Yatenga,KOSSOUKA,Koussouka -b4KHGP1XiSPp,BF,Nord,Yatenga,KOSSOUKA,Sèkeba -nLmZ5GoXSM5s,BF,Nord,Yatenga,KOSSOUKA,Magarougou -ZF6kOsvMOtzC,BF,Nord,Yatenga,OULA,Boursouma -dfP9aPBAobvj,BF,Nord,Yatenga,OULA,Bouro -qOLVMrQCnb2F,BF,Nord,Yatenga,OULA,Bilinga -IUy3zBXUIvDb,BF,Nord,Yatenga,KOSSOUKA,Kapelego-Tangaye -xAD8TaL5K9p-,BF,Nord,Yatenga,KOSSOUKA,Samtaga -SFIi1A5Yvx6c,BF,Nord,Yatenga,OULA,Kourbo Mogo -Tnsl6W6pWSc0,BF,Nord,Yatenga,OULA,Reka -azXuO3PPwGnw,BF,Nord,Yatenga,OULA,Tilli -sJRA7khwXy97,BF,Nord,Yatenga,RAMBO,Koungo -qAqknrGJQtk4,BF,Nord,Yatenga,RAMBO,Koumna yargo -BrrOgcTtxzga,BF,Nord,Yatenga,RAMBO,Koumna Yargo -kQ8UEJ-E9TI-,BF,Nord,Yatenga,RAMBO,Tantoaga -ZH88D7vIr4Dx,BF,Nord,Yatenga,RAMBO,Nioussi-Tangaye -FS3u_UuYo43T,BF,Nord,Zondoma,BASSI,Bassi -PES0LlXyNZhm,BF,Nord,Passore,BOKIN,Siguidiguen -ELKTOCZnyVeG,BF,Nord,Passore,BOKIN,Tegsagbo -3eDuSeLeVPLN,BF,Nord,Zondoma,BASSI,Guiriguiri -jjaMrBtULPBU,BF,Nord,Zondoma,BASSI,Tilba -JN6UJOK6mmx9,BF,Nord,Passore,BOKIN,Zilaoré -KHUuTgSzMbrP,BF,Nord,Zondoma,BASSI,Songodin -vHjUXy7p9kUH,BF,Nord,Passore,BOKIN,Pépin -JyipDNMz6MGb,BF,Nord,Passore,BOKIN,Booré -zfs5foUFk4Dl,BF,Nord,Passore,BOKIN,Tibin -ayWT_WGOLnBW,BF,Nord,Zondoma,BASSI,Rondolga -xKOGGTK6-AsB,BF,Nord,Passore,BOKIN,Guila -67hNLgyTaGTF,BF,Nord,Passore,BOKIN,Wapensé -4htzwfoKpCK-,BF,Nord,Zondoma,BASSI,Saye -9Tf2_hYLeBH8,BF,Nord,Zondoma,BASSI,Sapela -2SPLG9A9jq0C,BF,Nord,Passore,BOKIN,Seguedin -_XpYQ5lsazsg,BF,Nord,Zondoma,BASSI,Guiri-Guiri -hTl4UiUXKlrS,BF,Centre Nord,Sanmatenga,KORSIMORO,Kirbaka -JuZvaI3kinhr,BF,Centre Nord,Sanmatenga,KORSIMORO,Komtenga -PPVPzGkf88H9,BF,Centre Nord,Sanmatenga,KORSIMORO,SECTTEUR 3 -QG8S_uDhjESL,BF,Centre Nord,Sanmatenga,KORSIMORO,Yonyonsi diff --git a/app/server/api/config.py b/app/server/api/config.py index 72d6122..b880667 100644 --- a/app/server/api/config.py +++ b/app/server/api/config.py @@ -1,7 +1,10 @@ +from datetime import datetime + from fastapi.responses import FileResponse from fastapi.routing import APIRouter from server.config import settings +from server.error import raise_with_log from server.model.config import ConfigIn, ConfigOut from server.mongo import create_in_collection, find_in_collection, get_list_of_models_in_collection, get_list_of_dicts_in_collection @@ -19,6 +22,18 @@ @router.post("/", response_model=ConfigOut, response_description="Config data created") async def create_config(config: ConfigIn): logger.info(f"POST {PATH_PREFIX} {config}") + + # check season start and end and calculate season days + season_start = datetime.fromisoformat(config.startOfSeason) + season_end = datetime.fromisoformat(config.endOfSeason) + if season_start >= season_end: + raise_with_log(ValueError, f"season start {config.startOfSeason} must be before season end {config.endOfSeason}") + + document = config.toMongoDict() + document['year'] = season_start.year + document['seasonDays'] = (season_end - season_start).days + 1 + config = ConfigOut.fromMongoDict(document) + return create_in_collection(config, ConfigOut) diff --git a/app/server/api/location.py b/app/server/api/location.py index ca590a2..e8594dc 100644 --- a/app/server/api/location.py +++ b/app/server/api/location.py @@ -42,3 +42,9 @@ async def get_all_locations_csv( documents = get_list_of_dicts_in_collection(LocationOut, page, items) field_list = get_field_list(fields) return write_csv_temp_file(field_list, documents, delimiter) + + +@router.get("/all/pending", response_model=list[LocationOut], response_description="Locations obtained") +async def get_all_locations_to_sync(page: int = 1, items: int = settings.MONGO_DOCUMENTS_PER_PAGE): + logger.info(f"GET {PATH_PREFIX}/all/json") + return get_new_locations() diff --git a/app/server/api/person.py b/app/server/api/person.py index 46d6f4f..61611b0 100644 --- a/app/server/api/person.py +++ b/app/server/api/person.py @@ -6,7 +6,7 @@ from server.mongo import count_documents, create_in_collection, find_in_collection, get_list_of_models_in_collection, get_list_of_dicts_in_collection from util.csv import write_csv_temp_file, get_field_list from util.logging import get_logger -from web3_utils.wallet import Wallet +from web3utils.wallet import Wallet PATH_PREFIX = "/person" diff --git a/app/server/api/policy.py b/app/server/api/policy.py index aa3eefa..27a5b1c 100644 --- a/app/server/api/policy.py +++ b/app/server/api/policy.py @@ -8,9 +8,8 @@ from server.api.util import verify_person_exists, verify_risk_exists from server.model.policy import PolicyIn, PolicyOut from server.mongo import create_in_collection, find_in_collection, get_collection_for_class, get_list_of_models_in_collection, get_list_of_dicts_in_collection +from server.sync.policy import sync_policy_onchain -from data.offchain_data import get_policy_data, get_policies_data -from data.onchain_data import get_onchain_onboarding_data, amend_onchain_data from util.csv import write_csv_temp_file, get_field_list from util.logging import get_logger @@ -27,6 +26,10 @@ async def create_policy(policy: PolicyIn) -> PolicyOut: verify_risk_exists(policy.riskId) return create_in_collection(policy, PolicyOut) +@router.post("/{policy_id}/sync", response_description="Policy synched onchain") +async def sync_policy(policy_id: str): + policy = find_in_collection(policy_id, PolicyOut) + sync_policy_onchain(policy) @router.get("/{policy_id}", response_description="Policy data obtained") async def get_policy(policy_id: str): @@ -44,12 +47,6 @@ async def get_payouts(policy_id: str) -> List[PayoutOut]: payouts = payout_collection.find({"policyId": policy_id}) return [PayoutOut.fromMongoDict(p) for p in payouts] - -# @router.get("/{policy_id}/onchain", response_description="Policy onchain data obtained") -# async def get_onchain_policy_data(policy_id: str) -> dict: -# return get_onchain_onboarding_data(policy_id) - - @router.get("/all/json", response_description="Policies data obtained") async def get_all_policies(page:int = 1, items:int = settings.MONGO_DOCUMENTS_PER_PAGE): logger.info(f"GET {PATH_PREFIX}/all/json") @@ -58,7 +55,7 @@ async def get_all_policies(page:int = 1, items:int = settings.MONGO_DOCUMENTS_PE @router.get("/all/csv", response_class=FileResponse, response_description="Locations csv created") async def get_all_locations_csv( - fields: str = settings.MODEL_CSV_LOCATION_FIELDS, + fields: str = settings.MODEL_CSV_POLICY_FIELDS, delimiter: str = settings.MODEL_CSV_DELIMITER, page: int = 1, items: int = settings.MONGO_DOCUMENTS_PER_PAGE diff --git a/app/server/config.py b/app/server/config.py index 0abd7ea..5bf0993 100644 --- a/app/server/config.py +++ b/app/server/config.py @@ -5,19 +5,36 @@ class Settings(BaseSettings): APP_TITLE: str = "Etherisc API Server" APP_DEBUG: bool = False + # list of valid crops + VALID_CROPS: list = ["coffee", "maize"] + # model fields settings MODEL_ID_ATTRIBUTE: str = "id" MODEL_CSV_DELIMITER: str = ";" MODEL_CSV_PERSON_FIELDS: str = "id,locationId,firstName,lastName,gender,mobilePhone,externalId,walletIndex,wallet" MODEL_CSV_LOCATION_FIELDS: str = "id,country,region,province,department,village,latitude,longitude,openstreetmap,coordinatesLevel" - MODEL_CSV_POLICY_FIELDS: str = "id,year,seasonStart,seasonEnd,indexType,locationNanoId,region,province,department,city,beneficiarySex,subscriptionDate,premium,sumInsured,triggerSevere,payoutSevere,triggerMedium,payoutMedium,triggerLow,payoutLow,indexReferenceValue,indexEndOfSeasonValue,indexRatio,payoutEstimated" + MODEL_CSV_POLICY_FIELDS: str = "id,personId,riskId,subscriptionDate,sumInsuredAmount,premiumAmount,nft,tx" MODEL_CSV_CLAIM_FIELDS: str = "id,onChainId,policyId,claimAmount,paidAmount,closedAt,createdAt,updatedAt" MODEL_CSV_PAYOUT_FIELDS: str = "id,onChainId,policyId,claimId,amount,paidAt,beneficiary,createdAt,updatedAt" MODEL_CSV_RISK_FIELDS: str = "id,isValid,configId,locationId,crop,createdAt,updatedAt" MODEL_CSV_CONFIG_FIELDS: str = "id,isValid,name,year,startOfSeason,endOfSeason,createdAt,updatedAt" - # farmer wallet mnemonic (only via .env) + # account mnemonics (only via .env) FARMER_WALLET_MNEMONIC: str | None + OPERATOR_WALLET_MNEMONIC: str | None + + # farmer minimum funding amount + FARMER_FUNDING_AMOUNT: int = 100000001 + + # smart contracs settings + PRODUCT_CONTRACT_ADDRESS: str | None + TOKEN_CONTRACT_ADDRESS: str | None + + # onchain latitude longitude decimals + LOCATION_DECIMALS: int = 6 + + # rpc node settings (default is local anvil node) + RPC_NODE_URL: str | None = "http://127.0.0.1:8545" # mongodb settings MONGO_ID_ATTRIBUTE: str = "_id" diff --git a/app/server/model/config.py b/app/server/model/config.py index 5230ace..75ba564 100644 --- a/app/server/model/config.py +++ b/app/server/model/config.py @@ -1,32 +1,36 @@ -from pydantic import BaseModel, Field +from datetime import datetime + +from pydantic import BaseModel, field_validator, Field from server.error import raise_with_log from server.mongo import MongoModel EXAMPLE_IN = { - "isValid": True, "name": "MainSeasons2024", - "year": 2024, "startOfSeason": "2024-08-01", - "endOfSeason": "2024-12-31", - "seasonDays": 120, - "franchise": 0.1, - "createdAt": 1700316957, - "updatedAt": 1700316957, + "endOfSeason": "2024-12-31" } EXAMPLE_OUT = EXAMPLE_IN EXAMPLE_OUT["_id"] = "7Zv4TZoBLxUi" +EXAMPLE_OUT["year"] = 2014 +EXAMPLE_OUT["seasonDays"] = 120 class ConfigIn(MongoModel): - isValid:bool name:str - year:int startOfSeason:str endOfSeason:str - seasonDays:int - franchise:float - createdAt:int - updatedAt:int + + @field_validator('startOfSeason', 'endOfSeason') + @classmethod + def date_must_be_iso(cls, v: str) -> str: + date = v.strip() + try: + datetime.fromisoformat(date) + except ValueError: + raise ValueError("Provided string is not a valid ISO date.") + raise_with_log(ValueError, f"date {date} is not iso format (YYYY-MM-DD)") + + return date class Config: json_schema_extra = { @@ -35,6 +39,8 @@ class Config: class ConfigOut(ConfigIn): _id: str + year:int + seasonDays:int id: str = Field(default=None) tx: str | None = Field(default=None) diff --git a/app/server/model/person.py b/app/server/model/person.py index 5f81e2b..1c0d9ca 100644 --- a/app/server/model/person.py +++ b/app/server/model/person.py @@ -2,7 +2,7 @@ from server.error import raise_with_log from server.mongo import MongoModel from util.nanoid import is_valid_nanoid -from web3_utils.wallet import Wallet +from web3utils.wallet import Wallet EXAMPLE_IN = { "locationId": "U6ufadiIe0Xz", @@ -47,7 +47,7 @@ def name_must_not_be_empty(cls, v: str) -> str: @field_validator('gender') @classmethod - def sex_must_be_m_or_f(cls, v: str) -> str: + def gender_must_be_m_or_f(cls, v: str) -> str: if v is None: return None @@ -72,7 +72,6 @@ class PersonOut(PersonIn): @field_validator('walletIndex') @classmethod def wallet_index_must_be_positive(cls, v: int) -> int: - print(f"validating wallet index {v} ...") wallet_index = v if not isinstance(wallet_index, int): raise_with_log(ValueError, f"wallet index must be of type int") diff --git a/app/server/model/policy.py b/app/server/model/policy.py index 8f536a0..600fd8f 100644 --- a/app/server/model/policy.py +++ b/app/server/model/policy.py @@ -15,7 +15,7 @@ EXAMPLE_OUT = EXAMPLE_IN EXAMPLE_OUT["id"] = "cwNCXQfypiTg" -EXAMPLE_OUT["onchainId"] = "2689313703" +EXAMPLE_OUT["nft"] = "2689313703" # https://www.xe.com/currencyconverter/convert/?Amount=300&From=USD&To=UGX MAX_MONETARY_AMOUNT = 5000000.0 @@ -30,7 +30,6 @@ class PolicyIn(MongoModel): subscriptionDate: str sumInsuredAmount: float premiumAmount: float - onchainId: str = Field(default=None) @field_validator('personId', 'riskId') @classmethod @@ -71,6 +70,7 @@ class Config: class PolicyOut(PolicyIn): _id: str id: str = Field(default=None) + nft: int | None = Field(default=None) tx: str | None = Field(default=None) class Config: diff --git a/app/server/model/risk.py b/app/server/model/risk.py index ca937de..3847443 100644 --- a/app/server/model/risk.py +++ b/app/server/model/risk.py @@ -1,4 +1,6 @@ from pydantic import field_validator, Field, BaseModel + +from server.config import settings from server.error import raise_with_log from server.model.location import LocationOut from server.model.config import ConfigOut @@ -46,9 +48,6 @@ "updatedAt": 1700316957 } - -VALID_CROPS = ["coffee"] - class RiskIn(BaseModel): isValid: bool configId: str @@ -91,7 +90,7 @@ def config_must_exist(cls, v:str) -> str: def crop_must_be_valid(cls, v: str) -> str: crop = v.strip().lower() - if crop not in VALID_CROPS: + if crop not in settings.VALID_CROPS: raise_with_log(ValueError, f"crop {crop} invalid, valid crops are {VALID_CROPS}") return crop @@ -175,7 +174,7 @@ def config_must_exist(cls, v:str) -> str: def crop_must_be_valid(cls, v: str) -> str: crop = v.strip().lower() - if crop not in VALID_CROPS: + if crop not in settings.VALID_CROPS: raise_with_log(ValueError, f"crop {crop} invalid, valid crops are {VALID_CROPS}") return crop diff --git a/app/server/mongo.py b/app/server/mongo.py index 8137fa9..727b856 100644 --- a/app/server/mongo.py +++ b/app/server/mongo.py @@ -109,6 +109,20 @@ def get_list_of_models_in_collection(cls, page: int, items_per_page: int): return documents +def get_filtered_list_of_models_in_collection(cls, filter): + collection_name = get_collection_name_for_class(cls) + logger.info(f"fetching from {collection_name} with filter {filter}") + + collection = get_collection_for_class(cls) + result_set = collection.find(filter) + documents = [] + + for document in result_set: + documents.append(cls.fromMongoDict(document)) + + return documents + + def get_list_of_dicts_in_collection(cls, page: int, items_per_page: int): result_set = _get_list_as_result_set(cls, page, items_per_page) diff --git a/app/server/sync/config.py b/app/server/sync/config.py new file mode 100644 index 0000000..e3b437d --- /dev/null +++ b/app/server/sync/config.py @@ -0,0 +1,31 @@ +from util.logging import get_logger + +from server.config import settings +from server.model.config import ConfigOut +from server.mongo import update_in_collection +from server.sync.onchain import operator, product + +# setup for module +logger = get_logger() + +def sync_config_onchain(config: ConfigOut): + if config.tx: + logger.info(f"config {config.id} already synched onchain (tx: {config.tx})") + return + + logger.info(f"synching config {config.id} onchain") + + id = helper.toStr(config.id) + year = config.year + name = helper.toStr(config.name) + season_start = helper.toStr(config.name) + season_end = helper.toStr(config.name) + season_days = config.seasonDays + + # execute transaction + tx = product.createSeason(id, year, name, season_start, season_end, season_days, {'from': operator}) + logger.info(f"tx {tx} config {config.id} year {config.year} name {config.name} created") + + # update config with tx + config.tx = tx + update_in_collection(config, ConfigOut) diff --git a/app/server/sync/location.py b/app/server/sync/location.py new file mode 100644 index 0000000..81a67fc --- /dev/null +++ b/app/server/sync/location.py @@ -0,0 +1,28 @@ +from util.logging import get_logger + +from server.config import settings +from server.model.location import LocationOut +from server.mongo import update_in_collection +from server.sync.onchain import operator, product + +# setup for module +logger = get_logger() + +def sync_location_onchain(location: LocationOut): + if location.tx: + logger.info(f"location {location.id} already synched onchain (tx: {location.tx})") + return + + logger.info(f"synching location {location.id} onchain") + + id = product.toStr(location.id) + latitude = int(location.latitude * 10 ** settings.LOCATION_DECIMALS) + longitude = int(location.longitude * 10 ** settings.LOCATION_DECIMALS) + + # execute transaction + tx = product.createLocation(id, latitude, longitude, {'from': operator}) + logger.info(f"tx {tx} location {location.id} latitude {latitude} longitude {longitude} created") + + # update location with tx + location.tx = tx + update_in_collection(location, LocationOut) diff --git a/app/server/sync/onchain.py b/app/server/sync/onchain.py new file mode 100644 index 0000000..80c8a26 --- /dev/null +++ b/app/server/sync/onchain.py @@ -0,0 +1,16 @@ +from util.logging import get_logger +from web3 import Web3 +from web3utils.contract import Contract +from web3utils.wallet import Wallet + +from server.config import settings + +# setup for module +logger = get_logger() + +w3 = Web3(Web3.HTTPProvider(settings.RPC_NODE_URL)) +product = Contract(w3, "CropProduct", settings.PRODUCT_CONTRACT_ADDRESS, out_path="/workspaces/esusfarm/out") +token = Contract(w3, "AccountingToken", settings.TOKEN_CONTRACT_ADDRESS, out_path="/workspaces/esusfarm/out") + +operator = Wallet.from_mnemonic(settings.OPERATOR_WALLET_MNEMONIC) + diff --git a/app/server/sync/person.py b/app/server/sync/person.py new file mode 100644 index 0000000..ec9c9d8 --- /dev/null +++ b/app/server/sync/person.py @@ -0,0 +1,33 @@ +from util.logging import get_logger + +from server.config import settings +from server.model.person import PersonOut +from server.mongo import update_in_collection +from server.sync.onchain import token, operator + +# setup for module +logger = get_logger() + +def sync_person_onchain(person: PersonOut): + if person.tx: + logger.info(f"person {person.id} already synched onchain (tx: {person.tx})") + return + + logger.info(f"synching person {person.id} onchain") + + # check balance of wallet + balance = token.balanceOf(person.wallet) + logger.info(f"balance {balance} (min amount {settings.FARMER_FUNDING_AMOUNT}) for wallet {person.wallet}") + + # send tokens to wallet if balance is below threshold + if balance < settings.FARMER_FUNDING_AMOUNT: + funding = settings.FARMER_FUNDING_AMOUNT - balance + + # execute transaction + tx = token.transfer(person.wallet, funding, {'from': operator}) + logger.info(f"tx {tx} funding of {funding} token to {person.wallet}") + + # update person with tx + person.tx = tx + update_in_collection(person, PersonOut) + diff --git a/app/server/sync/policy.py b/app/server/sync/policy.py new file mode 100644 index 0000000..61760ed --- /dev/null +++ b/app/server/sync/policy.py @@ -0,0 +1,44 @@ +from datetime import datetime +from util.logging import get_logger + +from server.mongo import find_in_collection +from server.model.person import PersonOut +from server.model.policy import PolicyOut +from server.model.risk import RiskOut +from server.sync.onchain import operator, product + +from server.sync.person import sync_person_onchain +from server.sync.risk import sync_risk_onchain + +# setup for module +logger = get_logger() + +def sync_policy_onchain(policy: PolicyOut): + if policy.tx: + logger.info(f"policy {policy.id} already synced onchain (nft {policy.nft}") + return + + logger.info(f"synching policy {policy.id} onchain") + + # sync person if not yet done + person = find_in_collection(policy.personId, PersonOut) + sync_person_onchain(person) + + # sync risk if not yet done + risk = find_in_collection(policy.riskId, RiskOut) + sync_risk_onchain(risk) + + # execute transaction + policy_holder = person.wallet + risk_id_str = product.toStr(risk.id) + risk_id = product.getRiskId(risk_id_str) + subscription_date = datetime.fromisoformat(policy.subscriptionDate) + activate_at = int(subscription_date.timestamp()) + sum_insured = int(policy.sumInsuredAmount) + premium = int(policy.premiumAmount) + + + activate_at = int() + tx = product.createPolicy(policy_holder, risk_id, activate_at, sum_insured, premium, {'from': operator}) + + logger.info(f"{tx} onchain policy {policy.id} created") diff --git a/app/server/sync/risk.py b/app/server/sync/risk.py new file mode 100644 index 0000000..1b5e85a --- /dev/null +++ b/app/server/sync/risk.py @@ -0,0 +1,43 @@ +from datetime import datetime, timedelta +from util.logging import get_logger + +from server.model.config import ConfigOut +from server.model.location import LocationOut +from server.model.risk import RiskOut +from server.mongo import find_in_collection, update_in_collection +from server.sync.config import sync_config_onchain +from server.sync.location import sync_location_onchain +from server.sync.onchain import operator, product + +# setup for module +logger = get_logger() + +def sync_risk_onchain(risk: RiskOut): + if risk.tx: + logger.info(f"risk {risk.id} already synched onchain (tx: {risk.tx})") + return + + logger.info(f"synching risk {risk.id} onchain") + + # sync configuration (season) if not yet done + config = find_in_collection(risk.configId, ConfigOut) + sync_config_onchain(config) + + # sync risk if not yet done + location = find_in_collection(risk.locationId, LocationOut) + sync_location_onchain(location) + + # execute transaction + id = product.toStr(risk.id) + season_id = product.toStr(config.id) + location_id = product.toStr(location.id) + crop = product.toStr(risk.crop) + season_end_at = int( + (datetime.fromisoformat(config.startOfSeason) + timedelta(days=config.seasonDays)).timestamp()) + + tx = product.createRisk(id, season_id, location_id, crop, season_end_at, {'from': operator}) + logger.info(f"tx {tx} risk {risk.id} season {config.id} ({config.name}) location {location.id} ({location.latitude}/{location.longitude}) crop {risk.crop} created") + + # update risk with tx + risk.tx = tx + update_in_collection(risk, RiskOut) diff --git a/broadcast/MockSetup.s.sol/31337/run-1734793105.json b/broadcast/MockSetup.s.sol/31337/run-1734793105.json new file mode 100644 index 0000000..4059104 --- /dev/null +++ b/broadcast/MockSetup.s.sol/31337/run-1734793105.json @@ -0,0 +1,134 @@ +{ + "transactions": [ + { + "hash": "0xf494cfd82a270511a0a0c4be92b70ef9966bd092f18882b9691ad79cd8869656", + "transactionType": "CREATE", + "contractName": "AccountingToken", + "contractAddress": "0x5fbf585fac1ecdf64d80a043b805bee90587f976", + "function": null, + "arguments": null, + "transaction": { + "from": "0xb4f15c0e3155e5418c4557de16526a597e68c4bf", + "gas": "0xaafcc", + "value": "0x0", + "input": "0x608060405234801561000f575f5ffd5b5061001c6006600a610189565b61002b9064e8d4a5100061019e565b335f81815260208190526040812092909255907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef61006b6006600a610189565b61007a9064e8d4a5100061019e565b60405190815260200160405180910390a36101b5565b634e487b7160e01b5f52601160045260245ffd5b6001815b60018411156100df578085048111156100c3576100c3610090565b60018416156100d157908102905b60019390931c9280026100a8565b935093915050565b5f826100f557506001610183565b8161010157505f610183565b816001811461011757600281146101215761013d565b6001915050610183565b60ff84111561013257610132610090565b50506001821b610183565b5060208310610133831016604e8410600b8410161715610160575081810a610183565b61016c5f1984846100a4565b805f190482111561017f5761017f610090565b0290505b92915050565b5f61019760ff8416836100e7565b9392505050565b808202811582820484141761018357610183610090565b610834806101c25f395ff3fe608060405234801561000f575f5ffd5b50600436106100cb575f3560e01c8063313ce56711610088578063a3f4df7e11610063578063a3f4df7e146101a9578063a9059cbb146101b1578063dd62ed3e146101c4578063f76f8d78146101fc575f5ffd5b8063313ce5671461015b57806370a082311461016257806395d89b411461018a575f5ffd5b806306fdde03146100cf578063095ea7b3146100ed57806318160ddd1461011057806323b872dd146101265780632e0f2625146101395780632ff2e9dc14610153575b5f5ffd5b6100d761021e565b6040516100e49190610598565b60405180910390f35b6101006100fb3660046105e8565b61023e565b60405190151581526020016100e4565b6101186102aa565b6040519081526020016100e4565b610100610134366004610610565b6102cb565b610141600681565b60405160ff90911681526020016100e4565b61011861047d565b6006610141565b61011861017036600461064a565b6001600160a01b03165f9081526020819052604090205490565b6040805180820190915260038152624c434160e81b60208201526100d7565b6100d761049b565b6101006101bf3660046105e8565b6104b7565b6101186101d236600461066a565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b6100d7604051806040016040528060038152602001624c434160e81b81525081565b60606040518060600160405280602181526020016107de60219139905090565b335f8181526001602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906102989086815260200190565b60405180910390a35060015b92915050565b5f6102b76006600a610792565b6102c69064e8d4a510006107a0565b905090565b6001600160a01b0383165f9081526020819052604081205482111561032e5760405162461bcd60e51b8152602060048201526014602482015273496e73756666696369656e742062616c616e636560601b60448201526064015b60405180910390fd5b6001600160a01b0384165f9081526001602090815260408083203384529091529020548211156103955760405162461bcd60e51b8152602060048201526012602482015271105b1b1bddd85b98d948195e18d95959195960721b6044820152606401610325565b6001600160a01b0384165f908152600160209081526040808320338452909152812080548492906103c79084906107b7565b90915550506001600160a01b0384165f90815260208190526040812080548492906103f39084906107b7565b90915550506001600160a01b0383165f908152602081905260408120805484929061041f9084906107ca565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161046b91815260200190565b60405180910390a35060019392505050565b6104896006600a610792565b6104989064e8d4a510006107a0565b81565b6040518060600160405280602181526020016107de6021913981565b335f9081526020819052604081205482111561050c5760405162461bcd60e51b8152602060048201526014602482015273496e73756666696369656e742062616c616e636560601b6044820152606401610325565b335f908152602081905260408120805484929061052a9084906107b7565b90915550506001600160a01b0383165f90815260208190526040812080548492906105569084906107ca565b90915550506040518281526001600160a01b0384169033907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001610298565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b80356001600160a01b03811681146105e3575f5ffd5b919050565b5f5f604083850312156105f9575f5ffd5b610602836105cd565b946020939093013593505050565b5f5f5f60608486031215610622575f5ffd5b61062b846105cd565b9250610639602085016105cd565b929592945050506040919091013590565b5f6020828403121561065a575f5ffd5b610663826105cd565b9392505050565b5f5f6040838503121561067b575f5ffd5b610684836105cd565b9150610692602084016105cd565b90509250929050565b634e487b7160e01b5f52601160045260245ffd5b6001815b60018411156106ea578085048111156106ce576106ce61069b565b60018416156106dc57908102905b60019390931c9280026106b3565b935093915050565b5f82610700575060016102a4565b8161070c57505f6102a4565b8160018114610722576002811461072c57610748565b60019150506102a4565b60ff84111561073d5761073d61069b565b50506001821b6102a4565b5060208310610133831016604e8410600b841016171561076b575081810a6102a4565b6107775f1984846106af565b805f190482111561078a5761078a61069b565b029392505050565b5f61066360ff8416836106f2565b80820281158282048414176102a4576102a461069b565b818103818111156102a4576102a461069b565b808201808211156102a4576102a461069b56fe4c6f63616c2043757272656e637920284163636f756e74696e6720546f6b656e29a26469706673582212208301450dcb126b11a3dc2e96393265aef347371e8459c3cf42aa78b943f0936064736f6c634300081b0033", + "nonce": "0x6", + "chainId": "0x7a69" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x25249a52cb112922c616bcf8837e5bfdb2c34c2f1fbee386de1d3f5b57ccf82b", + "transactionType": "CREATE", + "contractName": "CropProduct", + "contractAddress": "0xa41692d8c80b20f75dbb9319fa8e4bd8b487f095", + "function": null, + "arguments": null, + "transaction": { + "from": "0xb4f15c0e3155e5418c4557de16526a597e68c4bf", + "gas": "0x4097e", + "value": "0x0", + "input": "0x6080604052348015600e575f5ffd5b506102b78061001c5f395ff3fe608060405234801561000f575f5ffd5b5060043610610055575f3560e01c80630228ec7b146100595780632a6f8ef21461008a5780636f336d7c146100b95780637f73fa9c146100d1578063f1338cda146100e2575b5f5ffd5b61006c610067366004610140565b6100f8565b6040516001600160c01b031990911681526020015b60405180910390f35b6100a06100983660046101a8565b5f9392505050565b60405167ffffffffffffffff9091168152602001610081565b6100cf6100c73660046101f2565b505050505050565b005b6100cf6100df366004610246565b50565b6100ea5f5481565b604051908152602001610081565b5f805481806101068361025d565b91905055505f5460405160200161011f91815260200190565b60405160208183030381529060405280519060200120905095945050505050565b5f5f5f5f5f60a08688031215610154575f5ffd5b85359450602086013593506040860135925060608601359150608086013564ffffffffff81168114610184575f5ffd5b809150509295509295909350565b8035600381900b81146101a3575f5ffd5b919050565b5f5f5f606084860312156101ba575f5ffd5b833592506101ca60208501610192565b91506101d860408501610192565b90509250925092565b803561ffff811681146101a3575f5ffd5b5f5f5f5f5f5f60c08789031215610207575f5ffd5b86359550610217602088016101e1565b945060408701359350606087013592506080870135915061023a60a088016101e1565b90509295509295509295565b5f60208284031215610256575f5ffd5b5035919050565b5f6001820161027a57634e487b7160e01b5f52601160045260245ffd5b506001019056fea26469706673582212209237c5db988c7ef7ec441144fad6bffc5bab5d7d802c5708102847221fe63e1864736f6c634300081b0033", + "nonce": "0x7", + "chainId": "0x7a69" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x540c20ba96ebd9a6627c8ee80b3715b57625cc52abe1e61e036e982b86149d9f", + "transactionType": "CREATE", + "contractName": "StrHelper", + "contractAddress": "0xefb4a1e3cfb4b672fa911f21445b79f7dcd4355a", + "function": null, + "arguments": null, + "transaction": { + "from": "0xb4f15c0e3155e5418c4557de16526a597e68c4bf", + "gas": "0x40e10", + "value": "0x0", + "input": "0x6080604052348015600e575f5ffd5b506102bb8061001c5f395ff3fe608060405234801561000f575f5ffd5b506004361061003f575f3560e01c8063a9dbaf2514610043578063b11a19e814610069578063cdc23e6914610089575b5f5ffd5b61005661005136600461014c565b61009c565b6040519081526020015b60405180910390f35b61007c61007736600461014c565b6100c9565b6040516100609190610163565b6100566100973660046101ac565b610106565b5f60ff8216601f8111156100c357604051632cd44ac360e21b815260040160405180910390fd5b92915050565b60605f6100d58361009c565b6040805160208082528183019092529192505f91906020820181803683375050509182525060208101929092525090565b5f5f829050601f81511115610139578260405163305a27a960e01b81526004016101309190610163565b60405180910390fd5b80516101448261025f565b179392505050565b5f6020828403121561015c575f5ffd5b5035919050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b634e487b7160e01b5f52604160045260245ffd5b5f602082840312156101bc575f5ffd5b813567ffffffffffffffff8111156101d2575f5ffd5b8201601f810184136101e2575f5ffd5b803567ffffffffffffffff8111156101fc576101fc610198565b604051601f8201601f19908116603f0116810167ffffffffffffffff8111828210171561022b5761022b610198565b604052818152828201602001861015610242575f5ffd5b816020840160208301375f91810160200191909152949350505050565b8051602080830151919081101561027f575f198160200360031b1b821691505b5091905056fea2646970667358221220cbd22c25466cf72396f0276261d1dd58fc417875851a84013fda965457f9f16464736f6c634300081b0033", + "nonce": "0x8", + "chainId": "0x7a69" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "status": "0x1", + "cumulativeGasUsed": "0x83876", + "logs": [ + { + "address": "0x5fbf585fac1ecdf64d80a043b805bee90587f976", + "topics": [ + "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x000000000000000000000000b4f15c0e3155e5418c4557de16526a597e68c4bf" + ], + "data": "0x0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "blockHash": "0x20c3e617fa6dbcee7edb83f20f1edb606d678a16393b8a47448151d8218ba772", + "blockNumber": "0x7", + "blockTimestamp": "0x6766d791", + "transactionHash": "0xf494cfd82a270511a0a0c4be92b70ef9966bd092f18882b9691ad79cd8869656", + "transactionIndex": "0x0", + "logIndex": "0x0", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000001000020000000000020000000000000000000800000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000200000000000000002000000000000000000000000000000000000000000000000000020000000000000000000000000000000000200000000000000000000000000010000", + "type": "0x2", + "transactionHash": "0xf494cfd82a270511a0a0c4be92b70ef9966bd092f18882b9691ad79cd8869656", + "transactionIndex": "0x0", + "blockHash": "0x20c3e617fa6dbcee7edb83f20f1edb606d678a16393b8a47448151d8218ba772", + "blockNumber": "0x7", + "gasUsed": "0x83876", + "effectiveGasPrice": "0x38d57d40", + "blobGasPrice": "0x1", + "from": "0xb4f15c0e3155e5418c4557de16526a597e68c4bf", + "to": null, + "contractAddress": "0x5fbf585fac1ecdf64d80a043b805bee90587f976" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x31aff", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x25249a52cb112922c616bcf8837e5bfdb2c34c2f1fbee386de1d3f5b57ccf82b", + "transactionIndex": "0x0", + "blockHash": "0x542cf041c5c03c44efdff0421b468064dad1c071d9bf715cbb0e91d5de492962", + "blockNumber": "0x8", + "gasUsed": "0x31aff", + "effectiveGasPrice": "0x35938b99", + "blobGasPrice": "0x1", + "from": "0xb4f15c0e3155e5418c4557de16526a597e68c4bf", + "to": null, + "contractAddress": "0xa41692d8c80b20f75dbb9319fa8e4bd8b487f095" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x63982", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x540c20ba96ebd9a6627c8ee80b3715b57625cc52abe1e61e036e982b86149d9f", + "transactionIndex": "0x1", + "blockHash": "0x542cf041c5c03c44efdff0421b468064dad1c071d9bf715cbb0e91d5de492962", + "blockNumber": "0x8", + "gasUsed": "0x31e83", + "effectiveGasPrice": "0x35938b99", + "blobGasPrice": "0x1", + "from": "0xb4f15c0e3155e5418c4557de16526a597e68c4bf", + "to": null, + "contractAddress": "0xefb4a1e3cfb4b672fa911f21445b79f7dcd4355a" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1734793105, + "chain": 31337, + "commit": "fc875fd" +} \ No newline at end of file diff --git a/broadcast/MockSetup.s.sol/31337/run-1734817307.json b/broadcast/MockSetup.s.sol/31337/run-1734817307.json new file mode 100644 index 0000000..b5e035b --- /dev/null +++ b/broadcast/MockSetup.s.sol/31337/run-1734817307.json @@ -0,0 +1,134 @@ +{ + "transactions": [ + { + "hash": "0x60b726948e3140a4f7c4ba1e36974c144b55299f38ccb219c18b93a61f9d1029", + "transactionType": "CREATE", + "contractName": "AccountingToken", + "contractAddress": "0xe73dfe3145ccaedab2be675b0bf42e9af39302ac", + "function": null, + "arguments": null, + "transaction": { + "from": "0x81d9be695571458d72120d91e1b9333f844815cf", + "gas": "0xaafcc", + "value": "0x0", + "input": "0x608060405234801561000f575f5ffd5b5061001c6006600a610189565b61002b9064e8d4a5100061019e565b335f81815260208190526040812092909255907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef61006b6006600a610189565b61007a9064e8d4a5100061019e565b60405190815260200160405180910390a36101b5565b634e487b7160e01b5f52601160045260245ffd5b6001815b60018411156100df578085048111156100c3576100c3610090565b60018416156100d157908102905b60019390931c9280026100a8565b935093915050565b5f826100f557506001610183565b8161010157505f610183565b816001811461011757600281146101215761013d565b6001915050610183565b60ff84111561013257610132610090565b50506001821b610183565b5060208310610133831016604e8410600b8410161715610160575081810a610183565b61016c5f1984846100a4565b805f190482111561017f5761017f610090565b0290505b92915050565b5f61019760ff8416836100e7565b9392505050565b808202811582820484141761018357610183610090565b610834806101c25f395ff3fe608060405234801561000f575f5ffd5b50600436106100cb575f3560e01c8063313ce56711610088578063a3f4df7e11610063578063a3f4df7e146101a9578063a9059cbb146101b1578063dd62ed3e146101c4578063f76f8d78146101fc575f5ffd5b8063313ce5671461015b57806370a082311461016257806395d89b411461018a575f5ffd5b806306fdde03146100cf578063095ea7b3146100ed57806318160ddd1461011057806323b872dd146101265780632e0f2625146101395780632ff2e9dc14610153575b5f5ffd5b6100d761021e565b6040516100e49190610598565b60405180910390f35b6101006100fb3660046105e8565b61023e565b60405190151581526020016100e4565b6101186102aa565b6040519081526020016100e4565b610100610134366004610610565b6102cb565b610141600681565b60405160ff90911681526020016100e4565b61011861047d565b6006610141565b61011861017036600461064a565b6001600160a01b03165f9081526020819052604090205490565b6040805180820190915260038152624c434160e81b60208201526100d7565b6100d761049b565b6101006101bf3660046105e8565b6104b7565b6101186101d236600461066a565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b6100d7604051806040016040528060038152602001624c434160e81b81525081565b60606040518060600160405280602181526020016107de60219139905090565b335f8181526001602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906102989086815260200190565b60405180910390a35060015b92915050565b5f6102b76006600a610792565b6102c69064e8d4a510006107a0565b905090565b6001600160a01b0383165f9081526020819052604081205482111561032e5760405162461bcd60e51b8152602060048201526014602482015273496e73756666696369656e742062616c616e636560601b60448201526064015b60405180910390fd5b6001600160a01b0384165f9081526001602090815260408083203384529091529020548211156103955760405162461bcd60e51b8152602060048201526012602482015271105b1b1bddd85b98d948195e18d95959195960721b6044820152606401610325565b6001600160a01b0384165f908152600160209081526040808320338452909152812080548492906103c79084906107b7565b90915550506001600160a01b0384165f90815260208190526040812080548492906103f39084906107b7565b90915550506001600160a01b0383165f908152602081905260408120805484929061041f9084906107ca565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161046b91815260200190565b60405180910390a35060019392505050565b6104896006600a610792565b6104989064e8d4a510006107a0565b81565b6040518060600160405280602181526020016107de6021913981565b335f9081526020819052604081205482111561050c5760405162461bcd60e51b8152602060048201526014602482015273496e73756666696369656e742062616c616e636560601b6044820152606401610325565b335f908152602081905260408120805484929061052a9084906107b7565b90915550506001600160a01b0383165f90815260208190526040812080548492906105569084906107ca565b90915550506040518281526001600160a01b0384169033907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001610298565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b80356001600160a01b03811681146105e3575f5ffd5b919050565b5f5f604083850312156105f9575f5ffd5b610602836105cd565b946020939093013593505050565b5f5f5f60608486031215610622575f5ffd5b61062b846105cd565b9250610639602085016105cd565b929592945050506040919091013590565b5f6020828403121561065a575f5ffd5b610663826105cd565b9392505050565b5f5f6040838503121561067b575f5ffd5b610684836105cd565b9150610692602084016105cd565b90509250929050565b634e487b7160e01b5f52601160045260245ffd5b6001815b60018411156106ea578085048111156106ce576106ce61069b565b60018416156106dc57908102905b60019390931c9280026106b3565b935093915050565b5f82610700575060016102a4565b8161070c57505f6102a4565b8160018114610722576002811461072c57610748565b60019150506102a4565b60ff84111561073d5761073d61069b565b50506001821b6102a4565b5060208310610133831016604e8410600b841016171561076b575081810a6102a4565b6107775f1984846106af565b805f190482111561078a5761078a61069b565b029392505050565b5f61066360ff8416836106f2565b80820281158282048414176102a4576102a461069b565b818103818111156102a4576102a461069b565b808201808211156102a4576102a461069b56fe4c6f63616c2043757272656e637920284163636f756e74696e6720546f6b656e29a26469706673582212208301450dcb126b11a3dc2e96393265aef347371e8459c3cf42aa78b943f0936064736f6c634300081b0033", + "nonce": "0x0", + "chainId": "0x7a69" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xf1458c8e0fb6f2983ebee502021786da477262f54117cb6f7002f3886bb5198a", + "transactionType": "CREATE", + "contractName": "CropProduct", + "contractAddress": "0x4145fb426b113340f34210cb6e24e21df5701ce9", + "function": null, + "arguments": null, + "transaction": { + "from": "0x81d9be695571458d72120d91e1b9333f844815cf", + "gas": "0x60c87", + "value": "0x0", + "input": "0x6080604052600180546001600160601b031916620187051790553480156023575f5ffd5b50610424806100315f395ff3fe608060405234801561000f575f5ffd5b506004361061007a575f3560e01c80636f336d7c116100585780636f336d7c146101095780637f73fa9c14610121578063d52c1bea14610132578063f1338cda14610145575f5ffd5b80630228ec7b1461007e5780632a6f8ef2146100af578063422e9f41146100de575b5f5ffd5b61009161008c366004610207565b61015b565b6040516001600160c01b031990911681526020015b60405180910390f35b6100c56100bd36600461025d565b5f9392505050565b60405167ffffffffffffffff90911681526020016100a6565b6100f16100ec3660046102ac565b6101a3565b6040516001600160601b0390911681526020016100a6565b61011f61011736600461032d565b505050505050565b005b61011f61012f366004610381565b50565b6001546100f1906001600160601b031681565b61014d5f5481565b6040519081526020016100a6565b5f80548180610169836103ac565b91905055505f5460405160200161018291815260200190565b60405160208183030381529060405280519060200120905095945050505050565b600180545f916001600160601b0390911690826101bf836103c4565b82546101009290920a6001600160601b0381810219909316918316021790915560015416979650505050505050565b803564ffffffffff81168114610202575f5ffd5b919050565b5f5f5f5f5f60a0868803121561021b575f5ffd5b85359450602086013593506040860135925060608601359150610240608087016101ee565b90509295509295909350565b8035600381900b8114610202575f5ffd5b5f5f5f6060848603121561026f575f5ffd5b8335925061027f6020850161024c565b915061028d6040850161024c565b90509250925092565b80356001600160601b0381168114610202575f5ffd5b5f5f5f5f5f60a086880312156102c0575f5ffd5b85356001600160a01b03811681146102d6575f5ffd5b945060208601356001600160c01b0319811681146102f2575f5ffd5b9350610300604087016101ee565b925061030e60608701610296565b915061024060808701610296565b803561ffff81168114610202575f5ffd5b5f5f5f5f5f5f60c08789031215610342575f5ffd5b863595506103526020880161031c565b945060408701359350606087013592506080870135915061037560a0880161031c565b90509295509295509295565b5f60208284031215610391575f5ffd5b5035919050565b634e487b7160e01b5f52601160045260245ffd5b5f600182016103bd576103bd610398565b5060010190565b5f6001600160601b0382166001600160601b0381036103e5576103e5610398565b6001019291505056fea2646970667358221220fcccee4b0a37cae0cdd1a782a0c3a71277b1041e0e6f49ec9cc63c443227678364736f6c634300081b0033", + "nonce": "0x1", + "chainId": "0x7a69" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x1216e91500b41da940589deba3958ccbf6a39f077978e30d1e725f8d5653842a", + "transactionType": "CREATE", + "contractName": "StrHelper", + "contractAddress": "0x1e529ba1c9bc734647403f7c74134b7bccfc9142", + "function": null, + "arguments": null, + "transaction": { + "from": "0x81d9be695571458d72120d91e1b9333f844815cf", + "gas": "0x40e10", + "value": "0x0", + "input": "0x6080604052348015600e575f5ffd5b506102bb8061001c5f395ff3fe608060405234801561000f575f5ffd5b506004361061003f575f3560e01c8063a9dbaf2514610043578063b11a19e814610069578063cdc23e6914610089575b5f5ffd5b61005661005136600461014c565b61009c565b6040519081526020015b60405180910390f35b61007c61007736600461014c565b6100c9565b6040516100609190610163565b6100566100973660046101ac565b610106565b5f60ff8216601f8111156100c357604051632cd44ac360e21b815260040160405180910390fd5b92915050565b60605f6100d58361009c565b6040805160208082528183019092529192505f91906020820181803683375050509182525060208101929092525090565b5f5f829050601f81511115610139578260405163305a27a960e01b81526004016101309190610163565b60405180910390fd5b80516101448261025f565b179392505050565b5f6020828403121561015c575f5ffd5b5035919050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b634e487b7160e01b5f52604160045260245ffd5b5f602082840312156101bc575f5ffd5b813567ffffffffffffffff8111156101d2575f5ffd5b8201601f810184136101e2575f5ffd5b803567ffffffffffffffff8111156101fc576101fc610198565b604051601f8201601f19908116603f0116810167ffffffffffffffff8111828210171561022b5761022b610198565b604052818152828201602001861015610242575f5ffd5b816020840160208301375f91810160200191909152949350505050565b8051602080830151919081101561027f575f198160200360031b1b821691505b5091905056fea2646970667358221220cbd22c25466cf72396f0276261d1dd58fc417875851a84013fda965457f9f16464736f6c634300081b0033", + "nonce": "0x2", + "chainId": "0x7a69" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "status": "0x1", + "cumulativeGasUsed": "0x83876", + "logs": [ + { + "address": "0xe73dfe3145ccaedab2be675b0bf42e9af39302ac", + "topics": [ + "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x00000000000000000000000081d9be695571458d72120d91e1b9333f844815cf" + ], + "data": "0x0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "blockHash": "0x84cdeb1c503750809fcc1b98872edc1ccf4c57d629727918d3830b68dd47da59", + "blockNumber": "0x1", + "blockTimestamp": "0x6767361b", + "transactionHash": "0x60b726948e3140a4f7c4ba1e36974c144b55299f38ccb219c18b93a61f9d1029", + "transactionIndex": "0x0", + "logIndex": "0x0", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000020000000000000000000800000000000000000800000010000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000010000020000000000000002000000000000000000000000000010000000000000000000000020000000000000000000000000000000000000000000000004000000000000000000", + "type": "0x2", + "transactionHash": "0x60b726948e3140a4f7c4ba1e36974c144b55299f38ccb219c18b93a61f9d1029", + "transactionIndex": "0x0", + "blockHash": "0x84cdeb1c503750809fcc1b98872edc1ccf4c57d629727918d3830b68dd47da59", + "blockNumber": "0x1", + "gasUsed": "0x83876", + "effectiveGasPrice": "0x3b9aca01", + "blobGasPrice": "0x1", + "from": "0x81d9be695571458d72120d91e1b9333f844815cf", + "to": null, + "contractAddress": "0xe73dfe3145ccaedab2be675b0bf42e9af39302ac" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x4a72d", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0xf1458c8e0fb6f2983ebee502021786da477262f54117cb6f7002f3886bb5198a", + "transactionIndex": "0x0", + "blockHash": "0x82dde690c16454fdb1d7b99d908c983200aa3d89f1a1fbb97be5b3da7d512d7a", + "blockNumber": "0x2", + "gasUsed": "0x4a72d", + "effectiveGasPrice": "0x346bf1ee", + "blobGasPrice": "0x1", + "from": "0x81d9be695571458d72120d91e1b9333f844815cf", + "to": null, + "contractAddress": "0x4145fb426b113340f34210cb6e24e21df5701ce9" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x31e83", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x1216e91500b41da940589deba3958ccbf6a39f077978e30d1e725f8d5653842a", + "transactionIndex": "0x0", + "blockHash": "0x9ffcb068b4d446cc808c702cac53163cf0d69b2d991c26ae7ee08503832f029e", + "blockNumber": "0x3", + "gasUsed": "0x31e83", + "effectiveGasPrice": "0x2e008dea", + "blobGasPrice": "0x1", + "from": "0x81d9be695571458d72120d91e1b9333f844815cf", + "to": null, + "contractAddress": "0x1e529ba1c9bc734647403f7c74134b7bccfc9142" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1734817307, + "chain": 31337, + "commit": "fc875fd" +} \ No newline at end of file diff --git a/broadcast/MockSetup.s.sol/31337/run-1734821248.json b/broadcast/MockSetup.s.sol/31337/run-1734821248.json new file mode 100644 index 0000000..6811b01 --- /dev/null +++ b/broadcast/MockSetup.s.sol/31337/run-1734821248.json @@ -0,0 +1,99 @@ +{ + "transactions": [ + { + "hash": "0xda0f7e96d5154a46c69bd664eabe58c7921f5860eb60b0e06f30e1196ccaf56e", + "transactionType": "CREATE", + "contractName": "AccountingToken", + "contractAddress": "0xb58192974a93b9143ef5f91ab8b0545092b65803", + "function": null, + "arguments": null, + "transaction": { + "from": "0x81d9be695571458d72120d91e1b9333f844815cf", + "gas": "0xaafcc", + "value": "0x0", + "input": "0x608060405234801561000f575f5ffd5b5061001c6006600a610189565b61002b9064e8d4a5100061019e565b335f81815260208190526040812092909255907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef61006b6006600a610189565b61007a9064e8d4a5100061019e565b60405190815260200160405180910390a36101b5565b634e487b7160e01b5f52601160045260245ffd5b6001815b60018411156100df578085048111156100c3576100c3610090565b60018416156100d157908102905b60019390931c9280026100a8565b935093915050565b5f826100f557506001610183565b8161010157505f610183565b816001811461011757600281146101215761013d565b6001915050610183565b60ff84111561013257610132610090565b50506001821b610183565b5060208310610133831016604e8410600b8410161715610160575081810a610183565b61016c5f1984846100a4565b805f190482111561017f5761017f610090565b0290505b92915050565b5f61019760ff8416836100e7565b9392505050565b808202811582820484141761018357610183610090565b610834806101c25f395ff3fe608060405234801561000f575f5ffd5b50600436106100cb575f3560e01c8063313ce56711610088578063a3f4df7e11610063578063a3f4df7e146101a9578063a9059cbb146101b1578063dd62ed3e146101c4578063f76f8d78146101fc575f5ffd5b8063313ce5671461015b57806370a082311461016257806395d89b411461018a575f5ffd5b806306fdde03146100cf578063095ea7b3146100ed57806318160ddd1461011057806323b872dd146101265780632e0f2625146101395780632ff2e9dc14610153575b5f5ffd5b6100d761021e565b6040516100e49190610598565b60405180910390f35b6101006100fb3660046105e8565b61023e565b60405190151581526020016100e4565b6101186102aa565b6040519081526020016100e4565b610100610134366004610610565b6102cb565b610141600681565b60405160ff90911681526020016100e4565b61011861047d565b6006610141565b61011861017036600461064a565b6001600160a01b03165f9081526020819052604090205490565b6040805180820190915260038152624c434160e81b60208201526100d7565b6100d761049b565b6101006101bf3660046105e8565b6104b7565b6101186101d236600461066a565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b6100d7604051806040016040528060038152602001624c434160e81b81525081565b60606040518060600160405280602181526020016107de60219139905090565b335f8181526001602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906102989086815260200190565b60405180910390a35060015b92915050565b5f6102b76006600a610792565b6102c69064e8d4a510006107a0565b905090565b6001600160a01b0383165f9081526020819052604081205482111561032e5760405162461bcd60e51b8152602060048201526014602482015273496e73756666696369656e742062616c616e636560601b60448201526064015b60405180910390fd5b6001600160a01b0384165f9081526001602090815260408083203384529091529020548211156103955760405162461bcd60e51b8152602060048201526012602482015271105b1b1bddd85b98d948195e18d95959195960721b6044820152606401610325565b6001600160a01b0384165f908152600160209081526040808320338452909152812080548492906103c79084906107b7565b90915550506001600160a01b0384165f90815260208190526040812080548492906103f39084906107b7565b90915550506001600160a01b0383165f908152602081905260408120805484929061041f9084906107ca565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161046b91815260200190565b60405180910390a35060019392505050565b6104896006600a610792565b6104989064e8d4a510006107a0565b81565b6040518060600160405280602181526020016107de6021913981565b335f9081526020819052604081205482111561050c5760405162461bcd60e51b8152602060048201526014602482015273496e73756666696369656e742062616c616e636560601b6044820152606401610325565b335f908152602081905260408120805484929061052a9084906107b7565b90915550506001600160a01b0383165f90815260208190526040812080548492906105569084906107ca565b90915550506040518281526001600160a01b0384169033907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001610298565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b80356001600160a01b03811681146105e3575f5ffd5b919050565b5f5f604083850312156105f9575f5ffd5b610602836105cd565b946020939093013593505050565b5f5f5f60608486031215610622575f5ffd5b61062b846105cd565b9250610639602085016105cd565b929592945050506040919091013590565b5f6020828403121561065a575f5ffd5b610663826105cd565b9392505050565b5f5f6040838503121561067b575f5ffd5b610684836105cd565b9150610692602084016105cd565b90509250929050565b634e487b7160e01b5f52601160045260245ffd5b6001815b60018411156106ea578085048111156106ce576106ce61069b565b60018416156106dc57908102905b60019390931c9280026106b3565b935093915050565b5f82610700575060016102a4565b8161070c57505f6102a4565b8160018114610722576002811461072c57610748565b60019150506102a4565b60ff84111561073d5761073d61069b565b50506001821b6102a4565b5060208310610133831016604e8410600b841016171561076b575081810a6102a4565b6107775f1984846106af565b805f190482111561078a5761078a61069b565b029392505050565b5f61066360ff8416836106f2565b80820281158282048414176102a4576102a461069b565b818103818111156102a4576102a461069b565b808201808211156102a4576102a461069b56fe4c6f63616c2043757272656e637920284163636f756e74696e6720546f6b656e29a26469706673582212208301450dcb126b11a3dc2e96393265aef347371e8459c3cf42aa78b943f0936064736f6c634300081b0033", + "nonce": "0x3", + "chainId": "0x7a69" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x11c260236485227c0776b4a7a2d5304c795f802de512e8e3be951aaeaefef3e4", + "transactionType": "CREATE", + "contractName": "CropProduct", + "contractAddress": "0xda0b2cf6b65a98d06cd77212509537dd166a19ce", + "function": null, + "arguments": null, + "transaction": { + "from": "0x81d9be695571458d72120d91e1b9333f844815cf", + "gas": "0x8d450", + "value": "0x0", + "input": "0x6080604052600180546001600160601b031916620187051790553480156023575f5ffd5b506106ac806100315f395ff3fe608060405234801561000f575f5ffd5b50600436106100a6575f3560e01c80637f73fa9c1161006e5780637f73fa9c1461016f578063a9dbaf2514610180578063b11a19e8146101a1578063bb313321146101c1578063cdc23e69146101d4578063f1338cda146101e7575f5ffd5b80630228ec7b146100aa5780632a6f8ef2146100db578063422e9f411461010a578063694ac999146101355780636f336d7c14610157575b5f5ffd5b6100bd6100b836600461036d565b6101ef565b6040516001600160c01b031990911681526020015b60405180910390f35b6100f16100e93660046103c3565b5f9392505050565b60405167ffffffffffffffff90911681526020016100d2565b61011d610118366004610412565b610259565b6040516001600160601b0390911681526020016100d2565b6100bd610143366004610482565b5f9081526002602052604090205460c01b90565b61016d6101653660046104aa565b505050505050565b005b61016d61017d366004610482565b50565b61019361018e366004610482565b6102a4565b6040519081526020016100d2565b6101b46101af366004610482565b6102d1565b6040516100d291906104fe565b60015461011d906001600160601b031681565b6101936101e2366004610547565b61030e565b6101935f5481565b5f805481806101fd8361060e565b91905055505f5460405160200161021691815260200190565b60408051808303601f1901815291815281516020928301205f9889526002909252909620805467ffffffffffffffff191660c088901c1790555093949350505050565b600180545f916001600160601b03909116908261027583610626565b82546101009290920a6001600160601b0381810219909316918316021790915560015416979650505050505050565b5f60ff8216601f8111156102cb57604051632cd44ac360e21b815260040160405180910390fd5b92915050565b60605f6102dd836102a4565b6040805160208082528183019092529192505f91906020820181803683375050509182525060208101929092525090565b5f5f829050601f81511115610341578260405163305a27a960e01b815260040161033891906104fe565b60405180910390fd5b805161034c82610650565b179392505050565b803564ffffffffff81168114610368575f5ffd5b919050565b5f5f5f5f5f60a08688031215610381575f5ffd5b853594506020860135935060408601359250606086013591506103a660808701610354565b90509295509295909350565b8035600381900b8114610368575f5ffd5b5f5f5f606084860312156103d5575f5ffd5b833592506103e5602085016103b2565b91506103f3604085016103b2565b90509250925092565b80356001600160601b0381168114610368575f5ffd5b5f5f5f5f5f60a08688031215610426575f5ffd5b85356001600160a01b038116811461043c575f5ffd5b945060208601356001600160c01b031981168114610458575f5ffd5b935061046660408701610354565b9250610474606087016103fc565b91506103a6608087016103fc565b5f60208284031215610492575f5ffd5b5035919050565b803561ffff81168114610368575f5ffd5b5f5f5f5f5f5f60c087890312156104bf575f5ffd5b863595506104cf60208801610499565b94506040870135935060608701359250608087013591506104f260a08801610499565b90509295509295509295565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b634e487b7160e01b5f52604160045260245ffd5b5f60208284031215610557575f5ffd5b813567ffffffffffffffff81111561056d575f5ffd5b8201601f8101841361057d575f5ffd5b803567ffffffffffffffff81111561059757610597610533565b604051601f8201601f19908116603f0116810167ffffffffffffffff811182821017156105c6576105c6610533565b6040528181528282016020018610156105dd575f5ffd5b816020840160208301375f91810160200191909152949350505050565b634e487b7160e01b5f52601160045260245ffd5b5f6001820161061f5761061f6105fa565b5060010190565b5f6001600160601b0382166001600160601b038103610647576106476105fa565b60010192915050565b80516020808301519190811015610670575f198160200360031b1b821691505b5091905056fea264697066735822122051bed4073dfe5589858199a2cd7aea98b2620a7b4f8f5461f9c90eb8a1ee51fd64736f6c634300081b0033", + "nonce": "0x4", + "chainId": "0x7a69" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "status": "0x1", + "cumulativeGasUsed": "0x83876", + "logs": [ + { + "address": "0xb58192974a93b9143ef5f91ab8b0545092b65803", + "topics": [ + "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x00000000000000000000000081d9be695571458d72120d91e1b9333f844815cf" + ], + "data": "0x0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "blockHash": "0xce5d7733f213c589b6ad005bcd0cbd5e5f007d33c6d7ff254e39ae75fe8ef852", + "blockNumber": "0x4", + "blockTimestamp": "0x67674580", + "transactionHash": "0xda0f7e96d5154a46c69bd664eabe58c7921f5860eb60b0e06f30e1196ccaf56e", + "transactionIndex": "0x0", + "logIndex": "0x0", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000008000000000000000000000000000000000000000000000000020000000000000000000800000000000000000800000010000000000000000000000000000000000000000020000000000000000800000000000000000000000000000000000000000010000000000000000000000000020000000000000002000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0xda0f7e96d5154a46c69bd664eabe58c7921f5860eb60b0e06f30e1196ccaf56e", + "transactionIndex": "0x0", + "blockHash": "0xce5d7733f213c589b6ad005bcd0cbd5e5f007d33c6d7ff254e39ae75fe8ef852", + "blockNumber": "0x4", + "gasUsed": "0x83876", + "effectiveGasPrice": "0x28548bdc", + "blobGasPrice": "0x1", + "from": "0x81d9be695571458d72120d91e1b9333f844815cf", + "to": null, + "contractAddress": "0xb58192974a93b9143ef5f91ab8b0545092b65803" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x6cab4", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x11c260236485227c0776b4a7a2d5304c795f802de512e8e3be951aaeaefef3e4", + "transactionIndex": "0x0", + "blockHash": "0x7afc2302ddc4fee39db8632ac1755b3e7bbee963d42f54869e4668f77b245c99", + "blockNumber": "0x5", + "gasUsed": "0x6cab4", + "effectiveGasPrice": "0x2378548c", + "blobGasPrice": "0x1", + "from": "0x81d9be695571458d72120d91e1b9333f844815cf", + "to": null, + "contractAddress": "0xda0b2cf6b65a98d06cd77212509537dd166a19ce" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1734821248, + "chain": 31337, + "commit": "fc875fd" +} \ No newline at end of file diff --git a/broadcast/MockSetup.s.sol/31337/run-latest.json b/broadcast/MockSetup.s.sol/31337/run-latest.json index f227455..6811b01 100644 --- a/broadcast/MockSetup.s.sol/31337/run-latest.json +++ b/broadcast/MockSetup.s.sol/31337/run-latest.json @@ -1,36 +1,36 @@ { "transactions": [ { - "hash": "0x6c6b750127685150e2034952e637db92a406df92ac13078d3bfc8bb60fef2849", + "hash": "0xda0f7e96d5154a46c69bd664eabe58c7921f5860eb60b0e06f30e1196ccaf56e", "transactionType": "CREATE", "contractName": "AccountingToken", - "contractAddress": "0x7a2e477883bd134637a2ed18f84babd71b9bb4e1", + "contractAddress": "0xb58192974a93b9143ef5f91ab8b0545092b65803", "function": null, "arguments": null, "transaction": { - "from": "0xb4f15c0e3155e5418c4557de16526a597e68c4bf", + "from": "0x81d9be695571458d72120d91e1b9333f844815cf", "gas": "0xaafcc", "value": "0x0", "input": "0x608060405234801561000f575f5ffd5b5061001c6006600a610189565b61002b9064e8d4a5100061019e565b335f81815260208190526040812092909255907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef61006b6006600a610189565b61007a9064e8d4a5100061019e565b60405190815260200160405180910390a36101b5565b634e487b7160e01b5f52601160045260245ffd5b6001815b60018411156100df578085048111156100c3576100c3610090565b60018416156100d157908102905b60019390931c9280026100a8565b935093915050565b5f826100f557506001610183565b8161010157505f610183565b816001811461011757600281146101215761013d565b6001915050610183565b60ff84111561013257610132610090565b50506001821b610183565b5060208310610133831016604e8410600b8410161715610160575081810a610183565b61016c5f1984846100a4565b805f190482111561017f5761017f610090565b0290505b92915050565b5f61019760ff8416836100e7565b9392505050565b808202811582820484141761018357610183610090565b610834806101c25f395ff3fe608060405234801561000f575f5ffd5b50600436106100cb575f3560e01c8063313ce56711610088578063a3f4df7e11610063578063a3f4df7e146101a9578063a9059cbb146101b1578063dd62ed3e146101c4578063f76f8d78146101fc575f5ffd5b8063313ce5671461015b57806370a082311461016257806395d89b411461018a575f5ffd5b806306fdde03146100cf578063095ea7b3146100ed57806318160ddd1461011057806323b872dd146101265780632e0f2625146101395780632ff2e9dc14610153575b5f5ffd5b6100d761021e565b6040516100e49190610598565b60405180910390f35b6101006100fb3660046105e8565b61023e565b60405190151581526020016100e4565b6101186102aa565b6040519081526020016100e4565b610100610134366004610610565b6102cb565b610141600681565b60405160ff90911681526020016100e4565b61011861047d565b6006610141565b61011861017036600461064a565b6001600160a01b03165f9081526020819052604090205490565b6040805180820190915260038152624c434160e81b60208201526100d7565b6100d761049b565b6101006101bf3660046105e8565b6104b7565b6101186101d236600461066a565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b6100d7604051806040016040528060038152602001624c434160e81b81525081565b60606040518060600160405280602181526020016107de60219139905090565b335f8181526001602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906102989086815260200190565b60405180910390a35060015b92915050565b5f6102b76006600a610792565b6102c69064e8d4a510006107a0565b905090565b6001600160a01b0383165f9081526020819052604081205482111561032e5760405162461bcd60e51b8152602060048201526014602482015273496e73756666696369656e742062616c616e636560601b60448201526064015b60405180910390fd5b6001600160a01b0384165f9081526001602090815260408083203384529091529020548211156103955760405162461bcd60e51b8152602060048201526012602482015271105b1b1bddd85b98d948195e18d95959195960721b6044820152606401610325565b6001600160a01b0384165f908152600160209081526040808320338452909152812080548492906103c79084906107b7565b90915550506001600160a01b0384165f90815260208190526040812080548492906103f39084906107b7565b90915550506001600160a01b0383165f908152602081905260408120805484929061041f9084906107ca565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161046b91815260200190565b60405180910390a35060019392505050565b6104896006600a610792565b6104989064e8d4a510006107a0565b81565b6040518060600160405280602181526020016107de6021913981565b335f9081526020819052604081205482111561050c5760405162461bcd60e51b8152602060048201526014602482015273496e73756666696369656e742062616c616e636560601b6044820152606401610325565b335f908152602081905260408120805484929061052a9084906107b7565b90915550506001600160a01b0383165f90815260208190526040812080548492906105569084906107ca565b90915550506040518281526001600160a01b0384169033907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001610298565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b80356001600160a01b03811681146105e3575f5ffd5b919050565b5f5f604083850312156105f9575f5ffd5b610602836105cd565b946020939093013593505050565b5f5f5f60608486031215610622575f5ffd5b61062b846105cd565b9250610639602085016105cd565b929592945050506040919091013590565b5f6020828403121561065a575f5ffd5b610663826105cd565b9392505050565b5f5f6040838503121561067b575f5ffd5b610684836105cd565b9150610692602084016105cd565b90509250929050565b634e487b7160e01b5f52601160045260245ffd5b6001815b60018411156106ea578085048111156106ce576106ce61069b565b60018416156106dc57908102905b60019390931c9280026106b3565b935093915050565b5f82610700575060016102a4565b8161070c57505f6102a4565b8160018114610722576002811461072c57610748565b60019150506102a4565b60ff84111561073d5761073d61069b565b50506001821b6102a4565b5060208310610133831016604e8410600b841016171561076b575081810a6102a4565b6107775f1984846106af565b805f190482111561078a5761078a61069b565b029392505050565b5f61066360ff8416836106f2565b80820281158282048414176102a4576102a461069b565b818103818111156102a4576102a461069b565b808201808211156102a4576102a461069b56fe4c6f63616c2043757272656e637920284163636f756e74696e6720546f6b656e29a26469706673582212208301450dcb126b11a3dc2e96393265aef347371e8459c3cf42aa78b943f0936064736f6c634300081b0033", - "nonce": "0x1", + "nonce": "0x3", "chainId": "0x7a69" }, "additionalContracts": [], "isFixedGasLimit": false }, { - "hash": "0x5cbb29e8aebe821418555c52b8aa50c8b054f615d5fe5c1f395e6bd1379f86a9", + "hash": "0x11c260236485227c0776b4a7a2d5304c795f802de512e8e3be951aaeaefef3e4", "transactionType": "CREATE", "contractName": "CropProduct", - "contractAddress": "0x7ec142adf4c5a19dfa282f5b6d44d997c8747ba0", + "contractAddress": "0xda0b2cf6b65a98d06cd77212509537dd166a19ce", "function": null, "arguments": null, "transaction": { - "from": "0xb4f15c0e3155e5418c4557de16526a597e68c4bf", - "gas": "0x4097e", + "from": "0x81d9be695571458d72120d91e1b9333f844815cf", + "gas": "0x8d450", "value": "0x0", - "input": "0x6080604052348015600e575f5ffd5b506102b78061001c5f395ff3fe608060405234801561000f575f5ffd5b5060043610610055575f3560e01c80630228ec7b146100595780632a6f8ef21461008a5780636f336d7c146100b95780637f73fa9c146100d1578063f1338cda146100e2575b5f5ffd5b61006c610067366004610140565b6100f8565b6040516001600160c01b031990911681526020015b60405180910390f35b6100a06100983660046101a8565b5f9392505050565b60405167ffffffffffffffff9091168152602001610081565b6100cf6100c73660046101f2565b505050505050565b005b6100cf6100df366004610246565b50565b6100ea5f5481565b604051908152602001610081565b5f805481806101068361025d565b91905055505f5460405160200161011f91815260200190565b60405160208183030381529060405280519060200120905095945050505050565b5f5f5f5f5f60a08688031215610154575f5ffd5b85359450602086013593506040860135925060608601359150608086013564ffffffffff81168114610184575f5ffd5b809150509295509295909350565b8035600381900b81146101a3575f5ffd5b919050565b5f5f5f606084860312156101ba575f5ffd5b833592506101ca60208501610192565b91506101d860408501610192565b90509250925092565b803561ffff811681146101a3575f5ffd5b5f5f5f5f5f5f60c08789031215610207575f5ffd5b86359550610217602088016101e1565b945060408701359350606087013592506080870135915061023a60a088016101e1565b90509295509295509295565b5f60208284031215610256575f5ffd5b5035919050565b5f6001820161027a57634e487b7160e01b5f52601160045260245ffd5b506001019056fea26469706673582212209237c5db988c7ef7ec441144fad6bffc5bab5d7d802c5708102847221fe63e1864736f6c634300081b0033", - "nonce": "0x2", + "input": "0x6080604052600180546001600160601b031916620187051790553480156023575f5ffd5b506106ac806100315f395ff3fe608060405234801561000f575f5ffd5b50600436106100a6575f3560e01c80637f73fa9c1161006e5780637f73fa9c1461016f578063a9dbaf2514610180578063b11a19e8146101a1578063bb313321146101c1578063cdc23e69146101d4578063f1338cda146101e7575f5ffd5b80630228ec7b146100aa5780632a6f8ef2146100db578063422e9f411461010a578063694ac999146101355780636f336d7c14610157575b5f5ffd5b6100bd6100b836600461036d565b6101ef565b6040516001600160c01b031990911681526020015b60405180910390f35b6100f16100e93660046103c3565b5f9392505050565b60405167ffffffffffffffff90911681526020016100d2565b61011d610118366004610412565b610259565b6040516001600160601b0390911681526020016100d2565b6100bd610143366004610482565b5f9081526002602052604090205460c01b90565b61016d6101653660046104aa565b505050505050565b005b61016d61017d366004610482565b50565b61019361018e366004610482565b6102a4565b6040519081526020016100d2565b6101b46101af366004610482565b6102d1565b6040516100d291906104fe565b60015461011d906001600160601b031681565b6101936101e2366004610547565b61030e565b6101935f5481565b5f805481806101fd8361060e565b91905055505f5460405160200161021691815260200190565b60408051808303601f1901815291815281516020928301205f9889526002909252909620805467ffffffffffffffff191660c088901c1790555093949350505050565b600180545f916001600160601b03909116908261027583610626565b82546101009290920a6001600160601b0381810219909316918316021790915560015416979650505050505050565b5f60ff8216601f8111156102cb57604051632cd44ac360e21b815260040160405180910390fd5b92915050565b60605f6102dd836102a4565b6040805160208082528183019092529192505f91906020820181803683375050509182525060208101929092525090565b5f5f829050601f81511115610341578260405163305a27a960e01b815260040161033891906104fe565b60405180910390fd5b805161034c82610650565b179392505050565b803564ffffffffff81168114610368575f5ffd5b919050565b5f5f5f5f5f60a08688031215610381575f5ffd5b853594506020860135935060408601359250606086013591506103a660808701610354565b90509295509295909350565b8035600381900b8114610368575f5ffd5b5f5f5f606084860312156103d5575f5ffd5b833592506103e5602085016103b2565b91506103f3604085016103b2565b90509250925092565b80356001600160601b0381168114610368575f5ffd5b5f5f5f5f5f60a08688031215610426575f5ffd5b85356001600160a01b038116811461043c575f5ffd5b945060208601356001600160c01b031981168114610458575f5ffd5b935061046660408701610354565b9250610474606087016103fc565b91506103a6608087016103fc565b5f60208284031215610492575f5ffd5b5035919050565b803561ffff81168114610368575f5ffd5b5f5f5f5f5f5f60c087890312156104bf575f5ffd5b863595506104cf60208801610499565b94506040870135935060608701359250608087013591506104f260a08801610499565b90509295509295509295565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b634e487b7160e01b5f52604160045260245ffd5b5f60208284031215610557575f5ffd5b813567ffffffffffffffff81111561056d575f5ffd5b8201601f8101841361057d575f5ffd5b803567ffffffffffffffff81111561059757610597610533565b604051601f8201601f19908116603f0116810167ffffffffffffffff811182821017156105c6576105c6610533565b6040528181528282016020018610156105dd575f5ffd5b816020840160208301375f91810160200191909152949350505050565b634e487b7160e01b5f52601160045260245ffd5b5f6001820161061f5761061f6105fa565b5060010190565b5f6001600160601b0382166001600160601b038103610647576106476105fa565b60010192915050565b80516020808301519190811015610670575f198160200360031b1b821691505b5091905056fea264697066735822122051bed4073dfe5589858199a2cd7aea98b2620a7b4f8f5461f9c90eb8a1ee51fd64736f6c634300081b0033", + "nonce": "0x4", "chainId": "0x7a69" }, "additionalContracts": [], @@ -43,57 +43,57 @@ "cumulativeGasUsed": "0x83876", "logs": [ { - "address": "0x7a2e477883bd134637a2ed18f84babd71b9bb4e1", + "address": "0xb58192974a93b9143ef5f91ab8b0545092b65803", "topics": [ "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x000000000000000000000000b4f15c0e3155e5418c4557de16526a597e68c4bf" + "0x00000000000000000000000081d9be695571458d72120d91e1b9333f844815cf" ], "data": "0x0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "blockHash": "0xba448c5573c9ee48a25d430e0c3925bae366c82f9a31895b51a3247e6fcf7c33", - "blockNumber": "0x2", - "blockTimestamp": "0x6766bf38", - "transactionHash": "0x6c6b750127685150e2034952e637db92a406df92ac13078d3bfc8bb60fef2849", + "blockHash": "0xce5d7733f213c589b6ad005bcd0cbd5e5f007d33c6d7ff254e39ae75fe8ef852", + "blockNumber": "0x4", + "blockTimestamp": "0x67674580", + "transactionHash": "0xda0f7e96d5154a46c69bd664eabe58c7921f5860eb60b0e06f30e1196ccaf56e", "transactionIndex": "0x0", "logIndex": "0x0", "removed": false } ], - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000020000000400020000000000000000000800000000000000000000000010000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000002000000000000000000000000000000000000000000000000000020000000000000000000000000000000000200000000000000000000000000000000", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000008000000000000000000000000000000000000000000000000020000000000000000000800000000000000000800000010000000000000000000000000000000000000000020000000000000000800000000000000000000000000000000000000000010000000000000000000000000020000000000000002000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000", "type": "0x2", - "transactionHash": "0x6c6b750127685150e2034952e637db92a406df92ac13078d3bfc8bb60fef2849", + "transactionHash": "0xda0f7e96d5154a46c69bd664eabe58c7921f5860eb60b0e06f30e1196ccaf56e", "transactionIndex": "0x0", - "blockHash": "0xba448c5573c9ee48a25d430e0c3925bae366c82f9a31895b51a3247e6fcf7c33", - "blockNumber": "0x2", + "blockHash": "0xce5d7733f213c589b6ad005bcd0cbd5e5f007d33c6d7ff254e39ae75fe8ef852", + "blockNumber": "0x4", "gasUsed": "0x83876", - "effectiveGasPrice": "0x344151b9", + "effectiveGasPrice": "0x28548bdc", "blobGasPrice": "0x1", - "from": "0xb4f15c0e3155e5418c4557de16526a597e68c4bf", + "from": "0x81d9be695571458d72120d91e1b9333f844815cf", "to": null, - "contractAddress": "0x7a2e477883bd134637a2ed18f84babd71b9bb4e1" + "contractAddress": "0xb58192974a93b9143ef5f91ab8b0545092b65803" }, { "status": "0x1", - "cumulativeGasUsed": "0x31aff", + "cumulativeGasUsed": "0x6cab4", "logs": [], "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "type": "0x2", - "transactionHash": "0x5cbb29e8aebe821418555c52b8aa50c8b054f615d5fe5c1f395e6bd1379f86a9", + "transactionHash": "0x11c260236485227c0776b4a7a2d5304c795f802de512e8e3be951aaeaefef3e4", "transactionIndex": "0x0", - "blockHash": "0x275f16ad11932c711ce65e67030ddcb82f0babe558f98ef63c22331b2bb76c87", - "blockNumber": "0x3", - "gasUsed": "0x31aff", - "effectiveGasPrice": "0x2df53648", + "blockHash": "0x7afc2302ddc4fee39db8632ac1755b3e7bbee963d42f54869e4668f77b245c99", + "blockNumber": "0x5", + "gasUsed": "0x6cab4", + "effectiveGasPrice": "0x2378548c", "blobGasPrice": "0x1", - "from": "0xb4f15c0e3155e5418c4557de16526a597e68c4bf", + "from": "0x81d9be695571458d72120d91e1b9333f844815cf", "to": null, - "contractAddress": "0x7ec142adf4c5a19dfa282f5b6d44d997c8747ba0" + "contractAddress": "0xda0b2cf6b65a98d06cd77212509537dd166a19ce" } ], "libraries": [], "pending": [], "returns": {}, - "timestamp": 1734786872, + "timestamp": 1734821248, "chain": 31337, - "commit": "62cfc1c" + "commit": "fc875fd" } \ No newline at end of file diff --git a/cache/MockSetup.s.sol/31337/run-1734793105.json b/cache/MockSetup.s.sol/31337/run-1734793105.json new file mode 100644 index 0000000..d8b58fe --- /dev/null +++ b/cache/MockSetup.s.sol/31337/run-1734793105.json @@ -0,0 +1,13 @@ +{ + "transactions": [ + { + "rpc": "http://127.0.0.1:8545" + }, + { + "rpc": "http://127.0.0.1:8545" + }, + { + "rpc": "http://127.0.0.1:8545" + } + ] +} \ No newline at end of file diff --git a/cache/MockSetup.s.sol/31337/run-1734817307.json b/cache/MockSetup.s.sol/31337/run-1734817307.json new file mode 100644 index 0000000..d8b58fe --- /dev/null +++ b/cache/MockSetup.s.sol/31337/run-1734817307.json @@ -0,0 +1,13 @@ +{ + "transactions": [ + { + "rpc": "http://127.0.0.1:8545" + }, + { + "rpc": "http://127.0.0.1:8545" + }, + { + "rpc": "http://127.0.0.1:8545" + } + ] +} \ No newline at end of file diff --git a/cache/MockSetup.s.sol/31337/run-1734821248.json b/cache/MockSetup.s.sol/31337/run-1734821248.json new file mode 100644 index 0000000..1cb3112 --- /dev/null +++ b/cache/MockSetup.s.sol/31337/run-1734821248.json @@ -0,0 +1,10 @@ +{ + "transactions": [ + { + "rpc": "http://127.0.0.1:8545" + }, + { + "rpc": "http://127.0.0.1:8545" + } + ] +} \ No newline at end of file diff --git a/cache/solidity-files-cache.json b/cache/solidity-files-cache.json index 1257aac..75a9220 100644 --- a/cache/solidity-files-cache.json +++ b/cache/solidity-files-cache.json @@ -1 +1 @@ -{"_format":"","paths":{"artifacts":"out","build_infos":"out/build-info","sources":"src","tests":"test","scripts":"script","libraries":["lib"]},"files":{"lib/forge-std/src/Base.sol":{"lastModificationDate":1734782986592,"contentHash":"ee13c050b1914464f1d3f90cde90204b","sourceName":"lib/forge-std/src/Base.sol","imports":["lib/forge-std/src/StdStorage.sol","lib/forge-std/src/Vm.sol"],"versionRequirement":">=0.6.2, <0.9.0","artifacts":{"CommonBase":{"0.8.27":{"default":{"path":"Base.sol/CommonBase.json","build_id":"ea14e9c0f62aae3e6768ad2da393d422"}}},"ScriptBase":{"0.8.27":{"default":{"path":"Base.sol/ScriptBase.json","build_id":"ea14e9c0f62aae3e6768ad2da393d422"}}},"TestBase":{"0.8.27":{"default":{"path":"Base.sol/TestBase.json","build_id":"ea14e9c0f62aae3e6768ad2da393d422"}}}},"seenByCompiler":true},"lib/forge-std/src/Script.sol":{"lastModificationDate":1734782986593,"contentHash":"ba325c778a7da8a21c2136aa32763c14","sourceName":"lib/forge-std/src/Script.sol","imports":["lib/forge-std/src/Base.sol","lib/forge-std/src/StdChains.sol","lib/forge-std/src/StdCheats.sol","lib/forge-std/src/StdJson.sol","lib/forge-std/src/StdMath.sol","lib/forge-std/src/StdStorage.sol","lib/forge-std/src/StdStyle.sol","lib/forge-std/src/StdUtils.sol","lib/forge-std/src/Vm.sol","lib/forge-std/src/console.sol","lib/forge-std/src/console2.sol","lib/forge-std/src/interfaces/IERC165.sol","lib/forge-std/src/interfaces/IERC20.sol","lib/forge-std/src/interfaces/IERC721.sol","lib/forge-std/src/interfaces/IMulticall3.sol","lib/forge-std/src/mocks/MockERC20.sol","lib/forge-std/src/mocks/MockERC721.sol","lib/forge-std/src/safeconsole.sol"],"versionRequirement":">=0.6.2, <0.9.0","artifacts":{"Script":{"0.8.27":{"default":{"path":"Script.sol/Script.json","build_id":"ea14e9c0f62aae3e6768ad2da393d422"}}}},"seenByCompiler":true},"lib/forge-std/src/StdChains.sol":{"lastModificationDate":1734782986594,"contentHash":"b039727c96bb3d5b9a59448fd16b1e0f","sourceName":"lib/forge-std/src/StdChains.sol","imports":["lib/forge-std/src/Vm.sol"],"versionRequirement":">=0.6.2, <0.9.0","artifacts":{"StdChains":{"0.8.27":{"default":{"path":"StdChains.sol/StdChains.json","build_id":"ea14e9c0f62aae3e6768ad2da393d422"}}}},"seenByCompiler":true},"lib/forge-std/src/StdCheats.sol":{"lastModificationDate":1734782986594,"contentHash":"3fd55234bae5fbb1510bf43268a9d781","sourceName":"lib/forge-std/src/StdCheats.sol","imports":["lib/forge-std/src/StdStorage.sol","lib/forge-std/src/Vm.sol","lib/forge-std/src/console.sol","lib/forge-std/src/console2.sol"],"versionRequirement":">=0.6.2, <0.9.0","artifacts":{"StdCheats":{"0.8.27":{"default":{"path":"StdCheats.sol/StdCheats.json","build_id":"ea14e9c0f62aae3e6768ad2da393d422"}}},"StdCheatsSafe":{"0.8.27":{"default":{"path":"StdCheats.sol/StdCheatsSafe.json","build_id":"ea14e9c0f62aae3e6768ad2da393d422"}}}},"seenByCompiler":true},"lib/forge-std/src/StdJson.sol":{"lastModificationDate":1734782986595,"contentHash":"02209da5708eaee03e24a9c24a687370","sourceName":"lib/forge-std/src/StdJson.sol","imports":["lib/forge-std/src/Vm.sol"],"versionRequirement":">=0.6.0, <0.9.0","artifacts":{"stdJson":{"0.8.27":{"default":{"path":"StdJson.sol/stdJson.json","build_id":"ea14e9c0f62aae3e6768ad2da393d422"}}}},"seenByCompiler":true},"lib/forge-std/src/StdMath.sol":{"lastModificationDate":1734782986595,"contentHash":"9da8f453eba6bb98f3d75bc6822bfb29","sourceName":"lib/forge-std/src/StdMath.sol","imports":[],"versionRequirement":">=0.6.2, <0.9.0","artifacts":{"stdMath":{"0.8.27":{"default":{"path":"StdMath.sol/stdMath.json","build_id":"ea14e9c0f62aae3e6768ad2da393d422"}}}},"seenByCompiler":true},"lib/forge-std/src/StdStorage.sol":{"lastModificationDate":1734782986596,"contentHash":"ce68f6e336944f16d31351a47d0b19b8","sourceName":"lib/forge-std/src/StdStorage.sol","imports":["lib/forge-std/src/Vm.sol"],"versionRequirement":">=0.6.2, <0.9.0","artifacts":{"stdStorage":{"0.8.27":{"default":{"path":"StdStorage.sol/stdStorage.json","build_id":"ea14e9c0f62aae3e6768ad2da393d422"}}},"stdStorageSafe":{"0.8.27":{"default":{"path":"StdStorage.sol/stdStorageSafe.json","build_id":"ea14e9c0f62aae3e6768ad2da393d422"}}}},"seenByCompiler":true},"lib/forge-std/src/StdStyle.sol":{"lastModificationDate":1734782986596,"contentHash":"6281165a12aa639705c691fccefd855e","sourceName":"lib/forge-std/src/StdStyle.sol","imports":["lib/forge-std/src/Vm.sol"],"versionRequirement":">=0.4.22, <0.9.0","artifacts":{"StdStyle":{"0.8.27":{"default":{"path":"StdStyle.sol/StdStyle.json","build_id":"ea14e9c0f62aae3e6768ad2da393d422"}}}},"seenByCompiler":true},"lib/forge-std/src/StdUtils.sol":{"lastModificationDate":1734782986596,"contentHash":"b50717f17f251a2a96a5884c90add7bf","sourceName":"lib/forge-std/src/StdUtils.sol","imports":["lib/forge-std/src/Vm.sol","lib/forge-std/src/interfaces/IERC165.sol","lib/forge-std/src/interfaces/IERC20.sol","lib/forge-std/src/interfaces/IERC721.sol","lib/forge-std/src/interfaces/IMulticall3.sol","lib/forge-std/src/mocks/MockERC20.sol","lib/forge-std/src/mocks/MockERC721.sol"],"versionRequirement":">=0.6.2, <0.9.0","artifacts":{"StdUtils":{"0.8.27":{"default":{"path":"StdUtils.sol/StdUtils.json","build_id":"ea14e9c0f62aae3e6768ad2da393d422"}}}},"seenByCompiler":true},"lib/forge-std/src/Vm.sol":{"lastModificationDate":1734782986597,"contentHash":"500473737c1f2c0908ce8ae528afc5e6","sourceName":"lib/forge-std/src/Vm.sol","imports":[],"versionRequirement":">=0.6.2, <0.9.0","artifacts":{"Vm":{"0.8.27":{"default":{"path":"Vm.sol/Vm.json","build_id":"ea14e9c0f62aae3e6768ad2da393d422"}}},"VmSafe":{"0.8.27":{"default":{"path":"Vm.sol/VmSafe.json","build_id":"ea14e9c0f62aae3e6768ad2da393d422"}}}},"seenByCompiler":true},"lib/forge-std/src/console.sol":{"lastModificationDate":1734782986598,"contentHash":"ce19a9e49945b42118379ff99d853c05","sourceName":"lib/forge-std/src/console.sol","imports":[],"versionRequirement":">=0.4.22, <0.9.0","artifacts":{"console":{"0.8.27":{"default":{"path":"console.sol/console.json","build_id":"ea14e9c0f62aae3e6768ad2da393d422"}}}},"seenByCompiler":true},"lib/forge-std/src/console2.sol":{"lastModificationDate":1734782986598,"contentHash":"f65ad21034b111e70fb5342d5771efcd","sourceName":"lib/forge-std/src/console2.sol","imports":["lib/forge-std/src/console.sol"],"versionRequirement":">=0.4.22, <0.9.0","artifacts":{},"seenByCompiler":true},"lib/forge-std/src/interfaces/IERC165.sol":{"lastModificationDate":1734782986599,"contentHash":"90fe5e2e3ed432d6f3b408e7c9e8a739","sourceName":"lib/forge-std/src/interfaces/IERC165.sol","imports":[],"versionRequirement":">=0.6.2","artifacts":{"IERC165":{"0.8.27":{"default":{"path":"IERC165.sol/IERC165.json","build_id":"ea14e9c0f62aae3e6768ad2da393d422"}}}},"seenByCompiler":true},"lib/forge-std/src/interfaces/IERC20.sol":{"lastModificationDate":1734782986599,"contentHash":"8099161d518e5862a76750349d58e801","sourceName":"lib/forge-std/src/interfaces/IERC20.sol","imports":[],"versionRequirement":">=0.6.2","artifacts":{"IERC20":{"0.8.27":{"default":{"path":"IERC20.sol/IERC20.json","build_id":"ea14e9c0f62aae3e6768ad2da393d422"}}}},"seenByCompiler":true},"lib/forge-std/src/interfaces/IERC721.sol":{"lastModificationDate":1734782986600,"contentHash":"efc26e7f9a2f76b68088c8760ceae2dc","sourceName":"lib/forge-std/src/interfaces/IERC721.sol","imports":["lib/forge-std/src/interfaces/IERC165.sol"],"versionRequirement":">=0.6.2","artifacts":{"IERC721":{"0.8.27":{"default":{"path":"IERC721.sol/IERC721.json","build_id":"ea14e9c0f62aae3e6768ad2da393d422"}}},"IERC721Enumerable":{"0.8.27":{"default":{"path":"IERC721.sol/IERC721Enumerable.json","build_id":"ea14e9c0f62aae3e6768ad2da393d422"}}},"IERC721Metadata":{"0.8.27":{"default":{"path":"IERC721.sol/IERC721Metadata.json","build_id":"ea14e9c0f62aae3e6768ad2da393d422"}}},"IERC721TokenReceiver":{"0.8.27":{"default":{"path":"IERC721.sol/IERC721TokenReceiver.json","build_id":"ea14e9c0f62aae3e6768ad2da393d422"}}}},"seenByCompiler":true},"lib/forge-std/src/interfaces/IMulticall3.sol":{"lastModificationDate":1734782986600,"contentHash":"7b131ca1ca32ef6378b7b9ad5488b901","sourceName":"lib/forge-std/src/interfaces/IMulticall3.sol","imports":[],"versionRequirement":">=0.6.2, <0.9.0","artifacts":{"IMulticall3":{"0.8.27":{"default":{"path":"IMulticall3.sol/IMulticall3.json","build_id":"ea14e9c0f62aae3e6768ad2da393d422"}}}},"seenByCompiler":true},"lib/forge-std/src/mocks/MockERC20.sol":{"lastModificationDate":1734782986601,"contentHash":"8e14d63e81e1d54dbc2d44df38ae9dec","sourceName":"lib/forge-std/src/mocks/MockERC20.sol","imports":["lib/forge-std/src/interfaces/IERC20.sol"],"versionRequirement":">=0.6.2, <0.9.0","artifacts":{"MockERC20":{"0.8.27":{"default":{"path":"MockERC20.sol/MockERC20.json","build_id":"ea14e9c0f62aae3e6768ad2da393d422"}}}},"seenByCompiler":true},"lib/forge-std/src/mocks/MockERC721.sol":{"lastModificationDate":1734782986601,"contentHash":"e91cd9dba7f88f03710c56a347d89d1e","sourceName":"lib/forge-std/src/mocks/MockERC721.sol","imports":["lib/forge-std/src/interfaces/IERC165.sol","lib/forge-std/src/interfaces/IERC721.sol"],"versionRequirement":">=0.6.2, <0.9.0","artifacts":{"MockERC721":{"0.8.27":{"default":{"path":"MockERC721.sol/MockERC721.json","build_id":"ea14e9c0f62aae3e6768ad2da393d422"}}}},"seenByCompiler":true},"lib/forge-std/src/safeconsole.sol":{"lastModificationDate":1734782986604,"contentHash":"1445aa2f47000e212173e0cefd6c7a77","sourceName":"lib/forge-std/src/safeconsole.sol","imports":[],"versionRequirement":">=0.6.2, <0.9.0","artifacts":{"safeconsole":{"0.8.27":{"default":{"path":"safeconsole.sol/safeconsole.json","build_id":"ea14e9c0f62aae3e6768ad2da393d422"}}}},"seenByCompiler":true},"script/MockSetup.s.sol":{"lastModificationDate":1734786832444,"contentHash":"440a0bbde6af2fe04d25fc6a53d2b9c4","sourceName":"script/MockSetup.s.sol","imports":["lib/forge-std/src/Base.sol","lib/forge-std/src/Script.sol","lib/forge-std/src/StdChains.sol","lib/forge-std/src/StdCheats.sol","lib/forge-std/src/StdJson.sol","lib/forge-std/src/StdMath.sol","lib/forge-std/src/StdStorage.sol","lib/forge-std/src/StdStyle.sol","lib/forge-std/src/StdUtils.sol","lib/forge-std/src/Vm.sol","lib/forge-std/src/console.sol","lib/forge-std/src/console2.sol","lib/forge-std/src/interfaces/IERC165.sol","lib/forge-std/src/interfaces/IERC20.sol","lib/forge-std/src/interfaces/IERC721.sol","lib/forge-std/src/interfaces/IMulticall3.sol","lib/forge-std/src/mocks/MockERC20.sol","lib/forge-std/src/mocks/MockERC721.sol","lib/forge-std/src/safeconsole.sol","src/AccountingToken.sol","src/CropProduct.sol","src/Types.sol"],"versionRequirement":"^0.8.13","artifacts":{"MocksSetupScript":{"0.8.27":{"default":{"path":"MockSetup.s.sol/MocksSetupScript.json","build_id":"ea14e9c0f62aae3e6768ad2da393d422"}}}},"seenByCompiler":true},"src/AccountingToken.sol":{"lastModificationDate":1734785561425,"contentHash":"0783af1bb03f21440a70056518429000","sourceName":"src/AccountingToken.sol","imports":[],"versionRequirement":"^0.8.20","artifacts":{"AccountingToken":{"0.8.27":{"default":{"path":"AccountingToken.sol/AccountingToken.json","build_id":"ea14e9c0f62aae3e6768ad2da393d422"}}}},"seenByCompiler":true},"src/CropProduct.sol":{"lastModificationDate":1734783819203,"contentHash":"9c385c4743cda9c33f73cd3ee97f2252","sourceName":"src/CropProduct.sol","imports":["src/Types.sol"],"versionRequirement":"^0.8.20","artifacts":{"CropProduct":{"0.8.27":{"default":{"path":"CropProduct.sol/CropProduct.json","build_id":"ea14e9c0f62aae3e6768ad2da393d422"}}}},"seenByCompiler":true},"src/Types.sol":{"lastModificationDate":1734782048871,"contentHash":"018cdf32c93462a7480c569961c81af9","sourceName":"src/Types.sol","imports":[],"versionRequirement":"^0.8.20","artifacts":{},"seenByCompiler":true}},"builds":["ea14e9c0f62aae3e6768ad2da393d422"],"profiles":{"default":{"solc":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode.object","evm.bytecode.sourceMap","evm.bytecode.linkReferences","evm.deployedBytecode.object","evm.deployedBytecode.sourceMap","evm.deployedBytecode.linkReferences","evm.deployedBytecode.immutableReferences","evm.methodIdentifiers","metadata"]}},"evmVersion":"cancun","viaIR":false,"libraries":{}},"vyper":{"evmVersion":"cancun","outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode"]}}}}}} \ No newline at end of file +{"_format":"","paths":{"artifacts":"out","build_infos":"out/build-info","sources":"src","tests":"test","scripts":"script","libraries":["lib"]},"files":{"lib/forge-std/src/Base.sol":{"lastModificationDate":1734782986592,"contentHash":"ee13c050b1914464f1d3f90cde90204b","sourceName":"lib/forge-std/src/Base.sol","imports":["lib/forge-std/src/StdStorage.sol","lib/forge-std/src/Vm.sol"],"versionRequirement":">=0.6.2, <0.9.0","artifacts":{"CommonBase":{"0.8.27":{"default":{"path":"Base.sol/CommonBase.json","build_id":"f5f536aad68759d99ce44c2ec623409c"}}},"ScriptBase":{"0.8.27":{"default":{"path":"Base.sol/ScriptBase.json","build_id":"f5f536aad68759d99ce44c2ec623409c"}}},"TestBase":{"0.8.27":{"default":{"path":"Base.sol/TestBase.json","build_id":"f5f536aad68759d99ce44c2ec623409c"}}}},"seenByCompiler":true},"lib/forge-std/src/Script.sol":{"lastModificationDate":1734782986593,"contentHash":"ba325c778a7da8a21c2136aa32763c14","sourceName":"lib/forge-std/src/Script.sol","imports":["lib/forge-std/src/Base.sol","lib/forge-std/src/StdChains.sol","lib/forge-std/src/StdCheats.sol","lib/forge-std/src/StdJson.sol","lib/forge-std/src/StdMath.sol","lib/forge-std/src/StdStorage.sol","lib/forge-std/src/StdStyle.sol","lib/forge-std/src/StdUtils.sol","lib/forge-std/src/Vm.sol","lib/forge-std/src/console.sol","lib/forge-std/src/console2.sol","lib/forge-std/src/interfaces/IERC165.sol","lib/forge-std/src/interfaces/IERC20.sol","lib/forge-std/src/interfaces/IERC721.sol","lib/forge-std/src/interfaces/IMulticall3.sol","lib/forge-std/src/mocks/MockERC20.sol","lib/forge-std/src/mocks/MockERC721.sol","lib/forge-std/src/safeconsole.sol"],"versionRequirement":">=0.6.2, <0.9.0","artifacts":{"Script":{"0.8.27":{"default":{"path":"Script.sol/Script.json","build_id":"f5f536aad68759d99ce44c2ec623409c"}}}},"seenByCompiler":true},"lib/forge-std/src/StdChains.sol":{"lastModificationDate":1734782986594,"contentHash":"b039727c96bb3d5b9a59448fd16b1e0f","sourceName":"lib/forge-std/src/StdChains.sol","imports":["lib/forge-std/src/Vm.sol"],"versionRequirement":">=0.6.2, <0.9.0","artifacts":{"StdChains":{"0.8.27":{"default":{"path":"StdChains.sol/StdChains.json","build_id":"f5f536aad68759d99ce44c2ec623409c"}}}},"seenByCompiler":true},"lib/forge-std/src/StdCheats.sol":{"lastModificationDate":1734782986594,"contentHash":"3fd55234bae5fbb1510bf43268a9d781","sourceName":"lib/forge-std/src/StdCheats.sol","imports":["lib/forge-std/src/StdStorage.sol","lib/forge-std/src/Vm.sol","lib/forge-std/src/console.sol","lib/forge-std/src/console2.sol"],"versionRequirement":">=0.6.2, <0.9.0","artifacts":{"StdCheats":{"0.8.27":{"default":{"path":"StdCheats.sol/StdCheats.json","build_id":"f5f536aad68759d99ce44c2ec623409c"}}},"StdCheatsSafe":{"0.8.27":{"default":{"path":"StdCheats.sol/StdCheatsSafe.json","build_id":"f5f536aad68759d99ce44c2ec623409c"}}}},"seenByCompiler":true},"lib/forge-std/src/StdJson.sol":{"lastModificationDate":1734782986595,"contentHash":"02209da5708eaee03e24a9c24a687370","sourceName":"lib/forge-std/src/StdJson.sol","imports":["lib/forge-std/src/Vm.sol"],"versionRequirement":">=0.6.0, <0.9.0","artifacts":{"stdJson":{"0.8.27":{"default":{"path":"StdJson.sol/stdJson.json","build_id":"f5f536aad68759d99ce44c2ec623409c"}}}},"seenByCompiler":true},"lib/forge-std/src/StdMath.sol":{"lastModificationDate":1734782986595,"contentHash":"9da8f453eba6bb98f3d75bc6822bfb29","sourceName":"lib/forge-std/src/StdMath.sol","imports":[],"versionRequirement":">=0.6.2, <0.9.0","artifacts":{"stdMath":{"0.8.27":{"default":{"path":"StdMath.sol/stdMath.json","build_id":"f5f536aad68759d99ce44c2ec623409c"}}}},"seenByCompiler":true},"lib/forge-std/src/StdStorage.sol":{"lastModificationDate":1734782986596,"contentHash":"ce68f6e336944f16d31351a47d0b19b8","sourceName":"lib/forge-std/src/StdStorage.sol","imports":["lib/forge-std/src/Vm.sol"],"versionRequirement":">=0.6.2, <0.9.0","artifacts":{"stdStorage":{"0.8.27":{"default":{"path":"StdStorage.sol/stdStorage.json","build_id":"f5f536aad68759d99ce44c2ec623409c"}}},"stdStorageSafe":{"0.8.27":{"default":{"path":"StdStorage.sol/stdStorageSafe.json","build_id":"f5f536aad68759d99ce44c2ec623409c"}}}},"seenByCompiler":true},"lib/forge-std/src/StdStyle.sol":{"lastModificationDate":1734782986596,"contentHash":"6281165a12aa639705c691fccefd855e","sourceName":"lib/forge-std/src/StdStyle.sol","imports":["lib/forge-std/src/Vm.sol"],"versionRequirement":">=0.4.22, <0.9.0","artifacts":{"StdStyle":{"0.8.27":{"default":{"path":"StdStyle.sol/StdStyle.json","build_id":"f5f536aad68759d99ce44c2ec623409c"}}}},"seenByCompiler":true},"lib/forge-std/src/StdUtils.sol":{"lastModificationDate":1734782986596,"contentHash":"b50717f17f251a2a96a5884c90add7bf","sourceName":"lib/forge-std/src/StdUtils.sol","imports":["lib/forge-std/src/Vm.sol","lib/forge-std/src/interfaces/IERC165.sol","lib/forge-std/src/interfaces/IERC20.sol","lib/forge-std/src/interfaces/IERC721.sol","lib/forge-std/src/interfaces/IMulticall3.sol","lib/forge-std/src/mocks/MockERC20.sol","lib/forge-std/src/mocks/MockERC721.sol"],"versionRequirement":">=0.6.2, <0.9.0","artifacts":{"StdUtils":{"0.8.27":{"default":{"path":"StdUtils.sol/StdUtils.json","build_id":"f5f536aad68759d99ce44c2ec623409c"}}}},"seenByCompiler":true},"lib/forge-std/src/Vm.sol":{"lastModificationDate":1734782986597,"contentHash":"500473737c1f2c0908ce8ae528afc5e6","sourceName":"lib/forge-std/src/Vm.sol","imports":[],"versionRequirement":">=0.6.2, <0.9.0","artifacts":{"Vm":{"0.8.27":{"default":{"path":"Vm.sol/Vm.json","build_id":"f5f536aad68759d99ce44c2ec623409c"}}},"VmSafe":{"0.8.27":{"default":{"path":"Vm.sol/VmSafe.json","build_id":"f5f536aad68759d99ce44c2ec623409c"}}}},"seenByCompiler":true},"lib/forge-std/src/console.sol":{"lastModificationDate":1734782986598,"contentHash":"ce19a9e49945b42118379ff99d853c05","sourceName":"lib/forge-std/src/console.sol","imports":[],"versionRequirement":">=0.4.22, <0.9.0","artifacts":{"console":{"0.8.27":{"default":{"path":"console.sol/console.json","build_id":"f5f536aad68759d99ce44c2ec623409c"}}}},"seenByCompiler":true},"lib/forge-std/src/console2.sol":{"lastModificationDate":1734782986598,"contentHash":"f65ad21034b111e70fb5342d5771efcd","sourceName":"lib/forge-std/src/console2.sol","imports":["lib/forge-std/src/console.sol"],"versionRequirement":">=0.4.22, <0.9.0","artifacts":{},"seenByCompiler":true},"lib/forge-std/src/interfaces/IERC165.sol":{"lastModificationDate":1734782986599,"contentHash":"90fe5e2e3ed432d6f3b408e7c9e8a739","sourceName":"lib/forge-std/src/interfaces/IERC165.sol","imports":[],"versionRequirement":">=0.6.2","artifacts":{"IERC165":{"0.8.27":{"default":{"path":"IERC165.sol/IERC165.json","build_id":"f5f536aad68759d99ce44c2ec623409c"}}}},"seenByCompiler":true},"lib/forge-std/src/interfaces/IERC20.sol":{"lastModificationDate":1734782986599,"contentHash":"8099161d518e5862a76750349d58e801","sourceName":"lib/forge-std/src/interfaces/IERC20.sol","imports":[],"versionRequirement":">=0.6.2","artifacts":{"IERC20":{"0.8.27":{"default":{"path":"IERC20.sol/IERC20.json","build_id":"f5f536aad68759d99ce44c2ec623409c"}}}},"seenByCompiler":true},"lib/forge-std/src/interfaces/IERC721.sol":{"lastModificationDate":1734782986600,"contentHash":"efc26e7f9a2f76b68088c8760ceae2dc","sourceName":"lib/forge-std/src/interfaces/IERC721.sol","imports":["lib/forge-std/src/interfaces/IERC165.sol"],"versionRequirement":">=0.6.2","artifacts":{"IERC721":{"0.8.27":{"default":{"path":"IERC721.sol/IERC721.json","build_id":"f5f536aad68759d99ce44c2ec623409c"}}},"IERC721Enumerable":{"0.8.27":{"default":{"path":"IERC721.sol/IERC721Enumerable.json","build_id":"f5f536aad68759d99ce44c2ec623409c"}}},"IERC721Metadata":{"0.8.27":{"default":{"path":"IERC721.sol/IERC721Metadata.json","build_id":"f5f536aad68759d99ce44c2ec623409c"}}},"IERC721TokenReceiver":{"0.8.27":{"default":{"path":"IERC721.sol/IERC721TokenReceiver.json","build_id":"f5f536aad68759d99ce44c2ec623409c"}}}},"seenByCompiler":true},"lib/forge-std/src/interfaces/IMulticall3.sol":{"lastModificationDate":1734782986600,"contentHash":"7b131ca1ca32ef6378b7b9ad5488b901","sourceName":"lib/forge-std/src/interfaces/IMulticall3.sol","imports":[],"versionRequirement":">=0.6.2, <0.9.0","artifacts":{"IMulticall3":{"0.8.27":{"default":{"path":"IMulticall3.sol/IMulticall3.json","build_id":"f5f536aad68759d99ce44c2ec623409c"}}}},"seenByCompiler":true},"lib/forge-std/src/mocks/MockERC20.sol":{"lastModificationDate":1734782986601,"contentHash":"8e14d63e81e1d54dbc2d44df38ae9dec","sourceName":"lib/forge-std/src/mocks/MockERC20.sol","imports":["lib/forge-std/src/interfaces/IERC20.sol"],"versionRequirement":">=0.6.2, <0.9.0","artifacts":{"MockERC20":{"0.8.27":{"default":{"path":"MockERC20.sol/MockERC20.json","build_id":"f5f536aad68759d99ce44c2ec623409c"}}}},"seenByCompiler":true},"lib/forge-std/src/mocks/MockERC721.sol":{"lastModificationDate":1734782986601,"contentHash":"e91cd9dba7f88f03710c56a347d89d1e","sourceName":"lib/forge-std/src/mocks/MockERC721.sol","imports":["lib/forge-std/src/interfaces/IERC165.sol","lib/forge-std/src/interfaces/IERC721.sol"],"versionRequirement":">=0.6.2, <0.9.0","artifacts":{"MockERC721":{"0.8.27":{"default":{"path":"MockERC721.sol/MockERC721.json","build_id":"f5f536aad68759d99ce44c2ec623409c"}}}},"seenByCompiler":true},"lib/forge-std/src/safeconsole.sol":{"lastModificationDate":1734782986604,"contentHash":"1445aa2f47000e212173e0cefd6c7a77","sourceName":"lib/forge-std/src/safeconsole.sol","imports":[],"versionRequirement":">=0.6.2, <0.9.0","artifacts":{"safeconsole":{"0.8.27":{"default":{"path":"safeconsole.sol/safeconsole.json","build_id":"f5f536aad68759d99ce44c2ec623409c"}}}},"seenByCompiler":true},"script/MockSetup.s.sol":{"lastModificationDate":1734821182617,"contentHash":"440a0bbde6af2fe04d25fc6a53d2b9c4","sourceName":"script/MockSetup.s.sol","imports":["lib/forge-std/src/Base.sol","lib/forge-std/src/Script.sol","lib/forge-std/src/StdChains.sol","lib/forge-std/src/StdCheats.sol","lib/forge-std/src/StdJson.sol","lib/forge-std/src/StdMath.sol","lib/forge-std/src/StdStorage.sol","lib/forge-std/src/StdStyle.sol","lib/forge-std/src/StdUtils.sol","lib/forge-std/src/Vm.sol","lib/forge-std/src/console.sol","lib/forge-std/src/console2.sol","lib/forge-std/src/interfaces/IERC165.sol","lib/forge-std/src/interfaces/IERC20.sol","lib/forge-std/src/interfaces/IERC721.sol","lib/forge-std/src/interfaces/IMulticall3.sol","lib/forge-std/src/mocks/MockERC20.sol","lib/forge-std/src/mocks/MockERC721.sol","lib/forge-std/src/safeconsole.sol","src/AccountingToken.sol","src/CropProduct.sol","src/Types.sol"],"versionRequirement":"^0.8.13","artifacts":{"MocksSetupScript":{"0.8.27":{"default":{"path":"MockSetup.s.sol/MocksSetupScript.json","build_id":"f5f536aad68759d99ce44c2ec623409c"}}}},"seenByCompiler":true},"src/AccountingToken.sol":{"lastModificationDate":1734785561425,"contentHash":"0783af1bb03f21440a70056518429000","sourceName":"src/AccountingToken.sol","imports":[],"versionRequirement":"^0.8.20","artifacts":{"AccountingToken":{"0.8.27":{"default":{"path":"AccountingToken.sol/AccountingToken.json","build_id":"f5f536aad68759d99ce44c2ec623409c"}}}},"seenByCompiler":true},"src/CropProduct.sol":{"lastModificationDate":1734820210301,"contentHash":"150a524ed4b7e5c5623bcee6b58d6080","sourceName":"src/CropProduct.sol","imports":["src/Types.sol"],"versionRequirement":"^0.8.20","artifacts":{"CropProduct":{"0.8.27":{"default":{"path":"CropProduct.sol/CropProduct.json","build_id":"f5f536aad68759d99ce44c2ec623409c"}}}},"seenByCompiler":true},"src/StrHelper.sol":{"lastModificationDate":1734793035165,"contentHash":"f94dc91aac319cfe07eaba74584dc83d","sourceName":"src/StrHelper.sol","imports":[],"versionRequirement":"^0.8.20","artifacts":{"StrHelper":{"0.8.27":{"default":{"path":"StrHelper.sol/StrHelper.json","build_id":"f5f536aad68759d99ce44c2ec623409c"}}}},"seenByCompiler":true},"src/Types.sol":{"lastModificationDate":1734817037134,"contentHash":"3d38fc63451caaea28ffb7327b813814","sourceName":"src/Types.sol","imports":[],"versionRequirement":"^0.8.20","artifacts":{},"seenByCompiler":true}},"builds":["f5f536aad68759d99ce44c2ec623409c"],"profiles":{"default":{"solc":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode.object","evm.bytecode.sourceMap","evm.bytecode.linkReferences","evm.deployedBytecode.object","evm.deployedBytecode.sourceMap","evm.deployedBytecode.linkReferences","evm.deployedBytecode.immutableReferences","evm.methodIdentifiers","metadata"]}},"evmVersion":"cancun","viaIR":false,"libraries":{}},"vyper":{"evmVersion":"cancun","outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode"]}}}}}} \ No newline at end of file diff --git a/src/CropProduct.sol b/src/CropProduct.sol index c62096c..667185c 100644 --- a/src/CropProduct.sol +++ b/src/CropProduct.sol @@ -1,11 +1,17 @@ // SPDX-License-Identifier: Apache-2.0 pragma solidity ^0.8.20; -import {Location, RiskId, Str, Timestamp} from "./Types.sol"; +import {Amount, Location, NftId, RiskId, Str, Timestamp} from "./Types.sol"; contract CropProduct { - + + error StringTooLong(string str); + error InvalidShortString(); + uint256 public riskCounter; + uint96 public policyNftCounter = 100101; + + mapping(Str id => RiskId riskId) internal _riskId; function createSeason( Str seasonId, @@ -42,6 +48,62 @@ contract CropProduct { returns (RiskId riskId) { riskCounter++; - return RiskId.wrap(bytes8(keccak256(abi.encode(riskCounter)))); + riskId = RiskId.wrap(bytes8(keccak256(abi.encode(riskCounter)))); + _riskId[id] = riskId; + } + + function createPolicy( + address policyHolder, + RiskId riskId, + Timestamp activateAt, + Amount sumInsuredAmount, + Amount premiumAmount + ) + external + returns (NftId policyNftId) + { + policyNftCounter++; + return NftId.wrap(policyNftCounter); + } + + function getRiskId(Str id) + external + view + returns (RiskId riskId) + { + return _riskId[id]; + } + + /// @dev converts the provided string into a short string. + /// code from OZ ShortStrings.toShortString + function toStr(string memory str) public pure returns (Str) { + bytes memory bstr = bytes(str); + if (bstr.length > 31) { + revert StringTooLong(str); + } + return Str.wrap(bytes32(uint256(bytes32(bstr)) | bstr.length)); + } + + /// @dev converts the provided short string into a string. + /// code from OZ ShortStrings.toString + function toString(Str sstr) public pure returns (string memory) { + uint256 len = length(sstr); + // using `new string(len)` would work locally but is not memory safe. + string memory str = new string(32); + assembly ("memory-safe") { + mstore(str, len) + mstore(add(str, 0x20), sstr) + } + return str; + } + + /// @dev returns the length of the provided short string. + /// code from OZ ShortStrings.byteLength + function length(Str sstr) public pure returns (uint256) { + uint256 result = uint256(Str.unwrap(sstr)) & 0xFF; + if (result > 31) { + revert InvalidShortString(); + } + return result; } } \ No newline at end of file diff --git a/src/StrHelper.sol b/src/StrHelper.sol new file mode 100644 index 0000000..90b476b --- /dev/null +++ b/src/StrHelper.sol @@ -0,0 +1,44 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.20; + +type Str is bytes32; + +contract StrHelper { + + error StringTooLong(string str); + error InvalidShortString(); + + /// @dev converts the provided string into a short string. + /// code from OZ ShortStrings.toShortString + function toStr(string memory str) public pure returns (Str) { + bytes memory bstr = bytes(str); + if (bstr.length > 31) { + revert StringTooLong(str); + } + return Str.wrap(bytes32(uint256(bytes32(bstr)) | bstr.length)); + } + + /// @dev converts the provided short string into a string. + /// code from OZ ShortStrings.toString + function toString(Str sstr) public pure returns (string memory) { + uint256 len = length(sstr); + // using `new string(len)` would work locally but is not memory safe. + string memory str = new string(32); + assembly ("memory-safe") { + mstore(str, len) + mstore(add(str, 0x20), sstr) + } + return str; + } + + + /// @dev returns the length of the provided short string. + /// code from OZ ShortStrings.byteLength + function length(Str sstr) public pure returns (uint256) { + uint256 result = uint256(Str.unwrap(sstr)) & 0xFF; + if (result > 31) { + revert InvalidShortString(); + } + return result; + } +} \ No newline at end of file diff --git a/src/Types.sol b/src/Types.sol index e2763a5..f12c99c 100644 --- a/src/Types.sol +++ b/src/Types.sol @@ -1,6 +1,7 @@ // SPDX-License-Identifier: Apache-2.0 pragma solidity ^0.8.20; +type Amount is uint96; type Location is uint64; type NftId is uint96; type RiskId is bytes8; diff --git a/test/AccountingToken.t.sol b/test/AccountingToken.t.sol index 5b44a6f..45114ac 100644 --- a/test/AccountingToken.t.sol +++ b/test/AccountingToken.t.sol @@ -17,11 +17,11 @@ contract AccountingTokenTest is Test { vm.stopPrank(); } - function test_tokenMetadata() public { + function test_tokenMetadata() public view { assertEq(token.symbol(), "LCA", "unexpected token symbol"); } - function test_tokenInitialBalance() public { + function test_tokenInitialBalance() public view { assertEq(token.balanceOf(deployer), token.totalSupply(), "unexpected initial balance for deployer"); assertEq(token.balanceOf(personA), 0, "unexpected initial blance for person a"); } diff --git a/test/CropProduct.t.sol b/test/CropProduct.t.sol new file mode 100644 index 0000000..bb95346 --- /dev/null +++ b/test/CropProduct.t.sol @@ -0,0 +1,49 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.13; + +import {Test, console} from "forge-std/Test.sol"; +import {CropProduct} from "../src/CropProduct.sol"; +import {RiskId, Str, Timestamp} from "../src/Types.sol"; + +contract CropProductTest is Test { + address deployer = makeAddr("deployer"); + address personA = makeAddr("personA"); + address teller = makeAddr("teller"); + + CropProduct public product; + + function setUp() public { + vm.startPrank(deployer); + product = new CropProduct(); + vm.stopPrank(); + } + + function test_productRiskCreate() public { + // GIVEN + Str id = product.toStr("Ysi1SQUjfJgP"); + Str seasonId = product.toStr("pITRymZd5BPt"); + Str locationId = product.toStr("9kjFbDMG4Smh"); + Str crop = product.toStr("coffee"); + Timestamp seasonEndAt = Timestamp.wrap(uint40(block.timestamp + 90 days)); + + // WHEN + vm.startPrank(deployer); + RiskId riskId = product.createRisk(id, seasonId, locationId, crop, seasonEndAt); + vm.stopPrank(); + + // THEN + assertEq(RiskId.unwrap(product.getRiskId(id)), RiskId.unwrap(riskId), "unexpected risk id"); + } + + function test_productStringHelper() public view { + // GIVEN + string memory helloString = "hello world!"; + + // WHEN + Str helloStr = product.toStr(helloString); + + // THEN + assertEq(product.toString(helloStr), helloString, "unexpected string (b)"); + assertEq(product.length(helloStr), 12, "unexpected string length"); + } +}