Cryo Explorer Ethereum Mainnet

Address Contract Verified

Address 0x30434BEf71c5d3c3a2D3A115f8B7Ae3773c78339
Balance 0 ETH
Nonce 60
Code Size 10831 bytes
Indexed Transactions 0
External Etherscan · Sourcify

Contract Bytecode

10831 bytes
0x608060405234801561000f575f5ffd5b506004361061007b575f3560e01c8063b7027b9411610059578063b7027b94146100eb578063c3c945ed1461011b578063e54e26b91461014b578063f2fde38b1461017b5761007b565b80638da5cb5b1461007f578063927ef0ef1461009d5780639399869d146100cd575b5f5ffd5b610087610197565b60405161009491906107b0565b60405180910390f35b6100b760048036038101906100b29190610973565b6101bc565b6040516100c491906107b0565b60405180910390f35b6100d5610551565b6040516100e29190610a15565b60405180910390f35b61010560048036038101906101009190610a2e565b61055d565b60405161011291906107b0565b60405180910390f35b61013560048036038101906101309190610a2e565b6105a4565b60405161014291906107b0565b60405180910390f35b61016560048036038101906101609190610a75565b6105e9565b60405161017291906107b0565b60405180910390f35b61019560048036038101906101909190610aa0565b610624565b005b60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461024c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161024390610b4b565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff165f876040516102729190610bbb565b90815260200160405180910390205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146102f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102ed90610c1b565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603610364576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161035b90610c83565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036103d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103c990610ceb565b60405180910390fd5b5f858585856040516103e390610764565b6103f09493929190610d09565b604051809103905ff080158015610409573d5f5f3e3d5ffd5b509050809150815f8860405161041f9190610bbb565b90815260200160405180910390205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600182908060018154018082558091505060019003905f5260205f20015f9091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16886040516105069190610bbb565b60405180910390207f8e3ae431030b3b9c96fc779b74e62294b462b93e69fd7fc045e5194179f683b5888860405161053f929190610d4c565b60405180910390a45095945050505050565b5f600180549050905090565b5f818051602081018201805184825260208301602085012081835280955050505050505f915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f5f826040516105b49190610bbb565b90815260200160405180910390205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600181815481106105f8575f80fd5b905f5260205f20015f915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146106b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106aa90610b4b565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610721576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161071890610dbd565b60405180910390fd5b8060025f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611c3e80610ddc83390190565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61079a82610771565b9050919050565b6107aa81610790565b82525050565b5f6020820190506107c35f8301846107a1565b92915050565b5f604051905090565b5f5ffd5b5f5ffd5b5f5ffd5b5f5ffd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b610828826107e2565b810181811067ffffffffffffffff82111715610847576108466107f2565b5b80604052505050565b5f6108596107c9565b9050610865828261081f565b919050565b5f67ffffffffffffffff821115610884576108836107f2565b5b61088d826107e2565b9050602081019050919050565b828183375f83830152505050565b5f6108ba6108b58461086a565b610850565b9050828152602081018484840111156108d6576108d56107de565b5b6108e184828561089a565b509392505050565b5f82601f8301126108fd576108fc6107da565b5b813561090d8482602086016108a8565b91505092915050565b61091f81610790565b8114610929575f5ffd5b50565b5f8135905061093a81610916565b92915050565b5f819050919050565b61095281610940565b811461095c575f5ffd5b50565b5f8135905061096d81610949565b92915050565b5f5f5f5f5f60a0868803121561098c5761098b6107d2565b5b5f86013567ffffffffffffffff8111156109a9576109a86107d6565b5b6109b5888289016108e9565b95505060206109c68882890161092c565b94505060406109d78882890161095f565b93505060606109e88882890161095f565b92505060806109f98882890161092c565b9150509295509295909350565b610a0f81610940565b82525050565b5f602082019050610a285f830184610a06565b92915050565b5f60208284031215610a4357610a426107d2565b5b5f82013567ffffffffffffffff811115610a6057610a5f6107d6565b5b610a6c848285016108e9565b91505092915050565b5f60208284031215610a8a57610a896107d2565b5b5f610a978482850161095f565b91505092915050565b5f60208284031215610ab557610ab46107d2565b5b5f610ac28482850161092c565b91505092915050565b5f82825260208201905092915050565b7f4f6e6c79206f776e65722063616e2063616c6c20746869732066756e6374696f5f8201527f6e00000000000000000000000000000000000000000000000000000000000000602082015250565b5f610b35602183610acb565b9150610b4082610adb565b604082019050919050565b5f6020820190508181035f830152610b6281610b29565b9050919050565b5f81519050919050565b5f81905092915050565b8281835e5f83830152505050565b5f610b9582610b69565b610b9f8185610b73565b9350610baf818560208601610b7d565b80840191505092915050565b5f610bc68284610b8b565b915081905092915050565b7f5061796d656e7420636f6e747261637420616c726561647920657869737473005f82015250565b5f610c05601f83610acb565b9150610c1082610bd1565b602082019050919050565b5f6020820190508181035f830152610c3281610bf9565b9050919050565b7f496e76616c69642067656e6572616c2077616c6c6574206164647265737300005f82015250565b5f610c6d601e83610acb565b9150610c7882610c39565b602082019050919050565b5f6020820190508181035f830152610c9a81610c61565b9050919050565b7f496e76616c696420746f6b656e20636f6e7472616374206164647265737300005f82015250565b5f610cd5601e83610acb565b9150610ce082610ca1565b602082019050919050565b5f6020820190508181035f830152610d0281610cc9565b9050919050565b5f608082019050610d1c5f8301876107a1565b610d296020830186610a06565b610d366040830185610a06565b610d4360608301846107a1565b95945050505050565b5f604082019050610d5f5f830185610a06565b610d6c6020830184610a06565b9392505050565b7f496e76616c6964206e6577206f776e65720000000000000000000000000000005f82015250565b5f610da7601183610acb565b9150610db282610d73565b602082019050919050565b5f6020820190508181035f830152610dd481610d9b565b905091905056fe610100604052348015610010575f5ffd5b50604051611c3e380380611c3e83398181016040528101906100329190610262565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036100a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161009790610320565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361010e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161010590610388565b60405180910390fd5b5f8311610150576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161014790610416565b60405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff16815250508260a081815250508160c081815250508073ffffffffffffffffffffffffffffffffffffffff1660e08173ffffffffffffffffffffffffffffffffffffffff168152505050505050610434565b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6101fe826101d5565b9050919050565b61020e816101f4565b8114610218575f5ffd5b50565b5f8151905061022981610205565b92915050565b5f819050919050565b6102418161022f565b811461024b575f5ffd5b50565b5f8151905061025c81610238565b92915050565b5f5f5f5f6080858703121561027a576102796101d1565b5b5f6102878782880161021b565b94505060206102988782880161024e565b93505060406102a98782880161024e565b92505060606102ba8782880161021b565b91505092959194509250565b5f82825260208201905092915050565b7f496e76616c69642067656e6572616c2077616c6c6574000000000000000000005f82015250565b5f61030a6016836102c6565b9150610315826102d6565b602082019050919050565b5f6020820190508181035f830152610337816102fe565b9050919050565b7f496e76616c696420746f6b656e20636f6e7472616374000000000000000000005f82015250565b5f6103726016836102c6565b915061037d8261033e565b602082019050919050565b5f6020820190508181035f83015261039f81610366565b9050919050565b7f457870656374656420616d6f756e74206d7573742062652067726561746572205f8201527f7468616e20300000000000000000000000000000000000000000000000000000602082015250565b5f6104006026836102c6565b915061040b826103a6565b604082019050919050565b5f6020820190508181035f83015261042d816103f4565b9050919050565b60805160a05160c05160e0516117526104ec5f395f8181610288015281816104490152818161052701528181610694015281816106b90152818161096301528181610b6d0152610cd901525f81816106700152818161084e0152610a8901525f8181610325015281816107c6015281816107ef0152818161081f015281816108de01528181610a0001528181610a270152610a5b01525f818161093501528181610c6001528181610d100152610ecc01526117525ff3fe6080604052600436106100aa575f3560e01c8063603159ab11610063578063603159ab1461019b57806390339843146101c55780639632e720146101ef57806399882b3114610219578063eec5668b14610245578063fa391c641461025b576100b1565b806312065fe0146100b55780632feef2ec146100df578063410085df1461010957806342cde4e81461013157806355a373d61461015b5780635a17001314610185576100b1565b366100b157005b5f5ffd5b3480156100c0575f5ffd5b506100c9610285565b6040516100d69190610f55565b60405180910390f35b3480156100ea575f5ffd5b506100f3610323565b6040516101009190610f55565b60405180910390f35b348015610114575f5ffd5b5061012f600480360381019061012a9190610ff6565b610347565b005b34801561013c575f5ffd5b5061014561066e565b6040516101529190610f55565b60405180910390f35b348015610166575f5ffd5b5061016f610692565b60405161017c9190611043565b60405180910390f35b348015610190575f5ffd5b506101996106b6565b005b3480156101a6575f5ffd5b506101af610921565b6040516101bc9190611076565b60405180910390f35b3480156101d0575f5ffd5b506101d9610933565b6040516101e69190611043565b60405180910390f35b3480156101fa575f5ffd5b50610203610957565b6040516102109190610f55565b60405180910390f35b348015610224575f5ffd5b5061022d61095d565b60405161023c9392919061108f565b60405180910390f35b348015610250575f5ffd5b50610259610ab3565b005b348015610266575f5ffd5b5061026f610b0a565b60405161027c9190611076565b60405180910390f35b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016102df9190611043565b602060405180830381865afa1580156102fa573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061031e91906110d8565b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b5f60019054906101000a900460ff1615610396576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161038d90611183565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610404576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103fb906111eb565b60405180910390fd5b5f8111610446576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161043d90611253565b60405180910390fd5b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016104a09190611043565b602060405180830381865afa1580156104bb573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104df91906110d8565b905081811015610524576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161051b906112bb565b60405180910390fd5b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb85856040518363ffffffff1660e01b81526004016105809291906112d9565b6020604051808303815f875af115801561059c573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105c0919061132a565b905080610602576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105f99061139f565b60405180910390fd5b8260015f82825461061391906113ea565b925050819055508373ffffffffffffffffffffffffffffffffffffffff167fa171b6942063c6f2800ce40a780edce37baa2b618571b11eedd1e69e626e7d76846040516106609190610f55565b60405180910390a250505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016107109190611043565b602060405180830381865afa15801561072b573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061074f91906110d8565b90506001548111156107c3575f6001548261076a91906113ea565b9050816001819055503373ffffffffffffffffffffffffffffffffffffffff167f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be770826040516107b99190610f55565b60405180910390a2505b5f7f000000000000000000000000000000000000000000000000000000000000000082101561081d57817f000000000000000000000000000000000000000000000000000000000000000061081891906113ea565b61084a565b7f00000000000000000000000000000000000000000000000000000000000000008261084991906113ea565b5b90507f0000000000000000000000000000000000000000000000000000000000000000811115801561088857505f60019054906101000a900460ff16155b1561091d575f5f9054906101000a900460ff166109145760015f5f6101000a81548160ff0219169083151502179055507f804fbdce9b2b430341d671cd679f22ccb903e9db545bedbbc7da4e6230e2bdb96001547f000000000000000000000000000000000000000000000000000000000000000060405161090b92919061141d565b60405180910390a15b61091c610b1b565b5b5050565b5f60019054906101000a900460ff1681565b7f000000000000000000000000000000000000000000000000000000000000000081565b60015481565b5f5f5f5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016109ba9190611043565b602060405180830381865afa1580156109d5573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109f991906110d8565b90508092507f00000000000000000000000000000000000000000000000000000000000000008110610a58577f000000000000000000000000000000000000000000000000000000000000000081610a5191906113ea565b9150610a87565b807f0000000000000000000000000000000000000000000000000000000000000000610a8491906113ea565b91505b7f0000000000000000000000000000000000000000000000000000000000000000821115935050909192565b5f5f9054906101000a900460ff16610b00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610af79061148e565b60405180910390fd5b610b08610b1b565b565b5f5f9054906101000a900460ff1681565b5f60019054906101000a900460ff1615610b6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b61906114f6565b60405180910390fd5b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610bc49190611043565b602060405180830381865afa158015610bdf573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c0391906110d8565b90505f8111610c47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3e9061155e565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1603610cd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ccc906115c6565b60405180910390fd5b5f5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000084604051602401610d419291906112d9565b6040516020818303038152906040527fa9059cbb000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051610dcb9190611636565b5f604051808303815f865af19150503d805f8114610e04576040519150601f19603f3d011682016040523d82523d5f602084013e610e09565b606091505b509150915081610e4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4590611696565b60405180910390fd5b5f81511115610eb0575f81806020019051810190610e6c919061132a565b905080610eae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea5906116fe565b60405180910390fd5b505b60015f60016101000a81548160ff0219169083151502179055507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff167f8c9a4f13b67cb64d7c6aa1ae0c9bf07694af521a28b93e7060020810ab4bc59f84604051610f309190610f55565b60405180910390a2505050565b5f819050919050565b610f4f81610f3d565b82525050565b5f602082019050610f685f830184610f46565b92915050565b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f610f9b82610f72565b9050919050565b610fab81610f91565b8114610fb5575f5ffd5b50565b5f81359050610fc681610fa2565b92915050565b610fd581610f3d565b8114610fdf575f5ffd5b50565b5f81359050610ff081610fcc565b92915050565b5f5f6040838503121561100c5761100b610f6e565b5b5f61101985828601610fb8565b925050602061102a85828601610fe2565b9150509250929050565b61103d81610f91565b82525050565b5f6020820190506110565f830184611034565b92915050565b5f8115159050919050565b6110708161105c565b82525050565b5f6020820190506110895f830184611067565b92915050565b5f6060820190506110a25f830186611067565b6110af6020830185610f46565b6110bc6040830184610f46565b949350505050565b5f815190506110d281610fcc565b92915050565b5f602082840312156110ed576110ec610f6e565b5b5f6110fa848285016110c4565b91505092915050565b5f82825260208201905092915050565b7f46756e647320616c7265616479207472616e736665727265642c2063616e6e6f5f8201527f7420726566756e64000000000000000000000000000000000000000000000000602082015250565b5f61116d602883611103565b915061117882611113565b604082019050919050565b5f6020820190508181035f83015261119a81611161565b9050919050565b7f496e76616c696420726566756e642061646472657373000000000000000000005f82015250565b5f6111d5601683611103565b91506111e0826111a1565b602082019050919050565b5f6020820190508181035f830152611202816111c9565b9050919050565b7f496e76616c696420726566756e6420616d6f756e7400000000000000000000005f82015250565b5f61123d601583611103565b915061124882611209565b602082019050919050565b5f6020820190508181035f83015261126a81611231565b9050919050565b7f496e73756666696369656e742062616c616e636520666f7220726566756e64005f82015250565b5f6112a5601f83611103565b91506112b082611271565b602082019050919050565b5f6020820190508181035f8301526112d281611299565b9050919050565b5f6040820190506112ec5f830185611034565b6112f96020830184610f46565b9392505050565b6113098161105c565b8114611313575f5ffd5b50565b5f8151905061132481611300565b92915050565b5f6020828403121561133f5761133e610f6e565b5b5f61134c84828501611316565b91505092915050565b7f526566756e64207472616e73666572206661696c6564000000000000000000005f82015250565b5f611389601683611103565b915061139482611355565b602082019050919050565b5f6020820190508181035f8301526113b68161137d565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6113f482610f3d565b91506113ff83610f3d565b9250828203905081811115611417576114166113bd565b5b92915050565b5f6040820190506114305f830185610f46565b61143d6020830184610f46565b9392505050565b7f5061796d656e74206e6f7420636f6d706c6574656420796574000000000000005f82015250565b5f611478601983611103565b915061148382611444565b602082019050919050565b5f6020820190508181035f8301526114a58161146c565b9050919050565b7f46756e647320616c7265616479207472616e73666572726564000000000000005f82015250565b5f6114e0601983611103565b91506114eb826114ac565b602082019050919050565b5f6020820190508181035f83015261150d816114d4565b9050919050565b7f4e6f2066756e647320746f207472616e736665720000000000000000000000005f82015250565b5f611548601483611103565b915061155382611514565b602082019050919050565b5f6020820190508181035f8301526115758161153c565b9050919050565b7f496e76616c69642067656e6572616c2077616c6c6574000000000000000000005f82015250565b5f6115b0601683611103565b91506115bb8261157c565b602082019050919050565b5f6020820190508181035f8301526115dd816115a4565b9050919050565b5f81519050919050565b5f81905092915050565b8281835e5f83830152505050565b5f611610826115e4565b61161a81856115ee565b935061162a8185602086016115f8565b80840191505092915050565b5f6116418284611606565b915081905092915050565b7f546f6b656e207472616e736665722063616c6c206661696c65640000000000005f82015250565b5f611680601a83611103565b915061168b8261164c565b602082019050919050565b5f6020820190508181035f8301526116ad81611674565b9050919050565b7f546f6b656e207472616e736665722072657475726e65642066616c73650000005f82015250565b5f6116e8601d83611103565b91506116f3826116b4565b602082019050919050565b5f6020820190508181035f830152611715816116dc565b905091905056fea264697066735822122097563f883a05b7a3963fe3db2636c8d75dd814c5ea7ff04ac66d8d0997b7d46764736f6c634300081e0033a2646970667358221220f30c7fc296f2ab209ea3ace62c3f429d3341ddb8cf40bfdf537bbf2e01fb1e7e64736f6c634300081e0033

