コード例 #1
0
 def arguments_for_balance_of(receiver, reqs):
     return (sp.record(
         callback = sp.contract(
             Balance_of.response_type(),
             sp.contract_address(receiver),
             entry_point = "receive_balances").open_some(),
         requests = reqs))
コード例 #2
0
 def test_is_operator(scenario, owner, operator, tokens, valid, comment):
     scenario.p("test_is_operator: " + comment )
     is_operator = Operator_param.make(
         owner = owner.address,
         operator = operator.address,
         tokens = tokens)
     scenario += c1.is_operator(
         sp.record(
             callback = sp.contract(
                 Operator_param.is_operator_response_type(),
                 sp.contract_address(consumer),
                 entry_point = "receive_is_operator").open_some(),
             operator = is_operator
         ))
     scenario.verify(consumer.data.last_operator == valid)
コード例 #3
0
 def test():
     scenario = sp.test_scenario()
     scenario.h1("Simple FA2 Contract")
     # sp.test_account generates ED25519 key-pairs deterministically:
     admin = sp.test_account("Administrator")
     alice = sp.test_account("Alice")
     bob   = sp.test_account("Robert")
     # Let's display the accounts:
     scenario.h2("Accounts")
     scenario.show([admin, alice, bob])
     c1 = FA2(admin.address)
     scenario += c1
     scenario.h2("Initial Minting")
     scenario.p("The administrator mints 100 token-0's to Alice.")
     scenario += c1.mint(address = alice.address,
                         amount = 100,
                         symbol = 'TK0',
                         token_id = 0).run(sender = admin)
     scenario.h2("Transfers Alice -> Bob")
     scenario += c1.transfer(
         [
             Transfer.make(alice.address,
                           bob.address,
                           a = 10,
                           i = 0)
         ]).run(sender = alice)
     scenario.verify(
         c1.data.ledger[Ledger_key.make(alice.address, 0)].balance == 90)
     scenario.verify(
         c1.data.ledger[Ledger_key.make(bob.address, 0)].balance == 10)
     scenario += c1.transfer(
         [
             Transfer.make(alice.address,
                           bob.address,
                           a = 10,
                           i = 0),
             Transfer.make(alice.address,
                           bob.address,
                           a = 11,
                           i = 0)
         ]).run(sender = alice)
     scenario.verify(
         c1.data.ledger[Ledger_key.make(alice.address, 0)].balance
         == 90 - 10 - 11)
     scenario.verify(
         c1.data.ledger[Ledger_key.make(bob.address, 0)].balance
         == 10 + 10 + 11)
     scenario.h2("More Token Types")
     scenario += c1.mint(address = bob.address,
                         amount = 100,
                         symbol = 'TK1',
                         token_id = 1).run(sender = admin)
     scenario += c1.mint(address = bob.address,
                         amount = 200,
                         symbol = 'TK2',
                         token_id = 2).run(sender = admin)
     scenario.h3("Multi-token Transfer Bob -> Alice")
     scenario += c1.transfer(
         [
             Transfer.make(bob.address,
                           alice.address,
                           a = 10,
                           i = 0),
             Transfer.make(bob.address,
                           alice.address,
                           a = 10,
                           i = 1),
             Transfer.make(bob.address,
                           alice.address,
                           a = 10,
                           i = 2)
         ]).run(sender = bob)
     scenario.h2("Other Basic Permission Tests")
     scenario.h3("Bob cannot transfer Alice's tokens.")
     scenario += c1.transfer(
         [
             Transfer.make(alice.address,
                           bob.address,
                           a = 10,
                           i = 0),
             Transfer.make(alice.address,
                           bob.address,
                           a = 11,
                           i = 0)
         ]).run(sender = bob, valid = False)
     scenario.h3("Admin can transfer anything.")
     scenario += c1.transfer(
         [
             Transfer.make(alice.address,
                           bob.address,
                           a = 10,
                           i = 0),
             Transfer.make(alice.address,
                           bob.address,
                           a = 10,
                           i = 1),
             Transfer.make(bob.address,
                           alice.address,
                           a = 11,
                           i = 0)
         ]).run(sender = admin)
     scenario.h3("Even Admin cannot transfer too much.")
     scenario += c1.transfer(
         [
             Transfer.make(alice.address,
                           bob.address,
                           a = 1000,
                           i = 0)
         ]).run(sender = admin, valid = False)
     scenario.h3("Consumer Contract for Callback Calls.")
     consumer = View_consumer()
     scenario += consumer
     scenario.p("Consumer virtual address: "
                + sp.contract_address(consumer).export())
     scenario.h2("Balance-of.")
     scenario += c1.balance_of(arguments_for_balance_of(consumer, [
         sp.record(owner = alice.address, token_id = 0),
         sp.record(owner = alice.address, token_id = 1),
         sp.record(owner = alice.address, token_id = 2)
     ]))
     scenario.verify(consumer.data.last_sum == 90)
     scenario.h2("Total Supply.")
     scenario += c1.total_supply(
         sp.record(
             callback = sp.contract(
                 Total_supply.response_type(),
                 sp.contract_address(consumer),
                 entry_point = "receive_total_supplies").open_some(),
             token_ids = [0, 1]))
     scenario.verify(consumer.data.last_sum == 200)
     scenario.h2("Token Metadata.")
     scenario += c1.token_metadata(
         sp.record(
             callback = sp.contract(
                 sp.TList(Token_meta_data.get_type()),
                 sp.contract_address(consumer),
                 entry_point = "receive_metadata").open_some(),
             token_ids = [0, 1]))
     scenario.verify(consumer.data.last_acc == "TK0TK1")
     scenario.h2("Operators")
     if not support_operator:
         scenario.h3("This version was compiled with no operator support")
         scenario.p("Calls should fail even for the administrator:")
         scenario += c1.update_operators([]).run(sender = admin, valid = False)
         scenario += c1.permissions_descriptor(
             sp.contract(
                 Permissions_descriptor.get_type(),
                 sp.contract_address(consumer),
                 entry_point = "receive_permissions_descriptor").open_some())
         scenario.verify(consumer.data.operator_support == False)
     else:
         scenario.p("This version was compiled with operator support")
         scenario += c1.update_operators([]).run(sender = admin)
         scenario.h3("Operator Accounts")
         op0 = sp.test_account("Operator0")
         op1 = sp.test_account("Operator1")
         op2 = sp.test_account("Operator2")
         scenario.show([op0, op1, op2])
         scenario.p("Admin can change Alice's operator.")
         scenario += c1.update_operators([
             sp.variant("Add_operator", Operator_param.make(
                 owner = alice.address,
                 operator = op1.address))
         ]).run(sender = admin)
         scenario.p("Operator1 can transfer Alice's tokens")
         scenario += c1.transfer(
             [
                 Transfer.make(alice.address,
                               bob.address,
                               a = 2,
                               i = 0),
                 Transfer.make(alice.address,
                               op1.address,
                               a = 2,
                               i = 2)
             ]).run(sender = op1)
         scenario.p("Operator1 cannot transfer Bob's tokens")
         scenario += c1.transfer(
             [
                 Transfer.make(bob.address,
                               op1.address,
                               a = 2,
                               i = 1)
             ]).run(sender = op1, valid = False)
         scenario.p("Operator2 cannot transfer Alice's tokens")
         scenario += c1.transfer(
             [
                 Transfer.make(alice.address,
                               bob.address,
                               a = 2,
                               i = 1)
             ]).run(sender = op2, valid = False)
         scenario.p("Alice can remove their operator")
         scenario += c1.update_operators([
             sp.variant("Remove_operator", Operator_param.make(
                 owner = alice.address,
                 operator = op1.address))
         ]).run(sender = alice)
         scenario.p("Operator1 cannot transfer Alice's tokens any more")
         scenario += c1.transfer(
             [
                 Transfer.make(alice.address,
                               op1.address,
                               a = 2,
                               i = 1)
             ]).run(sender = op1, valid = False)
         scenario.p("Bob can add Operator0 only for token 0 and 1.")
         scenario += c1.update_operators([
             sp.variant("Add_operator", Operator_param.make(
                 owner = bob.address,
                 operator = op0.address,
                 tokens = sp.set([0,1])
             ))
         ]).run(sender = bob)
         scenario.p("Operator0 can transfer Bob's tokens '0' and '1'")
         scenario += c1.transfer(
             [
                 Transfer.make(bob.address,
                               alice.address,
                               a = 1,
                               i = 0),
                 Transfer.make(bob.address,
                               alice.address,
                               a = 1,
                               i = 1)
             ]).run(sender = op0)
         scenario.p("Operator0 cannot transfer Bob's tokens '2'")
         scenario += c1.transfer(
             [
                 Transfer.make(bob.address,
                               alice.address,
                               a = 1,
                               i = 2)
             ]).run(sender = op0, valid = False)
         scenario.p("Bob cannot add Operator0 for Alice's tokens.")
         scenario += c1.update_operators([
             sp.variant("Add_operator", Operator_param.make(
                 owner = alice.address,
                 operator = op0.address,
                 tokens = sp.set([0,1])
             ))
         ]).run(sender = bob, valid = False)
         scenario.h3("Testing is_operator")
         scenario.p("Operator0 is still active for Bob's 0 and 1, \
         Alice has no operator")
         def test_is_operator(scenario, owner, operator, tokens, valid, comment):
             scenario.p("test_is_operator: " + comment )
             is_operator = Operator_param.make(
                 owner = owner.address,
                 operator = operator.address,
                 tokens = tokens)
             scenario += c1.is_operator(
                 sp.record(
                     callback = sp.contract(
                         Operator_param.is_operator_response_type(),
                         sp.contract_address(consumer),
                         entry_point = "receive_is_operator").open_some(),
                     operator = is_operator
                 ))
             scenario.verify(consumer.data.last_operator == valid)
         test_is_operator(scenario, bob, op0, sp.set([0, 1]), True,
                          "bob, op0, [0,1]")
         test_is_operator(scenario, bob, op0, sp.set([0]), True,
                          "bob, op0, [0]")
         test_is_operator(scenario, bob, op0, sp.set([0, 2]), False,
                          "bob, op0, [0,2]")
         test_is_operator(scenario, bob, op0, None, False,
                          "bob, op0, all")
         test_is_operator(scenario, alice, op0, None, False,
                          "alice, op0, all")
         scenario.h3("Testing permissions_descriptor")
         scenario.verify(consumer.data.operator_support == False)
         scenario += c1.permissions_descriptor(
             sp.contract(
                 Permissions_descriptor.get_type(),
                 sp.contract_address(consumer),
                 entry_point = "receive_permissions_descriptor").open_some())
         scenario.verify(consumer.data.operator_support == True)