Verified Source Code Full Match

Compiler: v0.8.30+commit.73712a01 EVM: prague Optimization: No
PaymentFactory.sol 284 lines
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

// ============================================================================
// PaymentContract - Single Token Version (User selects USDC or USDT)
// ============================================================================

interface IERC20 {
    function transfer(address to, uint256 amount) external returns (bool);
    function transferFrom(address from, address to, uint256 amount) external returns (bool);
    function balanceOf(address account) external view returns (uint256);
}

/**
 * @title PaymentContract
 * @notice Smart contract for individual payments that receives ERC20 tokens and auto-transfers to general wallet
 * @dev User selects USDC or USDT on checkout, contract accepts only that token
 */
contract PaymentContract {
    // General wallet where funds will be transferred
    address public immutable generalWallet;
    
    // Expected payment amount (in token's smallest unit, e.g., 6 decimals for USDC/USDT)
    uint256 public immutable expectedAmount;
    
    // Acceptable threshold/difference from expected amount
    uint256 public immutable threshold;
    
    // ERC20 token contract address (USDC or USDT - selected by user)
    address public immutable tokenContract;
    
    // Payment status
    bool public isCompleted;
    bool public isTransferred;
    
    // Received amount
    uint256 public receivedAmount;
    
    // Events
    event PaymentReceived(address indexed from, uint256 amount);
    event PaymentCompleted(uint256 receivedAmount, uint256 expectedAmount);
    event FundsTransferred(address indexed to, uint256 amount);
    event RefundIssued(address indexed to, uint256 amount);
    
    modifier onlyWhenNotCompleted() {
        require(!isCompleted, "Payment already completed");
        _;
    }
    
    modifier onlyWhenNotTransferred() {
        require(!isTransferred, "Funds already transferred");
        _;
    }
    
    constructor(
        address _generalWallet,
        uint256 _expectedAmount,
        uint256 _threshold,
        address _tokenContract
    ) {
        require(_generalWallet != address(0), "Invalid general wallet");
        require(_tokenContract != address(0), "Invalid token contract");
        require(_expectedAmount > 0, "Expected amount must be greater than 0");
        
        generalWallet = _generalWallet;
        expectedAmount = _expectedAmount;
        threshold = _threshold;
        tokenContract = _tokenContract;
    }
    
    /**
     * @notice Check payment status and auto-transfer if complete
     * @dev Checks balance of the selected token (USDC or USDT)
     */
    function checkAndTransfer() external {
        uint256 balance = IERC20(tokenContract).balanceOf(address(this));
        
        // Update receivedAmount if balance increased
        if (balance > receivedAmount) {
            uint256 newAmount = balance - receivedAmount;
            receivedAmount = balance;
            
            emit PaymentReceived(msg.sender, newAmount);
        }
        
        // Check if payment is complete (within threshold)
        // Use current balance for threshold check (more reliable than receivedAmount)
        uint256 difference = balance >= expectedAmount 
            ? balance - expectedAmount 
            : expectedAmount - balance;
        
        // If payment is complete (within threshold) and not already transferred
        if (difference <= threshold && !isTransferred) {
            // Mark as completed if not already
            if (!isCompleted) {
                isCompleted = true;
                emit PaymentCompleted(receivedAmount, expectedAmount);
            }
            
            // Transfer funds to general wallet
            _transferToGeneralWallet();
        }
    }
    
    /**
     * @notice Manually trigger transfer to general wallet
     * @dev Can be called by anyone, but only transfers if payment is complete
     */
    function transferToGeneralWallet() external {
        require(isCompleted, "Payment not completed yet");
        _transferToGeneralWallet();
    }
    
    /**
     * @notice Internal function to transfer funds to general wallet
     */
    function _transferToGeneralWallet() internal onlyWhenNotTransferred {
        uint256 balance = IERC20(tokenContract).balanceOf(address(this));
        require(balance > 0, "No funds to transfer");
        require(generalWallet != address(0), "Invalid general wallet");
        
        // Transfer tokens to general wallet
        // USDT/USDC don't return bool, they revert on failure
        // Use low-level call to handle both patterns
        (bool success, bytes memory returnData) = tokenContract.call(
            abi.encodeWithSignature("transfer(address,uint256)", generalWallet, balance)
        );
        
        // Check if call was successful
        require(success, "Token transfer call failed");
        
        // If return data exists, check if it's a boolean (some tokens return bool)
        if (returnData.length > 0) {
            // Decode the return value (should be bool for standard ERC20)
            // If decoding fails or returns false, revert
            bool transferResult = abi.decode(returnData, (bool));
            require(transferResult, "Token transfer returned false");
        }
        
        isTransferred = true;
        emit FundsTransferred(generalWallet, balance);
    }
    
    /**
     * @notice Issue refund (send tokens back to sender)
     * @param to Address to refund
     * @param amount Amount to refund
     */
    function refund(address to, uint256 amount) external {
        require(!isTransferred, "Funds already transferred, cannot refund");
        require(to != address(0), "Invalid refund address");
        require(amount > 0, "Invalid refund amount");
        
        uint256 balance = IERC20(tokenContract).balanceOf(address(this));
        require(balance >= amount, "Insufficient balance for refund");
        
        bool success = IERC20(tokenContract).transfer(to, amount);
        require(success, "Refund transfer failed");
        
        receivedAmount -= amount;
        
        emit RefundIssued(to, amount);
    }
    
    /**
     * @notice Get current token balance
     */
    function getBalance() external view returns (uint256) {
        return IERC20(tokenContract).balanceOf(address(this));
    }
    
    /**
     * @notice Check if payment is complete (within threshold)
     */
    function checkPaymentStatus() external view returns (bool completed, uint256 currentAmount, uint256 difference) {
        uint256 balance = IERC20(tokenContract).balanceOf(address(this));
        currentAmount = balance;
        
        if (balance >= expectedAmount) {
            difference = balance - expectedAmount;
        } else {
            difference = expectedAmount - balance;
        }
        
        completed = difference <= threshold;
    }
    
    /**
     * @notice Receive ETH (for gas funding)
     */
    receive() external payable {}
}

// ============================================================================
// PaymentFactory - Uses Multi-Token PaymentContract above
// ============================================================================

/**
 * @title PaymentFactory
 * @notice Factory contract that deploys PaymentContract instances for each payment
 * @dev User selects USDC or USDT on checkout, contract accepts only that token
 */
contract PaymentFactory {
    // Mapping to track deployed contracts by payment ID
    mapping(string => address) public paymentContracts;
    
    // Array of all deployed contract addresses
    address[] public allContracts;
    
    // Owner address (for access control)
    address public owner;
    
    // Events
    event PaymentContractCreated(string indexed paymentId, address indexed contractAddress, address indexed generalWallet, uint256 expectedAmount, uint256 threshold);
    
    modifier onlyOwner() {
        require(msg.sender == owner, "Only owner can call this function");
        _;
    }
    
    constructor() {
        owner = msg.sender;
    }
    
    /**
     * @notice Deploy a new PaymentContract for a payment
     * @param paymentId Unique payment identifier
     * @param generalWallet Address where funds will be transferred
     * @param expectedAmount Expected payment amount (in token's smallest unit, e.g., 6 decimals for USDC/USDT)
     * @param threshold Acceptable difference from expected amount (in token's smallest unit)
     * @param tokenContract Address of the ERC20 token contract (USDC or USDT - selected by user)
     * @return contractAddress Address of the deployed PaymentContract
     */
    function createPaymentContract(
        string memory paymentId,
        address generalWallet,
        uint256 expectedAmount,
        uint256 threshold,
        address tokenContract
    ) external onlyOwner returns (address contractAddress) {
        require(paymentContracts[paymentId] == address(0), "Payment contract already exists");
        require(generalWallet != address(0), "Invalid general wallet address");
        require(tokenContract != address(0), "Invalid token contract address");
        
        // Deploy new PaymentContract (single token - user selected USDC or USDT)
        PaymentContract newContract = new PaymentContract(
            generalWallet,
            expectedAmount,
            threshold,
            tokenContract
        );
        
        contractAddress = address(newContract);
        paymentContracts[paymentId] = contractAddress;
        allContracts.push(contractAddress);
        
        emit PaymentContractCreated(paymentId, contractAddress, generalWallet, expectedAmount, threshold);
        
        return contractAddress;
    }
    
    /**
     * @notice Get contract address for a payment ID
     */
    function getPaymentContract(string memory paymentId) external view returns (address) {
        return paymentContracts[paymentId];
    }
    
    /**
     * @notice Get total number of deployed contracts
     */
    function getContractCount() external view returns (uint256) {
        return allContracts.length;
    }
    
    /**
     * @notice Transfer ownership of the factory
     */
    function transferOwnership(address newOwner) external onlyOwner {
        require(newOwner != address(0), "Invalid new owner");
        owner = newOwner;
    }
}

Read Contract

allContracts 0xe54e26b9 → address
getContractCount 0x9399869d → uint256
getPaymentContract 0xc3c945ed → address
owner 0x8da5cb5b → address
paymentContracts 0xb7027b94 → address

Write Contract 2 functions

These functions modify contract state and require a wallet transaction to execute.

createPaymentContract 0x927ef0ef
string paymentId
address generalWallet
uint256 expectedAmount
uint256 threshold
address tokenContract
returns: address
transferOwnership 0xf2fde38b
address newOwner

Recent Transactions

No transactions found for this address