コード例 #4
0
 def test():
     scenario = sp.test_scenario()
     scenario.h1("FA2 Contract Name: " + config.name)
     scenario.table_of_contents()
     # sp.test_account generates ED25519 key-pairs deterministically:
     admin = sp.test_account("Administrator")
     alice = sp.test_account("Alice")
     bob   = sp.test_account("Robert")
     # Let's display the accounts:
     scenario.h2("Accounts")
     scenario.show([admin, alice, bob])
     c1 = FA2(config, admin.address)
     scenario += c1
     if config.non_fungible:
         # TODO
         return
     scenario.h2("Initial Minting")
     scenario.p("The administrator mints 100 token-0's to Alice.")
     scenario += c1.mint(address = alice.address,
                         amount = 100,
                         symbol = 'TK0',
                         token_id = 0).run(sender = admin)
     scenario.h2("Transfers Alice -> Bob")
     scenario += c1.transfer(
         [
             c1.batch_transfer.item(from_ = alice.address,
                                 txs = [
                                     sp.record(to_ = bob.address,
                                               amount = 10,
                                               token_id = 0)
                                 ])
         ]).run(sender = alice)
     scenario.verify(
         c1.data.ledger[c1.ledger_key.make(alice.address, 0)].balance == 90)
     scenario.verify(
         c1.data.ledger[c1.ledger_key.make(bob.address, 0)].balance == 10)
     scenario += c1.transfer(
         [
             c1.batch_transfer.item(from_ = alice.address,
                                 txs = [
                                     sp.record(to_ = bob.address,
                                               amount = 10,
                                               token_id = 0),
                                     sp.record(to_ = bob.address,
                                               amount = 11,
                                               token_id = 0)
                                 ])
         ]).run(sender = alice)
     scenario.verify(
         c1.data.ledger[c1.ledger_key.make(alice.address, 0)].balance
         == 90 - 10 - 11)
     scenario.verify(
         c1.data.ledger[c1.ledger_key.make(bob.address, 0)].balance
         == 10 + 10 + 11)
     if config.single_asset:
         return
     scenario.h2("More Token Types")
     scenario += c1.mint(address = bob.address,
                         amount = 100,
                         symbol = 'TK1',
                         token_id = 1).run(sender = admin)
     scenario += c1.mint(address = bob.address,
                         amount = 200,
                         symbol = 'TK2',
                         token_id = 2).run(sender = admin)
     scenario.h3("Multi-token Transfer Bob -> Alice")
     scenario += c1.transfer(
         [
             c1.batch_transfer.item(from_ = bob.address,
                                 txs = [
                                     sp.record(to_ = alice.address,
                                               amount = 10,
                                               token_id = 0),
                                     sp.record(to_ = alice.address,
                                               amount = 10,
                                               token_id = 1)]),
             # We voluntarily test a different sub-batch:
             c1.batch_transfer.item(from_ = bob.address,
                                 txs = [
                                     sp.record(to_ = alice.address,
                                               amount = 10,
                                               token_id = 2)])
         ]).run(sender = bob)
     scenario.h2("Other Basic Permission Tests")
     scenario.h3("Bob cannot transfer Alice's tokens.")
     scenario += c1.transfer(
         [
             c1.batch_transfer.item(from_ = alice.address,
                                 txs = [
                                     sp.record(to_ = bob.address,
                                               amount = 10,
                                               token_id = 0),
                                     sp.record(to_ = bob.address,
                                               amount = 1,
                                               token_id = 0)])
         ]).run(sender = bob, valid = False)
     scenario.h3("Admin can transfer anything.")
     scenario += c1.transfer(
         [
             c1.batch_transfer.item(from_ = alice.address,
                                 txs = [
                                     sp.record(to_ = bob.address,
                                               amount = 10,
                                               token_id = 0),
                                     sp.record(to_ = bob.address,
                                               amount = 10,
                                               token_id = 1)]),
             c1.batch_transfer.item(from_ = bob.address,
                                 txs = [
                                     sp.record(to_ = alice.address,
                                               amount = 11,
                                               token_id = 0)])
         ]).run(sender = admin)
     scenario.h3("Even Admin cannot transfer too much.")
     scenario += c1.transfer(
         [
             c1.batch_transfer.item(from_ = alice.address,
                                 txs = [
                                     sp.record(to_ = bob.address,
                                               amount = 1000,
                                               token_id = 0)])
         ]).run(sender = admin, valid = False)
     scenario.h3("Consumer Contract for Callback Calls.")
     consumer = View_consumer(c1)
     scenario += consumer
     scenario.p("Consumer virtual address: "
                + sp.contract_address(consumer).export())
     scenario.h2("Balance-of.")
     def arguments_for_balance_of(receiver, reqs):
         return (sp.record(
             callback = sp.contract(
                 Balance_of.response_type(),
                 sp.contract_address(receiver),
                 entry_point = "receive_balances").open_some(),
             requests = reqs))
     scenario += c1.balance_of(arguments_for_balance_of(consumer, [
         sp.record(owner = alice.address, token_id = 0),
         sp.record(owner = alice.address, token_id = 1),
         sp.record(owner = alice.address, token_id = 2)
     ]))
     scenario.verify(consumer.data.last_sum == 90)
     scenario.h2("Token Metadata.")
     scenario.p("The view-receiver does the verification that the address"
                + "received is the one of the FA2 contract.")
     scenario += c1.token_metadata_registry(
             sp.contract(
                 sp.TAddress,
                 sp.contract_address(consumer),
                 entry_point = "receive_metadata_registry").open_some())
     def check_metadata_list(l):
         res = sp.local("toks", sp.string(""))
         sp.for md in l:
            res.value = sp.concat([md.symbol, res.value])
            sp.verify((md.symbol == "TK0") | (md.symbol == "TK1"))
         sp.verify(res.value == "TK1TK0")
コード例 #5
0
def add_test(config, is_default = True):
    @sp.add_test(name = config.name, is_default = is_default)
    def test():
        scenario = sp.test_scenario()
        scenario.h1("FA2 Contract Name: " + config.name)
        scenario.table_of_contents()
        # sp.test_account generates ED25519 key-pairs deterministically:
        admin = sp.test_account("Administrator")
        alice = sp.test_account("Alice")
        bob   = sp.test_account("Robert")
        # Let's display the accounts:
        scenario.h2("Accounts")
        scenario.show([admin, alice, bob])
        c1 = FA2(config, admin.address)
        scenario += c1
        if config.non_fungible:
            # TODO
            return
        scenario.h2("Initial Minting")
        scenario.p("The administrator mints 100 token-0's to Alice.")
        scenario += c1.mint(address = alice.address,
                            amount = 100,
                            symbol = 'TK0',
                            token_id = 0).run(sender = admin)
        scenario.h2("Transfers Alice -> Bob")
        scenario += c1.transfer(
            [
                c1.batch_transfer.item(from_ = alice.address,
                                    txs = [
                                        sp.record(to_ = bob.address,
                                                  amount = 10,
                                                  token_id = 0)
                                    ])
            ]).run(sender = alice)
        scenario.verify(
            c1.data.ledger[c1.ledger_key.make(alice.address, 0)].balance == 90)
        scenario.verify(
            c1.data.ledger[c1.ledger_key.make(bob.address, 0)].balance == 10)
        scenario += c1.transfer(
            [
                c1.batch_transfer.item(from_ = alice.address,
                                    txs = [
                                        sp.record(to_ = bob.address,
                                                  amount = 10,
                                                  token_id = 0),
                                        sp.record(to_ = bob.address,
                                                  amount = 11,
                                                  token_id = 0)
                                    ])
            ]).run(sender = alice)
        scenario.verify(
            c1.data.ledger[c1.ledger_key.make(alice.address, 0)].balance
            == 90 - 10 - 11)
        scenario.verify(
            c1.data.ledger[c1.ledger_key.make(bob.address, 0)].balance
            == 10 + 10 + 11)
        if config.single_asset:
            return
        scenario.h2("More Token Types")
        scenario += c1.mint(address = bob.address,
                            amount = 100,
                            symbol = 'TK1',
                            token_id = 1).run(sender = admin)
        scenario += c1.mint(address = bob.address,
                            amount = 200,
                            symbol = 'TK2',
                            token_id = 2).run(sender = admin)
        scenario.h3("Multi-token Transfer Bob -> Alice")
        scenario += c1.transfer(
            [
                c1.batch_transfer.item(from_ = bob.address,
                                    txs = [
                                        sp.record(to_ = alice.address,
                                                  amount = 10,
                                                  token_id = 0),
                                        sp.record(to_ = alice.address,
                                                  amount = 10,
                                                  token_id = 1)]),
                # We voluntarily test a different sub-batch:
                c1.batch_transfer.item(from_ = bob.address,
                                    txs = [
                                        sp.record(to_ = alice.address,
                                                  amount = 10,
                                                  token_id = 2)])
            ]).run(sender = bob)
        scenario.h2("Other Basic Permission Tests")
        scenario.h3("Bob cannot transfer Alice's tokens.")
        scenario += c1.transfer(
            [
                c1.batch_transfer.item(from_ = alice.address,
                                    txs = [
                                        sp.record(to_ = bob.address,
                                                  amount = 10,
                                                  token_id = 0),
                                        sp.record(to_ = bob.address,
                                                  amount = 1,
                                                  token_id = 0)])
            ]).run(sender = bob, valid = False)
        scenario.h3("Admin can transfer anything.")
        scenario += c1.transfer(
            [
                c1.batch_transfer.item(from_ = alice.address,
                                    txs = [
                                        sp.record(to_ = bob.address,
                                                  amount = 10,
                                                  token_id = 0),
                                        sp.record(to_ = bob.address,
                                                  amount = 10,
                                                  token_id = 1)]),
                c1.batch_transfer.item(from_ = bob.address,
                                    txs = [
                                        sp.record(to_ = alice.address,
                                                  amount = 11,
                                                  token_id = 0)])
            ]).run(sender = admin)
        scenario.h3("Even Admin cannot transfer too much.")
        scenario += c1.transfer(
            [
                c1.batch_transfer.item(from_ = alice.address,
                                    txs = [
                                        sp.record(to_ = bob.address,
                                                  amount = 1000,
                                                  token_id = 0)])
            ]).run(sender = admin, valid = False)
        scenario.h3("Consumer Contract for Callback Calls.")
        consumer = View_consumer(c1)
        scenario += consumer
        scenario.p("Consumer virtual address: "
                   + sp.contract_address(consumer).export())
        scenario.h2("Balance-of.")
        def arguments_for_balance_of(receiver, reqs):
            return (sp.record(
                callback = sp.contract(
                    Balance_of.response_type(),
                    sp.contract_address(receiver),
                    entry_point = "receive_balances").open_some(),
                requests = reqs))
        scenario += c1.balance_of(arguments_for_balance_of(consumer, [
            sp.record(owner = alice.address, token_id = 0),
            sp.record(owner = alice.address, token_id = 1),
            sp.record(owner = alice.address, token_id = 2)
        ]))
        scenario.verify(consumer.data.last_sum == 90)
        scenario.h2("Token Metadata.")
        scenario.p("The view-receiver does the verification that the address"
                   + "received is the one of the FA2 contract.")
        scenario += c1.token_metadata_registry(
                sp.contract(
                    sp.TAddress,
                    sp.contract_address(consumer),
                    entry_point = "receive_metadata_registry").open_some())
        def check_metadata_list(l):
            res = sp.local("toks", sp.string(""))
            sp.for md in l:
               res.value = sp.concat([md.symbol, res.value])
               sp.verify((md.symbol == "TK0") | (md.symbol == "TK1"))
            sp.verify(res.value == "TK1TK0")
        scenario += c1.token_metadata(
            sp.record(
                token_ids = [0, 1],
                handler = check_metadata_list
            ))
        scenario.h2("Operators")
        if not c1.config.support_operator:
            scenario.h3("This version was compiled with no operator support")
            scenario.p("Calls should fail even for the administrator:")
            scenario += c1.update_operators([]).run(sender = admin, valid = False)
            if config.add_permissions_descriptor:
                scenario += c1.permissions_descriptor(
                    sp.contract(
                        c1.permissions_descriptor_.get_type(),
                        sp.contract_address(consumer),
                        entry_point = "receive_permissions_descriptor"
                    ).open_some())
                scenario.verify(consumer.data.operator_support == False)
        else:
            scenario.p("This version was compiled with operator support.")
            scenario.p("Calling 0 updates should work:")
            scenario += c1.update_operators([]).run()
            scenario.h3("Operator Accounts")
            op0 = sp.test_account("Operator0")
            op1 = sp.test_account("Operator1")
            op2 = sp.test_account("Operator2")
            scenario.show([op0, op1, op2])
            scenario.p("Admin can change Alice's operator.")
            scenario += c1.update_operators([
                sp.variant("add_operator", c1.operator_param.make(
                    owner = alice.address,
                    operator = op1.address))
            ]).run(sender = admin)
            scenario.p("Operator1 can now transfer Alice's tokens")
            scenario += c1.transfer(
                [
                    c1.batch_transfer.item(from_ = alice.address,
                                        txs = [
                                            sp.record(to_ = bob.address,
                                                      amount = 2,
                                                      token_id = 0),
                                            sp.record(to_ = op1.address,
                                                      amount = 2,
                                                      token_id = 2)])
                ]).run(sender = op1)
            scenario.p("Operator1 cannot transfer Bob's tokens")
            scenario += c1.transfer(
                [
                    c1.batch_transfer.item(from_ = bob.address,
                                        txs = [
                                            sp.record(to_ = op1.address,
                                                      amount = 2,
                                                      token_id = 1)])
                ]).run(sender = op1, valid = False)
            scenario.p("Operator2 cannot transfer Alice's tokens")
            scenario += c1.transfer(
                [
                    c1.batch_transfer.item(from_ = alice.address,
                                        txs = [
                                            sp.record(to_ = bob.address,
                                                      amount = 2,
                                                      token_id = 1)])
                ]).run(sender = op2, valid = False)
            scenario.p("Alice can remove their operator")
            scenario += c1.update_operators([
                sp.variant("remove_operator", c1.operator_param.make(
                    owner = alice.address,
                    operator = op1.address))
            ]).run(sender = alice)
            scenario.p("Operator1 cannot transfer Alice's tokens any more")
            scenario += c1.transfer(
                [
                    c1.batch_transfer.item(from_ = alice.address,
                                        txs = [
                                            sp.record(to_ = op1.address,
                                                      amount = 2,
                                                      token_id = 1)])
                ]).run(sender = op1, valid = False)
            scenario.p("Bob can add Operator0.")
            scenario += c1.update_operators([
                sp.variant("add_operator", c1.operator_param.make(
                    owner = bob.address,
                    operator = op0.address
                ))
            ]).run(sender = bob)
            scenario.p("Operator0 can transfer Bob's tokens '0' and '1'")
            scenario += c1.transfer(
                [
                    c1.batch_transfer.item(from_ = bob.address,
                                        txs = [
                                            sp.record(to_ = alice.address,
                                                      amount = 1,
                                                      token_id = 0)]),
                    c1.batch_transfer.item(from_ = bob.address,
                                        txs = [
                                            sp.record(to_ = alice.address,
                                                      amount = 1,
                                                      token_id = 1)])
                ]).run(sender = op0)
            scenario.p("Bob cannot add Operator0 for Alice's tokens.")
            scenario += c1.update_operators([
                sp.variant("add_operator", c1.operator_param.make(
                    owner = alice.address,
                    operator = op0.address
                ))
            ]).run(sender = bob, valid = False)
            scenario.p("Alice can also add Operator0 for themselves.")
            scenario += c1.update_operators([
                sp.variant("add_operator", c1.operator_param.make(
                    owner = alice.address,
                    operator = op0.address
                ))
            ]).run(sender = alice, valid = True)
            scenario.p("Operator0 can now transfer Bob's and Alice's tokens.")
            scenario += c1.transfer(
                [
                    c1.batch_transfer.item(from_ = bob.address,
                                        txs = [
                                            sp.record(to_ = alice.address,
                                                      amount = 1,
                                                      token_id = 0)]),
                    c1.batch_transfer.item(from_ = alice.address,
                                        txs = [
                                            sp.record(to_ = bob.address,
                                                      amount = 1,
                                                      token_id = 1)])
                ]).run(sender = op0)
            scenario.p("Bob adds Operator2 as second operator.")
            scenario += c1.update_operators([
                sp.variant("add_operator", c1.operator_param.make(
                    owner = bob.address,
                    operator = op2.address
                ))
            ]).run(sender = bob, valid = True)
            scenario.p("Operator0 and Operator2 can transfer Bob's tokens.")
            scenario += c1.transfer(
                [
                    c1.batch_transfer.item(from_ = bob.address,
                                        txs = [
                                            sp.record(to_ = alice.address,
                                                      amount = 1,
                                                      token_id = 0)])
                ]).run(sender = op0)
            scenario += c1.transfer(
                [
                    c1.batch_transfer.item(from_ = bob.address,
                                        txs = [
                                            sp.record(to_ = alice.address,
                                                      amount = 1,
                                                      token_id = 0)])
                ]).run(sender = op2)
            if config.add_permissions_descriptor:
                 scenario.h3("Testing permissions_descriptor")
                 scenario.verify(consumer.data.operator_support == False)
                 scenario += c1.permissions_descriptor(
                     sp.contract(
                         c1.permissions_descriptor_.get_type(),
                         sp.contract_address(consumer),
                         entry_point = "receive_permissions_descriptor").open_some())
                 scenario.verify(consumer.data.operator_support == True)
            scenario.table_of_contents()
コード例 #6
0
def test():
    scenario = sp.test_scenario()
    scenario.h1("Fishcake Token")
    scenario.table_of_contents()
    admin = sp.test_account("Administrator")
    alice = sp.test_account("Alice")
    bob = sp.test_account("Bob")
    scenario.h2("Accounts")
    scenario.show([admin, alice, bob])
    c1 = Fishcake(admin.address, 100)
    scenario += c1
    scenario.h2("Initial Minting")
    scenario.p("The administrator mints the initial tokens")
    scenario += c1.initialMint().run(sender=admin)
    scenario += c1.initialMint().run(sender=admin, valid=False)
    scenario.h2("Transfers Admin -> Bob")
    scenario += c1.transfer(
        [
            c1.batch_transfer.item(from_=admin.address,
                                   txs=[
                                       sp.record(to_=bob.address,
                                                 amount=10,
                                                 token_id=0)
                                   ])
        ]).run(sender=admin)
    scenario.verify(
        c1.data.ledger[c1.ledger_key.make(admin.address, 0)].balance == 90)
    scenario.verify(
        c1.data.ledger[c1.ledger_key.make(bob.address, 0)].balance == 10)
    scenario += c1.transfer(
        [
            c1.batch_transfer.item(from_=admin.address,
                                   txs=[
                                       sp.record(to_=bob.address,
                                                 amount=10,
                                                 token_id=0),
                                       sp.record(to_=alice.address,
                                                 amount=11,
                                                 token_id=0)
                                   ])
        ]).run(sender=admin)
    scenario.verify(
        c1.data.ledger[c1.ledger_key.make(admin.address, 0)].balance
        == 90 - 10 - 11)
    scenario.verify(
        c1.data.ledger[c1.ledger_key.make(bob.address, 0)].balance
        == 10 + 10)
    scenario.verify(
        c1.data.ledger[c1.ledger_key.make(alice.address, 0)].balance
        == 11)
    scenario.h3("Consumer Contract for Callback Calls.")
    consumer = View_consumer(c1)
    scenario += consumer
    scenario.p("Consumer virtual address: "
               + sp.contract_address(consumer).export())
    scenario.h2("Balance-of.")

    def arguments_for_balance_of(receiver, reqs):
        return (sp.record(
            callback=sp.contract(
                Balance_of.response_type(),
                sp.contract_address(receiver),
                entry_point="receive_balances").open_some(),
            requests=reqs))
    scenario += c1.balance_of(arguments_for_balance_of(consumer, [
        sp.record(owner=alice.address, token_id=0),
        sp.record(owner=bob.address, token_id=0),
    ]))
    scenario.verify(consumer.data.last_sum == 31)
    scenario.h2("Token Metadata.")
    scenario.p("The view-receiver does the verification that the address" +
               "received is the one of the FA2 contract.")
    scenario += c1.token_metadata_registry(
        sp.contract(
            sp.TAddress,
            sp.contract_address(consumer),
            entry_point="receive_metadata_registry").open_some())

    def check_metadata_list(l):
        res = sp.local("toks", sp.string(""))
        sp.verify(sp.len(l) == 1)
        sp.for md in l:
            sp.verify((md.symbol == "FSCK") & (md.name == "Fishcake"))